Message ID | 20220620085322.1108802-4-rasmus.villemoes@prevas.dk |
---|---|
State | Accepted |
Commit | 748da8abb0d020bedbfa4dbc7b3cafdaf9bc60f1 |
Delegated to: | Stefano Babic |
Headers | show |
Series | imx8 ROM API cleanup | expand |
> The ROM API is thoroughly undocumented, but apparently passing the xor > of the real arguments as an extra argument is required [1]. Also, we > need to do the "save gd/restore gd" dance. These are both error-prone, > and lead to a lot of code duplication. > Since both imx8m[np] and imx8ulp SOCs have this, add a separate > translation unit which is included precisely when the new > CONFIG_IMX8_ROMAPI symbol is set, which provide convenience wrappers > that take care of computing the xor value as well as doing the gd > dance, and that thus have a more intuitive API. Subsequent patches > will make use of these to reduce boilerplate. > [1] One wonders, for example, if the check is only applied to the > lower 32 bits, or if we're implicitly relying on all 64-bit pointer > values we're passing effectively have 0 in the upper 32 bits. > Reviewed-by: Peng Fan <peng.fan@nxp.com> > Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk> Applied to u-boot-imx, master, thanks ! Best regards, Stefano Babic
diff --git a/arch/arm/include/asm/mach-imx/sys_proto.h b/arch/arm/include/asm/mach-imx/sys_proto.h index 02816197c1..fadb67d04a 100644 --- a/arch/arm/include/asm/mach-imx/sys_proto.h +++ b/arch/arm/include/asm/mach-imx/sys_proto.h @@ -178,6 +178,10 @@ enum boot_dev_type_e { #define ROM_API_OKAY 0xF0 extern struct rom_api *g_rom_api; + +u32 rom_api_download_image(u8 *dest, u32 offset, u32 size); +u32 rom_api_query_boot_infor(u32 info_type, u32 *info); + #endif /* For i.MX ULP */ diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index aa0b6447f1..3cbcb151b8 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile @@ -243,3 +243,4 @@ obj-$(CONFIG_ARCH_IMX8) += imx8/ obj-$(CONFIG_ARCH_IMXRT) += imxrt/ obj-$(CONFIG_SPL_BOOTROM_SUPPORT) += spl_imx_romapi.o +obj-$(CONFIG_IMX8_ROMAPI) += romapi.o diff --git a/arch/arm/mach-imx/romapi.c b/arch/arm/mach-imx/romapi.c new file mode 100644 index 0000000000..0e7b1d1a00 --- /dev/null +++ b/arch/arm/mach-imx/romapi.c @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-2.0+ + +#include <asm/global_data.h> +#include <asm/arch/sys_proto.h> + +DECLARE_GLOBAL_DATA_PTR; + +u32 rom_api_download_image(u8 *dest, u32 offset, u32 size) +{ + u32 xor = (uintptr_t)dest ^ offset ^ size; + volatile gd_t *sgd = gd; + u32 ret; + + ret = g_rom_api->download_image(dest, offset, size, xor); + set_gd(sgd); + + return ret; +} + +u32 rom_api_query_boot_infor(u32 info_type, u32 *info) +{ + u32 xor = info_type ^ (uintptr_t)info; + volatile gd_t *sgd = gd; + u32 ret; + + ret = g_rom_api->query_boot_infor(info_type, info, xor); + set_gd(sgd); + + return ret; +}