blob: 84579f26ae2d2d34101d24b69970e01d754da2c2 [file] [log] [blame]
/*
* Copyright (c) 2019-2022 Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* Corstone-Polaris is the next generation Corstone-300 where the CPU
* has been upgraded to Cortex Olympus.
*
* This is a simplified picture of the Corstone-300 memory system.
* Please refer to the Corstone SSE-300 Technical Reference Manual for
* further information.
*
* https://developer.arm.com/ip-products/subsystem/corstone/corstone-300
*
* +---------------+ +---------------+ +------+
* | Ethos-U55 | | Cortex-M55 +--+ ITCM |
* | | | | +------+
* | | | |
* | | | | +------+
* | M1 M0 | | +--+ DTCM |
* +---+-------+---+ +-------+-------+ +------+
* | | |
* | +---+---------------+-----+
* | | AMBA AXI NIC-400-Lite |
* | +---+-----------------+---+
* | | |
* +---+-------+------------+ +--+-------+
* | AMBA AXI NIC-400 | | SSE-300 |
* +---+--------+--------+--+ | SRAM |
* | | | +----------+
* +---+---+ +--+---+ +--+--+
* | Flash | | BRAM | | DDR |
* +-------+ +------+ +-----+
*
* +-----------------------+-------------+-------------+----+--------------------------------------+
* | Memory region name | Base addr | Size |IDAU| MCC load address + remarks |
* +-----------------------+-------------+-------------+----+--------------------------------------+
* | ITCM | 0x0000_0000 | 0x0000_8000 | NS | 0x0000_0000; 32 kiB |
* | ITCM | 0x1000_0000 | 0x0000_8000 | S | Secure alias for NS ITCM |
* | FPGA Data SRAM; BRAM | 0x0100_0000 | 0x0020_0000 | NS | 0x0100_0000; 2 MiB |
* | FPGA data SRAM; BRAM | 0x1100_0000 | 0x0020_0000 | S | Secure alias for NS BRAM |
* | DTCM | 0x2000_0000 | 0x0000_8000 | NS | 32 kiB; |
* | DTCM | 0x3000_0000 | 0x0000_8000 | S | Secure alias for NS DTCM |
* | SSE-300 internal SRAM | 0x2100_0000 | 0x0020_0000 | NS | 1 bank of 2 MiB; 3cc latency) |
* | SSE-300 internal SRAM | 0x3100_0000 | 0x0020_0000 | S | Secure alias for NS internal SRAM |
* | DDR | 0x6000_0000 | 0x1000_0000 | NS | 0x0800_0000; 256 MiB bank |
* | DDR | 0x7000_0000 | 0x1000_0000 | S | 0x0C00_0000; 256 MiB bank |
* +-----------------------+-------------+-------------+----+--------------------------------------+
*
* Note: Ethos-U55 can access BRAM, internal SRAM and the DDR sections => activation buffers and
* the model should only be placed in those regions.
*
* Note: Alias regions means that secure and non-secure addresses are mapped to the same physical
* memory banks.
*/
/* default value - '1', for DRAM */
#ifndef ETHOSU_MODEL
#define ETHOSU_MODEL 1
#endif
/* default value - '1', for DRAM */
#ifndef ETHOSU_ARENA
#define ETHOSU_ARENA 1
#endif
#ifndef STACK_SIZE
#define STACK_SIZE 0x8000
#endif
#ifndef HEAP_SIZE
#define HEAP_SIZE 0x10000
#endif
#define ITCM_START 0x10000000
#define ITCM_SIZE 0x00008000
#define BRAM_START 0x11000000
#define BRAM_SIZE 0x00200000
#define DTCM_START 0x30000000
#define DTCM_SIZE 0x00008000
#define SRAM_START 0x31000000
#define SRAM_SIZE 0x00200000
#define DDR_START 0x70000000
#define DDR_SIZE 0x10000000
/* ----------------------------------------------------------------------------
Stack seal size definition
*----------------------------------------------------------------------------*/
APP_IMAGE ITCM_START ITCM_SIZE
{
; ITCM 32kB
rom_exec ITCM_START ITCM_SIZE
{
*.o (RESET, +First)
*(InRoot$$Sections)
; Make sure reset_handler ends up in root segment, when split across
; ITCM and DTCM
startup_ARMCM55.o
system_ARMCM55.o
target.o
}
; DTCM 32kB
ARM_LIB_STACK DTCM_START EMPTY ALIGN 8 STACK_SIZE {}
; Place heap at end of SSE-300 SRAM
ARM_LIB_HEAP (SRAM_START + SRAM_SIZE - HEAP_SIZE) EMPTY ALIGN 8 HEAP_SIZE {}
}
; Place all SRAM, BRAM and DDR execution regions in DDR. We have plenty of DDR
; and can perform scatter loading from here.
LOAD_REGION_DDR DDR_START DDR_SIZE
{
; Place model and its affiliates in DRAM
rom_dram DDR_START
{
#if (ETHOSU_MODEL == 1)
* (network_model_sec)
#endif
* (input_data_sec)
* (expected_output_data_sec)
* (output_data_sec)
}
#if (ETHOSU_ARENA == 1)
; Place tensor arena in DRAM if we have a fast memory area
ARENA +0 UNINIT ALIGN 16
{
* (.bss.tensor_arena)
}
#endif
; 2MB SSE-300 SRAM (3 cycles read latency) from M55/U55
SRAM SRAM_START (SRAM_SIZE - HEAP_SIZE)
{
#if (ETHOSU_MODEL == 0)
; Place network model in SRAM
* (network_model_sec)
#endif
#if (ETHOSU_ARENA == 0)
; Place tensor arena in SRAM
* (.bss.tensor_arena)
#endif
; Place scratch buffer in SRAM
* (.bss.ethosu_scratch)
}
; MPS3 BRAM
BRAM BRAM_START BRAM_SIZE
{
.ANY1 (+RO +RW +ZI)
* (.sram.data)
}
}