Angel Pons | 32859fc | 2020-04-02 23:48:27 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 2 | |
| 3 | /* This file contains macro definitions for memlayout.ld linker scripts. */ |
| 4 | |
| 5 | #ifndef __MEMLAYOUT_H |
| 6 | #define __MEMLAYOUT_H |
| 7 | |
| 8 | #include <arch/memlayout.h> |
Joel Kitching | 0097f55 | 2019-02-21 12:36:55 +0800 | [diff] [blame] | 9 | #include <vb2_constants.h> |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 10 | |
Julius Werner | cefe89e | 2019-11-06 19:29:44 -0800 | [diff] [blame] | 11 | #include "fmap_config.h" |
| 12 | |
Aaron Durbin | 4de29d4 | 2015-09-03 22:49:36 -0500 | [diff] [blame] | 13 | /* Macros that the architecture can override. */ |
| 14 | #ifndef ARCH_POINTER_ALIGN_SIZE |
| 15 | #define ARCH_POINTER_ALIGN_SIZE 8 |
| 16 | #endif |
| 17 | |
| 18 | #ifndef ARCH_CACHELINE_ALIGN_SIZE |
| 19 | #define ARCH_CACHELINE_ALIGN_SIZE 64 |
| 20 | #endif |
| 21 | |
Julius Werner | cefe89e | 2019-11-06 19:29:44 -0800 | [diff] [blame] | 22 | #define STR(x) XSTR(x) |
| 23 | #define XSTR(x) #x |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 24 | |
Aaron Durbin | 4de29d4 | 2015-09-03 22:49:36 -0500 | [diff] [blame] | 25 | #define ALIGN_COUNTER(align) \ |
| 26 | . = ALIGN(align); |
| 27 | |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 28 | #define SET_COUNTER(name, addr) \ |
| 29 | _ = ASSERT(. <= addr, STR(name overlaps the previous region!)); \ |
| 30 | . = addr; |
| 31 | |
| 32 | #define SYMBOL(name, addr) \ |
| 33 | SET_COUNTER(name, addr) \ |
Julius Werner | 84446e6 | 2021-02-12 17:37:27 -0800 | [diff] [blame] | 34 | _##name = ABSOLUTE(.); |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 35 | |
Julius Werner | 82d16b1 | 2020-12-30 15:51:10 -0800 | [diff] [blame] | 36 | #define RECORD_SIZE(name) \ |
| 37 | _##name##_size = ABSOLUTE(_e##name - _##name); |
| 38 | |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 39 | #define REGION(name, addr, size, expected_align) \ |
| 40 | SYMBOL(name, addr) \ |
| 41 | _ = ASSERT(. == ALIGN(expected_align), \ |
| 42 | STR(name must be aligned to expected_align!)); \ |
Julius Werner | 82d16b1 | 2020-12-30 15:51:10 -0800 | [diff] [blame] | 43 | SYMBOL(e##name, addr + size) \ |
| 44 | RECORD_SIZE(name) |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 45 | |
Julius Werner | 757943c | 2015-12-16 16:07:39 -0800 | [diff] [blame] | 46 | #define ALIAS_REGION(name, alias) \ |
Julius Werner | 84446e6 | 2021-02-12 17:37:27 -0800 | [diff] [blame] | 47 | _##alias = ABSOLUTE(_##name); \ |
| 48 | _e##alias = ABSOLUTE(_e##name); \ |
Julius Werner | 82d16b1 | 2020-12-30 15:51:10 -0800 | [diff] [blame] | 49 | RECORD_SIZE(alias) |
| 50 | |
| 51 | #define REGION_START(name, addr) SYMBOL(name, addr) |
| 52 | |
| 53 | #define REGION_END(name, addr) \ |
| 54 | SYMBOL(e##name, addr) \ |
| 55 | RECORD_SIZE(name) |
Julius Werner | 757943c | 2015-12-16 16:07:39 -0800 | [diff] [blame] | 56 | |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 57 | /* Declare according to SRAM/DRAM ranges in SoC hardware-defined address map. */ |
Julius Werner | 82d16b1 | 2020-12-30 15:51:10 -0800 | [diff] [blame] | 58 | #define SRAM_START(addr) REGION_START(sram, addr) |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 59 | |
Julius Werner | 82d16b1 | 2020-12-30 15:51:10 -0800 | [diff] [blame] | 60 | #define SRAM_END(addr) REGION_END(sram, addr) |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 61 | |
Julius Werner | 82d16b1 | 2020-12-30 15:51:10 -0800 | [diff] [blame] | 62 | #define DRAM_START(addr) REGION_START(dram, addr) |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 63 | |
Aaron Durbin | 1936f6c | 2015-07-03 17:04:21 -0500 | [diff] [blame] | 64 | #define TIMESTAMP(addr, size) \ |
Julius Werner | 85b1aad | 2016-08-19 15:17:42 -0700 | [diff] [blame] | 65 | REGION(timestamp, addr, size, 8) \ |
| 66 | _ = ASSERT(size >= 212, "Timestamp region must fit timestamp_cache!"); |
Aaron Durbin | 1936f6c | 2015-07-03 17:04:21 -0500 | [diff] [blame] | 67 | |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 68 | #define PRERAM_CBMEM_CONSOLE(addr, size) \ |
| 69 | REGION(preram_cbmem_console, addr, size, 4) |
| 70 | |
Felix Held | ca928c6 | 2020-04-04 01:47:37 +0200 | [diff] [blame] | 71 | #define EARLYRAM_STACK(addr, size) \ |
| 72 | REGION(earlyram_stack, addr, size, ARCH_STACK_ALIGN_SIZE) |
| 73 | |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 74 | /* Use either CBFS_CACHE (unified) or both (PRERAM|POSTRAM)_CBFS_CACHE */ |
Julius Werner | 757943c | 2015-12-16 16:07:39 -0800 | [diff] [blame] | 75 | #define CBFS_CACHE(addr, size) \ |
| 76 | REGION(cbfs_cache, addr, size, 4) \ |
| 77 | ALIAS_REGION(cbfs_cache, preram_cbfs_cache) \ |
| 78 | ALIAS_REGION(cbfs_cache, postram_cbfs_cache) |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 79 | |
Julius Werner | cefe89e | 2019-11-06 19:29:44 -0800 | [diff] [blame] | 80 | #define FMAP_CACHE(addr, sz) \ |
| 81 | REGION(fmap_cache, addr, sz, 4) \ |
Julius Werner | 8245bd2 | 2019-12-04 20:32:15 -0800 | [diff] [blame] | 82 | _ = ASSERT(sz >= FMAP_SIZE, \ |
Julius Werner | cefe89e | 2019-11-06 19:29:44 -0800 | [diff] [blame] | 83 | STR(FMAP does not fit in FMAP_CACHE! (sz < FMAP_SIZE))); |
| 84 | |
Julius Werner | 1e37c9c | 2019-12-11 17:09:39 -0800 | [diff] [blame] | 85 | #define CBFS_MCACHE(addr, sz) \ |
| 86 | REGION(cbfs_mcache, addr, sz, 4) |
| 87 | |
Kyösti Mälkki | e3acc8f | 2019-09-13 10:49:20 +0300 | [diff] [blame] | 88 | #if ENV_ROMSTAGE_OR_BEFORE |
Julius Werner | 757943c | 2015-12-16 16:07:39 -0800 | [diff] [blame] | 89 | #define PRERAM_CBFS_CACHE(addr, size) \ |
| 90 | REGION(preram_cbfs_cache, addr, size, 4) \ |
| 91 | ALIAS_REGION(preram_cbfs_cache, cbfs_cache) |
Mary Ruthven | f82e8ab | 2015-11-13 14:05:27 -0800 | [diff] [blame] | 92 | #define POSTRAM_CBFS_CACHE(addr, size) \ |
Mary Ruthven | a8aef3a | 2015-11-24 09:43:27 -0800 | [diff] [blame] | 93 | REGION(postram_cbfs_cache, addr, size, 4) |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 94 | #else |
| 95 | #define PRERAM_CBFS_CACHE(addr, size) \ |
Julius Werner | 757943c | 2015-12-16 16:07:39 -0800 | [diff] [blame] | 96 | REGION(preram_cbfs_cache, addr, size, 4) |
| 97 | #define POSTRAM_CBFS_CACHE(addr, size) \ |
| 98 | REGION(postram_cbfs_cache, addr, size, 4) \ |
| 99 | ALIAS_REGION(postram_cbfs_cache, cbfs_cache) |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 100 | #endif |
| 101 | |
| 102 | /* Careful: 'INCLUDE <filename>' must always be at the end of the output line */ |
Julius Werner | 99f4683 | 2018-05-16 14:14:04 -0700 | [diff] [blame] | 103 | #if ENV_DECOMPRESSOR |
| 104 | #define DECOMPRESSOR(addr, sz) \ |
| 105 | SYMBOL(decompressor, addr) \ |
Julius Werner | 84446e6 | 2021-02-12 17:37:27 -0800 | [diff] [blame] | 106 | _edecompressor = ABSOLUTE(_decompressor + sz); \ |
Julius Werner | 82d16b1 | 2020-12-30 15:51:10 -0800 | [diff] [blame] | 107 | RECORD_SIZE(decompressor) \ |
Julius Werner | 99f4683 | 2018-05-16 14:14:04 -0700 | [diff] [blame] | 108 | _ = ASSERT(_eprogram - _program <= sz, \ |
| 109 | STR(decompressor exceeded its allotted size! (sz))); \ |
| 110 | INCLUDE "decompressor/lib/program.ld" |
| 111 | |
| 112 | #define OVERLAP_DECOMPRESSOR_ROMSTAGE(addr, sz) DECOMPRESSOR(addr, sz) |
| 113 | #define OVERLAP_DECOMPRESSOR_VERSTAGE_ROMSTAGE(addr, sz) \ |
| 114 | DECOMPRESSOR(addr, sz) |
| 115 | #else |
| 116 | #define DECOMPRESSOR(addr, sz) \ |
| 117 | REGION(decompressor, addr, sz, 1) |
| 118 | |
| 119 | #define OVERLAP_DECOMPRESSOR_ROMSTAGE(addr, sz) ROMSTAGE(addr, sz) |
| 120 | #define OVERLAP_DECOMPRESSOR_VERSTAGE_ROMSTAGE(addr, sz) \ |
| 121 | OVERLAP_VERSTAGE_ROMSTAGE(addr, sz) |
| 122 | #endif |
| 123 | |
Aaron Durbin | b2a6262 | 2015-09-04 12:09:49 -0500 | [diff] [blame] | 124 | #if ENV_BOOTBLOCK |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 125 | #define BOOTBLOCK(addr, sz) \ |
Julius Werner | 862c385 | 2016-02-18 15:46:15 -0800 | [diff] [blame] | 126 | SYMBOL(bootblock, addr) \ |
Julius Werner | 84446e6 | 2021-02-12 17:37:27 -0800 | [diff] [blame] | 127 | _ebootblock = ABSOLUTE(_bootblock + sz); \ |
Julius Werner | 82d16b1 | 2020-12-30 15:51:10 -0800 | [diff] [blame] | 128 | RECORD_SIZE(bootblock) \ |
Aaron Durbin | b2a6262 | 2015-09-04 12:09:49 -0500 | [diff] [blame] | 129 | _ = ASSERT(_eprogram - _program <= sz, \ |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 130 | STR(Bootblock exceeded its allotted size! (sz))); \ |
Nico Huber | 98fc426 | 2016-01-23 01:24:33 +0100 | [diff] [blame] | 131 | INCLUDE "bootblock/lib/program.ld" |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 132 | #else |
| 133 | #define BOOTBLOCK(addr, sz) \ |
Julius Werner | 862c385 | 2016-02-18 15:46:15 -0800 | [diff] [blame] | 134 | REGION(bootblock, addr, sz, 1) |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 135 | #endif |
| 136 | |
Aaron Durbin | b2a6262 | 2015-09-04 12:09:49 -0500 | [diff] [blame] | 137 | #if ENV_ROMSTAGE |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 138 | #define ROMSTAGE(addr, sz) \ |
Julius Werner | 862c385 | 2016-02-18 15:46:15 -0800 | [diff] [blame] | 139 | SYMBOL(romstage, addr) \ |
Julius Werner | 84446e6 | 2021-02-12 17:37:27 -0800 | [diff] [blame] | 140 | _eromstage = ABSOLUTE(_romstage + sz); \ |
Julius Werner | 82d16b1 | 2020-12-30 15:51:10 -0800 | [diff] [blame] | 141 | RECORD_SIZE(romstage) \ |
Aaron Durbin | b2a6262 | 2015-09-04 12:09:49 -0500 | [diff] [blame] | 142 | _ = ASSERT(_eprogram - _program <= sz, \ |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 143 | STR(Romstage exceeded its allotted size! (sz))); \ |
Nico Huber | 98fc426 | 2016-01-23 01:24:33 +0100 | [diff] [blame] | 144 | INCLUDE "romstage/lib/program.ld" |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 145 | #else |
| 146 | #define ROMSTAGE(addr, sz) \ |
Julius Werner | 862c385 | 2016-02-18 15:46:15 -0800 | [diff] [blame] | 147 | REGION(romstage, addr, sz, 1) |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 148 | #endif |
| 149 | |
Aaron Durbin | 4de29d4 | 2015-09-03 22:49:36 -0500 | [diff] [blame] | 150 | #if ENV_RAMSTAGE |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 151 | #define RAMSTAGE(addr, sz) \ |
Julius Werner | 862c385 | 2016-02-18 15:46:15 -0800 | [diff] [blame] | 152 | SYMBOL(ramstage, addr) \ |
Julius Werner | 84446e6 | 2021-02-12 17:37:27 -0800 | [diff] [blame] | 153 | _eramstage = ABSOLUTE(_ramstage + sz); \ |
Julius Werner | 82d16b1 | 2020-12-30 15:51:10 -0800 | [diff] [blame] | 154 | RECORD_SIZE(ramstage) \ |
Aaron Durbin | 4de29d4 | 2015-09-03 22:49:36 -0500 | [diff] [blame] | 155 | _ = ASSERT(_eprogram - _program <= sz, \ |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 156 | STR(Ramstage exceeded its allotted size! (sz))); \ |
Nico Huber | 98fc426 | 2016-01-23 01:24:33 +0100 | [diff] [blame] | 157 | INCLUDE "ramstage/lib/program.ld" |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 158 | #else |
| 159 | #define RAMSTAGE(addr, sz) \ |
Julius Werner | 862c385 | 2016-02-18 15:46:15 -0800 | [diff] [blame] | 160 | REGION(ramstage, addr, sz, 1) |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 161 | #endif |
| 162 | |
Joel Kitching | 0097f55 | 2019-02-21 12:36:55 +0800 | [diff] [blame] | 163 | /* VBOOT2_WORK must always use VB2_FIRMWARE_WORKBUF_RECOMMENDED_SIZE for its |
Felix Held | 1840f93 | 2022-11-18 23:26:38 +0100 | [diff] [blame] | 164 | * size argument. The constant is imported via 2constants.h. */ |
Joel Kitching | 0097f55 | 2019-02-21 12:36:55 +0800 | [diff] [blame] | 165 | #define VBOOT2_WORK(addr, sz) \ |
| 166 | REGION(vboot2_work, addr, sz, 16) \ |
| 167 | _ = ASSERT(sz == VB2_FIRMWARE_WORKBUF_RECOMMENDED_SIZE, \ |
| 168 | STR(vboot2 work buffer size must be equivalent to \ |
| 169 | VB2_FIRMWARE_WORKBUF_RECOMMENDED_SIZE! (sz))); |
Aaron Durbin | e5bad5c | 2015-09-05 10:27:12 -0500 | [diff] [blame] | 170 | |
Bill XIE | c79e96b | 2019-08-22 20:28:36 +0800 | [diff] [blame] | 171 | #define TPM_TCPA_LOG(addr, size) \ |
| 172 | REGION(tpm_tcpa_log, addr, size, 16) \ |
| 173 | _ = ASSERT(size >= 2K, "tpm tcpa log buffer must be at least 2K!"); |
Philipp Deppenwiese | c9b7d1f | 2018-11-10 00:35:02 +0100 | [diff] [blame] | 174 | |
Julius Werner | 21a4053 | 2020-04-21 16:03:53 -0700 | [diff] [blame] | 175 | #if ENV_SEPARATE_VERSTAGE |
Aaron Durbin | e5bad5c | 2015-09-05 10:27:12 -0500 | [diff] [blame] | 176 | #define VERSTAGE(addr, sz) \ |
Julius Werner | 862c385 | 2016-02-18 15:46:15 -0800 | [diff] [blame] | 177 | SYMBOL(verstage, addr) \ |
Julius Werner | 84446e6 | 2021-02-12 17:37:27 -0800 | [diff] [blame] | 178 | _everstage = ABSOLUTE(_verstage + sz); \ |
Julius Werner | 82d16b1 | 2020-12-30 15:51:10 -0800 | [diff] [blame] | 179 | RECORD_SIZE(verstage) \ |
Aaron Durbin | e5bad5c | 2015-09-05 10:27:12 -0500 | [diff] [blame] | 180 | _ = ASSERT(_eprogram - _program <= sz, \ |
| 181 | STR(Verstage exceeded its allotted size! (sz))); \ |
Nico Huber | 98fc426 | 2016-01-23 01:24:33 +0100 | [diff] [blame] | 182 | INCLUDE "verstage/lib/program.ld" |
Aaron Durbin | e5bad5c | 2015-09-05 10:27:12 -0500 | [diff] [blame] | 183 | |
Julius Werner | 73d042b | 2017-03-17 16:54:48 -0700 | [diff] [blame] | 184 | #define OVERLAP_VERSTAGE_ROMSTAGE(addr, size) \ |
Julius Werner | cd49cce | 2019-03-05 16:53:33 -0800 | [diff] [blame] | 185 | _ = ASSERT(CONFIG(VBOOT_RETURN_FROM_VERSTAGE) == 1, \ |
Julius Werner | 73d042b | 2017-03-17 16:54:48 -0700 | [diff] [blame] | 186 | "Must set RETURN_FROM_VERSTAGE to overlap romstage."); \ |
| 187 | VERSTAGE(addr, size) |
Aaron Durbin | e5bad5c | 2015-09-05 10:27:12 -0500 | [diff] [blame] | 188 | #else |
| 189 | #define VERSTAGE(addr, sz) \ |
Julius Werner | 862c385 | 2016-02-18 15:46:15 -0800 | [diff] [blame] | 190 | REGION(verstage, addr, sz, 1) |
Aaron Durbin | e5bad5c | 2015-09-05 10:27:12 -0500 | [diff] [blame] | 191 | |
| 192 | #define OVERLAP_VERSTAGE_ROMSTAGE(addr, size) ROMSTAGE(addr, size) |
| 193 | #endif |
| 194 | |
Aaron Durbin | 7f8afe0 | 2016-03-18 12:21:23 -0500 | [diff] [blame] | 195 | #if ENV_POSTCAR |
| 196 | #define POSTCAR(addr, sz) \ |
| 197 | SYMBOL(postcar, addr) \ |
Julius Werner | 84446e6 | 2021-02-12 17:37:27 -0800 | [diff] [blame] | 198 | _epostcar = ABSOLUTE(_postcar + sz); \ |
Julius Werner | 82d16b1 | 2020-12-30 15:51:10 -0800 | [diff] [blame] | 199 | RECORD_SIZE(postcar) \ |
Aaron Durbin | 7f8afe0 | 2016-03-18 12:21:23 -0500 | [diff] [blame] | 200 | _ = ASSERT(_eprogram - _program <= sz, \ |
| 201 | STR(Aftercar exceeded its allotted size! (sz))); \ |
| 202 | INCLUDE "postcar/lib/program.ld" |
| 203 | #else |
| 204 | #define POSTCAR(addr, sz) \ |
| 205 | REGION(postcar, addr, sz, 1) |
| 206 | #endif |
| 207 | |
Aaron Durbin | e5bad5c | 2015-09-05 10:27:12 -0500 | [diff] [blame] | 208 | #define WATCHDOG_TOMBSTONE(addr, size) \ |
| 209 | REGION(watchdog_tombstone, addr, size, 4) \ |
| 210 | _ = ASSERT(size == 4, "watchdog tombstones should be exactly 4 byte!"); |
| 211 | |
Julius Werner | ec5e5e0 | 2014-08-20 15:29:56 -0700 | [diff] [blame] | 212 | #endif /* __MEMLAYOUT_H */ |