Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bec7c458 authored by Stephen Rothwell's avatar Stephen Rothwell
Browse files

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: default avatarStephen Rothwell <sfr@canb.auug.org.au>
parent 5015b494
Loading
Loading
Loading
Loading
+0 −17
Original line number Original line Diff line number Diff line
@@ -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)
{
{
+25 −17
Original line number Original line Diff line number Diff line
@@ -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);