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