rockchip: param: support parse 4GB+ memory size

Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
Change-Id: Ifac53c5fd97e0708b0eeef8d455cdcb5c0dc8d4d
This commit is contained in:
Joseph Chen 2019-12-12 12:37:25 +08:00
parent 470c509241
commit 0453d738ec
1 changed files with 26 additions and 7 deletions

View File

@ -12,6 +12,8 @@
DECLARE_GLOBAL_DATA_PTR;
#define SZ_4GB 0x100000000ULL
#if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)
#define SDRAM_OFFSET(offset) (CONFIG_SYS_SDRAM_BASE + (offset))
#define PARAM_DRAM_INFO_OFFSET (SZ_32M)
@ -255,24 +257,41 @@ struct memblock *param_parse_ddr_mem(int *out_count)
*/
#ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS
struct tag *t;
u64 base, size;
int n;
t = atags_get_tag(ATAG_DDR_MEM);
if (t && t->u.ddr_mem.count) {
count = t->u.ddr_mem.count;
mem = calloc(count, sizeof(*mem));
mem = calloc(count + MEM_RESV_COUNT, sizeof(*mem));
if (!mem) {
printf("Calloc ddr memory failed\n");
return 0;
}
for (i = 0; i < count; i++) {
mem[i].base = t->u.ddr_mem.bank[i];
mem[i].size =
ddr_mem_get_usable_size(t->u.ddr_mem.bank[i],
t->u.ddr_mem.bank[i + count]);
for (i = 0, n = 0; i < count; i++, n++) {
base = t->u.ddr_mem.bank[i];
size = t->u.ddr_mem.bank[i + count];
/* 0~4GB */
if (base < SZ_4GB) {
mem[n].base = base;
mem[n].size = ddr_mem_get_usable_size(base, size);
if (base + size > SZ_4GB) {
n++;
mem[n].base_u64 = SZ_4GB;
mem[n].size_u64 = base + size - SZ_4GB;
}
} else {
/* 4GB+ */
mem[n].base_u64 = base;
mem[n].size_u64 = size;
}
*out_count = count;
assert(n < count + MEM_RESV_COUNT);
}
*out_count = n;
return mem;
}
#endif