summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2024-02-20 12:45:08 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2024-03-13 12:00:29 +0100
commite7f3fc8f989adc641e35a3d49204aba7de613897 (patch)
treead5291c075af75db1cb584c6344a418d6216cbb2
parent8dbfac528ada57da80b2be32b97803af97d9c3c1 (diff)
downloadbarebox-e7f3fc8f989adc641e35a3d49204aba7de613897.tar.gz
barebox-e7f3fc8f989adc641e35a3d49204aba7de613897.tar.xz
ARM: i.MX93: add bootsource detection
On i.MX93 the ROM API can be used to detect the bootsource. Implement support for this. Link: https://lore.barebox.org/20240220114508.3685478-1-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--arch/arm/mach-imx/imx9.c1
-rw-r--r--arch/arm/mach-imx/romapi.c67
-rw-r--r--include/mach/imx/generic.h1
3 files changed, 69 insertions, 0 deletions
diff --git a/arch/arm/mach-imx/imx9.c b/arch/arm/mach-imx/imx9.c
index bfc248aadf..220951fd19 100644
--- a/arch/arm/mach-imx/imx9.c
+++ b/arch/arm/mach-imx/imx9.c
@@ -172,6 +172,7 @@ int imx93_init(void)
{
imx93_type();
imx93_set_arm_clock();
+ imx93_bootsource();
if (IS_ENABLED(CONFIG_PBL_OPTEE)) {
static struct of_optee_fixup_data optee_fixup_data = {
diff --git a/arch/arm/mach-imx/romapi.c b/arch/arm/mach-imx/romapi.c
index 797b479c3e..0f1555abad 100644
--- a/arch/arm/mach-imx/romapi.c
+++ b/arch/arm/mach-imx/romapi.c
@@ -10,11 +10,14 @@
#include <mach/imx/atf.h>
#include <mach/imx/imx8m-regs.h>
#include <mach/imx/xload.h>
+#include <mach/imx/generic.h>
#include <asm/barebox-arm.h>
#include <zero_page.h>
#include <memory.h>
#include <init.h>
#include <pbl.h>
+#include <mmu.h>
+#include <bootsource.h>
#define BOOTROM_INFO_VERSION 0x1
#define BOOTROM_INFO_BOOT_DEVICE 0x2
@@ -99,6 +102,41 @@ int imx8mn_romapi_load_image(void *bl33)
return imx8mp_romapi_load_image(bl33);
}
+static int imx_romapi_boot_device(struct rom_api *rom_api)
+{
+ uint32_t boot_device_type, boot_instance, boot_device;
+ enum bootsource bootsource = BOOTSOURCE_UNKNOWN;
+ int ret;
+
+ ret = imx_bootrom_query(rom_api, BOOTROM_INFO_BOOT_DEVICE, &boot_device);
+ if (ret)
+ return ret;
+
+ boot_device_type = FIELD_GET(BOOTROM_BOOT_DEVICE_INTERFACE, boot_device);
+ boot_instance = FIELD_GET(BOOTROM_BOOT_DEVICE_INSTANCE, boot_device);
+
+ switch (boot_device_type) {
+ case BT_DEV_TYPE_MMC:
+ case BT_DEV_TYPE_SD:
+ bootsource = BOOTSOURCE_MMC;
+ break;
+ case BT_DEV_TYPE_NAND:
+ bootsource = BOOTSOURCE_NAND;
+ break;
+ case BT_DEV_TYPE_FLEXSPINOR:
+ case BT_DEV_TYPE_SPI_NOR:
+ bootsource = BOOTSOURCE_SPI_NOR;
+ break;
+ case BT_DEV_TYPE_USB:
+ bootsource = BOOTSOURCE_USB;
+ break;
+ }
+
+ bootsource_set(bootsource, boot_instance);
+
+ return 0;
+}
+
static int imx_romapi_boot_device_seekable(struct rom_api *rom_api)
{
uint32_t boot_device, boot_device_type, boot_device_state;
@@ -242,3 +280,32 @@ void imx8m_save_bootrom_log(void)
imx8m_scratch_save_bootrom_log(rom_log);
}
+
+#define IMX93_BOOT_ROM_BASE 0x1000
+#define IMX93_BOOT_ROM_END (0x40000 - 1)
+
+void imx93_bootsource(void)
+{
+ struct rom_api *rom_api = (void *)0x1980;
+ struct resource rom = {
+ .start = IMX93_BOOT_ROM_BASE,
+ .end = IMX93_BOOT_ROM_END,
+ };
+ struct resource *r;
+ int ret;
+
+ r = request_iomem_region("Boot ROM", rom.start, rom.end);
+ if (IS_ERR(r)) {
+ ret = PTR_ERR(r);
+ goto out;
+ }
+
+ arch_remap_range((void *)rom.start, rom.start, resource_size(&rom), MAP_CACHED);
+
+ OPTIMIZER_HIDE_VAR(rom_api);
+
+ ret = imx_romapi_boot_device(rom_api);
+out:
+ if (ret)
+ pr_err("Failed to get bootsource: %pe\n", ERR_PTR(ret));
+}
diff --git a/include/mach/imx/generic.h b/include/mach/imx/generic.h
index 1dca335fdd..03f3695e60 100644
--- a/include/mach/imx/generic.h
+++ b/include/mach/imx/generic.h
@@ -22,6 +22,7 @@ void imx8mm_boot_save_loc(void);
void imx8mn_boot_save_loc(void);
void imx8mp_boot_save_loc(void);
void imx8mq_boot_save_loc(void);
+void imx93_bootsource(void);
void imx25_get_boot_source(enum bootsource *src, int *instance);
void imx27_get_boot_source(enum bootsource *src, int *instance);