* [PATCH v3 1/4] common: bootm: allow building with an undefined IH_ARCH
2020-06-30 20:43 [PATCH v3 0/4] kvx: add elf bootm support Clement Leger
@ 2020-06-30 20:43 ` Clement Leger
2020-06-30 20:44 ` [PATCH v3 2/4] common: Kconfig: remove MIPS dependency for ELF Clement Leger
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Clement Leger @ 2020-06-30 20:43 UTC (permalink / raw)
To: Sascha Hauer, barebox; +Cc: Clement Leger, Ahmad Fatoum
Some architectures might not want to support uImage. To do so, allow
IH_ARCH to be let undefined which will make it possible to compile boot
support.
Signed-off-by: Clement Leger <cleger@kalray.eu>
---
common/bootm.c | 2 +-
include/image.h | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/common/bootm.c b/common/bootm.c
index 4110d8d6e..bea73fac3 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -510,7 +510,7 @@ static int bootm_open_os_uimage(struct image_data *data)
uimage_print_contents(data->os);
- if (data->os->header.ih_arch != IH_ARCH) {
+ if (IH_ARCH == IH_ARCH_INVALID || data->os->header.ih_arch != IH_ARCH) {
printf("Unsupported Architecture 0x%x\n",
data->os->header.ih_arch);
return -EINVAL;
diff --git a/include/image.h b/include/image.h
index 88b628bc7..0a7832f13 100644
--- a/include/image.h
+++ b/include/image.h
@@ -101,6 +101,8 @@
#define IH_ARCH IH_ARCH_AVR32
#elif defined(CONFIG_LINUX)
#define IH_ARCH IH_ARCH_LINUX
+#else
+#define IH_ARCH IH_ARCH_INVALID
#endif
/*
--
2.17.1
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 2/4] common: Kconfig: remove MIPS dependency for ELF
2020-06-30 20:43 [PATCH v3 0/4] kvx: add elf bootm support Clement Leger
2020-06-30 20:43 ` [PATCH v3 1/4] common: bootm: allow building with an undefined IH_ARCH Clement Leger
@ 2020-06-30 20:44 ` Clement Leger
2020-06-30 20:44 ` [PATCH v3 3/4] kvx: add I-cache and D-cache synchronisation Clement Leger
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Clement Leger @ 2020-06-30 20:44 UTC (permalink / raw)
To: Sascha Hauer, barebox; +Cc: Clement Leger, Ahmad Fatoum
There is no reason anymore to limit the use of elf on mips since there
is no elf specific support needed in architectures. Drop the MIPS
dependency.
Signed-off-by: Clement Leger <cleger@kalray.eu>
---
common/Kconfig | 1 -
1 file changed, 1 deletion(-)
diff --git a/common/Kconfig b/common/Kconfig
index f150092af..36b504dd3 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -39,7 +39,6 @@ config BLOCK_WRITE
config ELF
bool "ELF Support" if COMPILE_TEST
- depends on MIPS || COMPILE_TEST
config FILETYPE
bool
--
2.17.1
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 3/4] kvx: add I-cache and D-cache synchronisation
2020-06-30 20:43 [PATCH v3 0/4] kvx: add elf bootm support Clement Leger
2020-06-30 20:43 ` [PATCH v3 1/4] common: bootm: allow building with an undefined IH_ARCH Clement Leger
2020-06-30 20:44 ` [PATCH v3 2/4] common: Kconfig: remove MIPS dependency for ELF Clement Leger
@ 2020-06-30 20:44 ` Clement Leger
2020-06-30 20:44 ` [PATCH v3 4/4] kvx: add support for elf loading using bootm Clement Leger
2020-07-01 5:23 ` [PATCH v3 0/4] kvx: add elf bootm support Sascha Hauer
4 siblings, 0 replies; 6+ messages in thread
From: Clement Leger @ 2020-06-30 20:44 UTC (permalink / raw)
To: Sascha Hauer, barebox; +Cc: Clement Leger, Ahmad Fatoum
Before booting, we must make sure the I-cache is synchronized with the
D-cache to execute loaded instructions. In order to do that, add a
function which execute a fence to ensure every memory accesses have
been committed out of processor pipeline to memory and then invalidate
I-cache to reload from memory.
Signed-off-by: Clement Leger <cleger@kalray.eu>
---
arch/kvx/include/asm/cache.h | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
create mode 100644 arch/kvx/include/asm/cache.h
diff --git a/arch/kvx/include/asm/cache.h b/arch/kvx/include/asm/cache.h
new file mode 100644
index 000000000..3be176725
--- /dev/null
+++ b/arch/kvx/include/asm/cache.h
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (C) 2019 Kalray Inc.
+ */
+
+#ifndef __KVX_CACHE_H
+#define __KVX_CACHE_H
+
+#include <linux/types.h>
+
+static inline void sync_caches_for_execution(void)
+{
+ __builtin_kvx_fence();
+ __builtin_kvx_iinval();
+ __builtin_kvx_barrier();
+}
+
+#endif /* __KVX_CACHE_H */
--
2.17.1
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 4/4] kvx: add support for elf loading using bootm
2020-06-30 20:43 [PATCH v3 0/4] kvx: add elf bootm support Clement Leger
` (2 preceding siblings ...)
2020-06-30 20:44 ` [PATCH v3 3/4] kvx: add I-cache and D-cache synchronisation Clement Leger
@ 2020-06-30 20:44 ` Clement Leger
2020-07-01 5:23 ` [PATCH v3 0/4] kvx: add elf bootm support Sascha Hauer
4 siblings, 0 replies; 6+ messages in thread
From: Clement Leger @ 2020-06-30 20:44 UTC (permalink / raw)
To: Sascha Hauer, barebox; +Cc: Clement Leger, Ahmad Fatoum
From: Clement Leger <clement.leger@kalray.eu>
In order to boot elfs files, add bootm command support for kvx. This support
can boot elf files using bootm elf support. initrd and device-tree handling
is also included and loads them after the elf file load address.
Signed-off-by: Clement Leger <cleger@kalray.eu>
---
arch/kvx/Kconfig | 5 ++
arch/kvx/configs/generic_defconfig | 3 +-
arch/kvx/include/asm/bootm.h | 11 +++
arch/kvx/include/asm/elf.h | 3 +
arch/kvx/lib/Makefile | 2 +-
arch/kvx/lib/bootm.c | 133 +++++++++++++++++++++++++++++
6 files changed, 155 insertions(+), 2 deletions(-)
create mode 100644 arch/kvx/include/asm/bootm.h
create mode 100644 arch/kvx/lib/bootm.c
diff --git a/arch/kvx/Kconfig b/arch/kvx/Kconfig
index 5463bb4f1..3327021e1 100644
--- a/arch/kvx/Kconfig
+++ b/arch/kvx/Kconfig
@@ -1,9 +1,14 @@
config KVX
bool
select 64BIT
+ select BOOTM
+ select BOOTM_ELF
+ select BOOTM_OFTREE
+ select BOOTM_INITRD
select CLKDEV_LOOKUP
select COMMON_CLK
select COMMON_CLK_OF_PROVIDER
+ select ELF
select FLEXIBLE_BOOTARGS
select GENERIC_FIND_NEXT_BIT
select LIBFDT
diff --git a/arch/kvx/configs/generic_defconfig b/arch/kvx/configs/generic_defconfig
index f9ff773a0..816217174 100644
--- a/arch/kvx/configs/generic_defconfig
+++ b/arch/kvx/configs/generic_defconfig
@@ -1,7 +1,8 @@
CONFIG_AUTO_COMPLETE=y
CONFIG_BAUDRATE=115200
-# CONFIG_BOOTM is not set
CONFIG_CLOCKSOURCE_KVX=y
+CONFIG_CMD_BOOT=y
+CONFIG_CMD_BOOTM=y
CONFIG_CMD_CMP=y
CONFIG_CMD_OF_DUMP=y
CONFIG_CMD_POWEROFF=y
diff --git a/arch/kvx/include/asm/bootm.h b/arch/kvx/include/asm/bootm.h
new file mode 100644
index 000000000..7ad7e2e87
--- /dev/null
+++ b/arch/kvx/include/asm/bootm.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2019 Kalray Inc.
+ */
+
+#ifndef _ASM_KVX_BOOTM_H
+#define _ASM_KVX_BOOTM_H
+
+#define LINUX_BOOT_PARAM_MAGIC 0x31564752414E494CULL
+
+#endif /* _ASM_KVX_BOOTM_H */
diff --git a/arch/kvx/include/asm/elf.h b/arch/kvx/include/asm/elf.h
index 7cc09d7ba..2975ad1b9 100644
--- a/arch/kvx/include/asm/elf.h
+++ b/arch/kvx/include/asm/elf.h
@@ -11,6 +11,9 @@
*/
#include <linux/types.h>
+#define EM_KVX 256
+
+#define ELF_ARCH EM_KVX
#define ELF_CLASS ELFCLASS32
#define ELF_DATA ELFDATA2MSB
diff --git a/arch/kvx/lib/Makefile b/arch/kvx/lib/Makefile
index 352e7034a..6e56462da 100644
--- a/arch/kvx/lib/Makefile
+++ b/arch/kvx/lib/Makefile
@@ -3,4 +3,4 @@
# Copyright (C) 2019 Kalray Inc.
#
-obj-y += cpuinfo.o board.o dtb.o poweroff.o
+obj-y += cpuinfo.o board.o dtb.o poweroff.o bootm.o
diff --git a/arch/kvx/lib/bootm.c b/arch/kvx/lib/bootm.c
new file mode 100644
index 000000000..198eef798
--- /dev/null
+++ b/arch/kvx/lib/bootm.c
@@ -0,0 +1,133 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2019 Kalray Inc.
+ */
+
+#include <elf.h>
+#include <boot.h>
+#include <init.h>
+#include <bootm.h>
+#include <binfmt.h>
+#include <common.h>
+#include <libfile.h>
+#include <linux/kernel.h>
+
+#include <asm/cache.h>
+#include <asm/bootm.h>
+
+typedef void __noreturn (*boot_func_entry)(unsigned long, void *);
+
+static int do_boot_entry(struct image_data *data, boot_func_entry entry,
+ void *fdt_load_addr)
+{
+ printf("starting elf (entry at %p)\n", entry);
+
+ if (data->dryrun)
+ return 0;
+
+ shutdown_barebox();
+
+ /* Synchronize I-cache with D-cache */
+ sync_caches_for_execution();
+
+ /**
+ * Parameters passing
+ * r0: boot magic
+ * r1: device tree pointer
+ */
+ entry(LINUX_BOOT_PARAM_MAGIC, (void *) fdt_load_addr);
+
+ /* should never return ! */
+ panic("Returned from boot program !\n");
+
+ return -EINVAL;
+}
+
+static int do_boot_elf(struct image_data *data, struct elf_image *elf)
+{
+ int ret;
+ void *fdt;
+ boot_func_entry entry;
+ unsigned long load_addr, initrd_address;
+
+ /* load initrd after the elf */
+ load_addr = PAGE_ALIGN((unsigned long) elf->high_addr);
+ if (bootm_has_initrd(data)) {
+ if (data->initrd_address != UIMAGE_INVALID_ADDRESS)
+ initrd_address = data->initrd_address;
+ else
+ initrd_address = load_addr;
+
+ printf("Loading initrd at 0x%lx\n", initrd_address);
+ ret = bootm_load_initrd(data, initrd_address);
+ if (ret) {
+ printf("Failed to load initrd\n");
+ return ret;
+ }
+
+ if (data->initrd_address == UIMAGE_INVALID_ADDRESS) {
+ load_addr += resource_size(data->initrd_res);
+ load_addr = PAGE_ALIGN(load_addr);
+ }
+ }
+
+ fdt = bootm_get_devicetree(data);
+ if (IS_ERR(fdt)) {
+ printf("Failed to load dtb\n");
+ return PTR_ERR(fdt);
+ }
+
+ printf("Loading device tree at %lx\n", load_addr);
+ /* load device tree after the initrd if any */
+ ret = bootm_load_devicetree(data, fdt, load_addr);
+ if (ret) {
+ printf("Failed to load device tree: %d\n", ret);
+ goto err_free_fdt;
+ }
+
+ entry = (boot_func_entry) data->os_address;
+
+ ret = do_boot_entry(data, entry, fdt);
+
+err_free_fdt:
+ free(fdt);
+
+ return ret;
+}
+
+static int do_bootm_elf(struct image_data *data)
+{
+ int ret;
+
+ ret = bootm_load_os(data, data->os_address);
+ if (ret)
+ return ret;
+
+ return do_boot_elf(data, data->elf);
+}
+
+static struct image_handler elf_handler = {
+ .name = "ELF",
+ .bootm = do_bootm_elf,
+ .filetype = filetype_elf,
+};
+
+static struct binfmt_hook binfmt_elf_hook = {
+ .type = filetype_elf,
+ .exec = "bootm",
+};
+
+static int kvx_register_image_handler(void)
+{
+ register_image_handler(&elf_handler);
+
+ binfmt_register(&binfmt_elf_hook);
+
+ return 0;
+}
+
+late_initcall(kvx_register_image_handler);
--
2.17.1
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3 0/4] kvx: add elf bootm support
2020-06-30 20:43 [PATCH v3 0/4] kvx: add elf bootm support Clement Leger
` (3 preceding siblings ...)
2020-06-30 20:44 ` [PATCH v3 4/4] kvx: add support for elf loading using bootm Clement Leger
@ 2020-07-01 5:23 ` Sascha Hauer
4 siblings, 0 replies; 6+ messages in thread
From: Sascha Hauer @ 2020-07-01 5:23 UTC (permalink / raw)
To: Clement Leger; +Cc: barebox, Ahmad Fatoum
On Tue, Jun 30, 2020 at 10:43:58PM +0200, Clement Leger wrote:
> This serie adds support for elf bootm support on KVX architecture.
> First patches are allowing to build elf support for KVX and then bootm
> support is added to KVX.
>
> Changes from v2 -> v3:
> - Rename sync_icache_dcache to sync_caches_for_execution
> - Keep COMPILE_TEST support for ELF
>
> Changes from v1 -> v2:
> - Remove D-cache invalidation
> - Reword first patch commit message
>
> Clement Leger (4):
> common: bootm: allow building with an undefined IH_ARCH
> common: Kconfig: remove MIPS dependency for ELF
> kvx: add I-cache and D-cache synchronisation
> kvx: add support for elf loading using bootm
Applied, thanks
Sascha
>
> arch/kvx/Kconfig | 5 ++
> arch/kvx/configs/generic_defconfig | 3 +-
> arch/kvx/include/asm/bootm.h | 11 +++
> arch/kvx/include/asm/cache.h | 18 ++++
> arch/kvx/include/asm/elf.h | 3 +
> arch/kvx/lib/Makefile | 2 +-
> arch/kvx/lib/bootm.c | 133 +++++++++++++++++++++++++++++
> common/Kconfig | 1 -
> common/bootm.c | 2 +-
> include/image.h | 2 +
> 10 files changed, 176 insertions(+), 4 deletions(-)
> create mode 100644 arch/kvx/include/asm/bootm.h
> create mode 100644 arch/kvx/include/asm/cache.h
> create mode 100644 arch/kvx/lib/bootm.c
>
> --
> 2.17.1
>
>
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 6+ messages in thread