[U-Boot] [PATCH] board_f: Do not mark pre-relocated fdt space as reserved

Simon Goldschmidt simon.k.r.goldschmidt at gmail.com
Wed Apr 17 19:16:47 UTC 2019


[This is a follow-up to https://patchwork.ozlabs.org/patch/1033584/ 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;
+       }

         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