blob: fe5d3d1c2a3ade98614ac457815144eaa4e48326 [file] [log] [blame]
/*
* Copyright (c) 2019-2022 Arm Limited.
*
* 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-310 is the next generation Corstone-300 where the CPU
* has been upgraded to Cortex-M85.
*
* This is a simplified picture of the Corstone-310 memory system.
* Please refer to the Corstone SSE-310 Technical Reference Manual for
* further information.
*
* https://developer.arm.com/ip-products/subsystem/corstone/corstone-300
*
* +---------------+ +---------------+ +------+
* | Ethos-U55 | | Cortex-M85 +--+ 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 | 32 kiB |
* | ITCM | 0x1000_0000 | 0x0000_8000 | S | Secure alias for NS ITCM |
* | FPGA Data SRAM; BRAM | 0x0100_0000 | 0x0020_0000 | NS | 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 | 0x0040_0000 | NS | 2 banks of 2 MiB; 3 cycles latency |
* | SSE-300 internal SRAM | 0x3100_0000 | 0x0040_0000 | S | Secure alias for NS internal SRAM |
* | DDR | 0x6000_0000 | 0x1000_0000 | NS | 256 MB bank |
* | DDR | 0x7000_0000 | 0x1000_0000 | S | Secure alias for NS DDR |
* +-----------------------+-------------+-------------+----+--------------------------------------+
*
* 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 DTCM_START 0x30000000
#define DTCM_SIZE 0x00008000
#define BRAM_START 0x11000000
#define BRAM_SIZE 0x00200000
#define SRAM_START 0x31000000
#define SRAM_SIZE 0x00400000
#define DDR_START 0x70000000
#define DDR_SIZE 0x10000000
#if STACK_SIZE > DTCM_SIZE
#error Stack size larger than DTCM size
#endif
/* ----------------------------------------------------------------------------
Stack seal size definition
*----------------------------------------------------------------------------*/
APP_IMAGE BRAM_START BRAM_SIZE
{
rom_exec BRAM_START BRAM_SIZE
{
*.o (RESET, +First)
*(InRoot$$Sections)
startup_ARMCM85.o
system_ARMCM85.o
target.o
.ANY1 (+RO +RW +ZI)
}
ARM_LIB_HEAP +0 EMPTY ALIGN 8 HEAP_SIZE {}
ARM_LIB_STACK DTCM_START EMPTY ALIGN 8 STACK_SIZE {}
}
; Place all SRAM 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)
* (ethosu_core_in_queue)
* (ethosu_core_out_queue)
}
#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
SRAM SRAM_START ALIGN 16 SRAM_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)
; SRAM data
* (.sram.data)
}
}