rockchip: param: support parse 4GB+ memory size
Signed-off-by: Joseph Chen <chenjh@rock-chips.com> Change-Id: Ifac53c5fd97e0708b0eeef8d455cdcb5c0dc8d4d
This commit is contained in:
parent
470c509241
commit
0453d738ec
|
|
@ -12,6 +12,8 @@
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
#define SZ_4GB 0x100000000ULL
|
||||||
|
|
||||||
#if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)
|
#if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)
|
||||||
#define SDRAM_OFFSET(offset) (CONFIG_SYS_SDRAM_BASE + (offset))
|
#define SDRAM_OFFSET(offset) (CONFIG_SYS_SDRAM_BASE + (offset))
|
||||||
#define PARAM_DRAM_INFO_OFFSET (SZ_32M)
|
#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
|
#ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS
|
||||||
struct tag *t;
|
struct tag *t;
|
||||||
|
u64 base, size;
|
||||||
|
int n;
|
||||||
|
|
||||||
t = atags_get_tag(ATAG_DDR_MEM);
|
t = atags_get_tag(ATAG_DDR_MEM);
|
||||||
if (t && t->u.ddr_mem.count) {
|
if (t && t->u.ddr_mem.count) {
|
||||||
count = 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) {
|
if (!mem) {
|
||||||
printf("Calloc ddr memory failed\n");
|
printf("Calloc ddr memory failed\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0, n = 0; i < count; i++, n++) {
|
||||||
mem[i].base = t->u.ddr_mem.bank[i];
|
base = t->u.ddr_mem.bank[i];
|
||||||
mem[i].size =
|
size = t->u.ddr_mem.bank[i + count];
|
||||||
ddr_mem_get_usable_size(t->u.ddr_mem.bank[i],
|
|
||||||
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(n < count + MEM_RESV_COUNT);
|
||||||
}
|
}
|
||||||
|
|
||||||
*out_count = count;
|
*out_count = n;
|
||||||
return mem;
|
return mem;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue