1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * (C) Copyright 2000-2009 4 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 5 */ 6 7#include <common.h> 8#include <bootm.h> 9#include <command.h> 10#include <image.h> 11#include <irq_func.h> 12#include <lmb.h> 13#include <log.h> 14#include <linux/compiler.h> 15 16int __weak bootz_setup(ulong image, ulong *start, ulong *end) 17{ 18 /* Please define bootz_setup() for your platform */ 19 20 puts("Your platform's zImage format isn't supported yet!\n"); 21 return -1; 22} 23 24/* 25 * zImage booting support 26 */ 27static int bootz_start(struct cmd_tbl *cmdtp, int flag, int argc, 28 char *const argv[], struct bootm_headers *images) 29{ 30 ulong zi_start, zi_end; 31 struct bootm_info bmi; 32 int ret; 33 34 bootm_init(&bmi); 35 if (argc) 36 bmi.addr_img = argv[0]; 37 if (argc > 1) 38 bmi.conf_ramdisk = argv[1]; 39 if (argc > 2) 40 bmi.conf_fdt = argv[2]; 41 /* do not set up argc and argv[] since nothing uses them */ 42 43 ret = bootm_run_states(&bmi, BOOTM_STATE_START); 44 45 /* Setup Linux kernel zImage entry point */ 46 if (!argc) { 47 images->ep = image_load_addr; 48 debug("* kernel: default image load address = 0x%08lx\n", 49 image_load_addr); 50 } else { 51 images->ep = hextoul(argv[0], NULL); 52 debug("* kernel: cmdline image address = 0x%08lx\n", 53 images->ep); 54 } 55 56 ret = bootz_setup(images->ep, &zi_start, &zi_end); 57 if (ret != 0) 58 return 1; 59 60 lmb_reserve(&images->lmb, images->ep, zi_end - zi_start); 61 62 /* 63 * Handle the BOOTM_STATE_FINDOTHER state ourselves as we do not 64 * have a header that provide this informaiton. 65 */ 66 if (bootm_find_images(image_load_addr, cmd_arg1(argc, argv), 67 cmd_arg2(argc, argv), images->ep, 68 zi_end - zi_start)) 69 return 1; 70 71 return 0; 72} 73 74int do_bootz(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) 75{ 76 struct bootm_info bmi; 77 int ret; 78 79 /* Consume 'bootz' */ 80 argc--; argv++; 81 82 if (bootz_start(cmdtp, flag, argc, argv, &images)) 83 return 1; 84 85 /* 86 * We are doing the BOOTM_STATE_LOADOS state ourselves, so must 87 * disable interrupts ourselves 88 */ 89 bootm_disable_interrupts(); 90 91 images.os.os = IH_OS_LINUX; 92 93 bootm_init(&bmi); 94 if (argc) 95 bmi.addr_img = argv[0]; 96 if (argc > 1) 97 bmi.conf_ramdisk = argv[1]; 98 if (argc > 2) 99 bmi.conf_fdt = argv[2]; 100 bmi.cmd_name = "bootz"; 101 102 ret = bootz_run(&bmi); 103 104 return ret; 105} 106 107U_BOOT_LONGHELP(bootz, 108 "[addr [initrd[:size]] [fdt]]\n" 109 " - boot Linux zImage stored in memory\n" 110 "\tThe argument 'initrd' is optional and specifies the address\n" 111 "\tof the initrd in memory. The optional argument ':size' allows\n" 112 "\tspecifying the size of RAW initrd.\n" 113#if defined(CONFIG_OF_LIBFDT) 114 "\tWhen booting a Linux kernel which requires a flat device-tree\n" 115 "\ta third argument is required which is the address of the\n" 116 "\tdevice-tree blob. To boot that kernel without an initrd image,\n" 117 "\tuse a '-' for the second argument. If you do not pass a third\n" 118 "\ta bd_info struct will be passed instead\n" 119#endif 120 ); 121 122U_BOOT_CMD( 123 bootz, CONFIG_SYS_MAXARGS, 1, do_bootz, 124 "boot Linux zImage image from memory", bootz_help_text 125); 126