Documentation: Fix sphinx configuration
[coreboot.git] / src / include / memlayout.h
blobbd1d6846f08636b52f3ea5efca906c5f6e169740
1 /* SPDX-License-Identifier: GPL-2.0-only */
3 /* This file contains macro definitions for memlayout.ld linker scripts. */
5 #ifndef __MEMLAYOUT_H
6 #define __MEMLAYOUT_H
8 #include <arch/memlayout.h>
9 #include <vb2_constants.h>
11 #include "fmap_config.h"
13 /* Macros that the architecture can override. */
14 #ifndef ARCH_POINTER_ALIGN_SIZE
15 #define ARCH_POINTER_ALIGN_SIZE 8
16 #endif
18 #ifndef ARCH_CACHELINE_ALIGN_SIZE
19 #define ARCH_CACHELINE_ALIGN_SIZE 64
20 #endif
22 #define STR(x) XSTR(x)
23 #define XSTR(x) #x
25 #define ALIGN_COUNTER(align) \
26 . = ALIGN(align);
28 #define SET_COUNTER(name, addr) \
29 _ = ASSERT(. <= addr, STR(name overlaps the previous region!)); \
30 . = addr;
32 #define SYMBOL(name, addr) \
33 SET_COUNTER(name, addr) \
34 _##name = .;
36 #define REGION(name, addr, size, expected_align) \
37 SYMBOL(name, addr) \
38 _ = ASSERT(. == ALIGN(expected_align), \
39 STR(name must be aligned to expected_align!)); \
40 SYMBOL(e##name, addr + size)
42 #define ALIAS_REGION(name, alias) \
43 _##alias = _##name; \
44 _e##alias = _e##name;
46 /* Declare according to SRAM/DRAM ranges in SoC hardware-defined address map. */
47 #define SRAM_START(addr) SYMBOL(sram, addr)
49 #define SRAM_END(addr) SYMBOL(esram, addr)
51 #define DRAM_START(addr) SYMBOL(dram, addr)
53 #define TIMESTAMP(addr, size) \
54 REGION(timestamp, addr, size, 8) \
55 _ = ASSERT(size >= 212, "Timestamp region must fit timestamp_cache!");
57 #define PRERAM_CBMEM_CONSOLE(addr, size) \
58 REGION(preram_cbmem_console, addr, size, 4)
60 #define EARLYRAM_STACK(addr, size) \
61 REGION(earlyram_stack, addr, size, ARCH_STACK_ALIGN_SIZE)
63 /* Use either CBFS_CACHE (unified) or both (PRERAM|POSTRAM)_CBFS_CACHE */
64 #define CBFS_CACHE(addr, size) \
65 REGION(cbfs_cache, addr, size, 4) \
66 ALIAS_REGION(cbfs_cache, preram_cbfs_cache) \
67 ALIAS_REGION(cbfs_cache, postram_cbfs_cache)
69 #define FMAP_CACHE(addr, sz) \
70 REGION(fmap_cache, addr, sz, 4) \
71 _ = ASSERT(sz >= FMAP_SIZE, \
72 STR(FMAP does not fit in FMAP_CACHE! (sz < FMAP_SIZE)));
74 #if ENV_ROMSTAGE_OR_BEFORE
75 #define PRERAM_CBFS_CACHE(addr, size) \
76 REGION(preram_cbfs_cache, addr, size, 4) \
77 ALIAS_REGION(preram_cbfs_cache, cbfs_cache)
78 #define POSTRAM_CBFS_CACHE(addr, size) \
79 REGION(postram_cbfs_cache, addr, size, 4)
80 #else
81 #define PRERAM_CBFS_CACHE(addr, size) \
82 REGION(preram_cbfs_cache, addr, size, 4)
83 #define POSTRAM_CBFS_CACHE(addr, size) \
84 REGION(postram_cbfs_cache, addr, size, 4) \
85 ALIAS_REGION(postram_cbfs_cache, cbfs_cache)
86 #endif
88 /* Careful: 'INCLUDE <filename>' must always be at the end of the output line */
89 #if ENV_DECOMPRESSOR
90 #define DECOMPRESSOR(addr, sz) \
91 SYMBOL(decompressor, addr) \
92 _edecompressor = _decompressor + sz; \
93 _ = ASSERT(_eprogram - _program <= sz, \
94 STR(decompressor exceeded its allotted size! (sz))); \
95 INCLUDE "decompressor/lib/program.ld"
97 #define OVERLAP_DECOMPRESSOR_ROMSTAGE(addr, sz) DECOMPRESSOR(addr, sz)
98 #define OVERLAP_DECOMPRESSOR_VERSTAGE_ROMSTAGE(addr, sz) \
99 DECOMPRESSOR(addr, sz)
100 #else
101 #define DECOMPRESSOR(addr, sz) \
102 REGION(decompressor, addr, sz, 1)
104 #define OVERLAP_DECOMPRESSOR_ROMSTAGE(addr, sz) ROMSTAGE(addr, sz)
105 #define OVERLAP_DECOMPRESSOR_VERSTAGE_ROMSTAGE(addr, sz) \
106 OVERLAP_VERSTAGE_ROMSTAGE(addr, sz)
107 #endif
109 #if ENV_BOOTBLOCK
110 #define BOOTBLOCK(addr, sz) \
111 SYMBOL(bootblock, addr) \
112 _ebootblock = _bootblock + sz; \
113 _ = ASSERT(_eprogram - _program <= sz, \
114 STR(Bootblock exceeded its allotted size! (sz))); \
115 INCLUDE "bootblock/lib/program.ld"
116 #else
117 #define BOOTBLOCK(addr, sz) \
118 REGION(bootblock, addr, sz, 1)
119 #endif
121 #if ENV_ROMSTAGE
122 #define ROMSTAGE(addr, sz) \
123 SYMBOL(romstage, addr) \
124 _eromstage = _romstage + sz; \
125 _ = ASSERT(_eprogram - _program <= sz, \
126 STR(Romstage exceeded its allotted size! (sz))); \
127 INCLUDE "romstage/lib/program.ld"
128 #else
129 #define ROMSTAGE(addr, sz) \
130 REGION(romstage, addr, sz, 1)
131 #endif
133 #if ENV_RAMSTAGE
134 #define RAMSTAGE(addr, sz) \
135 SYMBOL(ramstage, addr) \
136 _eramstage = _ramstage + sz; \
137 _ = ASSERT(_eprogram - _program <= sz, \
138 STR(Ramstage exceeded its allotted size! (sz))); \
139 INCLUDE "ramstage/lib/program.ld"
140 #else
141 #define RAMSTAGE(addr, sz) \
142 REGION(ramstage, addr, sz, 1)
143 #endif
145 /* VBOOT2_WORK must always use VB2_FIRMWARE_WORKBUF_RECOMMENDED_SIZE for its
146 * size argument. The constant is imported via vb2_workbuf_size.h. */
147 #define VBOOT2_WORK(addr, sz) \
148 REGION(vboot2_work, addr, sz, 16) \
149 _ = ASSERT(sz == VB2_FIRMWARE_WORKBUF_RECOMMENDED_SIZE, \
150 STR(vboot2 work buffer size must be equivalent to \
151 VB2_FIRMWARE_WORKBUF_RECOMMENDED_SIZE! (sz)));
153 #define TPM_TCPA_LOG(addr, size) \
154 REGION(tpm_tcpa_log, addr, size, 16) \
155 _ = ASSERT(size >= 2K, "tpm tcpa log buffer must be at least 2K!");
157 #if ENV_SEPARATE_VERSTAGE
158 #define VERSTAGE(addr, sz) \
159 SYMBOL(verstage, addr) \
160 _everstage = _verstage + sz; \
161 _ = ASSERT(_eprogram - _program <= sz, \
162 STR(Verstage exceeded its allotted size! (sz))); \
163 INCLUDE "verstage/lib/program.ld"
165 #define OVERLAP_VERSTAGE_ROMSTAGE(addr, size) \
166 _ = ASSERT(CONFIG(VBOOT_RETURN_FROM_VERSTAGE) == 1, \
167 "Must set RETURN_FROM_VERSTAGE to overlap romstage."); \
168 VERSTAGE(addr, size)
169 #else
170 #define VERSTAGE(addr, sz) \
171 REGION(verstage, addr, sz, 1)
173 #define OVERLAP_VERSTAGE_ROMSTAGE(addr, size) ROMSTAGE(addr, size)
174 #endif
176 #if ENV_POSTCAR
177 #define POSTCAR(addr, sz) \
178 SYMBOL(postcar, addr) \
179 _epostcar = _postcar + sz; \
180 _ = ASSERT(_eprogram - _program <= sz, \
181 STR(Aftercar exceeded its allotted size! (sz))); \
182 INCLUDE "postcar/lib/program.ld"
183 #else
184 #define POSTCAR(addr, sz) \
185 REGION(postcar, addr, sz, 1)
186 #endif
188 #define WATCHDOG_TOMBSTONE(addr, size) \
189 REGION(watchdog_tombstone, addr, size, 4) \
190 _ = ASSERT(size == 4, "watchdog tombstones should be exactly 4 byte!");
192 #endif /* __MEMLAYOUT_H */