Hello Simon, Tom,

Am 12.03.2019 um 09:21 schrieb Heiko Schocher:
Hello Simon, Tom,

I am just stumbeld on an am437x basd board over the problem to pass
the bootmode from SPL to U-Boot. On am437x the bootmode info get
overwritten from SPL stack, and I need this info in U-Boot.

Hack would be to move SPL stack to another address, but we loose
than 0xa000 size for stack ... I do not want to go this way..

I thought gd info is passed from SPL to U-Boot, but this is not the case!

Looking into

...
  75         bic     r0, r0, #7      /* 8-byte alignment for ABI compliance */
  76         mov     sp, r0
  77         bl      board_init_f_alloc_reserve
  78         mov     sp, r0
  79         /* set up gd here, outside any C code */
  80         mov     r9, r0
  81         bl      board_init_f_init_reserve

and common/init/board_init.c:

  99 void board_init_f_init_reserve(ulong base)
100 {
101         struct global_data *gd_ptr;
102
103         /*
104          * clear GD entirely and set it up.
105          * Use gd_ptr, as gd may not be properly set yet.
106          */
107
108         gd_ptr = (struct global_data *)base;
109         /* zero the area */
110         memset(gd_ptr, '\0', sizeof(*gd));
111         /* set GD unless architecture did it already */
112 #if !defined(CONFIG_ARM)
113         arch_setup_gd(gd_ptr);
114 #endif

gd is always initialized with zeros, no chance for passing infos from
SPL to U-Boot...

I really thought, that gd_t was intentionally designed for passing data
between different U-Boot states, but looking into gd_t definiton in
include/asm-generic/global_data.h it is a big ifdef mess and not useable
as an "API" between TPL/SPL and U-Boot ...

I thought also, that SPL detects for example ramsize and than passes
this info to U-Boot ...

But Ok, I found "common/init/handoff.c" which seems now the way to go, but:

./common/board_f.c

  281 static int setup_spl_handoff(void)
  282 {
  283 #if CONFIG_IS_ENABLED(HANDOFF)
  284         gd->spl_handoff = bloblist_find(BLOBLISTT_SPL_HANDOFF,
  285                                         sizeof(struct spl_handoff));
  286         debug("Found SPL hand-off info %p\n", gd->spl_handoff);
  287 #endif
  288
  289         return 0;
  290 }

There is gd->spl_handoff used ... how could this work at least on arm,
if gd is set to zeros on init ?

Do I miss something obvious?

Sorry for being so stupid, with:

common/board_f.c

 853 #ifdef CONFIG_BLOBLIST
 854         bloblist_init,
 855 #endif
 856         setup_spl_handoff,

and common/bloblist.c

216 int bloblist_init(void)
217 {
218         bool expected;
219         int ret = -ENOENT;
220
221         /**
222          * Wed expect to find an existing bloblist in the first phase of 
U-Boot
223          * that runs
224          */
225         expected = !u_boot_first_phase();
226         if (expected)
227                 ret = bloblist_check(CONFIG_BLOBLIST_ADDR,
228                                      CONFIG_BLOBLIST_SIZE);

gd->spl_handoff gets setup through bloblist_find() ...

But beside sandbox there is no current user currently, or?

$ grep -lr BLOBLIST_ADDR .
./test/bloblist.c
./include/bloblist.h
./common/bloblist.c
./common/Kconfig
./board/sandbox/README.sandbox
$

bye,
Heiko
--
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-52   Fax: +49-8142-66989-80   Email: h...@denx.de
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to