Hi, On 27 January 2015 at 17:16, Andreas Bießmann <andreas.de...@googlemail.com> wrote: > Signed-off-by: Andreas Bießmann <andreas.de...@googlemail.com> > --- > > Changes in v1: > - add timer_init in board_r > - remove extern declaration of mmu_init_r() > > arch/avr32/config.mk | 3 +++ > arch/avr32/cpu/u-boot.lds | 2 ++ > arch/avr32/include/asm/config.h | 1 + > arch/avr32/include/asm/u-boot.h | 7 +++++++ > arch/avr32/lib/Makefile | 2 ++ > arch/avr32/lib/interrupts.c | 5 +++++ > common/board_f.c | 13 ++++++++++--- > common/board_r.c | 26 +++++++++++++++++++++++--- > include/asm-generic/u-boot.h | 4 ++++ > 9 files changed, 57 insertions(+), 6 deletions(-) > > diff --git a/arch/avr32/config.mk b/arch/avr32/config.mk > index 469185e..8252f59 100644 > --- a/arch/avr32/config.mk > +++ b/arch/avr32/config.mk > @@ -9,6 +9,9 @@ ifeq ($(CROSS_COMPILE),) > CROSS_COMPILE := avr32-linux- > endif > > +# avr32 has generic board support > +__HAVE_ARCH_GENERIC_BOARD := y > + > CONFIG_STANDALONE_LOAD_ADDR ?= 0x00000000 > > PLATFORM_RELFLAGS += -ffixed-r5 -fPIC -mno-init-got -mrelax > diff --git a/arch/avr32/cpu/u-boot.lds b/arch/avr32/cpu/u-boot.lds > index cb29a22..b0180e3 100644 > --- a/arch/avr32/cpu/u-boot.lds > +++ b/arch/avr32/cpu/u-boot.lds > @@ -48,9 +48,11 @@ SECTIONS > _edata = .; > > .bss (NOLOAD) : { > + __bss_start = .; > *(.bss) > *(.bss.*) > } > . = ALIGN(8); > __bss_end = .; > + __init_end = .; > } > diff --git a/arch/avr32/include/asm/config.h b/arch/avr32/include/asm/config.h > index 63056a4..529fe22 100644 > --- a/arch/avr32/include/asm/config.h > +++ b/arch/avr32/include/asm/config.h > @@ -8,5 +8,6 @@ > #define _ASM_CONFIG_H_ > > #define CONFIG_NEEDS_MANUAL_RELOC > +#define CONFIG_SYS_GENERIC_GLOBAL_DATA > > #endif > diff --git a/arch/avr32/include/asm/u-boot.h b/arch/avr32/include/asm/u-boot.h > index 2387f8a..0f7dddd 100644 > --- a/arch/avr32/include/asm/u-boot.h > +++ b/arch/avr32/include/asm/u-boot.h > @@ -6,6 +6,11 @@ > #ifndef __ASM_U_BOOT_H__ > #define __ASM_U_BOOT_H__ 1 > > +#ifdef CONFIG_SYS_GENERIC_BOARD > +/* Use the generic board which requires a unified bd_info */ > +#include <asm-generic/u-boot.h> > +#else > + > typedef struct bd_info { > unsigned char bi_phy_id[4]; > unsigned long bi_board_number; > @@ -22,6 +27,8 @@ typedef struct bd_info { > #define bi_memstart bi_dram[0].start > #define bi_memsize bi_dram[0].size > > +#endif > + > /* For image.h:image_check_target_arch() */ > #define IH_ARCH_DEFAULT IH_ARCH_AVR32 > > diff --git a/arch/avr32/lib/Makefile b/arch/avr32/lib/Makefile > index bb45cbe..d5cb8b2 100644 > --- a/arch/avr32/lib/Makefile > +++ b/arch/avr32/lib/Makefile > @@ -8,6 +8,8 @@ > # > > obj-y += memset.o > +ifndef CONFIG_SYS_GENERIC_BOARD > obj-y += board.o > +endif > obj-$(CONFIG_CMD_BOOTM) += bootm.o > obj-y += interrupts.o > diff --git a/arch/avr32/lib/interrupts.c b/arch/avr32/lib/interrupts.c > index bacb2d1..5f3a49e 100644 > --- a/arch/avr32/lib/interrupts.c > +++ b/arch/avr32/lib/interrupts.c > @@ -7,6 +7,11 @@ > > #include <asm/sysreg.h> > > +int interrupt_init(void) > +{ > + return 0; > +} > + > void enable_interrupts(void) > { > asm volatile("csrf %0" : : "n"(SYSREG_GM_OFFSET)); > diff --git a/common/board_f.c b/common/board_f.c > index 215108b..1a735ae 100644 > --- a/common/board_f.c > +++ b/common/board_f.c > @@ -174,7 +174,7 @@ static int announce_dram_init(void) > return 0; > } > > -#if defined(CONFIG_MIPS) || defined(CONFIG_PPC) > +#if defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_AVR32) > static int init_func_ram(void) > { > #ifdef CONFIG_BOARD_TYPES > @@ -268,6 +268,8 @@ static int setup_mon_len(void) > gd->mon_len = (ulong)&_end - (ulong)_init; > #elif defined(CONFIG_BLACKFIN) || defined(CONFIG_NIOS2) > gd->mon_len = CONFIG_SYS_MONITOR_LEN; > +#elif defined(CONFIG_AVR32) > + gd->mon_len = (ulong)&__bss_end - (ulong)&_text;
Would we be able to unify the symbols here rather than having a special case for AVR32? > #else > /* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */ > gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; > @@ -581,7 +583,7 @@ static int reserve_stacks(void) > gd->irq_sp = gd->start_addr_sp; > # endif > #else > -# ifdef CONFIG_PPC > +# if defined(CONFIG_PPC) || defined(CONFIG_AVR32) > ulong *s; > # endif > > @@ -611,6 +613,11 @@ static int reserve_stacks(void) > s = (ulong *) gd->start_addr_sp; > *s = 0; /* Terminate back chain */ > *++s = 0; /* NULL return address */ > +# elif defined(CONFIG_AVR32) > + gd->arch.stack_end = gd->start_addr_sp; > + s = (ulong *)gd->start_addr_sp; > + *s = 0; > + *--s = 0; Can we create an arch_reserve_stacks() function to handle this, and put it in the AVR32 code? > # endif /* Architecture specific code */ > > return 0; > @@ -912,7 +919,7 @@ static init_fnc_t init_sequence_f[] = { > #if defined(CONFIG_ARM) || defined(CONFIG_X86) > dram_init, /* configure available RAM banks */ > #endif > -#if defined(CONFIG_MIPS) || defined(CONFIG_PPC) > +#if defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_AVR32) > init_func_ram, Can you use dram_init() instead? > #endif > #ifdef CONFIG_POST > diff --git a/common/board_r.c b/common/board_r.c > index e712902..3620438 100644 > --- a/common/board_r.c > +++ b/common/board_r.c > @@ -55,6 +55,9 @@ > #include <dm/root.h> > #include <linux/compiler.h> > #include <linux/err.h> > +#ifdef CONFIG_AVR32 > +#include <asm/arch/mmu.h> > +#endif What needs this? Let's move it into AVR32 code. > > DECLARE_GLOBAL_DATA_PTR; > > @@ -459,6 +462,16 @@ static int initr_env(void) > return 0; > } > > +#ifdef CONFIG_SYS_BOOTPARAMS_LEN > +static int initr_malloc_bootparams(void) > +{ > + gd->bd->bi_boot_params = (ulong)malloc(CONFIG_SYS_BOOTPARAMS_LEN); > + if (!gd->bd->bi_boot_params) > + puts("WARNING: Cannot allocate space for boot parameters\n"); > + return 0; > +} Shouldn't this be an error? If so: return -ENOMEM > +#endif > + > #ifdef CONFIG_SC3 > /* TODO: with new initcalls, move this into the driver */ > extern void sc3_read_eeprom(void); > @@ -502,7 +515,7 @@ static int show_model_r(void) > #endif > > /* enable exceptions */ > -#ifdef CONFIG_ARM > +#if defined(CONFIG_ARM) || defined(CONFIG_AVR32) > static int initr_enable_interrupts(void) > { > enable_interrupts(); > @@ -791,6 +804,9 @@ init_fnc_t init_sequence_r[] = { > initr_dataflash, > #endif > initr_env, > +#ifdef CONFIG_SYS_BOOTPARAMS_LEN > + initr_malloc_bootparams, > +#endif > INIT_FUNC_WATCHDOG_RESET > initr_secondary_cpu, > #ifdef CONFIG_SC3 > @@ -826,10 +842,10 @@ init_fnc_t init_sequence_r[] = { > initr_kgdb, > #endif > interrupt_init, > -#if defined(CONFIG_ARM) > +#if defined(CONFIG_ARM) || defined(CONFIG_AVR32) > initr_enable_interrupts, > #endif > -#ifdef CONFIG_X86 > +#if defined(CONFIG_X86) || defined(CONFIG_AVR32) > timer_init, /* initialize timer */ > #endif > #if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT) > @@ -894,6 +910,10 @@ void board_init_r(gd_t *new_gd, ulong dest_addr) > int i; > #endif > > +#ifdef CONFIG_AVR32 > + mmu_init_r(dest_addr); > +#endif What does this do? It feels like it shold perhaps happen in the init sequence. See x86 which has a similar requirement, or at least I think it is similar. The objective ultimately is to remove all #ifdefs from board_f/r.c. > + > #if !defined(CONFIG_X86) && !defined(CONFIG_ARM) && !defined(CONFIG_ARM64) > gd = new_gd; > #endif > diff --git a/include/asm-generic/u-boot.h b/include/asm-generic/u-boot.h > index aef39d7..a63a87a 100644 > --- a/include/asm-generic/u-boot.h > +++ b/include/asm-generic/u-boot.h > @@ -32,6 +32,10 @@ typedef struct bd_info { > unsigned long bi_flashoffset; /* reserved area for startup monitor > */ > unsigned long bi_sramstart; /* start of SRAM memory */ > unsigned long bi_sramsize; /* size of SRAM memory */ > +#ifdef CONFIG_AVR32 > + unsigned char bi_phy_id[4]; /* PHY address for ATAG_ETHERNET */ > + unsigned long bi_board_number;/* ATAG_BOARDINFO */ > +#endif > #ifdef CONFIG_ARM > unsigned long bi_arm_freq; /* arm frequency */ > unsigned long bi_dsp_freq; /* dsp core frequency */ > -- > 1.7.10.4 > Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot