From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kever Yang Date: Tue, 21 Nov 2017 17:38:13 +0800 Subject: [U-Boot] U-Boot proper(not SPL) relocate option Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Guys, I try to understand why we need to do the relocate in U-Boot. From the document README/crt0.S, I think the relocation feature comes from some SoC have limited SRAM whose size is enough to load the whole U-Boot, but not enough to run all the drivers. I don't know how many SoCs/Archs still must use this feature, but I'm sure all Rockchip SoCs do not need this feature in both SPL and proper U-Boot, because rockchip using SPL always running in SRAM to init DDR SDRAM, and after DRAM available always running U-Boot in DRAM. There is a CONFIG_SPL_SKIP_RELOCATE for SPL to skip the relocate, can we have another CONFIG_SKIP_RELOCATE for U-Boot proper? If we enable relocate in SPL, we init serial driver 4 times not including debug uart. - before and after relocate in SPL, before and after U-Boot. Here is the document from README: board_init_f(): - purpose: set up the machine ready for running board_init_r(): i.e. SDRAM and serial UART - global_data is available - stack is in SRAM - BSS is not available, so you cannot use global/static variables, only stack variables and global_data Non-SPL-specific notes: - dram_init() is called to set up DRAM. If already done in SPL this can do nothing SPL-specific notes: - you can override the entire board_init_f() function with your own version as needed. - preloader_console_init() can be called here in extremis - should set up SDRAM, and anything needed to make the UART work - these is no need to clear BSS, it will be done by crt0.S - must return normally from this function (don't call board_init_r() directly) board_init_r(): - purpose: main execution, common code - global_data is available - SDRAM is available - BSS is available, all static/global variables can be used - execution eventually continues to main_loop() Non-SPL-specific notes: - U-Boot is relocated to the top of memory and is now running from there. SPL-specific notes: - stack is optionally in SDRAM, if CONFIG_SPL_STACK_R is defined and CONFIG_SPL_STACK_R_ADDR points into SDRAM - preloader_console_init() can be called here - typically this is done by selecting CONFIG_SPL_BOARD_INIT and then supplying a spl_board_init() function containing this call - loads U-Boot or (in falcon mode) Linux Thanks, - Kever