1 /* 2 * (C) Copyright 2019 Rockchip Electronics Co., Ltd 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #include <common.h> 8 #include <bootm.h> 9 #include <boot_rkimg.h> 10 #include <console.h> 11 #include <image.h> 12 #include <malloc.h> 13 #include <sysmem.h> 14 #include <linux/libfdt.h> 15 #include <asm/arch/hotkey.h> 16 #include <asm/arch/resource_img.h> 17 #include <asm/arch/boot_mode.h> 18 #include <asm/arch/uimage.h> 19 20 DECLARE_GLOBAL_DATA_PTR; 21 22 static void *do_boot_uimage_storage(void) 23 { 24 return uimage_load_bootables(); 25 } 26 27 static void *do_boot_uimage_ram(char *const argv[]) 28 { 29 image_header_t *hdr; 30 int blknum; 31 32 hdr = (void *)simple_strtoul(argv[1], NULL, 16); 33 if (!hdr || !image_check_magic(hdr)) { 34 UIMG_I("Invalid header"); 35 return NULL; 36 } 37 38 if (image_get_type(hdr) != IH_TYPE_MULTI) { 39 UIMG_I("Invalid multi images\n"); 40 return NULL; 41 } 42 43 /* reserve this full uImage */ 44 blknum = DIV_ROUND_UP(image_get_image_size(hdr), RK_BLK_SIZE); 45 if (!sysmem_alloc_base(MEM_UIMAGE_USER, (phys_addr_t)hdr, 46 blknum * RK_BLK_SIZE)) 47 return NULL; 48 49 return hdr; 50 } 51 52 static int do_boot_uimage(cmd_tbl_t *cmdtp, int flag, 53 int argc, char *const argv[]) 54 { 55 char *bootm_args[1]; 56 image_header_t *img; 57 char uimg_addr[12]; 58 u32 ramdisk_sz = 0; 59 int ret; 60 61 if (argc > 2) 62 return CMD_RET_USAGE; 63 64 printf("\n## Booting Multi uImage "); 65 66 if (argc == 1) 67 img = do_boot_uimage_storage(); 68 else 69 img = do_boot_uimage_ram(argv); 70 71 if (!img) { 72 UIMG_I("Failed to load multi images\n"); 73 goto out; 74 } 75 76 if (uimage_sysmem_reserve_each(img, &ramdisk_sz)) 77 goto out; 78 79 snprintf(uimg_addr, sizeof(uimg_addr), "0x%lx", (ulong)img); 80 bootm_args[0] = uimg_addr; 81 82 printf("at %s\n", uimg_addr); 83 84 ret = do_bootm_states(NULL, 0, ARRAY_SIZE(bootm_args), bootm_args, 85 BOOTM_STATE_START | 86 BOOTM_STATE_FINDOS | BOOTM_STATE_FINDOTHER | 87 BOOTM_STATE_LOADOS | 88 #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH 89 BOOTM_STATE_RAMDISK | 90 #endif 91 BOOTM_STATE_OS_PREP | BOOTM_STATE_OS_FAKE_GO | 92 BOOTM_STATE_OS_GO, &images, 1); 93 94 if (ret && argc != 1) { 95 uimage_sysmem_free_each(img, ramdisk_sz); 96 goto out; 97 } 98 99 return CMD_RET_SUCCESS; 100 out: 101 return CMD_RET_FAILURE; 102 } 103 104 U_BOOT_CMD( 105 boot_uimage, 2, 1, do_boot_uimage, 106 "Boot Legacy uImage from memory or boot(recovery) partitions", 107 "boot_uimage [addr]" 108 ); 109