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