spl: atf: add SPL_ATF_NO_PLATFORM_PARAM option

While we expect to call a pointer to a valid FDT (or NULL) as the
platform parameter to an ATF, some ATF versions are not U-Boot aware
and have an insufficiently robust (or an overzealour) parameter
validation: either way, this may cause a hard-stop with uncooperative
ATF versions.

This change adds the option to suppress passing a platform parameter
and will always pass NULL.

Debug output from ATF w/ this option disabled (i.e. default):
      INFO:    plat_param_from_bl2: 0x291450
Debug output from ATF w/ this option enabled:
      INFO:    plat_param_from_bl2: 0

Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Tested-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
This commit is contained in:
Philipp Tomsich 2018-01-02 21:16:43 +01:00
parent 224d261a16
commit d21fb63d77
2 changed files with 27 additions and 3 deletions

View File

@ -721,10 +721,24 @@ config SPL_ATF
bool "Support ARM Trusted Firmware" bool "Support ARM Trusted Firmware"
depends on ARM64 depends on ARM64
help help
ATF(ARM Trusted Firmware) is a component for ARM arch64 which ATF(ARM Trusted Firmware) is a component for ARM AArch64 which
is loaded by SPL(which is considered as BL2 in ATF terminology). is loaded by SPL (which is considered as BL2 in ATF terminology).
More detail at: https://github.com/ARM-software/arm-trusted-firmware More detail at: https://github.com/ARM-software/arm-trusted-firmware
config SPL_ATF_NO_PLATFORM_PARAM
bool "Pass no platform parameter"
depends on SPL_ATF
help
While we expect to call a pointer to a valid FDT (or NULL)
as the platform parameter to an ATF, some ATF versions are
not U-Boot aware and have an insufficiently robust parameter
validation to gracefully reject a FDT being passed.
If this option is enabled, the spl_atf os-type handler will
always pass NULL for the platform parameter.
If your ATF is affected, say Y.
config TPL config TPL
bool bool
depends on SUPPORT_TPL depends on SUPPORT_TPL

View File

@ -144,6 +144,7 @@ void spl_invoke_atf(struct spl_image_info *spl_image)
{ {
uintptr_t bl33_entry = CONFIG_SYS_TEXT_BASE; uintptr_t bl33_entry = CONFIG_SYS_TEXT_BASE;
void *blob = spl_image->fdt_addr; void *blob = spl_image->fdt_addr;
uintptr_t platform_param = (uintptr_t)blob;
int node; int node;
/* /*
@ -157,9 +158,18 @@ void spl_invoke_atf(struct spl_image_info *spl_image)
if (node >= 0) if (node >= 0)
bl33_entry = spl_fit_images_get_entry(blob, node); bl33_entry = spl_fit_images_get_entry(blob, node);
/*
* If ATF_NO_PLATFORM_PARAM is set, we override the platform
* parameter and always pass 0. This is a workaround for
* older ATF versions that have insufficiently robust (or
* overzealous) argument validation.
*/
if (CONFIG_IS_ENABLED(ATF_NO_PLATFORM_PARAM))
platform_param = 0;
/* /*
* We don't provide a BL3-2 entry yet, but this will be possible * We don't provide a BL3-2 entry yet, but this will be possible
* using similar logic. * using similar logic.
*/ */
bl31_entry(spl_image->entry_point, bl33_entry, (uintptr_t)blob); bl31_entry(spl_image->entry_point, bl33_entry, platform_param);
} }