On 26 July 2018 at 07:59, Philipp Tomsich <philipp.toms...@theobroma-systems.com> wrote: > Even on 32bit systems a full 4GB of DRAM may be installed and reported > by the DRAM controller. Whether these 4GB are larger available > depends on the size/configuration of address decoding windows and > architectural features (e.g. consider a hypothetical architecture that > uses dedicated instructions to access the 'memory-mapped' peripheral > IO ranges). In U-Boot, the available DRAM, as reported by the > device-model is independent of the accessible DRAM (i.e. adjusted top > and effective size). > > This was first reported against the RK3288, which may have 4GB DRAM > attached, but will have a small (e.g. 128MB) window not accessible due > to address decoding limitations. > > The solution is to increase the types used for storing the ram_size to > have at least 33 bits even on 32bit systems... i.e. we need to use a > u64 for these always (this was previously only the case for > PHYS_64BIT, which will have unwanted side-effects for 32bit systems > and would require more intrusive changes). > > This commit changes the size-field in 'struct ram' and the ram_size in > 'gd' to be a u64. > > Reported-by: Marty E. Plummer <hanet...@startmail.com> > Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> > --- > > include/asm-generic/global_data.h | 2 +- > include/ram.h | 9 ++++++++- > 2 files changed, 9 insertions(+), 2 deletions(-) >
Reviewed-by: Simon Glass <s...@chromium.org> > diff --git a/include/asm-generic/global_data.h > b/include/asm-generic/global_data.h > index 0fd4900..f3d687c 100644 > --- a/include/asm-generic/global_data.h > +++ b/include/asm-generic/global_data.h > @@ -55,7 +55,7 @@ typedef struct global_data { > unsigned long ram_base; /* Base address of RAM used by U-Boot > */ > unsigned long ram_top; /* Top address of RAM used by U-Boot > */ > unsigned long relocaddr; /* Start address of U-Boot in RAM */ > - phys_size_t ram_size; /* RAM size */ > + u64 ram_size; /* RAM size */ > unsigned long mon_len; /* monitor len */ > unsigned long irq_sp; /* irq stack pointer */ > unsigned long start_addr_sp; /* start_addr_stackpointer */ > diff --git a/include/ram.h b/include/ram.h > index 67e22d7..1fe024f 100644 > --- a/include/ram.h > +++ b/include/ram.h > @@ -9,7 +9,14 @@ > > struct ram_info { > phys_addr_t base; > - size_t size; > + /* > + * We use a 64bit type for the size to correctly handle 32bit > + * systems with 4GB of DRAM (which would overflow a 32bit type > + * and read back as 0). For 64bit systems, we assume (for now) forever :-) > + * that they will always have less than 2^65 byte of DRAM > + * installed. -- prt Is the prt your signature? I suggest dropping it. > + */ > + u64 size; > }; > > struct ram_ops { > -- > 2.1.4 > Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot