Commit cf00a8d1 authored by Paul Mackerras's avatar Paul Mackerras

powerpc: Fix bug arising from having multiple memory_limit variables

We had a static memory_limit in prom.c, and then another one defined
in setup_64.c and used in numa.c, which resulted in the kernel crashing
when mem=xxx was given on the command line.  This puts the declaration
in system.h and the definition in mem.c.  This also moves the
definition of tce_alloc_start/end out of setup_64.c.
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 5f6b5b97
...@@ -78,15 +78,13 @@ extern struct rtas_t rtas; ...@@ -78,15 +78,13 @@ extern struct rtas_t rtas;
extern struct lmb lmb; extern struct lmb lmb;
extern unsigned long klimit; extern unsigned long klimit;
static unsigned long memory_limit;
static int __initdata dt_root_addr_cells; static int __initdata dt_root_addr_cells;
static int __initdata dt_root_size_cells; static int __initdata dt_root_size_cells;
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
static int __initdata iommu_is_off; static int __initdata iommu_is_off;
int __initdata iommu_force_on; int __initdata iommu_force_on;
extern unsigned long tce_alloc_start, tce_alloc_end; unsigned long tce_alloc_start, tce_alloc_end;
#endif #endif
typedef u32 cell_t; typedef u32 cell_t;
......
...@@ -631,15 +631,6 @@ static int ppc64_panic_event(struct notifier_block *this, ...@@ -631,15 +631,6 @@ static int ppc64_panic_event(struct notifier_block *this,
return NOTIFY_DONE; return NOTIFY_DONE;
} }
/*
* These three variables are used to save values passed to us by prom_init()
* via the device tree. The TCE variables are needed because with a memory_limit
* in force we may need to explicitly map the TCE are at the top of RAM.
*/
unsigned long memory_limit;
unsigned long tce_alloc_start;
unsigned long tce_alloc_end;
#ifdef CONFIG_PPC_ISERIES #ifdef CONFIG_PPC_ISERIES
/* /*
* On iSeries we just parse the mem=X option from the command line. * On iSeries we just parse the mem=X option from the command line.
......
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
int init_bootmem_done; int init_bootmem_done;
int mem_init_done; int mem_init_done;
unsigned long memory_limit;
/* /*
* This is called by /dev/mem to know if a given address has to * This is called by /dev/mem to know if a given address has to
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <asm/lmb.h> #include <asm/lmb.h>
#include <asm/machdep.h> #include <asm/machdep.h>
#include <asm/abs_addr.h> #include <asm/abs_addr.h>
#include <asm/system.h>
static int numa_enabled = 1; static int numa_enabled = 1;
...@@ -300,7 +301,6 @@ static unsigned long __init numa_enforce_memory_limit(unsigned long start, unsig ...@@ -300,7 +301,6 @@ static unsigned long __init numa_enforce_memory_limit(unsigned long start, unsig
* we've already adjusted it for the limit and it takes care of * we've already adjusted it for the limit and it takes care of
* having memory holes below the limit. * having memory holes below the limit.
*/ */
extern unsigned long memory_limit;
if (! memory_limit) if (! memory_limit)
return size; return size;
......
...@@ -302,8 +302,6 @@ static void __init iSeries_get_cmdline(void) ...@@ -302,8 +302,6 @@ static void __init iSeries_get_cmdline(void)
static void __init iSeries_init_early(void) static void __init iSeries_init_early(void)
{ {
extern unsigned long memory_limit;
DBG(" -> iSeries_init_early()\n"); DBG(" -> iSeries_init_early()\n");
ppc64_firmware_features = FW_FEATURE_ISERIES; ppc64_firmware_features = FW_FEATURE_ISERIES;
......
...@@ -83,6 +83,8 @@ static int __initdata dt_root_addr_cells; ...@@ -83,6 +83,8 @@ static int __initdata dt_root_addr_cells;
static int __initdata dt_root_size_cells; static int __initdata dt_root_size_cells;
static int __initdata iommu_is_off; static int __initdata iommu_is_off;
int __initdata iommu_force_on; int __initdata iommu_force_on;
unsigned long tce_alloc_start, tce_alloc_end;
typedef u32 cell_t; typedef u32 cell_t;
#if 0 #if 0
...@@ -1063,7 +1065,6 @@ static int __init early_init_dt_scan_chosen(unsigned long node, ...@@ -1063,7 +1065,6 @@ static int __init early_init_dt_scan_chosen(unsigned long node,
{ {
u32 *prop; u32 *prop;
u64 *prop64; u64 *prop64;
extern unsigned long tce_alloc_start, tce_alloc_end;
DBG("search \"chosen\", depth: %d, uname: %s\n", depth, uname); DBG("search \"chosen\", depth: %d, uname: %s\n", depth, uname);
......
...@@ -179,6 +179,7 @@ extern struct task_struct *_switch(struct thread_struct *prev, ...@@ -179,6 +179,7 @@ extern struct task_struct *_switch(struct thread_struct *prev,
extern unsigned int rtas_data; extern unsigned int rtas_data;
extern int mem_init_done; /* set on boot once kmalloc can be called */ extern int mem_init_done; /* set on boot once kmalloc can be called */
extern unsigned long memory_limit;
extern int powersave_nap; /* set if nap mode can be used in idle loop */ extern int powersave_nap; /* set if nap mode can be used in idle loop */
......
...@@ -136,6 +136,7 @@ static inline void flush_spe_to_thread(struct task_struct *t) ...@@ -136,6 +136,7 @@ static inline void flush_spe_to_thread(struct task_struct *t)
} }
extern int mem_init_done; /* set on boot once kmalloc can be called */ extern int mem_init_done; /* set on boot once kmalloc can be called */
extern unsigned long memory_limit;
/* EBCDIC -> ASCII conversion for [0-9A-Z] on iSeries */ /* EBCDIC -> ASCII conversion for [0-9A-Z] on iSeries */
extern unsigned char e2a(unsigned char); extern unsigned char e2a(unsigned char);
......
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