Blame view

cmd/booti.c 3.22 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
5db28905c   Tom Rini   cmd: Split 'bootz...
2
3
4
  /*
   * (C) Copyright 2000-2009
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5db28905c   Tom Rini   cmd: Split 'bootz...
5
6
7
8
9
10
   */
  
  #include <common.h>
  #include <bootm.h>
  #include <command.h>
  #include <image.h>
36bf446b6   Simon Glass   common: Move enab...
11
  #include <irq_func.h>
5db28905c   Tom Rini   cmd: Split 'bootz...
12
13
  #include <lmb.h>
  #include <mapmem.h>
280857649   Masahiro Yamada   arm64: booti: all...
14
15
  #include <linux/kernel.h>
  #include <linux/sizes.h>
5db28905c   Tom Rini   cmd: Split 'bootz...
16

5db28905c   Tom Rini   cmd: Split 'bootz...
17
18
19
20
21
22
23
  /*
   * Image booting support
   */
  static int booti_start(cmd_tbl_t *cmdtp, int flag, int argc,
  			char * const argv[], bootm_headers_t *images)
  {
  	int ret;
6808ef9ac   Bin Chen   move booti_setup ...
24
25
26
  	ulong ld;
  	ulong relocated_addr;
  	ulong image_size;
5db28905c   Tom Rini   cmd: Split 'bootz...
27
28
29
30
31
32
  
  	ret = do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START,
  			      images, 1);
  
  	/* Setup Linux kernel Image entry point */
  	if (!argc) {
bb872dd93   Simon Glass   image: Rename loa...
33
  		ld = image_load_addr;
5db28905c   Tom Rini   cmd: Split 'bootz...
34
35
  		debug("*  kernel: default image load address = 0x%08lx
  ",
bb872dd93   Simon Glass   image: Rename loa...
36
  				image_load_addr);
5db28905c   Tom Rini   cmd: Split 'bootz...
37
  	} else {
6808ef9ac   Bin Chen   move booti_setup ...
38
  		ld = simple_strtoul(argv[0], NULL, 16);
bf14d9a7e   Masahiro Yamada   cmd: booti: fix i...
39
40
  		debug("*  kernel: cmdline image address = 0x%08lx
  ", ld);
5db28905c   Tom Rini   cmd: Split 'bootz...
41
  	}
7f13b374f   Marek Vasut   ARM: image: Add o...
42
  	ret = booti_setup(ld, &relocated_addr, &image_size, false);
5db28905c   Tom Rini   cmd: Split 'bootz...
43
44
  	if (ret != 0)
  		return 1;
f9f6ae742   Ji Luo   MA-16877 Skip ker...
45
  #if defined(CONFIG_IMX_HAB) && !defined(CONFIG_AVB_SUPPORT)
2cd26c924   Ye Li   MLK-17044-3 booti...
46
47
48
49
50
51
52
53
54
  	extern int authenticate_image(
  		uint32_t ddr_start, uint32_t raw_image_size);
  	if (authenticate_image(ld, image_size) != 0) {
  		printf("Authenticate Image Fail, Please check
  ");
  		return 1;
  	}
  
  #endif
6808ef9ac   Bin Chen   move booti_setup ...
55
56
57
58
59
60
  	/* Handle BOOTM_STATE_LOADOS */
  	if (relocated_addr != ld) {
  		debug("Moving Image from 0x%lx to 0x%lx
  ", ld, relocated_addr);
  		memmove((void *)relocated_addr, (void *)ld, image_size);
  	}
5db28905c   Tom Rini   cmd: Split 'bootz...
61

6808ef9ac   Bin Chen   move booti_setup ...
62
  	images->ep = relocated_addr;
683cdd683   Lokesh Vutla   cmd: booti: Store...
63
64
  	images->os.start = relocated_addr;
  	images->os.end = relocated_addr + image_size;
6808ef9ac   Bin Chen   move booti_setup ...
65
  	lmb_reserve(&images->lmb, images->ep, le32_to_cpu(image_size));
5db28905c   Tom Rini   cmd: Split 'bootz...
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
  
  	/*
  	 * 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;
3cedc9747   Atish Patra   RISCV: image: Add...
94
95
96
  #ifdef CONFIG_RISCV_SMODE
  	images.os.arch = IH_ARCH_RISCV;
  #elif CONFIG_ARM64
0fff19a67   Scott Wood   booti: Set images...
97
  	images.os.arch = IH_ARCH_ARM64;
3cedc9747   Atish Patra   RISCV: image: Add...
98
  #endif
5db28905c   Tom Rini   cmd: Split 'bootz...
99
  	ret = do_bootm_states(cmdtp, flag, argc, argv,
4943dc2f1   Cédric Schieli   bootz/booti: relo...
100
101
102
  #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
  			      BOOTM_STATE_RAMDISK |
  #endif
5db28905c   Tom Rini   cmd: Split 'bootz...
103
104
105
106
107
108
109
110
111
112
113
  			      BOOTM_STATE_OS_PREP | BOOTM_STATE_OS_FAKE_GO |
  			      BOOTM_STATE_OS_GO,
  			      &images, 1);
  
  	return ret;
  }
  
  #ifdef CONFIG_SYS_LONGHELP
  static char booti_help_text[] =
  	"[addr [initrd[:size]] [fdt]]
  "
3cedc9747   Atish Patra   RISCV: image: Add...
114
115
  	"    - boot Linux 'Image' stored at 'addr'
  "
5db28905c   Tom Rini   cmd: Split 'bootz...
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
  	"\tThe argument 'initrd' is optional and specifies the address
  "
  	"\tof an initrd in memory. The optional parameter ':size' allows
  "
  	"\tspecifying the size of a RAW initrd.
  "
  #if defined(CONFIG_OF_LIBFDT)
  	"\tSince booting a Linux kernel requires a flat device-tree, a
  "
  	"\tthird argument providing the address of the device-tree blob
  "
  	"\tis required. To boot a kernel with a device-tree blob but
  "
  	"\twithout an initrd image, use a '-' for the initrd argument.
  "
  #endif
  	"";
  #endif
  
  U_BOOT_CMD(
  	booti,	CONFIG_SYS_MAXARGS,	1,	do_booti,
3cedc9747   Atish Patra   RISCV: image: Add...
137
  	"boot Linux kernel 'Image' format from memory", booti_help_text
5db28905c   Tom Rini   cmd: Split 'bootz...
138
  );