]> Git Repo - J-u-boot.git/blobdiff - board/xilinx/zynqmp/zynqmp.c
command: Remove the cmd_tbl_t typedef
[J-u-boot.git] / board / xilinx / zynqmp / zynqmp.c
index d649daba96d49ac9a0cfbc391b508621ffcf5050..7a8c745f9beff99f55c784c923de90dbd51ddce1 100644 (file)
@@ -5,7 +5,12 @@
  */
 
 #include <common.h>
+#include <command.h>
+#include <cpu_func.h>
+#include <debug_uart.h>
 #include <env.h>
+#include <init.h>
+#include <net.h>
 #include <sata.h>
 #include <ahci.h>
 #include <scsi.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/arch/psu_init_gpl.h>
+#include <asm/cache.h>
 #include <asm/io.h>
 #include <dm/device.h>
 #include <dm/uclass.h>
 #include <usb.h>
 #include <dwc3-uboot.h>
 #include <zynqmppl.h>
+#include <zynqmp_firmware.h>
 #include <g_dnl.h>
+#include "../common/board.h"
 
 #include "pm_cfg_obj.h"
 
@@ -173,6 +181,14 @@ static const struct {
                .id = 0x66,
                .name = "39dr",
        },
+       {
+               .id = 0x7b,
+               .name = "48dr",
+       },
+       {
+               .id = 0x7e,
+               .name = "49dr",
+       },
 };
 #endif
 
@@ -307,29 +323,47 @@ static char *zynqmp_get_silicon_idcode_name(void)
 
 int board_early_init_f(void)
 {
-       int ret = 0;
-#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_CLK_ZYNQMP)
-       u32 pm_api_version;
+#if defined(CONFIG_ZYNQMP_PSU_INIT_ENABLED)
+       int ret;
 
-       pm_api_version = zynqmp_pmufw_version();
-       printf("PMUFW:\tv%d.%d\n",
-              pm_api_version >> ZYNQMP_PM_VERSION_MAJOR_SHIFT,
-              pm_api_version & ZYNQMP_PM_VERSION_MINOR_MASK);
+       ret = psu_init();
+       if (ret)
+               return ret;
 
-       if (pm_api_version < ZYNQMP_PM_VERSION)
-               panic("PMUFW version error. Expected: v%d.%d\n",
-                     ZYNQMP_PM_VERSION_MAJOR, ZYNQMP_PM_VERSION_MINOR);
+       /* Delay is required for clocks to be propagated */
+       udelay(1000000);
 #endif
 
-#if defined(CONFIG_ZYNQMP_PSU_INIT_ENABLED)
-       ret = psu_init();
+#ifdef CONFIG_DEBUG_UART
+       /* Uart debug for sure */
+       debug_uart_init();
+       puts("Debug uart enabled\n"); /* or printch() */
 #endif
 
-       return ret;
+       return 0;
+}
+
+static int multi_boot(void)
+{
+       u32 multiboot;
+
+       multiboot = readl(&csu_base->multi_boot);
+
+       printf("Multiboot:\t%x\n", multiboot);
+
+       return 0;
 }
 
 int board_init(void)
 {
+#if defined(CONFIG_ZYNQMP_FIRMWARE)
+       struct udevice *dev;
+
+       uclass_get_device_by_name(UCLASS_FIRMWARE, "zynqmp-power", &dev);
+       if (!dev)
+               panic("PMU Firmware device not found - Enable it");
+#endif
+
 #if defined(CONFIG_SPL_BUILD)
        /* Check *at build time* if the filename is an non-empty string */
        if (sizeof(CONFIG_ZYNQMP_SPL_PM_CFG_OBJ_FILE) > 1)
@@ -350,6 +384,9 @@ int board_init(void)
        }
 #endif
 
+       if (current_el() == 3)
+               multi_boot();
+
        return 0;
 }
 
@@ -379,7 +416,7 @@ int board_early_init_r(void)
 }
 
 unsigned long do_go_exec(ulong (*entry)(int, char * const []), int argc,
-                        char * const argv[])
+                        char *const argv[])
 {
        int ret = 0;
 
@@ -481,7 +518,7 @@ static int reset_reason(void)
 
        env_set("reset_reason", reason);
 
-       ret = zynqmp_mmio_write(~0, ~0, (ulong)&crlapb_base->reset_reason);
+       ret = zynqmp_mmio_write((ulong)&crlapb_base->reset_reason, ~0, ~0);
        if (ret)
                return -EINVAL;
 
@@ -518,9 +555,26 @@ static int set_fdtfile(void)
        return 0;
 }
 
-int board_late_init(void)
+static u8 zynqmp_get_bootmode(void)
 {
+       u8 bootmode;
        u32 reg = 0;
+       int ret;
+
+       ret = zynqmp_mmio_read((ulong)&crlapb_base->boot_mode, &reg);
+       if (ret)
+               return -EINVAL;
+
+       if (reg >> BOOT_MODE_ALT_SHIFT)
+               reg >>= BOOT_MODE_ALT_SHIFT;
+
+       bootmode = reg & BOOT_MODES_MASK;
+
+       return bootmode;
+}
+
+int board_late_init(void)
+{
        u8 bootmode;
        struct udevice *dev;
        int bootseq = -1;
@@ -544,14 +598,7 @@ int board_late_init(void)
        if (ret)
                return ret;
 
-       ret = zynqmp_mmio_read((ulong)&crlapb_base->boot_mode, &reg);
-       if (ret)
-               return -EINVAL;
-
-       if (reg >> BOOT_MODE_ALT_SHIFT)
-               reg >>= BOOT_MODE_ALT_SHIFT;
-
-       bootmode = reg & BOOT_MODES_MASK;
+       bootmode = zynqmp_get_bootmode();
 
        puts("Bootmode: ");
        switch (bootmode) {
@@ -562,7 +609,7 @@ int board_late_init(void)
                break;
        case JTAG_MODE:
                puts("JTAG_MODE\n");
-               mode = "pxe dhcp";
+               mode = "jtag pxe dhcp";
                env_set("modeboot", "jtagboot");
                break;
        case QSPI_MODE_24BIT:
@@ -573,8 +620,17 @@ int board_late_init(void)
                break;
        case EMMC_MODE:
                puts("EMMC_MODE\n");
-               mode = "mmc0";
-               env_set("modeboot", "emmcboot");
+               if (uclass_get_device_by_name(UCLASS_MMC,
+                                             "mmc@ff160000", &dev) &&
+                   uclass_get_device_by_name(UCLASS_MMC,
+                                             "sdhci@ff160000", &dev)) {
+                       puts("Boot from EMMC but without SD0 enabled!\n");
+                       return -1;
+               }
+               debug("mmc0 device found at %p, seq %d\n", dev, dev->seq);
+
+               mode = "mmc";
+               bootseq = dev->seq;
                break;
        case SD_MODE:
                puts("SD_MODE\n");
@@ -649,7 +705,7 @@ int board_late_init(void)
 
        reset_reason();
 
-       return 0;
+       return board_late_init_xilinx();
 }
 #endif
 
This page took 0.031971 seconds and 4 git commands to generate.