[U-Boot] [PATCH v3] spl: add support to booting with ATF
Masahiro Yamada
yamada.masahiro at socionext.com
Wed Apr 5 16:40:22 UTC 2017
Hi.
2017-04-05 14:05 GMT+09:00 Kever Yang <kever.yang at rock-chips.com>:
> --- a/common/spl/Kconfig
> +++ b/common/spl/Kconfig
> @@ -670,6 +670,20 @@ config SPL_YMODEM_SUPPORT
> means of transmitting U-Boot over a serial line for using in SPL,
> with a checksum to ensure correctness.
>
> +config SPL_ATF_SUPPORT
> + bool "Support ARM Trusted Firmware"
> + depends on SPL && ARM64
> + help
> + ATF(ARM Trusted Firmware) is a component for ARM arch64 which which
> + is loaded by SPL(which is considered as BL2 in ATF terminology).
> + More detail at: https://github.com/ARM-software/arm-trusted-firmware
This statement may not be precise.
ATF supports Aarch32 as well as Aarch64.
I thik this is just U-Boot side matter.
As far as I understood from the U-Boot directory structure
(I only see Aarch64 code in arch/arm/cpu/armv8),
U-Boot does not expect 32bit ARM code in ARMv8 generation
(such as Cortex-A32, Coretex-A35, ...).
As for U-Boot, ARM64 == ARMV8
unless I am missing something.
> +config SPL_ATF_TEXT_BASE
> + depends on SPL_ATF_SUPPORT
> + hex "ATF TEXT BASE addr"
hex "ATF BL31 base address"
> + help
> + This is the base address in memory for ATF text and entry point.
I'd like you to mention "BL31" explicitly
because there are many images in ATF.
> config TPL_ENV_SUPPORT
> bool "Support an environment"
> depends on TPL
> diff --git a/common/spl/Makefile b/common/spl/Makefile
> index 1933cbd..b3b34d6 100644
> --- a/common/spl/Makefile
> +++ b/common/spl/Makefile
> @@ -20,6 +20,7 @@ endif
> obj-$(CONFIG_SPL_UBI) += spl_ubi.o
> obj-$(CONFIG_SPL_NET_SUPPORT) += spl_net.o
> obj-$(CONFIG_SPL_MMC_SUPPORT) += spl_mmc.o
> +obj-$(CONFIG_SPL_ATF_SUPPORT) += spl_atf.o
> obj-$(CONFIG_SPL_USB_SUPPORT) += spl_usb.o
> obj-$(CONFIG_SPL_FAT_SUPPORT) += spl_fat.o
> obj-$(CONFIG_SPL_EXT_SUPPORT) += spl_ext.o
> diff --git a/common/spl/spl.c b/common/spl/spl.c
> index 26bc9ef..7041e1b 100644
> --- a/common/spl/spl.c
> +++ b/common/spl/spl.c
> @@ -374,6 +374,9 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
> gd->malloc_ptr / 1024);
> #endif
>
> + if (IS_ENABLED(CONFIG_SPL_ATF_SUPPORT))
> + bl31_entry();
> +
> debug("loaded - jumping to U-Boot...\n");
> spl_board_prepare_for_boot();
> jump_to_image_no_args(&spl_image);
switch (spl_image.os) {
case IH_OS_U_BOOT:
debug("Jumping to U-Boot\n");
break;
#ifdef CONFIG_SPL_OS_BOOT
case IH_OS_LINUX:
debug("Jumping to Linux\n");
spl_board_prepare_for_linux();
jump_to_image_linux(&spl_image,
(void *)CONFIG_SYS_SPL_ARGS_ADDR);
#endif
default:
debug("Unsupported OS image.. Jumping nevertheless..\n");
}
Which debug message is printed
before SPL jumps to BL31?
Jumping to U-Boot or Linux or Unsupported OS?
> +void bl31_entry(void)
> +{
> + struct bl31_params_t *bl31_params;
> + void (*entry)(struct bl31_params_t *params, void *plat_params) = NULL;
> +
> + bl31_params = bl2_plat_get_bl31_params();
> + entry = (void *)CONFIG_SPL_ATF_TEXT_BASE;
> +
> + raw_write_daif(SPSR_EXCEPTION_MASK);
> + dcache_disable();
> +
> + entry(bl31_params, NULL);
> +}
I guess SPL is supposed to load at least BL31 and BL33(=U-Boot full)
because BL31 does not have a facility to load images from non-volatile devices.
I can not see how to do it from this patch.
Relying on Andre's work for multi images in FIT?
http://patchwork.ozlabs.org/patch/745827/
I am not tracking how they are related, though.
> +/*******************************************************************************
> + * Structure used for telling the next BL how much of a particular type of
> + * memory is available for its use and how much is already used.
> + ******************************************************************************/
> +struct aapcs64_params_t {
Please do not add _t suffix for structure.
> + unsigned long arg0;
> + unsigned long arg1;
> + unsigned long arg2;
> + unsigned long arg3;
> + unsigned long arg4;
> + unsigned long arg5;
> + unsigned long arg6;
> + unsigned long arg7;
> +};
In ATF, every structure has a shorthand
typedef with _t suffix, like this:
typedef struct aapcs64_params {
u_register_t arg0;
u_register_t arg1;
u_register_t arg2;
u_register_t arg3;
u_register_t arg4;
u_register_t arg5;
u_register_t arg6;
u_register_t arg7;
} aapcs64_params_t;
This is bad habit anyway, so
no new typedef:s, no _t suffix in U-boot.
> +/***************************************************************************
> + * This structure provides version information and the size of the
> + * structure, attributes for the structure it represents
> + ***************************************************************************/
> +struct param_header_t {
Please rename to
struct param_header
Likewise for the others.
> +/*******************************************************************************
> + * This structure represents the superset of information that is passed to
> + * BL31, e.g. while passing control to it from BL2, bl31_params
> + * and other platform specific params
> + ******************************************************************************/
> +struct bl2_to_bl31_params_mem_t {
> + struct bl31_params_t bl31_params;
> + struct atf_image_info_t bl31_image_info;
> + struct atf_image_info_t bl32_image_info;
> + struct atf_image_info_t bl33_image_info;
> + struct entry_point_info_t bl33_ep_info;
> + struct entry_point_info_t bl32_ep_info;
> + struct entry_point_info_t bl31_ep_info;
> +};
> +
This is old interface. (LOAD_IMAGE_V1).
As Dan explained, this was superseded by struct bl_params and bl_params_node.
I'd recommend you to implement LOAD_IMAGE_V2.
--
Best Regards
Masahiro Yamada
More information about the U-Boot
mailing list