[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