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: Will Deacon <will.deacon@arm.com> Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
ff081e05bf
commit
a5d5f7daa7
|
@ -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;
|
||||||
#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)
|
||||||
/* 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)
|
||||||
}
|
}
|
||||||
#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)
|
||||||
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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue