1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* |
3 | * Copyright 2010 Ben. Herrenschmidt, IBM Corporation. |
4 | * |
5 | * Based on earlier code: |
6 | * Copyright (C) Paul Mackerras 1997. |
7 | * |
8 | * Matt Porter <mporter@kernel.crashing.org> |
9 | * Copyright 2002-2005 MontaVista Software Inc. |
10 | * |
11 | * Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net> |
12 | * Copyright (c) 2003, 2004 Zultys Technologies |
13 | * |
14 | * Copyright 2007 David Gibson, IBM Corporation. |
15 | */ |
16 | #include <stdarg.h> |
17 | #include <stddef.h> |
18 | #include "types.h" |
19 | #include "elf.h" |
20 | #include "string.h" |
21 | #include "stdio.h" |
22 | #include "page.h" |
23 | #include "ops.h" |
24 | #include "reg.h" |
25 | #include "io.h" |
26 | #include "dcr.h" |
27 | #include "4xx.h" |
28 | #include "44x.h" |
29 | #include "libfdt.h" |
30 | |
31 | BSS_STACK(4096); |
32 | |
33 | static u32 ibm4xx_memstart; |
34 | |
35 | static void iss_4xx_fixups(void) |
36 | { |
37 | void *memory; |
38 | u32 reg[3]; |
39 | |
40 | memory = finddevice(name: "/memory" ); |
41 | if (!memory) |
42 | fatal("Can't find memory node\n" ); |
43 | /* This assumes #address-cells = 2, #size-cells =1 and that */ |
44 | getprop(devp: memory, name: "reg" , buf: reg, buflen: sizeof(reg)); |
45 | if (reg[2]) |
46 | /* If the device tree specifies the memory range, use it */ |
47 | ibm4xx_memstart = reg[1]; |
48 | else |
49 | /* othersize, read it from the SDRAM controller */ |
50 | ibm4xx_sdram_fixup_memsize(); |
51 | } |
52 | |
53 | static void *iss_4xx_vmlinux_alloc(unsigned long size) |
54 | { |
55 | return (void *)ibm4xx_memstart; |
56 | } |
57 | |
58 | #define SPRN_PIR 0x11E /* Processor Identification Register */ |
59 | void platform_init(void) |
60 | { |
61 | unsigned long end_of_ram = 0x08000000; |
62 | unsigned long avail_ram = end_of_ram - (unsigned long)_end; |
63 | u32 pir_reg; |
64 | |
65 | simple_alloc_init(base: _end, heap_size: avail_ram, granularity: 128, max_allocs: 64); |
66 | platform_ops.fixups = iss_4xx_fixups; |
67 | platform_ops.vmlinux_alloc = iss_4xx_vmlinux_alloc; |
68 | platform_ops.exit = ibm44x_dbcr_reset; |
69 | pir_reg = mfspr(SPRN_PIR); |
70 | fdt_set_boot_cpuid_phys(_dtb_start, pir_reg); |
71 | fdt_init(blob: _dtb_start); |
72 | serial_console_init(); |
73 | } |
74 | |