[U-Boot] [PATCH 07/15] spl: atf: introduce spl_invoke_atf and make bl31_entry private

Dr. Philipp Tomsich philipp.tomsich at theobroma-systems.com
Tue Nov 7 09:30:03 UTC 2017


> On 17 Sep 2017, at 19:53, Simon Glass <sjg at chromium.org> wrote:
> 
> Hi Philipp,
> 
> On 13 September 2017 at 13:29, Philipp Tomsich
> <philipp.tomsich at theobroma-systems.com <mailto:philipp.tomsich at theobroma-systems.com>> wrote:
>> This adds a new interface spl_invoke_atf() that takes a spl_image_info
>> argument and then derives the necessary parameters for the ATF entry.
>> Based on the additional information recorded (into /fit-images) from
>> the FIT loadables, we can now easily locate the next boot stage.
>> 
>> We now pass a pointer to a FDT as the platform-specific parameter
>> pointer to ATF (so we don't run into the future headache of every
>> board/platform defining their own proprietary tag-structure), as
>> FDT access is already available in ATF.
>> 
>> With the necessary infrastructure in place, we can now update the
>> support for the ARM Trusted Firmware to dispatch into the
>> spl_invoke_atf function only if a IH_OS_ARM_TRUSTED_FIRMWARE image is
>> loaded.
>> 
>> Signed-off-by: Philipp Tomsich <philipp.tomsich at theobroma-systems.com>
>> ---
>> 
>> common/spl/spl.c     | 11 +++----
>> common/spl/spl_atf.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++-----
>> 2 files changed, 82 insertions(+), 13 deletions(-)
> 
> Reviewed-by: Simon Glass <sjg at chromium.org <mailto:sjg at chromium.org>>
> 
> Please see question below
> 
> [..]
> 
>> index 6e8f928..63557c0 100644
>> --- a/common/spl/spl_atf.c
>> +++ b/common/spl/spl_atf.c
>> @@ -5,6 +5,7 @@
>>  * reserved.
>>  * Copyright (C) 2016 Rockchip Electronic Co.,Ltd
>>  * Written by Kever Yang <kever.yang at rock-chips.com <mailto:kever.yang at rock-chips.com>>
>> + * Copyright (C) 2017 Theobroma Systems Design und Consulting GmbH
>>  *
>>  * SPDX-License-Identifier:     BSD-3-Clause
>>  */
>> @@ -30,7 +31,7 @@ static struct bl31_params *bl2_to_bl31_params;
>>  *
>>  * @return bl31 params structure pointer
>>  */
>> -struct bl31_params *bl2_plat_get_bl31_params(void)
>> +static struct bl31_params *bl2_plat_get_bl31_params(uintptr_t bl33_entry)
>> {
>>        struct entry_point_info *bl33_ep_info;
>> 
>> @@ -66,7 +67,7 @@ struct bl31_params *bl2_plat_get_bl31_params(void)
>> 
>>        /* BL33 expects to receive the primary CPU MPID (through x0) */
>>        bl33_ep_info->args.arg0 = 0xffff & read_mpidr();
>> -       bl33_ep_info->pc = CONFIG_SYS_TEXT_BASE;
>> +       bl33_ep_info->pc = bl33_entry;
>>        bl33_ep_info->spsr = SPSR_64(MODE_EL2, MODE_SP_ELX,
>>                                     DISABLE_ALL_EXECPTIONS);
>> 
>> @@ -77,21 +78,88 @@ struct bl31_params *bl2_plat_get_bl31_params(void)
>>        return bl2_to_bl31_params;
>> }
>> 
>> -void raw_write_daif(unsigned int daif)
>> +static inline void raw_write_daif(unsigned int daif)
>> {
>>        __asm__ __volatile__("msr DAIF, %0\n\t" : : "r" (daif) : "memory");
>> }
>> 
>> -void bl31_entry(void)
>> +typedef void (*atf_entry_t)(struct bl31_params *params, void *plat_params);
>> +
>> +static void bl31_entry(uintptr_t bl31_entry, uintptr_t bl33_entry,
>> +                      uintptr_t fdt_addr)
>> {
>>        struct bl31_params *bl31_params;
>> -       void (*entry)(struct bl31_params *params, void *plat_params) = NULL;
>> +       atf_entry_t  atf_entry = (atf_entry_t)bl31_entry;
>> 
>> -       bl31_params = bl2_plat_get_bl31_params();
>> -       entry = (void *)CONFIG_SPL_ATF_TEXT_BASE;
>> +       bl31_params = bl2_plat_get_bl31_params(bl33_entry);
>> 
>>        raw_write_daif(SPSR_EXCEPTION_MASK);
>>        dcache_disable();
>> 
>> -       entry(bl31_params, NULL);
>> +       atf_entry((void *)bl31_params, (void *)fdt_addr);
>> +}
>> +
>> +static int spl_fit_images_find_uboot(void *blob)
>> +{
>> +       int parent, node, ndepth;
>> +       const void *data;
>> +
>> +       if (!blob)
>> +               return -FDT_ERR_BADMAGIC;
>> +
>> +       parent = fdt_path_offset(blob, "/fit-images");
>> +       if (parent < 0)
>> +               return -FDT_ERR_NOTFOUND;
>> +
>> +       for (node = fdt_next_node(blob, parent, &ndepth);
>> +            (node >= 0) && (ndepth > 0);
>> +            node = fdt_next_node(blob, node, &ndepth)) {
>> +               if (ndepth != 1)
>> +                       continue;
>> +
>> +               data = fdt_getprop(blob, node, FIT_OS_PROP, NULL);
>> +               if (!data)
>> +                       continue;
>> +
>> +               if (genimg_get_os_id(data) == IH_OS_U_BOOT)
>> +                       return node;
> 
> How come this is in 'data' instead of the 'type' property?

In fact it’s in FIT_OS_PROP (which expands to “os”).
Naming this variable ‘data' may have not been the best choice, but ‘prop’ didn’t
seem much better…

Regards,
Philipp.



More information about the U-Boot mailing list