mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-11 16:29:05 +00:00
powerpc: make mem= work on iSeries again
By parsing the command line earlier, we can add the mem= value to the flattened device tree and let the generic code sort out the memory limit for us. Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
This commit is contained in:
parent
5015b49448
commit
bec7c458b3
@ -631,23 +631,6 @@ static int ppc64_panic_event(struct notifier_block *this,
|
|||||||
return NOTIFY_DONE;
|
return NOTIFY_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_ISERIES
|
|
||||||
/*
|
|
||||||
* On iSeries we just parse the mem=X option from the command line.
|
|
||||||
* On pSeries it's a bit more complicated, see prom_init_mem()
|
|
||||||
*/
|
|
||||||
static int __init early_parsemem(char *p)
|
|
||||||
{
|
|
||||||
if (!p)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
memory_limit = ALIGN(memparse(p, &p), PAGE_SIZE);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
early_param("mem", early_parsemem);
|
|
||||||
#endif /* CONFIG_PPC_ISERIES */
|
|
||||||
|
|
||||||
#ifdef CONFIG_IRQSTACKS
|
#ifdef CONFIG_IRQSTACKS
|
||||||
static void __init irqstack_early_init(void)
|
static void __init irqstack_early_init(void)
|
||||||
{
|
{
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include <linux/kdev_t.h>
|
#include <linux/kdev_t.h>
|
||||||
#include <linux/major.h>
|
#include <linux/major.h>
|
||||||
#include <linux/root_dev.h>
|
#include <linux/root_dev.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
@ -94,6 +95,8 @@ extern unsigned long iSeries_recal_titan;
|
|||||||
|
|
||||||
static int mf_initialized;
|
static int mf_initialized;
|
||||||
|
|
||||||
|
static unsigned long cmd_mem_limit;
|
||||||
|
|
||||||
struct MemoryBlock {
|
struct MemoryBlock {
|
||||||
unsigned long absStart;
|
unsigned long absStart;
|
||||||
unsigned long absEnd;
|
unsigned long absEnd;
|
||||||
@ -341,23 +344,6 @@ static void __init iSeries_init_early(void)
|
|||||||
*/
|
*/
|
||||||
iommu_init_early_iSeries();
|
iommu_init_early_iSeries();
|
||||||
|
|
||||||
iSeries_get_cmdline();
|
|
||||||
|
|
||||||
/* Save unparsed command line copy for /proc/cmdline */
|
|
||||||
strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE);
|
|
||||||
|
|
||||||
/* Parse early parameters, in particular mem=x */
|
|
||||||
parse_early_param();
|
|
||||||
|
|
||||||
if (memory_limit) {
|
|
||||||
if (memory_limit < systemcfg->physicalMemorySize)
|
|
||||||
systemcfg->physicalMemorySize = memory_limit;
|
|
||||||
else {
|
|
||||||
printk("Ignoring mem=%lu >= ram_top.\n", memory_limit);
|
|
||||||
memory_limit = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize machine-dependency vectors */
|
/* Initialize machine-dependency vectors */
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
smp_init_iSeries();
|
smp_init_iSeries();
|
||||||
@ -971,6 +957,8 @@ void build_flat_dt(struct iseries_flat_dt *dt)
|
|||||||
/* /chosen */
|
/* /chosen */
|
||||||
dt_start_node(dt, "chosen");
|
dt_start_node(dt, "chosen");
|
||||||
dt_prop_u32(dt, "linux,platform", PLATFORM_ISERIES_LPAR);
|
dt_prop_u32(dt, "linux,platform", PLATFORM_ISERIES_LPAR);
|
||||||
|
if (cmd_mem_limit)
|
||||||
|
dt_prop_u64(dt, "linux,memory-limit", cmd_mem_limit);
|
||||||
dt_end_node(dt);
|
dt_end_node(dt);
|
||||||
|
|
||||||
dt_cpus(dt);
|
dt_cpus(dt);
|
||||||
@ -990,7 +978,27 @@ void * __init iSeries_early_setup(void)
|
|||||||
*/
|
*/
|
||||||
build_iSeries_Memory_Map();
|
build_iSeries_Memory_Map();
|
||||||
|
|
||||||
|
iSeries_get_cmdline();
|
||||||
|
|
||||||
|
/* Save unparsed command line copy for /proc/cmdline */
|
||||||
|
strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE);
|
||||||
|
|
||||||
|
/* Parse early parameters, in particular mem=x */
|
||||||
|
parse_early_param();
|
||||||
|
|
||||||
build_flat_dt(&iseries_dt);
|
build_flat_dt(&iseries_dt);
|
||||||
|
|
||||||
return (void *) __pa(&iseries_dt);
|
return (void *) __pa(&iseries_dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* On iSeries we just parse the mem=X option from the command line.
|
||||||
|
* On pSeries it's a bit more complicated, see prom_init_mem()
|
||||||
|
*/
|
||||||
|
static int __init early_parsemem(char *p)
|
||||||
|
{
|
||||||
|
if (p)
|
||||||
|
cmd_mem_limit = ALIGN(memparse(p, &p), PAGE_SIZE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
early_param("mem", early_parsemem);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user