mirror of
https://github.com/smaeul/u-boot.git
synced 2025-10-14 04:46:01 +01:00
imx8: add rom api wrappers
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>
This commit is contained in:
parent
de20c5d405
commit
748da8abb0
@ -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 */
|
||||
|
@ -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
|
||||
|
30
arch/arm/mach-imx/romapi.c
Normal file
30
arch/arm/mach-imx/romapi.c
Normal file
@ -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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user