[U-Boot] [PATCH v1 6/8] avr32: add generic board support

Simon Glass sjg at chromium.org
Wed Jan 28 17:34:52 CET 2015


Hi Andreas,

On 28 January 2015 at 03:04, Andreas Bießmann
<andreas.devel at 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 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/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


More information about the U-Boot mailing list