]>
Commit | Line | Data |
---|---|---|
2262cfee WD |
1 | /* |
2 | * (C) Copyright 2002 | |
3 | * Sysgo Real-Time Solutions, GmbH <www.elinos.com> | |
4 | * Marius Groeger <mgroeger@sysgo.de> | |
5 | * | |
6 | * Copyright (C) 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) | |
7 | * | |
1a459660 | 8 | * SPDX-License-Identifier: GPL-2.0+ |
2262cfee WD |
9 | */ |
10 | ||
11 | #include <common.h> | |
12 | #include <command.h> | |
2262cfee | 13 | #include <image.h> |
a31e091a | 14 | #include <u-boot/zlib.h> |
69370d14 | 15 | #include <asm/bootparam.h> |
2262cfee WD |
16 | #include <asm/byteorder.h> |
17 | #include <asm/zimage.h> | |
18 | ||
69370d14 GB |
19 | #define COMMAND_LINE_OFFSET 0x9000 |
20 | ||
8bde7f77 | 21 | /*cmd_boot.c*/ |
83088afb GR |
22 | int do_bootm_linux(int flag, int argc, char * const argv[], |
23 | bootm_headers_t *images) | |
2262cfee | 24 | { |
69370d14 GB |
25 | struct boot_params *base_ptr = NULL; |
26 | ulong os_data, os_len; | |
27 | image_header_t *hdr; | |
28 | void *load_address; | |
3ef96ded | 29 | |
cd7c596e MB |
30 | #if defined(CONFIG_FIT) |
31 | const void *data; | |
32 | size_t len; | |
33 | #endif | |
8bde7f77 | 34 | |
7af26b16 SG |
35 | if (flag & BOOTM_STATE_OS_PREP) |
36 | return 0; | |
49c3a861 KG |
37 | if ((flag != 0) && (flag != BOOTM_STATE_OS_GO)) |
38 | return 1; | |
39 | ||
d5934ad7 MB |
40 | if (images->legacy_hdr_valid) { |
41 | hdr = images->legacy_hdr_os; | |
83088afb | 42 | if (image_check_type(hdr, IH_TYPE_MULTI)) { |
d5934ad7 | 43 | /* if multi-part image, we need to get first subimage */ |
83088afb | 44 | image_multi_getimg(hdr, 0, &os_data, &os_len); |
d5934ad7 MB |
45 | } else { |
46 | /* otherwise get image data */ | |
83088afb GR |
47 | os_data = image_get_data(hdr); |
48 | os_len = image_get_data_size(hdr); | |
d5934ad7 MB |
49 | } |
50 | #if defined(CONFIG_FIT) | |
51 | } else if (images->fit_uname_os) { | |
bdc7d5cd SG |
52 | int ret; |
53 | ||
83088afb | 54 | ret = fit_image_get_data(images->fit_hdr_os, |
cd7c596e MB |
55 | images->fit_noffset_os, &data, &len); |
56 | if (ret) { | |
83088afb | 57 | puts("Can't get image data/size!\n"); |
cd7c596e MB |
58 | goto error; |
59 | } | |
60 | os_data = (ulong)data; | |
61 | os_len = (ulong)len; | |
d5934ad7 | 62 | #endif |
f13e7b2e | 63 | } else { |
83088afb | 64 | puts("Could not find kernel image!\n"); |
cd7c596e | 65 | goto error; |
e644670b WD |
66 | } |
67 | ||
a76fc70e | 68 | #ifdef CONFIG_CMD_ZBOOT |
69370d14 | 69 | base_ptr = load_zimage((void *)os_data, os_len, &load_address); |
a76fc70e | 70 | #endif |
2262cfee WD |
71 | |
72 | if (NULL == base_ptr) { | |
83088afb | 73 | printf("## Kernel loading failed ...\n"); |
cd7c596e | 74 | goto error; |
69370d14 | 75 | } |
8bde7f77 | 76 | |
69370d14 GB |
77 | if (setup_zimage(base_ptr, (char *)base_ptr + COMMAND_LINE_OFFSET, |
78 | 0, images->rd_start, | |
79 | images->rd_end - images->rd_start)) { | |
80 | printf("## Setting up boot parameters failed ...\n"); | |
81 | goto error; | |
2262cfee | 82 | } |
8bde7f77 | 83 | |
233dbc11 | 84 | boot_zimage(base_ptr, load_address); |
cd7c596e | 85 | /* does not return */ |
2262cfee | 86 | |
cd7c596e | 87 | error: |
40d7e99d | 88 | return 1; |
8bde7f77 | 89 | } |