]> Git Repo - u-boot.git/blame - cmd/booti.c
Merge patch series "*** Commonize board code for K3 based SoMs ***"
[u-boot.git] / cmd / booti.c
CommitLineData
83d290c5 1// SPDX-License-Identifier: GPL-2.0+
5db28905
TR
2/*
3 * (C) Copyright 2000-2009
4 * Wolfgang Denk, DENX Software Engineering, [email protected].
5db28905
TR
5 */
6
5db28905
TR
7#include <bootm.h>
8#include <command.h>
9#include <image.h>
36bf446b 10#include <irq_func.h>
5db28905 11#include <lmb.h>
f7ae49fc 12#include <log.h>
5db28905 13#include <mapmem.h>
401d1c4f 14#include <asm/global_data.h>
28085764
MY
15#include <linux/kernel.h>
16#include <linux/sizes.h>
5db28905 17
414c34ed 18DECLARE_GLOBAL_DATA_PTR;
5db28905
TR
19/*
20 * Image booting support
21 */
a6c49161 22static int booti_start(struct bootm_info *bmi)
5db28905 23{
a6c49161 24 struct bootm_headers *images = bmi->images;
5db28905 25 int ret;
6808ef9a
BC
26 ulong ld;
27 ulong relocated_addr;
28 ulong image_size;
414c34ed
AP
29 uint8_t *temp;
30 ulong dest;
31 ulong dest_end;
32 unsigned long comp_len;
33 unsigned long decomp_len;
34 int ctype;
5db28905 35
b5d397f4 36 ret = bootm_run_states(bmi, BOOTM_STATE_START);
5db28905
TR
37
38 /* Setup Linux kernel Image entry point */
a6c49161 39 if (!bmi->addr_img) {
bb872dd9 40 ld = image_load_addr;
5db28905 41 debug("* kernel: default image load address = 0x%08lx\n",
bb872dd9 42 image_load_addr);
5db28905 43 } else {
a6c49161 44 ld = hextoul(bmi->addr_img, NULL);
bf14d9a7 45 debug("* kernel: cmdline image address = 0x%08lx\n", ld);
5db28905
TR
46 }
47
414c34ed
AP
48 temp = map_sysmem(ld, 0);
49 ctype = image_decomp_type(temp, 2);
50 if (ctype > 0) {
51 dest = env_get_ulong("kernel_comp_addr_r", 16, 0);
52 comp_len = env_get_ulong("kernel_comp_size", 16, 0);
53 if (!dest || !comp_len) {
54 puts("kernel_comp_addr_r or kernel_comp_size is not provided!\n");
55 return -EINVAL;
56 }
57 if (dest < gd->ram_base || dest > gd->ram_top) {
58 puts("kernel_comp_addr_r is outside of DRAM range!\n");
59 return -EINVAL;
60 }
61
62 debug("kernel image compression type %d size = 0x%08lx address = 0x%08lx\n",
63 ctype, comp_len, (ulong)dest);
64 decomp_len = comp_len * 10;
65 ret = image_decomp(ctype, 0, ld, IH_TYPE_KERNEL,
66 (void *)dest, (void *)ld, comp_len,
67 decomp_len, &dest_end);
68 if (ret)
69 return ret;
70 /* dest_end contains the uncompressed Image size */
71 memmove((void *) ld, (void *)dest, dest_end);
72 }
73 unmap_sysmem((void *)ld);
74
7f13b374 75 ret = booti_setup(ld, &relocated_addr, &image_size, false);
04fc470c 76 if (ret)
5db28905
TR
77 return 1;
78
6808ef9a
BC
79 /* Handle BOOTM_STATE_LOADOS */
80 if (relocated_addr != ld) {
9b83f9c5
TK
81 printf("Moving Image from 0x%lx to 0x%lx, end=%lx\n", ld,
82 relocated_addr, relocated_addr + image_size);
6808ef9a
BC
83 memmove((void *)relocated_addr, (void *)ld, image_size);
84 }
5db28905 85
6808ef9a 86 images->ep = relocated_addr;
683cdd68
LV
87 images->os.start = relocated_addr;
88 images->os.end = relocated_addr + image_size;
89
6808ef9a 90 lmb_reserve(&images->lmb, images->ep, le32_to_cpu(image_size));
5db28905
TR
91
92 /*
93 * Handle the BOOTM_STATE_FINDOTHER state ourselves as we do not
94 * have a header that provide this informaiton.
95 */
a6c49161
SG
96 if (bootm_find_images(image_load_addr, bmi->conf_ramdisk, bmi->conf_fdt,
97 relocated_addr, image_size))
5db28905
TR
98 return 1;
99
100 return 0;
101}
102
09140113 103int do_booti(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
5db28905 104{
a6c49161 105 struct bootm_info bmi;
0c96b681 106 int states;
5db28905
TR
107 int ret;
108
109 /* Consume 'booti' */
110 argc--; argv++;
111
a6c49161
SG
112 bootm_init(&bmi);
113 if (argc)
114 bmi.addr_img = argv[0];
115 if (argc > 1)
116 bmi.conf_ramdisk = argv[1];
117 if (argc > 2)
118 bmi.conf_fdt = argv[2];
119 bmi.boot_progress = true;
120 bmi.cmd_name = "booti";
121 /* do not set up argc and argv[] since nothing uses them */
122
123 if (booti_start(&bmi))
5db28905
TR
124 return 1;
125
126 /*
127 * We are doing the BOOTM_STATE_LOADOS state ourselves, so must
128 * disable interrupts ourselves
129 */
130 bootm_disable_interrupts();
131
132 images.os.os = IH_OS_LINUX;
0c96b681
SG
133 if (IS_ENABLED(CONFIG_RISCV_SMODE))
134 images.os.arch = IH_ARCH_RISCV;
135 else if (IS_ENABLED(CONFIG_ARM64))
136 images.os.arch = IH_ARCH_ARM64;
137
138 states = BOOTM_STATE_MEASURE | BOOTM_STATE_OS_PREP |
139 BOOTM_STATE_OS_FAKE_GO | BOOTM_STATE_OS_GO;
140 if (IS_ENABLED(CONFIG_SYS_BOOT_RAMDISK_HIGH))
141 states |= BOOTM_STATE_RAMDISK;
a6c49161 142
b5d397f4 143 ret = bootm_run_states(&bmi, states);
5db28905
TR
144
145 return ret;
146}
147
3616218b 148U_BOOT_LONGHELP(booti,
5db28905 149 "[addr [initrd[:size]] [fdt]]\n"
414c34ed 150 " - boot Linux flat or compressed 'Image' stored at 'addr'\n"
5db28905
TR
151 "\tThe argument 'initrd' is optional and specifies the address\n"
152 "\tof an initrd in memory. The optional parameter ':size' allows\n"
153 "\tspecifying the size of a RAW initrd.\n"
414c34ed
AP
154 "\tCurrently only booting from gz, bz2, lzma and lz4 compression\n"
155 "\ttypes are supported. In order to boot from any of these compressed\n"
d1896e36 156 "\timages, user have to set kernel_comp_addr_r and kernel_comp_size environment\n"
414c34ed 157 "\tvariables beforehand.\n"
5db28905
TR
158#if defined(CONFIG_OF_LIBFDT)
159 "\tSince booting a Linux kernel requires a flat device-tree, a\n"
160 "\tthird argument providing the address of the device-tree blob\n"
161 "\tis required. To boot a kernel with a device-tree blob but\n"
162 "\twithout an initrd image, use a '-' for the initrd argument.\n"
163#endif
3616218b 164 );
5db28905
TR
165
166U_BOOT_CMD(
167 booti, CONFIG_SYS_MAXARGS, 1, do_booti,
3cedc974 168 "boot Linux kernel 'Image' format from memory", booti_help_text
5db28905 169);
This page took 0.194334 seconds and 4 git commands to generate.