Hi Simon, On Sat, 30 Mar 2019 at 15:40, Simon Goldschmidt <simon.k.r.goldschm...@gmail.com> wrote: > > > > Simon Glass <s...@chromium.org> schrieb am Sa., 30. März 2019, 22:18: >> >> Hi Simon, >> >> On Sat, 30 Mar 2019 at 14:50, Simon Goldschmidt >> <simon.k.r.goldschm...@gmail.com> wrote: >> > >> > >> > >> > Simon Goldschmidt <simon.k.r.goldschm...@gmail.com> schrieb am Sa., 30. >> > März 2019, 21:18: >> >> >> >> >> >> >> >> Simon Glass <s...@chromium.org> schrieb am Sa., 30. März 2019, 21:06: >> >>> >> >>> Hi Simon, >> >>> >> >>> On Wed, 27 Mar 2019 at 13:40, Simon Goldschmidt >> >>> <simon.k.r.goldschm...@gmail.com> wrote: >> >>> > >> >>> > This introduces a new Kconfig option SPL_CLEAR_BSS_F. If enabled, it >> >>> > clears >> >>> > the bss before calling board_init_f() instead of clearing it before >> >>> > calling >> >>> > board_init_r(). >> >>> > >> >>> > This also ensures that variables placed in BSS can be shared between >> >>> > board_init_f() and board_init_r() in SPL. >> >>> > >> >>> > Such global variables are used, for example, when loading things from >> >>> > FAT >> >>> > before SDRAM is available: the full heap required for FAT uses global >> >>> > variables and clearing BSS after board_init_f() would reset the heap >> >>> > state. >> >>> > An example for such a usage is socfpa_arria10 where an FPGA >> >>> > configuration >> >>> > is required before SDRAM can be used. >> >>> > >> >>> > Make the new option depend on ARM for now until more implementations >> >>> > follow. >> >>> > >> >>> >> >>> I still have objections to this series and I think we should discuss >> >>> other ways of solving this problem. >> >>> >> >>> Does socfgpa have SRAM that could be used before SDRAM is available? >> >>> If so, can we not use that for the configuration? What various are >> >>> actually in BSS that are needed before board_init_r() is called? Can >> >>> they not be in a struct created from malloc()? >> >> >> >> >> >> The problem is the board needs to load an FPGA configuration from FAT >> >> before SDRAM is available. Yes, this is loaded into SRAM of course, but >> >> the whole code until that is done uses so many malloc/free iterations >> >> that The simple mall of implementation would require too much memory. >> >> >> >> And it's the full malloc state variables only that use BSS, not the FAT >> >> code. >> >> >> >> One way out could be to move the full mall of state variables into 'gd'... >> > >> > >> > Maybe I should point out again that the whole purpose of this series is to >> > have an SPL that uses full malloc right from the start. This is currently >> > not possible as full malloc needs BSS. >> >> Right, and our assumption/design is that full malloc() requires SRAM. >> >> Here we have an architecture that requires FAT just to init its SDRAM. >> FAT requires malloc() and free() and there is not enough SRAM to skip >> the free() calls. So we have to use full malloc() and that uses BSS. >> But BSS is not available before board_init_r(). But we need to init >> SDRAM before board_init_r(). >> >> Firstly I'd point out that someone should speak to the chip designers. >> Did anyone try to boot U-Boot on the SoC model? > > > Well, it's a U-Boot thing to load it from FAT. It could probably be loaded > from RAW mmc without problems, so I don't know if it's a chip designers > issue. I think it's an issue that we need to fix in U-Boot: we have a good > full malloc implementation but it's not usable in all cases were it should be.
OK then why use FAT? I assumed it was a boot-ROM requirement. How does the boot ROM load SPL? > >> >> I think it is possible to change dlmalloc to put its variables in a >> struct. Then I suppose the struct pointer could be kept in gd. That >> would be one solution. Then full malloc() could be inited in >> spl_common_init() perhaps. > > > That might be worth a try. Yes shouldn't be too painful. I suspect it would be neutral on code size, too. > >> >> Another option might be to update the FAT code to use >> ALLOC_CACHE_ALIGN_BUFFER() instead of malloc(), as it already does in >> places, and perhaps to disable all caching for this case. Then it >> might work with simple malloc(). > > > Hmm, then the next platform will have problems because allocating via malloc > would be preferable. If really rather fix using dlmalloc instead. Hmm but there is no obvious analysis behind your preference. If we have code like this: do_something_with_fat() { void *buf = malloc(...); ... free(buf); } it seems to me we should convert it to use the stack instead, unless there is some recursion problem, etc. Otherwise we are just causing pointless churn on malloc(). > >> >> Another option would be to put the FPGA image in a known position on >> the media, outside the FAT partition. The position could perhaps be >> written into a FAT file, and reading just that file in SPL might not >> involve many free() operations. > > > Sounds like a workaround, too. I think the U-Boot infrastructure should work > for the boards, not placing restrictions on them. I'll await your answer to my first question in this email before passing judgement. > >> >> I hesitate to suggest enhancing simple malloc() to support a free >> list. That would increase the code size and I'm not sure it would be >> better than using full malloc(). > > > Yes, I think that might result in making a second dlmalloc.... :-) > > Thanks for your thoughts and input! Overall I feel that the current trade-offs and phases of boot are reasonable. We should be suspicious of attempts to make them more complex. Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot