
On 26 July 2018 at 07:59, Philipp Tomsich 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
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