Message ID | 1422404166-6898-7-git-send-email-andreas.devel@googlemail.com |
---|---|
State | Changes Requested, archived |
Delegated to: | Andreas Bießmann |
Headers | show |
Hi Simon, On 01/28/2015 04:09 AM, Simon Glass wrote: > Hi, > > On 27 January 2015 at 17:16, Andreas Bießmann > <andreas.devel@googlemail.com> wrote: >> Signed-off-by: Andreas Bießmann <andreas.devel@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/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? well, I'm not __ARM__ nor CONFIG_SANDBOX, CONFIG_BLACKFIN or CONFIG_NIOS2. The else path may fit, I'll check that. >> #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? I'll do so. > >> # 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? I have to check that. Can we do that later when we convert mips/ppc? I fear it is a bit complex. >> #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. The mmu_init_r needs this. I dunno where to place it. ARM has the TLB setup before activating d-caches (in initr_caches). This is not required for avr32 and therefore not the right place. >> @@ -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. can you point me to the x86 code? > The objective ultimately is to remove all #ifdefs from board_f/r.c. That's clear to me. I thought we can first gather all the stuff in common/board_* and in a second turn we clean it up. Obvious things cleaned up before, but questionnaire things are cleaned up in a second turn. At least this was my objective ;) Best regards Andreas Bießmann
Hi Andreas, On 28 January 2015 at 03:04, Andreas Bießmann <andreas.devel@googlemail.com> wrote: > Hi Simon, > > On 01/28/2015 04:09 AM, Simon Glass wrote: >> Hi, >> >> On 27 January 2015 at 17:16, Andreas Bießmann >> <andreas.devel@googlemail.com> wrote: >>> Signed-off-by: Andreas Bießmann <andreas.devel@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/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? > > well, I'm not __ARM__ nor CONFIG_SANDBOX, CONFIG_BLACKFIN or > CONFIG_NIOS2. The else path may fit, I'll check that. > >>> #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? > > I'll do so. > >> >>> # 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? > > I have to check that. Can we do that later when we convert mips/ppc? I > fear it is a bit complex. Later is fine if this doesn't work. But if every arch uses another arch as an excuse not to clean up no one will get there :-) > >>> #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. > > The mmu_init_r needs this. I dunno where to place it. ARM has the TLB > setup before activating d-caches (in initr_caches). This is not required > for avr32 and therefore not the right place. OK, then maybe we need to add this as a new method that any arch can use? I'm wondering whether we should (later) have the concept of an arch 'driver', with methods for all of these things. > >>> @@ -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. > > can you point me to the x86 code? I was thinking of init_cache_f_r(). Is that similar to what you want? > >> The objective ultimately is to remove all #ifdefs from board_f/r.c. > > That's clear to me. I thought we can first gather all the stuff in > common/board_* and in a second turn we clean it up. Obvious things > cleaned up before, but questionnaire things are cleaned up in a second > turn. At least this was my objective ;) Sounds good. I suppose the immediate objective is to get everything in generic board, but we should clean it up soon. Regards, Simon
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; #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; # 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, #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 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; +} +#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 + #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 */
Signed-off-by: Andreas Bießmann <andreas.devel@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(-)