aboutsummaryrefslogtreecommitdiff
path: root/targets/corstone-polaris/platform.scatter
blob: 84579f26ae2d2d34101d24b69970e01d754da2c2 (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
/*
 * 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)
    }
}