1 /*
2  * Copyright (c) 2018 Arm Limited. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef __FLASH_LAYOUT_H__
18 #define __FLASH_LAYOUT_H__
19 
20 /* This header file is included from linker scatter file as well, where only a
21  * limited C constructs are allowed. Therefore it is not possible to include
22  * here the platform_retarget.h to access flash related defines. To resolve this
23  * some of the values are redefined here with different names, these are marked
24  * with comment.
25  */
26 
27  /* Flash layout (internal flash) on stm32h573i_dk with BL2 (multiple image boot) uses ovewrite method:
28  *
29  * 0x0000_0000 BL2 - MCUBoot (128 KB)
30  * 0x0002_0000 OTP / NV counters area (32 KB)
31  * 0x0002_8000 Secure Storage Area (16 KB)
32  * 0x0002_c000 Internal Trusted Storage Area (32 KB)
33  * 0x0003_4000 Secure image     primary slot (256 KB)
34  * 0x0007_4000 Non-secure image primary slot (640 KB)
35  * 0x0011_4000 Secure image     secondary slot (256 KB)
36  * 0x0015_4000 Non-secure image secondary slot (640 KB)
37  *
38  ** Flash layout (internal flash) on stm32h573i_dk with BL2 (multiple image boot):
39  *
40  * 0x0000_0000 BL2 - MCUBoot (128 KB)
41  * 0x0002_0000 SCRATCH (32 KB)
42  * 0x0002_8000 OTP / NV counters area (32 KB)
43  * 0x0003_2000 Secure Storage Area (16 KB)
44  * 0x0003_6000 Internal Trusted Storage (32 KB)
45  * 0x0003_e000 Secure image     primary slot (256 KB)
46  * 0x0007_e000 Non-secure image primary slot (640 KB)
47  * 0x0014_c000 Secure image     secondary slot (256 KB)
48  * 0x0017_a000 Non-secure image secondary slot (640 KB)
49  */
50 /* TFM Partition configuration : begin */
51 
52 #define TFM_PARTITION_APP_ROT        /* comment to remove APP_ROT partition */
53 
54 /*#define TFM_PARTITION_FIRMWARE_UPDATE*/  /* comment to remove TFM_PARTITION_FIRMWARE_UPDATE */
55 
56 /* TFM Partition configuration : end */
57 
58 /* Flash layout configuration : begin */
59 #define MCUBOOT_OVERWRITE_ONLY    /* Defined: the FW installation uses ovewrite method.
60                                      UnDefined: The FW installation uses whatever mode
61                                      is configured through the MCUBOOT_UPGRADE_STRATEGY
62                                      config item in config.cmake. FixMe: MCUboot should
63                                      be configured in a single place, i.e. config.cmake
64                                      to avoid clashes */
65 
66 /*#define MCUBOOT_PRIMARY_ONLY*/   /* Defined: No secondary (download) slot(s),
67                                               only primary slot(s) for each image.
68                                       Undefined: Primary and secondary slot(s) for each image. */
69 
70 /*#define MCUBOOT_EXT_LOADER*/        /* Defined: Add external local loader application.
71                                                To enter it, press user button at reset.
72                                       Undefined: No external local loader application. */
73 #if defined (MCUBOOT_EXT_LOADER)
74 #define MCUBOOT_EXT_LOADER_CUSTOM    /* Defined: Use UART loader in user flash. */
75 #endif
76 
77 #define MCUBOOT_APP_IMAGE_NUMBER 2 /* 1: S and NS application binaries are assembled in one single image.
78                                       2: Two separated images for S and NS application binaries. */
79 
80 #define MCUBOOT_S_DATA_IMAGE_NUMBER 0  /* 1: S data image for S application.
81                                            0: No S data image. */
82 
83 #define MCUBOOT_NS_DATA_IMAGE_NUMBER 0  /* 1: NS data image for NS application.
84                                            0: No NS data image. */
85 
86 /* Flash layout configuration : end */
87 
88 
89 /* Total number of images */
90 #ifndef MCUBOOT_IMAGE_NUMBER
91 #define MCUBOOT_IMAGE_NUMBER 2  /* (MCUBOOT_APP_IMAGE_NUMBER + MCUBOOT_S_DATA_IMAGE_NUMBER + MCUBOOT_NS_DATA_IMAGE_NUMBER)*/
92 #endif
93 
94 /* Use image hash reference to reduce boot time (signature check bypass) */
95 #define MCUBOOT_USE_HASH_REF
96 
97 /* control configuration */
98 #if (defined(MCUBOOT_PRIMARY_ONLY) || defined(MCUBOOT_OVERWRITE_ONLY)) && defined(TFM_PARTITION_FIRMWARE_UPDATE)
99 #error "Config not supported: TFM_PARTITION_FIRMWARE_UPDATE is activated only in swap mode"
100 #endif
101 #if defined(MCUBOOT_PRIMARY_ONLY) && !defined(MCUBOOT_OVERWRITE_ONLY)
102 #error "Config not supported: When MCUBOOT_PRIMARY_ONLY is enabled, MCUBOOT_OVERWRITE_ONLY is required."
103 #endif /* defined(MCUBOOT_PRIMARY_ONLY) */
104 
105 /* The size of a partition. This should be large enough to contain a S or NS
106  * sw binary. Each FLASH_AREA_IMAGE contains two partitions. See Flash layout
107  * above.
108  */
109 #define LOADER_FLASH_DEV_NAME             TFM_Driver_FLASH0
110 
111 /* Flash layout info for BL2 bootloader */
112 #define FLASH_AREA_IMAGE_SECTOR_SIZE    (0x2000)     /* 8 KB */
113 #define FLASH_AREA_WRP_GROUP_SIZE       (0x8000)     /* 32 KB */
114 #define FLASH_B_SIZE                    (0x100000)   /* 1 MBytes*/
115 #define FLASH_TOTAL_SIZE                (FLASH_B_SIZE+FLASH_B_SIZE) /* 2 MBytes */
116 #define FLASH_BASE_ADDRESS              (0x0c000000) /* same as FLASH0_BASE_S */
117 
118 /* Flash area IDs */
119 #define FLASH_AREA_0_ID                 (1)
120 #if (MCUBOOT_APP_IMAGE_NUMBER == 2)
121 #define FLASH_AREA_1_ID                 (2)
122 #endif /* MCUBOOT_APP_IMAGE_NUMBER == 2 */
123 #if !defined(MCUBOOT_PRIMARY_ONLY)
124 #define FLASH_AREA_2_ID                 (3)
125 #if (MCUBOOT_APP_IMAGE_NUMBER == 2)
126 #define FLASH_AREA_3_ID                 (4)
127 #endif /* MCUBOOT_APP_IMAGE_NUMBER == 2 */
128 #endif /* MCUBOOT_PRIMARY_ONLY */
129 #if (MCUBOOT_S_DATA_IMAGE_NUMBER == 1)
130 #define FLASH_AREA_4_ID                 (5)
131 #endif /* MCUBOOT_S_DATA_IMAGE_NUMBER == 1 */
132 #if (MCUBOOT_NS_DATA_IMAGE_NUMBER == 1)
133 #define FLASH_AREA_5_ID                 (6)
134 #endif /* MCUBOOT_NS_DATA_IMAGE_NUMBER == 1 */
135 #if !defined(MCUBOOT_PRIMARY_ONLY)
136 #if (MCUBOOT_S_DATA_IMAGE_NUMBER == 1)
137 #define FLASH_AREA_6_ID                 (7)
138 #endif /* MCUBOOT_S_DATA_IMAGE_NUMBER == 1 */
139 #if (MCUBOOT_NS_DATA_IMAGE_NUMBER == 1)
140 #define FLASH_AREA_7_ID                 (8)
141 #endif /* MCUBOOT_NS_DATA_IMAGE_NUMBER == 1 */
142 #define FLASH_AREA_SCRATCH_ID           (9)
143 #endif /* MCUBOOT_PRIMARY_ONLY */
144 
145 /* Offset and size definitions of the flash partitions that are handled by the
146  * bootloader. The image swapping is done between IMAGE_0 and IMAGE_1, SCRATCH
147  * is used as a temporary storage during image swapping.
148  */
149 
150 /* Area for downloading bl2 image */
151 #define FLASH_AREA_BL2_BIN_OFFSET       (0x0)
152 /* area for BL2 code protected by hdp */
153 #define FLASH_AREA_BL2_OFFSET           (0x0)
154 #if defined(EXTERNAL_FLASH)
155 #define FLASH_AREA_BL2_SIZE             (0xF800)
156 #else
157 #define FLASH_AREA_BL2_SIZE             (0x20000)
158 #endif /* EXTERNAL_FLASH */
159 /* HDP area end at this address */
160 #define FLASH_BL2_HDP_END               (FLASH_AREA_BL2_OFFSET+FLASH_AREA_BL2_SIZE-1)
161 
162 /* area for BL2 code not protected by hdp */
163 #define FLASH_AREA_BL2_NOHDP_OFFSET     (FLASH_AREA_BL2_OFFSET+FLASH_AREA_BL2_SIZE)
164 #if defined(EXTERNAL_FLASH)
165 #define FLASH_AREA_BL2_NOHDP_SIZE       (0x1800)
166 #else
167 #define FLASH_AREA_BL2_NOHDP_SIZE       (FLASH_AREA_IMAGE_SECTOR_SIZE)
168 #endif /* EXTERNAL_FLASH */
169 
170 
171 /* scratch area */
172 #if defined(FLASH_AREA_SCRATCH_ID)
173 #define FLASH_AREA_SCRATCH_DEVICE_ID    (FLASH_DEVICE_ID - FLASH_DEVICE_ID)
174 #define FLASH_AREA_SCRATCH_OFFSET       (FLASH_AREA_BL2_NOHDP_OFFSET + FLASH_AREA_BL2_NOHDP_SIZE)
175 #if defined(MCUBOOT_OVERWRITE_ONLY)
176 #define FLASH_AREA_SCRATCH_SIZE         (0x0000) /* Not used in MCUBOOT_OVERWRITE_ONLY mode */
177 #else
178 #define FLASH_AREA_SCRATCH_SIZE         (0x8000) /* 32 KB */
179 #endif
180 #endif
181 
182 /* area for bl2 anti roll back counter */
183 #define FLASH_BL2_NVCNT_AREA_OFFSET     (FLASH_AREA_SCRATCH_OFFSET + FLASH_AREA_SCRATCH_SIZE)
184 #define FLASH_BL2_NVCNT_AREA_SIZE       (FLASH_AREA_IMAGE_SECTOR_SIZE+FLASH_AREA_IMAGE_SECTOR_SIZE)
185 
186 /* Non Volatile Counters definitions */
187 #define FLASH_NV_COUNTERS_AREA_OFFSET   (FLASH_BL2_NVCNT_AREA_OFFSET+FLASH_BL2_NVCNT_AREA_SIZE)
188 #define FLASH_NV_COUNTERS_AREA_SIZE      (FLASH_AREA_IMAGE_SECTOR_SIZE+FLASH_AREA_IMAGE_SECTOR_SIZE)
189 
190 /* OTP / Non Volatile Counters definitions */
191 #define FLASH_OTP_NV_COUNTERS_SECTOR_SIZE   (FLASH_AREA_IMAGE_SECTOR_SIZE)
192 #if defined(EXTERNAL_FLASH)
193 #define FLASH_OTP_NV_COUNTERS_AREA_OFFSET   (FLASH_NV_COUNTERS_AREA_OFFSET + \
194                                              FLASH_NV_COUNTERS_AREA_SIZE)
195 #else
196 /* fix me with overwrite scratch is not required */
197 #define FLASH_OTP_NV_COUNTERS_AREA_OFFSET   (FLASH_NV_COUNTERS_AREA_OFFSET + \
198                                              FLASH_NV_COUNTERS_AREA_SIZE)
199 #endif /* defined(EXTERNAL_FLASH) */
200 
201 #define FLASH_OTP_NV_COUNTERS_AREA_SIZE   (FLASH_OTP_NV_COUNTERS_SECTOR_SIZE + \
202                                            FLASH_OTP_NV_COUNTERS_SECTOR_SIZE)
203 /* Secure Storage (PS) Service definitions */
204 #define FLASH_PS_AREA_SIZE             (FLASH_AREA_IMAGE_SECTOR_SIZE+FLASH_AREA_IMAGE_SECTOR_SIZE)
205 #define FLASH_PS_AREA_OFFSET           (FLASH_OTP_NV_COUNTERS_AREA_OFFSET + \
206                                         FLASH_OTP_NV_COUNTERS_AREA_SIZE)
207 
208 /* Internal Trusted Storage (ITS) Service definitions */
209 #define FLASH_ITS_AREA_OFFSET           (FLASH_PS_AREA_OFFSET+FLASH_PS_AREA_SIZE)
210 #define FLASH_ITS_AREA_SIZE             (FLASH_AREA_IMAGE_SECTOR_SIZE+FLASH_AREA_IMAGE_SECTOR_SIZE+FLASH_AREA_IMAGE_SECTOR_SIZE+FLASH_AREA_IMAGE_SECTOR_SIZE)   /* 8 KB */
211 
212 #define FLASH_S_PARTITION_SIZE          (0x40000) /* 256 KB for S partition */
213 #if !defined(MCUBOOT_PRIMARY_ONLY)
214 #define FLASH_NS_PARTITION_SIZE         (0xA0000) /* 640 KB for NS partition */
215 #else
216 #define FLASH_NS_PARTITION_SIZE         (0x28000) /* 160 MB for NS partition */
217 
218 #endif /* MCUBOOT_PRIMARY_ONLY */
219 #define FLASH_PARTITION_SIZE            (FLASH_S_PARTITION_SIZE+FLASH_NS_PARTITION_SIZE)
220 
221 #if (MCUBOOT_APP_IMAGE_NUMBER == 2)
222 #define FLASH_MAX_APP_PARTITION_SIZE    ((FLASH_S_PARTITION_SIZE >   \
223                                          FLASH_NS_PARTITION_SIZE) ? \
224                                          FLASH_S_PARTITION_SIZE : \
225                                          FLASH_NS_PARTITION_SIZE)
226 #else
227 #define FLASH_MAX_APP_PARTITION_SIZE    FLASH_PARTITION_SIZE
228 #endif /* (MCUBOOT_APP_IMAGE_NUMBER == 2) */
229 #if (MCUBOOT_S_DATA_IMAGE_NUMBER == 1)
230 #define FLASH_S_DATA_PARTITION_SIZE     (FLASH_AREA_IMAGE_SECTOR_SIZE)
231 #else
232 #define FLASH_S_DATA_PARTITION_SIZE     (0x0)
233 #endif /* (MCUBOOT_S_DATA_IMAGE_NUMBER == 1) */
234 #if (MCUBOOT_NS_DATA_IMAGE_NUMBER == 1)
235 #define FLASH_NS_DATA_PARTITION_SIZE    (FLASH_AREA_IMAGE_SECTOR_SIZE+FLASH_AREA_IMAGE_SECTOR_SIZE+FLASH_AREA_IMAGE_SECTOR_SIZE+FLASH_AREA_IMAGE_SECTOR_SIZE)
236 #else
237 #define FLASH_NS_DATA_PARTITION_SIZE    (0x0)
238 #endif /* (MCUBOOT_NS_DATA_IMAGE_NUMBER == 1) */
239 
240 #define FLASH_MAX_DATA_PARTITION_SIZE   ((FLASH_S_DATA_PARTITION_SIZE >   \
241                                          FLASH_NS_DATA_PARTITION_SIZE) ? \
242                                          FLASH_S_DATA_PARTITION_SIZE : \
243                                          FLASH_NS_DATA_PARTITION_SIZE)
244 #define FLASH_MAX_PARTITION_SIZE        ((FLASH_MAX_APP_PARTITION_SIZE >   \
245                                          FLASH_MAX_DATA_PARTITION_SIZE) ? \
246                                          FLASH_MAX_APP_PARTITION_SIZE : \
247                                          FLASH_MAX_DATA_PARTITION_SIZE)
248 
249 /* BL2 flash areas */
250 #define FLASH_AREA_BEGIN_OFFSET         (FLASH_ITS_AREA_OFFSET + FLASH_ITS_AREA_SIZE)
251 
252 #define FLASH_AREAS_DEVICE_ID           (FLASH_DEVICE_ID - FLASH_DEVICE_ID)
253 
254 /* Secure data image primary slot */
255 #if defined (FLASH_AREA_4_ID)
256 #define FLASH_AREA_4_DEVICE_ID          (FLASH_AREAS_DEVICE_ID)
257 #define FLASH_AREA_4_OFFSET             (FLASH_AREA_BEGIN_OFFSET)
258 #define FLASH_AREA_4_SIZE               (FLASH_S_DATA_PARTITION_SIZE)
259 /* Control Secure data image primary slot */
260 #if (FLASH_AREA_4_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0
261 #error "FLASH_AREA_4_OFFSET  not aligned on FLASH_AREA_IMAGE_SECTOR_SIZE"
262 #endif /* (FLASH_AREA_4_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0 */
263 #else /* FLASH_AREA_4_ID */
264 #define FLASH_AREA_4_OFFSET             (0x0)
265 #define FLASH_AREA_4_SIZE               (0x0)
266 #endif /* FLASH_AREA_4_ID */
267 
268 /* Secure app image primary slot */
269 #if defined(FLASH_AREA_0_ID)
270 #define FLASH_AREA_0_DEVICE_ID          (FLASH_AREAS_DEVICE_ID)
271 #define FLASH_AREA_0_OFFSET             (FLASH_AREA_BEGIN_OFFSET + FLASH_AREA_4_SIZE)
272 #if (MCUBOOT_APP_IMAGE_NUMBER == 2)
273 #define FLASH_AREA_0_SIZE               (FLASH_S_PARTITION_SIZE)
274 #else
275 #define FLASH_AREA_0_SIZE               (FLASH_PARTITION_SIZE)
276 #endif /* (MCUBOOT_APP_IMAGE_NUMBER == 2) */
277 /* Control Secure app image primary slot */
278 #if (FLASH_AREA_0_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0
279 #error "FLASH_AREA_0_OFFSET  not aligned on FLASH_AREA_IMAGE_SECTOR_SIZE"
280 #endif /*  (FLASH_AREA_0_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0 */
281 #else /* FLASH_AREA_0_ID */
282 #define FLASH_AREA_0_OFFSET             (0x0)
283 #define FLASH_AREA_0_SIZE               (0x0)
284 #endif /* FLASH_AREA_0_ID */
285 
286 /* Non-secure app image primary slot */
287 #if defined(FLASH_AREA_1_ID)
288 #define FLASH_AREA_1_DEVICE_ID          (FLASH_AREAS_DEVICE_ID)
289 #define FLASH_AREA_1_OFFSET             (FLASH_AREA_BEGIN_OFFSET + FLASH_AREA_4_SIZE + \
290                                          FLASH_AREA_0_SIZE)
291 #define FLASH_AREA_1_SIZE               (FLASH_NS_PARTITION_SIZE)
292 /* Control Non-secure app image primary slot */
293 #if (FLASH_AREA_1_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0
294 #error "FLASH_AREA_1_OFFSET  not aligned on FLASH_AREA_IMAGE_SECTOR_SIZE"
295 #endif /* (FLASH_AREA_1_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0  */
296 #else /* FLASH_AREA_1_ID */
297 #define FLASH_AREA_1_OFFSET             (0x0)
298 #define FLASH_AREA_1_SIZE               (0x0)
299 #endif /* FLASH_AREA_1_ID */
300 
301 /* Non-secure data image primary slot */
302 #if defined(FLASH_AREA_5_ID)
303 #define FLASH_AREA_5_DEVICE_ID          (FLASH_AREAS_DEVICE_ID)
304 #define FLASH_AREA_5_OFFSET             (FLASH_AREA_BEGIN_OFFSET + FLASH_AREA_4_SIZE + \
305                                          FLASH_AREA_0_SIZE + FLASH_AREA_1_SIZE)
306 #define FLASH_AREA_5_SIZE               (FLASH_NS_DATA_PARTITION_SIZE)
307 /* Control Non-secure data image primary slot */
308 #if (FLASH_AREA_5_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0
309 #error "FLASH_AREA_5_OFFSET  not aligned on FLASH_AREA_IMAGE_SECTOR_SIZE"
310 #endif /* (FLASH_AREA_5_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0  */
311 #else /* FLASH_AREA_5_ID */
312 #define FLASH_AREA_5_OFFSET             (0x0)
313 #define FLASH_AREA_5_SIZE               (0x0)
314 #endif /* FLASH_AREA_5_ID */
315 
316 
317 
318 /* Secure app image secondary slot */
319 #if defined(FLASH_AREA_2_ID)
320 #define FLASH_AREA_2_DEVICE_ID          (FLASH_AREAS_DEVICE_ID)
321 #define FLASH_AREA_2_OFFSET             (FLASH_AREA_BEGIN_OFFSET + FLASH_AREA_4_SIZE + \
322                                          FLASH_AREA_0_SIZE + FLASH_AREA_1_SIZE + \
323                                          FLASH_AREA_5_SIZE)
324 #if (MCUBOOT_APP_IMAGE_NUMBER == 2)
325 #define FLASH_AREA_2_SIZE               (FLASH_S_PARTITION_SIZE)
326 #else
327 #define FLASH_AREA_2_SIZE               (FLASH_PARTITION_SIZE)
328 #endif /* (MCUBOOT_APP_IMAGE_NUMBER == 2) */
329 /* Control Secure app image secondary slot */
330 #if (FLASH_AREA_2_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0
331 #error "FLASH_AREA_2_OFFSET  not aligned on FLASH_AREA_IMAGE_SECTOR_SIZE"
332 #endif /*   (FLASH_AREA_2_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0 */
333 #else /* FLASH_AREA_2_ID */
334 #define FLASH_AREA_2_OFFSET             (0x0)
335 #define FLASH_AREA_2_SIZE               (0x0)
336 #endif /* FLASH_AREA_2_ID */
337 
338 /* Non-secure app image secondary slot */
339 #if defined(FLASH_AREA_3_ID)
340 #define FLASH_AREA_3_DEVICE_ID          (FLASH_AREAS_DEVICE_ID)
341 #define FLASH_AREA_3_OFFSET             (FLASH_AREA_BEGIN_OFFSET + FLASH_AREA_4_SIZE + \
342                                          FLASH_AREA_0_SIZE + FLASH_AREA_1_SIZE + \
343                                          FLASH_AREA_5_SIZE + FLASH_AREA_2_SIZE)
344 #define FLASH_AREA_3_SIZE               (FLASH_NS_PARTITION_SIZE)
345 /* Control Non-Secure app image secondary slot */
346 #if (FLASH_AREA_3_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0
347 #error "FLASH_AREA_3_OFFSET  not aligned on FLASH_AREA_IMAGE_SECTOR_SIZE"
348 #endif /*  (FLASH_AREA_3_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0 */
349 #else /* FLASH_AREA_3_ID */
350 #define FLASH_AREA_3_OFFSET             (0x0)
351 #define FLASH_AREA_3_SIZE               (0x0)
352 #endif /* FLASH_AREA_3_ID */
353 
354 
355 /* Secure data image secondary slot */
356 #if defined(FLASH_AREA_6_ID)
357 #define FLASH_AREA_6_DEVICE_ID          (FLASH_AREAS_DEVICE_ID)
358 #define FLASH_AREA_6_OFFSET             (FLASH_AREA_BEGIN_OFFSET + FLASH_AREA_4_SIZE + \
359                                          FLASH_AREA_0_SIZE + FLASH_AREA_1_SIZE + \
360                                          FLASH_AREA_5_SIZE + FLASH_AREA_2_SIZE + \
361                                          FLASH_AREA_3_SIZE)
362 #define FLASH_AREA_6_SIZE               (FLASH_S_DATA_PARTITION_SIZE)
363 /* Control Secure data image secondary slot */
364 #if (FLASH_AREA_6_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0
365 #error "FLASH_AREA_6_OFFSET  not aligned on FLASH_AREA_IMAGE_SECTOR_SIZE"
366 #endif /*  (FLASH_AREA_6_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0 */
367 #else /* FLASH_AREA_6_ID */
368 #define FLASH_AREA_6_OFFSET             (0x0)
369 #define FLASH_AREA_6_SIZE               (0x0)
370 #endif /* FLASH_AREA_6_ID */
371 
372 /* Non-Secure data image secondary slot */
373 #if defined(FLASH_AREA_7_ID)
374 #define FLASH_AREA_7_DEVICE_ID          (FLASH_AREAS_DEVICE_ID)
375 #define FLASH_AREA_7_OFFSET             (FLASH_AREA_BEGIN_OFFSET + FLASH_AREA_4_SIZE + \
376                                          FLASH_AREA_0_SIZE + FLASH_AREA_1_SIZE + \
377                                          FLASH_AREA_5_SIZE + FLASH_AREA_2_SIZE + \
378                                          FLASH_AREA_3_SIZE + FLASH_AREA_6_SIZE)
379 #define FLASH_AREA_7_SIZE               (FLASH_NS_DATA_PARTITION_SIZE)
380 /* Control Non-Secure data image secondary slot */
381 #if (FLASH_AREA_7_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0
382 #error "FLASH_AREA_7_OFFSET  not aligned on FLASH_AREA_IMAGE_SECTOR_SIZE"
383 #endif /*  (FLASH_AREA_7_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0 */
384 #else /* FLASH_AREA_7_ID */
385 #define FLASH_AREA_7_OFFSET             (0x0)
386 #define FLASH_AREA_7_SIZE               (0x0)
387 #endif /* FLASH_AREA_7_ID */
388 
389 /* flash areas end offset */
390 /*#define FLASH_AREA_END_OFFSET           (FLASH_AREA_BEGIN_OFFSET + FLASH_AREA_4_SIZE + \
391                                          FLASH_AREA_0_SIZE + FLASH_AREA_1_SIZE + \
392                                          FLASH_AREA_5_SIZE + FLASH_AREA_2_SIZE + \
393                                          FLASH_AREA_3_SIZE + FLASH_AREA_6_SIZE + \
394                                          FLASH_AREA_7_SIZE)*/
395 /* Make all flash executable for user app following loader2 */
396 #define FLASH_AREA_END_OFFSET 0x00200000
397 
398 /* Control flash area end */
399 #if (FLASH_AREA_END_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0
400 #error "FLASH_AREA_END_OFFSET  not aligned on FLASH_AREA_IMAGE_SECTOR_SIZE"
401 #endif /*  (FLASH_AREA_END_OFFSET  % FLASH_AREA_IMAGE_SECTOR_SIZE) != 0 */
402 
403 /*
404  * The maximum number of status entries supported by the bootloader.
405  */
406 #define MCUBOOT_STATUS_MAX_ENTRIES         ((FLASH_MAX_PARTITION_SIZE) / \
407                                             FLASH_AREA_SCRATCH_SIZE)
408 /* Maximum number of image sectors supported by the bootloader. */
409 #define MCUBOOT_MAX_IMG_SECTORS           ((FLASH_MAX_PARTITION_SIZE) / \
410                                            FLASH_AREA_IMAGE_SECTOR_SIZE)
411 #define SECURE_IMAGE_OFFSET             (0x0)
412 #define SECURE_IMAGE_MAX_SIZE           FLASH_S_PARTITION_SIZE
413 
414 #define NON_SECURE_IMAGE_OFFSET         (SECURE_IMAGE_OFFSET + SECURE_IMAGE_MAX_SIZE)
415 #define NON_SECURE_IMAGE_MAX_SIZE       FLASH_NS_PARTITION_SIZE
416 
417 
418 /* Flash device name used by BL2 and NV Counter
419  * Name is defined in flash driver file: low_level_flash.c
420  */
421 #if !defined(MCUBOOT_OVERWRITE_ONLY) && (MCUBOOT_APP_IMAGE_NUMBER == 2)
422 /* Flash Driver Used to Confirm Secure App Image */
423 #define  FLASH_PRIMARY_SECURE_DEV_NAME             TFM_Driver_FLASH0
424 #endif /* !defined(MCUBOOT_OVERWRITE_ONLY) && (MCUBOOT_APP_IMAGE_NUMBER == 2) */
425 /* Flash Driver Used to Confirm NonSecure App Image or MCUBOOT_APP_IMAGE_NUMBER = 1 */
426 #define  FLASH_PRIMARY_NONSECURE_DEV_NAME          TFM_Driver_FLASH0
427 #if !defined(MCUBOOT_OVERWRITE_ONLY) && (MCUBOOT_S_DATA_IMAGE_NUMBER == 1)
428 /* Flash Driver Used to Confirm Secure Data Image */
429 #define  FLASH_PRIMARY_DATA_SECURE_DEV_NAME        TFM_Driver_FLASH0
430 #endif /* !defined(MCUBOOT_OVERWRITE_ONLY) && (MCUBOOT_S_DATA_IMAGE_NUMBER == 1) */
431 #if !defined(MCUBOOT_OVERWRITE_ONLY) && (MCUBOOT_NS_DATA_IMAGE_NUMBER == 1)
432 /* Flash Driver Used to Confirm NonSecure Data Image */
433 #define  FLASH_PRIMARY_DATA_NONSECURE_DEV_NAME     TFM_Driver_FLASH0
434 #endif /* !defined(MCUBOOT_OVERWRITE_ONLY) && (MCUBOOT_S_DATA_IMAGE_NUMBER == 1) */
435 
436 #define TFM_NV_COUNTERS_FLASH_DEV       TFM_Driver_FLASH0
437 #define FLASH_DEV_NAME                  TFM_Driver_FLASH0
438 #define TFM_HAL_FLASH_PROGRAM_UNIT       (0x10)
439 /* Protected Storage (PS) Service definitions
440  * Note: Further documentation of these definitions can be found in the
441  * TF-M PS Integration Guide.
442  */
443 #define TFM_HAL_PS_FLASH_DRIVER TFM_Driver_FLASH0
444 
445 /* In this target the CMSIS driver requires only the offset from the base
446  * address instead of the full memory address.
447  */
448 #define PS_SECTOR_SIZE                 FLASH_AREA_IMAGE_SECTOR_SIZE
449 /* The sectors must be in consecutive memory location */
450 #define PS_NBR_OF_SECTORS              (FLASH_PS_AREA_SIZE / PS_SECTOR_SIZE)
451 /* The maximum asset size to be stored in the ITS area */
452 #define ITS_SECTOR_SIZE                 FLASH_AREA_IMAGE_SECTOR_SIZE
453 /* The sectors must be in consecutive memory location */
454 #define ITS_NBR_OF_SECTORS              (FLASH_ITS_AREA_SIZE / ITS_SECTOR_SIZE)
455 
456 /* Base address of dedicated flash area for PS */
457 #define TFM_HAL_PS_FLASH_AREA_ADDR    FLASH_PS_AREA_OFFSET
458 /* Size of dedicated flash area for PS */
459 #define TFM_HAL_PS_FLASH_AREA_SIZE    FLASH_PS_AREA_SIZE
460 #define PS_RAM_FS_SIZE                TFM_HAL_PS_FLASH_AREA_SIZE
461 /* Number of physical erase sectors per logical FS block */
462 #define TFM_HAL_PS_SECTORS_PER_BLOCK  (1)
463 /* Smallest flash programmable unit in bytes */
464 #define TFM_HAL_PS_PROGRAM_UNIT       (0x10)
465 
466 /* Internal Trusted Storage (ITS) Service definitions
467  * Note: Further documentation of these definitions can be found in the
468  * TF-M ITS Integration Guide.
469  */
470 #define TFM_HAL_ITS_FLASH_DRIVER TFM_Driver_FLASH0
471 
472 /* In this target the CMSIS driver requires only the offset from the base
473  * address instead of the full memory address.
474  */
475 /* Base address of dedicated flash area for ITS */
476 #define TFM_HAL_ITS_FLASH_AREA_ADDR    FLASH_ITS_AREA_OFFSET
477 /* Size of dedicated flash area for ITS */
478 #define TFM_HAL_ITS_FLASH_AREA_SIZE    FLASH_ITS_AREA_SIZE
479 #define ITS_RAM_FS_SIZE                TFM_HAL_ITS_FLASH_AREA_SIZE
480 /* Number of physical erase sectors per logical FS block */
481 #define TFM_HAL_ITS_SECTORS_PER_BLOCK  (1)
482 /* Smallest flash programmable unit in bytes */
483 #define TFM_HAL_ITS_PROGRAM_UNIT       (0x10)
484 
485 
486 /* NV Counters definitions */
487 #define TFM_NV_COUNTERS_AREA_ADDR        FLASH_NV_COUNTERS_AREA_OFFSET
488 #define TFM_NV_COUNTERS_AREA_SIZE        (0x20)/* 32 Bytes */
489 #define TFM_NV_COUNTERS_SECTOR_ADDR      FLASH_NV_COUNTERS_AREA_OFFSET
490 #define TFM_NV_COUNTERS_SECTOR_SIZE      FLASH_AREA_IMAGE_SECTOR_SIZE
491 
492 /* OTP / NV counter definitions */
493 #define TFM_OTP_NV_COUNTERS_AREA_SIZE   (FLASH_OTP_NV_COUNTERS_AREA_SIZE / 2)
494 #define TFM_OTP_NV_COUNTERS_AREA_ADDR   FLASH_OTP_NV_COUNTERS_AREA_OFFSET
495 #define TFM_OTP_NV_COUNTERS_SECTOR_SIZE FLASH_OTP_NV_COUNTERS_SECTOR_SIZE
496 #define TFM_OTP_NV_COUNTERS_BACKUP_AREA_ADDR (TFM_OTP_NV_COUNTERS_AREA_ADDR + \
497                                               TFM_OTP_NV_COUNTERS_AREA_SIZE)
498 
499 /* BL2 NV Counters definitions  */
500 #define BL2_NV_COUNTERS_AREA_ADDR        FLASH_BL2_NVCNT_AREA_OFFSET
501 #define BL2_NV_COUNTERS_AREA_SIZE        FLASH_BL2_NVCNT_AREA_SIZE
502 
503 /* FIXME: not valid today */
504 #define BL2_S_RAM_ALIAS_BASE             (0x30000000)
505 #define BL2_NS_RAM_ALIAS_BASE            (0x20000000)
506 
507 /*  This area in SRAM 2 is updated BL2 and can be lock to avoid any changes */
508 #define BOOT_TFM_SHARED_DATA_SIZE        (0x400)
509 #define BOOT_TFM_SHARED_DATA_BASE        (0x3004fc00)
510 
511 /* OBK */
512 #define OBK_HDPL0_OFFSET        (0x00U)         /* First OBkey Hdpl 0 */
513 #define OBK_HDPL0_END           (0xFFU)         /* Last OBKey Hdpl 0 */
514 #define OBK_HDPL1_OFFSET        (0x100U)        /* First OBkey Hdpl 1 */
515 #define OBK_HDPL1_END           (0x8FFU)        /* Last OBKey Hdpl 1 */
516 #define OBK_HDPL2_OFFSET        (0x900U)        /* First OBkey Hdpl 2 */
517 #define OBK_HDPL2_END           (0xBFFU)        /* Last OBKey Hdpl 2 */
518 #define OBK_HDPL3_OFFSET        (0xC00U)        /* First OBkey Hdpl 3 */
519 #define OBK_HDPL3_END           (0x1FFFU)       /* Last OBKey Hdpl 3 */
520 
521 /* Engi bits */
522 #define ENGI_BASE_NS                        (0x08FFF800U)
523 #define ENGI_SIZE                           (0x40U)
524 
525 /* Systeme Flash description */
526 #define RSS_LIB_BASE                        (0x0FF94000U)
527 #define RSS_LIB_SIZE                        (0x2000U)
528 #define BOOTLOADER_BASE_NS                  (0x0BF97000U)
529 #define BOOTLOADER_SIZE                     (0x9400U)
530 #define STM32_DESCRIPTOR_BASE_NS_3          (0x0BF9FB00U)
531 #define STM32_DESCRIPTOR_BASE_NS_2          (0x0BF9FD00U)
532 #define STM32_DESCRIPTOR_BASE_NS_1          (0x0BF9FE00U)
533 #define RSSLIB_PFUNC_3                      (0x0BF9FB68UL)
534 #define RSSLIB_PFUNC_2                      (0x0BF9FD68UL)
535 #define RSSLIB_PFUNC_1                      (0x0BF9FE68UL)
536 #define STM32_DESCRIPTOR_SIZE               (0x100U)
537 #define STM32_DESCRIPTOR_BASE_NS            (STM32_DESCRIPTOR_BASE_NS_3) /* use for mpu region the lowest address*/
538 #define STM32_DESCRIPTOR_END_NS             (STM32_DESCRIPTOR_BASE_NS_1 + STM32_DESCRIPTOR_SIZE -1) /* to cover all descriptors */
539 
540 #endif /* __FLASH_LAYOUT_H__ */
541