diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2018-03-14 16:17:59 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-04-04 07:44:26 +0200 |
commit | ec65d02645bb183366015468c0e57f2d150e8ba0 (patch) | |
tree | ea7a8ded7db0ba40de61f1af6d27968e50c3d551 /arch/arm/lib64 | |
parent | 79e3038089f5392a86c688b0fedf7523a99b8d51 (diff) | |
download | barebox-ec65d02645bb183366015468c0e57f2d150e8ba0.tar.gz barebox-ec65d02645bb183366015468c0e57f2d150e8ba0.tar.xz |
ARM: aarch64: Add support to start kernel and barebox
aarch64 has its own image format. Add a bootm handler to handle this
format. Also add a barebox handler.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/lib64')
-rw-r--r-- | arch/arm/lib64/armlinux.c | 120 |
1 files changed, 98 insertions, 22 deletions
diff --git a/arch/arm/lib64/armlinux.c b/arch/arm/lib64/armlinux.c index 54ce6ca046..238e8b67a4 100644 --- a/arch/arm/lib64/armlinux.c +++ b/arch/arm/lib64/armlinux.c @@ -1,51 +1,127 @@ /* - * (C) Copyright 2002 - * Sysgo Real-Time Solutions, GmbH <www.elinos.com> - * Marius Groeger <mgroeger@sysgo.de> + * Copyright (C) 2018 Sascha Hauer <s.hauer@pengutronix.de> * - * Copyright (C) 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. */ #include <boot.h> #include <common.h> -#include <command.h> -#include <driver.h> #include <environment.h> #include <image.h> -#include <init.h> #include <fs.h> -#include <linux/list.h> #include <xfuncs.h> #include <malloc.h> #include <fcntl.h> #include <errno.h> #include <memory.h> #include <of.h> -#include <magicvar.h> - +#include <init.h> +#include <bootm.h> +#include <linux/list.h> #include <asm/byteorder.h> #include <asm/setup.h> #include <asm/barebox-arm.h> #include <asm/armlinux.h> #include <asm/system.h> -void start_linux(void *adr, int swap, unsigned long initrd_address, - unsigned long initrd_size, void *oftree, - enum arm_security_state bootm_secure_state) +static int do_bootm_linux(struct image_data *data) { - void (*kernel)(void *dtb) = adr; + void (*fn)(unsigned long dtb, unsigned long x1, unsigned long x2, + unsigned long x3); + resource_size_t start, end; + unsigned long text_offset, image_size, devicetree, kernel; + int ret; + + text_offset = le64_to_cpup(data->os_header + 8); + image_size = le64_to_cpup(data->os_header + 16); + + ret = memory_bank_first_find_space(&start, &end); + if (ret) + goto out; + + kernel = ALIGN(start, SZ_2M) + text_offset; + + ret = bootm_load_os(data, kernel); + if (ret) + goto out; + + devicetree = ALIGN(kernel + image_size, PAGE_SIZE); + + ret = bootm_load_devicetree(data, devicetree); + if (ret) + goto out; + + printf("Loaded kernel to 0x%08lx, devicetree at 0x%08lx\n", + kernel, devicetree); shutdown_barebox(); - kernel(oftree); + fn = (void *)kernel; + + fn(devicetree, 0, 0, 0); + + ret = -EINVAL; + +out: + return ret; +} + +static struct image_handler aarch64_linux_handler = { + .name = "ARM aarch64 Linux image", + .bootm = do_bootm_linux, + .filetype = filetype_arm64_linux_image, +}; + +static int do_bootm_barebox(struct image_data *data) +{ + void (*fn)(unsigned long x0, unsigned long x1, unsigned long x2, + unsigned long x3); + resource_size_t start, end; + unsigned long barebox; + int ret; + + ret = memory_bank_first_find_space(&start, &end); + if (ret) + goto out; + + barebox = start; + + ret = bootm_load_os(data, barebox); + if (ret) + goto out; + + printf("Loaded barebox image to 0x%08lx\n", barebox); + + shutdown_barebox(); + + fn = (void *)barebox; + + fn(0, 0, 0, 0); + + ret = -EINVAL; + +out: + return ret; +} + +static struct image_handler aarch64_barebox_handler = { + .name = "ARM aarch64 barebox image", + .bootm = do_bootm_barebox, + .filetype = filetype_arm_barebox, +}; + +static int aarch64_register_image_handler(void) +{ + register_image_handler(&aarch64_linux_handler); + register_image_handler(&aarch64_barebox_handler); + + return 0; } +late_initcall(aarch64_register_image_handler); |