[U-Boot] [PATCH] board_f: Do not mark pre-relocated fdt space as reserved
Lokesh Vutla
lokeshvutla at ti.com
Thu Apr 18 06:11:55 UTC 2019
On 18/04/19 12:46 AM, Simon Goldschmidt wrote:
> [This is a follow-up to https://patchwork.ozlabs.org/patch/1033584/ right?]
Right.
>
> Am 16.04.2019 um 10:43 schrieb Lokesh Vutla:
>> SPL while copying u-boot and dtb it does the following:
>> - Copy u-boot
>> - Copy right dtb.
>> - mark dtb location as reserved in dtb.
>
> Hmm, why does it do that? Reserving space when U-Boot starts Linux *might* make
> sense, but why should SPL add this reservation when starting U-Boot? These steps
> are for U-Boot in a fit-image, right? Because I can't see this for U-Boot as
> uImage.
>
> Am I correct that 'fdt_shrink_to_minimum()' adds this reservation? The name of
> that function doesn't suggest that to me. Would it make more sense to let this
> funtion only *change* the reservation, i.e. only add it if it is removed at the
> beginning of said function? Would that fix your issue?
>
> Something like this:
>
> diff --git a/common/fdt_support.c b/common/fdt_support.c
> index ab08a0114f..4e7cf6ebe9 100644
> --- a/common/fdt_support.c
> +++ b/common/fdt_support.c
> @@ -597,6 +597,7 @@ int fdt_shrink_to_minimum(void *blob, uint extrasize)
> uint64_t addr, size;
> int total, ret;
> uint actualsize;
> + int fdt_memrsv = 0;
>
> if (!blob)
> return 0;
> @@ -606,6 +607,7 @@ int fdt_shrink_to_minimum(void *blob, uint extrasize)
> fdt_get_mem_rsv(blob, i, &addr, &size);
> if (addr == (uintptr_t)blob) {
> fdt_del_mem_rsv(blob, i);
> + fdt_memrsv = 1;
> break;
> }
> }
> @@ -627,10 +629,12 @@ int fdt_shrink_to_minimum(void *blob, uint extrasize)
> /* Change the fdt header to reflect the correct size */
> fdt_set_totalsize(blob, actualsize);
>
> - /* Add the new reservation */
> - ret = fdt_add_mem_rsv(blob, map_to_sysmem(blob), actualsize);
> - if (ret < 0)
> - return ret;
> + if (fdt_memrsv) {
> + /* Add the new reservation */
> + ret = fdt_add_mem_rsv(blob, map_to_sysmem(blob), actualsize);
> + if (ret < 0)
> + return ret;
> + }
Agreed. This works and more appropriate place to fix it. Will you post a
separate patch or do you want me to post it on your behalf?
Thanks and regards,
Lokesh
>
> return actualsize;
> }
>
>
>>
>> U-Boot when copying images at U-Boot prompt, is not able to copy to the
>> above dtb location as it sees the region as reserved. But at this stage
>> dtb is re located to end of DDR. And the above dtb region is not reserved
>> anymore. So delete this reserved region when re locating dtb.
>>
>> Reported-by: Keerthy <j-keerthy at ti.com>
>> Signed-off-by: Lokesh Vutla <lokeshvutla at ti.com>
>> ---
>> common/board_f.c | 13 +++++++++++++
>> 1 file changed, 13 insertions(+)
>>
>> diff --git a/common/board_f.c b/common/board_f.c
>> index 149a7229e8..e4383ae3fa 100644
>> --- a/common/board_f.c
>> +++ b/common/board_f.c
>> @@ -651,10 +651,23 @@ static int init_post(void)
>> static int reloc_fdt(void)
>> {
>> #ifndef CONFIG_OF_EMBED
>> + uint64_t addr, size;
>> + int i, cnt, err;
>> +
>> if (gd->flags & GD_FLG_SKIP_RELOC)
>> return 0;
>> if (gd->new_fdt) {
>> memcpy(gd->new_fdt, gd->fdt_blob, gd->fdt_size);
>> +
>> + /* Deleting the previously marked FDT reserved region */
>> + cnt = fdt_num_mem_rsv(gd->new_fdt);
>> + for (i = 0; i < cnt ; i++) {
>> + err = fdt_get_mem_rsv(gd->new_fdt, i, &addr, &size);
>> + if (!err && addr == (uintptr_t)gd->fdt_blob) {
>> + fdt_del_mem_rsv(gd->new_fdt, i);
>> + break;
>> + }
>> + }
>
> That code should work, but it's a bit unexpected in this location
>
>> gd->fdt_blob = gd->new_fdt;
>> }
>> #endif
>>
>
More information about the U-Boot
mailing list