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