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 |
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 --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; +}
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(-)