powerpc/boot: Add an ePAPR compliant boot wrapper
authorDavid Gibson <dwg@au1.ibm.com>
Thu, 14 Apr 2011 18:29:16 +0000 (18:29 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 20 Apr 2011 06:59:21 +0000 (16:59 +1000)
This is a first cut at making bootwrapper code which will
produce a zImage compliant with the requirements set down
by ePAPR.

This is a very simple bootwrapper, taking the device tree
blob supplied by the ePAPR boot program and passing it on
to the kernel. It builds on the earlier patch to build a
relocatable ET_DYN zImage to meet the other ePAPR image
requirements.

For good measure we have some paranoid checks which will
generate warnings if some of the ePAPR entry condition
guarantees are not met.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/Kconfig
arch/powerpc/boot/Makefile
arch/powerpc/boot/epapr.c [new file with mode: 0644]
arch/powerpc/boot/wrapper

index 8f4d50b0adfa9ce21bf8dd68158df455ef242af3..a3128ca0fe11c18edec56c175eaf39656ff4ebc8 100644 (file)
@@ -193,6 +193,12 @@ config SYS_SUPPORTS_APM_EMULATION
        default y if PMAC_APM_EMU
        bool
 
+config EPAPR_BOOT
+       bool
+       help
+         Used to allow a board to specify it wants an ePAPR compliant wrapper.
+       default n
+
 config DEFAULT_UIMAGE
        bool
        help
index 89178164af5ed19c19e6e359d86bdc5a7eadd0f2..0e2a152c3aa5c9a9452bc556b0f5c71bde79e2c9 100644 (file)
@@ -69,7 +69,8 @@ src-wlib := string.S crt0.S crtsavres.S stdio.c main.c \
                cpm-serial.c stdlib.c mpc52xx-psc.c planetcore.c uartlite.c \
                fsl-soc.c mpc8xx.c pq2.c ugecon.c
 src-plat := of.c cuboot-52xx.c cuboot-824x.c cuboot-83xx.c cuboot-85xx.c holly.c \
-               cuboot-ebony.c cuboot-hotfoot.c treeboot-ebony.c prpmc2800.c \
+               cuboot-ebony.c cuboot-hotfoot.c epapr.c treeboot-ebony.c \
+               prpmc2800.c \
                ps3-head.S ps3-hvcall.S ps3.c treeboot-bamboo.c cuboot-8xx.c \
                cuboot-pq2.c cuboot-sequoia.c treeboot-walnut.c \
                cuboot-bamboo.c cuboot-mpc7448hpc2.c cuboot-taishan.c \
@@ -182,6 +183,7 @@ image-$(CONFIG_PPC_HOLLY)           += dtbImage.holly
 image-$(CONFIG_PPC_PRPMC2800)          += dtbImage.prpmc2800
 image-$(CONFIG_PPC_ISERIES)            += zImage.iseries
 image-$(CONFIG_DEFAULT_UIMAGE)         += uImage
+image-$(CONFIG_EPAPR_BOOT)             += zImage.epapr
 
 #
 # Targets which embed a device tree blob
diff --git a/arch/powerpc/boot/epapr.c b/arch/powerpc/boot/epapr.c
new file mode 100644 (file)
index 0000000..06c1961
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Bootwrapper for ePAPR compliant firmwares
+ *
+ * Copyright 2010 David Gibson <david@gibson.dropbear.id.au>, IBM Corporation.
+ *
+ * Based on earlier bootwrappers by:
+ * (c) Benjamin Herrenschmidt <benh@kernel.crashing.org>, IBM Corp,\
+ *   and
+ * Scott Wood <scottwood@freescale.com>
+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include "ops.h"
+#include "stdio.h"
+#include "io.h"
+#include <libfdt.h>
+
+BSS_STACK(4096);
+
+#define EPAPR_SMAGIC   0x65504150
+#define EPAPR_EMAGIC   0x45504150
+
+static unsigned epapr_magic;
+static unsigned long ima_size;
+static unsigned long fdt_addr;
+
+static void platform_fixups(void)
+{
+       if ((epapr_magic != EPAPR_EMAGIC)
+           && (epapr_magic != EPAPR_SMAGIC))
+               fatal("r6 contained 0x%08x instead of ePAPR magic number\n",
+                     epapr_magic);
+
+       if (ima_size < (unsigned long)_end)
+               printf("WARNING: Image loaded outside IMA!"
+                      " (_end=%p, ima_size=0x%lx)\n", _end, ima_size);
+       if (ima_size < fdt_addr)
+               printf("WARNING: Device tree address is outside IMA!"
+                      "(fdt_addr=0x%lx, ima_size=0x%lx)\n", fdt_addr,
+                      ima_size);
+       if (ima_size < fdt_addr + fdt_totalsize((void *)fdt_addr))
+               printf("WARNING: Device tree extends outside IMA!"
+                      " (fdt_addr=0x%lx, size=0x%x, ima_size=0x%lx\n",
+                      fdt_addr, fdt_totalsize((void *)fdt_addr), ima_size);
+}
+
+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
+                  unsigned long r6, unsigned long r7)
+{
+       epapr_magic = r6;
+       ima_size = r7;
+       fdt_addr = r3;
+
+       /* FIXME: we should process reserve entries */
+
+       simple_alloc_init(_end, ima_size - (unsigned long)_end, 32, 64);
+
+       fdt_init((void *)fdt_addr);
+
+       serial_console_init();
+       platform_ops.fixups = platform_fixups;
+}
index fef527867811927897b78510e9d4878877c33699..dfa29cb0f475d797aadd58ff7bfcf8d1edcf0f47 100755 (executable)
@@ -247,6 +247,10 @@ gamecube|wii)
 treeboot-iss4xx-mpic)
     platformo="$object/treeboot-iss4xx.o"
     ;;
+epapr)
+    link_address='0x20000000'
+    pie=-pie
+    ;;
 esac
 
 vmz="$tmpdir/`basename \"$kernel\"`.$ext"