All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heiko Schocher <hs@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] arm, davinci: make arch_cpu_init() in da850_lowlevel.c weak
Date: Wed, 09 Nov 2011 13:18:09 +0100	[thread overview]
Message-ID: <4EBA6F81.2060400@denx.de> (raw)
In-Reply-To: <CABkLObpFd6UwA5LHueG-tHLQ2UYYoekWwsF0onmzFGZDfAc9SA@mail.gmail.com>

Hello Christian,

Christian Riesch wrote:
> Hello Wolfgang,
> 
> On Wed, Nov 9, 2011 at 11:44 AM, Wolfgang Denk <wd@denx.de> wrote:
>> In message <CABkLObpuzibrEef+8EKKqTgyYcyTeC2qMx2UM1GqkzX--K3jLQ@mail.gmail.com> you wrote:
>>>> All this needs a _thorough_ cleanup before I'm willing to accept this
>>>> for mainline.
>>> This is already in mainline, see
>> Indeed.  What a pity.
>>
>> Anyway.  We should clean it up first, before attempting any other
>> changes.
>>
>>
>> I don't understand yet what your exact requirements are - can you
>> confirm that my assumption is correct that you can do without the
>> "weak" if the hardwired constants in this fle get replaced by symbolic
>> names that can be set from the board config file?
> 
> I'll comment on the code that is currently in u-boot-arm:arch
> /arm/cpu/arm926ejs/davinci/da850_lowlevel.c
> 
>  263 #if defined(CONFIG_NAND_SPL)
> 
> I guess this will become obsolete soon, in the new SPL framework this
> should be done in another way, right?

Yes. I prefer actually to remove the old NAND_SPL style complete
in this cleanup step, because nobody is using it yet. And if
someone use this code for SPL, it must be adapted.

>  264 void board_init_f(ulong bootflag)
>  265 #else
>  266 int arch_cpu_init(void)
>  267 #endif
>  268 {
>  269         /*
>  270          * copied from arch/arm/cpu/arm926ejs/start.S
>  271          *
>  272          * flush v4 I/D caches
>  273          */
>  274         asm("mov        r0, #0");
>  275         asm("mcr        p15, 0, r0, c7, c7, 0");        /* flush
> v3/v4 cache */
>  276         asm("mcr        p15, 0, r0, c8, c7, 0");        /* flush v4 TLB */
>  277
>  278         /*
>  279          * disable MMU stuff and caches
>  280          */
>  281         asm("mrc        p15, 0, r0, c1, c0, 0");
>  282         /* clear bits 13, 9:8 (--V- --RS) */
>  283         asm("bic        r0, r0, #0x00002300");
>  284         /* clear bits 7, 2:0 (B--- -CAM) */
>  285         asm("bic        r0, r0, #0x00000087");
>  286         /* set bit 2 (A) Align */
>  287         asm("orr        r0, r0, #0x00000002");
>  288         /* set bit 12 (I) I-Cache */
>  289         asm("orr        r0, r0, #0x00001000");
>  290         asm("mcr        p15, 0, r0, c1, c0, 0");
>  291
> 
> Heiko, why do we need this? I noticed, that u-boot takes longer to
> start when I remove this code.

We need it, because we have defined CONFIG_SKIP_LOWLEVEL_INIT
(at least for the enbw_cmc board), and this is a copy from
arch/arm/cpu/arm926ejs/start.S ... I tend to change
arch/arm/cpu/arm926ejs/start.S, so we always execute
this code from arch/arm/cpu/arm926ejs/start.S and don't
need it here anymore:

diff --git a/arch/arm/cpu/arm926ejs/start.S b/arch/arm/cpu/arm926ejs/start.S
index 339c5ed..73ceb30 100644
--- a/arch/arm/cpu/arm926ejs/start.S
+++ b/arch/arm/cpu/arm926ejs/start.S
@@ -353,7 +353,6 @@ _dynsym_start_ofs:
  *
  *************************************************************************
  */
-#ifndef CONFIG_SKIP_LOWLEVEL_INIT
 cpu_init_crit:
        /*
         * flush v4 I/D caches
@@ -372,14 +371,15 @@ cpu_init_crit:
        orr     r0, r0, #0x00001000     /* set bit 12 (I) I-Cache */
        mcr     p15, 0, r0, c1, c0, 0

+#ifndef CONFIG_SKIP_LOWLEVEL_INIT
        /*
         * Go setup Memory and board specific bits prior to relocation.
         */
        mov     ip, lr          /* perserve link reg across call */
        bl      lowlevel_init   /* go setup pll,mux,memory */
        mov     lr, ip          /* restore link */
-       mov     pc, lr          /* back to my caller */
 #endif /* CONFIG_SKIP_LOWLEVEL_INIT */
+       mov     pc, lr          /* back to my caller */

 #ifndef CONFIG_SPL_BUILD
 /*

Albert, what do you think? Do you see some problems against this?

> 
>  292         /* Unlock kick registers */
>  293         writel(0x83e70b13, &davinci_syscfg_regs->kick0);
>  294         writel(0x95a4f1e0, &davinci_syscfg_regs->kick1);
>  295
> 
> hawkboard has two defines HAWKBOARD_KICK0_UNLOCK and
> HAWKBOARD_KICK1_UNLOCK for these magic numbers. Maybe we should rename
> them because they are not HAWKBOARD specific and use them?
> see board/davinci/da8xxevm/hawkboard.c

added this defines to arch/arm/include/asm/arch-davinci/hardware.h

>  296         dv_maskbits(&davinci_syscfg_regs->suspsrc,
>  297                 ((1 << 27) | (1 << 22) | (1 << 20) | (1 << 5) |
> (1 << 16)));
>  298
> 
> This is done in a nicer way in board/davinci/da8xxevm/da850evm.c
> I wonder if these settings work for all boards or if any boards wound
> need different settings here.

Changed this. You need now a CONFIG_SYS_DA850_SYSCFG_SUSPSRC
in your board config.

> 
>  299         /* Setup Pinmux */
>  300         da850_pinmux_ctl(0, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX0);
>  301         da850_pinmux_ctl(1, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX1);
>  302         da850_pinmux_ctl(2, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX2);
>  303         da850_pinmux_ctl(3, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX3);
>  304         da850_pinmux_ctl(4, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX4);
>  305         da850_pinmux_ctl(5, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX5);
>  306         da850_pinmux_ctl(6, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX6);
>  307         da850_pinmux_ctl(7, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX7);
>  308         da850_pinmux_ctl(8, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX8);
>  309         da850_pinmux_ctl(9, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX9);
>  310         da850_pinmux_ctl(10, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX10);
>  311         da850_pinmux_ctl(11, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX11);
>  312         da850_pinmux_ctl(12, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX12);
>  313         da850_pinmux_ctl(13, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX13);
>  314         da850_pinmux_ctl(14, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX14);
>  315         da850_pinmux_ctl(15, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX15);
>  316         da850_pinmux_ctl(16, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX16);
>  317         da850_pinmux_ctl(17, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX17);
>  318         da850_pinmux_ctl(18, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX18);
>  319         da850_pinmux_ctl(19, 0xFFFFFFFF, CONFIG_SYS_DA850_PINMUX19);
>  320
> 
> I could do with this code and setting my custom PINMUX constants.
> However, the da850evm uses a different way of configuring pinmux, so
> we have a duplication of code here. I'd prefer the da850evm way
> because the code is still readable when you don't use the TI tool
> mentioned by Heiko in [1] (I was not aware of this tool, thanks for
> the hint, Heiko!).

I prefer it this way, but as I said, if we come to the result
to use it like the da850evm way, it is ok with me.

>  321         /* PLL setup */
>  322         da850_pll_init(davinci_pllc0_regs, CONFIG_SYS_DA850_PLL0_PLLM);
>  323         da850_pll_init(davinci_pllc1_regs, CONFIG_SYS_DA850_PLL1_PLLM);
> 
> On my board I need to determine the hardware revision first and then
> set the values of CONFIG_SYS_DA850_PLL0_PLLM and
> CONFIG_SYS_DA850_PLL1_PLLM accordingly. But maybe I could uses
> something like
> 
> #define CONFIG_SYS_DA850_PLL1_PLLM board_get_pllm1()
> 
> and write a function that reads the board revision...

Maybe this is a way to prevent the weak function, yes.

>  324
>  325         /* GPIO setup */
>  326         board_gpio_init();
> 
> Why is this done here? For SPL? Will this change when the code moves
> to the new framework? I don't need GPIOs here.

If you don't need this code, do nothing. The weak function for this is
a dummy function. Maybe boards will use gpios early, as I use this on
the enbw_cmc board.

>  328         /* setup CSn config */
>  329         writel(CONFIG_SYS_DA850_CS2CFG, &davinci_emif_regs->ab1cr);
>  330         writel(CONFIG_SYS_DA850_CS3CFG, &davinci_emif_regs->ab2cr);
>  331
> 
> Ok for NAND, but how about a board that uses SPI flash? It should be
> possible to chose whether to initialize CSn.

We could check if CONFIG_SYS_DA850_CS2CFG/CONFIG_SYS_DA850_CS3CFG
is defined, and if not, dont init the register.

>  332         lpsc_on(DAVINCI_LPSC_UART2);
>  333         NS16550_init((NS16550_t)(CONFIG_SYS_NS16550_COM1),
>  334                         CONFIG_SYS_NS16550_CLK / 16 / CONFIG_BAUDRATE);
>  335
>  336         /*
>  337          * Fix Power and Emulation Management Register
>  338          * see sprufw3a.pdf page 37 Table 24
>  339          */
>  340         writel(readl((CONFIG_SYS_NS16550_COM1 + 0x30)) | 0x00006001,
>  341                 (CONFIG_SYS_NS16550_COM1 + 0x30));
> 
> I guess this is only needed for debugging the SPL?

This must be done before using the uart as a console, and I think
this should be done in common code as early as possible.

>  342 #if defined(CONFIG_NAND_SPL)
>  343         puts("ddr init\n");
>  344         da850_ddr_setup(132);
>  345
>  346         puts("boot u-boot ...\n");
>  347
>  348         nand_boot();
>  349 #else
>  350         da850_ddr_setup(132);
> 
> Ok for my board. But how about boards that use SDRAM on EMIFA instead
> (if there are any)?

As no boards use this code except the new enbw_cmc port, there
are no such boards ... if somebody want to use this feature, it
must be adapted here, yes.

bye,
Heiko
-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

  reply	other threads:[~2011-11-09 12:18 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-09  9:23 [U-Boot] [PATCH] arm, davinci: make arch_cpu_init() in da850_lowlevel.c weak Christian Riesch
2011-11-09 10:12 ` Wolfgang Denk
2011-11-09 10:18   ` Christian Riesch
2011-11-09 10:44     ` Wolfgang Denk
2011-11-09 11:17       ` Christian Riesch
2011-11-09 12:18         ` Heiko Schocher [this message]
2011-11-10 12:24           ` Christian Riesch
2011-11-09 10:44   ` Heiko Schocher
2011-11-09 11:26     ` Christian Riesch
2011-11-09 12:27       ` Heiko Schocher
2011-11-10 10:42         ` Christian Riesch

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4EBA6F81.2060400@denx.de \
    --to=hs@denx.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.