arm64 patch
Subsystems (2)
v4 cover arm64 patch
From: David Feng <[email protected]>
*** BLURB HERE ***
The porting has been merged with arm architecture.
There are many arguments about whether the porting should be made as a seperated architecture. We could make comparition now. Most architecture codes are placed in arch/arm/cpu/armv8 directory, but CONFIG_ARMV8 is needed in many place espetially in arm include files. Generic board is also supported after a few bugs are fixed.
David Feng (4):
core support of arm64
board support of arm64
generic board patch of manual reloc and zero gd_t 64bit initrd start address support
arch/arm/config.mk | 6 + arch/arm/cpu/armv8/Makefile | 56 ++++ arch/arm/cpu/armv8/cache.S | 145 ++++++++++ arch/arm/cpu/armv8/cache_v8.c | 291 ++++++++++++++++++++ arch/arm/cpu/armv8/config.mk | 29 ++ arch/arm/cpu/armv8/cpu.c | 68 +++++ arch/arm/cpu/armv8/crt0.S | 130 +++++++++ arch/arm/cpu/armv8/exceptions.S | 182 +++++++++++++ arch/arm/cpu/armv8/interrupts.c | 116 ++++++++ arch/arm/cpu/armv8/relocate.S | 71 +++++ arch/arm/cpu/armv8/start.S | 200 ++++++++++++++ arch/arm/cpu/armv8/timer.c | 95 +++++++ arch/arm/cpu/armv8/tlb.S | 38 +++ arch/arm/cpu/armv8/u-boot.lds | 83 ++++++ arch/arm/include/asm/arch-armv8/armv8.h | 44 ++++ arch/arm/include/asm/arch-armv8/gpio.h | 26 ++ arch/arm/include/asm/arch-armv8/mmu.h | 117 ++++++++ arch/arm/include/asm/config.h | 10 + arch/arm/include/asm/global_data.h | 6 +- arch/arm/include/asm/io.h | 12 +- arch/arm/include/asm/macro.h | 26 ++ arch/arm/include/asm/posix_types.h | 31 +++ arch/arm/include/asm/proc-armv/ptrace.h | 38 +++ arch/arm/include/asm/proc-armv/system.h | 58 +++- arch/arm/include/asm/types.h | 14 + arch/arm/include/asm/u-boot.h | 4 + arch/arm/lib/Makefile | 8 + arch/arm/lib/board.c | 18 ++ arch/arm/lib/bootm.c | 16 ++ board/armltd/dts/vexpress64.dts | 439 +++++++++++++++++++++++++++++++ board/armltd/vexpress64/Makefile | 43 +++ board/armltd/vexpress64/vexpress64.c | 79 ++++++ boards.cfg | 1 + common/board_f.c | 12 +- common/board_r.c | 17 ++ common/fdt_support.c | 66 ++--- common/image.c | 1 + examples/standalone/stubs.c | 15 ++ include/configs/vexpress_aemv8a.h | 203 ++++++++++++++ include/image.h | 1 + 40 files changed, 2774 insertions(+), 41 deletions(-) create mode 100644 arch/arm/cpu/armv8/Makefile create mode 100644 arch/arm/cpu/armv8/cache.S create mode 100644 arch/arm/cpu/armv8/cache_v8.c create mode 100644 arch/arm/cpu/armv8/config.mk create mode 100644 arch/arm/cpu/armv8/cpu.c create mode 100644 arch/arm/cpu/armv8/crt0.S create mode 100644 arch/arm/cpu/armv8/exceptions.S create mode 100644 arch/arm/cpu/armv8/interrupts.c create mode 100644 arch/arm/cpu/armv8/relocate.S create mode 100644 arch/arm/cpu/armv8/start.S create mode 100644 arch/arm/cpu/armv8/timer.c create mode 100644 arch/arm/cpu/armv8/tlb.S create mode 100644 arch/arm/cpu/armv8/u-boot.lds create mode 100644 arch/arm/include/asm/arch-armv8/armv8.h create mode 100644 arch/arm/include/asm/arch-armv8/gpio.h create mode 100644 arch/arm/include/asm/arch-armv8/mmu.h create mode 100644 board/armltd/dts/vexpress64.dts create mode 100644 board/armltd/vexpress64/Makefile create mode 100644 board/armltd/vexpress64/vexpress64.c create mode 100644 include/configs/vexpress_aemv8a.h
Signature · 1 line
1.7.9.5
PATCH v4 1/4 core support of arm64
From: David Feng <[email protected]>
---
Cahnges for v3:
- merge arm64 seperated architecture to arm.
arch/arm/config.mk | 6 + arch/arm/cpu/armv8/Makefile | 56 ++++++ arch/arm/cpu/armv8/cache.S | 145 +++++++++++++++ arch/arm/cpu/armv8/cache_v8.c | 291 +++++++++++++++++++++++++++++++ arch/arm/cpu/armv8/config.mk | 29 +++ arch/arm/cpu/armv8/cpu.c | 68 ++++++++ arch/arm/cpu/armv8/crt0.S | 130 ++++++++++++++ arch/arm/cpu/armv8/exceptions.S | 182 +++++++++++++++++++ arch/arm/cpu/armv8/interrupts.c | 116 ++++++++++++ arch/arm/cpu/armv8/relocate.S | 71 ++++++++ arch/arm/cpu/armv8/start.S | 200 +++++++++++++++++++++ arch/arm/cpu/armv8/timer.c | 95 ++++++++++ arch/arm/cpu/armv8/tlb.S | 38 ++++ arch/arm/cpu/armv8/u-boot.lds | 83 +++++++++ arch/arm/include/asm/arch-armv8/armv8.h | 44 +++++ arch/arm/include/asm/arch-armv8/gpio.h | 26 +++ arch/arm/include/asm/arch-armv8/mmu.h | 117 +++++++++++++ arch/arm/include/asm/config.h | 10 ++ arch/arm/include/asm/global_data.h | 6 +- arch/arm/include/asm/io.h | 12 +- arch/arm/include/asm/macro.h | 26 +++ arch/arm/include/asm/posix_types.h | 31 ++++ arch/arm/include/asm/proc-armv/ptrace.h | 38 ++++ arch/arm/include/asm/proc-armv/system.h | 58 +++++- arch/arm/include/asm/types.h | 14 ++ arch/arm/include/asm/u-boot.h | 4 + arch/arm/lib/Makefile | 8 + arch/arm/lib/board.c | 18 ++ arch/arm/lib/bootm.c | 16 ++ common/board_f.c | 6 +- common/image.c | 1 + examples/standalone/stubs.c | 15 ++ include/image.h | 1 + 33 files changed, 1952 insertions(+), 9 deletions(-) create mode 100644 arch/arm/cpu/armv8/Makefile create mode 100644 arch/arm/cpu/armv8/cache.S create mode 100644 arch/arm/cpu/armv8/cache_v8.c create mode 100644 arch/arm/cpu/armv8/config.mk create mode 100644 arch/arm/cpu/armv8/cpu.c create mode 100644 arch/arm/cpu/armv8/crt0.S create mode 100644 arch/arm/cpu/armv8/exceptions.S create mode 100644 arch/arm/cpu/armv8/interrupts.c create mode 100644 arch/arm/cpu/armv8/relocate.S create mode 100644 arch/arm/cpu/armv8/start.S create mode 100644 arch/arm/cpu/armv8/timer.c create mode 100644 arch/arm/cpu/armv8/tlb.S create mode 100644 arch/arm/cpu/armv8/u-boot.lds create mode 100644 arch/arm/include/asm/arch-armv8/armv8.h create mode 100644 arch/arm/include/asm/arch-armv8/gpio.h create mode 100644 arch/arm/include/asm/arch-armv8/mmu.h
arch/arm/config.mk +6 -0
@@ -74,7 +74,11 @@ endif endif # needed for relocation +ifndef CONFIG_ARMV8 LDFLAGS_u-boot += -pie +else +PLATFORM_CPPFLAGS += -fpic -mstrict-align +endif # # FIXME: binutils versions < 2.22 have a bug in the assembler where
@@ -95,6 +99,8 @@ endif endif # check that only R_ARM_RELATIVE relocations are generated +ifndef CONFIG_ARMV8 ifneq ($(CONFIG_SPL_BUILD),y) ALL-y += checkarmreloc endif +endif
arch/arm/cpu/armv8/Makefile new file +56 -0
56 lines not on this page · raw message
arch/arm/cpu/armv8/cache.S new file +145 -0
145 lines not on this page · raw message
arch/arm/cpu/armv8/cache_v8.c new file +291 -0
291 lines not on this page · raw message
arch/arm/cpu/armv8/config.mk new file +29 -0
@@ -0,0 +1,29 @@ +# +# Copyright (c) 2013 FengHua <[email protected]> +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +PLATFORM_RELFLAGS += -fno-common -ffixed-x18 + +PF_CPPFLAGS_ARMV8 := $(call cc-option, -march=armv8-a) +PLATFORM_CPPFLAGS += $(PF_CPPFLAGS_ARMV8) + +# SEE README.arm-unaligned-accesses +PF_NO_UNALIGNED := $(call cc-option, -mstrict-align) +PLATFORM_NO_UNALIGNED := $(PF_NO_UNALIGNED)
arch/arm/cpu/armv8/cpu.c new file +68 -0
68 lines not on this page · raw message
arch/arm/cpu/armv8/crt0.S new file +130 -0
130 lines not on this page · raw message
arch/arm/cpu/armv8/exceptions.S new file +182 -0
182 lines not on this page · raw message
arch/arm/cpu/armv8/interrupts.c new file +116 -0
116 lines not on this page · raw message
arch/arm/cpu/armv8/relocate.S new file +71 -0
71 lines not on this page · raw message
arch/arm/cpu/armv8/start.S new file +200 -0
200 lines not on this page · raw message
arch/arm/cpu/armv8/timer.c new file +95 -0
95 lines not on this page · raw message
arch/arm/cpu/armv8/tlb.S new file +38 -0
@@ -0,0 +1,38 @@ +/* + * Copyright (c) 2013 David Feng <[email protected]> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <asm-offsets.h> +#include <config.h> +#include <version.h> +#include <linux/linkage.h> + +/* + * void __asm_invalidate_tlb_all(void) + * + * invalidate all tlb entries. + */ +ENTRY(__asm_invalidate_tlb_all) + tlbi alle2 + dsb sy + isb + ret +ENDPROC(__asm_invalidate_tlb_all)
arch/arm/cpu/armv8/u-boot.lds new file +83 -0
83 lines not on this page · raw message
arch/arm/include/asm/arch-armv8/armv8.h new file +44 -0
44 lines not on this page · raw message
arch/arm/include/asm/arch-armv8/gpio.h new file +26 -0
@@ -0,0 +1,26 @@ +/* +* Copyright (c) 2013 David Feng <[email protected]> +* +* See file CREDITS for list of people who contributed to this +* project. +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, +* MA 02111-1307 USA +*/ + +#ifndef _ASM_ARMV8_GPIO_H_ +#define _ASM_ARMV8_GPIO_H_ + +#endif /* _ASM_ARMV8_GPIO_H_ */
arch/arm/include/asm/arch-armv8/mmu.h new file +117 -0
117 lines not on this page · raw message
arch/arm/include/asm/config.h +10 -0
@@ -9,4 +9,14 @@#define CONFIG_LMB #define CONFIG_SYS_BOOT_RAMDISK_HIGH + +#ifdef CONFIG_ARMV8 +/* +* Currently, GOT is used to relocate u-boot and +* configuration CONFIG_NEEDS_MANUAL_RELOC is needed. +*/ +#define CONFIG_NEEDS_MANUAL_RELOC +#define CONFIG_PHYS_64BIT +#endif +#endif
arch/arm/include/asm/global_data.h +5 -1
@@ -47,6 +47,10 @@ struct arch_global_data {#include <asm-generic/global_data.h> -#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8") +#ifndef CONFIG_ARMV8 +#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8") +#else +#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("x18") +#endif #endif /* __ASM_GBL_DATA_H */
arch/arm/include/asm/io.h +6 -6
@@ -75,42 +75,42 @@ static inline phys_addr_t virt_to_phys(void * vaddr)#define __arch_putw (v,a) (*(volatile unsigned short *)(a) = (v))#define __arch_putl (v,a) (*(volatile unsigned int *)(a) = (v)) -extern inline void __raw_writesb (unsigned int addr,const void *data,int bytelen) +extern inline void __raw_writesb (unsigned long addr,const void *data,int bytelen) {uint8_t *buf = (uint8_t *)data;while (bytelen--)__arch_putb (*buf++, addr); } -extern inline void __raw_writesw (unsigned int addr,const void *data,int wordlen) +extern inline void __raw_writesw (unsigned long addr,const void *data,int wordlen) {uint16_t *buf = (uint16_t *)data;while (wordlen--)__arch_putw (*buf++, addr); } -extern inline void __raw_writesl (unsigned int addr,const void *data,int longlen) +extern inline void __raw_writesl (unsigned long addr,const void *data,int longlen) {uint32_t *buf = (uint32_t *)data;while (longlen--)__arch_putl (*buf++, addr); } -extern inline void __raw_readsb (unsigned int addr,void *data,int bytelen) +extern inline void __raw_readsb (unsigned long addr,void *data,int bytelen) {uint8_t *buf = (uint8_t *)data;while (bytelen--) *buf++ =__arch_getb (addr); } -extern inline void __raw_readsw (unsigned int addr,void *data,int wordlen) +extern inline void __raw_readsw (unsigned long addr,void *data,int wordlen) {uint16_t *buf = (uint16_t *)data;while (wordlen--) *buf++ =__arch_getw (addr); } -extern inline void __raw_readsl (unsigned int addr,void *data,int longlen) +extern inline void __raw_readsl (unsigned long addr,void *data,int longlen) {uint32_t *buf = (uint32_t *)data;while (longlen--)
arch/arm/include/asm/macro.h +26 -0
@@ -54,5 +54,31 @@ bcs 1b .endm +#ifdef CONFIG_ARMV8 +/* +* Register aliases. +*/ +lr .req x30 // link register + +/* + * Stack pushing/popping (register pairs only). + * Equivalent to store decrement before, + * load increment after. + */ +.macro push, xreg1, xreg2 + stp \xreg1, \xreg2, [sp, #-16]! +.endm + +.macro pop, xreg1, xreg2 + ldp \xreg1, \xreg2, [sp], #16 +.endm + +.macro ventry label + .align 7 + b \label +.endm + +#endif /* CONFIG_ARMV8 */ +#endif /* __ASSEMBLY__ */ #endif /* __ASM_ARM_MACRO_H__ */
arch/arm/include/asm/posix_types.h +31 -0
@@ -19,6 +19,8 @@* assume GCC is being used. */ +#ifndef CONFIG_ARMV8 +typedef unsigned short __kernel_dev_t ;typedef unsigned long __kernel_ino_t ;typedef unsigned short __kernel_mode_t ;
@@ -44,6 +46,35 @@ typedef unsigned int __kernel_gid32_t;typedef unsigned short __kernel_old_uid_t ;typedef unsigned short __kernel_old_gid_t ; +#else /* CONFIG_ARMV8 */ + +typedef unsigned short __kernel_dev_t ; +typedef unsigned long __kernel_ino_t ; +typedef unsigned short __kernel_mode_t ; +typedef unsigned short __kernel_nlink_t ; +typedef long __kernel_off_t ; +typedef int __kernel_pid_t ; +typedef unsigned short __kernel_ipc_pid_t ; +typedef unsigned short __kernel_uid_t ; +typedef unsigned short __kernel_gid_t ; +typedef unsigned long __kernel_size_t ; +typedef long __kernel_ssize_t ; +typedef long __kernel_ptrdiff_t ; +typedef long __kernel_time_t ; +typedef long __kernel_suseconds_t ; +typedef long __kernel_clock_t ; +typedef long __kernel_daddr_t ; +typedef char *__kernel_caddr_t ; +typedef unsigned short __kernel_uid16_t ; +typedef unsigned short __kernel_gid16_t ; +typedef unsigned int __kernel_uid32_t ; +typedef unsigned int __kernel_gid32_t ; + +typedef __kernel_uid_t __kernel_old_uid_t ; +typedef __kernel_gid_t __kernel_old_gid_t ; + +#endif /* CONFIG_ARMV8 */ +#ifdef __GNUC__typedef long long __kernel_loff_t ;#endif
arch/arm/include/asm/proc-armv/ptrace.h +38 -0
@@ -12,6 +12,8 @@#include <linux/config.h> +#ifndef CONFIG_ARMV8 +#define USR26_MODE 0x00#define FIQ26_MODE 0x01#define IRQ26_MODE 0x02
@@ -106,4 +108,40 @@ static inline int valid_user_regs(struct pt_regs *regs)#endif /* __ASSEMBLY__ */ +#else /* CONFIG_ARMV8 */ + +#define PCMASK 0 + +#define S_X0 (0)/* offsetof(struct pt_regs, regs[0]) */ +#define S_X1 (8)/* offsetof(struct pt_regs, regs[1]) */ +#define S_X2 (16)/* offsetof(struct pt_regs, regs[2]) */ +#define S_X3 (24/* offsetof(struct pt_regs, regs[3]) */ +#define S_X4 (32)/* offsetof(struct pt_regs, regs[4]) */ +#define S_X5 (40)/* offsetof(struct pt_regs, regs[5]) */ +#define S_X6 (48)/* offsetof(struct pt_regs, regs[6]) */ +#define S_X7 (56)/* offsetof(struct pt_regs, regs[7]) */ +#define S_LR (240)/* offsetof(struct pt_regs, regs[30]) */ +#define S_SP (248)/* offsetof(struct pt_regs, sp) */ +#define S_PC (256)/* offsetof(struct pt_regs, pc) */ +#define S_PSTATE (264)/* offsetof(struct pt_regs, pstate) */ +#define S_FRAME_SIZE (272)/* sizeof(struct pt_regs) */ + +#ifndef __ASSEMBLY__ + +/* +* This struct defines the way the registers are stored on the stack during an +* exception. Note that sizeof(struct pt_regs) has to be a multiple of 16 (for +* stack alignment). struct user_pt_regs must form a prefix of struct pt_regs. +*/ +struct pt_regs { +u64 regs[31 ]; +u64 sp; +u64 pc; +u64 pstate; +}; + +#endif /* __ASSEMBLY__ */ + +#endif /* CONFIG_ARMV8 */ +#endif
arch/arm/include/asm/proc-armv/system.h +57 -1
70 lines not on this page · raw message
arch/arm/include/asm/types.h +14 -0
@@ -18,8 +18,13 @@ typedef __signed__ int __s32;typedef unsigned int __u32 ;#if defined(__GNUC__) +#ifndef CONFIG_ARMV8 __extension__typedef __signed__ long long __s64 ; __extension__typedef unsigned long long __u64 ; +#else /* CONFIG_ARMV8 */ +__extension__typedef __signed__ long __s64 ; +__extension__typedef unsigned long __u64 ; +#endif /* CONFIG_ARMV8 */ #endif /*
@@ -36,10 +41,19 @@ typedef unsigned short u16;typedef signed int s32 ;typedef unsigned int u32 ; +#ifndef CONFIG_ARMV8 typedef signed long long s64 ;typedef unsigned long long u64 ; +#else /* CONFIG_ARMV8 */ +typedef signed long s64 ; +typedef unsigned long u64 ; +#endif /* CONFIG_ARMV8 */ +#ifndef CONFIG_ARMV8 #define BITS_PER_LONG 32 +#else /* CONFIG_ARMV8 */ +#define BITS_PER_LONG 64 +#endif /* CONFIG_ARMV8 */ /* Dma addresses are 32-bits wide. */
arch/arm/include/asm/u-boot.h +4 -0
@@ -44,6 +44,10 @@ typedef struct bd_info {#endif /* !CONFIG_SYS_GENERIC_BOARD */ /* For image.h:image_check_target_arch() */ +#ifndef CONFIG_ARMV8 #define IH_ARCH_DEFAULT IH_ARCH_ARM +#else +#define IH_ARCH_DEFAULT IH_ARCH_ARM64 +#endif #endif /* _U_BOOT_H_ */
arch/arm/lib/Makefile +8 -0
@@ -10,6 +10,7 @@ include $(TOPDIR)/config.mk LIB = $(obj)lib$(ARCH).o LIBGCC = $(obj)libgcc.o +ifndef CONFIG_ARMV8 GLSOBJS += _ashldi3.o GLSOBJS += _ashrdi3.o GLSOBJS += _divsi3.o
@@ -21,9 +22,12 @@ GLSOBJS += _umodsi3.o GLCOBJS += div0.o SOBJS-y += crt0.o +endif ifndef CONFIG_SPL_BUILD +ifndef CONFIG_ARMV8 SOBJS-y += relocate.o +endif ifndef CONFIG_SYS_GENERIC_BOARD COBJS-y += board.o endif
@@ -38,11 +42,15 @@ else COBJS-$(CONFIG_SPL_FRAMEWORK) += spl.o endif +ifndef CONFIG_ARMV8 COBJS-y += interrupts.o +endif COBJS-y += reset.o COBJS-y += cache.o +ifndef CONFIG_ARMV8 COBJS-y += cache-cp15.o +endif SRCS := $(GLSOBJS:.o=.S) $(GLCOBJS:.o=.c) \ $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
arch/arm/lib/board.c +18 -0
@@ -344,7 +344,11 @@ void board_init_f(ulong bootflag)#if !(defined(CONFIG_SYS_ICACHE_OFF ) && defined(CONFIG_SYS_DCACHE_OFF ))/* reserve TLB table */ +#ifndef CONFIG_ARMV8 gd->arch.tlb_size =4096 *4 ; +#else + gd->arch.tlb_size =0x10000 ; +#endif addr -= gd->arch.tlb_size;/* round down to next 64 kB limit */
@@ -419,6 +423,7 @@ void board_init_f(ulong bootflag) }#endif +#ifndef CONFIG_ARMV8 /* setup stackpointer for exeptions */ gd->irq_sp = addr_sp;#ifdef CONFIG_USE_IRQ
@@ -431,6 +436,10 @@ void board_init_f(ulong bootflag)/* 8-byte alignment for ABI compliance */ addr_sp &= ~0x07 ; +#else /* CONFIG_ARMV8 */ +/* 16-byte alignment for ABI compliance */ + addr_sp &= ~0x0f ; +#endif /* CONFIG_ARMV8 */ #else addr_sp +=128 ;/* leave 32 words for abort-stack */ gd->irq_sp = addr_sp;
@@ -523,6 +532,15 @@ void board_init_r(gd_t *id, ulong dest_addr)debug ("monitor flash len: %08lX\n" , monitor_flash_len);board_init ();/* Setup chipselects */ + +#ifdef CONFIG_NEEDS_MANUAL_RELOC +/* +* We have to relocate the command table manually +*/ +fixup_cmdtable (ll_entry_start (cmd_tbl_t, cmd), +ll_entry_count (cmd_tbl_t, cmd)); +#endif /* CONFIG_NEEDS_MANUAL_RELOC */ +/* * TODO: printing of the clock inforamtion of the board is now * implemented as part of bdinfo command. Currently only support for
arch/arm/lib/bootm.c +16 -0
@@ -222,6 +222,7 @@ static void boot_prep_linux(bootm_headers_t *images)/* Subcommand: GO */ static void boot_jump_linux (bootm_headers_t *images,int flag) { +#ifndef CONFIG_ARMV8 unsigned long machid = gd->bd->bi_arch_number;char *s;void (*kernel_entry)(int zero,int arch,uint params);
@@ -248,6 +249,21 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)if (!fake)kernel_entry (0 , machid, r2); +#else +void (*kernel_entry)(void *fdt_addr); +int fake = (flag &BOOTM_STATE_OS_FAKE_GO ); + + kernel_entry = (void (*)(void *fdt_addr))images->ep; + +debug ("## Transferring control to Linux (at address %lx)" \ +"...\n" , (ulong )kernel_entry); +bootstage_mark (BOOTSTAGE_ID_RUN_OS ); + +announce_and_cleanup (fake); + +if (!fake) +kernel_entry (images->ft_addr); +#endif }/* Main Entry point for arm bootm implementation
common/board_f.c +5 -1
@@ -458,7 +458,11 @@ static int reserve_round_4k(void)static int reserve_mmu (void ) {/* reserve TLB table */ +#ifndef CONFIG_ARMV8 gd->arch.tlb_size =4096 *4 ; +#else + gd->arch.tlb_size =0x10000 ; +#endif gd->relocaddr -= gd->arch.tlb_size;/* round down to next 64 kB limit */
@@ -610,7 +614,7 @@ static int reserve_stacks(void)* TODO(sjg at chromium.org): Perhaps create arch_reserve_stack() * to handle this and put in arch/xxx/lib/stack.c */ -# ifdef CONFIG_ARM +# if defined(CONFIG_ARM ) && !defined(CONFIG_ARMV8 )# ifdef CONFIG_USE_IRQ gd->start_addr_sp -= (CONFIG_STACKSIZE_IRQ +CONFIG_STACKSIZE_FIQ ); debug("Reserving %zu Bytes for IRQ stack at: %08lx\n",
common/image.c +1 -0
@@ -81,6 +81,7 @@ static const table_entry_t uimage_arch[] = { { IH_ARCH_NDS32, "nds32", "NDS32", }, { IH_ARCH_OPENRISC, "or1k", "OpenRISC 1000",}, { IH_ARCH_SANDBOX, "sandbox", "Sandbox", }, + { IH_ARCH_ARM64, "arm64", "AArch64", }, { -1, "", "", }, };
examples/standalone/stubs.c +15 -0
@@ -39,6 +39,7 @@ gd_t *global_data; " bctr\n" \ : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "r11");#elif defined(CONFIG_ARM ) +#ifndef CONFIG_ARMV8 /* * r8 holds the pointer to the global_data, ip is a call-clobbered * register
@@ -50,6 +51,20 @@ gd_t *global_data; " ldr ip, [r8, %0]\n" \ " ldr pc, [ip, %1]\n" \ : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "ip"); +#else +/* +* x18 holds the pointer to the global_data, x9 is a call-clobbered +* register +*/ +#define EXPORT_FUNC (x) \ + asm volatile ( \ +" .globl " #x "\n" \ +#x ":\n" \ +" ldr x9, [x18, %0]\n" \ +" ldr x9, [x9, %1]\n" \ +" br x9\n" \ + : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "x19"); +#endif #elif defined(CONFIG_MIPS)/* * k0 ($26) holds the pointer to the global_data; t9 ($25) is a call-
include/image.h +1 -0
@@ -156,6 +156,7 @@ struct lmb;#define IH_ARCH_SANDBOX 19/* Sandbox architecture (test only) */ #define IH_ARCH_NDS32 20/* ANDES Technology - NDS32 */ #define IH_ARCH_OPENRISC 21/* OpenRISC 1000 */ +#define IH_ARCH_ARM64 22/* ARM64 */ /* * Image Types
Signature · 1 line
1.7.9.5
PATCH v4 2/4 board support of arm64
In reply to fenghua at phytium.com.cnFrom: David Feng <[email protected]>
--- board/armltd/dts/vexpress64.dts | 439 ++++++++++++++++++++++++++++++++++ board/armltd/vexpress64/Makefile | 43 ++++ board/armltd/vexpress64/vexpress64.c | 79 ++++++ boards.cfg | 1 + include/configs/vexpress_aemv8a.h | 203 ++++++++++++++++ 5 files changed, 765 insertions(+) create mode 100644 board/armltd/dts/vexpress64.dts create mode 100644 board/armltd/vexpress64/Makefile create mode 100644 board/armltd/vexpress64/vexpress64.c create mode 100644 include/configs/vexpress_aemv8a.h
board/armltd/dts/vexpress64.dts new file +439 -0
@@ -0,0 +1,439 @@ +/* + * ARM Ltd. Fast Models + * + * Architecture Envelope Model (AEM) ARMv8-A + * ARMAEMv8AMPCT + * + * RTSM_VE_AEMv8A.lisa + */ + +/dts-v1/; + +/memreserve/ 0x80000000 0x00010000; + +/ { + /* boot configurations for u-boot */ + config { + /*bootdelay = <1>;*/ + kernel-offset = <0x100000>; + rootdisk-offset = <0x800000>; + bootcmd = "bootm 0x100000 0x800000:0x2000000"; + }; +}; + +/ { + model = "RTSM_VE_AEMv8A"; + compatible = "arm,rtsm_ve,aemv8a", "arm,vexpress"; + interrupt-parent = <&gic>; + #address-cells = <2>; + #size-cells = <2>; + + /* chosen */ + /* generated by u-boot */ + + + aliases { + serial0 = &v2m_serial0; + serial1 = &v2m_serial1; + serial2 = &v2m_serial2; + serial3 = &v2m_serial3; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + cpu at 0 { + device_type = "cpu"; + compatible = "arm,armv8"; + reg = <0>; + enable-method = "spin-table"; + cpu-release-addr = <0x0 0x8000fff8>; + }; + cpu at 1 { + device_type = "cpu"; + compatible = "arm,armv8"; + reg = <1>; + enable-method = "spin-table"; + cpu-release-addr = <0x0 0x8000fff8>; + }; + cpu at 2 { + device_type = "cpu"; + compatible = "arm,armv8"; + reg = <2>; + enable-method = "spin-table"; + cpu-release-addr = <0x0 0x8000fff8>; + }; + cpu at 3 { + device_type = "cpu"; + compatible = "arm,armv8"; + reg = <3>; + enable-method = "spin-table"; + cpu-release-addr = <0x0 0x8000fff8>; + }; + }; + + memory at 80000000 { + device_type = "memory"; + reg = <0x00000000 0x80000000 0 0x80000000>, + <0x00000008 0x80000000 0 0x80000000>; + }; + + gic: interrupt-controller at 2c001000 { + compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic"; + #interrupt-cells = <3>; + #address-cells = <0>; + interrupt-controller; + reg = <0x0 0x2c001000 0 0x1000>, + <0x0 0x2c002000 0 0x1000>, + <0x0 0x2c004000 0 0x2000>, + <0x0 0x2c006000 0 0x2000>; + interrupts = <1 9 0xf04>; + }; + + timer { + compatible = "arm,armv8-timer"; + interrupts = <1 13 0xff01>, + <1 14 0xff01>, + <1 11 0xff01>, + <1 10 0xff01>; + clock-frequency = <100000000>; + }; + + pmu { + compatible = "arm,armv8-pmuv3"; + interrupts = <0 60 4>, + <0 61 4>, + <0 62 4>, + <0 63 4>; + }; + + smb { + compatible = "simple-bus"; + + #address-cells = <2>; + #size-cells = <1>; + ranges = <0 0 0 0x08000000 0x04000000>, + <1 0 0 0x14000000 0x04000000>, + <2 0 0 0x18000000 0x04000000>, + <3 0 0 0x1c000000 0x04000000>, + <4 0 0 0x0c000000 0x04000000>, + <5 0 0 0x10000000 0x04000000>; + + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 63>; + interrupt-map = <0 0 0 &gic 0 0 4>, + <0 0 1 &gic 0 1 4>, + <0 0 2 &gic 0 2 4>, + <0 0 3 &gic 0 3 4>, + <0 0 4 &gic 0 4 4>, + <0 0 5 &gic 0 5 4>, + <0 0 6 &gic 0 6 4>, + <0 0 7 &gic 0 7 4>, + <0 0 8 &gic 0 8 4>, + <0 0 9 &gic 0 9 4>, + <0 0 10 &gic 0 10 4>, + <0 0 11 &gic 0 11 4>, + <0 0 12 &gic 0 12 4>, + <0 0 13 &gic 0 13 4>, + <0 0 14 &gic 0 14 4>, + <0 0 15 &gic 0 15 4>, + <0 0 16 &gic 0 16 4>, + <0 0 17 &gic 0 17 4>, + <0 0 18 &gic 0 18 4>, + <0 0 19 &gic 0 19 4>, + <0 0 20 &gic 0 20 4>, + <0 0 21 &gic 0 21 4>, + <0 0 22 &gic 0 22 4>, + <0 0 23 &gic 0 23 4>, + <0 0 24 &gic 0 24 4>, + <0 0 25 &gic 0 25 4>, + <0 0 26 &gic 0 26 4>, + <0 0 27 &gic 0 27 4>, + <0 0 28 &gic 0 28 4>, + <0 0 29 &gic 0 29 4>, + <0 0 30 &gic 0 30 4>, + <0 0 31 &gic 0 31 4>, + <0 0 32 &gic 0 32 4>, + <0 0 33 &gic 0 33 4>, + <0 0 34 &gic 0 34 4>, + <0 0 35 &gic 0 35 4>, + <0 0 36 &gic 0 36 4>, + <0 0 37 &gic 0 37 4>, + <0 0 38 &gic 0 38 4>, + <0 0 39 &gic 0 39 4>, + <0 0 40 &gic 0 40 4>, + <0 0 41 &gic 0 41 4>, + <0 0 42 &gic 0 42 4>; + + motherboard { + arm,v2m-memory-map = "rs1"; + compatible = "arm,vexpress,v2m-p1", "simple-bus"; + #address-cells = <2>; /* SMB chipselect number and offset */ + #size-cells = <1>; + #interrupt-cells = <1>; + ranges; + + flash at 0,00000000 { + compatible = "arm,vexpress-flash", "cfi-flash"; + reg = <0 0x00000000 0x04000000>, + <4 0x00000000 0x04000000>; + bank-width = <4>; + }; + + vram at 2,00000000 { + compatible = "arm,vexpress-vram"; + reg = <2 0x00000000 0x00800000>; + }; + + ethernet at 2,02000000 { + compatible = "smsc,lan91c111"; + reg = <2 0x02000000 0x10000>; + interrupts = <15>; + }; + + v2m_clk24mhz: clk24mhz { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <24000000>; + clock-output-names = "v2m:clk24mhz"; + }; + + v2m_refclk1mhz: refclk1mhz { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <1000000>; + clock-output-names = "v2m:refclk1mhz"; + }; + + v2m_refclk32khz: refclk32khz { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + clock-output-names = "v2m:refclk32khz"; + }; + + iofpga at 3,00000000 { + compatible = "arm,amba-bus", "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 3 0 0x200000>; + + v2m_sysreg: sysreg at 010000 { + compatible = "arm,vexpress-sysreg"; + reg = <0x010000 0x1000>; + gpio-controller; + #gpio-cells = <2>; + }; + + v2m_sysctl: sysctl at 020000 { + compatible = "arm,sp810", "arm,primecell"; + reg = <0x020000 0x1000>; + clocks = <&v2m_refclk32khz>, <&v2m_refclk1mhz>, <&v2m_clk24mhz>; + clock-names = "refclk", "timclk", "apb_pclk"; + #clock-cells = <1>; + clock-output-names = "timerclken0", "timerclken1", "timerclken2", "timerclken3"; + }; + + aaci at 040000 { + compatible = "arm,pl041", "arm,primecell"; + reg = <0x040000 0x1000>; + interrupts = <11>; + clocks = <&v2m_clk24mhz>; + clock-names = "apb_pclk"; + }; + + mmci at 050000 { + compatible = "arm,pl180", "arm,primecell"; + reg = <0x050000 0x1000>; + interrupts = <9 10>; + cd-gpios = <&v2m_sysreg 0 0>; + wp-gpios = <&v2m_sysreg 1 0>; + max-frequency = <12000000>; + vmmc-supply = <&v2m_fixed_3v3>; + clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; + clock-names = "mclk", "apb_pclk"; + }; + + kmi at 060000 { + compatible = "arm,pl050", "arm,primecell"; + reg = <0x060000 0x1000>; + interrupts = <12>; + clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; + clock-names = "KMIREFCLK", "apb_pclk"; + }; + + kmi at 070000 { + compatible = "arm,pl050", "arm,primecell"; + reg = <0x070000 0x1000>; + interrupts = <13>; + clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; + clock-names = "KMIREFCLK", "apb_pclk"; + }; + + v2m_serial0: uart at 090000 { + compatible = "arm,pl011", "arm,primecell"; + reg = <0x090000 0x1000>; + interrupts = <5>; + clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; + clock-names = "uartclk", "apb_pclk"; + }; + + v2m_serial1: uart at 0a0000 { + compatible = "arm,pl011", "arm,primecell"; + reg = <0x0a0000 0x1000>; + interrupts = <6>; + clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; + clock-names = "uartclk", "apb_pclk"; + }; + + v2m_serial2: uart at 0b0000 { + compatible = "arm,pl011", "arm,primecell"; + reg = <0x0b0000 0x1000>; + interrupts = <7>; + clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; + clock-names = "uartclk", "apb_pclk"; + }; + + v2m_serial3: uart at 0c0000 { + compatible = "arm,pl011", "arm,primecell"; + reg = <0x0c0000 0x1000>; + interrupts = <8>; + clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; + clock-names = "uartclk", "apb_pclk"; + }; + + wdt at 0f0000 { + compatible = "arm,sp805", "arm,primecell"; + reg = <0x0f0000 0x1000>; + interrupts = <0>; + clocks = <&v2m_refclk32khz>, <&v2m_clk24mhz>; + clock-names = "wdogclk", "apb_pclk"; + }; + + v2m_timer01: timer at 110000 { + compatible = "arm,sp804", "arm,primecell"; + reg = <0x110000 0x1000>; + interrupts = <2>; + clocks = <&v2m_sysctl 0>, <&v2m_sysctl 1>, <&v2m_clk24mhz>; + clock-names = "timclken1", "timclken2", "apb_pclk"; + }; + + v2m_timer23: timer at 120000 { + compatible = "arm,sp804", "arm,primecell"; + reg = <0x120000 0x1000>; + interrupts = <3>; + clocks = <&v2m_sysctl 2>, <&v2m_sysctl 3>, <&v2m_clk24mhz>; + clock-names = "timclken1", "timclken2", "apb_pclk"; + }; + + rtc at 170000 { + compatible = "arm,pl031", "arm,primecell"; + reg = <0x170000 0x1000>; + interrupts = <4>; + clocks = <&v2m_clk24mhz>; + clock-names = "apb_pclk"; + }; + + clcd at 1f0000 { + compatible = "arm,pl111", "arm,primecell"; + reg = <0x1f0000 0x1000>; + interrupts = <14>; + clocks = <&v2m_oscclk1>, <&v2m_clk24mhz>; + clock-names = "clcdclk", "apb_pclk"; + }; + }; + + v2m_fixed_3v3: fixedregulator at 0 { + compatible = "regulator-fixed"; + regulator-name = "3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; + }; + + mcc { + compatible = "arm,vexpress,config-bus", "simple-bus"; + arm,vexpress,config-bridge = <&v2m_sysreg>; + + v2m_oscclk1: osc at 1 { + /* CLCD clock */ + compatible = "arm,vexpress-osc"; + arm,vexpress-sysreg,func = <1 1>; + freq-range = <23750000 63500000>; + #clock-cells = <0>; + clock-output-names = "v2m:oscclk1"; + }; + + reset at 0 { + compatible = "arm,vexpress-reset"; + arm,vexpress-sysreg,func = <5 0>; + }; + + muxfpga at 0 { + compatible = "arm,vexpress-muxfpga"; + arm,vexpress-sysreg,func = <7 0>; + }; + + shutdown at 0 { + compatible = "arm,vexpress-shutdown"; + arm,vexpress-sysreg,func = <8 0>; + }; + + reboot at 0 { + compatible = "arm,vexpress-reboot"; + arm,vexpress-sysreg,func = <9 0>; + }; + + dvimode at 0 { + compatible = "arm,vexpress-dvimode"; + arm,vexpress-sysreg,func = <11 0>; + }; + }; + }; + }; + + panels { + panel at 0 { + compatible = "panel"; + mode = "VGA"; + refresh = <60>; + xres = <640>; + yres = <480>; + pixclock = <39721>; + left_margin = <40>; + right_margin = <24>; + upper_margin = <32>; + lower_margin = <11>; + hsync_len = <96>; + vsync_len = <2>; + sync = <0>; + vmode = "FB_VMODE_NONINTERLACED"; + tim2 = "TIM2_BCD", "TIM2_IPC"; + cntl = "CNTL_LCDTFT", "CNTL_BGR", "CNTL_LCDVCOMP(1)"; + caps = "CLCD_CAP_5551", "CLCD_CAP_565", "CLCD_CAP_888"; + bpp = <16>; + }; + + panel at 1 { + compatible = "panel"; + mode = "XVGA"; + refresh = <60>; + xres = <1024>; + yres = <768>; + pixclock = <15748>; + left_margin = <152>; + right_margin = <48>; + upper_margin = <23>; + lower_margin = <3>; + hsync_len = <104>; + vsync_len = <4>; + sync = <0>; + vmode = "FB_VMODE_NONINTERLACED"; + tim2 = "TIM2_BCD", "TIM2_IPC"; + cntl = "CNTL_LCDTFT", "CNTL_BGR", "CNTL_LCDVCOMP(1)"; + caps = "CLCD_CAP_5551", "CLCD_CAP_565", "CLCD_CAP_888"; + bpp = <16>; + }; + }; +};
board/armltd/vexpress64/Makefile new file +43 -0
43 lines not on this page · raw message
board/armltd/vexpress64/vexpress64.c new file +79 -0
79 lines not on this page · raw message
boards.cfg +1 -0
@@ -1196,5 +1196,6 @@ gr_ep2s60 sparc leon3 - gaisler grsim sparc leon3 - gaisler gr_xc3s_1500 sparc leon3 - gaisler coreboot-x86 x86 x86 coreboot chromebook-x86 coreboot coreboot:SYS_TEXT_BASE=0x01110000 +vexpress_aemv8a arm armv8 vexpress64 armltd - vexpress_aemv8a:ARMV8 # Target ARCH CPU Board name Vendor SoC Options ########################################################################################################################
include/configs/vexpress_aemv8a.h new file +203 -0
203 lines not on this page · raw message
Signature · 1 line
1.7.9.5
PATCH v4 3/4 generic board patch of manual reloc and zero gd_t
In reply to fenghua at phytium.com.cnFrom: David Feng <[email protected]>
1. function board_init_f in board_f.c should firstly zero gd_t structure before it call initcall_run_list, otherwise the debug print will go run if DEBUG is defined. Because the printf function will use global data to determine whether serial port is initialized and could be written.
2. function board_init_r in board_r.c should firstly relocate init_sequence_r table before it call initcall_run_list. Command table also should be relocated.
--- common/board_f.c | 6 ++++++ common/board_r.c | 17 +++++++++++++++++ 2 files changed, 23 insertions(+)
common/board_f.c +6 -0
@@ -1009,6 +1009,12 @@ void board_init_f(ulong boot_flags) gd = &data;#endif +/* +* Zero gd_t first, otherwise the debug print in initcall_run_list +* function before zero_global_data is called will go wrong. +*/ +memset ((void *)gd,0 ,sizeof (gd_t)); + gd->flags = boot_flags;if (initcall_run_list (init_sequence_f))
common/board_r.c +17 -0
@@ -157,6 +157,13 @@ static int initr_reloc_global_data(void)*/ gd->env_addr += gd->relocaddr -CONFIG_SYS_MONITOR_BASE ;#endif +#ifdef CONFIG_NEEDS_MANUAL_RELOC +/* +* We have to relocate the command table manually +*/ +fixup_cmdtable (ll_entry_start (cmd_tbl_t, cmd), +ll_entry_count (cmd_tbl_t, cmd)); +#endif /* CONFIG_NEEDS_MANUAL_RELOC */ return 0 ; }
@@ -899,6 +906,7 @@ init_fnc_t init_sequence_r[] = { initr_modem, #endif run_main_loop, + NULL, };void board_init_r (gd_t *new_gd,ulong dest_addr)
@@ -906,6 +914,15 @@ void board_init_r(gd_t *new_gd, ulong dest_addr)#ifndef CONFIG_X86 gd = new_gd;#endif +#ifdef CONFIG_NEEDS_MANUAL_RELOC +/* +* We have to relocate the init_sequence_r table manually +*/ +init_fnc_t *init_fnc_ptr; +for (init_fnc_ptr = init_sequence_r; *init_fnc_ptr; ++init_fnc_ptr) + *init_fnc_ptr = (init_fnc_t *)((unsigned long )(*init_fnc_ptr) + gd->reloc_off); +#endif /* CONFIG_NEEDS_MANUAL_RELOC */ +if (initcall_run_list (init_sequence_r))hang ();
Signature · 1 line
1.7.9.5
PATCH v4 3/4 generic board patch of manual reloc and zero gd_t
Hi David,
Quoted 20 lines · On Tue, Aug 20, 2013 at 4:48 AM, <[email protected]> wrote:
From: David Feng <[email protected]>
1. function
board_init_finboard_f.cshould firstly zerogd_tstructure before it callinitcall_run_list, otherwise the debug print will go run if DEBUG is defined. Because the printf function will use global data to determine whether serial port is initialized and could be written.
2. functionboard_init_rinboard_r.cshould firstly relocateinit_sequence_rtable before it callinitcall_run_list. Command table also should be relocated.Signed-off-by David Feng <[email protected]>--- common/board_f.c | 6 ++++++ common/board_r.c | 17 +++++++++++++++++ 2 files changed, 23 insertions(+)common/board_f.c +0
-0
common/board_f.c void board_init_f(ulong boot_flags) · line 1017
Quoted 9 lines
common/board_f.c +6
-0@@ -1009,6 +1009,12 @@ void board_init_f(ulong boot_flags) gd = &data;#endif +/* +* Zero gd_t first, otherwise the debug print in initcall_run_list +* function before zero_global_data is called will go wrong. +*/ +memset ((void *)gd,0 ,sizeof (gd_t)); +
Yes, we need this. You should drop the zero_global_data() or whatever currently does the memset()
Quoted 8 lines
common/board_f.c +0
-0gd->flags = boot_flags;if (initcall_run_list (init_sequence_f))common/board_r.c +0
-0
common/board_r.c static int initr_reloc_global_data(void) · line 166
Quoted 10 lines
common/board_r.c +7
-0@@ -157,6 +157,13 @@ static int initr_reloc_global_data(void)*/ gd->env_addr += gd->relocaddr -CONFIG_SYS_MONITOR_BASE ;#endif +#ifdef CONFIG_NEEDS_MANUAL_RELOC +/* +* We have to relocate the command table manually +*/ +fixup_cmdtable (ll_entry_start (cmd_tbl_t, cmd), +ll_entry_count (cmd_tbl_t, cmd)); +#endif /* CONFIG_NEEDS_MANUAL_RELOC */
Should this be done here or in main_loop()? How is this currently done when not using generic board?
Quoted 17 lines
common/board_r.c +3
-0return 0 ; }@@ -899,6 +906,7 @@ init_fnc_t init_sequence_r[] = { initr_modem, #endif run_main_loop, + NULL, };void board_init_r (gd_t *new_gd,ulong dest_addr)@@ -906,6 +914,15 @@ void board_init_r(gd_t *new_gd, ulong dest_addr)#ifndef CONFIG_X86 gd = new_gd;#endif +#ifdef CONFIG_NEEDS_MANUAL_RELOC +/*
common/board_r.c void board_init_r(gd_t *new_gd, ulong dest_addr) · line 928
Quoted 10 lines
common/board_r.c +7
-0+* We have to relocate the init_sequence_r table manually +*/ +init_fnc_t *init_fnc_ptr; +for (init_fnc_ptr = init_sequence_r; *init_fnc_ptr; ++init_fnc_ptr) + *init_fnc_ptr = (init_fnc_t *)((unsigned long )(*init_fnc_ptr) + gd->reloc_off); +#endif /* CONFIG_NEEDS_MANUAL_RELOC */ +if (initcall_run_list (init_sequence_r))hang ();
Regards,
Simon
PATCH v4 3/4 generic board patch of manual reloc and zero gd_t
Quoted 59 lines
-----????-----
???: "Simon Glass" <[email protected]>
????: 2013?8?21? ???
???: FengHua <[email protected]>
??: "U-Boot Mailing List" <[email protected]>, "trini at ti.com" <[email protected]> ??: Re: [U-Boot] [PATCH v4 3/4] generic board patch of manual reloc and zerogd_tHi David,
Quoted 20 lines · On Tue, Aug 20, 2013 at 4:48 AM, <[email protected]> wrote:
From: David Feng <[email protected]>
1. function
board_init_finboard_f.cshould firstly zerogd_tstructure before it callinitcall_run_list, otherwise the debug print will go run if DEBUG is defined. Because the printf function will use global data to determine whether serial port is initialized and could be written.
2. functionboard_init_rinboard_r.cshould firstly relocateinit_sequence_rtable before it callinitcall_run_list. Command table also should be relocated.Signed-off-by David Feng <[email protected]>--- common/board_f.c | 6 ++++++ common/board_r.c | 17 +++++++++++++++++ 2 files changed, 23 insertions(+)common/board_f.c +0
-0common/board_f.c void board_init_f(ulong boot_flags) · line 1017
Quoted 9 lines
common/board_f.c +6
-0@@ -1009,6 +1009,12 @@ void board_init_f(ulong boot_flags) gd = &data;#endif +/* +* Zero gd_t first, otherwise the debug print in initcall_run_list +* function before zero_global_data is called will go wrong. +*/ +memset ((void *)gd,0 ,sizeof (gd_t)); +Yes, we need this. You should drop the
zero_global_data()or whatever currently does thememset()Quoted 13 lines
common/board_f.c +0
-0gd->flags = boot_flags;if (initcall_run_list (init_sequence_f))common/board_r.c +2
-0@@ -157,6 +157,13 @@ static int initr_reloc_global_data(void)*/ gd->env_addr += gd->relocaddr -CONFIG_SYS_MONITOR_BASE ;#endif +#ifdef CONFIG_NEEDS_MANUAL_RELOC +/*
Quoted 8 lines
common/board_r.c static int initr_reloc_global_data(void) · line 166
Quoted 5 lines
common/board_r.c +5
-0+* We have to relocate the command table manually +*/ +fixup_cmdtable (ll_entry_start (cmd_tbl_t, cmd), +ll_entry_count (cmd_tbl_t, cmd)); +#endif /* CONFIG_NEEDS_MANUAL_RELOC */ Should this be done here or in
main_loop()? How is this currently done when not using generic board?
Most of these operations appear in board_init_r() function, so we can not do this in main_loop(), otherwise we must get rid of this from all related board_init_r() functions.
Quoted 31 lines
Quoted 18 lines
common/board_r.c +3
-0return 0 ; }@@ -899,6 +906,7 @@ init_fnc_t init_sequence_r[] = { initr_modem, #endif run_main_loop, + NULL, };void board_init_r (gd_t *new_gd,ulong dest_addr)@@ -906,6 +914,15 @@ void board_init_r(gd_t *new_gd, ulong dest_addr)#ifndef CONFIG_X86 gd = new_gd;#endif +#ifdef CONFIG_NEEDS_MANUAL_RELOC +/* common/board_r.c void board_init_r(gd_t *new_gd, ulong dest_addr) · line 928
Quoted 10 lines
common/board_r.c +7
-0+* We have to relocate the init_sequence_r table manually +*/ +init_fnc_t *init_fnc_ptr; +for (init_fnc_ptr = init_sequence_r; *init_fnc_ptr; ++init_fnc_ptr) + *init_fnc_ptr = (init_fnc_t *)((unsigned long )(*init_fnc_ptr) + gd->reloc_off); +#endif /* CONFIG_NEEDS_MANUAL_RELOC */ +if (initcall_run_list (init_sequence_r))hang ();Regards,
Simon
PATCH v4 3/4 generic board patch of manual reloc and zero gd_t
In reply to Simon GlassQuoted 13 lines · Simon Glass
Hi David,
Quoted 10 lines · On Tue, Aug 20, 2013 at 4:48 AM, <[email protected]> wrote:
common/board_r.c +2
-0@@ -157,6 +157,13 @@ static int initr_reloc_global_data(void)*/ gd->env_addr += gd->relocaddr -CONFIG_SYS_MONITOR_BASE ;#endif +#ifdef CONFIG_NEEDS_MANUAL_RELOC +/*
Quoted 8 lines
common/board_r.c static int initr_reloc_global_data(void) · line 166
Quoted 5 lines
common/board_r.c +5
-0+* We have to relocate the command table manually +*/ +fixup_cmdtable (ll_entry_start (cmd_tbl_t, cmd), +ll_entry_count (cmd_tbl_t, cmd)); +#endif /* CONFIG_NEEDS_MANUAL_RELOC */ Should this be done here or in
main_loop()? How is this currently done when not using generic board?
It shouldn't be done at all -- let's not revive manual relocations. I'll try to get proper relocation working.
-Scott
PATCH v4 3/4 generic board patch of manual reloc and zero gd_t
Quoted 34 lines
-----????-----
???: "Scott Wood" <[email protected]>
????: 2013?8?22? ???
???: "Simon Glass" <[email protected]>
??: FengHua <[email protected]>, "trini at ti.com" <[email protected]>, "U-Boot
Mailing List" <[email protected]>
??: Re: [U-Boot] [PATCH v4 3/4] generic board patch of manual reloc and zerogd_tQuoted 13 lines · Simon Glass
Hi David,
Quoted 10 lines · On Tue, Aug 20, 2013 at 4:48 AM, <[email protected]> wrote:
common/board_r.c +2
-0@@ -157,6 +157,13 @@ static int initr_reloc_global_data(void)*/ gd->env_addr += gd->relocaddr -CONFIG_SYS_MONITOR_BASE ;#endif +#ifdef CONFIG_NEEDS_MANUAL_RELOC +/* Quoted 8 lines
common/board_r.c static int initr_reloc_global_data(void) · line 166
Quoted 5 lines
common/board_r.c +5
-0+* We have to relocate the command table manually +*/ +fixup_cmdtable (ll_entry_start (cmd_tbl_t, cmd), +ll_entry_count (cmd_tbl_t, cmd)); +#endif /* CONFIG_NEEDS_MANUAL_RELOC */ Should this be done here or in
main_loop()? How is this currently done when not using generic board?
Quoted 6 lines
It shouldn't be done at all -- let's not revive manual relocations. I'll try to get proper relocation working.
-Scott
Even the rela relocation of aarch64 works we should keep this here. The generic board could be used by any other platform that need manual relocation.
Quoted 1 line
PATCH v4 3/4 generic board patch of manual reloc and zero gd_t
Quoted 34 lines · FengHua
Quoted 34 lines
-----????????????-----
?????????: "Scott Wood" <[email protected]>
????????????: 2013???8???22??? ?????????
?????????: "Simon Glass" <[email protected]>
??????: FengHua <[email protected]>, "trini at ti.com" <[email protected]>, "U-Boot
Mailing List" <[email protected]>
??????: Re: [U-Boot] [PATCH v4 3/4] generic board patch of manual reloc and zerogd_tQuoted 21 lines · Simon Glass
Hi David,
Quoted 5 lines · On Tue, Aug 20, 2013 at 4:48 AM, <[email protected]> wrote:
common/board_r.c +0
-0common/board_r.c static int initr_reloc_global_data(void) · line 166
Quoted 10 lines
common/board_r.c +7
-0@@ -157,6 +157,13 @@ static int initr_reloc_global_data(void)*/ gd->env_addr += gd->relocaddr -CONFIG_SYS_MONITOR_BASE ;#endif +#ifdef CONFIG_NEEDS_MANUAL_RELOC +/* +* We have to relocate the command table manually +*/ +fixup_cmdtable (ll_entry_start (cmd_tbl_t, cmd), +ll_entry_count (cmd_tbl_t, cmd)); +#endif /* CONFIG_NEEDS_MANUAL_RELOC */ Should this be done here or in
main_loop()? How is this currently done when not using generic board?
Quoted 6 lines
Quoted 2 lines
It shouldn't be done at all -- let's not revive manual relocations. I'll try to get proper relocation working.
Even the rela relocation of aarch64 works we should keep this here. The generic board could be used by any other platform that need manual relocation.
No, the point is that manual relocation is legacy and new platforms should be using proper relocation.
Signature · 8 lines
Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 836 bytes Desc: Digital signature URL: <http://lists.denx.de/pipermail/u-boot/attachments/20130822/c50595dc/attachment.pgp>
PATCH v4 4/4 64bit initrd start address support
In reply to fenghua at phytium.com.cnFrom: David Feng <[email protected]>
This patch fix the fdt_initrd function.
It will get #adress_cells property fisrt, then write "linux,initrd-start" and "linux,initrd-end" property value to fdt according to address cell size such that the 64bit initrd start address could be supported.
--- common/fdt_support.c | 66 ++++++++++++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 32 deletions(-)
common/fdt_support.c +34 -32
@@ -21,6 +21,34 @@*/ DECLARE_GLOBAL_DATA_PTR ; +/* +* Get cells len in bytes +* if #NNNN-cells property is 2 then len is 8 +* otherwise len is 4 +*/ +static int get_cells_len (void *blob,char *nr_cells_name) +{ +const fdt32_t *cell; + + cell =fdt_getprop (blob,0 , nr_cells_name,NULL ); +if (cell &&fdt32_to_cpu (*cell) ==2 ) +return 8 ; + +return 4 ; +} + +/* +* Write a 4 or 8 byte big endian cell +*/ +static void write_cell (u8 *addr,u64 val,int size) +{ +int shift = (size -1 ) *8 ; +while (size-- >0 ) { + *addr++ = (val >> shift) &0xff ; + shift -=8 ; + } +} +/** * fdt_getprop_u32_default - Find a node and return it's property or a default *
@@ -131,9 +159,9 @@ static int fdt_fixup_stdout(void *fdt, int chosenoff)int fdt_initrd (void *fdt,ulong initrd_start,ulong initrd_end,int force) { -int nodeoffset; +int nodeoffset, addr_cell_len;int err, j, total; -fdt32_t tmp; +fdt64_t tmp;const char *path;uint64_t addr, size;
@@ -170,9 +198,11 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)return err; } + addr_cell_len =get_cells_len (fdt,"#address-cells" ); + path =fdt_getprop (fdt, nodeoffset,"linux,initrd-start" ,NULL );if ((path ==NULL ) || force) { - tmp =cpu_to_fdt32 (initrd_start); +write_cell ((u8 *)&tmp, initrd_start, addr_cell_len); err =fdt_setprop (fdt, nodeoffset,"linux,initrd-start" , &tmp,sizeof (tmp));if (err <0 ) {
@@ -181,7 +211,7 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force) fdt_strerror(err));return err; } - tmp =cpu_to_fdt32 (initrd_end); +write_cell ((u8 *)&tmp, initrd_end, addr_cell_len); err =fdt_setprop (fdt, nodeoffset,"linux,initrd-end" , &tmp,sizeof (tmp));if (err <0 ) {
@@ -343,34 +373,6 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat,do_fixup_by_compat (fdt, compat, prop, &tmp,4 , create); } -/* -* Get cells len in bytes -* if #NNNN-cells property is 2 then len is 8 -* otherwise len is 4 -*/ -static int get_cells_len (void *blob,char *nr_cells_name) -{ -const fdt32_t *cell; - - cell =fdt_getprop (blob,0 , nr_cells_name,NULL ); -if (cell &&fdt32_to_cpu (*cell) ==2 ) -return 8 ; - -return 4 ; -} - -/* -* Write a 4 or 8 byte big endian cell -*/ -static void write_cell (u8 *addr,u64 val,int size) -{ -int shift = (size -1 ) *8 ; -while (size-- >0 ) { - *addr++ = (val >> shift) &0xff ; - shift -=8 ; - } -} -#ifdef CONFIG_NR_DRAM_BANKS #define MEMORY_BANKS_MAX CONFIG_NR_DRAM_BANKS#else
Signature · 1 line
1.7.9.5