xref: /rk3399_ARM-atf/include/common/bl_common.ld.h (revision 0a0a7a9ac82cb79af91f098cedc69cc67bca3978)
1665e71b8SMasahiro Yamada /*
2665e71b8SMasahiro Yamada  * Copyright (c) 2020, ARM Limited and Contributors. All rights reserved.
3665e71b8SMasahiro Yamada  *
4665e71b8SMasahiro Yamada  * SPDX-License-Identifier: BSD-3-Clause
5665e71b8SMasahiro Yamada  */
6665e71b8SMasahiro Yamada 
7665e71b8SMasahiro Yamada #ifndef BL_COMMON_LD_H
8665e71b8SMasahiro Yamada #define BL_COMMON_LD_H
9665e71b8SMasahiro Yamada 
109fb288a0SMasahiro Yamada #include <platform_def.h>
119fb288a0SMasahiro Yamada 
129fb288a0SMasahiro Yamada #ifdef __aarch64__
139fb288a0SMasahiro Yamada #define STRUCT_ALIGN	8
149fb288a0SMasahiro Yamada #else
159fb288a0SMasahiro Yamada #define STRUCT_ALIGN	4
169fb288a0SMasahiro Yamada #endif
179fb288a0SMasahiro Yamada 
189fb288a0SMasahiro Yamada #define CPU_OPS						\
199fb288a0SMasahiro Yamada 	. = ALIGN(STRUCT_ALIGN);			\
209fb288a0SMasahiro Yamada 	__CPU_OPS_START__ = .;				\
219fb288a0SMasahiro Yamada 	KEEP(*(cpu_ops))				\
229fb288a0SMasahiro Yamada 	__CPU_OPS_END__ = .;
239fb288a0SMasahiro Yamada 
249fb288a0SMasahiro Yamada #define PARSER_LIB_DESCS				\
259fb288a0SMasahiro Yamada 	. = ALIGN(STRUCT_ALIGN);			\
269fb288a0SMasahiro Yamada 	__PARSER_LIB_DESCS_START__ = .;			\
279fb288a0SMasahiro Yamada 	KEEP(*(.img_parser_lib_descs))			\
289fb288a0SMasahiro Yamada 	__PARSER_LIB_DESCS_END__ = .;
299fb288a0SMasahiro Yamada 
309fb288a0SMasahiro Yamada #define RT_SVC_DESCS					\
319fb288a0SMasahiro Yamada 	. = ALIGN(STRUCT_ALIGN);			\
329fb288a0SMasahiro Yamada 	__RT_SVC_DESCS_START__ = .;			\
339fb288a0SMasahiro Yamada 	KEEP(*(rt_svc_descs))				\
349fb288a0SMasahiro Yamada 	__RT_SVC_DESCS_END__ = .;
359fb288a0SMasahiro Yamada 
369fb288a0SMasahiro Yamada #define PMF_SVC_DESCS					\
379fb288a0SMasahiro Yamada 	. = ALIGN(STRUCT_ALIGN);			\
389fb288a0SMasahiro Yamada 	__PMF_SVC_DESCS_START__ = .;			\
399fb288a0SMasahiro Yamada 	KEEP(*(pmf_svc_descs))				\
409fb288a0SMasahiro Yamada 	__PMF_SVC_DESCS_END__ = .;
419fb288a0SMasahiro Yamada 
429fb288a0SMasahiro Yamada #define FCONF_POPULATOR					\
439fb288a0SMasahiro Yamada 	. = ALIGN(STRUCT_ALIGN);			\
449fb288a0SMasahiro Yamada 	__FCONF_POPULATOR_START__ = .;			\
459fb288a0SMasahiro Yamada 	KEEP(*(.fconf_populator))			\
469fb288a0SMasahiro Yamada 	__FCONF_POPULATOR_END__ = .;
479fb288a0SMasahiro Yamada 
489fb288a0SMasahiro Yamada /*
499fb288a0SMasahiro Yamada  * Keep the .got section in the RO section as it is patched prior to enabling
509fb288a0SMasahiro Yamada  * the MMU and having the .got in RO is better for security. GOT is a table of
519fb288a0SMasahiro Yamada  * addresses so ensure pointer size alignment.
529fb288a0SMasahiro Yamada  */
539fb288a0SMasahiro Yamada #define GOT						\
549fb288a0SMasahiro Yamada 	. = ALIGN(STRUCT_ALIGN);			\
559fb288a0SMasahiro Yamada 	__GOT_START__ = .;				\
569fb288a0SMasahiro Yamada 	*(.got)						\
579fb288a0SMasahiro Yamada 	__GOT_END__ = .;
589fb288a0SMasahiro Yamada 
59*0a0a7a9aSMasahiro Yamada #define RODATA_COMMON					\
60*0a0a7a9aSMasahiro Yamada 	RT_SVC_DESCS					\
61*0a0a7a9aSMasahiro Yamada 	FCONF_POPULATOR					\
62*0a0a7a9aSMasahiro Yamada 	PMF_SVC_DESCS					\
63*0a0a7a9aSMasahiro Yamada 	PARSER_LIB_DESCS				\
64*0a0a7a9aSMasahiro Yamada 	CPU_OPS						\
65*0a0a7a9aSMasahiro Yamada 	GOT
66*0a0a7a9aSMasahiro Yamada 
679fb288a0SMasahiro Yamada #define STACK_SECTION					\
689fb288a0SMasahiro Yamada 	stacks (NOLOAD) : {				\
699fb288a0SMasahiro Yamada 		__STACKS_START__ = .;			\
709fb288a0SMasahiro Yamada 		*(tzfw_normal_stacks)			\
719fb288a0SMasahiro Yamada 		__STACKS_END__ = .;			\
729fb288a0SMasahiro Yamada 	}
739fb288a0SMasahiro Yamada 
749fb288a0SMasahiro Yamada /*
759fb288a0SMasahiro Yamada  * If BL doesn't use any bakery lock then __PERCPU_BAKERY_LOCK_SIZE__
769fb288a0SMasahiro Yamada  * will be zero. For this reason, the only two valid values for
779fb288a0SMasahiro Yamada  * __PERCPU_BAKERY_LOCK_SIZE__ are 0 or the platform defined value
789fb288a0SMasahiro Yamada  * PLAT_PERCPU_BAKERY_LOCK_SIZE.
799fb288a0SMasahiro Yamada  */
809fb288a0SMasahiro Yamada #ifdef PLAT_PERCPU_BAKERY_LOCK_SIZE
819fb288a0SMasahiro Yamada #define BAKERY_LOCK_SIZE_CHECK				\
829fb288a0SMasahiro Yamada 	ASSERT((__PERCPU_BAKERY_LOCK_SIZE__ == 0) ||	\
839fb288a0SMasahiro Yamada 	       (__PERCPU_BAKERY_LOCK_SIZE__ == PLAT_PERCPU_BAKERY_LOCK_SIZE), \
849fb288a0SMasahiro Yamada 	       "PLAT_PERCPU_BAKERY_LOCK_SIZE does not match bakery lock requirements");
859fb288a0SMasahiro Yamada #else
869fb288a0SMasahiro Yamada #define BAKERY_LOCK_SIZE_CHECK
879fb288a0SMasahiro Yamada #endif
889fb288a0SMasahiro Yamada 
899fb288a0SMasahiro Yamada /*
909fb288a0SMasahiro Yamada  * Bakery locks are stored in normal .bss memory
919fb288a0SMasahiro Yamada  *
929fb288a0SMasahiro Yamada  * Each lock's data is spread across multiple cache lines, one per CPU,
939fb288a0SMasahiro Yamada  * but multiple locks can share the same cache line.
949fb288a0SMasahiro Yamada  * The compiler will allocate enough memory for one CPU's bakery locks,
959fb288a0SMasahiro Yamada  * the remaining cache lines are allocated by the linker script
969fb288a0SMasahiro Yamada  */
979fb288a0SMasahiro Yamada #if !USE_COHERENT_MEM
989fb288a0SMasahiro Yamada #define BAKERY_LOCK_NORMAL				\
999fb288a0SMasahiro Yamada 	. = ALIGN(CACHE_WRITEBACK_GRANULE);		\
1009fb288a0SMasahiro Yamada 	__BAKERY_LOCK_START__ = .;			\
1019fb288a0SMasahiro Yamada 	__PERCPU_BAKERY_LOCK_START__ = .;		\
1029fb288a0SMasahiro Yamada 	*(bakery_lock)					\
1039fb288a0SMasahiro Yamada 	. = ALIGN(CACHE_WRITEBACK_GRANULE);		\
1049fb288a0SMasahiro Yamada 	__PERCPU_BAKERY_LOCK_END__ = .;			\
1059fb288a0SMasahiro Yamada 	__PERCPU_BAKERY_LOCK_SIZE__ = ABSOLUTE(__PERCPU_BAKERY_LOCK_END__ - __PERCPU_BAKERY_LOCK_START__); \
1069fb288a0SMasahiro Yamada 	. = . + (__PERCPU_BAKERY_LOCK_SIZE__ * (PLATFORM_CORE_COUNT - 1)); \
1079fb288a0SMasahiro Yamada 	__BAKERY_LOCK_END__ = .;			\
1089fb288a0SMasahiro Yamada 	BAKERY_LOCK_SIZE_CHECK
1099fb288a0SMasahiro Yamada #else
1109fb288a0SMasahiro Yamada #define BAKERY_LOCK_NORMAL
1119fb288a0SMasahiro Yamada #endif
1129fb288a0SMasahiro Yamada 
1139fb288a0SMasahiro Yamada /*
1149fb288a0SMasahiro Yamada  * Time-stamps are stored in normal .bss memory
1159fb288a0SMasahiro Yamada  *
1169fb288a0SMasahiro Yamada  * The compiler will allocate enough memory for one CPU's time-stamps,
1179fb288a0SMasahiro Yamada  * the remaining memory for other CPUs is allocated by the
1189fb288a0SMasahiro Yamada  * linker script
1199fb288a0SMasahiro Yamada  */
1209fb288a0SMasahiro Yamada #define PMF_TIMESTAMP					\
1219fb288a0SMasahiro Yamada 	. = ALIGN(CACHE_WRITEBACK_GRANULE);		\
1229fb288a0SMasahiro Yamada 	__PMF_TIMESTAMP_START__ = .;			\
1239fb288a0SMasahiro Yamada 	KEEP(*(pmf_timestamp_array))			\
1249fb288a0SMasahiro Yamada 	. = ALIGN(CACHE_WRITEBACK_GRANULE);		\
1259fb288a0SMasahiro Yamada 	__PMF_PERCPU_TIMESTAMP_END__ = .;		\
1269fb288a0SMasahiro Yamada 	__PERCPU_TIMESTAMP_SIZE__ = ABSOLUTE(. - __PMF_TIMESTAMP_START__); \
1279fb288a0SMasahiro Yamada 	. = . + (__PERCPU_TIMESTAMP_SIZE__ * (PLATFORM_CORE_COUNT - 1)); \
1289fb288a0SMasahiro Yamada 	__PMF_TIMESTAMP_END__ = .;
1299fb288a0SMasahiro Yamada 
130665e71b8SMasahiro Yamada /*
131665e71b8SMasahiro Yamada  * The xlat_table section is for full, aligned page tables (4K).
132665e71b8SMasahiro Yamada  * Removing them from .bss avoids forcing 4K alignment on
133665e71b8SMasahiro Yamada  * the .bss section. The tables are initialized to zero by the translation
134665e71b8SMasahiro Yamada  * tables library.
135665e71b8SMasahiro Yamada  */
136665e71b8SMasahiro Yamada #define XLAT_TABLE_SECTION				\
137665e71b8SMasahiro Yamada 	xlat_table (NOLOAD) : {				\
138665e71b8SMasahiro Yamada 		*(xlat_table)				\
139665e71b8SMasahiro Yamada 	}
140665e71b8SMasahiro Yamada 
141665e71b8SMasahiro Yamada #endif /* BL_COMMON_LD_H */
142