18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Bootwrapper for ePAPR compliant firmwares 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright 2010 David Gibson <david@gibson.dropbear.id.au>, IBM Corporation. 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Based on earlier bootwrappers by: 88c2ecf20Sopenharmony_ci * (c) Benjamin Herrenschmidt <benh@kernel.crashing.org>, IBM Corp,\ 98c2ecf20Sopenharmony_ci * and 108c2ecf20Sopenharmony_ci * Scott Wood <scottwood@freescale.com> 118c2ecf20Sopenharmony_ci * Copyright (c) 2007 Freescale Semiconductor, Inc. 128c2ecf20Sopenharmony_ci */ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include "ops.h" 158c2ecf20Sopenharmony_ci#include "stdio.h" 168c2ecf20Sopenharmony_ci#include "io.h" 178c2ecf20Sopenharmony_ci#include <libfdt.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ciBSS_STACK(4096); 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#define EPAPR_SMAGIC 0x65504150 228c2ecf20Sopenharmony_ci#define EPAPR_EMAGIC 0x45504150 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_cistatic unsigned epapr_magic; 258c2ecf20Sopenharmony_cistatic unsigned long ima_size; 268c2ecf20Sopenharmony_cistatic unsigned long fdt_addr; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistatic void platform_fixups(void) 298c2ecf20Sopenharmony_ci{ 308c2ecf20Sopenharmony_ci if ((epapr_magic != EPAPR_EMAGIC) 318c2ecf20Sopenharmony_ci && (epapr_magic != EPAPR_SMAGIC)) 328c2ecf20Sopenharmony_ci fatal("r6 contained 0x%08x instead of ePAPR magic number\n", 338c2ecf20Sopenharmony_ci epapr_magic); 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci if (ima_size < (unsigned long)_end) 368c2ecf20Sopenharmony_ci printf("WARNING: Image loaded outside IMA!" 378c2ecf20Sopenharmony_ci " (_end=%p, ima_size=0x%lx)\n", _end, ima_size); 388c2ecf20Sopenharmony_ci if (ima_size < fdt_addr) 398c2ecf20Sopenharmony_ci printf("WARNING: Device tree address is outside IMA!" 408c2ecf20Sopenharmony_ci "(fdt_addr=0x%lx, ima_size=0x%lx)\n", fdt_addr, 418c2ecf20Sopenharmony_ci ima_size); 428c2ecf20Sopenharmony_ci if (ima_size < fdt_addr + fdt_totalsize((void *)fdt_addr)) 438c2ecf20Sopenharmony_ci printf("WARNING: Device tree extends outside IMA!" 448c2ecf20Sopenharmony_ci " (fdt_addr=0x%lx, size=0x%x, ima_size=0x%lx\n", 458c2ecf20Sopenharmony_ci fdt_addr, fdt_totalsize((void *)fdt_addr), ima_size); 468c2ecf20Sopenharmony_ci} 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_civoid epapr_platform_init(unsigned long r3, unsigned long r4, unsigned long r5, 498c2ecf20Sopenharmony_ci unsigned long r6, unsigned long r7) 508c2ecf20Sopenharmony_ci{ 518c2ecf20Sopenharmony_ci epapr_magic = r6; 528c2ecf20Sopenharmony_ci ima_size = r7; 538c2ecf20Sopenharmony_ci fdt_addr = r3; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci /* FIXME: we should process reserve entries */ 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci simple_alloc_init(_end, ima_size - (unsigned long)_end, 32, 64); 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci fdt_init((void *)fdt_addr); 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci serial_console_init(); 628c2ecf20Sopenharmony_ci platform_ops.fixups = platform_fixups; 638c2ecf20Sopenharmony_ci} 64