]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
board: phytec: common: k3: Update boot_targets at runtime
authorWadim Egorov <w.egorov@phytec.de>
Thu, 8 May 2025 15:15:46 +0000 (17:15 +0200)
committerTom Rini <trini@konsulko.com>
Thu, 22 May 2025 19:51:56 +0000 (13:51 -0600)
Factor out boot device detection from board_late_init() into a new
boot_targets_setup() helper.

Adjust the boot_targets environment variable to favor the device we
just booted from. If boot_targets is still at its default value,
prepend the current boot device to the list; otherwise leave any
user-customized order untouched.

Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
board/phytec/common/k3/board.c

index 828973a8e28caa4dc1811d69881e0cf8dd3ce32a..755b9ecd4074cec3a90bee406a212393cd343043 100644 (file)
@@ -121,24 +121,37 @@ enum env_location env_get_location(enum env_operation op, int prio)
 }
 
 #if IS_ENABLED(CONFIG_BOARD_LATE_INIT)
-int board_late_init(void)
+/**
+ * Ensure the boot order favors the device we just booted from.
+ * If boot_targets is still at its default value, move the current
+ * boot device to the front of the list. Otherwise, leave any customized
+ * order untouched.
+ */
+static void boot_targets_setup(void)
 {
        u32 boot_device = get_boot_device();
+       const char *boot_targets = NULL;
+       char boot_targets_default[100];
+       int ret;
 
        switch (boot_device) {
        case BOOT_DEVICE_MMC1:
                env_set_ulong("mmcdev", 0);
                env_set("boot", "mmc");
+               boot_targets = "mmc0 mmc1 spi_flash dhcp";
                break;
        case BOOT_DEVICE_MMC2:
                env_set_ulong("mmcdev", 1);
                env_set("boot", "mmc");
+               boot_targets = "mmc1 mmc0 spi_flash dhcp";
                break;
        case BOOT_DEVICE_SPI:
                env_set("boot", "spi");
+               boot_targets = "spi_flash mmc0 mmc1 dhcp";
                break;
        case BOOT_DEVICE_ETHERNET:
                env_set("boot", "net");
+               boot_targets = "dhcp mmc0 mmc1 spi_flash";
                break;
        case BOOT_DEVICE_UART:
                env_set("boot", "uart");
@@ -148,6 +161,25 @@ int board_late_init(void)
                break;
        };
 
+       if (!boot_targets)
+               return;
+
+       ret = env_get_default_into("boot_targets", boot_targets_default, sizeof(boot_targets_default));
+       if (ret < 0)
+               boot_targets_default[0] = '\0';
+
+       if (strcmp(boot_targets_default, env_get("boot_targets"))) {
+               debug("boot_targets not default, don't change it\n");
+               return;
+       }
+
+       env_set("boot_targets", boot_targets);
+}
+
+int board_late_init(void)
+{
+       boot_targets_setup();
+
        if (IS_ENABLED(CONFIG_PHYTEC_SOM_DETECTION_BLOCKS)) {
                struct phytec_api3_element *block_element;
                struct phytec_eeprom_data data;