J721E/J7200 decodes the ROM-selected boot media in j721e_init.c,
which is built only for xPL. This keeps spl_boot_device() working, but
leaves U-Boot proper without the get_boot_device() implementation
declared by the common K3 hardware header. Board code that uses the
helper to select the environment or boot targets therefore cannot link.

Move the existing primary and backup boot-media decoding into a new
boot.c and build it unconditionally for J721E and J7200. Keep
spl_boot_device() as a wrapper around get_boot_device(), preserving the
existing xPL result while making the same decode available outside xPL.

Tested on: J7200X-PM2-SOM rev E8

Signed-off-by: Patryk Biel <[email protected]>
---
This follows the existing J721S2 layout and only moves the existing
J721E/J7200 boot-media decoding out of the xPL-only init file.
---
 arch/arm/mach-k3/j7200/Makefile     |  1 +
 arch/arm/mach-k3/j721e/Makefile     |  1 +
 arch/arm/mach-k3/j721e/boot.c       | 76 +++++++++++++++++++++++++++++++++++++
 arch/arm/mach-k3/j721e/j721e_init.c | 69 +--------------------------------
 4 files changed, 79 insertions(+), 68 deletions(-)

diff --git a/arch/arm/mach-k3/j7200/Makefile b/arch/arm/mach-k3/j7200/Makefile
index 
6d3ff36e363c259481fd92aeee7b8ea894b0905e..c62d745bf8ea4e851c4e650b36d828140bdc0cf5
 100644
--- a/arch/arm/mach-k3/j7200/Makefile
+++ b/arch/arm/mach-k3/j7200/Makefile
@@ -5,3 +5,4 @@
 
 obj-$(CONFIG_OF_SYSTEM_SETUP) += ../j721e/j721e_fdt.o
 obj-$(CONFIG_XPL_BUILD) += ../j721e/j721e_init.o
+obj-y += ../j721e/boot.o
diff --git a/arch/arm/mach-k3/j721e/Makefile b/arch/arm/mach-k3/j721e/Makefile
index 
e4b0e5a8193e5aedfcdc977385572a3cb52aed75..d45b76d01f0bd805656c63071a3aa3e4106608ed
 100644
--- a/arch/arm/mach-k3/j721e/Makefile
+++ b/arch/arm/mach-k3/j721e/Makefile
@@ -5,3 +5,4 @@
 
 obj-$(CONFIG_OF_SYSTEM_SETUP) += j721e_fdt.o
 obj-$(CONFIG_XPL_BUILD) += j721e_init.o
+obj-y += boot.o
diff --git a/arch/arm/mach-k3/j721e/boot.c b/arch/arm/mach-k3/j721e/boot.c
new file mode 100644
index 
0000000000000000000000000000000000000000..10ed1c607c71e25740733dad64f45b21a3668f38
--- /dev/null
+++ b/arch/arm/mach-k3/j721e/boot.c
@@ -0,0 +1,76 @@
+// SPDX-License-Identifier: GPL-2.0+
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/spl.h>
+
+static u32 __get_backup_bootmedia(u32 main_devstat)
+{
+       u32 bkup_boot = (main_devstat & MAIN_DEVSTAT_BKUP_BOOTMODE_MASK) >>
+                       MAIN_DEVSTAT_BKUP_BOOTMODE_SHIFT;
+
+       switch (bkup_boot) {
+       case BACKUP_BOOT_DEVICE_USB:
+               return BOOT_DEVICE_DFU;
+       case BACKUP_BOOT_DEVICE_UART:
+               return BOOT_DEVICE_UART;
+       case BACKUP_BOOT_DEVICE_ETHERNET:
+               return BOOT_DEVICE_ETHERNET;
+       case BACKUP_BOOT_DEVICE_MMC2:
+       {
+               u32 port = (main_devstat & MAIN_DEVSTAT_BKUP_MMC_PORT_MASK) >>
+                           MAIN_DEVSTAT_BKUP_MMC_PORT_SHIFT;
+               if (port == 0x0)
+                       return BOOT_DEVICE_MMC1;
+               return BOOT_DEVICE_MMC2;
+       }
+       case BACKUP_BOOT_DEVICE_SPI:
+               return BOOT_DEVICE_SPI;
+       case BACKUP_BOOT_DEVICE_I2C:
+               return BOOT_DEVICE_I2C;
+       }
+
+       return BOOT_DEVICE_RAM;
+}
+
+static u32 __get_primary_bootmedia(u32 main_devstat, u32 wkup_devstat)
+{
+       u32 bootmode = (wkup_devstat & WKUP_DEVSTAT_PRIMARY_BOOTMODE_MASK) >>
+                       WKUP_DEVSTAT_PRIMARY_BOOTMODE_SHIFT;
+
+       bootmode |= (main_devstat & MAIN_DEVSTAT_BOOT_MODE_B_MASK) <<
+                       BOOT_MODE_B_SHIFT;
+
+       if (bootmode == BOOT_DEVICE_OSPI || bootmode == BOOT_DEVICE_QSPI ||
+           bootmode == BOOT_DEVICE_XSPI)
+               bootmode = BOOT_DEVICE_SPI;
+
+       if (bootmode == BOOT_DEVICE_MMC2) {
+               u32 port = (main_devstat &
+                           MAIN_DEVSTAT_PRIM_BOOTMODE_MMC_PORT_MASK) >>
+                          MAIN_DEVSTAT_PRIM_BOOTMODE_PORT_SHIFT;
+               if (port == 0x0)
+                       bootmode = BOOT_DEVICE_MMC1;
+       }
+
+       return bootmode;
+}
+
+u32 get_boot_device(void)
+{
+       u32 wkup_devstat = readl(CTRLMMR_WKUP_DEVSTAT);
+       u32 main_devstat;
+       u32 bootindex = *(u32 *)(CONFIG_SYS_K3_BOOT_PARAM_TABLE_INDEX);
+
+       if (wkup_devstat & WKUP_DEVSTAT_MCU_ONLY_MASK) {
+               printf("ERROR: MCU only boot is not yet supported\n");
+               return BOOT_DEVICE_RAM;
+       }
+
+       /* MAIN CTRL MMR can only be read if MCU ONLY is 0 */
+       main_devstat = readl(CTRLMMR_MAIN_DEVSTAT);
+
+       if (bootindex == K3_PRIMARY_BOOTMODE)
+               return __get_primary_bootmedia(main_devstat, wkup_devstat);
+       else
+               return __get_backup_bootmedia(main_devstat);
+}
diff --git a/arch/arm/mach-k3/j721e/j721e_init.c 
b/arch/arm/mach-k3/j721e/j721e_init.c
index 
f9af0288cf668a139947e228b93d38fefbbbfceb..a9224045b9f5cb25d288e631a6d971bf95634b6f
 100644
--- a/arch/arm/mach-k3/j721e/j721e_init.c
+++ b/arch/arm/mach-k3/j721e/j721e_init.c
@@ -438,59 +438,6 @@ u32 spl_mmc_boot_mode(struct mmc *mmc, const u32 
boot_device)
        }
 }
 
-static u32 __get_backup_bootmedia(u32 main_devstat)
-{
-       u32 bkup_boot = (main_devstat & MAIN_DEVSTAT_BKUP_BOOTMODE_MASK) >>
-                       MAIN_DEVSTAT_BKUP_BOOTMODE_SHIFT;
-
-       switch (bkup_boot) {
-       case BACKUP_BOOT_DEVICE_USB:
-               return BOOT_DEVICE_DFU;
-       case BACKUP_BOOT_DEVICE_UART:
-               return BOOT_DEVICE_UART;
-       case BACKUP_BOOT_DEVICE_ETHERNET:
-               return BOOT_DEVICE_ETHERNET;
-       case BACKUP_BOOT_DEVICE_MMC2:
-       {
-               u32 port = (main_devstat & MAIN_DEVSTAT_BKUP_MMC_PORT_MASK) >>
-                           MAIN_DEVSTAT_BKUP_MMC_PORT_SHIFT;
-               if (port == 0x0)
-                       return BOOT_DEVICE_MMC1;
-               return BOOT_DEVICE_MMC2;
-       }
-       case BACKUP_BOOT_DEVICE_SPI:
-               return BOOT_DEVICE_SPI;
-       case BACKUP_BOOT_DEVICE_I2C:
-               return BOOT_DEVICE_I2C;
-       }
-
-       return BOOT_DEVICE_RAM;
-}
-
-static u32 __get_primary_bootmedia(u32 main_devstat, u32 wkup_devstat)
-{
-
-       u32 bootmode = (wkup_devstat & WKUP_DEVSTAT_PRIMARY_BOOTMODE_MASK) >>
-                       WKUP_DEVSTAT_PRIMARY_BOOTMODE_SHIFT;
-
-       bootmode |= (main_devstat & MAIN_DEVSTAT_BOOT_MODE_B_MASK) <<
-                       BOOT_MODE_B_SHIFT;
-
-       if (bootmode == BOOT_DEVICE_OSPI || bootmode == BOOT_DEVICE_QSPI ||
-           bootmode == BOOT_DEVICE_XSPI)
-               bootmode = BOOT_DEVICE_SPI;
-
-       if (bootmode == BOOT_DEVICE_MMC2) {
-               u32 port = (main_devstat &
-                           MAIN_DEVSTAT_PRIM_BOOTMODE_MMC_PORT_MASK) >>
-                          MAIN_DEVSTAT_PRIM_BOOTMODE_PORT_SHIFT;
-               if (port == 0x0)
-                       bootmode = BOOT_DEVICE_MMC1;
-       }
-
-       return bootmode;
-}
-
 u32 spl_spi_boot_bus(void)
 {
        u32 wkup_devstat = readl(CTRLMMR_WKUP_DEVSTAT);
@@ -504,19 +451,5 @@ u32 spl_spi_boot_bus(void)
 
 u32 spl_boot_device(void)
 {
-       u32 wkup_devstat = readl(CTRLMMR_WKUP_DEVSTAT);
-       u32 main_devstat;
-
-       if (wkup_devstat & WKUP_DEVSTAT_MCU_ONLY_MASK) {
-               printf("ERROR: MCU only boot is not yet supported\n");
-               return BOOT_DEVICE_RAM;
-       }
-
-       /* MAIN CTRL MMR can only be read if MCU ONLY is 0 */
-       main_devstat = readl(CTRLMMR_MAIN_DEVSTAT);
-
-       if (bootindex == K3_PRIMARY_BOOTMODE)
-               return __get_primary_bootmedia(main_devstat, wkup_devstat);
-       else
-               return __get_backup_bootmedia(main_devstat);
+       return get_boot_device();
 }

---
base-commit: 5a92645e1f9020d24d19e03fff2ae63f30080770
change-id: 20260813-up-j721e-get-boot-device-71d9193151ae

Best regards,
-- 
Patryk Biel <[email protected]>

Reply via email to