Signed-off-by: Andreas Bießmann <andreas.de...@googlemail.com>
---

 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                |   22 ++++++++++++++++++++--
 include/asm-generic/u-boot.h    |    4 ++++
 9 files changed, 54 insertions(+), 5 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 3a4b32c..b5eb81e 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;
@@ -906,7 +913,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..4d2000d 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -459,6 +459,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 +512,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 +801,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,7 +839,7 @@ 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
@@ -894,6 +907,11 @@ void board_init_r(gd_t *new_gd, ulong dest_addr)
        int i;
 #endif
 
+#ifdef CONFIG_AVR32
+       extern void mmu_init_r(unsigned long);
+       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 */
-- 
1.7.10.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to