On Sun, Aug 6, 2017 at 1:16 AM, Simon Glass <s...@chromium.org> wrote:
> Hi Rob,
>
> On 3 August 2017 at 10:48, Rob Clark <robdcl...@gmail.com> wrote:
>> Similar to CONFIG_OF_BOARD, but in this case the fdt is still built by
>> u-boot build.  This allows the board to patch the fdt, etc.
>>
>> In the specific case of dragonboard 410c, we pass the u-boot generated
>> fdt to the previous stage of bootloader (by embedding it in the
>> u-boot.img that is loaded by lk/aboot), which patches the fdt and passes
>> it back to u-boot.
>
> Why do you need to create a weak function for this? Isn't there
> already a CONFIG_OF_BOARD to enable this feature?

See: https://lists.denx.de/pipermail/u-boot/2017-July/299021.html

My original approach was OF_BOARD but since we still need to build the
dtb that required Makefile hacks for snapdragon.

Snapdragon is something kind of in-between OF_BOARD and OF_SEPARATE.

BR,
-R


>>
>> Signed-off-by: Rob Clark <robdcl...@gmail.com>
>> ---
>>  include/fdtdec.h |  3 ++-
>>  lib/fdtdec.c     | 45 ++++++++++++++++++++++++++-------------------
>>  2 files changed, 28 insertions(+), 20 deletions(-)
>>
>> diff --git a/include/fdtdec.h b/include/fdtdec.h
>> index 4a0947c626..b9acec735a 100644
>> --- a/include/fdtdec.h
>> +++ b/include/fdtdec.h
>> @@ -986,7 +986,8 @@ int fdtdec_setup(void);
>>
>>  /**
>>   * Board-specific FDT initialization. Returns the address to a device tree 
>> blob.
>> - * Called when CONFIG_OF_BOARD is defined.
>> + * Called when CONFIG_OF_BOARD is defined, or if CONFIG_OF_SEPARATE is 
>> defined
>> + * and the board implements it.
>>   */
>>  void *board_fdt_blob_setup(void);
>>
>> diff --git a/lib/fdtdec.c b/lib/fdtdec.c
>> index d2dbd0f122..07c458673c 100644
>> --- a/lib/fdtdec.c
>> +++ b/lib/fdtdec.c
>> @@ -1203,34 +1203,41 @@ int fdtdec_setup_memory_banksize(void)
>>  }
>>  #endif
>>
>> -int fdtdec_setup(void)
>> +#ifdef CONFIG_OF_SEPARATE
>> +/*
>> + * For CONFIG_OF_SEPARATE, the board may optionally implement this to
>> + * provide and/or fixup the fdt.
>> + */
>> +__weak void *board_fdt_blob_setup(void)
>>  {
>> -#if CONFIG_IS_ENABLED(OF_CONTROL)
>> -# ifdef CONFIG_OF_EMBED
>> -       /* Get a pointer to the FDT */
>> -       gd->fdt_blob = __dtb_dt_begin;
>> -# elif defined CONFIG_OF_SEPARATE
>> -#  ifdef CONFIG_SPL_BUILD
>> +       void *fdt_blob = NULL;
>> +#ifdef CONFIG_SPL_BUILD
>>         /* FDT is at end of BSS unless it is in a different memory region */
>>         if (IS_ENABLED(CONFIG_SPL_SEPARATE_BSS))
>> -               gd->fdt_blob = (ulong *)&_image_binary_end;
>> +               fdt_blob = (ulong *)&_image_binary_end;
>>         else
>> -               gd->fdt_blob = (ulong *)&__bss_end;
>> +               fdt_blob = (ulong *)&__bss_end;
>>
>> -#  elif defined CONFIG_FIT_EMBED
>> -       gd->fdt_blob = locate_dtb_in_fit(&_end);
>> +#elif defined CONFIG_FIT_EMBED
>> +       fdt_blob = locate_dtb_in_fit(&_end);
>>
>> -       if (gd->fdt_blob == NULL || gd->fdt_blob <= ((void *)&_end)) {
>> +       if (fdt_blob == NULL || fdt_blob <= ((void *)&_end))
>>                 puts("Failed to find proper dtb in embedded FIT Image\n");
>> -               return -1;
>> -       }
>> -
>> -#  else
>> +#else
>>         /* FDT is at end of image */
>> -       gd->fdt_blob = (ulong *)&_end;
>> +       fdt_blob = (ulong *)&_end;
>>  #  endif
>> -# elif defined(CONFIG_OF_BOARD)
>> -       /* Allow the board to override the fdt address. */
>> +       return fdt_blob;
>> +}
>> +#endif
>> +
>> +int fdtdec_setup(void)
>> +{
>> +#if CONFIG_IS_ENABLED(OF_CONTROL)
>> +# ifdef CONFIG_OF_EMBED
>> +       /* Get a pointer to the FDT */
>> +       gd->fdt_blob = __dtb_dt_begin;
>> +# elif defined(CONFIG_OF_SEPARATE) || defined(CONFIG_OF_BOARD)
>>         gd->fdt_blob = board_fdt_blob_setup();
>>  # elif defined(CONFIG_OF_HOSTFILE)
>>         if (sandbox_read_fdt_from_file()) {
>> --
>> 2.13.0
>>
>
> Regards,
> Simon
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to