diff mbox series

[v2,3/6] imx8: add rom api wrappers

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

Commit Message

Rasmus Villemoes June 20, 2022, 8:53 a.m. UTC
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>
---
 arch/arm/include/asm/mach-imx/sys_proto.h |  4 +++
 arch/arm/mach-imx/Makefile                |  1 +
 arch/arm/mach-imx/romapi.c                | 30 +++++++++++++++++++++++
 3 files changed, 35 insertions(+)
 create mode 100644 arch/arm/mach-imx/romapi.c

Comments

Stefano Babic July 25, 2022, 4:40 p.m. UTC | #1
> 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 mbox series

Patch

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;
+}