diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2022-01-19 09:26:42 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2022-01-19 09:26:42 +0100 |
commit | 6d6b90e1a6e2ea8ff8976eb1f1246e8fcc0babcf (patch) | |
tree | c3b1817f544b483c4d85b98a718053eccd3b6cd2 /arch | |
parent | 935651ef0b964b592b81d7e7e070033e4bce0b31 (diff) | |
parent | 57a93667e2b79171314e264d948322a584dbccb2 (diff) | |
download | barebox-6d6b90e1a6e2ea8ff8976eb1f1246e8fcc0babcf.tar.gz barebox-6d6b90e1a6e2ea8ff8976eb1f1246e8fcc0babcf.tar.xz |
Merge branch 'for-next/kvx'
Diffstat (limited to 'arch')
-rw-r--r-- | arch/kvx/Kconfig | 1 | ||||
-rw-r--r-- | arch/kvx/cpu/cpu.c | 2 | ||||
-rw-r--r-- | arch/kvx/include/asm/bootm.h | 11 | ||||
-rw-r--r-- | arch/kvx/include/asm/common.h | 3 | ||||
-rw-r--r-- | arch/kvx/include/asm/sfr.h | 4 | ||||
-rw-r--r-- | arch/kvx/lib/bootm.c | 33 | ||||
-rw-r--r-- | arch/kvx/lib/dma-default.c | 38 |
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); -} |