blob: 2070ceacf7802a73c2019d880303dffb49dafa63 [file] [log] [blame]
Yann Gautierdb77f8b2024-05-21 11:46:59 +02001/*
Nicolas Le Bayon399cfdd2021-01-20 11:41:47 +01002 * Copyright (c) 2023-2025, STMicroelectronics - All Rights Reserved
Yann Gautierdb77f8b2024-05-21 11:46:59 +02003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <assert.h>
Nicolas Le Bayon399cfdd2021-01-20 11:41:47 +01008#include <errno.h>
Yann Gautierdb77f8b2024-05-21 11:46:59 +02009
10#include <lib/xlat_tables/xlat_tables_v2.h>
11
12#include <platform_def.h>
13
Yann Gautierc28c0ca2023-01-05 14:46:23 +010014#define BKPR_FWU_INFO 48U
Yann Gautierdb77f8b2024-05-21 11:46:59 +020015#define BKPR_BOOT_MODE 96U
16
Yann Gautier03020b62023-06-13 18:45:03 +020017#if defined(IMAGE_BL31)
18/* BL31 only uses the first half of the SYSRAM */
19#define MAP_SYSRAM MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \
20 STM32MP_SYSRAM_SIZE / 2U, \
21 MT_MEMORY | \
22 MT_RW | \
23 MT_SECURE | \
24 MT_EXECUTE_NEVER)
25#else
Yann Gautierdb77f8b2024-05-21 11:46:59 +020026#define MAP_SYSRAM MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \
27 STM32MP_SYSRAM_SIZE, \
28 MT_MEMORY | \
29 MT_RW | \
30 MT_SECURE | \
31 MT_EXECUTE_NEVER)
Yann Gautier03020b62023-06-13 18:45:03 +020032#endif
Yann Gautierdb77f8b2024-05-21 11:46:59 +020033
Maxime Méréae845252024-09-13 17:57:58 +020034#if STM32MP_DDR_FIP_IO_STORAGE
35#define MAP_SRAM1 MAP_REGION_FLAT(SRAM1_BASE, \
36 SRAM1_SIZE_FOR_TFA, \
37 MT_MEMORY | \
38 MT_RW | \
39 MT_SECURE | \
40 MT_EXECUTE_NEVER)
41#endif
42
Yann Gautierdb77f8b2024-05-21 11:46:59 +020043#define MAP_DEVICE MAP_REGION_FLAT(STM32MP_DEVICE_BASE, \
44 STM32MP_DEVICE_SIZE, \
45 MT_DEVICE | \
46 MT_RW | \
47 MT_SECURE | \
48 MT_EXECUTE_NEVER)
49
50#if defined(IMAGE_BL2)
51static const mmap_region_t stm32mp2_mmap[] = {
52 MAP_SYSRAM,
Maxime Méréae845252024-09-13 17:57:58 +020053#if STM32MP_DDR_FIP_IO_STORAGE
54 MAP_SRAM1,
55#endif
Yann Gautierdb77f8b2024-05-21 11:46:59 +020056 MAP_DEVICE,
57 {0}
58};
59#endif
Yann Gautier03020b62023-06-13 18:45:03 +020060#if defined(IMAGE_BL31)
61static const mmap_region_t stm32mp2_mmap[] = {
62 MAP_SYSRAM,
63 MAP_DEVICE,
64 {0}
65};
66#endif
Yann Gautierdb77f8b2024-05-21 11:46:59 +020067
68void configure_mmu(void)
69{
70 mmap_add(stm32mp2_mmap);
71 init_xlat_tables();
72
73 enable_mmu_el3(0);
74}
75
Maxime Méré52f530d2024-09-19 09:54:28 +020076int stm32mp_map_retram(void)
77{
78 return mmap_add_dynamic_region(RETRAM_BASE, RETRAM_BASE,
79 RETRAM_SIZE,
80 MT_RW | MT_SECURE);
81}
82
83int stm32mp_unmap_retram(void)
84{
85 return mmap_remove_dynamic_region(RETRAM_BASE,
86 RETRAM_SIZE);
87}
88
Yann Gautierdb77f8b2024-05-21 11:46:59 +020089uintptr_t stm32_get_gpio_bank_base(unsigned int bank)
90{
91 if (bank == GPIO_BANK_Z) {
92 return GPIOZ_BASE;
93 }
94
95 assert(bank <= GPIO_BANK_K);
96
97 return GPIOA_BASE + (bank * GPIO_BANK_OFFSET);
98}
99
100uint32_t stm32_get_gpio_bank_offset(unsigned int bank)
101{
102 if (bank == GPIO_BANK_Z) {
103 return 0;
104 }
105
106 assert(bank <= GPIO_BANK_K);
107
108 return bank * GPIO_BANK_OFFSET;
109}
110
111unsigned long stm32_get_gpio_bank_clock(unsigned int bank)
112{
113 if (bank == GPIO_BANK_Z) {
114 return CK_BUS_GPIOZ;
115 }
116
117 assert(bank <= GPIO_BANK_K);
118
119 return CK_BUS_GPIOA + (bank - GPIO_BANK_A);
120}
121
Maxime Méré27dd11d2024-10-02 18:24:40 +0200122#if STM32MP_UART_PROGRAMMER || !defined(IMAGE_BL2)
123/*
124 * UART Management
125 */
126static const uintptr_t stm32mp2_uart_addresses[STM32MP_NB_OF_UART] = {
127 USART1_BASE,
128 USART2_BASE,
129 USART3_BASE,
130 UART4_BASE,
131 UART5_BASE,
132 USART6_BASE,
133 UART7_BASE,
134 UART8_BASE,
135 UART9_BASE,
136};
137
138uintptr_t get_uart_address(uint32_t instance_nb)
139{
140 if ((instance_nb == 0U) ||
141 (instance_nb > STM32MP_NB_OF_UART)) {
142 return 0U;
143 }
144
145 return stm32mp2_uart_addresses[instance_nb - 1U];
146}
147#endif
148
Yann Gautier381b2a62024-06-21 14:49:47 +0200149uint32_t stm32mp_get_chip_version(void)
150{
151 static uint32_t rev;
152
153 if (rev != 0U) {
154 return rev;
155 }
156
157 if (stm32_get_otp_value(REVISION_OTP, &rev) != 0) {
158 panic();
159 }
160
161 return rev;
162}
163
164uint32_t stm32mp_get_chip_dev_id(void)
165{
166 return stm32mp_syscfg_get_chip_dev_id();
167}
168
169static uint32_t get_part_number(void)
170{
171 static uint32_t part_number;
172
173 if (part_number != 0U) {
174 return part_number;
175 }
176
177 if (stm32_get_otp_value(PART_NUMBER_OTP, &part_number) != 0) {
178 panic();
179 }
180
181 return part_number;
182}
183
184static uint32_t get_cpu_package(void)
185{
186 static uint32_t package = UINT32_MAX;
187
188 if (package == UINT32_MAX) {
189 if (stm32_get_otp_value(PACKAGE_OTP, &package) != 0) {
190 panic();
191 }
192 }
193
194 return (package & PACKAGE_OTP_PKG_MASK) >> PACKAGE_OTP_PKG_SHIFT;
195}
196
197void stm32mp_get_soc_name(char name[STM32_SOC_NAME_SIZE])
198{
199 char *cpu_s, *cpu_r, *pkg;
200
201 /* MPUs Part Numbers */
202 switch (get_part_number()) {
203 case STM32MP251A_PART_NB:
204 cpu_s = "251A";
205 break;
206 case STM32MP251C_PART_NB:
207 cpu_s = "251C";
208 break;
209 case STM32MP251D_PART_NB:
210 cpu_s = "251D";
211 break;
212 case STM32MP251F_PART_NB:
213 cpu_s = "251F";
214 break;
215 case STM32MP253A_PART_NB:
216 cpu_s = "253A";
217 break;
218 case STM32MP253C_PART_NB:
219 cpu_s = "253C";
220 break;
221 case STM32MP253D_PART_NB:
222 cpu_s = "253D";
223 break;
224 case STM32MP253F_PART_NB:
225 cpu_s = "253F";
226 break;
227 case STM32MP255A_PART_NB:
228 cpu_s = "255A";
229 break;
230 case STM32MP255C_PART_NB:
231 cpu_s = "255C";
232 break;
233 case STM32MP255D_PART_NB:
234 cpu_s = "255D";
235 break;
236 case STM32MP255F_PART_NB:
237 cpu_s = "255F";
238 break;
239 case STM32MP257A_PART_NB:
240 cpu_s = "257A";
241 break;
242 case STM32MP257C_PART_NB:
243 cpu_s = "257C";
244 break;
245 case STM32MP257D_PART_NB:
246 cpu_s = "257D";
247 break;
248 case STM32MP257F_PART_NB:
249 cpu_s = "257F";
250 break;
251 default:
252 cpu_s = "????";
253 break;
254 }
255
256 /* Package */
257 switch (get_cpu_package()) {
258 case STM32MP25_PKG_CUSTOM:
259 pkg = "XX";
260 break;
261 case STM32MP25_PKG_AL_VFBGA361:
262 pkg = "AL";
263 break;
264 case STM32MP25_PKG_AK_VFBGA424:
265 pkg = "AK";
266 break;
267 case STM32MP25_PKG_AI_TFBGA436:
268 pkg = "AI";
269 break;
270 default:
271 pkg = "??";
272 break;
273 }
274
275 /* REVISION */
276 switch (stm32mp_get_chip_version()) {
277 case STM32MP2_REV_A:
278 cpu_r = "A";
279 break;
280 case STM32MP2_REV_B:
281 cpu_r = "B";
282 break;
283 case STM32MP2_REV_X:
284 cpu_r = "X";
285 break;
286 case STM32MP2_REV_Y:
287 cpu_r = "Y";
288 break;
289 case STM32MP2_REV_Z:
290 cpu_r = "Z";
291 break;
292 default:
293 cpu_r = "?";
294 break;
295 }
296
297 snprintf(name, STM32_SOC_NAME_SIZE,
298 "STM32MP%s%s Rev.%s", cpu_s, pkg, cpu_r);
299}
300
301void stm32mp_print_cpuinfo(void)
302{
303 char name[STM32_SOC_NAME_SIZE];
304
305 stm32mp_get_soc_name(name);
306 NOTICE("CPU: %s\n", name);
307}
308
Yann Gautiercdaced32022-04-15 16:15:25 +0200309void stm32mp_print_boardinfo(void)
310{
311 uint32_t board_id = 0U;
312
313 if (stm32_get_otp_value(BOARD_ID_OTP, &board_id) != 0) {
314 return;
315 }
316
317 if (board_id != 0U) {
318 stm32_display_board_info(board_id);
319 }
320}
321
Yann Gautier87cd8472021-11-24 18:34:49 +0100322bool stm32mp_is_wakeup_from_standby(void)
323{
324 /* TODO add source code to determine if platform is waking up from standby mode */
325 return false;
326}
327
Nicolas Le Bayon399cfdd2021-01-20 11:41:47 +0100328int stm32_risaf_get_instance(uintptr_t base)
329{
330 switch (base) {
331 case RISAF2_BASE:
332 return (int)RISAF2_INST;
333 case RISAF4_BASE:
334 return (int)RISAF4_INST;
335 default:
336 return -ENODEV;
337 }
338}
339
340uintptr_t stm32_risaf_get_base(int instance)
341{
342 switch (instance) {
343 case RISAF2_INST:
344 return (uintptr_t)RISAF2_BASE;
345 case RISAF4_INST:
346 return (uintptr_t)RISAF4_BASE;
347 default:
348 return 0U;
349 }
350}
351
352int stm32_risaf_get_max_region(int instance)
353{
354 switch (instance) {
355 case RISAF2_INST:
356 return (int)RISAF2_MAX_REGION;
357 case RISAF4_INST:
358 return (int)RISAF4_MAX_REGION;
359 default:
360 return 0;
361 }
362}
363
364uintptr_t stm32_risaf_get_memory_base(int instance)
365{
366 switch (instance) {
367 case RISAF2_INST:
368 return (uintptr_t)STM32MP_OSPI_MM_BASE;
369 case RISAF4_INST:
370 return (uintptr_t)STM32MP_DDR_BASE;
371 default:
372 return 0U;
373 }
374}
375
376size_t stm32_risaf_get_memory_size(int instance)
377{
378 switch (instance) {
379 case RISAF2_INST:
380 return STM32MP_OSPI_MM_SIZE;
381 case RISAF4_INST:
382 return dt_get_ddr_size();
383 default:
384 return 0U;
385 }
386}
387
Yann Gautierdb77f8b2024-05-21 11:46:59 +0200388uintptr_t stm32_get_bkpr_boot_mode_addr(void)
389{
390 return tamp_bkpr(BKPR_BOOT_MODE);
391}
Nicolas Le Bayon2fd7b232021-09-21 23:18:24 +0200392
Yann Gautierc28c0ca2023-01-05 14:46:23 +0100393#if PSA_FWU_SUPPORT
394uintptr_t stm32_get_bkpr_fwu_info_addr(void)
395{
396 return tamp_bkpr(BKPR_FWU_INFO);
397}
398#endif /* PSA_FWU_SUPPORT */
399
Nicolas Le Bayon2fd7b232021-09-21 23:18:24 +0200400uintptr_t stm32_ddrdbg_get_base(void)
401{
402 return DDRDBG_BASE;
403}