powerpc/zImage: make the "OF" wrapper support ePAPR boot

This makes the "OF" zImage wrapper (zImage.pseries, zImage.pmac,
zImage.maple) work if booted via a flat device-tree (ePAPR boot
mode), and thus potentially usable with kexec.
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent cbc9565e
...@@ -74,7 +74,7 @@ src-wlib-$(CONFIG_8xx) += mpc8xx.c planetcore.c ...@@ -74,7 +74,7 @@ src-wlib-$(CONFIG_8xx) += mpc8xx.c planetcore.c
src-wlib-$(CONFIG_PPC_82xx) += pq2.c fsl-soc.c planetcore.c src-wlib-$(CONFIG_PPC_82xx) += pq2.c fsl-soc.c planetcore.c
src-wlib-$(CONFIG_EMBEDDED6xx) += mv64x60.c mv64x60_i2c.c ugecon.c src-wlib-$(CONFIG_EMBEDDED6xx) += mv64x60.c mv64x60_i2c.c ugecon.c
src-plat-y := of.c src-plat-y := of.c epapr.c
src-plat-$(CONFIG_40x) += fixed-head.S ep405.c cuboot-hotfoot.c \ src-plat-$(CONFIG_40x) += fixed-head.S ep405.c cuboot-hotfoot.c \
treeboot-walnut.c cuboot-acadia.c \ treeboot-walnut.c cuboot-acadia.c \
cuboot-kilauea.c simpleboot.c \ cuboot-kilauea.c simpleboot.c \
...@@ -97,7 +97,7 @@ src-plat-$(CONFIG_EMBEDDED6xx) += cuboot-pq2.c cuboot-mpc7448hpc2.c \ ...@@ -97,7 +97,7 @@ src-plat-$(CONFIG_EMBEDDED6xx) += cuboot-pq2.c cuboot-mpc7448hpc2.c \
prpmc2800.c prpmc2800.c
src-plat-$(CONFIG_AMIGAONE) += cuboot-amigaone.c src-plat-$(CONFIG_AMIGAONE) += cuboot-amigaone.c
src-plat-$(CONFIG_PPC_PS3) += ps3-head.S ps3-hvcall.S ps3.c src-plat-$(CONFIG_PPC_PS3) += ps3-head.S ps3-hvcall.S ps3.c
src-plat-$(CONFIG_EPAPR_BOOT) += epapr.c src-plat-$(CONFIG_EPAPR_BOOT) += epapr.c epapr-wrapper.c
src-wlib := $(sort $(src-wlib-y)) src-wlib := $(sort $(src-wlib-y))
src-plat := $(sort $(src-plat-y)) src-plat := $(sort $(src-plat-y))
......
extern void epapr_platform_init(unsigned long r3, unsigned long r4,
unsigned long r5, unsigned long r6,
unsigned long r7);
void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7)
{
epapr_platform_init(r3, r4, r5, r6, r7);
}
...@@ -48,7 +48,7 @@ static void platform_fixups(void) ...@@ -48,7 +48,7 @@ static void platform_fixups(void)
fdt_addr, fdt_totalsize((void *)fdt_addr), ima_size); fdt_addr, fdt_totalsize((void *)fdt_addr), ima_size);
} }
void platform_init(unsigned long r3, unsigned long r4, unsigned long r5, void epapr_platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7) unsigned long r6, unsigned long r7)
{ {
epapr_magic = r6; epapr_magic = r6;
......
...@@ -26,6 +26,9 @@ ...@@ -26,6 +26,9 @@
static unsigned long claim_base; static unsigned long claim_base;
void epapr_platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7);
static void *of_try_claim(unsigned long size) static void *of_try_claim(unsigned long size)
{ {
unsigned long addr = 0; unsigned long addr = 0;
...@@ -61,7 +64,7 @@ static void of_image_hdr(const void *hdr) ...@@ -61,7 +64,7 @@ static void of_image_hdr(const void *hdr)
} }
} }
void platform_init(unsigned long a1, unsigned long a2, void *promptr) static void of_platform_init(unsigned long a1, unsigned long a2, void *promptr)
{ {
platform_ops.image_hdr = of_image_hdr; platform_ops.image_hdr = of_image_hdr;
platform_ops.malloc = of_try_claim; platform_ops.malloc = of_try_claim;
...@@ -81,3 +84,14 @@ void platform_init(unsigned long a1, unsigned long a2, void *promptr) ...@@ -81,3 +84,14 @@ void platform_init(unsigned long a1, unsigned long a2, void *promptr)
loader_info.initrd_size = a2; loader_info.initrd_size = a2;
} }
} }
void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7)
{
/* Detect OF vs. ePAPR boot */
if (r5)
of_platform_init(r3, r4, (void *)r5);
else
epapr_platform_init(r3, r4, r5, r6, r7);
}
...@@ -148,18 +148,18 @@ make_space=y ...@@ -148,18 +148,18 @@ make_space=y
case "$platform" in case "$platform" in
pseries) pseries)
platformo=$object/of.o platformo="$object/of.o $object/epapr.o"
link_address='0x4000000' link_address='0x4000000'
;; ;;
maple) maple)
platformo=$object/of.o platformo="$object/of.o $object/epapr.o"
link_address='0x400000' link_address='0x400000'
;; ;;
pmac|chrp) pmac|chrp)
platformo=$object/of.o platformo="$object/of.o $object/epapr.o"
;; ;;
coff) coff)
platformo="$object/crt0.o $object/of.o" platformo="$object/crt0.o $object/of.o $object/epapr.o"
lds=$object/zImage.coff.lds lds=$object/zImage.coff.lds
link_address='0x500000' link_address='0x500000'
pie= pie=
...@@ -253,6 +253,7 @@ treeboot-iss4xx-mpic) ...@@ -253,6 +253,7 @@ treeboot-iss4xx-mpic)
platformo="$object/treeboot-iss4xx.o" platformo="$object/treeboot-iss4xx.o"
;; ;;
epapr) epapr)
platformo="$object/epapr.o $object/epapr-wrapper.o"
link_address='0x20000000' link_address='0x20000000'
pie=-pie pie=-pie
;; ;;
......
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