xref: /rk3399_ARM-atf/plat/hisilicon/poplar/include/poplar_layout.h (revision 9d068f66b15e644df4961b74b965323c20f21f14)
1e35d0edbSJorge Ramirez-Ortiz /*
2e35d0edbSJorge Ramirez-Ortiz  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3e35d0edbSJorge Ramirez-Ortiz  *
4e35d0edbSJorge Ramirez-Ortiz  * SPDX-License-Identifier: BSD-3-Clause
5e35d0edbSJorge Ramirez-Ortiz  */
6e35d0edbSJorge Ramirez-Ortiz 
7*c3cf06f1SAntonio Nino Diaz #ifndef POPLAR_LAYOUT_H
8*c3cf06f1SAntonio Nino Diaz #define POPLAR_LAYOUT_H
9e35d0edbSJorge Ramirez-Ortiz 
10e35d0edbSJorge Ramirez-Ortiz /*
11e35d0edbSJorge Ramirez-Ortiz  * Boot memory layout definitions for the HiSilicon Poplar board
12e35d0edbSJorge Ramirez-Ortiz  */
13e35d0edbSJorge Ramirez-Ortiz 
14e35d0edbSJorge Ramirez-Ortiz /*
1559149bbeSVictor Chong  * When Poplar is powered on, boot ROM verifies the initial content of
1659149bbeSVictor Chong  * boot media, loads it into low memory, and begins executing it
17e35d0edbSJorge Ramirez-Ortiz  * in 32-bit mode.  The image loaded is "l-loader.bin", which contains
18e35d0edbSJorge Ramirez-Ortiz  * a small amount code along with an embedded ARM Trusted Firmware
19e35d0edbSJorge Ramirez-Ortiz  * BL1 image.  The main purpose of "l-loader" is to prepare the
20e35d0edbSJorge Ramirez-Ortiz  * processor to execute the BL1 image in 64-bit mode, and to trigger
21e35d0edbSJorge Ramirez-Ortiz  * that execution.
22e35d0edbSJorge Ramirez-Ortiz  *
23e35d0edbSJorge Ramirez-Ortiz  * Also embedded in "l-loader.bin" is a FIP image that contains
24e35d0edbSJorge Ramirez-Ortiz  * other ARM Trusted Firmware images:  BL2; BL31; and for BL33,
25e35d0edbSJorge Ramirez-Ortiz  * U-Boot.  When BL1 executes, it unpacks the BL2 image from the FIP
26e35d0edbSJorge Ramirez-Ortiz  * image into a region of memory set aside to hold it.  Similarly,
27e35d0edbSJorge Ramirez-Ortiz  * BL2 unpacks BL31 into memory reserved for it, and unpacks U-Boot
28e35d0edbSJorge Ramirez-Ortiz  * into high memory.
29e35d0edbSJorge Ramirez-Ortiz  *
30e35d0edbSJorge Ramirez-Ortiz  * Because the BL1 code is embedded in "l-loader", its base address
31e35d0edbSJorge Ramirez-Ortiz  * in memory is derived from the base address of the "l-loader"
32e35d0edbSJorge Ramirez-Ortiz  * text section, together with an offset.  Memory space for BL2 is
33e35d0edbSJorge Ramirez-Ortiz  * reserved immediately following BL1, and memory space is reserved
34e35d0edbSJorge Ramirez-Ortiz  * for BL31 after that.  ARM Trusted Firmware requires each of these
35e35d0edbSJorge Ramirez-Ortiz  * memory regions to be aligned on page boundaries, so the size of
36e35d0edbSJorge Ramirez-Ortiz  * each region is a multiple of a page size (ending in 000).  Note
37e35d0edbSJorge Ramirez-Ortiz  * that ARM Trusted Firmware requires the read-only and read-write
38e35d0edbSJorge Ramirez-Ortiz  * regions of memory used for BL1 to be defined separately.
39e35d0edbSJorge Ramirez-Ortiz  *
40e35d0edbSJorge Ramirez-Ortiz  *    ---------------------
41e35d0edbSJorge Ramirez-Ortiz  *    |  (unused memory)  |
42e35d0edbSJorge Ramirez-Ortiz  *    +-------------------+	- - - - -
43e35d0edbSJorge Ramirez-Ortiz  *    |  (l-loader text)  |               \
44e35d0edbSJorge Ramirez-Ortiz  *    +-------------------+                \
45e35d0edbSJorge Ramirez-Ortiz  *    |  BL1 (read-only)  | \               \
46e35d0edbSJorge Ramirez-Ortiz  *    |- - - - - - - - - -| |               |
47e35d0edbSJorge Ramirez-Ortiz  *    |  BL1 (read-write) | |               |
48e35d0edbSJorge Ramirez-Ortiz  *    +-------------------+  >  BL Memory   |
49e35d0edbSJorge Ramirez-Ortiz  *    |  Reserved for BL2 | |                > "l-loader.bin" image
50e35d0edbSJorge Ramirez-Ortiz  *    +-------------------+ |               |
51e35d0edbSJorge Ramirez-Ortiz  *    | Reserved for BL31 | /               |
52e35d0edbSJorge Ramirez-Ortiz  *    +-------------------+                 |
53e35d0edbSJorge Ramirez-Ortiz  *           . . .                          /
54e35d0edbSJorge Ramirez-Ortiz  *    +-------------------+                /
55e35d0edbSJorge Ramirez-Ortiz  *    |        FIP        |               /
56e35d0edbSJorge Ramirez-Ortiz  *    +-------------------+	- - - - -
57e35d0edbSJorge Ramirez-Ortiz  *           . . .
58e35d0edbSJorge Ramirez-Ortiz  *    |  (unused memory)  |
59e35d0edbSJorge Ramirez-Ortiz  *           . . .
60e35d0edbSJorge Ramirez-Ortiz  *    +-------------------+
61e35d0edbSJorge Ramirez-Ortiz  *    |Reserved for U-Boot|
62e35d0edbSJorge Ramirez-Ortiz  *    +-------------------+
63e35d0edbSJorge Ramirez-Ortiz  *           . . .
64e35d0edbSJorge Ramirez-Ortiz  *    |  (unused memory)  |
65e35d0edbSJorge Ramirez-Ortiz  *    ---------------------
66e35d0edbSJorge Ramirez-Ortiz  *
67e35d0edbSJorge Ramirez-Ortiz  * The size of each of these regions is defined below.  The base
68e35d0edbSJorge Ramirez-Ortiz  * address of the "l-loader" TEXT section and the offset of the BL1
69e35d0edbSJorge Ramirez-Ortiz  * image within that serve as anchors for defining the positions of
70e35d0edbSJorge Ramirez-Ortiz  * all other regions.  The FIP is placed in a section of its own.
71e35d0edbSJorge Ramirez-Ortiz  *
72e35d0edbSJorge Ramirez-Ortiz  * A "BASE" is the memory address of the start of a region; a "LIMIT"
73e35d0edbSJorge Ramirez-Ortiz  * marks its end.  A "SIZE" is the size of a region (in bytes).  An
74e35d0edbSJorge Ramirez-Ortiz  * "OFFSET" is an offset to the start of a region relative to the
75e35d0edbSJorge Ramirez-Ortiz  * base of the "l-loader" TEXT section (also a multiple of page size).
76e35d0edbSJorge Ramirez-Ortiz  */
77f336774bSVictor Chong #define LLOADER_TEXT_BASE		0x02001000	/* page aligned */
78e35d0edbSJorge Ramirez-Ortiz #define BL1_OFFSET			0x0000D000	/* page multiple */
79f336774bSVictor Chong #define FIP_BASE			0x02040000
80e35d0edbSJorge Ramirez-Ortiz 
8159149bbeSVictor Chong /*
8259149bbeSVictor Chong  * FIP_BASE_EMMC = 0x40000 - 0x1000
8359149bbeSVictor Chong  * = fip.bin offset - l-loader text offset
8459149bbeSVictor Chong  * in l-loader.bin
8559149bbeSVictor Chong  */
8659149bbeSVictor Chong #define FIP_BASE_EMMC			0x0003f000
8759149bbeSVictor Chong 
88e35d0edbSJorge Ramirez-Ortiz #define BL1_RO_SIZE			0x00008000	/* page multiple */
89e35d0edbSJorge Ramirez-Ortiz #define BL1_RW_SIZE			0x00008000	/* page multiple */
90e35d0edbSJorge Ramirez-Ortiz #define BL1_SIZE			(BL1_RO_SIZE + BL1_RW_SIZE)
910d8052a4SVictor Chong #define BL2_SIZE			0x0000d000	/* page multiple */
92e35d0edbSJorge Ramirez-Ortiz #define BL31_SIZE			0x00014000
9315b54e7bSVictor Chong #if !POPLAR_RECOVERY
9459149bbeSVictor Chong /*
9559149bbeSVictor Chong  * emmc partition1 4096KB
9659149bbeSVictor Chong  * - l-loader.bin 1984KB
9759149bbeSVictor Chong  * |- l-loader + bl1.bin 256KB
9859149bbeSVictor Chong  * |- fip.bin 1728KB (0x001b0000)
9959149bbeSVictor Chong  * - u-boot persistent data 64KB
10059149bbeSVictor Chong  * - uefi persistent data 2048KB
10159149bbeSVictor Chong  */
10259149bbeSVictor Chong #define FIP_SIZE			0x001b0000  /* absolute max */
10315b54e7bSVictor Chong #else
10415b54e7bSVictor Chong /*
10515b54e7bSVictor Chong  * same as above, but bootrom can only load an image (l-loader.bin) of
10615b54e7bSVictor Chong  * 1024KB max, so after deducting the size of l-loader + bl1.bin (256KB),
10715b54e7bSVictor Chong  * that leaves 768KB (0x000c0000) for fip.bin
10815b54e7bSVictor Chong  */
10915b54e7bSVictor Chong #define FIP_SIZE			0x000c0000  /* absolute max */
11015b54e7bSVictor Chong #endif
111e35d0edbSJorge Ramirez-Ortiz 
112e35d0edbSJorge Ramirez-Ortiz      /* BL1_OFFSET */			/* (Defined above) */
113e35d0edbSJorge Ramirez-Ortiz #define BL1_BASE			(LLOADER_TEXT_BASE + BL1_OFFSET)
114e35d0edbSJorge Ramirez-Ortiz #define BL1_LIMIT			(BL1_BASE + BL1_SIZE)
115e35d0edbSJorge Ramirez-Ortiz 
116e35d0edbSJorge Ramirez-Ortiz #define BL1_RO_OFFSET			(BL1_OFFSET)
117e35d0edbSJorge Ramirez-Ortiz #define BL1_RO_BASE			(LLOADER_TEXT_BASE + BL1_RO_OFFSET)
118e35d0edbSJorge Ramirez-Ortiz #define BL1_RO_LIMIT			(BL1_RO_BASE + BL1_RO_SIZE)
119e35d0edbSJorge Ramirez-Ortiz 
120e35d0edbSJorge Ramirez-Ortiz #define BL1_RW_OFFSET			(BL1_RO_OFFSET + BL1_RO_SIZE)
121e35d0edbSJorge Ramirez-Ortiz #define BL1_RW_BASE			(LLOADER_TEXT_BASE + BL1_RW_OFFSET)
122e35d0edbSJorge Ramirez-Ortiz #define BL1_RW_LIMIT			(BL1_RW_BASE + BL1_RW_SIZE)
123e35d0edbSJorge Ramirez-Ortiz 
124e35d0edbSJorge Ramirez-Ortiz #define BL2_OFFSET			(BL1_OFFSET + BL1_SIZE)
125e35d0edbSJorge Ramirez-Ortiz #define BL2_BASE			(LLOADER_TEXT_BASE + BL2_OFFSET)
126e35d0edbSJorge Ramirez-Ortiz #define BL2_LIMIT			(BL2_BASE + BL2_SIZE)
127e35d0edbSJorge Ramirez-Ortiz 
128e35d0edbSJorge Ramirez-Ortiz #define BL31_OFFSET			(BL2_OFFSET + BL2_SIZE)
129e35d0edbSJorge Ramirez-Ortiz #define BL31_BASE			(LLOADER_TEXT_BASE + BL31_OFFSET)
130e35d0edbSJorge Ramirez-Ortiz #define BL31_LIMIT			(BL31_BASE + BL31_SIZE)
131e35d0edbSJorge Ramirez-Ortiz 
132*c3cf06f1SAntonio Nino Diaz #endif /* POPLAR_LAYOUT_H */
133