xref: /rk3399_ARM-atf/plat/nvidia/tegra/scat/bl31.scat (revision 338dbe2f1f4b98da260e556d3f0fbdd8123caf06)
1c2ad38ceSVarun Wadekar#! armclang -E -x c
2c2ad38ceSVarun Wadekar
3c2ad38ceSVarun Wadekar/*
4c2ad38ceSVarun Wadekar * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved.
5c2ad38ceSVarun Wadekar *
6c2ad38ceSVarun Wadekar * SPDX-License-Identifier: BSD-3-Clause
7c2ad38ceSVarun Wadekar */
8c2ad38ceSVarun Wadekar
9c2ad38ceSVarun Wadekar#include <platform_def.h>
10c2ad38ceSVarun Wadekar
11c2ad38ceSVarun Wadekar#define PAGE_SIZE	(1024 * 4)
12c2ad38ceSVarun Wadekar
13c2ad38ceSVarun WadekarLR_START BL31_BASE
14c2ad38ceSVarun Wadekar{
15c2ad38ceSVarun Wadekar	__BL31_START__ +0 FIXED EMPTY 0
16c2ad38ceSVarun Wadekar	{
17c2ad38ceSVarun Wadekar		/* placeholder */
18c2ad38ceSVarun Wadekar	}
19c2ad38ceSVarun Wadekar
20c2ad38ceSVarun Wadekar	/* BL31_BASE address must be aligned on a page boundary. */
21c2ad38ceSVarun Wadekar	ScatterAssert((ImageBase(__BL31_START__) AND 0xFFF) == 0)
22c2ad38ceSVarun Wadekar}
23c2ad38ceSVarun Wadekar
24c2ad38ceSVarun WadekarLR_TEXT BL31_BASE
25c2ad38ceSVarun Wadekar{
26c2ad38ceSVarun Wadekar	__TEXT__ +0 FIXED
27c2ad38ceSVarun Wadekar	{
28c2ad38ceSVarun Wadekar		*(:gdef:bl31_entrypoint, +FIRST)
29c2ad38ceSVarun Wadekar		*(.text*)
30c2ad38ceSVarun Wadekar		*(.vectors)
31c2ad38ceSVarun Wadekar		.ANY1(+RO-CODE)
32c2ad38ceSVarun Wadekar	}
33c2ad38ceSVarun Wadekar
34c2ad38ceSVarun Wadekar	__TEXT_EPILOGUE__ AlignExpr(+0, PAGE_SIZE) FIXED EMPTY 0
35c2ad38ceSVarun Wadekar	{
36c2ad38ceSVarun Wadekar		/* section delimiter */
37c2ad38ceSVarun Wadekar	}
38c2ad38ceSVarun Wadekar}
39c2ad38ceSVarun Wadekar
40c2ad38ceSVarun WadekarLR_RO_DATA +0
41c2ad38ceSVarun Wadekar{
42c2ad38ceSVarun Wadekar	__RODATA__ AlignExpr(ImageLimit(LR_TEXT), 0) FIXED
43c2ad38ceSVarun Wadekar	{
44c2ad38ceSVarun Wadekar		*(.rodata*)
45c2ad38ceSVarun Wadekar		.ANY2(+RO-DATA)
46c2ad38ceSVarun Wadekar	}
47c2ad38ceSVarun Wadekar
48c2ad38ceSVarun Wadekar	/* Ensure 8-byte alignment for descriptors and ensure inclusion */
49c2ad38ceSVarun Wadekar	__RT_SVC_DESCS__ AlignExpr(ImageLimit(__RODATA__), 8) FIXED
50c2ad38ceSVarun Wadekar	{
51*da04341eSChris Kay		*(.rt_svc_descs)
52c2ad38ceSVarun Wadekar	}
53c2ad38ceSVarun Wadekar
54c2ad38ceSVarun Wadekar#if ENABLE_PMF
55c2ad38ceSVarun Wadekar	/* Ensure 8-byte alignment for descriptors and ensure inclusion */
56c2ad38ceSVarun Wadekar	__PMF_SVC_DESCS__ AlignExpr(ImageLimit(__RT_SVC_DESCS__), 8) FIXED
57c2ad38ceSVarun Wadekar	{
58*da04341eSChris Kay		*(.pmf_svc_descs)
59c2ad38ceSVarun Wadekar	}
60c2ad38ceSVarun Wadekar#endif /* ENABLE_PMF */
61c2ad38ceSVarun Wadekar
62c2ad38ceSVarun Wadekar	/*
63c2ad38ceSVarun Wadekar	 * Ensure 8-byte alignment for cpu_ops so that its fields are also
64c2ad38ceSVarun Wadekar	 * aligned.
65c2ad38ceSVarun Wadekar	 */
66c2ad38ceSVarun Wadekar	__CPU_OPS__ AlignExpr(+0, 8) FIXED
67c2ad38ceSVarun Wadekar	{
68*da04341eSChris Kay		*(.cpu_ops)
69c2ad38ceSVarun Wadekar	}
70c2ad38ceSVarun Wadekar
71c2ad38ceSVarun Wadekar	/*
72c2ad38ceSVarun Wadekar	 * Keep the .got section in the RO section as it is patched
73c2ad38ceSVarun Wadekar	 * prior to enabling the MMU and having the .got in RO is better for
74c2ad38ceSVarun Wadekar	 * security. GOT is a table of addresses so ensure 8-byte alignment.
75c2ad38ceSVarun Wadekar	 */
76c2ad38ceSVarun Wadekar	__GOT__ AlignExpr(ImageLimit(__CPU_OPS__), 8) FIXED
77c2ad38ceSVarun Wadekar	{
78c2ad38ceSVarun Wadekar		*(.got)
79c2ad38ceSVarun Wadekar	}
80c2ad38ceSVarun Wadekar
81c2ad38ceSVarun Wadekar	/* Place pubsub sections for events */
82c2ad38ceSVarun Wadekar	__PUBSUB_EVENTS__ AlignExpr(+0, 8) EMPTY 0
83c2ad38ceSVarun Wadekar	{
84c2ad38ceSVarun Wadekar		/* placeholder */
85c2ad38ceSVarun Wadekar	}
86c2ad38ceSVarun Wadekar
87c2ad38ceSVarun Wadekar#include <lib/el3_runtime/pubsub_events.h>
88c2ad38ceSVarun Wadekar
89c2ad38ceSVarun Wadekar	__RODATA_EPILOGUE__ AlignExpr(+0, PAGE_SIZE) FIXED EMPTY 0
90c2ad38ceSVarun Wadekar	{
91c2ad38ceSVarun Wadekar		/* section delimiter */
92c2ad38ceSVarun Wadekar	}
93c2ad38ceSVarun Wadekar}
94c2ad38ceSVarun Wadekar
95c2ad38ceSVarun Wadekar	/* cpu_ops must always be defined */
96c2ad38ceSVarun Wadekar	ScatterAssert(ImageLength(__CPU_OPS__) > 0)
97c2ad38ceSVarun Wadekar
98538b0020SPaul Beesley#if SPM_MM
99c2ad38ceSVarun WadekarLR_SPM +0
100c2ad38ceSVarun Wadekar{
101c2ad38ceSVarun Wadekar	/*
102c2ad38ceSVarun Wadekar	 * Exception vectors of the SPM shim layer. They must be aligned to a 2K
103c2ad38ceSVarun Wadekar	 * address, but we need to place them in a separate page so that we can set
104c2ad38ceSVarun Wadekar	 * individual permissions to them, so the actual alignment needed is 4K.
105c2ad38ceSVarun Wadekar	 *
106c2ad38ceSVarun Wadekar	 * There's no need to include this into the RO section of BL31 because it
107c2ad38ceSVarun Wadekar	 * doesn't need to be accessed by BL31.
108c2ad38ceSVarun Wadekar	 */
109c2ad38ceSVarun Wadekar	__SPM_SHIM_EXCEPTIONS__ AlignExpr(ImageLimit(LR_RO_DATA), PAGE_SIZE) FIXED
110c2ad38ceSVarun Wadekar	{
111c2ad38ceSVarun Wadekar		*(.spm_shim_exceptions)
112c2ad38ceSVarun Wadekar	}
113c2ad38ceSVarun Wadekar
114c2ad38ceSVarun Wadekar	__SPM_SHIM_EXCEPTIONS_EPILOGUE__ AlignExpr(ImageLimit(__SPM_SHIM_EXCEPTIONS__), PAGE_SIZE) FIXED
115c2ad38ceSVarun Wadekar	{
116c2ad38ceSVarun Wadekar		/* placeholder */
117c2ad38ceSVarun Wadekar	}
118c2ad38ceSVarun Wadekar}
119c2ad38ceSVarun Wadekar#endif
120c2ad38ceSVarun Wadekar
121c2ad38ceSVarun WadekarLR_RW_DATA +0
122c2ad38ceSVarun Wadekar{
123c2ad38ceSVarun Wadekar	__DATA__ AlignExpr(+0, 16) FIXED
124c2ad38ceSVarun Wadekar	{
125c2ad38ceSVarun Wadekar		*(.data*)
126c2ad38ceSVarun Wadekar		*(.constdata)
127c2ad38ceSVarun Wadekar		*(locale$$data)
128c2ad38ceSVarun Wadekar	}
129c2ad38ceSVarun Wadekar}
130c2ad38ceSVarun Wadekar
131c2ad38ceSVarun WadekarLR_RELA +0
132c2ad38ceSVarun Wadekar{
133c2ad38ceSVarun Wadekar	/*
134c2ad38ceSVarun Wadekar	 * .rela.dyn needs to come after .data for the read-elf utility to parse
135c2ad38ceSVarun Wadekar	 * this section correctly. Ensure 8-byte alignment so that the fields of
136c2ad38ceSVarun Wadekar	 * RELA data structure are aligned.
137c2ad38ceSVarun Wadekar	 */
138c2ad38ceSVarun Wadekar	__RELA__ AlignExpr(ImageLimit(LR_RW_DATA), 8) FIXED
139c2ad38ceSVarun Wadekar	{
140c2ad38ceSVarun Wadekar		*(.rela.dyn)
141c2ad38ceSVarun Wadekar	}
142c2ad38ceSVarun Wadekar}
143c2ad38ceSVarun Wadekar
144c2ad38ceSVarun Wadekar#ifdef BL31_PROGBITS_LIMIT
145c2ad38ceSVarun Wadekar	/* BL31 progbits has exceeded its limit. */
146c2ad38ceSVarun Wadekar	ScatterAssert(ImageLimit(LR_RELA) <= BL31_PROGBITS_LIMIT)
147c2ad38ceSVarun Wadekar#endif
148c2ad38ceSVarun Wadekar
149c2ad38ceSVarun WadekarLR_STACKS +0
150c2ad38ceSVarun Wadekar{
151c2ad38ceSVarun Wadekar	__STACKS__ AlignExpr(+0, 64) FIXED
152c2ad38ceSVarun Wadekar	{
153*da04341eSChris Kay		*(.tzfw_normal_stacks)
154c2ad38ceSVarun Wadekar	}
155c2ad38ceSVarun Wadekar}
156c2ad38ceSVarun Wadekar
157c2ad38ceSVarun Wadekar#define __BAKERY_LOCK_SIZE__		(ImageLimit(__BAKERY_LOCKS_EPILOGUE__) - \
158c2ad38ceSVarun Wadekar					 ImageBase(__BAKERY_LOCKS__))
159c2ad38ceSVarun Wadekar#define BAKERY_LOCK_SIZE		(__BAKERY_LOCK_SIZE__ * (PLATFORM_CORE_COUNT - 1))
160c2ad38ceSVarun Wadekar#define __PMF_TIMESTAMP_SIZE__		(ImageLimit(__PMF_TIMESTAMP__) - \
161c2ad38ceSVarun Wadekar					 ImageBase(__PMF_TIMESTAMP__))
162c2ad38ceSVarun Wadekar#define PER_CPU_TIMESTAMP_SIZE		(__PMF_TIMESTAMP_SIZE__ * (PLATFORM_CORE_COUNT - 1))
163c2ad38ceSVarun Wadekar
164c2ad38ceSVarun WadekarLR_BSS +0
165c2ad38ceSVarun Wadekar{
166c2ad38ceSVarun Wadekar	__BSS__ AlignExpr(ImageLimit(LR_STACKS), 256) FIXED
167c2ad38ceSVarun Wadekar	{
168c2ad38ceSVarun Wadekar		*(.bss*)
169c2ad38ceSVarun Wadekar		*(COMDAT)
170c2ad38ceSVarun Wadekar	}
171c2ad38ceSVarun Wadekar
172c2ad38ceSVarun Wadekar#if !USE_COHERENT_MEM
173c2ad38ceSVarun Wadekar	/*
174c2ad38ceSVarun Wadekar	 * Bakery locks are stored in normal .bss memory
175c2ad38ceSVarun Wadekar	 *
176c2ad38ceSVarun Wadekar	 * Each lock's data is spread across multiple cache lines, one per CPU,
177c2ad38ceSVarun Wadekar	 * but multiple locks can share the same cache line.
178c2ad38ceSVarun Wadekar	 * The compiler will allocate enough memory for one CPU's bakery locks,
179c2ad38ceSVarun Wadekar	 * the remaining cache lines are allocated by the linker script
180c2ad38ceSVarun Wadekar	 */
181c2ad38ceSVarun Wadekar	__BAKERY_LOCKS__ AlignExpr(ImageLimit(__BSS__), CACHE_WRITEBACK_GRANULE) FIXED
182c2ad38ceSVarun Wadekar	{
183*da04341eSChris Kay		*(.bakery_lock)
184c2ad38ceSVarun Wadekar	}
185c2ad38ceSVarun Wadekar
186c2ad38ceSVarun Wadekar	__BAKERY_LOCKS_EPILOGUE__ AlignExpr(ImageLimit(__BAKERY_LOCKS__), CACHE_WRITEBACK_GRANULE) FIXED EMPTY 0
187c2ad38ceSVarun Wadekar	{
188c2ad38ceSVarun Wadekar		/* section delimiter */
189c2ad38ceSVarun Wadekar	}
190c2ad38ceSVarun Wadekar
191c2ad38ceSVarun Wadekar	__PER_CPU_BAKERY_LOCKS__ ImageLimit(__BAKERY_LOCKS_EPILOGUE__) FIXED FILL 0 BAKERY_LOCK_SIZE
192c2ad38ceSVarun Wadekar	{
193c2ad38ceSVarun Wadekar		/* padded memory section to store per cpu bakery locks */
194c2ad38ceSVarun Wadekar	}
195c2ad38ceSVarun Wadekar
196c2ad38ceSVarun Wadekar#ifdef PLAT_PERCPU_BAKERY_LOCK_SIZE
197c2ad38ceSVarun Wadekar	/* PLAT_PERCPU_BAKERY_LOCK_SIZE does not match bakery lock requirements */
198c2ad38ceSVarun Wadekar	ScatterAssert(__PER_CPU_BAKERY_LOCK_SIZE__ == PLAT_PERCPU_BAKERY_LOCK_SIZE)
199c2ad38ceSVarun Wadekar#endif
200c2ad38ceSVarun Wadekar#endif
201c2ad38ceSVarun Wadekar
202c2ad38ceSVarun Wadekar#if ENABLE_PMF
203c2ad38ceSVarun Wadekar	/*
204c2ad38ceSVarun Wadekar	 * Time-stamps are stored in normal .bss memory
205c2ad38ceSVarun Wadekar	 *
206c2ad38ceSVarun Wadekar	 * The compiler will allocate enough memory for one CPU's time-stamps,
207c2ad38ceSVarun Wadekar	 * the remaining memory for other CPU's is allocated by the
208c2ad38ceSVarun Wadekar	 * linker script
209c2ad38ceSVarun Wadekar	 */
210c2ad38ceSVarun Wadekar	__PMF_TIMESTAMP__ AlignExpr(+0, CACHE_WRITEBACK_GRANULE) FIXED EMPTY CACHE_WRITEBACK_GRANULE
211c2ad38ceSVarun Wadekar	{
212c2ad38ceSVarun Wadekar		/* store timestamps in this carved out memory */
213c2ad38ceSVarun Wadekar	}
214c2ad38ceSVarun Wadekar
215c2ad38ceSVarun Wadekar	__PMF_TIMESTAMP_EPILOGUE__ AlignExpr(ImageLimit(__PMF_TIMESTAMP__), CACHE_WRITEBACK_GRANULE) FIXED EMPTY 0
216c2ad38ceSVarun Wadekar	{
217c2ad38ceSVarun Wadekar		/*
218c2ad38ceSVarun Wadekar		 * placeholder to make __PMF_TIMESTAMP_START__ end on a
219c2ad38ceSVarun Wadekar		 * CACHE_WRITEBACK_GRANULE boundary
220c2ad38ceSVarun Wadekar		 */
221c2ad38ceSVarun Wadekar	}
222c2ad38ceSVarun Wadekar
223c2ad38ceSVarun Wadekar	__PER_CPU_TIMESTAMPS__ +0 FIXED FILL 0 PER_CPU_TIMESTAMP_SIZE
224c2ad38ceSVarun Wadekar	{
225c2ad38ceSVarun Wadekar		/* padded memory section to store per cpu timestamps */
226c2ad38ceSVarun Wadekar	}
227c2ad38ceSVarun Wadekar#endif /* ENABLE_PMF */
228c2ad38ceSVarun Wadekar}
229c2ad38ceSVarun Wadekar
230c2ad38ceSVarun WadekarLR_XLAT_TABLE +0
231c2ad38ceSVarun Wadekar{
232*da04341eSChris Kay	.xlat_table +0 FIXED
233c2ad38ceSVarun Wadekar	{
234*da04341eSChris Kay		*(.xlat_table)
235c2ad38ceSVarun Wadekar	}
236c2ad38ceSVarun Wadekar}
237c2ad38ceSVarun Wadekar
238c2ad38ceSVarun Wadekar#if USE_COHERENT_MEM
239c2ad38ceSVarun WadekarLR_COHERENT_RAM +0
240c2ad38ceSVarun Wadekar{
241c2ad38ceSVarun Wadekar	/*
242c2ad38ceSVarun Wadekar	 * The base address of the coherent memory section must be page-aligned (4K)
243c2ad38ceSVarun Wadekar	 * to guarantee that the coherent data are stored on their own pages and
244c2ad38ceSVarun Wadekar	 * are not mixed with normal data.  This is required to set up the correct
245c2ad38ceSVarun Wadekar	 * memory attributes for the coherent data page tables.
246c2ad38ceSVarun Wadekar	 */
247c2ad38ceSVarun Wadekar	__COHERENT_RAM__ AlignExpr(+0, PAGE_SIZE) FIXED
248c2ad38ceSVarun Wadekar	{
249c2ad38ceSVarun Wadekar		/*
250c2ad38ceSVarun Wadekar		 * Bakery locks are stored in coherent memory
251c2ad38ceSVarun Wadekar		 *
252c2ad38ceSVarun Wadekar		 * Each lock's data is contiguous and fully allocated by the compiler
253c2ad38ceSVarun Wadekar		 */
254*da04341eSChris Kay		*(.bakery_lock)
255*da04341eSChris Kay		*(.tzfw_coherent_mem)
256c2ad38ceSVarun Wadekar	}
257c2ad38ceSVarun Wadekar
258c2ad38ceSVarun Wadekar	__COHERENT_RAM_EPILOGUE_UNALIGNED__ +0 FIXED EMPTY 0
259c2ad38ceSVarun Wadekar	{
260c2ad38ceSVarun Wadekar		/* section delimiter */
261c2ad38ceSVarun Wadekar	}
262c2ad38ceSVarun Wadekar
263c2ad38ceSVarun Wadekar	/*
264c2ad38ceSVarun Wadekar	 * Memory page(s) mapped to this section will be marked
265c2ad38ceSVarun Wadekar	 * as device memory.  No other unexpected data must creep in.
266c2ad38ceSVarun Wadekar	 * Ensure the rest of the current memory page is unused.
267c2ad38ceSVarun Wadekar	 */
268c2ad38ceSVarun Wadekar	__COHERENT_RAM_EPILOGUE__ AlignExpr(ImageLimit(__COHERENT_RAM_START__), PAGE_SIZE) FIXED EMPTY 0
269c2ad38ceSVarun Wadekar	{
270c2ad38ceSVarun Wadekar		/* section delimiter */
271c2ad38ceSVarun Wadekar	}
272c2ad38ceSVarun Wadekar}
273c2ad38ceSVarun Wadekar#endif
274c2ad38ceSVarun Wadekar
275c2ad38ceSVarun WadekarLR_END +0
276c2ad38ceSVarun Wadekar{
277c2ad38ceSVarun Wadekar	__BL31_END__ +0 FIXED EMPTY 0
278c2ad38ceSVarun Wadekar	{
279c2ad38ceSVarun Wadekar		/* placeholder */
280c2ad38ceSVarun Wadekar	}
281c2ad38ceSVarun Wadekar
282c2ad38ceSVarun Wadekar	/* BL31 image has exceeded its limit. */
283c2ad38ceSVarun Wadekar	ScatterAssert(ImageLimit(__BL31_END__) <= BL31_LIMIT)
284c2ad38ceSVarun Wadekar}
285