Commit a5d5f7da authored by Peter Maydell's avatar Peter Maydell Committed by Russell King

ARM: 7465/1: Handle >4GB memory sizes in device tree and mem=size@start option

The memory regions which are passed to arm_add_memory() from
device tree blobs via early_init_dt_add_memory_arch() can
have sizes which are larger than will fit in a 32 bit integer,
so switch to using a phys_addr_t to hold them, to avoid
silently dropping the top 32 bits of the size. Similarly, use
phys_addr_t in early_mem() so that mem=size@start command line
options specifying more than 4GB behave sensibly.
Acked-by: default avatarWill Deacon <will.deacon@arm.com>
Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent ff081e05
...@@ -196,7 +196,7 @@ static const struct tagtable __tagtable_##fn __tag = { tag, fn } ...@@ -196,7 +196,7 @@ static const struct tagtable __tagtable_##fn __tag = { tag, fn }
struct membank { struct membank {
phys_addr_t start; phys_addr_t start;
unsigned long size; phys_addr_t size;
unsigned int highmem; unsigned int highmem;
}; };
...@@ -217,7 +217,7 @@ extern struct meminfo meminfo; ...@@ -217,7 +217,7 @@ extern struct meminfo meminfo;
#define bank_phys_end(bank) ((bank)->start + (bank)->size) #define bank_phys_end(bank) ((bank)->start + (bank)->size)
#define bank_phys_size(bank) (bank)->size #define bank_phys_size(bank) (bank)->size
extern int arm_add_memory(phys_addr_t start, unsigned long size); extern int arm_add_memory(phys_addr_t start, phys_addr_t size);
extern void early_print(const char *str, ...); extern void early_print(const char *str, ...);
extern void dump_machine_table(void); extern void dump_machine_table(void);
......
...@@ -508,7 +508,7 @@ void __init dump_machine_table(void) ...@@ -508,7 +508,7 @@ void __init dump_machine_table(void)
/* can't use cpu_relax() here as it may require MMU setup */; /* can't use cpu_relax() here as it may require MMU setup */;
} }
int __init arm_add_memory(phys_addr_t start, unsigned long size) int __init arm_add_memory(phys_addr_t start, phys_addr_t size)
{ {
struct membank *bank = &meminfo.bank[meminfo.nr_banks]; struct membank *bank = &meminfo.bank[meminfo.nr_banks];
...@@ -538,7 +538,7 @@ int __init arm_add_memory(phys_addr_t start, unsigned long size) ...@@ -538,7 +538,7 @@ int __init arm_add_memory(phys_addr_t start, unsigned long size)
} }
#endif #endif
bank->size = size & PAGE_MASK; bank->size = size & ~(phys_addr_t)(PAGE_SIZE - 1);
/* /*
* Check whether this memory region has non-zero size or * Check whether this memory region has non-zero size or
...@@ -558,7 +558,7 @@ int __init arm_add_memory(phys_addr_t start, unsigned long size) ...@@ -558,7 +558,7 @@ int __init arm_add_memory(phys_addr_t start, unsigned long size)
static int __init early_mem(char *p) static int __init early_mem(char *p)
{ {
static int usermem __initdata = 0; static int usermem __initdata = 0;
unsigned long size; phys_addr_t size;
phys_addr_t start; phys_addr_t start;
char *endp; char *endp;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment