diff options
Diffstat (limited to 'arch/arm/include')
49 files changed, 1743 insertions, 148 deletions
diff --git a/arch/arm/include/asm/arch-check.h b/arch/arm/include/asm/arch-check.h new file mode 100644 index 0000000000..2cf1b624a4 --- /dev/null +++ b/arch/arm/include/asm/arch-check.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef __ARM_ASM_ARCH_CHECK_H__ +#define __ARM_ASM_ARCH_CHECK_H__ + +#ifndef __LINUX_ARM_ARCH__ +#error No boards/CPUs selected in Kconfig +#endif + +#endif diff --git a/arch/arm/include/asm/armlinux.h b/arch/arm/include/asm/armlinux.h index 6af98968fa..8d8e05105b 100644 --- a/arch/arm/include/asm/armlinux.h +++ b/arch/arm/include/asm/armlinux.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ARCH_ARMLINUX_H #define __ARCH_ARMLINUX_H diff --git a/arch/arm/include/asm/asm-offsets.h b/arch/arm/include/asm/asm-offsets.h index 2f84e83996..33db5a47e5 100644 --- a/arch/arm/include/asm/asm-offsets.h +++ b/arch/arm/include/asm/asm-offsets.h @@ -1 +1,3 @@ -#include <generated/asm-offsets.h>
\ No newline at end of file +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include <generated/asm-offsets.h> diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 95c6768de8..5db0f692ee 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h @@ -111,3 +111,233 @@ .align 3; \ .long 9999b,9001f; \ .previous + + +/* + * Select code when configured for BE. + */ +#ifdef CONFIG_CPU_BIG_ENDIAN +#define CPU_BE(code...) code +#else +#define CPU_BE(code...) +#endif + +/* + * Select code when configured for LE. + */ +#ifdef CONFIG_CPU_BIG_ENDIAN +#define CPU_LE(code...) +#else +#define CPU_LE(code...) code +#endif + +#ifdef CONFIG_CPU_64 +/* + * Pseudo-ops for PC-relative adr/ldr/str <reg>, <symbol> where + * <symbol> is within the range +/- 4 GB of the PC. + */ + /* + * @dst: destination register (64 bit wide) + * @sym: name of the symbol + */ + .macro adr_l, dst, sym + adrp \dst, \sym + add \dst, \dst, :lo12:\sym + .endm + + /* + * @dst: destination register (32 or 64 bit wide) + * @sym: name of the symbol + * @tmp: optional 64-bit scratch register to be used if <dst> is a + * 32-bit wide register, in which case it cannot be used to hold + * the address + */ + .macro ldr_l, dst, sym, tmp= + .ifb \tmp + adrp \dst, \sym + ldr \dst, [\dst, :lo12:\sym] + .else + adrp \tmp, \sym + ldr \dst, [\tmp, :lo12:\sym] + .endif + .endm + + /* + * @src: source register (32 or 64 bit wide) + * @sym: name of the symbol + * @tmp: mandatory 64-bit scratch register to calculate the address + * while <src> needs to be preserved. + */ + .macro str_l, src, sym, tmp + adrp \tmp, \sym + str \src, [\tmp, :lo12:\sym] + .endm + +#else + + .macro __adldst_l, op, reg, sym, tmp, c + .if __LINUX_ARM_ARCH__ < 7 + ldr\c \tmp, .La\@ + .subsection 1 + .align 2 +.La\@: .long \sym - .Lpc\@ + .previous + .else + .ifnb \c + THUMB( ittt \c ) + .endif + movw\c \tmp, #:lower16:\sym - .Lpc\@ + movt\c \tmp, #:upper16:\sym - .Lpc\@ + .endif + +#ifndef CONFIG_THUMB2_BAREBOX + .set .Lpc\@, . + 8 // PC bias + .ifc \op, add + add\c \reg, \tmp, pc + .else + \op\c \reg, [pc, \tmp] + .endif +#else +.Lb\@: add\c \tmp, \tmp, pc + /* + * In Thumb-2 builds, the PC bias depends on whether we are currently + * emitting into a .arm or a .thumb section. The size of the add opcode + * above will be 2 bytes when emitting in Thumb mode and 4 bytes when + * emitting in ARM mode, so let's use this to account for the bias. + */ + .set .Lpc\@, . + (. - .Lb\@) + + .ifnc \op, add + \op\c \reg, [\tmp] + .endif +#endif + .endm + + /* + * mov_l - move a constant value or [relocated] address into a register + */ + .macro mov_l, dst:req, imm:req, cond + .if __LINUX_ARM_ARCH__ < 7 + ldr\cond \dst, =\imm + .else + movw\cond \dst, #:lower16:\imm + movt\cond \dst, #:upper16:\imm + .endif + .endm + + /* + * adr_l - adr pseudo-op with unlimited range + * + * @dst: destination register + * @sym: name of the symbol + * @cond: conditional opcode suffix + */ + .macro adr_l, dst:req, sym:req, cond + __adldst_l add, \dst, \sym, \dst, \cond + .endm + + /* + * ldr_l - ldr <literal> pseudo-op with unlimited range + * + * @dst: destination register + * @sym: name of the symbol + * @cond: conditional opcode suffix + */ + .macro ldr_l, dst:req, sym:req, cond + __adldst_l ldr, \dst, \sym, \dst, \cond + .endm + + /* + * str_l - str <literal> pseudo-op with unlimited range + * + * @src: source register + * @sym: name of the symbol + * @tmp: mandatory scratch register + * @cond: conditional opcode suffix + */ + .macro str_l, src:req, sym:req, tmp:req, cond + __adldst_l str, \src, \sym, \tmp, \cond + .endm + + .macro __ldst_va, op, reg, tmp, sym, cond, offset +#if __LINUX_ARM_ARCH__ >= 7 || \ + (defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS)) + mov_l \tmp, \sym, \cond +#else + /* + * Avoid a literal load, by emitting a sequence of ADD/LDR instructions + * with the appropriate relocations. The combined sequence has a range + * of -/+ 256 MiB, which should be sufficient for the core kernel and + * for modules loaded into the module region. + */ + .globl \sym + .reloc .L0_\@, R_ARM_ALU_PC_G0_NC, \sym + .reloc .L1_\@, R_ARM_ALU_PC_G1_NC, \sym + .reloc .L2_\@, R_ARM_LDR_PC_G2, \sym +.L0_\@: sub\cond \tmp, pc, #8 - \offset +.L1_\@: sub\cond \tmp, \tmp, #4 - \offset +.L2_\@: +#endif + \op\cond \reg, [\tmp, #\offset] + .endm + + /* + * ldr_va - load a 32-bit word from the virtual address of \sym + */ + .macro ldr_va, rd:req, sym:req, cond, tmp, offset=0 + .ifnb \tmp + __ldst_va ldr, \rd, \tmp, \sym, \cond, \offset + .else + __ldst_va ldr, \rd, \rd, \sym, \cond, \offset + .endif + .endm + + /* + * str_va - store a 32-bit word to the virtual address of \sym + */ + .macro str_va, rn:req, sym:req, tmp:req, cond + __ldst_va str, \rn, \tmp, \sym, \cond, 0 + .endm + + /* + * ldr_this_cpu - Load a 32-bit word from the per-CPU variable 'sym' + * into register 'rd', which may be the stack pointer, + * using 't1' and 't2' as general temp registers. These + * are permitted to overlap with 'rd' if != sp + */ + .macro ldr_this_cpu, rd:req, sym:req, t1:req, t2:req + ldr_va \rd, \sym, tmp=\t1 + .endm + + /* + * rev_l - byte-swap a 32-bit value + * + * @val: source/destination register + * @tmp: scratch register + */ + .macro rev_l, val:req, tmp:req + .if __LINUX_ARM_ARCH__ < 6 + eor \tmp, \val, \val, ror #16 + bic \tmp, \tmp, #0x00ff0000 + mov \val, \val, ror #8 + eor \val, \val, \tmp, lsr #8 + .else + rev \val, \val + .endif + .endm + + /* + * bl_r - branch and link to register + * + * @dst: target to branch to + * @c: conditional opcode suffix + */ + .macro bl_r, dst:req, c + .if __LINUX_ARM_ARCH__ < 6 + mov\c lr, pc + mov\c pc, \dst + .else + blx\c \dst + .endif + .endm +#endif diff --git a/arch/arm/include/asm/assembler64.h b/arch/arm/include/asm/assembler64.h index 26182aa5f6..615b257671 100644 --- a/arch/arm/include/asm/assembler64.h +++ b/arch/arm/include/asm/assembler64.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_ARCH_ASSEMBLY_H #define __ASM_ARCH_ASSEMBLY_H @@ -18,4 +20,4 @@ b.eq \el1_label .endm -#endif /* __ASM_ARCH_ASSEMBLY_H */
\ No newline at end of file +#endif /* __ASM_ARCH_ASSEMBLY_H */ diff --git a/arch/arm/include/asm/atf_common.h b/arch/arm/include/asm/atf_common.h index 56e2d3ffaa..ab99cd3ac1 100644 --- a/arch/arm/include/asm/atf_common.h +++ b/arch/arm/include/asm/atf_common.h @@ -14,8 +14,14 @@ #define ATF_PARAM_EP 0x01 #define ATF_PARAM_IMAGE_BINARY 0x02 #define ATF_PARAM_BL31 0x03 +#define ATF_PARAM_BL_PARAMS 0x05 #define ATF_VERSION_1 0x01 +#define ATF_VERSION_2 0x02 + +#define ATF_BL31_IMAGE_ID 0x03 +#define ATF_BL32_IMAGE_ID 0x04 +#define ATF_BL33_IMAGE_ID 0x05 #define ATF_EP_SECURE 0x0 #define ATF_EP_NON_SECURE 0x1 @@ -158,6 +164,40 @@ struct bl31_params { void bl31_entry(uintptr_t bl31_entry, uintptr_t bl32_entry, uintptr_t bl33_entry, uintptr_t fdt_addr); +/* BL image node in the BL image execution sequence */ +struct bl_params_node { + unsigned int image_id; + struct atf_image_info *image_info; + struct entry_point_info *ep_info; + struct bl_params_node *next_params_info; +}; + +/* + * BL image head node in the BL image execution sequence + * It is also used to pass information to next BL image. + */ +struct bl_params { + struct param_header h; + struct bl_params_node *head; +}; + +struct bl2_to_bl31_params_mem_v2 { + struct bl_params bl_params; + struct bl_params_node bl31_params_node; + struct bl_params_node bl32_params_node; + struct bl_params_node bl33_params_node; + struct atf_image_info bl31_image_info; + struct atf_image_info bl32_image_info; + struct atf_image_info bl33_image_info; + struct entry_point_info bl31_ep_info; + struct entry_point_info bl32_ep_info; + struct entry_point_info bl33_ep_info; +}; + +struct bl2_to_bl31_params_mem_v2 *bl2_plat_get_bl31_params_v2(uintptr_t bl32_entry, + uintptr_t bl33_entry, uintptr_t fdt_addr); +void bl31_entry_v2(uintptr_t bl31_entry, struct bl_params *params, void *fdt_addr); + #endif /*__ASSEMBLY__ */ #endif /* __BL_COMMON_H__ */ diff --git a/arch/arm/include/asm/barebox-arm-head.h b/arch/arm/include/asm/barebox-arm-head.h index 8409a77d2e..135d0585b1 100644 --- a/arch/arm/include/asm/barebox-arm-head.h +++ b/arch/arm/include/asm/barebox-arm-head.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_ARM_HEAD_H #define __ASM_ARM_HEAD_H @@ -16,13 +18,10 @@ void barebox_arm_reset_vector(uint32_t r0, uint32_t r1, uint32_t r2); #define ARM_HEAD_SPARE_OFS 0x30 #define ARM_HEAD_SPARE_MARKER 0x55555555 -#ifdef CONFIG_HAVE_MACH_ARM_HEAD -#include <mach/barebox-arm-head.h> -#else +#ifdef CONFIG_CPU_32 static inline void __barebox_arm_head(void) { __asm__ __volatile__ ( -#ifdef CONFIG_CPU_32 #ifdef CONFIG_THUMB2_BAREBOX ".arm\n" "adr r9, 1f + 1\n" @@ -43,33 +42,17 @@ static inline void __barebox_arm_head(void) "1: b 1b\n" "1: b 1b\n" #endif -#else - "b 2f\n" - "nop\n" - "nop\n" - "nop\n" - "nop\n" - "nop\n" -#endif ".asciz \"barebox\"\n" -#ifdef CONFIG_CPU_32 ".word _text\n" /* text base. If copied there, * barebox can skip relocation */ -#else - ".word 0xffffffff\n" -#endif ".word _barebox_image_size\n" /* image size to copy */ ".rept 8\n" ".word 0x55555555\n" ".endr\n" "2:\n" #ifdef CONFIG_PBL_BREAK -#ifdef CONFIG_CPU_V8 - "brk #17\n" -#else "bkpt #17\n" -#endif "nop\n" #else "nop\n" diff --git a/arch/arm/include/asm/barebox-arm.h b/arch/arm/include/asm/barebox-arm.h index cfb5943f33..7a7e5a2403 100644 --- a/arch/arm/include/asm/barebox-arm.h +++ b/arch/arm/include/asm/barebox-arm.h @@ -15,78 +15,33 @@ #include <linux/sizes.h> #include <asm-generic/memory_layout.h> #include <linux/kernel.h> +#include <linux/pagemap.h> #include <linux/types.h> #include <linux/compiler.h> #include <asm/barebox-arm-head.h> +#include <asm/common.h> #include <asm/sections.h> +#include <asm/reloc.h> +#include <linux/stringify.h> +#include <boarddata.h> -/* - * We have a 4GiB address space split into 1MiB sections, with each - * section header taking 4 bytes - */ -#define ARM_TTB_SIZE (SZ_4G / SZ_1M * sizeof(u32)) - -unsigned long get_runtime_offset(void); - -/* global_variable_offset() - Access global variables when not running at link address - * - * Get the offset of global variables when not running at the address we are - * linked at. - */ -static inline unsigned long global_variable_offset(void) -{ -#ifdef CONFIG_CPU_V8 - unsigned long text; - - __asm__ __volatile__( - "adr %0, _text\n" - : "=r" (text) - : - : "memory"); - return text - (unsigned long)_text; -#else - return get_runtime_offset(); -#endif -} +#define ARM_EARLY_PAGETABLE_SIZE SZ_64K -void setup_c(void); -void pbl_barebox_break(void); -void relocate_to_current_adr(void); -void relocate_to_adr(unsigned long target); -void relocate_to_adr_full(unsigned long target); void __noreturn barebox_arm_entry(unsigned long membase, unsigned long memsize, void *boarddata); -struct barebox_arm_boarddata { -#define BAREBOX_ARM_BOARDDATA_MAGIC 0xabe742c3 - u32 magic; - u32 machine; /* machine number to pass to barebox. This may or may - * not be a ARM machine number registered on arm.linux.org.uk. - * It must only be unique across barebox. Please use a number - * that do not potientially clashes with registered machines, - * i.e. use a number > 0x10000. - */ -}; - -/* - * Create a boarddata struct at given address. Suitable to be passed - * as boarddata to barebox_arm_entry(). The machine can be retrieved - * later with barebox_arm_machine(). - */ -static inline void boarddata_create(void *adr, u32 machine) -{ - struct barebox_arm_boarddata *bd = adr; - - bd->magic = BAREBOX_ARM_BOARDDATA_MAGIC; - bd->machine = machine; -} +#define barebox_arm_boarddata barebox_boarddata +#define BAREBOX_ARM_BOARDDATA_MAGIC BAREBOX_BOARDDATA_MAGIC u32 barebox_arm_machine(void); unsigned long arm_mem_ramoops_get(void); +unsigned long arm_mem_membase_get(void); unsigned long arm_mem_endmem_get(void); struct barebox_arm_boarddata *barebox_arm_get_boarddata(void); +#define barebox_arm_get_boarddata barebox_get_boarddata + #if defined(CONFIG_RELOCATABLE) && defined(CONFIG_ARM_EXCEPTIONS) void arm_fixup_vectors(void); #else @@ -97,46 +52,52 @@ static inline void arm_fixup_vectors(void) void *barebox_arm_boot_dtb(void); -static inline unsigned long arm_mem_stack_top(unsigned long membase, - unsigned long endmem) +static inline unsigned long arm_mem_optee(unsigned long endmem) { - if (IS_ENABLED(CONFIG_BOOTM_OPTEE) || IS_ENABLED(CONFIG_PBL_OPTEE)) - endmem -= OPTEE_SIZE; + return endmem - OPTEE_SIZE; +} + +static inline unsigned long arm_mem_scratch(unsigned long endmem) +{ + return arm_mem_optee(endmem) - SZ_32K; +} - return endmem - SZ_64K; +static inline unsigned long arm_mem_stack(unsigned long endmem) +{ + return arm_mem_scratch(endmem) - STACK_SIZE; } -static inline unsigned long arm_mem_stack(unsigned long membase, - unsigned long endmem) +static inline unsigned long arm_mem_guard_page(unsigned long endmem) { - return arm_mem_stack_top(membase, endmem) - STACK_SIZE; + endmem = arm_mem_stack(endmem); + + if (!IS_ENABLED(CONFIG_STACK_GUARD_PAGE)) + return endmem; + + return ALIGN_DOWN(endmem, PAGE_SIZE) - PAGE_SIZE; } -static inline unsigned long arm_mem_ttb(unsigned long membase, - unsigned long endmem) +static inline unsigned long arm_mem_ttb(unsigned long endmem) { - endmem = arm_mem_stack(membase, endmem); - endmem = ALIGN_DOWN(endmem, ARM_TTB_SIZE) - ARM_TTB_SIZE; + endmem = arm_mem_guard_page(endmem); + endmem = ALIGN_DOWN(endmem, ARM_EARLY_PAGETABLE_SIZE) - ARM_EARLY_PAGETABLE_SIZE; return endmem; } -static inline unsigned long arm_mem_early_malloc(unsigned long membase, - unsigned long endmem) +static inline unsigned long arm_mem_early_malloc(unsigned long endmem) { - return arm_mem_ttb(membase, endmem) - SZ_128K; + return arm_mem_ttb(endmem) - SZ_128K; } -static inline unsigned long arm_mem_early_malloc_end(unsigned long membase, - unsigned long endmem) +static inline unsigned long arm_mem_early_malloc_end(unsigned long endmem) { - return arm_mem_ttb(membase, endmem); + return arm_mem_ttb(endmem); } -static inline unsigned long arm_mem_ramoops(unsigned long membase, - unsigned long endmem) +static inline unsigned long arm_mem_ramoops(unsigned long endmem) { - endmem = arm_mem_ttb(membase, endmem); + endmem = arm_mem_ttb(endmem); #ifdef CONFIG_FS_PSTORE_RAMOOPS endmem -= CONFIG_FS_PSTORE_RAMOOPS_SIZE; endmem = ALIGN_DOWN(endmem, SZ_4K); @@ -145,11 +106,26 @@ static inline unsigned long arm_mem_ramoops(unsigned long membase, return endmem; } +static inline unsigned long arm_mem_stack_top(unsigned long endmem) +{ + return arm_mem_stack(endmem) + STACK_SIZE; +} + +static inline const void *arm_mem_scratch_get(void) +{ + return (const void *)arm_mem_scratch(arm_mem_endmem_get()); +} + +static inline unsigned long arm_mem_guard_page_get(void) +{ + return arm_mem_guard_page(arm_mem_endmem_get()); +} + static inline unsigned long arm_mem_barebox_image(unsigned long membase, unsigned long endmem, unsigned long size) { - endmem = arm_mem_ramoops(membase, endmem); + endmem = arm_mem_ramoops(endmem); if (IS_ENABLED(CONFIG_RELOCATABLE)) { return ALIGN_DOWN(endmem - size, SZ_1M); @@ -161,20 +137,76 @@ static inline unsigned long arm_mem_barebox_image(unsigned long membase, } } -#define ENTRY_FUNCTION(name, arg0, arg1, arg2) \ +/* + * Unlike ENTRY_FUNCTION, this can be used to setup stack for a C entry + * point on both ARM32 and ARM64. ENTRY_FUNCTION on ARM64 can only be used + * if preceding boot stage has initialized the stack pointer. + * + * Stack top of 0 means stack is already set up. In that case, the follow-up + * code block will not be inlined and may spill to stack right away. + */ +#ifdef CONFIG_CPU_64 + +void __barebox_arm64_head(ulong x0, ulong x1, ulong x2); + +#define ENTRY_FUNCTION_WITHSTACK_HEAD(name, stack_top, head, arg0, arg1, arg2) \ void name(ulong r0, ulong r1, ulong r2); \ \ static void __##name(ulong, ulong, ulong); \ \ - void NAKED __section(.text_head_entry_##name) name \ + void __section(.text_head_entry_##name) name \ (ulong r0, ulong r1, ulong r2) \ { \ - __barebox_arm_head(); \ + static __section(.pbl_board_stack_top_##name) \ + const ulong __stack_top = (stack_top); \ + __keep_symbolref(head); \ + __keep_symbolref(__stack_top); \ __##name(r0, r1, r2); \ } \ - static void NAKED noinline __##name \ + static void noinline __##name \ (ulong arg0, ulong arg1, ulong arg2) +#define ENTRY_FUNCTION_WITHSTACK(name, stack_top, arg0, arg1, arg2) \ + ENTRY_FUNCTION_WITHSTACK_HEAD(name, stack_top, \ + __barebox_arm64_head, arg0, arg1, arg2) + +#define ENTRY_FUNCTION(name, arg0, arg1, arg2) \ + ENTRY_FUNCTION_WITHSTACK(name, 0, arg0, arg1, arg2) + +#else +#define ENTRY_FUNCTION_WITHSTACK_HEAD(name, stack_top, head, arg0, arg1, arg2) \ + static void ____##name(ulong, ulong, ulong); \ + __ENTRY_FUNCTION_HEAD(name, head, arg0, arg1, arg2) \ + { \ + if (stack_top) \ + arm_setup_stack(stack_top); \ + ____##name(arg0, arg1, arg2); \ + } \ + static void noinline ____##name \ + (ulong arg0, ulong arg1, ulong arg2) + +#define __ENTRY_FUNCTION_HEAD(name, head, arg0, arg1, arg2) \ + void name(ulong r0, ulong r1, ulong r2); \ + \ + static void __##name(ulong, ulong, ulong); \ + \ + void __naked __section(.text_head_entry_##name) name \ + (ulong r0, ulong r1, ulong r2) \ + { \ + head(); \ + __##name(r0, r1, r2); \ + } \ + static void __naked noinline __##name \ + (ulong arg0, ulong arg1, ulong arg2) + +#define ENTRY_FUNCTION(name, arg0, arg1, arg2) \ + __ENTRY_FUNCTION_HEAD(name, __barebox_arm_head, arg0, arg1, arg2) + +#define ENTRY_FUNCTION_WITHSTACK(name, stack_top, arg0, arg1, arg2) \ + ENTRY_FUNCTION_WITHSTACK_HEAD(name, stack_top, \ + __barebox_arm_head, arg0, arg1, arg2) +#endif + /* * When using compressed images in conjunction with relocatable images * the PBL code must pick a suitable place where to uncompress the barebox diff --git a/arch/arm/include/asm/barebox.lds.h b/arch/arm/include/asm/barebox.lds.h new file mode 100644 index 0000000000..a5c74381d8 --- /dev/null +++ b/arch/arm/include/asm/barebox.lds.h @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#if defined CONFIG_ARCH_EP93XX +#include <mach/ep93xx/barebox.lds.h> +#endif + +#ifdef CONFIG_CPU_32 +#define BAREBOX_OUTPUT_FORMAT "elf32-littlearm", "elf32-littlearm", "elf32-littlearm" +#define BAREBOX_OUTPUT_ARCH "arm" +#else +#define BAREBOX_OUTPUT_FORMAT "elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64" +#define BAREBOX_OUTPUT_ARCH "aarch64" +#endif + +#ifdef CONFIG_CPU_32 +#define BAREBOX_RELOCATION_TYPE rel +#else +#define BAREBOX_RELOCATION_TYPE rela +#endif + +#define BAREBOX_RELOCATION_TABLE \ + .rel_dyn_start : { *(.__rel_dyn_start) } \ + .BAREBOX_RELOCATION_TYPE.dyn : { *(.BAREBOX_RELOCATION_TYPE*) } \ + .rel_dyn_end : { *(.__rel_dyn_end) } \ + .__dynsym_start : { *(.__dynsym_start) } \ + .dynsym : { *(.dynsym) } \ + .__dynsym_end : { *(.__dynsym_end) } + + +#include <asm-generic/barebox.lds.h> diff --git a/arch/arm/include/asm/bitops.h b/arch/arm/include/asm/bitops.h index d8a4d9b667..2d0d300da2 100644 --- a/arch/arm/include/asm/bitops.h +++ b/arch/arm/include/asm/bitops.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + /* * Copyright 1995, Russell King. * Various bits and pieces copyrights include: diff --git a/arch/arm/include/asm/bitsperlong.h b/arch/arm/include/asm/bitsperlong.h index 6dc0bb0c13..bf000a04cc 100644 --- a/arch/arm/include/asm/bitsperlong.h +++ b/arch/arm/include/asm/bitsperlong.h @@ -1 +1,3 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #include <asm-generic/bitsperlong.h> diff --git a/arch/arm/include/asm/byteorder.h b/arch/arm/include/asm/byteorder.h index c3489f1e1f..751dc0e530 100644 --- a/arch/arm/include/asm/byteorder.h +++ b/arch/arm/include/asm/byteorder.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + /* * linux/include/asm-arm/byteorder.h * diff --git a/arch/arm/include/asm/cache.h b/arch/arm/include/asm/cache.h index bf3a1a0ed2..261c30129a 100644 --- a/arch/arm/include/asm/cache.h +++ b/arch/arm/include/asm/cache.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_CACHE_H #define __ASM_CACHE_H @@ -16,11 +18,12 @@ static inline void icache_invalidate(void) #endif } -int arm_set_cache_functions(void); - void arm_early_mmu_cache_flush(void); void arm_early_mmu_cache_invalidate(void); +#define sync_caches_for_execution sync_caches_for_execution void sync_caches_for_execution(void); +#include <asm-generic/cache.h> + #endif diff --git a/arch/arm/include/asm/common.h b/arch/arm/include/asm/common.h index 1e2729d521..9832a6a4d2 100644 --- a/arch/arm/include/asm/common.h +++ b/arch/arm/include/asm/common.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_ARM_COMMON_H #define __ASM_ARM_COMMON_H diff --git a/arch/arm/include/asm/cputype.h b/arch/arm/include/asm/cputype.h index f39939bd44..c3fc057650 100644 --- a/arch/arm/include/asm/cputype.h +++ b/arch/arm/include/asm/cputype.h @@ -1,9 +1,28 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_ARM_CPUTYPE_H #define __ASM_ARM_CPUTYPE_H #include <linux/stringify.h> #include <linux/kernel.h> +#ifdef CONFIG_CPU_64v8 + +#define CPUID_ID midr_el1 +#define CPUID_CACHETYPE ctr_el0 +#define CPUID_MPIDR mpidr_el1 + +#define read_cpuid(reg) \ + ({ \ + unsigned int __val; \ + asm("mrs %0, " __stringify(reg) \ + : "=r" (__val) \ + : \ + : "cc"); \ + __val; \ + }) +#else + #define CPUID_ID 0 #define CPUID_CACHETYPE 1 #define CPUID_TCM 2 @@ -25,8 +44,6 @@ #define CPUID_EXT_ISAR4 "c2, 4" #define CPUID_EXT_ISAR5 "c2, 5" -extern unsigned int processor_id; - #define read_cpuid(reg) \ ({ \ unsigned int __val; \ @@ -45,6 +62,9 @@ extern unsigned int processor_id; : "cc"); \ __val; \ }) +#endif + +extern unsigned int processor_id; /* * The CPU ID never changes at run time, so we might as well tell the diff --git a/arch/arm/include/asm/debug_ll.h b/arch/arm/include/asm/debug_ll.h new file mode 100644 index 0000000000..98a7d0d839 --- /dev/null +++ b/arch/arm/include/asm/debug_ll.h @@ -0,0 +1,71 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef __ASM_DEBUG_LL_H__ +#define __ASM_DEBUG_LL_H__ + +#ifdef CONFIG_DEBUG_IMX_UART +#include <mach/imx/debug_ll.h> +#endif + +#ifdef CONFIG_DEBUG_ROCKCHIP_UART +#include <mach/rockchip/debug_ll.h> +#endif + +#ifdef CONFIG_DEBUG_OMAP_UART +#include <mach/omap/debug_ll.h> +#endif + +#ifdef CONFIG_DEBUG_ZYNQMP_UART +#include <mach/zynqmp/debug_ll.h> +#endif + +#ifdef CONFIG_DEBUG_STM32MP_UART +#include <mach/stm32mp/debug_ll.h> +#endif + +#ifdef CONFIG_DEBUG_VEXPRESS_UART +#include <mach/vexpress/debug_ll.h> +#endif + +#ifdef CONFIG_DEBUG_BCM283X_UART +#include <mach/bcm283x/debug_ll.h> +#endif + +#ifdef CONFIG_DEBUG_QEMU_ARM64_VIRT +#define DEBUG_LL_UART_ADDR 0x9000000 +#include <debug_ll/pl011.h> +#elif defined CONFIG_ARCH_MVEBU +#include <mach/mvebu/debug_ll.h> +#elif defined CONFIG_ARCH_DAVINCI +#include <mach/davinci/debug_ll.h> +#elif defined CONFIG_ARCH_ZYNQ +#include <mach/zynq/debug_ll.h> +#elif defined CONFIG_ARCH_VERSATILE +#include <mach/versatile/debug_ll.h> +#elif defined CONFIG_ARCH_LAYERSCAPE +#include <mach/layerscape/debug_ll.h> +#elif defined CONFIG_ARCH_TEGRA +#include <mach/tegra/debug_ll.h> +#elif defined CONFIG_ARCH_UEMD +#include <mach/uemd/debug_ll.h> +#elif defined CONFIG_ARCH_SOCFPGA +#include <mach/socfpga/debug_ll.h> +#elif defined CONFIG_ARCH_PXA +#include <mach/pxa/debug_ll.h> +#elif defined CONFIG_ARCH_NOMADIK +#include <mach/nomadik/debug_ll.h> +#elif defined CONFIG_ARCH_MXS +#include <mach/mxs/debug_ll.h> +#elif defined CONFIG_ARCH_EP93XX +#include <mach/ep93xx/debug_ll.h> +#elif defined CONFIG_ARCH_DIGIC +#include <mach/digic/debug_ll.h> +#elif defined CONFIG_ARCH_CLPS711X +#include <mach/clps711x/debug_ll.h> +#elif defined CONFIG_ARCH_AT91 +#include <mach/at91/debug_ll.h> +#elif defined CONFIG_ARCH_K3 +#include <mach/k3/debug_ll.h> +#endif + +#endif diff --git a/arch/arm/include/asm/dma.h b/arch/arm/include/asm/dma.h index 226b1c1464..0774a11c5a 100644 --- a/arch/arm/include/asm/dma.h +++ b/arch/arm/include/asm/dma.h @@ -3,13 +3,10 @@ #include <common.h> -#define dma_alloc dma_alloc -static inline void *dma_alloc(size_t size) -{ - return xmemalign(64, ALIGN(size, 64)); -} +#define DMA_ALIGNMENT 64 #ifndef CONFIG_MMU +#define dma_alloc_coherent dma_alloc_coherent static inline void *dma_alloc_coherent(size_t size, dma_addr_t *dma_handle) { void *ret = xmemalign(4096, size); @@ -21,24 +18,28 @@ static inline void *dma_alloc_coherent(size_t size, dma_addr_t *dma_handle) return ret; } +#define dma_alloc_writecombine dma_alloc_writecombine static inline void *dma_alloc_writecombine(size_t size, dma_addr_t *dma_handle) { return dma_alloc_coherent(size, dma_handle); } +#define dma_free_coherent dma_free_coherent static inline void dma_free_coherent(void *mem, dma_addr_t dma_handle, size_t size) { free(mem); } -static inline void dma_sync_single_for_cpu(dma_addr_t address, size_t size, - enum dma_data_direction dir) +#define arch_sync_dma_for_cpu arch_sync_dma_for_cpu +static inline void arch_sync_dma_for_cpu(void *vaddr, size_t size, + enum dma_data_direction dir) { } -static inline void dma_sync_single_for_device(dma_addr_t address, size_t size, - enum dma_data_direction dir) +#define arch_sync_dma_for_device arch_sync_dma_for_device +static inline void arch_sync_dma_for_device(void *vaddr, size_t size, + enum dma_data_direction dir) { } #endif diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h index 3def567699..4043e6fd5b 100644 --- a/arch/arm/include/asm/elf.h +++ b/arch/arm/include/asm/elf.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASMARM_ELF_H #define __ASMARM_ELF_H @@ -20,6 +22,7 @@ typedef struct user_fp elf_fpregset_t; #endif #define EM_ARM 40 +#define EM_AARCH64 183 #define EF_ARM_APCS26 0x08 #define EF_ARM_SOFT_FLOAT 0x200 #define EF_ARM_EABI_MASK 0xFF000000 @@ -42,7 +45,11 @@ typedef struct user_fp elf_fpregset_t; #else #define ELF_DATA ELFDATA2LSB #endif +#ifdef CONFIG_CPU_64 +#define ELF_ARCH EM_AARCH64 +#else #define ELF_ARCH EM_ARM +#endif #ifdef __KERNEL__ #ifndef __ASSEMBLY__ diff --git a/arch/arm/include/asm/gic.h b/arch/arm/include/asm/gic.h index f83f528141..d7e4c3cbf0 100644 --- a/arch/arm/include/asm/gic.h +++ b/arch/arm/include/asm/gic.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __GIC_H__ #define __GIC_H__ diff --git a/arch/arm/include/asm/hardware/arm_timer.h b/arch/arm/include/asm/hardware/arm_timer.h index 8a58390a19..7911628ba7 100644 --- a/arch/arm/include/asm/hardware/arm_timer.h +++ b/arch/arm/include/asm/hardware/arm_timer.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_ARM_HARDWARE_ARM_TIMER_H #define __ASM_ARM_HARDWARE_ARM_TIMER_H diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h index 0507db1a9c..486b142950 100644 --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_ARM_IO_H #define __ASM_ARM_IO_H @@ -16,14 +18,4 @@ extern void memcpy_fromio(void *, const volatile void __iomem *, size_t); extern void memcpy_toio(volatile void __iomem *, const void *, size_t); extern void memset_io(volatile void __iomem *, int, size_t); -static inline void *phys_to_virt(unsigned long phys) -{ - return (void *)phys; -} - -static inline unsigned long virt_to_phys(volatile void *mem) -{ - return (unsigned long)mem; -} - #endif /* __ASM_ARM_IO_H */ diff --git a/arch/arm/include/asm/linkage.h b/arch/arm/include/asm/linkage.h index 5a25632b1b..728ebe6f6f 100644 --- a/arch/arm/include/asm/linkage.h +++ b/arch/arm/include/asm/linkage.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_LINKAGE_H #define __ASM_LINKAGE_H diff --git a/arch/arm/include/asm/mach-types.h b/arch/arm/include/asm/mach-types.h new file mode 100644 index 0000000000..f16aeb88db --- /dev/null +++ b/arch/arm/include/asm/mach-types.h @@ -0,0 +1,868 @@ +/* + * Machine type definitions for legacy platforms. + */ + +#ifndef __ASM_ARM_MACH_TYPE_H +#define __ASM_ARM_MACH_TYPE_H + +#ifndef __ASSEMBLY__ +/* The type of machine we're running on */ +extern unsigned int __machine_arch_type; +#endif + +/* see arch/arm/kernel/arch.c for a description of these */ +#define MACH_TYPE_LUBBOCK 89 +#define MACH_TYPE_VERSATILE_PB 387 +#define MACH_TYPE_CSB337 399 +#define MACH_TYPE_MAINSTONE 406 +#define MACH_TYPE_NOMADIK 420 +#define MACH_TYPE_EDB9312 451 +#define MACH_TYPE_EDB9301 462 +#define MACH_TYPE_EDB9315 463 +#define MACH_TYPE_SCB9328 508 +#define MACH_TYPE_EDB9302 538 +#define MACH_TYPE_EDB9307 607 +#define MACH_TYPE_AT91RM9200EK 705 +#define MACH_TYPE_PCM027 732 +#define MACH_TYPE_EDB9315A 772 +#define MACH_TYPE_AT91SAM9261EK 848 +#define MACH_TYPE_AT91SAM9260EK 1099 +#define MACH_TYPE_EDB9302A 1127 +#define MACH_TYPE_EDB9307A 1128 +#define MACH_TYPE_PM9261 1187 +#define MACH_TYPE_AT91SAM9263EK 1202 +#define MACH_TYPE_ZYLONITE 1233 +#define MACH_TYPE_MIOA701 1257 +#define MACH_TYPE_PM9263 1475 +#define MACH_TYPE_OMAP3EVM 1535 +#define MACH_TYPE_OMAP3_BEAGLE 1546 +#define MACH_TYPE_AT91SAM9G20EK 1624 +#define MACH_TYPE_USB_A9260 1709 +#define MACH_TYPE_USB_A9263 1710 +#define MACH_TYPE_QIL_A9260 1711 +#define MACH_TYPE_PICOCOM1 1751 +#define MACH_TYPE_AT91SAM9M10G45EK 1830 +#define MACH_TYPE_USB_A9G20 1841 +#define MACH_TYPE_QIL_A9G20 1844 +#define MACH_TYPE_CHUMBY 1937 +#define MACH_TYPE_TNY_A9260 2058 +#define MACH_TYPE_TNY_A9G20 2059 +#define MACH_TYPE_MX51_BABBAGE 2125 +#define MACH_TYPE_TNY_A9263 2140 +#define MACH_TYPE_AT91SAM9G10EK 2159 +#define MACH_TYPE_TX25 2177 +#define MACH_TYPE_MX23EVK 2629 +#define MACH_TYPE_PM9G45 2672 +#define MACH_TYPE_OMAP4_PANDA 2791 +#define MACH_TYPE_PCAAL1 2843 +#define MACH_TYPE_ARMADA_XP_DB 3036 +#define MACH_TYPE_TX28 3043 +#define MACH_TYPE_BCM2708 3138 +#define MACH_TYPE_MX53_LOCO 3273 +#define MACH_TYPE_TX53 3279 +#define MACH_TYPE_CCMX53 3346 +#define MACH_TYPE_CCWMX53 3348 +#define MACH_TYPE_VMX53 3359 +#define MACH_TYPE_PCM049 3364 +#define MACH_TYPE_DSS11 3787 +#define MACH_TYPE_BEAGLEBONE 3808 +#define MACH_TYPE_PCAAXL2 3912 +#define MACH_TYPE_MX6Q_SABRESD 3980 +#define MACH_TYPE_TQMA53 4004 +#define MACH_TYPE_IMX233_OLINUXINO 4105 +#define MACH_TYPE_CFA10036 4142 +#define MACH_TYPE_PCM051 4144 +#define MACH_TYPE_HABA_KNX_LITE 4310 +#define MACH_TYPE_VAR_SOM_MX6 4419 +#define MACH_TYPE_PCAAXS1 4526 +#define MACH_TYPE_PFLA03 4575 + +#ifdef CONFIG_ARCH_LUBBOCK +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_LUBBOCK +# endif +# define machine_is_lubbock() (machine_arch_type == MACH_TYPE_LUBBOCK) +#else +# define machine_is_lubbock() (0) +#endif + +#ifdef CONFIG_ARCH_VERSATILE_PB +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_VERSATILE_PB +# endif +# define machine_is_versatile_pb() (machine_arch_type == MACH_TYPE_VERSATILE_PB) +#else +# define machine_is_versatile_pb() (0) +#endif + +#ifdef CONFIG_MACH_CSB337 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_CSB337 +# endif +# define machine_is_csb337() (machine_arch_type == MACH_TYPE_CSB337) +#else +# define machine_is_csb337() (0) +#endif + +#ifdef CONFIG_MACH_MAINSTONE +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_MAINSTONE +# endif +# define machine_is_mainstone() (machine_arch_type == MACH_TYPE_MAINSTONE) +#else +# define machine_is_mainstone() (0) +#endif + +#ifdef CONFIG_MACH_NOMADIK +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_NOMADIK +# endif +# define machine_is_nomadik() (machine_arch_type == MACH_TYPE_NOMADIK) +#else +# define machine_is_nomadik() (0) +#endif + +#ifdef CONFIG_MACH_EDB9312 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_EDB9312 +# endif +# define machine_is_edb9312() (machine_arch_type == MACH_TYPE_EDB9312) +#else +# define machine_is_edb9312() (0) +#endif + +#ifdef CONFIG_MACH_EDB9301 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_EDB9301 +# endif +# define machine_is_edb9301() (machine_arch_type == MACH_TYPE_EDB9301) +#else +# define machine_is_edb9301() (0) +#endif + +#ifdef CONFIG_MACH_EDB9315 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_EDB9315 +# endif +# define machine_is_edb9315() (machine_arch_type == MACH_TYPE_EDB9315) +#else +# define machine_is_edb9315() (0) +#endif + +#ifdef CONFIG_MACH_SCB9328 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_SCB9328 +# endif +# define machine_is_scb9328() (machine_arch_type == MACH_TYPE_SCB9328) +#else +# define machine_is_scb9328() (0) +#endif + +#ifdef CONFIG_MACH_EDB9302 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_EDB9302 +# endif +# define machine_is_edb9302() (machine_arch_type == MACH_TYPE_EDB9302) +#else +# define machine_is_edb9302() (0) +#endif + +#ifdef CONFIG_MACH_EDB9307 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_EDB9307 +# endif +# define machine_is_edb9307() (machine_arch_type == MACH_TYPE_EDB9307) +#else +# define machine_is_edb9307() (0) +#endif + +#ifdef CONFIG_MACH_AT91RM9200EK +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_AT91RM9200EK +# endif +# define machine_is_at91rm9200ek() (machine_arch_type == MACH_TYPE_AT91RM9200EK) +#else +# define machine_is_at91rm9200ek() (0) +#endif + +#ifdef CONFIG_MACH_PCM027 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_PCM027 +# endif +# define machine_is_pcm027() (machine_arch_type == MACH_TYPE_PCM027) +#else +# define machine_is_pcm027() (0) +#endif + +#ifdef CONFIG_MACH_EDB9315A +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_EDB9315A +# endif +# define machine_is_edb9315a() (machine_arch_type == MACH_TYPE_EDB9315A) +#else +# define machine_is_edb9315a() (0) +#endif + +#ifdef CONFIG_MACH_AT91SAM9261EK +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_AT91SAM9261EK +# endif +# define machine_is_at91sam9261ek() (machine_arch_type == MACH_TYPE_AT91SAM9261EK) +#else +# define machine_is_at91sam9261ek() (0) +#endif + +#ifdef CONFIG_MACH_AT91SAM9260EK +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_AT91SAM9260EK +# endif +# define machine_is_at91sam9260ek() (machine_arch_type == MACH_TYPE_AT91SAM9260EK) +#else +# define machine_is_at91sam9260ek() (0) +#endif + +#ifdef CONFIG_MACH_EDB9302A +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_EDB9302A +# endif +# define machine_is_edb9302a() (machine_arch_type == MACH_TYPE_EDB9302A) +#else +# define machine_is_edb9302a() (0) +#endif + +#ifdef CONFIG_MACH_EDB9307A +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_EDB9307A +# endif +# define machine_is_edb9307a() (machine_arch_type == MACH_TYPE_EDB9307A) +#else +# define machine_is_edb9307a() (0) +#endif + +#ifdef CONFIG_MACH_PM9261 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_PM9261 +# endif +# define machine_is_pm9261() (machine_arch_type == MACH_TYPE_PM9261) +#else +# define machine_is_pm9261() (0) +#endif + +#ifdef CONFIG_MACH_AT91SAM9263EK +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_AT91SAM9263EK +# endif +# define machine_is_at91sam9263ek() (machine_arch_type == MACH_TYPE_AT91SAM9263EK) +#else +# define machine_is_at91sam9263ek() (0) +#endif + +#ifdef CONFIG_MACH_ZYLONITE +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_ZYLONITE +# endif +# define machine_is_zylonite() (machine_arch_type == MACH_TYPE_ZYLONITE) +#else +# define machine_is_zylonite() (0) +#endif + +#ifdef CONFIG_MACH_MIOA701 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_MIOA701 +# endif +# define machine_is_mioa701() (machine_arch_type == MACH_TYPE_MIOA701) +#else +# define machine_is_mioa701() (0) +#endif + +#ifdef CONFIG_MACH_PM9263 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_PM9263 +# endif +# define machine_is_pm9263() (machine_arch_type == MACH_TYPE_PM9263) +#else +# define machine_is_pm9263() (0) +#endif + +#ifdef CONFIG_MACH_OMAP3EVM +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_OMAP3EVM +# endif +# define machine_is_omap3evm() (machine_arch_type == MACH_TYPE_OMAP3EVM) +#else +# define machine_is_omap3evm() (0) +#endif + +#ifdef CONFIG_MACH_OMAP3_BEAGLE +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_OMAP3_BEAGLE +# endif +# define machine_is_omap3_beagle() (machine_arch_type == MACH_TYPE_OMAP3_BEAGLE) +#else +# define machine_is_omap3_beagle() (0) +#endif + +#ifdef CONFIG_MACH_AT91SAM9G20EK +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_AT91SAM9G20EK +# endif +# define machine_is_at91sam9g20ek() (machine_arch_type == MACH_TYPE_AT91SAM9G20EK) +#else +# define machine_is_at91sam9g20ek() (0) +#endif + +#ifdef CONFIG_MACH_USB_A9260 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_USB_A9260 +# endif +# define machine_is_usb_a9260() (machine_arch_type == MACH_TYPE_USB_A9260) +#else +# define machine_is_usb_a9260() (0) +#endif + +#ifdef CONFIG_MACH_USB_A9263 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_USB_A9263 +# endif +# define machine_is_usb_a9263() (machine_arch_type == MACH_TYPE_USB_A9263) +#else +# define machine_is_usb_a9263() (0) +#endif + +#ifdef CONFIG_MACH_QIL_A9260 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_QIL_A9260 +# endif +# define machine_is_qil_a9260() (machine_arch_type == MACH_TYPE_QIL_A9260) +#else +# define machine_is_qil_a9260() (0) +#endif + +#ifdef CONFIG_MACH_PICOCOM1 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_PICOCOM1 +# endif +# define machine_is_picocom1() (machine_arch_type == MACH_TYPE_PICOCOM1) +#else +# define machine_is_picocom1() (0) +#endif + +#ifdef CONFIG_MACH_AT91SAM9M10G45EK +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_AT91SAM9M10G45EK +# endif +# define machine_is_at91sam9m10g45ek() (machine_arch_type == MACH_TYPE_AT91SAM9M10G45EK) +#else +# define machine_is_at91sam9m10g45ek() (0) +#endif + +#ifdef CONFIG_MACH_USB_A9G20 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_USB_A9G20 +# endif +# define machine_is_usb_a9g20() (machine_arch_type == MACH_TYPE_USB_A9G20) +#else +# define machine_is_usb_a9g20() (0) +#endif + +#ifdef CONFIG_MACH_QIL_A9G20 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_QIL_A9G20 +# endif +# define machine_is_qil_a9g20() (machine_arch_type == MACH_TYPE_QIL_A9G20) +#else +# define machine_is_qil_a9g20() (0) +#endif + +#ifdef CONFIG_MACH_CHUMBY +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_CHUMBY +# endif +# define machine_is_chumby() (machine_arch_type == MACH_TYPE_CHUMBY) +#else +# define machine_is_chumby() (0) +#endif + +#ifdef CONFIG_MACH_TNY_A9260 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_TNY_A9260 +# endif +# define machine_is_tny_a9260() (machine_arch_type == MACH_TYPE_TNY_A9260) +#else +# define machine_is_tny_a9260() (0) +#endif + +#ifdef CONFIG_MACH_TNY_A9G20 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_TNY_A9G20 +# endif +# define machine_is_tny_a9g20() (machine_arch_type == MACH_TYPE_TNY_A9G20) +#else +# define machine_is_tny_a9g20() (0) +#endif + +#ifdef CONFIG_MACH_MX51_BABBAGE +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_MX51_BABBAGE +# endif +# define machine_is_mx51_babbage() (machine_arch_type == MACH_TYPE_MX51_BABBAGE) +#else +# define machine_is_mx51_babbage() (0) +#endif + +#ifdef CONFIG_MACH_TNY_A9263 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_TNY_A9263 +# endif +# define machine_is_tny_a9263() (machine_arch_type == MACH_TYPE_TNY_A9263) +#else +# define machine_is_tny_a9263() (0) +#endif + +#ifdef CONFIG_MACH_AT91SAM9G10EK +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_AT91SAM9G10EK +# endif +# define machine_is_at91sam9g10ek() (machine_arch_type == MACH_TYPE_AT91SAM9G10EK) +#else +# define machine_is_at91sam9g10ek() (0) +#endif + +#ifdef CONFIG_MACH_TX25 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_TX25 +# endif +# define machine_is_tx25() (machine_arch_type == MACH_TYPE_TX25) +#else +# define machine_is_tx25() (0) +#endif + +#ifdef CONFIG_MACH_MX23EVK +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_MX23EVK +# endif +# define machine_is_mx23evk() (machine_arch_type == MACH_TYPE_MX23EVK) +#else +# define machine_is_mx23evk() (0) +#endif + +#ifdef CONFIG_MACH_PM9G45 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_PM9G45 +# endif +# define machine_is_pm9g45() (machine_arch_type == MACH_TYPE_PM9G45) +#else +# define machine_is_pm9g45() (0) +#endif + +#ifdef CONFIG_MACH_OMAP4_PANDA +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_OMAP4_PANDA +# endif +# define machine_is_omap4_panda() (machine_arch_type == MACH_TYPE_OMAP4_PANDA) +#else +# define machine_is_omap4_panda() (0) +#endif + +#ifdef CONFIG_MACH_PCAAL1 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_PCAAL1 +# endif +# define machine_is_pcaal1() (machine_arch_type == MACH_TYPE_PCAAL1) +#else +# define machine_is_pcaal1() (0) +#endif + +#ifdef CONFIG_MACH_ARMADA_XP_DB +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_ARMADA_XP_DB +# endif +# define machine_is_armada_xp_db() (machine_arch_type == MACH_TYPE_ARMADA_XP_DB) +#else +# define machine_is_armada_xp_db() (0) +#endif + +#ifdef CONFIG_MACH_TX28 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_TX28 +# endif +# define machine_is_tx28() (machine_arch_type == MACH_TYPE_TX28) +#else +# define machine_is_tx28() (0) +#endif + +#ifdef CONFIG_MACH_BCM2708 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_BCM2708 +# endif +# define machine_is_bcm2708() (machine_arch_type == MACH_TYPE_BCM2708) +#else +# define machine_is_bcm2708() (0) +#endif + +#ifdef CONFIG_MACH_MX53_LOCO +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_MX53_LOCO +# endif +# define machine_is_mx53_loco() (machine_arch_type == MACH_TYPE_MX53_LOCO) +#else +# define machine_is_mx53_loco() (0) +#endif + +#ifdef CONFIG_MACH_TX53 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_TX53 +# endif +# define machine_is_tx53() (machine_arch_type == MACH_TYPE_TX53) +#else +# define machine_is_tx53() (0) +#endif + +#ifdef CONFIG_MACH_CCMX53 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_CCMX53 +# endif +# define machine_is_ccmx53() (machine_arch_type == MACH_TYPE_CCMX53) +#else +# define machine_is_ccmx53() (0) +#endif + +#ifdef CONFIG_MACH_CCWMX53 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_CCWMX53 +# endif +# define machine_is_ccwmx53() (machine_arch_type == MACH_TYPE_CCWMX53) +#else +# define machine_is_ccwmx53() (0) +#endif + +#ifdef CONFIG_MACH_VMX53 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_VMX53 +# endif +# define machine_is_vmx53() (machine_arch_type == MACH_TYPE_VMX53) +#else +# define machine_is_vmx53() (0) +#endif + +#ifdef CONFIG_MACH_PCM049 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_PCM049 +# endif +# define machine_is_pcm049() (machine_arch_type == MACH_TYPE_PCM049) +#else +# define machine_is_pcm049() (0) +#endif + +#ifdef CONFIG_MACH_DSS11 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_DSS11 +# endif +# define machine_is_dss11() (machine_arch_type == MACH_TYPE_DSS11) +#else +# define machine_is_dss11() (0) +#endif + +#ifdef CONFIG_MACH_BEAGLEBONE +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_BEAGLEBONE +# endif +# define machine_is_beaglebone() (machine_arch_type == MACH_TYPE_BEAGLEBONE) +#else +# define machine_is_beaglebone() (0) +#endif + +#ifdef CONFIG_MACH_PCAAXL2 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_PCAAXL2 +# endif +# define machine_is_pcaaxl2() (machine_arch_type == MACH_TYPE_PCAAXL2) +#else +# define machine_is_pcaaxl2() (0) +#endif + +#ifdef CONFIG_MACH_MX6Q_SABRESD +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_MX6Q_SABRESD +# endif +# define machine_is_mx6q_sabresd() (machine_arch_type == MACH_TYPE_MX6Q_SABRESD) +#else +# define machine_is_mx6q_sabresd() (0) +#endif + +#ifdef CONFIG_MACH_TQMA53 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_TQMA53 +# endif +# define machine_is_tqma53() (machine_arch_type == MACH_TYPE_TQMA53) +#else +# define machine_is_tqma53() (0) +#endif + +#ifdef CONFIG_MACH_IMX233_OLINUXINO +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_IMX233_OLINUXINO +# endif +# define machine_is_imx233_olinuxino() (machine_arch_type == MACH_TYPE_IMX233_OLINUXINO) +#else +# define machine_is_imx233_olinuxino() (0) +#endif + +#ifdef CONFIG_MACH_CFA10036 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_CFA10036 +# endif +# define machine_is_cfa10036() (machine_arch_type == MACH_TYPE_CFA10036) +#else +# define machine_is_cfa10036() (0) +#endif + +#ifdef CONFIG_MACH_PCM051 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_PCM051 +# endif +# define machine_is_pcm051() (machine_arch_type == MACH_TYPE_PCM051) +#else +# define machine_is_pcm051() (0) +#endif + +#ifdef CONFIG_MACH_HABA_KNX_LITE +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_HABA_KNX_LITE +# endif +# define machine_is_haba_knx_lite() (machine_arch_type == MACH_TYPE_HABA_KNX_LITE) +#else +# define machine_is_haba_knx_lite() (0) +#endif + +#ifdef CONFIG_MACH_VAR_SOM_MX6 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_VAR_SOM_MX6 +# endif +# define machine_is_var_som_mx6() (machine_arch_type == MACH_TYPE_VAR_SOM_MX6) +#else +# define machine_is_var_som_mx6() (0) +#endif + +#ifdef CONFIG_MACH_PCAAXS1 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_PCAAXS1 +# endif +# define machine_is_pcaaxs1() (machine_arch_type == MACH_TYPE_PCAAXS1) +#else +# define machine_is_pcaaxs1() (0) +#endif + +#ifdef CONFIG_MACH_PFLA03 +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_PFLA03 +# endif +# define machine_is_pfla03() (machine_arch_type == MACH_TYPE_PFLA03) +#else +# define machine_is_pfla03() (0) +#endif + +/* + * These have not yet been registered + */ + +#ifndef machine_arch_type +#define machine_arch_type __machine_arch_type +#endif + +#endif diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index 2279306179..765b089beb 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h @@ -1,14 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_ARM_MEMORY_H #define __ASM_ARM_MEMORY_H +#include <linux/sizes.h> + +#ifndef __ASSEMBLY__ #include <memory.h> #include <linux/const.h> -/* - * Allow for constants defined here to be used from assembly code - * by prepending the UL suffix only with actual C code compilation. - */ -#define UL(x) _AC(x, UL) static inline int arm_add_mem_device(const char* name, resource_size_t start, resource_size_t size) @@ -16,4 +16,21 @@ static inline int arm_add_mem_device(const char* name, resource_size_t start, return barebox_add_memory_bank(name, start, size); } +#endif + + +/* + * Alignment of barebox PBL segments (e.g. .text, .data). + * + * 4 B granule: Same flat rwx mapping for everything + * 4 KB granule: 16 level 3 entries, with contiguous bit + * 16 KB granule: 4 level 3 entries, without contiguous bit + * 64 KB granule: 1 level 3 entry + */ +#ifdef CONFIG_EFI_PAYLOAD +#define PBL_SEGMENT_ALIGN SZ_64K +#else +#define PBL_SEGMENT_ALIGN 4 +#endif + #endif /* __ASM_ARM_MEMORY_H */ diff --git a/arch/arm/include/asm/mmu.h b/arch/arm/include/asm/mmu.h index 417808bfcc..ebf1e096c6 100644 --- a/arch/arm/include/asm/mmu.h +++ b/arch/arm/include/asm/mmu.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_MMU_H #define __ASM_MMU_H @@ -21,7 +23,7 @@ static inline void setup_dma_coherent(unsigned long offset) #ifdef CONFIG_MMU #define ARCH_HAS_REMAP #define MAP_ARCH_DEFAULT MAP_CACHED -int arch_remap_range(void *_start, size_t size, unsigned flags); +int arch_remap_range(void *virt_addr, phys_addr_t phys_addr, size_t size, unsigned flags); void *map_io_sections(unsigned long physaddr, void *start, size_t size); #else #define MAP_ARCH_DEFAULT MAP_UNCACHED @@ -48,14 +50,21 @@ struct outer_cache_fns { void (*disable)(void); }; +#ifdef __PBL__ +/* Existing platforms with non-architected outer cache initialize it + * outside PBL and new ones will likely only have architected caches, + * so we provide a dummy here + */ +static __maybe_unused struct outer_cache_fns outer_cache; +#else extern struct outer_cache_fns outer_cache; +#endif void __dma_clean_range(unsigned long, unsigned long); void __dma_flush_range(unsigned long, unsigned long); void __dma_inv_range(unsigned long, unsigned long); -void mmu_early_enable(unsigned long membase, unsigned long memsize, - unsigned long ttb); +void mmu_early_enable(unsigned long membase, unsigned long memsize); void mmu_early_disable(void); #endif /* __ASM_MMU_H */ diff --git a/arch/arm/include/asm/mmuinfo.h b/arch/arm/include/asm/mmuinfo.h new file mode 100644 index 0000000000..3005c388b9 --- /dev/null +++ b/arch/arm/include/asm/mmuinfo.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef __ARM_ASM_MMUINFO_H__ +#define __ARM_ASM_MMUINFO_H__ + +int mmuinfo_v7(void *addr); +int mmuinfo_v8(void *addr); + +#endif diff --git a/arch/arm/include/asm/module.h b/arch/arm/include/asm/module.h index 3ce39bf82b..a4473ff8b6 100644 --- a/arch/arm/include/asm/module.h +++ b/arch/arm/include/asm/module.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef _ASM_ARM_MODULE_H #define _ASM_ARM_MODULE_H diff --git a/arch/arm/include/asm/neon.h b/arch/arm/include/asm/neon.h new file mode 100644 index 0000000000..476462e83e --- /dev/null +++ b/arch/arm/include/asm/neon.h @@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef __ARM_ASM_NEON_H__ +#define __ARM_ASM_NEON_H__ + +#define kernel_neon_begin() ((void)0) +#define kernel_neon_end() ((void)0) + +#endif diff --git a/arch/arm/include/asm/opcodes-sec.h b/arch/arm/include/asm/opcodes-sec.h new file mode 100644 index 0000000000..b6f4b35024 --- /dev/null +++ b/arch/arm/include/asm/opcodes-sec.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * + * Copyright (C) 2012 ARM Limited + */ + +#ifndef __ASM_ARM_OPCODES_SEC_H +#define __ASM_ARM_OPCODES_SEC_H + +#include <asm/opcodes.h> + +#define __SMC(imm4) __inst_arm_thumb32( \ + 0xE1600070 | (((imm4) & 0xF) << 0), \ + 0xF7F08000 | (((imm4) & 0xF) << 16) \ +) + +#endif /* __ASM_ARM_OPCODES_SEC_H */ diff --git a/arch/arm/include/asm/optee.h b/arch/arm/include/asm/optee.h new file mode 100644 index 0000000000..f8eb7b4a8b --- /dev/null +++ b/arch/arm/include/asm/optee.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef __ARM_OPTEE_H__ +#define __ARM_OPTEE_H__ + +#include <linux/types.h> + +struct device_node; + +struct of_optee_fixup_data { + const char *method; + size_t shm_size; +}; + +int of_optee_fixup(struct device_node *root, void *fixup_data); + +#endif /* __ARM_OPTEE_H__ */ + diff --git a/arch/arm/include/asm/pci.h b/arch/arm/include/asm/pci.h index d7419cabe7..7c834f1101 100644 --- a/arch/arm/include/asm/pci.h +++ b/arch/arm/include/asm/pci.h @@ -2,6 +2,8 @@ #ifndef __ASM_PCI_H #define __ASM_PCI_H -#define pcibios_assign_all_busses() 1 +#include <efi/efi-mode.h> + +#define pcibios_assign_all_busses() (!efi_is_payload()) #endif diff --git a/arch/arm/include/asm/pgtable64.h b/arch/arm/include/asm/pgtable64.h index dbec61753b..b88ffe6be5 100644 --- a/arch/arm/include/asm/pgtable64.h +++ b/arch/arm/include/asm/pgtable64.h @@ -4,12 +4,11 @@ #ifndef __ASM_PGTABLE64_H #define __ASM_PGTABLE64_H -#define UL(x) _AC(x, UL) - #define UNUSED_DESC 0x6EbAAD0BBADbA6E0 #define VA_START 0x0 #define BITS_PER_VA 48 +#define BITS_PER_PA 40 // Use 40 Physical address bits /* Granule size of 4KB is being used */ #define GRANULE_SIZE_SHIFT 12 diff --git a/arch/arm/include/asm/posix_types.h b/arch/arm/include/asm/posix_types.h index 22cae6230c..feaed42471 100644 --- a/arch/arm/include/asm/posix_types.h +++ b/arch/arm/include/asm/posix_types.h @@ -1 +1,3 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #include <asm-generic/posix_types.h> diff --git a/arch/arm/include/asm/psci.h b/arch/arm/include/asm/psci.h index 3c1d046eb9..b342eb85f5 100644 --- a/arch/arm/include/asm/psci.h +++ b/arch/arm/include/asm/psci.h @@ -6,6 +6,8 @@ #ifndef __ARM_PSCI_H__ #define __ARM_PSCI_H__ +struct device_node; + #define ARM_PSCI_VER(major, minor) (((major) << 16) | (minor)) #define ARM_PSCI_VER_1_0 ARM_PSCI_VER(1,0) #define ARM_PSCI_VER_0_2 ARM_PSCI_VER(0,2) @@ -144,6 +146,7 @@ static inline int psci_printf(const char *fmt, ...) int psci_get_cpu_id(void); -int of_psci_fixup(struct device_node *root, unsigned long psci_version); +int of_psci_fixup(struct device_node *root, unsigned long psci_version, + const char *method); #endif /* __ARM_PSCI_H__ */ diff --git a/arch/arm/include/asm/reloc.h b/arch/arm/include/asm/reloc.h new file mode 100644 index 0000000000..95b4ef0af8 --- /dev/null +++ b/arch/arm/include/asm/reloc.h @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#ifndef _ASM_RELOC_H_ +#define _ASM_RELOC_H_ + +#include <asm/sections.h> + +unsigned long get_runtime_offset(void); + +/* global_variable_offset() - Access global variables when not running at link address + * + * Get the offset of global variables when not running at the address we are + * linked at. + */ +static inline __prereloc unsigned long global_variable_offset(void) +{ +#ifdef CONFIG_CPU_V8 + unsigned long text; + + __asm__ __volatile__( + "adr %0, _text\n" + : "=r" (text) + : + : "memory"); + return text - (unsigned long)_text; +#else + return get_runtime_offset(); +#endif +} +#define global_variable_offset() global_variable_offset() + +void relocate_to_current_adr(void); +void relocate_to_adr(unsigned long target); +void relocate_to_adr_full(unsigned long target); + +void pbl_barebox_break(void); + +void setup_c(void); + +#include <asm-generic/reloc.h> + +#endif diff --git a/arch/arm/include/asm/sections.h b/arch/arm/include/asm/sections.h index 8ab01f2b71..15b1a6482a 100644 --- a/arch/arm/include/asm/sections.h +++ b/arch/arm/include/asm/sections.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_SECTIONS_H #define __ASM_SECTIONS_H diff --git a/arch/arm/include/asm/secure.h b/arch/arm/include/asm/secure.h index e0c2623723..fd10c47c6a 100644 --- a/arch/arm/include/asm/secure.h +++ b/arch/arm/include/asm/secure.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_ARM_SECURE_H #define __ASM_ARM_SECURE_H diff --git a/arch/arm/include/asm/semihosting.h b/arch/arm/include/asm/semihosting.h index b478dadb3a..9e1606c4ae 100644 --- a/arch/arm/include/asm/semihosting.h +++ b/arch/arm/include/asm/semihosting.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_ARM_SEMIHOSTING_H #define __ASM_ARM_SEMIHOSTING_H diff --git a/arch/arm/include/asm/stacktrace.h b/arch/arm/include/asm/stacktrace.h index 602e79ced4..bbcd2a5f8e 100644 --- a/arch/arm/include/asm/stacktrace.h +++ b/arch/arm/include/asm/stacktrace.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_STACKTRACE_H #define __ASM_STACKTRACE_H diff --git a/arch/arm/include/asm/string.h b/arch/arm/include/asm/string.h index cd79f63402..2322b846b2 100644 --- a/arch/arm/include/asm/string.h +++ b/arch/arm/include/asm/string.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_ARM_STRING_H #define __ASM_ARM_STRING_H diff --git a/arch/arm/include/asm/swab.h b/arch/arm/include/asm/swab.h index 3795437831..8dbde9b307 100644 --- a/arch/arm/include/asm/swab.h +++ b/arch/arm/include/asm/swab.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + /* * arch/arm/include/asm/byteorder.h * diff --git a/arch/arm/include/asm/syscounter.h b/arch/arm/include/asm/syscounter.h index a644cfaad6..16d52269e3 100644 --- a/arch/arm/include/asm/syscounter.h +++ b/arch/arm/include/asm/syscounter.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef _ASM_SYSCNT_H_ #define _ASM_SYSCNT_H_ @@ -21,4 +23,4 @@ static inline u32 syscnt_get_cntfrq(void __iomem *syscnt) return readl(syscnt + SYSCNT_CNTFID(0)); } -#endif
\ No newline at end of file +#endif diff --git a/arch/arm/include/asm/sysreg.h b/arch/arm/include/asm/sysreg.h new file mode 100644 index 0000000000..7d567e08d8 --- /dev/null +++ b/arch/arm/include/asm/sysreg.h @@ -0,0 +1,76 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Macros for accessing system registers with older binutils. + * + * Copyright (C) 2014 ARM Ltd. + * Author: Catalin Marinas <catalin.marinas@arm.com> + */ + +#ifndef __ASM_SYSREG_H +#define __ASM_SYSREG_H + +#include <asm/system.h> +#include <linux/stringify.h> + +/* + * Unlike read_cpuid, calls to read_sysreg are never expected to be + * optimized away or replaced with synthetic values. + */ +#define read_sysreg(r) ({ \ + u64 __val; \ + asm volatile("mrs %0, " __stringify(r) : "=r" (__val)); \ + __val; \ +}) + +/* + * The "Z" constraint normally means a zero immediate, but when combined with + * the "%x0" template means XZR. + */ +#define write_sysreg(v, r) do { \ + u64 __val = (u64)(v); \ + asm volatile("msr " __stringify(r) ", %x0" \ + : : "rZ" (__val)); \ +} while (0) + +/* + * For registers without architectural names, or simply unsupported by + * GAS. + */ +#define read_sysreg_s(r) ({ \ + u64 __val; \ + asm volatile(__mrs_s("%0", r) : "=r" (__val)); \ + __val; \ +}) + +#define write_sysreg_s(v, r) do { \ + u64 __val = (u64)(v); \ + asm volatile(__msr_s(r, "%x0") : : "rZ" (__val)); \ +} while (0) + +/* + * Modify bits in a sysreg. Bits in the clear mask are zeroed, then bits in the + * set mask are set. Other bits are left as-is. + */ +#define sysreg_clear_set(sysreg, clear, set) do { \ + u64 __scs_val = read_sysreg(sysreg); \ + u64 __scs_new = (__scs_val & ~(u64)(clear)) | (set); \ + if (__scs_new != __scs_val) \ + write_sysreg(__scs_new, sysreg); \ +} while (0) + +#define sysreg_clear_set_s(sysreg, clear, set) do { \ + u64 __scs_val = read_sysreg_s(sysreg); \ + u64 __scs_new = (__scs_val & ~(u64)(clear)) | (set); \ + if (__scs_new != __scs_val) \ + write_sysreg_s(__scs_new, sysreg); \ +} while (0) + +#define read_sysreg_par() ({ \ + u64 par; \ + asm("dmb sy"); \ + par = read_sysreg(par_el1); \ + asm("dmb sy"); \ + par; \ +}) + +#endif /* __ASM_SYSREG_H */ diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index a0180f2df8..bf3b7b02e2 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_ARM_SYSTEM_H #define __ASM_ARM_SYSTEM_H @@ -23,12 +25,8 @@ #if __LINUX_ARM_ARCH__ >= 7 #define isb() __asm__ __volatile__ ("isb" : : : "memory") -#ifdef CONFIG_CPU_64v8 #define dsb() __asm__ __volatile__ ("dsb sy" : : : "memory") -#else -#define dsb() __asm__ __volatile__ ("dsb" : : : "memory") -#endif -#define dmb() __asm__ __volatile__ ("dmb" : : : "memory") +#define dmb() __asm__ __volatile__ ("dmb sy" : : : "memory") #elif defined(CONFIG_CPU_XSC3) || __LINUX_ARM_ARCH__ == 6 #define isb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \ : : "r" (0) : "memory") diff --git a/arch/arm/include/asm/system_info.h b/arch/arm/include/asm/system_info.h index 1e3dfc845c..5a84fde75b 100644 --- a/arch/arm/include/asm/system_info.h +++ b/arch/arm/include/asm/system_info.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_ARM_SYSTEM_INFO_H #define __ASM_ARM_SYSTEM_INFO_H @@ -42,6 +44,12 @@ #define CPU_IS_CORTEX_A15 0x410fc0f0 #define CPU_IS_CORTEX_A15_MASK 0xff0ffff0 +#define CPU_IS_CORTEX_A53 0x410fd030 +#define CPU_IS_CORTEX_A53_MASK 0xff0ffff0 + +#define CPU_IS_CORTEX_A72 0x410fd080 +#define CPU_IS_CORTEX_A72_MASK 0xff0ffff0 + #define CPU_IS_PXA250 0x69052100 #define CPU_IS_PXA250_MASK 0xfffff7f0 diff --git a/arch/arm/include/asm/types.h b/arch/arm/include/asm/types.h index 22b9642655..4adc815bf3 100644 --- a/arch/arm/include/asm/types.h +++ b/arch/arm/include/asm/types.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef __ASM_ARM_TYPES_H #define __ASM_ARM_TYPES_H diff --git a/arch/arm/include/asm/unaligned.h b/arch/arm/include/asm/unaligned.h index 44593a8949..b63d39da7f 100644 --- a/arch/arm/include/asm/unaligned.h +++ b/arch/arm/include/asm/unaligned.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + #ifndef _ASM_ARM_UNALIGNED_H #define _ASM_ARM_UNALIGNED_H diff --git a/arch/arm/include/asm/unwind.h b/arch/arm/include/asm/unwind.h index 319527ec9b..37aba2aa4c 100644 --- a/arch/arm/include/asm/unwind.h +++ b/arch/arm/include/asm/unwind.h @@ -16,14 +16,15 @@ enum unwind_reason_code { }; struct unwind_idx { - unsigned long addr; + unsigned long addr_offset; unsigned long insn; }; struct unwind_table { struct list_head list; - struct unwind_idx *start; - struct unwind_idx *stop; + const struct unwind_idx *start; + const struct unwind_idx *origin; + const struct unwind_idx *stop; unsigned long begin_addr; unsigned long end_addr; }; diff --git a/arch/arm/include/asm/word-at-a-time.h b/arch/arm/include/asm/word-at-a-time.h new file mode 100644 index 0000000000..a2b20be13d --- /dev/null +++ b/arch/arm/include/asm/word-at-a-time.h @@ -0,0 +1,60 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2013 ARM Ltd. + */ +#ifndef __ASM_WORD_AT_A_TIME_H +#define __ASM_WORD_AT_A_TIME_H + +#if !defined(__AARCH64EB__) && !defined(__ARMEB__) + +#include <linux/kernel.h> +#include <linux/bitops.h> + +struct word_at_a_time { + const unsigned long one_bits, high_bits; +}; + +#define WORD_AT_A_TIME_CONSTANTS { REPEAT_BYTE(0x01), REPEAT_BYTE(0x80) } + +static inline unsigned long has_zero(unsigned long a, unsigned long *bits, + const struct word_at_a_time *c) +{ + unsigned long mask = ((a - c->one_bits) & ~a) & c->high_bits; + *bits = mask; + return mask; +} + +#define prep_zero_mask(a, bits, c) (bits) + +static inline unsigned long create_zero_mask(unsigned long bits) +{ + bits = (bits - 1) & ~bits; + return bits >> 7; +} + +static inline unsigned long find_zero(unsigned long mask) +{ + unsigned long ret; + +#if __LINUX_ARM_ARCH__ >= 8 + ret = fls64(mask) >> 3; +#elif __LINUX_ARM_ARCH__ >= 5 + /* We have clz available. */ + ret = fls(mask) >> 3; +#else + /* (000000 0000ff 00ffff ffffff) -> ( 1 1 2 3 ) */ + ret = (0x0ff0001 + mask) >> 23; + /* Fix the 1 for 00 case */ + ret &= mask; +#endif + + return ret; +} + +#define zero_bytemask(mask) (mask) + +#else /* __AARCH64EB__ || __ARMEB__ */ +#include <asm-generic/word-at-a-time.h> +#endif + +#endif /* __ASM_WORD_AT_A_TIME_H */ |