Blame view

cmd/booti.c 3.04 KB
5db28905c   Tom Rini   cmd: Split 'bootz...
1
2
3
4
5
6
7
8
9
10
11
12
13
  /*
   * (C) Copyright 2000-2009
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
   * SPDX-License-Identifier:	GPL-2.0+
   */
  
  #include <common.h>
  #include <bootm.h>
  #include <command.h>
  #include <image.h>
  #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
17
  
  DECLARE_GLOBAL_DATA_PTR;
5db28905c   Tom Rini   cmd: Split 'bootz...
18
19
20
21
22
23
24
  /*
   * 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 ...
25
26
27
  	ulong ld;
  	ulong relocated_addr;
  	ulong image_size;
5db28905c   Tom Rini   cmd: Split 'bootz...
28
29
30
31
32
33
  
  	ret = do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START,
  			      images, 1);
  
  	/* Setup Linux kernel Image entry point */
  	if (!argc) {
6808ef9ac   Bin Chen   move booti_setup ...
34
  		ld = load_addr;
5db28905c   Tom Rini   cmd: Split 'bootz...
35
36
37
38
  		debug("*  kernel: default image load address = 0x%08lx
  ",
  				load_addr);
  	} else {
6808ef9ac   Bin Chen   move booti_setup ...
39
  		ld = simple_strtoul(argv[0], NULL, 16);
bf14d9a7e   Masahiro Yamada   cmd: booti: fix i...
40
41
  		debug("*  kernel: cmdline image address = 0x%08lx
  ", ld);
5db28905c   Tom Rini   cmd: Split 'bootz...
42
  	}
6808ef9ac   Bin Chen   move booti_setup ...
43
  	ret = booti_setup(ld, &relocated_addr, &image_size);
5db28905c   Tom Rini   cmd: Split 'bootz...
44
45
  	if (ret != 0)
  		return 1;
17a0dd734   Ji Luo   [iot] Enable HAB ...
46
  #if defined(CONFIG_SECURE_BOOT) && !defined(CONFIG_AVB_SUPPORT)
1e33f493a   Ye Li   MLK-17044-3 booti...
47
48
49
50
51
52
53
54
55
  	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 ...
56
57
58
59
60
61
  	/* 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...
62

6808ef9ac   Bin Chen   move booti_setup ...
63
64
  	images->ep = relocated_addr;
  	lmb_reserve(&images->lmb, images->ep, le32_to_cpu(image_size));
5db28905c   Tom Rini   cmd: Split 'bootz...
65
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
  
  	/*
  	 * 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;
0fff19a67   Scott Wood   booti: Set images...
93
  	images.os.arch = IH_ARCH_ARM64;
5db28905c   Tom Rini   cmd: Split 'bootz...
94
  	ret = do_bootm_states(cmdtp, flag, argc, argv,
4943dc2f1   Cédric Schieli   bootz/booti: relo...
95
96
97
  #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
  			      BOOTM_STATE_RAMDISK |
  #endif
5db28905c   Tom Rini   cmd: Split 'bootz...
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
  			      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]]
  "
  	"    - boot arm64 Linux Image stored in memory
  "
  	"\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,
  	"boot arm64 Linux Image image from memory", booti_help_text
  );