Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+33 -9
+2 -2
arch/powerpc/boot/Makefile
··· 74 74 src-wlib-$(CONFIG_PPC_82xx) += pq2.c fsl-soc.c planetcore.c 75 75 src-wlib-$(CONFIG_EMBEDDED6xx) += mv64x60.c mv64x60_i2c.c ugecon.c 76 76 77 - src-plat-y := of.c 77 + src-plat-y := of.c epapr.c 78 78 src-plat-$(CONFIG_40x) += fixed-head.S ep405.c cuboot-hotfoot.c \ 79 79 treeboot-walnut.c cuboot-acadia.c \ 80 80 cuboot-kilauea.c simpleboot.c \ ··· 97 97 prpmc2800.c 98 98 src-plat-$(CONFIG_AMIGAONE) += cuboot-amigaone.c 99 99 src-plat-$(CONFIG_PPC_PS3) += ps3-head.S ps3-hvcall.S ps3.c 100 - src-plat-$(CONFIG_EPAPR_BOOT) += epapr.c 100 + src-plat-$(CONFIG_EPAPR_BOOT) += epapr.c epapr-wrapper.c 101 101 102 102 src-wlib := $(sort $(src-wlib-y)) 103 103 src-plat := $(sort $(src-plat-y))
+9
arch/powerpc/boot/epapr-wrapper.c
··· 1 + extern void epapr_platform_init(unsigned long r3, unsigned long r4, 2 + unsigned long r5, unsigned long r6, 3 + unsigned long r7); 4 + 5 + void platform_init(unsigned long r3, unsigned long r4, unsigned long r5, 6 + unsigned long r6, unsigned long r7) 7 + { 8 + epapr_platform_init(r3, r4, r5, r6, r7); 9 + }
+2 -2
arch/powerpc/boot/epapr.c
··· 48 48 fdt_addr, fdt_totalsize((void *)fdt_addr), ima_size); 49 49 } 50 50 51 - void platform_init(unsigned long r3, unsigned long r4, unsigned long r5, 52 - unsigned long r6, unsigned long r7) 51 + void epapr_platform_init(unsigned long r3, unsigned long r4, unsigned long r5, 52 + unsigned long r6, unsigned long r7) 53 53 { 54 54 epapr_magic = r6; 55 55 ima_size = r7;
+15 -1
arch/powerpc/boot/of.c
··· 26 26 27 27 static unsigned long claim_base; 28 28 29 + void epapr_platform_init(unsigned long r3, unsigned long r4, unsigned long r5, 30 + unsigned long r6, unsigned long r7); 31 + 29 32 static void *of_try_claim(unsigned long size) 30 33 { 31 34 unsigned long addr = 0; ··· 64 61 } 65 62 } 66 63 67 - void platform_init(unsigned long a1, unsigned long a2, void *promptr) 64 + static void of_platform_init(unsigned long a1, unsigned long a2, void *promptr) 68 65 { 69 66 platform_ops.image_hdr = of_image_hdr; 70 67 platform_ops.malloc = of_try_claim; ··· 84 81 loader_info.initrd_size = a2; 85 82 } 86 83 } 84 + 85 + void platform_init(unsigned long r3, unsigned long r4, unsigned long r5, 86 + unsigned long r6, unsigned long r7) 87 + { 88 + /* Detect OF vs. ePAPR boot */ 89 + if (r5) 90 + of_platform_init(r3, r4, (void *)r5); 91 + else 92 + epapr_platform_init(r3, r4, r5, r6, r7); 93 + } 94 +
+5 -4
arch/powerpc/boot/wrapper
··· 148 148 149 149 case "$platform" in 150 150 pseries) 151 - platformo=$object/of.o 151 + platformo="$object/of.o $object/epapr.o" 152 152 link_address='0x4000000' 153 153 ;; 154 154 maple) 155 - platformo=$object/of.o 155 + platformo="$object/of.o $object/epapr.o" 156 156 link_address='0x400000' 157 157 ;; 158 158 pmac|chrp) 159 - platformo=$object/of.o 159 + platformo="$object/of.o $object/epapr.o" 160 160 ;; 161 161 coff) 162 - platformo="$object/crt0.o $object/of.o" 162 + platformo="$object/crt0.o $object/of.o $object/epapr.o" 163 163 lds=$object/zImage.coff.lds 164 164 link_address='0x500000' 165 165 pie= ··· 253 253 platformo="$object/treeboot-iss4xx.o" 254 254 ;; 255 255 epapr) 256 + platformo="$object/epapr.o $object/epapr-wrapper.o" 256 257 link_address='0x20000000' 257 258 pie=-pie 258 259 ;;