[U-Boot] [PATCH v1 6/8] avr32: add generic board support
Simon Glass
sjg at chromium.org
Wed Jan 28 04:09:16 CET 2015
Hi,
On 27 January 2015 at 17:16, Andreas Bießmann
<andreas.devel at googlemail.com> wrote:
> Signed-off-by: Andreas Bießmann <andreas.devel at 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
More information about the U-Boot
mailing list