Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/powerpc/boot/epapr.c
26424 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
/*
3
* Bootwrapper for ePAPR compliant firmwares
4
*
5
* Copyright 2010 David Gibson <[email protected]>, IBM Corporation.
6
*
7
* Based on earlier bootwrappers by:
8
* (c) Benjamin Herrenschmidt <[email protected]>, IBM Corp,\
9
* and
10
* Scott Wood <[email protected]>
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
65