| /* |
| * 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 */ |