[PATCH 2/5] rockchip: rk3399-pinebook-pro: Fix SPL max size and SPI flash payload offset

Jonas Karlman jonas at kwiboo.se
Fri Jun 30 12:24:21 CEST 2023


Hi Quentin,

On 2023-06-29 10:38, Quentin Schulz wrote:
> Hi Jonas,
> 
> On 6/29/23 00:11, Jonas Karlman wrote:
>> Hi Quentin,
>>
>> On 2023-06-28 15:49, Quentin Schulz wrote:
>>> Hi Jonas,
>>>
>>> On 6/27/23 21:10, Jonas Karlman wrote:
>>>> TPL max size is limited to 184 KB, SPL is loaded to 0x0 and TF-A is
>>>> loaded to 0x40000, this limit SPL max size to 256 KB. With BootRom only
>>>> reading first 2 KB per 4 KB page of SPI flash, 880 KB may be needed for
>>>> TPL+SPL in a worst-case scenario. (184 KB + 256 KB) x 2 = 880 KB
>>>>
>>>> Use 0xE0000 (896 KB) as the payload offset in SPI flash, this allows
>>>> for a payload of 3168 KB before env offset start to overlap.
>>>>
>>>> Also add CONFIG_ROCKCHIP_SPI_IMAGE=y to build a bootable SPI flash
>>>> image, u-boot-rockchip-spi.bin.
>>>>
>>>> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
>>>> ---
>>>>    arch/arm/dts/rk3399-pinebook-pro-u-boot.dtsi | 4 ----
>>>>    configs/pinebook-pro-rk3399_defconfig        | 4 +++-
>>>>    2 files changed, 3 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/arch/arm/dts/rk3399-pinebook-pro-u-boot.dtsi b/arch/arm/dts/rk3399-pinebook-pro-u-boot.dtsi
>>>> index ea7a5a17ae0f..88a77cad8d43 100644
>>>> --- a/arch/arm/dts/rk3399-pinebook-pro-u-boot.dtsi
>>>> +++ b/arch/arm/dts/rk3399-pinebook-pro-u-boot.dtsi
>>>> @@ -10,10 +10,6 @@
>>>>    	chosen {
>>>>    		u-boot,spl-boot-order = "same-as-spl", &sdhci, &spiflash, &sdmmc;
>>>>    	};
>>>> -
>>>> -	config {
>>>> -		u-boot,spl-payload-offset = <0x60000>; /* @ 384KB */
>>>> -	};
>>>
>>> Just a nitpick/question (and for the whole series): Is there any
>>> specific reason for going back to the Kconfig way
>>> (CONFIG_SYS_SPI_U_BOOT_OFFS) instead of just modifying the offset in the
>>> -u-boot DTSI?
>>
>> The main reason is that SYS_SPI_U_BOOT_OFFS is used as payload offset by
>> binman in rockchip-u-boot.dtsi, for building u-boot-rockchip-spi.bin.
>> And also to avoid any confusion on what value is used.
>>
>> rockchip-u-boot.dtsi:
>>    offset = <CONFIG_SYS_SPI_U_BOOT_OFFS>;
>>
> 
> Fair point, converging towards the default for Rockchip platforms seems 
> like a good idea, thanks for the explanation.
> 
>>>
>>> On a different note, that also means that we're effectively breaking
>>> current setups by moving the environment some other location. I cannot
>>> talk for the maintainer(s) and user(s) but I thought it was worth
>>> mentioning.
>>
>> The environment should not be affected by these changes. All rk3399
>> boards using ENV_IS_IN_SPI_FLASH all use ENV_OFFSET=0x3F8000. u-boot.itb
>> or u-boot.img can be up to 3168 KB before it affects environment.
>>
>>    0x000000: idbloader.img (TPL+SPL)
>>    0x0E0000: u-boot.itb or u-boot.img (was before at 0x060000)
>>    0x3F8000: environment, same as before
>>
>> I am not expecting any issues for users, as long as the updated
>> instructions are followed when updating u-boot in SPI flash, i.e.
>> writing u-boot-rockchip-spi.bin at start of SPI flash.
>>
> 
> Sorry, seems like I had a brain fart yesterday and mixed SPL payload (so 
> U-Boot proper essentially) with U-Boot environment location. Thanks for 
> correcting me.
> 
> Since those values are dependent on the SoC and not on the hardware 
> design, shouldn't we rather hardcode those values for all RK3399 
> devices? i.e. set CONFIG_SYS_SPI_U_BOOT_OFFS to 0xe0000 (it's currently 
> 0 which is probably a bad default) and have SPL_MAX_SIZE set to 0x40000? 
> I'm asking now because I did the maths for RK3399 Puma and we got it 
> wrong there too. We have TPL_MAX_SIZE set to 0x2e000 like all RK3399 
> boards and SPL_MAX_SIZE to 0x2e000. So, (0x2e000 * 2) * 2 = 0xb8000. 
> However we have u-boot,spl-payload-offset = <0x80000>; so clearly there 
> are cases where this would be an issue.
> 
> In our case, changing the u-boot,spl-payload-offset isn't without 
> backward compatibility issues because we want to be able to boot U-Boot 
> proper from SPI but the TPL+SPL from eMMC for example (so the 
> u-boot,spl-payload-offset from the DT in the eMMC needs to match the 
> offset of U-Boot proper in the SPI). But since we are not aware of any 
> user using the fallback mechanism this way rather than TPL+SPL from SPI 
> and fallback to eMMC for U-Boot proper, we'd be fine changing it to 
> something safer rather than limiting the size of SPL too much.
> 
> Basically, what I am asking is whether we should make those RK3399 
> defaults instead of fixing them one by one in DTS/defconfigs? I also do 
> not know how critical this currently is, does it absolutely need to be 
> in this release (we're late in the rc process right now I believe?) or 
> can we manage to put more thoughts into making this generic for all 
> RK3399 (and maybe other SoCs from Rockchip)?
> 

You are correct, the updated SPL max size and SPI payload offset can
probably be used as defaults instead of just modifying a few boards
defconfig.

I left RK3399 Puma out of this series because current defconfig would
trigger a build error if the TPL+SPL included in u-boot-rockchip-spi.bin
would have grown beyond the 0x80000 offset, i.e. with current defconfig
TPL+SPL does not overlap the payload offset.

For rockpro64 this was not the case, and with the use of 0x60000 and
ROCKCHIP_SPI_IMAGE=y added, binman complained that there was an overlap
of a few KB and a build ended with an error. Adding CONFIG_LTO=y made
SPL size reduce enough to fit below the 0x60000 offset.

However, Peter reported that the addition of CONFIG_LTO=y triggered
a build issue, one that was not triggered in my setup or in CI, and I
said I would prepare a small fix series, see [1].

Patch 1 in this series revert the CONFIG_LTO=y change and adjusts
offsets to fix the binman build error, remaining board updates was to
accommodate the updated flashing instruction.

Personally I have no problem with reworking this to use new defaults
or if this gets delayed, I do not see this as something critical.

Unfortunately, I will not have much time to do such rework next few
weeks so a follow up series or someone else picking this up would fit
my schedule better :-)

[1] https://lore.kernel.org/u-boot/d1f82951-1a41-6178-75c7-3a84a46834b2@kwiboo.se/

Regards,
Jonas

> Otherwise, the maths sound good, so for the whole series:
> Reviewed-by: Quentin Schulz <foss+u-boot at 0leil.net>
> 
> (thanks for the detailed commit log, really helps reviewing :) ).
> 
> Cheers,
> Quentin
> 
>> Regards,
>> Jonas
>>
>>>
>>>>    };
>>>>    
>>>>    &edp {
>>>> diff --git a/configs/pinebook-pro-rk3399_defconfig b/configs/pinebook-pro-rk3399_defconfig
>>>> index 58a8b91aa60f..1109ebb7387b 100644
>>>> --- a/configs/pinebook-pro-rk3399_defconfig
>>>> +++ b/configs/pinebook-pro-rk3399_defconfig
>>>> @@ -12,6 +12,7 @@ CONFIG_ENV_OFFSET=0x3F8000
>>>>    CONFIG_DEFAULT_DEVICE_TREE="rk3399-pinebook-pro"
>>>>    CONFIG_DM_RESET=y
>>>>    CONFIG_ROCKCHIP_RK3399=y
>>>> +CONFIG_ROCKCHIP_SPI_IMAGE=y
>>>>    CONFIG_TARGET_PINEBOOK_PRO_RK3399=y
>>>>    CONFIG_SPL_STACK=0x400000
>>>>    CONFIG_DEBUG_UART_BASE=0xFF1A0000
>>>> @@ -26,7 +27,7 @@ CONFIG_USE_PREBOOT=y
>>>>    CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-pinebook-pro.dtb"
>>>>    CONFIG_DISPLAY_BOARDINFO_LATE=y
>>>>    CONFIG_MISC_INIT_R=y
>>>> -CONFIG_SPL_MAX_SIZE=0x2e000
>>>> +CONFIG_SPL_MAX_SIZE=0x40000
>>>
>>> nitpick: We *could* have this in another commit after we move the
>>> environment to another location later in the SPI flash.
>>>
>>> Cheers,
>>> Quentin
>>



More information about the U-Boot mailing list