]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
powerpc/44x: boot wrapper: allow kernel to load into non-zero address
authorDave Kleikamp <shaggy@linux.vnet.ibm.com>
Mon, 4 Jul 2011 18:38:17 +0000 (18:38 +0000)
committerJosh Boyer <jwboyer@linux.vnet.ibm.com>
Tue, 12 Jul 2011 13:34:41 +0000 (09:34 -0400)
For AMP, different kernel instances load into separate memory regions.
Read the start of memory from the device tree and limit the memory to what's
specified in the device tree.

Signed-off-by: Dave Kleikamp <shaggy@linux.vnet.ibm.com>
Signed-off-by: Tony Breeds <tony@bakeyournoodle.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Josh Boyer <jwboyer@linux.vnet.ibm.com>
Cc: linuxppc-dev@lists.ozlabs.org
Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
arch/powerpc/boot/treeboot-iss4xx.c

index fcc44952874ee19aa6ab5b4375766aee5c7f3359..329e710feda26d99f731c38a1eee0aeb15edc6d4 100644 (file)
 
 BSS_STACK(4096);
 
+static u32 ibm4xx_memstart;
+
 static void iss_4xx_fixups(void)
 {
-       ibm4xx_sdram_fixup_memsize();
+       void *memory;
+       u32 reg[3];
+
+       memory = finddevice("/memory");
+       if (!memory)
+               fatal("Can't find memory node\n");
+       /* This assumes #address-cells = 2, #size-cells =1 and that */
+       getprop(memory, "reg", reg, sizeof(reg));
+       if (reg[2])
+               /* If the device tree specifies the memory range, use it */
+               ibm4xx_memstart = reg[1];
+       else
+               /* othersize, read it from the SDRAM controller */
+               ibm4xx_sdram_fixup_memsize();
+}
+
+static void *iss_4xx_vmlinux_alloc(unsigned long size)
+{
+       return (void *)ibm4xx_memstart;
 }
 
 #define SPRN_PIR       0x11E   /* Processor Indentification Register */
@@ -48,6 +68,7 @@ void platform_init(void)
 
        simple_alloc_init(_end, avail_ram, 128, 64);
        platform_ops.fixups = iss_4xx_fixups;
+       platform_ops.vmlinux_alloc = iss_4xx_vmlinux_alloc;
        platform_ops.exit = ibm44x_dbcr_reset;
        pir_reg = mfspr(SPRN_PIR);
        fdt_set_boot_cpuid_phys(_dtb_start, pir_reg);