xref: /rk3399_ARM-atf/include/plat/arm/common/arm_reclaim_init.ld.S (revision 34dd1e96fdae59d56d19a8d1270a03860af9f015)
1cb4adb0dSDaniel Boulby/*
2*34dd1e96SAlexei Fedorov * Copyright (c) 2017-2020, ARM Limited and Contributors. All rights reserved.
3cb4adb0dSDaniel Boulby *
4cb4adb0dSDaniel Boulby * SPDX-License-Identifier: BSD-3-Clause
5cb4adb0dSDaniel Boulby */
6cb4adb0dSDaniel Boulby#ifndef ARM_RECLAIM_INIT_LD_S
7cb4adb0dSDaniel Boulby#define ARM_RECLAIM_INIT_LD_S
8cb4adb0dSDaniel Boulby
9cb4adb0dSDaniel BoulbySECTIONS
10cb4adb0dSDaniel Boulby{
11cb4adb0dSDaniel Boulby        .init __STACKS_START__ : {
12cb4adb0dSDaniel Boulby            . = . + PLATFORM_STACK_SIZE;
13cb4adb0dSDaniel Boulby            . = ALIGN(PAGE_SIZE);
14cb4adb0dSDaniel Boulby            __INIT_CODE_START__ = .;
15*34dd1e96SAlexei Fedorov	    *(*text.init*);
16cb4adb0dSDaniel Boulby            __INIT_CODE_UNALIGNED__ = .;
17cb4adb0dSDaniel Boulby            .  = ALIGN(PAGE_SIZE);
18cb4adb0dSDaniel Boulby            __INIT_CODE_END__ = .;
19cb4adb0dSDaniel Boulby        } >RAM
20cb4adb0dSDaniel Boulby
21cb4adb0dSDaniel Boulby#ifdef BL31_PROGBITS_LIMIT
22cb4adb0dSDaniel Boulby    ASSERT(__INIT_CODE_END__ <= BL31_PROGBITS_LIMIT,
23cb4adb0dSDaniel Boulby            "BL31 init has exceeded progbits limit.")
24cb4adb0dSDaniel Boulby#endif
25cb4adb0dSDaniel Boulby
26cb4adb0dSDaniel Boulby    ASSERT(__INIT_CODE_END__ <= __STACKS_END__,
27cb4adb0dSDaniel Boulby        "Init code ends past the end of the stacks")
28a71c59d5SAmbroise Vincent
29cb4adb0dSDaniel Boulby}
30cb4adb0dSDaniel Boulby
31*34dd1e96SAlexei Fedorov#undef	MIN
32*34dd1e96SAlexei Fedorov#define	ABS		ABSOLUTE
33*34dd1e96SAlexei Fedorov#define	COUNT		PLATFORM_CORE_COUNT
34*34dd1e96SAlexei Fedorov#define	ALIGN_MASK	~(CACHE_WRITEBACK_GRANULE - 1)
35*34dd1e96SAlexei Fedorov
36*34dd1e96SAlexei Fedorov#define PRIMARY_STACK							\
37*34dd1e96SAlexei Fedorov	__STACKS_START__ = .;						\
38*34dd1e96SAlexei Fedorov	*(tzfw_normal_stacks)						\
39*34dd1e96SAlexei Fedorov	OFFSET = ABS(SIZEOF(.init) - (. - __STACKS_START__));		\
40*34dd1e96SAlexei Fedorov	/* Offset sign */						\
41*34dd1e96SAlexei Fedorov	SIGN = ABS(OFFSET) & (1 << 63);					\
42*34dd1e96SAlexei Fedorov	/* Offset mask */						\
43*34dd1e96SAlexei Fedorov	MASK = ABS(SIGN >> 63) - 1;					\
44*34dd1e96SAlexei Fedorov	. +=  ABS(OFFSET) & ABS(MASK);					\
45*34dd1e96SAlexei Fedorov	__STACKS_END__ = .;						\
46*34dd1e96SAlexei Fedorov	/* Total stack size */						\
47*34dd1e96SAlexei Fedorov	SIZE = ABS(. - __STACKS_START__);				\
48*34dd1e96SAlexei Fedorov	/* Maximum primary CPU stack */					\
49*34dd1e96SAlexei Fedorov	STACK = ABS(__STACKS_START__ + SIZE / COUNT) & ALIGN_MASK;	\
50*34dd1e96SAlexei Fedorov	/* Primary CPU stack */						\
51*34dd1e96SAlexei Fedorov	__PRIMARY_STACK__ = MIN(STACK, ABS(__INIT_CODE_START__));
52*34dd1e96SAlexei Fedorov
53*34dd1e96SAlexei Fedorov#if (COUNT > 1)
54*34dd1e96SAlexei Fedorov#define	SECONDARY_STACK					\
55*34dd1e96SAlexei Fedorov	/* Size of the secondary CPUs' stack */		\
56*34dd1e96SAlexei Fedorov	REST = ABS(__STACKS_END__ - __PRIMARY_STACK__);	\
57*34dd1e96SAlexei Fedorov	/* Secondary per-CPU stack size */		\
58*34dd1e96SAlexei Fedorov	__STACK_SIZE__ = ABS(REST / (COUNT - 1));
59*34dd1e96SAlexei Fedorov#else
60*34dd1e96SAlexei Fedorov#define	SECONDARY_STACK
61*34dd1e96SAlexei Fedorov#endif
62*34dd1e96SAlexei Fedorov
63*34dd1e96SAlexei Fedorov#define STACK_SECTION		\
64*34dd1e96SAlexei Fedorov	stacks (NOLOAD) : {	\
65*34dd1e96SAlexei Fedorov		PRIMARY_STACK	\
66*34dd1e96SAlexei Fedorov		SECONDARY_STACK	\
67*34dd1e96SAlexei Fedorov	}
68cb4adb0dSDaniel Boulby#endif /* ARM_RECLAIM_INIT_LD_S */
69