
On 2 Aug 2018, at 22:36, Simon Glass sjg@chromium.org wrote:
On 26 July 2018 at 07:59, Philipp Tomsich <philipp.tomsich@theobroma-systems.com mailto:philipp.tomsich@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 hanetzer@startmail.com Signed-off-by: Philipp Tomsich philipp.tomsich@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 <sjg@chromium.org mailto:sjg@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.
In fact it is. But I’ll need to rewrite the entire comment anyway for the next version of this series as there’s even more functions and places that the memory size is stored in...
*/
u64 size;
};
struct ram_ops {
2.1.4
Regards, Simon