]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - board/xilinx/zynqmp/zynqmp.c
ARM64: zynqmp: Add support for standard distro boot commands
[people/ms/u-boot.git] / board / xilinx / zynqmp / zynqmp.c
index 132d724fbdf8a9638dbe21a8d95d867fe8fb186d..f15dc5d71522231ed478bf3639747781bf9f59cb 100644 (file)
@@ -9,12 +9,14 @@
 #include <sata.h>
 #include <ahci.h>
 #include <scsi.h>
+#include <malloc.h>
 #include <asm/arch/clk.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/io.h>
 #include <usb.h>
 #include <dwc3-uboot.h>
+#include <i2c.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -50,6 +52,22 @@ int board_early_init_r(void)
        return 0;
 }
 
+int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)
+{
+#if defined(CONFIG_ZYNQ_GEM_EEPROM_ADDR) && \
+    defined(CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET) && \
+    defined(CONFIG_ZYNQ_EEPROM_BUS)
+       i2c_set_bus_num(CONFIG_ZYNQ_EEPROM_BUS);
+
+       if (eeprom_read(CONFIG_ZYNQ_GEM_EEPROM_ADDR,
+                       CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET,
+                       ethaddr, 6))
+               printf("I2C EEPROM MAC address read failed\n");
+#endif
+
+       return 0;
+}
+
 #if !defined(CONFIG_SYS_SDRAM_BASE) && !defined(CONFIG_SYS_SDRAM_SIZE)
 /*
  * fdt_get_reg - Fill buffer by information from DT
@@ -197,6 +215,13 @@ int board_late_init(void)
 {
        u32 reg = 0;
        u8 bootmode;
+       const char *mode;
+       char *new_targets;
+
+       if (!(gd->flags & GD_FLG_ENV_DEFAULT)) {
+               debug("Saved variables - Skipping\n");
+               return 0;
+       }
 
        reg = readl(&crlapb_base->boot_mode);
        bootmode = reg & BOOT_MODES_MASK;
@@ -205,37 +230,49 @@ int board_late_init(void)
        switch (bootmode) {
        case JTAG_MODE:
                puts("JTAG_MODE\n");
-               setenv("modeboot", "jtagboot");
+               mode = "pxe dhcp";
                break;
        case QSPI_MODE_24BIT:
        case QSPI_MODE_32BIT:
-               setenv("modeboot", "qspiboot");
+               mode = "qspi0";
                puts("QSPI_MODE\n");
                break;
        case EMMC_MODE:
                puts("EMMC_MODE\n");
-               setenv("modeboot", "sdboot");
+               mode = "mmc0";
                break;
        case SD_MODE:
                puts("SD_MODE\n");
-               setenv("modeboot", "sdboot");
+               mode = "mmc0";
                break;
        case SD_MODE1:
                puts("SD_MODE1\n");
 #if defined(CONFIG_ZYNQ_SDHCI0) && defined(CONFIG_ZYNQ_SDHCI1)
-               setenv("sdbootdev", "1");
+               mode = "mmc1";
+#else
+               mode = "mmc0";
 #endif
-               setenv("modeboot", "sdboot");
                break;
        case NAND_MODE:
                puts("NAND_MODE\n");
-               setenv("modeboot", "nandboot");
+               mode = "nand0";
                break;
        default:
+               mode = "";
                printf("Invalid Boot Mode:0x%x\n", bootmode);
                break;
        }
 
+       /*
+        * One terminating char + one byte for space between mode
+        * and default boot_targets
+        */
+       new_targets = calloc(1, strlen(mode) +
+                               strlen(getenv("boot_targets")) + 2);
+
+       sprintf(new_targets, "%s %s", mode, getenv("boot_targets"));
+       setenv("boot_targets", new_targets);
+
        return 0;
 }