summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorIlias Apalodimas <[email protected]>2026-06-17 10:48:19 +0300
committerTom Rini <[email protected]>2026-06-24 18:13:24 -0600
commit1174c99ab421168221be372bd83a4143bf5f167d (patch)
tree8cf44beda8b853593a111add53bfab27c0b06293 /lib
parent47e9c542ee032e89f556adc73c2aeff3acb0e5a9 (diff)
treewide: move bi_dram[] from bd to gd
Currently, the bi_dram[] information is stored in the board info structure (bd). Because bd is only valid after reserve_board(), dram_init_banksize() must be called late in the initialization process. This limitation is problematic, as it forces us to rely on a variety of bespoke functions to determine board RAM, bank memory sizes, and other early setup requirements. By moving bi_dram[] into the global data (gd), we can run it earlier. This is particularly convenient since boards define their own dram_init_banksize() routines, which do not always rely on parsing Device Tree (DT) memory nodes. Additionally, U-Boot defaults to relocating to the top of the first memory bank. While boards currently use custom functions to override this behavior, having the DRAM bank information available earlier in gd makes relocating to a different bank trivial and standardizes the process. Reviewed-by: Anshul Dalal <[email protected]> Tested-by: Michal Simek <[email protected]> # Versal Gen 2 Vek385 Tested-by: Anshul Dalal <[email protected]> Reviewed-by: Simon Glass <[email protected]> Signed-off-by: Ilias Apalodimas <[email protected]> Tested-by: Christophe Leroy (CS GROUP) <[email protected]>
Diffstat (limited to 'lib')
-rw-r--r--lib/fdtdec.c23
-rw-r--r--lib/lmb.c19
2 files changed, 21 insertions, 21 deletions
diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index d0a84b5034b..b91e067106d 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -35,6 +35,7 @@
#include <linux/ctype.h>
#include <linux/lzo.h>
#include <linux/ioport.h>
+#include <asm/global_data.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -1142,14 +1143,14 @@ int fdtdec_setup_memory_banksize(void)
if (ret != 0)
return -EINVAL;
- gd->bd->bi_dram[bank].start = (phys_addr_t)res.start;
- gd->bd->bi_dram[bank].size =
+ gd->dram[bank].start = (phys_addr_t)res.start;
+ gd->dram[bank].size =
(phys_size_t)(res.end - res.start + 1);
debug("%s: DRAM Bank #%d: start = %pap, size = %pap\n",
__func__, bank,
- &gd->bd->bi_dram[bank].start,
- &gd->bd->bi_dram[bank].size);
+ &gd->dram[bank].start,
+ &gd->dram[bank].size);
}
return 0;
@@ -1930,7 +1931,7 @@ int fdtdec_resetup(int *rescan)
int fdtdec_decode_ram_size(const void *blob, const char *area, int board_id,
phys_addr_t *basep, phys_size_t *sizep,
- struct bd_info *bd)
+ gd_t *gd_ptr)
{
int addr_cells, size_cells;
const u32 *cell, *end;
@@ -1982,8 +1983,8 @@ int fdtdec_decode_ram_size(const void *blob, const char *area, int board_id,
}
/* Note: if no matching subnode was found we use the parent node */
- if (bd) {
- memset(bd->bi_dram, '\0', sizeof(bd->bi_dram[0]) *
+ if (gd_ptr) {
+ memset(gd_ptr->dram, '\0', sizeof(gd_ptr->dram[0]) *
CONFIG_NR_DRAM_BANKS);
}
@@ -1999,8 +2000,8 @@ int fdtdec_decode_ram_size(const void *blob, const char *area, int board_id,
if (addr_cells == 2)
addr += (u64)fdt32_to_cpu(*cell++) << 32UL;
addr += fdt32_to_cpu(*cell++);
- if (bd)
- bd->bi_dram[bank].start = addr;
+ if (gd_ptr)
+ gd_ptr->dram[bank].start = addr;
if (basep && !bank)
*basep = (phys_addr_t)addr;
@@ -2022,8 +2023,8 @@ int fdtdec_decode_ram_size(const void *blob, const char *area, int board_id,
}
}
- if (bd)
- bd->bi_dram[bank].size = size;
+ if (gd_ptr)
+ gd_ptr->dram[bank].size = size;
total_size += size;
}
diff --git a/lib/lmb.c b/lib/lmb.c
index 779df35eb9c..77440a48486 100644
--- a/lib/lmb.c
+++ b/lib/lmb.c
@@ -555,12 +555,12 @@ static void lmb_reserve_uboot_region(void)
#endif
for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
- if (!gd->bd->bi_dram[bank].size ||
- rsv_start < gd->bd->bi_dram[bank].start)
+ if (!gd->dram[bank].size ||
+ rsv_start < gd->dram[bank].start)
continue;
/* Watch out for RAM at end of address space! */
- bank_end = gd->bd->bi_dram[bank].start +
- gd->bd->bi_dram[bank].size - 1;
+ bank_end = gd->dram[bank].start +
+ gd->dram[bank].size - 1;
if (rsv_start > bank_end)
continue;
if (bank_end > end)
@@ -615,7 +615,6 @@ static void lmb_add_memory(void)
phys_addr_t bank_end;
phys_size_t size;
u64 ram_top = gd->ram_top;
- struct bd_info *bd = gd->bd;
if (CONFIG_IS_ENABLED(LMB_ARCH_MEM_MAP))
return lmb_arch_add_memory();
@@ -625,22 +624,22 @@ static void lmb_add_memory(void)
ram_top = 0x100000000ULL;
for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
- size = bd->bi_dram[i].size;
+ size = gd->dram[i].size;
if (size) {
- lmb_add(bd->bi_dram[i].start, size);
+ lmb_add(gd->dram[i].start, size);
if (!IS_ENABLED(CONFIG_LMB_LIMIT_DMA_BELOW_RAM_TOP))
continue;
- bank_end = bd->bi_dram[i].start + size;
+ bank_end = gd->dram[i].start + size;
/*
* Reserve memory above ram_top as
* no-overwrite so that it cannot be
* allocated
*/
- if (bd->bi_dram[i].start >= ram_top)
- lmb_reserve(bd->bi_dram[i].start, size,
+ if (gd->dram[i].start >= ram_top)
+ lmb_reserve(gd->dram[i].start, size,
LMB_NOOVERWRITE);
else if (bank_end > ram_top)
lmb_reserve(ram_top, bank_end - ram_top,