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