diff mbox series

[U-Boot] arm64: versal: Add platform detection code to versal_virt

Message ID ec0601fa67fe49c0e9dca15dafdc3d262d6872a5.1568188279.git.michal.simek@xilinx.com
State Deferred
Headers show
Series [U-Boot] arm64: versal: Add platform detection code to versal_virt | expand

Commit Message

Michal Simek Sept. 11, 2019, 7:51 a.m. UTC
Detect which platform U-Boot is running at and based on that choose DTS
file which U-Boot uses for own configuration.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

 arch/arm/mach-versal/cpu.c                   | 18 +++++---
 arch/arm/mach-versal/include/mach/hardware.h |  9 ++++
 board/xilinx/versal/board.c                  | 43 ++++++++++++++++++++
 3 files changed, 65 insertions(+), 5 deletions(-)

Comments

Michal Simek Oct. 8, 2019, 7:36 a.m. UTC | #1
st 11. 9. 2019 v 9:51 odesílatel Michal Simek <michal.simek@xilinx.com> napsal:
>
> Detect which platform U-Boot is running at and based on that choose DTS
> file which U-Boot uses for own configuration.
>
> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
> ---
>
>  arch/arm/mach-versal/cpu.c                   | 18 +++++---
>  arch/arm/mach-versal/include/mach/hardware.h |  9 ++++
>  board/xilinx/versal/board.c                  | 43 ++++++++++++++++++++
>  3 files changed, 65 insertions(+), 5 deletions(-)
>
> diff --git a/arch/arm/mach-versal/cpu.c b/arch/arm/mach-versal/cpu.c
> index f0d047d3232f..3505b4638ed8 100644
> --- a/arch/arm/mach-versal/cpu.c
> +++ b/arch/arm/mach-versal/cpu.c
> @@ -7,6 +7,7 @@
>  #include <common.h>
>  #include <asm/armv8/mmu.h>
>  #include <asm/io.h>
> +#include <asm/sections.h>
>  #include <asm/arch/hardware.h>
>  #include <asm/arch/sys_proto.h>
>
> @@ -113,11 +114,18 @@ void *board_fdt_blob_setup(void)
>  {
>         static void *fw_dtb = (void *)CONFIG_VERSAL_OF_BOARD_DTB_ADDR;
>
> -       if (fdt_magic(fw_dtb) != FDT_MAGIC) {
> -               printf("DTB is not passed via %llx\n", (u64)fw_dtb);
> -               return NULL;
> -       }
> +       if (fdt_magic(fw_dtb) == FDT_MAGIC)
> +               return fw_dtb;
> +
> +       printf("DTB is not passed via 0x%llx\n", (u64)fw_dtb);
> +
> +       /* Try to look at FDT is at end of image */
> +       fw_dtb = (ulong *)&_end;
> +
> +       if (fdt_magic(fw_dtb) == FDT_MAGIC)
> +               return fw_dtb;
>
> -       return fw_dtb;
> +       printf("DTB is also not passed via 0x%llx\n", (u64)fw_dtb);
> +       return NULL;
>  }
>  #endif
> diff --git a/arch/arm/mach-versal/include/mach/hardware.h b/arch/arm/mach-versal/include/mach/hardware.h
> index e26beab2e9cd..ac1bad02ec1c 100644
> --- a/arch/arm/mach-versal/include/mach/hardware.h
> +++ b/arch/arm/mach-versal/include/mach/hardware.h
> @@ -52,6 +52,15 @@ struct rpu_regs {
>
>  #define rpu_base ((struct rpu_regs *)VERSAL_RPU_BASEADDR)
>
> +#define VERSAL_PMC_TAP_BASEADDR        0xF11A0000
> +
> +struct pmc_tap_regs {
> +       u32 idcode; /* 0x0 */
> +       u32 version; /* 0x4 */
> +};
> +
> +#define pmc_base_base ((struct pmc_tap_regs *)VERSAL_PMC_TAP_BASEADDR)
> +
>  #define VERSAL_CRP_BASEADDR    0xF1260000
>
>  struct crp_regs {
> diff --git a/board/xilinx/versal/board.c b/board/xilinx/versal/board.c
> index 5718e1aa7e47..12ea7a0d0589 100644
> --- a/board/xilinx/versal/board.c
> +++ b/board/xilinx/versal/board.c
> @@ -217,3 +217,46 @@ int dram_init(void)
>  void reset_cpu(ulong addr)
>  {
>  }
> +
> +#define PMC_TAP_VERSION_PLATFORM_MASK  0xF
> +#define PMC_TAP_VERSION_PLATFORM_SHIFT 24
> +
> +/* pmc_tap_version platform */
> +#define PMC_TAP_VERSION_SILICON        0
> +#define PMC_TAP_VERSION_SPP    1
> +#define PMC_TAP_VERSION_EMU    2
> +#define PMC_TAP_VERSION_QEMU   3
> +
> +int __maybe_unused board_fit_config_name_match(const char *name)
> +{
> +       u32 version, platform;
> +       char *platform_name = NULL;
> +
> +       version = readl(&pmc_base_base->version);
> +       platform = (version >> PMC_TAP_VERSION_PLATFORM_SHIFT) &
> +                  PMC_TAP_VERSION_PLATFORM_MASK;
> +
> +       switch (platform) {
> +       case PMC_TAP_VERSION_SILICON:
> +               platform_name = "versal-tenzing"; /* For now */
> +               debug("Running on Silicon\n");
> +               break;
> +       case PMC_TAP_VERSION_SPP:
> +               platform_name = "versal-spp";
> +               break;
> +       case PMC_TAP_VERSION_EMU:
> +               platform_name = "versal-emu";
> +               break;
> +       case PMC_TAP_VERSION_QEMU:
> +               platform_name = "versal-qemu"; /* Internal QEMU */
> +               debug("Running on QEMU which is suspicious\n");
> +               break;
> +       }
> +
> +       if (!strncmp(name, platform_name, sizeof(platform_name))) {
> +               printf("Selecting DTB %s for board %s\n", name, platform_name);
> +               return 0;
> +       }
> +
> +       return -1;
> +}
> --
> 2.17.1
>

This requires rework in connection to platform detection that's why not applied.
M
diff mbox series

Patch

diff --git a/arch/arm/mach-versal/cpu.c b/arch/arm/mach-versal/cpu.c
index f0d047d3232f..3505b4638ed8 100644
--- a/arch/arm/mach-versal/cpu.c
+++ b/arch/arm/mach-versal/cpu.c
@@ -7,6 +7,7 @@ 
 #include <common.h>
 #include <asm/armv8/mmu.h>
 #include <asm/io.h>
+#include <asm/sections.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/sys_proto.h>
 
@@ -113,11 +114,18 @@  void *board_fdt_blob_setup(void)
 {
 	static void *fw_dtb = (void *)CONFIG_VERSAL_OF_BOARD_DTB_ADDR;
 
-	if (fdt_magic(fw_dtb) != FDT_MAGIC) {
-		printf("DTB is not passed via %llx\n", (u64)fw_dtb);
-		return NULL;
-	}
+	if (fdt_magic(fw_dtb) == FDT_MAGIC)
+		return fw_dtb;
+
+	printf("DTB is not passed via 0x%llx\n", (u64)fw_dtb);
+
+	/* Try to look at FDT is at end of image */
+	fw_dtb = (ulong *)&_end;
+
+	if (fdt_magic(fw_dtb) == FDT_MAGIC)
+		return fw_dtb;
 
-	return fw_dtb;
+	printf("DTB is also not passed via 0x%llx\n", (u64)fw_dtb);
+	return NULL;
 }
 #endif
diff --git a/arch/arm/mach-versal/include/mach/hardware.h b/arch/arm/mach-versal/include/mach/hardware.h
index e26beab2e9cd..ac1bad02ec1c 100644
--- a/arch/arm/mach-versal/include/mach/hardware.h
+++ b/arch/arm/mach-versal/include/mach/hardware.h
@@ -52,6 +52,15 @@  struct rpu_regs {
 
 #define rpu_base ((struct rpu_regs *)VERSAL_RPU_BASEADDR)
 
+#define VERSAL_PMC_TAP_BASEADDR	0xF11A0000
+
+struct pmc_tap_regs {
+	u32 idcode; /* 0x0 */
+	u32 version; /* 0x4 */
+};
+
+#define pmc_base_base ((struct pmc_tap_regs *)VERSAL_PMC_TAP_BASEADDR)
+
 #define VERSAL_CRP_BASEADDR	0xF1260000
 
 struct crp_regs {
diff --git a/board/xilinx/versal/board.c b/board/xilinx/versal/board.c
index 5718e1aa7e47..12ea7a0d0589 100644
--- a/board/xilinx/versal/board.c
+++ b/board/xilinx/versal/board.c
@@ -217,3 +217,46 @@  int dram_init(void)
 void reset_cpu(ulong addr)
 {
 }
+
+#define PMC_TAP_VERSION_PLATFORM_MASK	0xF
+#define PMC_TAP_VERSION_PLATFORM_SHIFT	24
+
+/* pmc_tap_version platform */
+#define PMC_TAP_VERSION_SILICON	0
+#define PMC_TAP_VERSION_SPP	1
+#define PMC_TAP_VERSION_EMU	2
+#define PMC_TAP_VERSION_QEMU	3
+
+int __maybe_unused board_fit_config_name_match(const char *name)
+{
+	u32 version, platform;
+	char *platform_name = NULL;
+
+	version = readl(&pmc_base_base->version);
+	platform = (version >> PMC_TAP_VERSION_PLATFORM_SHIFT) &
+		   PMC_TAP_VERSION_PLATFORM_MASK;
+
+	switch (platform) {
+	case PMC_TAP_VERSION_SILICON:
+		platform_name = "versal-tenzing"; /* For now */
+		debug("Running on Silicon\n");
+		break;
+	case PMC_TAP_VERSION_SPP:
+		platform_name = "versal-spp";
+		break;
+	case PMC_TAP_VERSION_EMU:
+		platform_name = "versal-emu";
+		break;
+	case PMC_TAP_VERSION_QEMU:
+		platform_name = "versal-qemu"; /* Internal QEMU */
+		debug("Running on QEMU which is suspicious\n");
+		break;
+	}
+
+	if (!strncmp(name, platform_name, sizeof(platform_name))) {
+		printf("Selecting DTB %s for board %s\n", name, platform_name);
+		return 0;
+	}
+
+	return -1;
+}