aboutsummaryrefslogtreecommitdiff
path: root/targets/corstone-300/platform.scatter
blob: fe63d01771bb8af0be657d3f973c9eb4056ae3e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#! cpp

/*
 * Copyright (c) 2019-2021 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.
 */

/*
 * 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 | 0x0008_0000 | NS | 0x0000_0000; 512 kiB                 |
 * | ITCM                  | 0x1000_0000 | 0x0008_0000 | 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 | 0x0008_0000 | NS | 512 kiB; 4 banks of 128k each        |
 * | DTCM                  | 0x3000_0000 | 0x0008_0000 | S  | Secure alias for NS DTCM             |
 * | SSE-300 internal SRAM | 0x2100_0000 | 0x0040_0000 | NS | 2 banks of 2 MiB each; 3cc latency)  |
 * | SSE-300 internal SRAM | 0x3100_0000 | 0x0040_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.
 */

#ifndef STACK_SIZE
#define STACK_SIZE 0x8000
#endif

#ifndef HEAP_SIZE
#define HEAP_SIZE 0x8000
#endif

#if defined(TRUSTZONE_BUILD) && !defined(ETHOSU_TEST)
/*
 * Include trustzone.h with common addresses and sizes.
 * The build configuration sets whether TRUSTZONE_SECURE is set or
 * TRUSTZONE_NONSECURE which sets the memory start addresses and sizes.
 */

#include "trustzone.h"
#define USE_TRUSTZONE

#else //TRUSTZONE_BUILD

#define LR_START   0x10000000
#define LR_SIZE    0x00080000

#define ITCM_START 0x10000000
#define ITCM_SIZE  0x00080000

#define BRAM_START 0x11000000
#define BRAM_SIZE  0x00200000

#define DTCM_START 0x30000000
#define DTCM_SIZE  0x00080000

#define SRAM_START 0x31000000
#define SRAM_SIZE  0x00200000

#define DDR_START  0x70000000
#define DDR_SIZE   0x02000000

#define STACK_HEAP 0x30080000

#endif //TRUSTZONE_BUILD

/* ----------------------------------------------------------------------------
  Stack seal size definition
 *----------------------------------------------------------------------------*/
#if defined(USE_TRUSTZONE) && defined(TRUSTZONE_SECURE)
#define __STACKSEAL_SIZE   ( 8 )
#else
#define __STACKSEAL_SIZE   ( 0 )
#endif

APP_IMAGE LR_START LR_SIZE
{
    ; ITCM 512kB
    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
        .ANY (+RO)
    }

#if defined(USE_TRUSTZONE) && defined(TRUSTZONE_SECURE)
    ; MPS3 BRAM
    ; Shared between Cortex-M and the NPU
    BRAM BRAM_START (BRAM_SIZE - TZ_NSC_SIZE)
    {
        * (.sram.data)
    }

    ROM_NSC TZ_NSC_START TZ_NSC_SIZE
    {
        *(Veneer$$CMSE)
    }
#else
    ; MPS3 BRAM
    BRAM BRAM_START BRAM_SIZE
    {
        * (.sram.data)
    }
#endif

    ; DTCM 512kB
    ; Only accessible from the Cortex-M
    DTCM DTCM_START (DTCM_SIZE - STACK_SIZE - HEAP_SIZE - __STACKSEAL_SIZE)
    {
        .ANY1 (+RW +ZI)
    }

    ; SSE-300 SRAM (3 cycles read latency) from M55/U55
    ; 2x2MB - only first part mapped
    SRAM SRAM_START UNINIT SRAM_SIZE
    {
#ifndef ETHOSU_FAST_MEMORY_SIZE
        ; Place tensor arena in SRAM if we do not have a fast memory area
        * (.bss.tensor_arena)
#else
        * (.bss.ethosu_scratch)
#endif
    }

    ARM_LIB_HEAP  (STACK_HEAP - STACK_SIZE - __STACKSEAL_SIZE - HEAP_SIZE) EMPTY ALIGN 8 HEAP_SIZE {}
    ARM_LIB_STACK (STACK_HEAP - STACK_SIZE - __STACKSEAL_SIZE) EMPTY ALIGN 8 STACK_SIZE {}

#if defined(USE_TRUSTZONE) && defined(TRUSTZONE_SECURE)
    STACKSEAL +0 EMPTY __STACKSEAL_SIZE {
        ; Reserve empty region for stack seal immediately after stack
    }
#endif
}

LOAD_REGION_1 DDR_START DDR_SIZE
{
    ; 2GB DDR4 available
    rom_dram DDR_START
#if defined(USE_TRUSTZONE) && defined(TRUSTZONE_NONSECURE)
    {
    }
#else //trustzone secure or non-trustzone
    {
        * (network_model_sec)
        * (input_data_sec)
        * (expected_output_data_sec)
        * (output_data_sec)
    }

#ifdef ETHOSU_FAST_MEMORY_SIZE
    ; Place tensor arena in DRAM if we have a fast memory area
    ARENA +0 UNINIT ALIGN 16
    {
        * (.bss.tensor_arena)
    }
#endif
#endif
}