[U-Boot] [PATCH] arm64: versal: Define board_late_init for versal
Michal Simek
monstr at monstr.eu
Tue Oct 8 07:28:35 UTC 2019
st 11. 9. 2019 v 9:16 odesÃlatel Michal Simek <michal.simek at xilinx.com> napsal:
>
> From: Siva Durga Prasad Paladugu <siva.durga.paladugu at xilinx.com>
>
> Define board_late_init which performs bootmode detection
> and prepares corresponding distro boot commaand sequence.
>
> Also disable it for mini platforms because simply there is no need to have
> it enabled.
> But also disable it for virtual platform because Qemu is not modelling this
> register space that's why travis testing would fail. This configuration
> should be reverted when mainline Qemu is updated.
>
> Signed-off-by: Siva Durga Prasad Paladugu <siva.durga.paladugu at xilinx.com>
> Signed-off-by: Michal Simek <michal.simek at xilinx.com>
> ---
>
> arch/arm/Kconfig | 1 +
> arch/arm/mach-versal/include/mach/hardware.h | 23 ++++
> board/xilinx/versal/board.c | 111 +++++++++++++++++++
> configs/xilinx_versal_mini_emmc0_defconfig | 1 +
> configs/xilinx_versal_mini_emmc1_defconfig | 1 +
> configs/xilinx_versal_virt_defconfig | 1 +
> 6 files changed, 138 insertions(+)
>
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 3b0e315061aa..a93138aa0ada 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -980,6 +980,7 @@ config ARCH_VERSAL
> select DM_MMC if MMC
> select DM_SERIAL
> select OF_CONTROL
> + imply BOARD_LATE_INIT
>
> config ARCH_VF610
> bool "Freescale Vybrid"
> diff --git a/arch/arm/mach-versal/include/mach/hardware.h b/arch/arm/mach-versal/include/mach/hardware.h
> index 23fbc3d8f536..e26beab2e9cd 100644
> --- a/arch/arm/mach-versal/include/mach/hardware.h
> +++ b/arch/arm/mach-versal/include/mach/hardware.h
> @@ -51,3 +51,26 @@ struct rpu_regs {
> };
>
> #define rpu_base ((struct rpu_regs *)VERSAL_RPU_BASEADDR)
> +
> +#define VERSAL_CRP_BASEADDR 0xF1260000
> +
> +struct crp_regs {
> + u32 reserved0[128];
> + u32 boot_mode_usr;
> +};
> +
> +#define crp_base ((struct crp_regs *)VERSAL_CRP_BASEADDR)
> +
> +/* Bootmode setting values */
> +#define BOOT_MODES_MASK 0x0000000F
> +#define QSPI_MODE_24BIT 0x00000001
> +#define QSPI_MODE_32BIT 0x00000002
> +#define SD_MODE 0x00000003 /* sd 0 */
> +#define SD_MODE1 0x00000005 /* sd 1 */
> +#define EMMC_MODE 0x00000006
> +#define USB_MODE 0x00000007
> +#define OSPI_MODE 0x00000008
> +#define SD1_LSHFT_MODE 0x0000000E /* SD1 Level shifter */
> +#define JTAG_MODE 0x00000000
> +#define BOOT_MODE_USE_ALT 0x100
> +#define BOOT_MODE_ALT_SHIFT 12
> diff --git a/board/xilinx/versal/board.c b/board/xilinx/versal/board.c
> index 90751477b5e1..b5ddd0c5ad24 100644
> --- a/board/xilinx/versal/board.c
> +++ b/board/xilinx/versal/board.c
> @@ -9,6 +9,8 @@
> #include <malloc.h>
> #include <asm/io.h>
> #include <asm/arch/hardware.h>
> +#include <dm/device.h>
> +#include <dm/uclass.h>
>
> DECLARE_GLOBAL_DATA_PTR;
>
> @@ -65,6 +67,115 @@ int board_early_init_r(void)
> return 0;
> }
>
> +int board_late_init(void)
> +{
> + u32 reg = 0;
> + u8 bootmode;
> + struct udevice *dev;
> + int bootseq = -1;
> + int bootseq_len = 0;
> + int env_targets_len = 0;
> + const char *mode;
> + char *new_targets;
> + char *env_targets;
> +
> + if (!(gd->flags & GD_FLG_ENV_DEFAULT)) {
> + debug("Saved variables - Skipping\n");
> + return 0;
> + }
> +
> + reg = readl(&crp_base->boot_mode_usr);
> +
> + if (reg >> BOOT_MODE_ALT_SHIFT)
> + reg >>= BOOT_MODE_ALT_SHIFT;
> +
> + bootmode = reg & BOOT_MODES_MASK;
> +
> + puts("Bootmode: ");
> + switch (bootmode) {
> + case JTAG_MODE:
> + puts("JTAG_MODE\n");
> + mode = "pxe dhcp";
> + break;
> + case QSPI_MODE_24BIT:
> + puts("QSPI_MODE_24\n");
> + mode = "xspi0";
> + break;
> + case QSPI_MODE_32BIT:
> + puts("QSPI_MODE_32\n");
> + mode = "xspi0";
> + break;
> + case OSPI_MODE:
> + puts("OSPI_MODE\n");
> + mode = "xspi0";
> + break;
> + case EMMC_MODE:
> + puts("EMMC_MODE\n");
> + mode = "mmc0";
> + break;
> + case SD_MODE:
> + puts("SD_MODE\n");
> + if (uclass_get_device_by_name(UCLASS_MMC,
> + "sdhci at f1040000", &dev)) {
> + puts("Boot from SD0 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 SD1_LSHFT_MODE:
> + puts("LVL_SHFT_");
> + /* fall through */
> + case SD_MODE1:
> + puts("SD_MODE1\n");
> + if (uclass_get_device_by_name(UCLASS_MMC,
> + "sdhci at f1050000", &dev)) {
> + puts("Boot from SD1 but without SD1 enabled!\n");
> + return -1;
> + }
> + debug("mmc1 device found at %p, seq %d\n", dev, dev->seq);
> +
> + mode = "mmc";
> + bootseq = dev->seq;
> + break;
> + default:
> + mode = "";
> + printf("Invalid Boot Mode:0x%x\n", bootmode);
> + break;
> + }
> +
> + if (bootseq >= 0) {
> + bootseq_len = snprintf(NULL, 0, "%i", bootseq);
> + debug("Bootseq len: %x\n", bootseq_len);
> + }
> +
> + /*
> + * One terminating char + one byte for space between mode
> + * and default boot_targets
> + */
> + env_targets = env_get("boot_targets");
> + if (env_targets)
> + env_targets_len = strlen(env_targets);
> +
> + new_targets = calloc(1, strlen(mode) + env_targets_len + 2 +
> + bootseq_len);
> + if (!new_targets)
> + return -ENOMEM;
> +
> + if (bootseq >= 0)
> + sprintf(new_targets, "%s%x %s", mode, bootseq,
> + env_targets ? env_targets : "");
> + else
> + sprintf(new_targets, "%s %s", mode,
> + env_targets ? env_targets : "");
> +
> + env_set("boot_targets", new_targets);
> +
> + return 0;
> +}
> +
> int dram_init_banksize(void)
> {
> fdtdec_setup_memory_banksize();
> diff --git a/configs/xilinx_versal_mini_emmc0_defconfig b/configs/xilinx_versal_mini_emmc0_defconfig
> index 440035f53bbc..08d23243bee4 100644
> --- a/configs/xilinx_versal_mini_emmc0_defconfig
> +++ b/configs/xilinx_versal_mini_emmc0_defconfig
> @@ -8,6 +8,7 @@ CONFIG_NR_DRAM_BANKS=1
> CONFIG_SYS_MALLOC_LEN=0x80000
> CONFIG_COUNTER_FREQUENCY=2720000
> CONFIG_SYS_CONSOLE_INFO_QUIET=y
> +# CONFIG_BOARD_LATE_INIT is not set
> # CONFIG_DISPLAY_CPUINFO is not set
> CONFIG_BOARD_EARLY_INIT_R=y
> # CONFIG_CMDLINE_EDITING is not set
> diff --git a/configs/xilinx_versal_mini_emmc1_defconfig b/configs/xilinx_versal_mini_emmc1_defconfig
> index 07ec6ebd664b..fef5cadd6ea7 100644
> --- a/configs/xilinx_versal_mini_emmc1_defconfig
> +++ b/configs/xilinx_versal_mini_emmc1_defconfig
> @@ -8,6 +8,7 @@ CONFIG_NR_DRAM_BANKS=1
> CONFIG_SYS_MALLOC_LEN=0x80000
> CONFIG_COUNTER_FREQUENCY=2720000
> CONFIG_SYS_CONSOLE_INFO_QUIET=y
> +# CONFIG_BOARD_LATE_INIT is not set
> # CONFIG_DISPLAY_CPUINFO is not set
> CONFIG_BOARD_EARLY_INIT_R=y
> # CONFIG_CMDLINE_EDITING is not set
> diff --git a/configs/xilinx_versal_virt_defconfig b/configs/xilinx_versal_virt_defconfig
> index 3b07545ac4af..75f8b983080d 100644
> --- a/configs/xilinx_versal_virt_defconfig
> +++ b/configs/xilinx_versal_virt_defconfig
> @@ -12,6 +12,7 @@ CONFIG_FIT_VERBOSE=y
> # CONFIG_ARCH_FIXUP_FDT_MEMORY is not set
> CONFIG_BOOTDELAY=-1
> CONFIG_SUPPORT_RAW_INITRD=y
> +# CONFIG_BOARD_LATE_INIT is not set
> # CONFIG_DISPLAY_CPUINFO is not set
> CONFIG_BOARD_EARLY_INIT_R=y
> CONFIG_HUSH_PARSER=y
> --
> 2.17.1
>
Applied but with disabling late configurations for mini_defconfig too.
M
--
Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel - Xilinx Microblaze
Maintainer of Linux kernel - Xilinx Zynq ARM and ZynqMP ARM64 SoCs
U-Boot custodian - Xilinx Microblaze/Zynq/ZynqMP/Versal SoCs
More information about the U-Boot
mailing list