1fea25720SGraeme Russ /* 2fea25720SGraeme Russ * (C) Copyright 2002 3fea25720SGraeme Russ * Sysgo Real-Time Solutions, GmbH <www.elinos.com> 4fea25720SGraeme Russ * Marius Groeger <mgroeger@sysgo.de> 5fea25720SGraeme Russ * 6fea25720SGraeme Russ * Copyright (C) 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) 7fea25720SGraeme Russ * 8*1a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 9fea25720SGraeme Russ */ 10fea25720SGraeme Russ 11fea25720SGraeme Russ #include <common.h> 12fea25720SGraeme Russ #include <command.h> 13fea25720SGraeme Russ #include <image.h> 14fea25720SGraeme Russ #include <u-boot/zlib.h> 1569370d14SGabe Black #include <asm/bootparam.h> 16fea25720SGraeme Russ #include <asm/byteorder.h> 17fea25720SGraeme Russ #include <asm/zimage.h> 18fea25720SGraeme Russ 1969370d14SGabe Black #define COMMAND_LINE_OFFSET 0x9000 2069370d14SGabe Black 21fea25720SGraeme Russ /*cmd_boot.c*/ 2283088afbSGraeme Russ int do_bootm_linux(int flag, int argc, char * const argv[], 2383088afbSGraeme Russ bootm_headers_t *images) 24fea25720SGraeme Russ { 2569370d14SGabe Black struct boot_params *base_ptr = NULL; 26fea25720SGraeme Russ ulong os_data, os_len; 27fea25720SGraeme Russ image_header_t *hdr; 28233dbc11SGabe Black void *load_address; 29fea25720SGraeme Russ 30fea25720SGraeme Russ #if defined(CONFIG_FIT) 31fea25720SGraeme Russ const void *data; 32fea25720SGraeme Russ size_t len; 33fea25720SGraeme Russ #endif 34fea25720SGraeme Russ 357af26b16SSimon Glass if (flag & BOOTM_STATE_OS_PREP) 367af26b16SSimon Glass return 0; 37fea25720SGraeme Russ if ((flag != 0) && (flag != BOOTM_STATE_OS_GO)) 38fea25720SGraeme Russ return 1; 39fea25720SGraeme Russ 40fea25720SGraeme Russ if (images->legacy_hdr_valid) { 41fea25720SGraeme Russ hdr = images->legacy_hdr_os; 42fea25720SGraeme Russ if (image_check_type(hdr, IH_TYPE_MULTI)) { 43fea25720SGraeme Russ /* if multi-part image, we need to get first subimage */ 44fea25720SGraeme Russ image_multi_getimg(hdr, 0, &os_data, &os_len); 45fea25720SGraeme Russ } else { 46fea25720SGraeme Russ /* otherwise get image data */ 47fea25720SGraeme Russ os_data = image_get_data(hdr); 48fea25720SGraeme Russ os_len = image_get_data_size(hdr); 49fea25720SGraeme Russ } 50fea25720SGraeme Russ #if defined(CONFIG_FIT) 51fea25720SGraeme Russ } else if (images->fit_uname_os) { 52bdc7d5cdSSimon Glass int ret; 53bdc7d5cdSSimon Glass 54fea25720SGraeme Russ ret = fit_image_get_data(images->fit_hdr_os, 55fea25720SGraeme Russ images->fit_noffset_os, &data, &len); 56fea25720SGraeme Russ if (ret) { 57fea25720SGraeme Russ puts("Can't get image data/size!\n"); 58fea25720SGraeme Russ goto error; 59fea25720SGraeme Russ } 60fea25720SGraeme Russ os_data = (ulong)data; 61fea25720SGraeme Russ os_len = (ulong)len; 62fea25720SGraeme Russ #endif 63fea25720SGraeme Russ } else { 64fea25720SGraeme Russ puts("Could not find kernel image!\n"); 65fea25720SGraeme Russ goto error; 66fea25720SGraeme Russ } 67fea25720SGraeme Russ 68a76fc70eSGraeme Russ #ifdef CONFIG_CMD_ZBOOT 6969370d14SGabe Black base_ptr = load_zimage((void *)os_data, os_len, &load_address); 70a76fc70eSGraeme Russ #endif 71fea25720SGraeme Russ 72fea25720SGraeme Russ if (NULL == base_ptr) { 73fea25720SGraeme Russ printf("## Kernel loading failed ...\n"); 74fea25720SGraeme Russ goto error; 7569370d14SGabe Black } 76fea25720SGraeme Russ 7769370d14SGabe Black if (setup_zimage(base_ptr, (char *)base_ptr + COMMAND_LINE_OFFSET, 7869370d14SGabe Black 0, images->rd_start, 7969370d14SGabe Black images->rd_end - images->rd_start)) { 8069370d14SGabe Black printf("## Setting up boot parameters failed ...\n"); 8169370d14SGabe Black goto error; 82fea25720SGraeme Russ } 83fea25720SGraeme Russ 84233dbc11SGabe Black boot_zimage(base_ptr, load_address); 85fea25720SGraeme Russ /* does not return */ 86fea25720SGraeme Russ 87fea25720SGraeme Russ error: 88fea25720SGraeme Russ return 1; 89fea25720SGraeme Russ } 90