mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH v2 0/4] kvx: add elf bootm support
@ 2020-06-28 15:51 Clement Leger
  2020-06-28 15:51 ` [PATCH v2 1/4] common: bootm: allow building using undefined IH_ARCH Clement Leger
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Clement Leger @ 2020-06-28 15:51 UTC (permalink / raw)
  To: Sascha Hauer, barebox; +Cc: Clement Leger, Ahmad Fatoum

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 v1 -> v2:
 - Remove D-cache invalidation
 - Reword first patch commit message

Clement Leger (4):
  common: bootm: allow building using undefined IH_ARCH
  common: Kconfig: remove MIPS dependency
  kvx: add I-cache and D-cache synchronisation
  kvx: add support for elf loading using bootm

 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                     |   3 +-
 common/bootm.c                     |   2 +-
 include/image.h                    |   2 +
 10 files changed, 177 insertions(+), 5 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


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2 1/4] common: bootm: allow building using undefined IH_ARCH
  2020-06-28 15:51 [PATCH v2 0/4] kvx: add elf bootm support Clement Leger
@ 2020-06-28 15:51 ` Clement Leger
  2020-06-28 15:51 ` [PATCH v2 2/4] common: Kconfig: remove MIPS dependency Clement Leger
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Clement Leger @ 2020-06-28 15:51 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 v2 2/4] common: Kconfig: remove MIPS dependency
  2020-06-28 15:51 [PATCH v2 0/4] kvx: add elf bootm support Clement Leger
  2020-06-28 15:51 ` [PATCH v2 1/4] common: bootm: allow building using undefined IH_ARCH Clement Leger
@ 2020-06-28 15:51 ` Clement Leger
  2020-06-29  8:16   ` Ahmad Fatoum
  2020-06-28 15:51 ` [PATCH v2 3/4] kvx: add I-cache and D-cache synchronisation Clement Leger
  2020-06-28 15:51 ` [PATCH v2 4/4] kvx: add support for elf loading using bootm Clement Leger
  3 siblings, 1 reply; 6+ messages in thread
From: Clement Leger @ 2020-06-28 15:51 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. Remove this
dependency and drop COMPILE_TEST config.

Signed-off-by: Clement Leger <cleger@kalray.eu>
---
 common/Kconfig | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/common/Kconfig b/common/Kconfig
index f150092af..a3a290ad3 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -38,8 +38,7 @@ config BLOCK_WRITE
 	bool
 
 config ELF
-	bool "ELF Support" if COMPILE_TEST
-	depends on MIPS || COMPILE_TEST
+	bool
 
 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 v2 3/4] kvx: add I-cache and D-cache synchronisation
  2020-06-28 15:51 [PATCH v2 0/4] kvx: add elf bootm support Clement Leger
  2020-06-28 15:51 ` [PATCH v2 1/4] common: bootm: allow building using undefined IH_ARCH Clement Leger
  2020-06-28 15:51 ` [PATCH v2 2/4] common: Kconfig: remove MIPS dependency Clement Leger
@ 2020-06-28 15:51 ` Clement Leger
  2020-06-28 15:51 ` [PATCH v2 4/4] kvx: add support for elf loading using bootm Clement Leger
  3 siblings, 0 replies; 6+ messages in thread
From: Clement Leger @ 2020-06-28 15:51 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..a3314d157
--- /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_dcache_icache(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 v2 4/4] kvx: add support for elf loading using bootm
  2020-06-28 15:51 [PATCH v2 0/4] kvx: add elf bootm support Clement Leger
                   ` (2 preceding siblings ...)
  2020-06-28 15:51 ` [PATCH v2 3/4] kvx: add I-cache and D-cache synchronisation Clement Leger
@ 2020-06-28 15:51 ` Clement Leger
  3 siblings, 0 replies; 6+ messages in thread
From: Clement Leger @ 2020-06-28 15:51 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..b9edb62af
--- /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_dcache_icache();
+
+	/**
+	 * 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 v2 2/4] common: Kconfig: remove MIPS dependency
  2020-06-28 15:51 ` [PATCH v2 2/4] common: Kconfig: remove MIPS dependency Clement Leger
@ 2020-06-29  8:16   ` Ahmad Fatoum
  0 siblings, 0 replies; 6+ messages in thread
From: Ahmad Fatoum @ 2020-06-29  8:16 UTC (permalink / raw)
  To: Clement Leger, Sascha Hauer, barebox

Hello Clement,

On 6/28/20 5:51 PM, Clement Leger wrote:
> There is no reason anymore to limit the use of elf on mips since there
> is no elf specific support needed in architectures. Remove this
> dependency and drop COMPILE_TEST config.
> 
> Signed-off-by: Clement Leger <cleger@kalray.eu>
> ---
>  common/Kconfig | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/common/Kconfig b/common/Kconfig
> index f150092af..a3a290ad3 100644
> --- a/common/Kconfig
> +++ b/common/Kconfig
> @@ -38,8 +38,7 @@ config BLOCK_WRITE
>  	bool
>  
>  config ELF
> -	bool "ELF Support" if COMPILE_TEST
> -	depends on MIPS || COMPILE_TEST
> +	bool

as I already commented on v1, please don't remove the bool "Elf Support" if COMPILE_TEST
line. You can drop the depends.


>  
>  config FILETYPE
>  	bool
> 

-- 
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

end of thread, other threads:[~2020-06-29  8:16 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-28 15:51 [PATCH v2 0/4] kvx: add elf bootm support Clement Leger
2020-06-28 15:51 ` [PATCH v2 1/4] common: bootm: allow building using undefined IH_ARCH Clement Leger
2020-06-28 15:51 ` [PATCH v2 2/4] common: Kconfig: remove MIPS dependency Clement Leger
2020-06-29  8:16   ` Ahmad Fatoum
2020-06-28 15:51 ` [PATCH v2 3/4] kvx: add I-cache and D-cache synchronisation Clement Leger
2020-06-28 15:51 ` [PATCH v2 4/4] kvx: add support for elf loading using bootm Clement Leger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox