1db77f8bfSYann Gautier /*
2399cfdd4SNicolas Le Bayon * Copyright (c) 2023-2025, STMicroelectronics - All Rights Reserved
3db77f8bfSYann Gautier *
4db77f8bfSYann Gautier * SPDX-License-Identifier: BSD-3-Clause
5db77f8bfSYann Gautier */
6db77f8bfSYann Gautier
7db77f8bfSYann Gautier #include <assert.h>
8399cfdd4SNicolas Le Bayon #include <errno.h>
9db77f8bfSYann Gautier
10db77f8bfSYann Gautier #include <lib/xlat_tables/xlat_tables_v2.h>
11db77f8bfSYann Gautier
12db77f8bfSYann Gautier #include <platform_def.h>
13db77f8bfSYann Gautier
14c28c0ca2SYann Gautier #define BKPR_FWU_INFO 48U
15db77f8bfSYann Gautier #define BKPR_BOOT_MODE 96U
16db77f8bfSYann Gautier
1703020b66SYann Gautier #if defined(IMAGE_BL31)
1803020b66SYann Gautier /* BL31 only uses the first half of the SYSRAM */
1903020b66SYann Gautier #define MAP_SYSRAM MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \
2003020b66SYann Gautier STM32MP_SYSRAM_SIZE / 2U, \
2103020b66SYann Gautier MT_MEMORY | \
2203020b66SYann Gautier MT_RW | \
2303020b66SYann Gautier MT_SECURE | \
2403020b66SYann Gautier MT_EXECUTE_NEVER)
2503020b66SYann Gautier #else
26db77f8bfSYann Gautier #define MAP_SYSRAM MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \
27db77f8bfSYann Gautier STM32MP_SYSRAM_SIZE, \
28db77f8bfSYann Gautier MT_MEMORY | \
29db77f8bfSYann Gautier MT_RW | \
30db77f8bfSYann Gautier MT_SECURE | \
31db77f8bfSYann Gautier MT_EXECUTE_NEVER)
3203020b66SYann Gautier #endif
33db77f8bfSYann Gautier
34*6d1366e5SPatrick Delaunay #if STM32MP_USB_PROGRAMMER
35*6d1366e5SPatrick Delaunay #define MAP_SYSRAM_MEM MAP_REGION_FLAT(STM32MP_SYSRAM_MEM_BASE, \
36*6d1366e5SPatrick Delaunay STM32MP_SYSRAM_MEM_SIZE, \
37*6d1366e5SPatrick Delaunay MT_MEMORY | \
38*6d1366e5SPatrick Delaunay MT_RW | \
39*6d1366e5SPatrick Delaunay MT_SECURE | \
40*6d1366e5SPatrick Delaunay MT_EXECUTE_NEVER)
41*6d1366e5SPatrick Delaunay
42*6d1366e5SPatrick Delaunay #define MAP_SYSRAM_DEV MAP_REGION_FLAT(STM32MP_SYSRAM_DEVICE_BASE, \
43*6d1366e5SPatrick Delaunay STM32MP_SYSRAM_DEVICE_SIZE, \
44*6d1366e5SPatrick Delaunay MT_DEVICE | \
45*6d1366e5SPatrick Delaunay MT_RW | \
46*6d1366e5SPatrick Delaunay MT_SECURE | \
47*6d1366e5SPatrick Delaunay MT_EXECUTE_NEVER)
48*6d1366e5SPatrick Delaunay #endif
49*6d1366e5SPatrick Delaunay
50ae84525fSMaxime Méré #if STM32MP_DDR_FIP_IO_STORAGE
51ae84525fSMaxime Méré #define MAP_SRAM1 MAP_REGION_FLAT(SRAM1_BASE, \
52ae84525fSMaxime Méré SRAM1_SIZE_FOR_TFA, \
53ae84525fSMaxime Méré MT_MEMORY | \
54ae84525fSMaxime Méré MT_RW | \
55ae84525fSMaxime Méré MT_SECURE | \
56ae84525fSMaxime Méré MT_EXECUTE_NEVER)
57ae84525fSMaxime Méré #endif
58ae84525fSMaxime Méré
59db77f8bfSYann Gautier #define MAP_DEVICE MAP_REGION_FLAT(STM32MP_DEVICE_BASE, \
60db77f8bfSYann Gautier STM32MP_DEVICE_SIZE, \
61db77f8bfSYann Gautier MT_DEVICE | \
62db77f8bfSYann Gautier MT_RW | \
63db77f8bfSYann Gautier MT_SECURE | \
64db77f8bfSYann Gautier MT_EXECUTE_NEVER)
65db77f8bfSYann Gautier
66db77f8bfSYann Gautier #if defined(IMAGE_BL2)
67db77f8bfSYann Gautier static const mmap_region_t stm32mp2_mmap[] = {
68*6d1366e5SPatrick Delaunay #if STM32MP_USB_PROGRAMMER
69*6d1366e5SPatrick Delaunay MAP_SYSRAM_MEM,
70*6d1366e5SPatrick Delaunay MAP_SYSRAM_DEV,
71*6d1366e5SPatrick Delaunay #else
72db77f8bfSYann Gautier MAP_SYSRAM,
73*6d1366e5SPatrick Delaunay #endif
74ae84525fSMaxime Méré #if STM32MP_DDR_FIP_IO_STORAGE
75ae84525fSMaxime Méré MAP_SRAM1,
76ae84525fSMaxime Méré #endif
77db77f8bfSYann Gautier MAP_DEVICE,
78db77f8bfSYann Gautier {0}
79db77f8bfSYann Gautier };
80db77f8bfSYann Gautier #endif
8103020b66SYann Gautier #if defined(IMAGE_BL31)
8203020b66SYann Gautier static const mmap_region_t stm32mp2_mmap[] = {
8303020b66SYann Gautier MAP_SYSRAM,
8403020b66SYann Gautier MAP_DEVICE,
8503020b66SYann Gautier {0}
8603020b66SYann Gautier };
8703020b66SYann Gautier #endif
88db77f8bfSYann Gautier
configure_mmu(void)89db77f8bfSYann Gautier void configure_mmu(void)
90db77f8bfSYann Gautier {
91db77f8bfSYann Gautier mmap_add(stm32mp2_mmap);
92db77f8bfSYann Gautier init_xlat_tables();
93db77f8bfSYann Gautier
94db77f8bfSYann Gautier enable_mmu_el3(0);
95db77f8bfSYann Gautier }
96db77f8bfSYann Gautier
stm32mp_map_retram(void)9752f530d3SMaxime Méré int stm32mp_map_retram(void)
9852f530d3SMaxime Méré {
9952f530d3SMaxime Méré return mmap_add_dynamic_region(RETRAM_BASE, RETRAM_BASE,
10052f530d3SMaxime Méré RETRAM_SIZE,
10152f530d3SMaxime Méré MT_RW | MT_SECURE);
10252f530d3SMaxime Méré }
10352f530d3SMaxime Méré
stm32mp_unmap_retram(void)10452f530d3SMaxime Méré int stm32mp_unmap_retram(void)
10552f530d3SMaxime Méré {
10652f530d3SMaxime Méré return mmap_remove_dynamic_region(RETRAM_BASE,
10752f530d3SMaxime Méré RETRAM_SIZE);
10852f530d3SMaxime Méré }
10952f530d3SMaxime Méré
stm32_get_gpio_bank_base(unsigned int bank)110db77f8bfSYann Gautier uintptr_t stm32_get_gpio_bank_base(unsigned int bank)
111db77f8bfSYann Gautier {
112db77f8bfSYann Gautier if (bank == GPIO_BANK_Z) {
113db77f8bfSYann Gautier return GPIOZ_BASE;
114db77f8bfSYann Gautier }
115db77f8bfSYann Gautier
116db77f8bfSYann Gautier assert(bank <= GPIO_BANK_K);
117db77f8bfSYann Gautier
118db77f8bfSYann Gautier return GPIOA_BASE + (bank * GPIO_BANK_OFFSET);
119db77f8bfSYann Gautier }
120db77f8bfSYann Gautier
stm32_get_gpio_bank_offset(unsigned int bank)121db77f8bfSYann Gautier uint32_t stm32_get_gpio_bank_offset(unsigned int bank)
122db77f8bfSYann Gautier {
123db77f8bfSYann Gautier if (bank == GPIO_BANK_Z) {
124db77f8bfSYann Gautier return 0;
125db77f8bfSYann Gautier }
126db77f8bfSYann Gautier
127db77f8bfSYann Gautier assert(bank <= GPIO_BANK_K);
128db77f8bfSYann Gautier
129db77f8bfSYann Gautier return bank * GPIO_BANK_OFFSET;
130db77f8bfSYann Gautier }
131db77f8bfSYann Gautier
stm32_get_gpio_bank_clock(unsigned int bank)132db77f8bfSYann Gautier unsigned long stm32_get_gpio_bank_clock(unsigned int bank)
133db77f8bfSYann Gautier {
134db77f8bfSYann Gautier if (bank == GPIO_BANK_Z) {
135db77f8bfSYann Gautier return CK_BUS_GPIOZ;
136db77f8bfSYann Gautier }
137db77f8bfSYann Gautier
138db77f8bfSYann Gautier assert(bank <= GPIO_BANK_K);
139db77f8bfSYann Gautier
140db77f8bfSYann Gautier return CK_BUS_GPIOA + (bank - GPIO_BANK_A);
141db77f8bfSYann Gautier }
142db77f8bfSYann Gautier
14327dd11dbSMaxime Méré #if STM32MP_UART_PROGRAMMER || !defined(IMAGE_BL2)
14427dd11dbSMaxime Méré /*
14527dd11dbSMaxime Méré * UART Management
14627dd11dbSMaxime Méré */
14727dd11dbSMaxime Méré static const uintptr_t stm32mp2_uart_addresses[STM32MP_NB_OF_UART] = {
14827dd11dbSMaxime Méré USART1_BASE,
14927dd11dbSMaxime Méré USART2_BASE,
15027dd11dbSMaxime Méré USART3_BASE,
15127dd11dbSMaxime Méré UART4_BASE,
15227dd11dbSMaxime Méré UART5_BASE,
15327dd11dbSMaxime Méré USART6_BASE,
15427dd11dbSMaxime Méré UART7_BASE,
15527dd11dbSMaxime Méré UART8_BASE,
15627dd11dbSMaxime Méré UART9_BASE,
15727dd11dbSMaxime Méré };
15827dd11dbSMaxime Méré
get_uart_address(uint32_t instance_nb)15927dd11dbSMaxime Méré uintptr_t get_uart_address(uint32_t instance_nb)
16027dd11dbSMaxime Méré {
16127dd11dbSMaxime Méré if ((instance_nb == 0U) ||
16227dd11dbSMaxime Méré (instance_nb > STM32MP_NB_OF_UART)) {
16327dd11dbSMaxime Méré return 0U;
16427dd11dbSMaxime Méré }
16527dd11dbSMaxime Méré
16627dd11dbSMaxime Méré return stm32mp2_uart_addresses[instance_nb - 1U];
16727dd11dbSMaxime Méré }
16827dd11dbSMaxime Méré #endif
16927dd11dbSMaxime Méré
stm32mp_get_chip_version(void)170381b2a6bSYann Gautier uint32_t stm32mp_get_chip_version(void)
171381b2a6bSYann Gautier {
172381b2a6bSYann Gautier static uint32_t rev;
173381b2a6bSYann Gautier
174381b2a6bSYann Gautier if (rev != 0U) {
175381b2a6bSYann Gautier return rev;
176381b2a6bSYann Gautier }
177381b2a6bSYann Gautier
178381b2a6bSYann Gautier if (stm32_get_otp_value(REVISION_OTP, &rev) != 0) {
179381b2a6bSYann Gautier panic();
180381b2a6bSYann Gautier }
181381b2a6bSYann Gautier
182381b2a6bSYann Gautier return rev;
183381b2a6bSYann Gautier }
184381b2a6bSYann Gautier
stm32mp_get_chip_dev_id(void)185381b2a6bSYann Gautier uint32_t stm32mp_get_chip_dev_id(void)
186381b2a6bSYann Gautier {
187381b2a6bSYann Gautier return stm32mp_syscfg_get_chip_dev_id();
188381b2a6bSYann Gautier }
189381b2a6bSYann Gautier
get_part_number(void)190381b2a6bSYann Gautier static uint32_t get_part_number(void)
191381b2a6bSYann Gautier {
192381b2a6bSYann Gautier static uint32_t part_number;
193381b2a6bSYann Gautier
194381b2a6bSYann Gautier if (part_number != 0U) {
195381b2a6bSYann Gautier return part_number;
196381b2a6bSYann Gautier }
197381b2a6bSYann Gautier
198381b2a6bSYann Gautier if (stm32_get_otp_value(PART_NUMBER_OTP, &part_number) != 0) {
199381b2a6bSYann Gautier panic();
200381b2a6bSYann Gautier }
201381b2a6bSYann Gautier
202381b2a6bSYann Gautier return part_number;
203381b2a6bSYann Gautier }
204381b2a6bSYann Gautier
get_cpu_package(void)205381b2a6bSYann Gautier static uint32_t get_cpu_package(void)
206381b2a6bSYann Gautier {
207381b2a6bSYann Gautier static uint32_t package = UINT32_MAX;
208381b2a6bSYann Gautier
209381b2a6bSYann Gautier if (package == UINT32_MAX) {
210381b2a6bSYann Gautier if (stm32_get_otp_value(PACKAGE_OTP, &package) != 0) {
211381b2a6bSYann Gautier panic();
212381b2a6bSYann Gautier }
213381b2a6bSYann Gautier }
214381b2a6bSYann Gautier
215381b2a6bSYann Gautier return (package & PACKAGE_OTP_PKG_MASK) >> PACKAGE_OTP_PKG_SHIFT;
216381b2a6bSYann Gautier }
217381b2a6bSYann Gautier
stm32mp_get_soc_name(char name[STM32_SOC_NAME_SIZE])218381b2a6bSYann Gautier void stm32mp_get_soc_name(char name[STM32_SOC_NAME_SIZE])
219381b2a6bSYann Gautier {
220381b2a6bSYann Gautier char *cpu_s, *cpu_r, *pkg;
221381b2a6bSYann Gautier
222381b2a6bSYann Gautier /* MPUs Part Numbers */
223381b2a6bSYann Gautier switch (get_part_number()) {
224381b2a6bSYann Gautier case STM32MP251A_PART_NB:
225381b2a6bSYann Gautier cpu_s = "251A";
226381b2a6bSYann Gautier break;
227381b2a6bSYann Gautier case STM32MP251C_PART_NB:
228381b2a6bSYann Gautier cpu_s = "251C";
229381b2a6bSYann Gautier break;
230381b2a6bSYann Gautier case STM32MP251D_PART_NB:
231381b2a6bSYann Gautier cpu_s = "251D";
232381b2a6bSYann Gautier break;
233381b2a6bSYann Gautier case STM32MP251F_PART_NB:
234381b2a6bSYann Gautier cpu_s = "251F";
235381b2a6bSYann Gautier break;
236381b2a6bSYann Gautier case STM32MP253A_PART_NB:
237381b2a6bSYann Gautier cpu_s = "253A";
238381b2a6bSYann Gautier break;
239381b2a6bSYann Gautier case STM32MP253C_PART_NB:
240381b2a6bSYann Gautier cpu_s = "253C";
241381b2a6bSYann Gautier break;
242381b2a6bSYann Gautier case STM32MP253D_PART_NB:
243381b2a6bSYann Gautier cpu_s = "253D";
244381b2a6bSYann Gautier break;
245381b2a6bSYann Gautier case STM32MP253F_PART_NB:
246381b2a6bSYann Gautier cpu_s = "253F";
247381b2a6bSYann Gautier break;
248381b2a6bSYann Gautier case STM32MP255A_PART_NB:
249381b2a6bSYann Gautier cpu_s = "255A";
250381b2a6bSYann Gautier break;
251381b2a6bSYann Gautier case STM32MP255C_PART_NB:
252381b2a6bSYann Gautier cpu_s = "255C";
253381b2a6bSYann Gautier break;
254381b2a6bSYann Gautier case STM32MP255D_PART_NB:
255381b2a6bSYann Gautier cpu_s = "255D";
256381b2a6bSYann Gautier break;
257381b2a6bSYann Gautier case STM32MP255F_PART_NB:
258381b2a6bSYann Gautier cpu_s = "255F";
259381b2a6bSYann Gautier break;
260381b2a6bSYann Gautier case STM32MP257A_PART_NB:
261381b2a6bSYann Gautier cpu_s = "257A";
262381b2a6bSYann Gautier break;
263381b2a6bSYann Gautier case STM32MP257C_PART_NB:
264381b2a6bSYann Gautier cpu_s = "257C";
265381b2a6bSYann Gautier break;
266381b2a6bSYann Gautier case STM32MP257D_PART_NB:
267381b2a6bSYann Gautier cpu_s = "257D";
268381b2a6bSYann Gautier break;
269381b2a6bSYann Gautier case STM32MP257F_PART_NB:
270381b2a6bSYann Gautier cpu_s = "257F";
271381b2a6bSYann Gautier break;
272381b2a6bSYann Gautier default:
273381b2a6bSYann Gautier cpu_s = "????";
274381b2a6bSYann Gautier break;
275381b2a6bSYann Gautier }
276381b2a6bSYann Gautier
277381b2a6bSYann Gautier /* Package */
278381b2a6bSYann Gautier switch (get_cpu_package()) {
279381b2a6bSYann Gautier case STM32MP25_PKG_CUSTOM:
280381b2a6bSYann Gautier pkg = "XX";
281381b2a6bSYann Gautier break;
282381b2a6bSYann Gautier case STM32MP25_PKG_AL_VFBGA361:
283381b2a6bSYann Gautier pkg = "AL";
284381b2a6bSYann Gautier break;
285381b2a6bSYann Gautier case STM32MP25_PKG_AK_VFBGA424:
286381b2a6bSYann Gautier pkg = "AK";
287381b2a6bSYann Gautier break;
288381b2a6bSYann Gautier case STM32MP25_PKG_AI_TFBGA436:
289381b2a6bSYann Gautier pkg = "AI";
290381b2a6bSYann Gautier break;
291381b2a6bSYann Gautier default:
292381b2a6bSYann Gautier pkg = "??";
293381b2a6bSYann Gautier break;
294381b2a6bSYann Gautier }
295381b2a6bSYann Gautier
296381b2a6bSYann Gautier /* REVISION */
297381b2a6bSYann Gautier switch (stm32mp_get_chip_version()) {
298381b2a6bSYann Gautier case STM32MP2_REV_A:
299381b2a6bSYann Gautier cpu_r = "A";
300381b2a6bSYann Gautier break;
301381b2a6bSYann Gautier case STM32MP2_REV_B:
302381b2a6bSYann Gautier cpu_r = "B";
303381b2a6bSYann Gautier break;
304381b2a6bSYann Gautier case STM32MP2_REV_X:
305381b2a6bSYann Gautier cpu_r = "X";
306381b2a6bSYann Gautier break;
307381b2a6bSYann Gautier case STM32MP2_REV_Y:
308381b2a6bSYann Gautier cpu_r = "Y";
309381b2a6bSYann Gautier break;
310381b2a6bSYann Gautier case STM32MP2_REV_Z:
311381b2a6bSYann Gautier cpu_r = "Z";
312381b2a6bSYann Gautier break;
313381b2a6bSYann Gautier default:
314381b2a6bSYann Gautier cpu_r = "?";
315381b2a6bSYann Gautier break;
316381b2a6bSYann Gautier }
317381b2a6bSYann Gautier
318381b2a6bSYann Gautier snprintf(name, STM32_SOC_NAME_SIZE,
319381b2a6bSYann Gautier "STM32MP%s%s Rev.%s", cpu_s, pkg, cpu_r);
320381b2a6bSYann Gautier }
321381b2a6bSYann Gautier
stm32mp_print_cpuinfo(void)322381b2a6bSYann Gautier void stm32mp_print_cpuinfo(void)
323381b2a6bSYann Gautier {
324381b2a6bSYann Gautier char name[STM32_SOC_NAME_SIZE];
325381b2a6bSYann Gautier
326381b2a6bSYann Gautier stm32mp_get_soc_name(name);
327381b2a6bSYann Gautier NOTICE("CPU: %s\n", name);
328381b2a6bSYann Gautier }
329381b2a6bSYann Gautier
stm32mp_print_boardinfo(void)330cdaced36SYann Gautier void stm32mp_print_boardinfo(void)
331cdaced36SYann Gautier {
332cdaced36SYann Gautier uint32_t board_id = 0U;
333cdaced36SYann Gautier
334cdaced36SYann Gautier if (stm32_get_otp_value(BOARD_ID_OTP, &board_id) != 0) {
335cdaced36SYann Gautier return;
336cdaced36SYann Gautier }
337cdaced36SYann Gautier
338cdaced36SYann Gautier if (board_id != 0U) {
339cdaced36SYann Gautier stm32_display_board_info(board_id);
340cdaced36SYann Gautier }
341cdaced36SYann Gautier }
342cdaced36SYann Gautier
3432c831e4bSYann Gautier /* Return true when SoC provides a single Cortex-A35 core, and false otherwise */
stm32mp_is_single_core(void)3442c831e4bSYann Gautier bool stm32mp_is_single_core(void)
3452c831e4bSYann Gautier {
3462c831e4bSYann Gautier bool single_core = false;
3472c831e4bSYann Gautier
3482c831e4bSYann Gautier switch (get_part_number()) {
3492c831e4bSYann Gautier case STM32MP251A_PART_NB:
3502c831e4bSYann Gautier case STM32MP251C_PART_NB:
3512c831e4bSYann Gautier case STM32MP251D_PART_NB:
3522c831e4bSYann Gautier case STM32MP251F_PART_NB:
3532c831e4bSYann Gautier single_core = true;
3542c831e4bSYann Gautier break;
3552c831e4bSYann Gautier default:
3562c831e4bSYann Gautier break;
3572c831e4bSYann Gautier }
3582c831e4bSYann Gautier
3592c831e4bSYann Gautier return single_core;
3602c831e4bSYann Gautier }
3612c831e4bSYann Gautier
3622c831e4bSYann Gautier /* Return true when device is in closed state */
stm32mp_check_closed_device(void)3632c831e4bSYann Gautier uint32_t stm32mp_check_closed_device(void)
3642c831e4bSYann Gautier {
3652c831e4bSYann Gautier return STM32MP_CHIP_SEC_OPEN;
3662c831e4bSYann Gautier }
3672c831e4bSYann Gautier
3682c831e4bSYann Gautier /* Return true when device supports secure boot */
stm32mp_is_auth_supported(void)3692c831e4bSYann Gautier bool stm32mp_is_auth_supported(void)
3702c831e4bSYann Gautier {
3712c831e4bSYann Gautier bool supported = false;
3722c831e4bSYann Gautier
3732c831e4bSYann Gautier switch (get_part_number()) {
3742c831e4bSYann Gautier case STM32MP251C_PART_NB:
3752c831e4bSYann Gautier case STM32MP251F_PART_NB:
3762c831e4bSYann Gautier case STM32MP253C_PART_NB:
3772c831e4bSYann Gautier case STM32MP253F_PART_NB:
3782c831e4bSYann Gautier case STM32MP255C_PART_NB:
3792c831e4bSYann Gautier case STM32MP255F_PART_NB:
3802c831e4bSYann Gautier case STM32MP257C_PART_NB:
3812c831e4bSYann Gautier case STM32MP257F_PART_NB:
3822c831e4bSYann Gautier supported = true;
3832c831e4bSYann Gautier break;
3842c831e4bSYann Gautier default:
3852c831e4bSYann Gautier break;
3862c831e4bSYann Gautier }
3872c831e4bSYann Gautier
3882c831e4bSYann Gautier return supported;
3892c831e4bSYann Gautier }
3902c831e4bSYann Gautier
stm32mp_is_wakeup_from_standby(void)39187cd847cSYann Gautier bool stm32mp_is_wakeup_from_standby(void)
39287cd847cSYann Gautier {
39387cd847cSYann Gautier /* TODO add source code to determine if platform is waking up from standby mode */
39487cd847cSYann Gautier return false;
39587cd847cSYann Gautier }
39687cd847cSYann Gautier
stm32_risaf_get_instance(uintptr_t base)397399cfdd4SNicolas Le Bayon int stm32_risaf_get_instance(uintptr_t base)
398399cfdd4SNicolas Le Bayon {
399399cfdd4SNicolas Le Bayon switch (base) {
400399cfdd4SNicolas Le Bayon case RISAF2_BASE:
401399cfdd4SNicolas Le Bayon return (int)RISAF2_INST;
402399cfdd4SNicolas Le Bayon case RISAF4_BASE:
403399cfdd4SNicolas Le Bayon return (int)RISAF4_INST;
404399cfdd4SNicolas Le Bayon default:
405399cfdd4SNicolas Le Bayon return -ENODEV;
406399cfdd4SNicolas Le Bayon }
407399cfdd4SNicolas Le Bayon }
408399cfdd4SNicolas Le Bayon
stm32_risaf_get_base(int instance)409399cfdd4SNicolas Le Bayon uintptr_t stm32_risaf_get_base(int instance)
410399cfdd4SNicolas Le Bayon {
411399cfdd4SNicolas Le Bayon switch (instance) {
412399cfdd4SNicolas Le Bayon case RISAF2_INST:
413399cfdd4SNicolas Le Bayon return (uintptr_t)RISAF2_BASE;
414399cfdd4SNicolas Le Bayon case RISAF4_INST:
415399cfdd4SNicolas Le Bayon return (uintptr_t)RISAF4_BASE;
416399cfdd4SNicolas Le Bayon default:
417399cfdd4SNicolas Le Bayon return 0U;
418399cfdd4SNicolas Le Bayon }
419399cfdd4SNicolas Le Bayon }
420399cfdd4SNicolas Le Bayon
stm32_risaf_get_max_region(int instance)421399cfdd4SNicolas Le Bayon int stm32_risaf_get_max_region(int instance)
422399cfdd4SNicolas Le Bayon {
423399cfdd4SNicolas Le Bayon switch (instance) {
424399cfdd4SNicolas Le Bayon case RISAF2_INST:
425399cfdd4SNicolas Le Bayon return (int)RISAF2_MAX_REGION;
426399cfdd4SNicolas Le Bayon case RISAF4_INST:
427399cfdd4SNicolas Le Bayon return (int)RISAF4_MAX_REGION;
428399cfdd4SNicolas Le Bayon default:
429399cfdd4SNicolas Le Bayon return 0;
430399cfdd4SNicolas Le Bayon }
431399cfdd4SNicolas Le Bayon }
432399cfdd4SNicolas Le Bayon
stm32_risaf_get_memory_base(int instance)433399cfdd4SNicolas Le Bayon uintptr_t stm32_risaf_get_memory_base(int instance)
434399cfdd4SNicolas Le Bayon {
435399cfdd4SNicolas Le Bayon switch (instance) {
436399cfdd4SNicolas Le Bayon case RISAF2_INST:
437399cfdd4SNicolas Le Bayon return (uintptr_t)STM32MP_OSPI_MM_BASE;
438399cfdd4SNicolas Le Bayon case RISAF4_INST:
439399cfdd4SNicolas Le Bayon return (uintptr_t)STM32MP_DDR_BASE;
440399cfdd4SNicolas Le Bayon default:
441399cfdd4SNicolas Le Bayon return 0U;
442399cfdd4SNicolas Le Bayon }
443399cfdd4SNicolas Le Bayon }
444399cfdd4SNicolas Le Bayon
stm32_risaf_get_memory_size(int instance)445399cfdd4SNicolas Le Bayon size_t stm32_risaf_get_memory_size(int instance)
446399cfdd4SNicolas Le Bayon {
447399cfdd4SNicolas Le Bayon switch (instance) {
448399cfdd4SNicolas Le Bayon case RISAF2_INST:
449399cfdd4SNicolas Le Bayon return STM32MP_OSPI_MM_SIZE;
450399cfdd4SNicolas Le Bayon case RISAF4_INST:
451399cfdd4SNicolas Le Bayon return dt_get_ddr_size();
452399cfdd4SNicolas Le Bayon default:
453399cfdd4SNicolas Le Bayon return 0U;
454399cfdd4SNicolas Le Bayon }
455399cfdd4SNicolas Le Bayon }
456399cfdd4SNicolas Le Bayon
stm32_get_bkpr_boot_mode_addr(void)457db77f8bfSYann Gautier uintptr_t stm32_get_bkpr_boot_mode_addr(void)
458db77f8bfSYann Gautier {
459db77f8bfSYann Gautier return tamp_bkpr(BKPR_BOOT_MODE);
460db77f8bfSYann Gautier }
4612fd7b230SNicolas Le Bayon
462c28c0ca2SYann Gautier #if PSA_FWU_SUPPORT
stm32_get_bkpr_fwu_info_addr(void)463c28c0ca2SYann Gautier uintptr_t stm32_get_bkpr_fwu_info_addr(void)
464c28c0ca2SYann Gautier {
465c28c0ca2SYann Gautier return tamp_bkpr(BKPR_FWU_INFO);
466c28c0ca2SYann Gautier }
467c28c0ca2SYann Gautier #endif /* PSA_FWU_SUPPORT */
468c28c0ca2SYann Gautier
stm32_ddrdbg_get_base(void)4692fd7b230SNicolas Le Bayon uintptr_t stm32_ddrdbg_get_base(void)
4702fd7b230SNicolas Le Bayon {
4712fd7b230SNicolas Le Bayon return DDRDBG_BASE;
4722fd7b230SNicolas Le Bayon }
473