1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Bootwrapper for ePAPR compliant firmwares 4 * 5 * Copyright 2010 David Gibson <david@gibson.dropbear.id.au>, IBM Corporation. 6 * 7 * Based on earlier bootwrappers by: 8 * (c) Benjamin Herrenschmidt <benh@kernel.crashing.org>, IBM Corp,\ 9 * and 10 * Scott Wood <scottwood@freescale.com> 11 * Copyright (c) 2007 Freescale Semiconductor, Inc. 12 */ 13 14 #include "ops.h" 15 #include "stdio.h" 16 #include "io.h" 17 #include <libfdt.h> 18 19 BSS_STACK(4096); 20 21 #define EPAPR_SMAGIC 0x65504150 22 #define EPAPR_EMAGIC 0x45504150 23 24 static unsigned epapr_magic; 25 static unsigned long ima_size; 26 static unsigned long fdt_addr; 27 28 static void platform_fixups(void) 29 { 30 if ((epapr_magic != EPAPR_EMAGIC) 31 && (epapr_magic != EPAPR_SMAGIC)) 32 fatal("r6 contained 0x%08x instead of ePAPR magic number\n", 33 epapr_magic); 34 35 if (ima_size < (unsigned long)_end) 36 printf("WARNING: Image loaded outside IMA!" 37 " (_end=%p, ima_size=0x%lx)\n", _end, ima_size); 38 if (ima_size < fdt_addr) 39 printf("WARNING: Device tree address is outside IMA!" 40 "(fdt_addr=0x%lx, ima_size=0x%lx)\n", fdt_addr, 41 ima_size); 42 if (ima_size < fdt_addr + fdt_totalsize((void *)fdt_addr)) 43 printf("WARNING: Device tree extends outside IMA!" 44 " (fdt_addr=0x%lx, size=0x%x, ima_size=0x%lx\n", 45 fdt_addr, fdt_totalsize((void *)fdt_addr), ima_size); 46 } 47 48 void epapr_platform_init(unsigned long r3, unsigned long r4, unsigned long r5, 49 unsigned long r6, unsigned long r7) 50 { 51 epapr_magic = r6; 52 ima_size = r7; 53 fdt_addr = r3; 54 55 /* FIXME: we should process reserve entries */ 56 57 simple_alloc_init(_end, ima_size - (unsigned long)_end, 32, 64); 58 59 fdt_init((void *)fdt_addr); 60 61 serial_console_init(); 62 platform_ops.fixups = platform_fixups; 63 } 64