summaryrefslogtreecommitdiff
path: root/board/xilinx/common
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2022-10-03 15:39:46 -0400
committerTom Rini <trini@konsulko.com>2022-10-03 15:39:46 -0400
commit2d4591353452638132d711551fec3495b7644731 (patch)
treee12058de7f553e84f8d13e545f130c7a48973589 /board/xilinx/common
parent4debc57a3da6c3f4d3f89a637e99206f4cea0a96 (diff)
parent6ee6e15975cad3c99fad3a66223f3fd9287a369b (diff)
Merge branch 'next'
Diffstat (limited to 'board/xilinx/common')
-rw-r--r--board/xilinx/common/board.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/board/xilinx/common/board.c b/board/xilinx/common/board.c
index 9b4aded466..391ce4dbd7 100644
--- a/board/xilinx/common/board.c
+++ b/board/xilinx/common/board.c
@@ -8,6 +8,8 @@
#include <efi.h>
#include <efi_loader.h>
#include <env.h>
+#include <image.h>
+#include <lmb.h>
#include <log.h>
#include <asm/global_data.h>
#include <asm/sections.h>
@@ -583,8 +585,33 @@ bool __maybe_unused __weak board_detection(void)
return false;
}
+bool __maybe_unused __weak soc_detection(void)
+{
+ return false;
+}
+
+char * __maybe_unused __weak soc_name_decode(void)
+{
+ return NULL;
+}
+
int embedded_dtb_select(void)
{
+ if (soc_detection()) {
+ char *soc_local_name;
+
+ soc_local_name = soc_name_decode();
+ if (soc_local_name) {
+ board_name = soc_local_name;
+ printf("Detected SOC name: %s\n", board_name);
+
+ /* Time to change DTB on fly */
+ /* Both ways should work here */
+ /* fdtdec_resetup(&rescan); */
+ return fdtdec_setup();
+ }
+ }
+
if (board_detection()) {
char *board_local_name;
@@ -602,3 +629,30 @@ int embedded_dtb_select(void)
return 0;
}
#endif
+
+#if defined(CONFIG_LMB)
+phys_size_t board_get_usable_ram_top(phys_size_t total_size)
+{
+ phys_size_t size;
+ phys_addr_t reg;
+ struct lmb lmb;
+
+ if (!total_size)
+ return gd->ram_top;
+
+ if (!IS_ALIGNED((ulong)gd->fdt_blob, 0x8))
+ panic("Not 64bit aligned DT location: %p\n", gd->fdt_blob);
+
+ /* found enough not-reserved memory to relocated U-Boot */
+ lmb_init(&lmb);
+ lmb_add(&lmb, gd->ram_base, gd->ram_size);
+ boot_fdt_add_mem_rsv_regions(&lmb, (void *)gd->fdt_blob);
+ size = ALIGN(CONFIG_SYS_MALLOC_LEN + total_size, MMU_SECTION_SIZE);
+ reg = lmb_alloc(&lmb, size, MMU_SECTION_SIZE);
+
+ if (!reg)
+ reg = gd->ram_top - size;
+
+ return reg + size;
+}
+#endif