summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2022-01-19 09:26:42 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2022-01-19 09:26:42 +0100
commit6d6b90e1a6e2ea8ff8976eb1f1246e8fcc0babcf (patch)
treec3b1817f544b483c4d85b98a718053eccd3b6cd2 /arch
parent935651ef0b964b592b81d7e7e070033e4bce0b31 (diff)
parent57a93667e2b79171314e264d948322a584dbccb2 (diff)
downloadbarebox-6d6b90e1a6e2ea8ff8976eb1f1246e8fcc0babcf.tar.gz
barebox-6d6b90e1a6e2ea8ff8976eb1f1246e8fcc0babcf.tar.xz
Merge branch 'for-next/kvx'
Diffstat (limited to 'arch')
-rw-r--r--arch/kvx/Kconfig1
-rw-r--r--arch/kvx/cpu/cpu.c2
-rw-r--r--arch/kvx/include/asm/bootm.h11
-rw-r--r--arch/kvx/include/asm/common.h3
-rw-r--r--arch/kvx/include/asm/sfr.h4
-rw-r--r--arch/kvx/lib/bootm.c33
-rw-r--r--arch/kvx/lib/dma-default.c38
7 files changed, 39 insertions, 53 deletions
diff --git a/arch/kvx/Kconfig b/arch/kvx/Kconfig
index 0934440880..100a945761 100644
--- a/arch/kvx/Kconfig
+++ b/arch/kvx/Kconfig
@@ -10,6 +10,7 @@ config KVX
select COMMON_CLK_OF_PROVIDER
select ELF
select FLEXIBLE_BOOTARGS
+ select FITIMAGE
select GENERIC_FIND_NEXT_BIT
select HAS_ARCH_SJLJ
select HAS_CACHE
diff --git a/arch/kvx/cpu/cpu.c b/arch/kvx/cpu/cpu.c
index 788d3194fe..4b0d4d2d96 100644
--- a/arch/kvx/cpu/cpu.c
+++ b/arch/kvx/cpu/cpu.c
@@ -16,7 +16,7 @@ void kvx_lowlevel_setup(unsigned long r0, void *dtb_ptr)
{
uint64_t ev_val = (uint64_t) &_exception_start | EXCEPTION_STRIDE;
- if (r0 == FSBL_PARAM_MAGIC) {
+ if (r0 == FSBL_PARAM_MAGIC || r0 == LINUX_BOOT_PARAM_MAGIC) {
boot_dtb = dtb_ptr;
pr_info("Using DTB provided by FSBL\n");
}
diff --git a/arch/kvx/include/asm/bootm.h b/arch/kvx/include/asm/bootm.h
deleted file mode 100644
index 7ad7e2e878..0000000000
--- a/arch/kvx/include/asm/bootm.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* 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/common.h b/arch/kvx/include/asm/common.h
index a7e301e53a..754953962b 100644
--- a/arch/kvx/include/asm/common.h
+++ b/arch/kvx/include/asm/common.h
@@ -12,7 +12,8 @@
* Magic value passed in r0 to indicate valid parameters from FSBL when booting
* If $r0 contains this value, then $r1 contains dtb pointer.
*/
-#define FSBL_PARAM_MAGIC 0x31564752414C414BULL
+#define FSBL_PARAM_MAGIC 0x31564752414C414BULL /* KALARGV1 */
+#define LINUX_BOOT_PARAM_MAGIC 0x31564752414E494CULL /* LINARGV1 */
extern char _exception_start;
extern char __end;
diff --git a/arch/kvx/include/asm/sfr.h b/arch/kvx/include/asm/sfr.h
index 5b93cee345..89ff64bbdc 100644
--- a/arch/kvx/include/asm/sfr.h
+++ b/arch/kvx/include/asm/sfr.h
@@ -44,4 +44,8 @@ kvx_sfr_set_mask(unsigned char sfr, uint64_t mask, uint64_t value)
#define kvx_sfr_set(_sfr, _val) __builtin_kvx_set(KVX_SFR_ ## _sfr, _val)
#define kvx_sfr_get(_sfr) __builtin_kvx_get(KVX_SFR_ ## _sfr)
+#define kvx_sfr_field_val(_val, _sfr, _field) \
+ (((_val) & KVX_SFR_ ## _sfr ## _ ## _field ## _MASK) \
+ >> KVX_SFR_ ## _sfr ## _ ## _field ## _SHIFT)
+
#endif /* _ASM_KVX_SFR_DEFS_H */
diff --git a/arch/kvx/lib/bootm.c b/arch/kvx/lib/bootm.c
index 4d17e1846d..4c77f676ec 100644
--- a/arch/kvx/lib/bootm.c
+++ b/arch/kvx/lib/bootm.c
@@ -17,7 +17,6 @@
#include <linux/kernel.h>
#include <asm/cache.h>
-#include <asm/bootm.h>
typedef void __noreturn (*boot_func_entry)(unsigned long, void *);
@@ -95,7 +94,7 @@ static int do_boot_elf(struct image_data *data, struct elf_image *elf)
goto err_free_fdt;
}
- entry = (boot_func_entry) data->os_address;
+ entry = (boot_func_entry) elf->entry;
ret = do_boot_entry(data, entry, fdt);
@@ -105,6 +104,27 @@ err_free_fdt:
return ret;
}
+static int do_bootm_fit(struct image_data *data)
+{
+ int ret;
+ struct elf_image *elf;
+
+ elf = elf_open_binary((void *) data->fit_kernel);
+ if (IS_ERR(elf))
+ return PTR_ERR(data->elf);
+
+ ret = elf_load(elf);
+ if (ret)
+ goto close_elf;
+
+ ret = do_boot_elf(data, elf);
+
+close_elf:
+ elf_close(elf);
+
+ return ret;
+}
+
static int do_bootm_elf(struct image_data *data)
{
int ret;
@@ -122,6 +142,12 @@ static struct image_handler elf_handler = {
.filetype = filetype_elf,
};
+static struct image_handler fit_handler = {
+ .name = "FIT",
+ .bootm = do_bootm_fit,
+ .filetype = filetype_oftree,
+};
+
static struct binfmt_hook binfmt_elf_hook = {
.type = filetype_elf,
.exec = "bootm",
@@ -131,6 +157,9 @@ static int kvx_register_image_handler(void)
{
register_image_handler(&elf_handler);
+ if (IS_ENABLED(CONFIG_FITIMAGE))
+ register_image_handler(&fit_handler);
+
binfmt_register(&binfmt_elf_hook);
return 0;
diff --git a/arch/kvx/lib/dma-default.c b/arch/kvx/lib/dma-default.c
index 2a4144696c..c84a32954e 100644
--- a/arch/kvx/lib/dma-default.c
+++ b/arch/kvx/lib/dma-default.c
@@ -54,41 +54,3 @@ void dma_sync_single_for_cpu(dma_addr_t addr, size_t size,
BUG();
}
}
-
-#define KVX_DDR_ALIAS_OFFSET \
- (KVX_DDR_64BIT_RAM_WINDOW_BA - KVX_DDR_32BIT_RAM_WINDOW_BA)
-#define KVX_DDR_ALIAS_WINDOW \
- (KVX_DDR_64BIT_RAM_WINDOW_BA + KVX_DDR_ALIAS_OFFSET)
-
-/* Local smem is aliased between 0 and 16MB */
-#define KVX_SMEM_LOCAL_ALIAS 0x1000000ULL
-
-dma_addr_t dma_map_single(struct device_d *dev, void *ptr, size_t size,
- enum dma_data_direction dir)
-{
- uintptr_t addr = (uintptr_t) ptr;
-
- dma_sync_single_for_device(addr, size, dir);
-
- /* Local smem alias should never be used for dma */
- if (addr < KVX_SMEM_LOCAL_ALIAS)
- return addr + (1 + kvx_cluster_id()) * KVX_SMEM_LOCAL_ALIAS;
-
- if (dev->dma_mask && addr <= dev->dma_mask)
- return addr;
-
- if (addr >= KVX_DDR_ALIAS_WINDOW)
- return DMA_ERROR_CODE;
-
- addr -= KVX_DDR_ALIAS_OFFSET;
- if (dev->dma_mask && addr > dev->dma_mask)
- return DMA_ERROR_CODE;
-
- return addr;
-}
-
-void dma_unmap_single(struct device_d *dev, dma_addr_t addr, size_t size,
- enum dma_data_direction dir)
-{
- dma_sync_single_for_cpu(addr, size, dir);
-}