diff mbox

[U-Boot] porting u-boot, few final questions

Message ID CAOMZO5Cum=pEtGvOk3x1SrpuGSt=BreNGG7A8xhotFyJP41BJA@mail.gmail.com
State Not Applicable
Headers show

Commit Message

Fabio Estevam Nov. 10, 2014, 4:04 p.m. UTC
On Mon, Nov 10, 2014 at 1:47 PM, Wolfgang Denk <wd@denx.de> wrote:
> Dear Fabio Estevam,
>
> In message <CAOMZO5AiJtDt_CZrO6gzU=JiPp_2-etPiGFcK7ZhFhNNzxp3_A@mail.gmail.com> you wrote:
>>
>> > 1. How come setenv is not working in the board file? I tried setenv in
>> > different locations of board_early_init_f(), board_init(), board_late_init()
>> > and checkboard(), but it's not working. Did something change?
>>
>> Haven't tried it, but if this does not work, then it is a bug that
>> needs to be fixed. Do you have access to a mx53 qsb board? Does it
>> work there?
>
> Suffix _f trditionally means "running from flash", i. e. this is
> before relocation to RAM. Here we have usually only a read-ony data
> segment, no BSS at all, and only limted stack.  All complicated stuff
> like setenv is only supposed to be available after relocation.

Just tested on real hardware and the below change works:

>
>> On mx6 we have several boards calling setenv from the board files.
>
> Actual behaviour is hardware-dependent, but it's better not to make
> any such guesses.

Yes, but not sure how a mx6 can differ from a mx5 in getting setenv to work.

Comments

Nikolay Dimitrov Nov. 10, 2014, 5:54 p.m. UTC | #1
Hi gents,

On 11/10/2014 06:04 PM, Fabio Estevam wrote:
> On Mon, Nov 10, 2014 at 1:47 PM, Wolfgang Denk <wd@denx.de> wrote:
>> Dear Fabio Estevam,
>>
>> In message <CAOMZO5AiJtDt_CZrO6gzU=JiPp_2-etPiGFcK7ZhFhNNzxp3_A@mail.gmail.com> you wrote:
>>>
>>>> 1. How come setenv is not working in the board file? I tried setenv in
>>>> different locations of board_early_init_f(), board_init(), board_late_init()
>>>> and checkboard(), but it's not working. Did something change?
>>>
>>> Haven't tried it, but if this does not work, then it is a bug that
>>> needs to be fixed. Do you have access to a mx53 qsb board? Does it
>>> work there?
>>
>> Suffix _f trditionally means "running from flash", i. e. this is
>> before relocation to RAM. Here we have usually only a read-ony data
>> segment, no BSS at all, and only limted stack.  All complicated stuff
>> like setenv is only supposed to be available after relocation.
>
> Just tested on real hardware and the below change works:
>
> --- a/board/freescale/mx53loco/mx53loco.c
> +++ b/board/freescale/mx53loco/mx53loco.c
> @@ -404,6 +404,12 @@ int board_late_init(void)
>          return 0;
>   }
>
> +int misc_init_r(void)
> +{
> +       setenv("myvar", "123456");
> +       return 0;
> +}
> +
>   int checkboard(void)
>   {
>          puts("Board: MX53 LOCO\n");
> diff --git a/include/configs/mx53loco.h b/include/configs/mx53loco.h
> index a74508c..8f692d7 100644
> --- a/include/configs/mx53loco.h
> +++ b/include/configs/mx53loco.h
> @@ -29,6 +29,7 @@
>
>   #define CONFIG_BOARD_EARLY_INIT_F
>   #define CONFIG_BOARD_LATE_INIT
> +#define CONFIG_MISC_INIT_R
>   #define CONFIG_MXC_GPIO
>   #define CONFIG_REVISION_TAG
>
>>
>>> On mx6 we have several boards calling setenv from the board files.
>>
>> Actual behaviour is hardware-dependent, but it's better not to make
>> any such guesses.
>
> Yes, but not sure how a mx6 can differ from a mx5 in getting setenv to work.

Please correct me if I'm wrong, but setting env-vars shouldn't work
before the environment is initialized. This initialization happens when
the initr_env() is called according the order in init_sequence_r[].

@Dave - the easiest way to verify when your code (which tries to work
with the env-vars) is executed and when the actual environment is
initialized, is to enable debugging in
lib/initcall.c:initcall_run_list(), see the pointers of the called
functions and check them in the System.map. The env is initialized in
the call tree below initr_env(), so your code should use the env after
that.

Regards,
Nikolay
DaveKucharczyk Nov. 10, 2014, 8:45 p.m. UTC | #2
Update: my board_late_init() function wasn’t working because I defined
BOARD_LATE_INIT instead of CONFIG_BOARD_LATE_INIT. Doh!

Since arch/arm/lib/board.c file is being removed, and when
CONFIG_SYS_GENERIC_BOARD is defined, we are now using…
common/board_f.c (for pre-relocation init)
common/board_r.c (for post-relocation init)

So my board file sequence is (in order of calling sequence according to the
above two files)…

1.	board_early_init_f() – needed to setup my uart, otherwise early output is
missed
2.	checkboard() – print board info - still in flash
3.	board_init() – says chipselects should be setup here – we are running
from RAM now
4.	initr_env() is called here
5.	board_late_init() - 

Nikolay, appears you are correct, initr_env must be called first in order to
use setenv. That’s why setenv didn’t work in board_early_init_f or
checkboard or board_init. 

Fabio, your change worked when I use setenv in misc_init_r and helped me
debug some issues. Thanks guys. 

Is there a doc or a good read that explains which init functions are
necessary for what? Or which ones should be used for “proper” design? 

I’m sure I’ll be back with more questions real soon. :)




--
View this message in context: http://u-boot.10912.n7.nabble.com/porting-u-boot-MMU-question-tp194761p195451.html
Sent from the U-Boot mailing list archive at Nabble.com.
DaveKucharczyk Nov. 10, 2014, 10:21 p.m. UTC | #3
So I am having another issue probably more related to computer science
fundamentals. 

I have a global variable boot_dev defined in my board file like so... 

I define boot_device in arch/arm/include/asm/arch-mx5/sys_proto.h like this…

Now, boot_dev returns the correct value in checkboard(), but returns 0 when
called from any other function.

board_early_init_f() – we set boot_dev
checkboard() – we print it and works fine, prints 6 (SD_BOOT)
board_init() – prints 0 here
board_late_init() - prints 0 here

So…boot_dev is not set anywhere else except board_early_init_f(), then it
prints ok in checkboard(), but then it gets set to 0 somehow. Anyone know
why this could be? Checkboard() runs from flash and the others run from RAM.
Can that have something to do with it?




--
View this message in context: http://u-boot.10912.n7.nabble.com/porting-u-boot-MMU-question-tp194761p195488.html
Sent from the U-Boot mailing list archive at Nabble.com.
DaveKucharczyk Nov. 11, 2014, 5:39 p.m. UTC | #4
So the issues of the variables changing were due to me initializing
everything in board_early_init_f(). I moved everything out of it except uart
setup. If I setup the uart in board_init() instead of board_early_init_f()
then the early cpu info stuff is missed. I guess there’s an opportunity for
improvement there.

I still have a question pertaining to the changing variables though. It has
to do with pre and post relocation. Variables declared in functions
pre-reloc will be different when used in functions post-reloc.

For instance. If I set a variable in board_early_init_f() and then, without
changing it, print it in board_late_init() then it will be different. 

So my question is how can I get around this?

This is where I’m stuck…

I’m trying to write the reset cause to SRAM in board_late_init(). The reset
cause is printed early by default when defining CONFIG_DISPLAY_CPUINFO in
the header file. 

When I access the register in board_late_init() it prints 0, which is wrong.

I tried…

and this(which is what arch/arm/imx-common/cpu.c uses to print reset cause)…

All return 0 when called in board_late_init() even though at startup the
correct reset cause is displayed, but I have to write it to SRAM later on.
And by that time it's 0. 

I think this has to do with what Wolfgang said about ds, bss, and stack, but
if someone can shed some light that would be great. :) Thanks




--
View this message in context: http://u-boot.10912.n7.nabble.com/porting-u-boot-MMU-question-tp194761p195618.html
Sent from the U-Boot mailing list archive at Nabble.com.
diff mbox

Patch

--- a/board/freescale/mx53loco/mx53loco.c
+++ b/board/freescale/mx53loco/mx53loco.c
@@ -404,6 +404,12 @@  int board_late_init(void)
        return 0;
 }

+int misc_init_r(void)
+{
+       setenv("myvar", "123456");
+       return 0;
+}
+
 int checkboard(void)
 {
        puts("Board: MX53 LOCO\n");
diff --git a/include/configs/mx53loco.h b/include/configs/mx53loco.h
index a74508c..8f692d7 100644
--- a/include/configs/mx53loco.h
+++ b/include/configs/mx53loco.h
@@ -29,6 +29,7 @@ 

 #define CONFIG_BOARD_EARLY_INIT_F
 #define CONFIG_BOARD_LATE_INIT
+#define CONFIG_MISC_INIT_R
 #define CONFIG_MXC_GPIO
 #define CONFIG_REVISION_TAG