aboutsummaryrefslogtreecommitdiff
path: root/include/mem-map.h
blob: fc535e587da8e752b858bd4119f6856111935d4d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* Copyright 2013-2014 IBM Corp.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 	http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 * implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __MEM_MAP_H
#define __MEM_MAP_H

/* This is our main offset for relocation. All our buffers
 * are offset from that and our code relocates itself to
 * that location
 */
#define SKIBOOT_BASE		0x30000000

/* Stack size set to 32K, 16K for general stack and 16K for an emergency
 * stack.
 */
#define STACK_SHIFT		15
#define STACK_SIZE		(1 << STACK_SHIFT)

/* End of the exception region we copy from 0x0. 0x0-0x100 will have
 * IPL data and is not actually for exception vectors.
 */
#define EXCEPTION_VECTORS_END	0x2000

/* The NACA and other stuff in head.S need to be at the start: we
 * give it 64k before placing the SPIRA and related data.
 */
#define SPIRA_OFF		0x00010000
#define SPIRAH_OFF		0x00010400

/* Actual SPIRA size is lesser than 1K (presently 0x340 bytes).
 * Use 1K for legacy SPIRA and 1K for SPIRA-H.
 * Then follow with for proc_init_data (aka PROCIN).
 * These need to be at fixed addresses in case we're ever little
 * endian: linker can't endian reverse a pointer for us.  Text, data
 * et. al. follows this.
 */
#define PROCIN_OFF		(SPIRA_OFF + 0x800)

/* Initial MDST table like PROCIN, we need fixed addresses,
 * we leave a 2k gap for PROCIN
 */
#define MDST_TABLE_OFF		(SPIRA_OFF + 0x1000)

/* Like MDST, we need fixed address for CPU control header.
 * We leave a 2k gap for MDST. CPU_CTL table is of size ~4k
 */
#define CPU_CTL_OFF             (SPIRA_OFF + 0x1800)

/* We keep a gap of 5M for skiboot text & bss for now. We will
 * then we have our heap which goes up to base + 14M (so 11M for
 * now, though we can certainly reduce that a lot).
 *
 * Ideally, we should fix the heap end and use _end to basically
 * initialize our heap so that it covers anything from _end to
 * that heap end, avoiding wasted space.
 *
 * That's made a bit tricky however due to how we create those
 * regions statically in mem_region.c, but still on the list of
 * things to improve.
 *
 * As of A Long Time Ago (2014/4/6), we used approc 512K for skiboot
 * core and 2M of heap on a 1 socket machine.
 *
 * As of still a Long Time Ago (2015/5/7) we used approx 800k for skiboot,
 * 500k HEAP for mambo boot.
 *
 * As of mid-2019, a 2 socket Romulus uses ~4MB heap.
 */
#define HEAP_BASE		(SKIBOOT_BASE + 0x00500000)
#define HEAP_SIZE		0x00b00000

/* This is the location of our console buffer at base + 16M */
#define INMEM_CON_START		(SKIBOOT_BASE + 0x01000000)
#define INMEM_CON_LEN  		0x100000

/* This is the location of HBRT console buffer at base + 17M */
#define HBRT_CON_START		(SKIBOOT_BASE + 0x01100000)
#define HBRT_CON_LEN  		0x100000

/* Tell FSP to put the init data at base + 20M, allocate 8M */
#define SPIRA_HEAP_BASE		(SKIBOOT_BASE + 0x01200000)
#define SPIRA_HEAP_SIZE		0x00800000

/* This is our PSI TCE table. It's 256K entries on P8 */
#define PSI_TCE_TABLE_BASE	(SKIBOOT_BASE + 0x01a00000)
#define PSI_TCE_TABLE_SIZE_P8	0x00200000UL

/* Total size of the above area
 *
 * (Ensure this has at least a 64k alignment)
 */
#define SKIBOOT_SIZE		0x01c00000

/* We start laying out the CPU stacks from here, indexed by PIR
 * each stack is STACK_SIZE in size (naturally aligned power of
 * two) and the bottom of the stack contains the cpu thread
 * structure for the processor, so it can be obtained by a simple
 * bit mask from the stack pointer. Within the CPU stack is divided
 * into a normal and emergency stack to cope with a single level of
 * re-entrancy.
 *
 * The size of this array is dynamically determined at boot time
 */
#define CPU_STACKS_BASE		(SKIBOOT_BASE + SKIBOOT_SIZE)

/*
 * Address at which we load the kernel LID. This is also where
 * we expect a passed-in kernel if booting without FSP and
 * without a built-in kernel.
 */
#define KERNEL_LOAD_BASE	((void *)0x20000000)
#define KERNEL_LOAD_SIZE	0x08000000

#define INITRAMFS_LOAD_BASE	KERNEL_LOAD_BASE + KERNEL_LOAD_SIZE
#define INITRAMFS_LOAD_SIZE	0x08000000

/* Size allocated to build the device-tree */
#define	DEVICE_TREE_MAX_SIZE	0x80000


#endif /* __MEM_MAP_H */