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: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
cbc9565ee8
commit
0c9fa29149
|
@ -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 \
|
||||||
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))
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
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,8 +48,8 @@ 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;
|
||||||
ima_size = r7;
|
ima_size = r7;
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
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
|
||||||
|
|
||||||
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)
|
||||||
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
|
||||||
;;
|
;;
|
||||||
|
|
Loading…
Reference in New Issue