aboutsummaryrefslogtreecommitdiff
path: root/plat/hisilicon/poplar/include/poplar_layout.h
blob: 9fb5a94cf302c5eafc7628878de4485c029e871f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef __POPLAR_LAYOUT_H
#define __POPLAR_LAYOUT_H

/*
 * Boot memory layout definitions for the HiSilicon Poplar board
 */

/*
 * When Poplar is powered on, boot ROM verifies the initial content of
 * boot media, loads it into low memory, and begins executing it
 * in 32-bit mode.  The image loaded is "l-loader.bin", which contains
 * a small amount code along with an embedded ARM Trusted Firmware
 * BL1 image.  The main purpose of "l-loader" is to prepare the
 * processor to execute the BL1 image in 64-bit mode, and to trigger
 * that execution.
 *
 * Also embedded in "l-loader.bin" is a FIP image that contains
 * other ARM Trusted Firmware images:  BL2; BL31; and for BL33,
 * U-Boot.  When BL1 executes, it unpacks the BL2 image from the FIP
 * image into a region of memory set aside to hold it.  Similarly,
 * BL2 unpacks BL31 into memory reserved for it, and unpacks U-Boot
 * into high memory.
 *
 * Because the BL1 code is embedded in "l-loader", its base address
 * in memory is derived from the base address of the "l-loader"
 * text section, together with an offset.  Memory space for BL2 is
 * reserved immediately following BL1, and memory space is reserved
 * for BL31 after that.  ARM Trusted Firmware requires each of these
 * memory regions to be aligned on page boundaries, so the size of
 * each region is a multiple of a page size (ending in 000).  Note
 * that ARM Trusted Firmware requires the read-only and read-write
 * regions of memory used for BL1 to be defined separately.
 *
 *    ---------------------
 *    |  (unused memory)  |
 *    +-------------------+	- - - - -
 *    |  (l-loader text)  |               \
 *    +-------------------+                \
 *    |  BL1 (read-only)  | \               \
 *    |- - - - - - - - - -| |               |
 *    |  BL1 (read-write) | |               |
 *    +-------------------+  >  BL Memory   |
 *    |  Reserved for BL2 | |                > "l-loader.bin" image
 *    +-------------------+ |               |
 *    | Reserved for BL31 | /               |
 *    +-------------------+                 |
 *           . . .                          /
 *    +-------------------+                /
 *    |        FIP        |               /
 *    +-------------------+	- - - - -
 *           . . .
 *    |  (unused memory)  |
 *           . . .
 *    +-------------------+
 *    |Reserved for U-Boot|
 *    +-------------------+
 *           . . .
 *    |  (unused memory)  |
 *    ---------------------
 *
 * The size of each of these regions is defined below.  The base
 * address of the "l-loader" TEXT section and the offset of the BL1
 * image within that serve as anchors for defining the positions of
 * all other regions.  The FIP is placed in a section of its own.
 *
 * A "BASE" is the memory address of the start of a region; a "LIMIT"
 * marks its end.  A "SIZE" is the size of a region (in bytes).  An
 * "OFFSET" is an offset to the start of a region relative to the
 * base of the "l-loader" TEXT section (also a multiple of page size).
 */
#define LLOADER_TEXT_BASE		0x02001000	/* page aligned */
#define BL1_OFFSET			0x0000D000	/* page multiple */
#define FIP_BASE			0x02040000

/*
 * FIP_BASE_EMMC = 0x40000 - 0x1000
 * = fip.bin offset - l-loader text offset
 * in l-loader.bin
 */
#define FIP_BASE_EMMC			0x0003f000

#define BL1_RO_SIZE			0x00008000	/* page multiple */
#define BL1_RW_SIZE			0x00008000	/* page multiple */
#define BL1_SIZE			(BL1_RO_SIZE + BL1_RW_SIZE)
#define BL2_SIZE			0x0000d000	/* page multiple */
#define BL31_SIZE			0x00014000
#if !POPLAR_RECOVERY
/*
 * emmc partition1 4096KB
 * - l-loader.bin 1984KB
 * |- l-loader + bl1.bin 256KB
 * |- fip.bin 1728KB (0x001b0000)
 * - u-boot persistent data 64KB
 * - uefi persistent data 2048KB
 */
#define FIP_SIZE			0x001b0000  /* absolute max */
#else
/*
 * same as above, but bootrom can only load an image (l-loader.bin) of
 * 1024KB max, so after deducting the size of l-loader + bl1.bin (256KB),
 * that leaves 768KB (0x000c0000) for fip.bin
 */
#define FIP_SIZE			0x000c0000  /* absolute max */
#endif

     /* BL1_OFFSET */			/* (Defined above) */
#define BL1_BASE			(LLOADER_TEXT_BASE + BL1_OFFSET)
#define BL1_LIMIT			(BL1_BASE + BL1_SIZE)

#define BL1_RO_OFFSET			(BL1_OFFSET)
#define BL1_RO_BASE			(LLOADER_TEXT_BASE + BL1_RO_OFFSET)
#define BL1_RO_LIMIT			(BL1_RO_BASE + BL1_RO_SIZE)

#define BL1_RW_OFFSET			(BL1_RO_OFFSET + BL1_RO_SIZE)
#define BL1_RW_BASE			(LLOADER_TEXT_BASE + BL1_RW_OFFSET)
#define BL1_RW_LIMIT			(BL1_RW_BASE + BL1_RW_SIZE)

#define BL2_OFFSET			(BL1_OFFSET + BL1_SIZE)
#define BL2_BASE			(LLOADER_TEXT_BASE + BL2_OFFSET)
#define BL2_LIMIT			(BL2_BASE + BL2_SIZE)

#define BL31_OFFSET			(BL2_OFFSET + BL2_SIZE)
#define BL31_BASE			(LLOADER_TEXT_BASE + BL31_OFFSET)
#define BL31_LIMIT			(BL31_BASE + BL31_SIZE)

#endif /* !__POPLAR_LAYOUT_H */