xref: /rk3399_ARM-atf/plat/st/stm32mp2/stm32mp2_private.c (revision 2c831e4b116be6215290f678d35b1946160c099a)
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 
34ae84525fSMaxime Méré #if STM32MP_DDR_FIP_IO_STORAGE
35ae84525fSMaxime Méré #define MAP_SRAM1	MAP_REGION_FLAT(SRAM1_BASE, \
36ae84525fSMaxime Méré 					SRAM1_SIZE_FOR_TFA, \
37ae84525fSMaxime Méré 					MT_MEMORY | \
38ae84525fSMaxime Méré 					MT_RW | \
39ae84525fSMaxime Méré 					MT_SECURE | \
40ae84525fSMaxime Méré 					MT_EXECUTE_NEVER)
41ae84525fSMaxime Méré #endif
42ae84525fSMaxime Méré 
43db77f8bfSYann Gautier #define MAP_DEVICE	MAP_REGION_FLAT(STM32MP_DEVICE_BASE, \
44db77f8bfSYann Gautier 					STM32MP_DEVICE_SIZE, \
45db77f8bfSYann Gautier 					MT_DEVICE | \
46db77f8bfSYann Gautier 					MT_RW | \
47db77f8bfSYann Gautier 					MT_SECURE | \
48db77f8bfSYann Gautier 					MT_EXECUTE_NEVER)
49db77f8bfSYann Gautier 
50db77f8bfSYann Gautier #if defined(IMAGE_BL2)
51db77f8bfSYann Gautier static const mmap_region_t stm32mp2_mmap[] = {
52db77f8bfSYann Gautier 	MAP_SYSRAM,
53ae84525fSMaxime Méré #if STM32MP_DDR_FIP_IO_STORAGE
54ae84525fSMaxime Méré 	MAP_SRAM1,
55ae84525fSMaxime Méré #endif
56db77f8bfSYann Gautier 	MAP_DEVICE,
57db77f8bfSYann Gautier 	{0}
58db77f8bfSYann Gautier };
59db77f8bfSYann Gautier #endif
6003020b66SYann Gautier #if defined(IMAGE_BL31)
6103020b66SYann Gautier static const mmap_region_t stm32mp2_mmap[] = {
6203020b66SYann Gautier 	MAP_SYSRAM,
6303020b66SYann Gautier 	MAP_DEVICE,
6403020b66SYann Gautier 	{0}
6503020b66SYann Gautier };
6603020b66SYann Gautier #endif
67db77f8bfSYann Gautier 
68db77f8bfSYann Gautier void configure_mmu(void)
69db77f8bfSYann Gautier {
70db77f8bfSYann Gautier 	mmap_add(stm32mp2_mmap);
71db77f8bfSYann Gautier 	init_xlat_tables();
72db77f8bfSYann Gautier 
73db77f8bfSYann Gautier 	enable_mmu_el3(0);
74db77f8bfSYann Gautier }
75db77f8bfSYann Gautier 
7652f530d3SMaxime Méré int stm32mp_map_retram(void)
7752f530d3SMaxime Méré {
7852f530d3SMaxime Méré 	return  mmap_add_dynamic_region(RETRAM_BASE, RETRAM_BASE,
7952f530d3SMaxime Méré 					RETRAM_SIZE,
8052f530d3SMaxime Méré 					MT_RW | MT_SECURE);
8152f530d3SMaxime Méré }
8252f530d3SMaxime Méré 
8352f530d3SMaxime Méré int stm32mp_unmap_retram(void)
8452f530d3SMaxime Méré {
8552f530d3SMaxime Méré 	return  mmap_remove_dynamic_region(RETRAM_BASE,
8652f530d3SMaxime Méré 					   RETRAM_SIZE);
8752f530d3SMaxime Méré }
8852f530d3SMaxime Méré 
89db77f8bfSYann Gautier uintptr_t stm32_get_gpio_bank_base(unsigned int bank)
90db77f8bfSYann Gautier {
91db77f8bfSYann Gautier 	if (bank == GPIO_BANK_Z) {
92db77f8bfSYann Gautier 		return GPIOZ_BASE;
93db77f8bfSYann Gautier 	}
94db77f8bfSYann Gautier 
95db77f8bfSYann Gautier 	assert(bank <= GPIO_BANK_K);
96db77f8bfSYann Gautier 
97db77f8bfSYann Gautier 	return GPIOA_BASE + (bank * GPIO_BANK_OFFSET);
98db77f8bfSYann Gautier }
99db77f8bfSYann Gautier 
100db77f8bfSYann Gautier uint32_t stm32_get_gpio_bank_offset(unsigned int bank)
101db77f8bfSYann Gautier {
102db77f8bfSYann Gautier 	if (bank == GPIO_BANK_Z) {
103db77f8bfSYann Gautier 		return 0;
104db77f8bfSYann Gautier 	}
105db77f8bfSYann Gautier 
106db77f8bfSYann Gautier 	assert(bank <= GPIO_BANK_K);
107db77f8bfSYann Gautier 
108db77f8bfSYann Gautier 	return bank * GPIO_BANK_OFFSET;
109db77f8bfSYann Gautier }
110db77f8bfSYann Gautier 
111db77f8bfSYann Gautier unsigned long stm32_get_gpio_bank_clock(unsigned int bank)
112db77f8bfSYann Gautier {
113db77f8bfSYann Gautier 	if (bank == GPIO_BANK_Z) {
114db77f8bfSYann Gautier 		return CK_BUS_GPIOZ;
115db77f8bfSYann Gautier 	}
116db77f8bfSYann Gautier 
117db77f8bfSYann Gautier 	assert(bank <= GPIO_BANK_K);
118db77f8bfSYann Gautier 
119db77f8bfSYann Gautier 	return CK_BUS_GPIOA + (bank - GPIO_BANK_A);
120db77f8bfSYann Gautier }
121db77f8bfSYann Gautier 
12227dd11dbSMaxime Méré #if STM32MP_UART_PROGRAMMER || !defined(IMAGE_BL2)
12327dd11dbSMaxime Méré /*
12427dd11dbSMaxime Méré  * UART Management
12527dd11dbSMaxime Méré  */
12627dd11dbSMaxime Méré static const uintptr_t stm32mp2_uart_addresses[STM32MP_NB_OF_UART] = {
12727dd11dbSMaxime Méré 	USART1_BASE,
12827dd11dbSMaxime Méré 	USART2_BASE,
12927dd11dbSMaxime Méré 	USART3_BASE,
13027dd11dbSMaxime Méré 	UART4_BASE,
13127dd11dbSMaxime Méré 	UART5_BASE,
13227dd11dbSMaxime Méré 	USART6_BASE,
13327dd11dbSMaxime Méré 	UART7_BASE,
13427dd11dbSMaxime Méré 	UART8_BASE,
13527dd11dbSMaxime Méré 	UART9_BASE,
13627dd11dbSMaxime Méré };
13727dd11dbSMaxime Méré 
13827dd11dbSMaxime Méré uintptr_t get_uart_address(uint32_t instance_nb)
13927dd11dbSMaxime Méré {
14027dd11dbSMaxime Méré 	if ((instance_nb == 0U) ||
14127dd11dbSMaxime Méré 	    (instance_nb > STM32MP_NB_OF_UART)) {
14227dd11dbSMaxime Méré 		return 0U;
14327dd11dbSMaxime Méré 	}
14427dd11dbSMaxime Méré 
14527dd11dbSMaxime Méré 	return stm32mp2_uart_addresses[instance_nb - 1U];
14627dd11dbSMaxime Méré }
14727dd11dbSMaxime Méré #endif
14827dd11dbSMaxime Méré 
149381b2a6bSYann Gautier uint32_t stm32mp_get_chip_version(void)
150381b2a6bSYann Gautier {
151381b2a6bSYann Gautier 	static uint32_t rev;
152381b2a6bSYann Gautier 
153381b2a6bSYann Gautier 	if (rev != 0U) {
154381b2a6bSYann Gautier 		return rev;
155381b2a6bSYann Gautier 	}
156381b2a6bSYann Gautier 
157381b2a6bSYann Gautier 	if (stm32_get_otp_value(REVISION_OTP, &rev) != 0) {
158381b2a6bSYann Gautier 		panic();
159381b2a6bSYann Gautier 	}
160381b2a6bSYann Gautier 
161381b2a6bSYann Gautier 	return rev;
162381b2a6bSYann Gautier }
163381b2a6bSYann Gautier 
164381b2a6bSYann Gautier uint32_t stm32mp_get_chip_dev_id(void)
165381b2a6bSYann Gautier {
166381b2a6bSYann Gautier 	return stm32mp_syscfg_get_chip_dev_id();
167381b2a6bSYann Gautier }
168381b2a6bSYann Gautier 
169381b2a6bSYann Gautier static uint32_t get_part_number(void)
170381b2a6bSYann Gautier {
171381b2a6bSYann Gautier 	static uint32_t part_number;
172381b2a6bSYann Gautier 
173381b2a6bSYann Gautier 	if (part_number != 0U) {
174381b2a6bSYann Gautier 		return part_number;
175381b2a6bSYann Gautier 	}
176381b2a6bSYann Gautier 
177381b2a6bSYann Gautier 	if (stm32_get_otp_value(PART_NUMBER_OTP, &part_number) != 0) {
178381b2a6bSYann Gautier 		panic();
179381b2a6bSYann Gautier 	}
180381b2a6bSYann Gautier 
181381b2a6bSYann Gautier 	return part_number;
182381b2a6bSYann Gautier }
183381b2a6bSYann Gautier 
184381b2a6bSYann Gautier static uint32_t get_cpu_package(void)
185381b2a6bSYann Gautier {
186381b2a6bSYann Gautier 	static uint32_t package = UINT32_MAX;
187381b2a6bSYann Gautier 
188381b2a6bSYann Gautier 	if (package == UINT32_MAX) {
189381b2a6bSYann Gautier 		if (stm32_get_otp_value(PACKAGE_OTP, &package) != 0) {
190381b2a6bSYann Gautier 			panic();
191381b2a6bSYann Gautier 		}
192381b2a6bSYann Gautier 	}
193381b2a6bSYann Gautier 
194381b2a6bSYann Gautier 	return (package & PACKAGE_OTP_PKG_MASK) >> PACKAGE_OTP_PKG_SHIFT;
195381b2a6bSYann Gautier }
196381b2a6bSYann Gautier 
197381b2a6bSYann Gautier void stm32mp_get_soc_name(char name[STM32_SOC_NAME_SIZE])
198381b2a6bSYann Gautier {
199381b2a6bSYann Gautier 	char *cpu_s, *cpu_r, *pkg;
200381b2a6bSYann Gautier 
201381b2a6bSYann Gautier 	/* MPUs Part Numbers */
202381b2a6bSYann Gautier 	switch (get_part_number()) {
203381b2a6bSYann Gautier 	case STM32MP251A_PART_NB:
204381b2a6bSYann Gautier 		cpu_s = "251A";
205381b2a6bSYann Gautier 		break;
206381b2a6bSYann Gautier 	case STM32MP251C_PART_NB:
207381b2a6bSYann Gautier 		cpu_s = "251C";
208381b2a6bSYann Gautier 		break;
209381b2a6bSYann Gautier 	case STM32MP251D_PART_NB:
210381b2a6bSYann Gautier 		cpu_s = "251D";
211381b2a6bSYann Gautier 		break;
212381b2a6bSYann Gautier 	case STM32MP251F_PART_NB:
213381b2a6bSYann Gautier 		cpu_s = "251F";
214381b2a6bSYann Gautier 		break;
215381b2a6bSYann Gautier 	case STM32MP253A_PART_NB:
216381b2a6bSYann Gautier 		cpu_s = "253A";
217381b2a6bSYann Gautier 		break;
218381b2a6bSYann Gautier 	case STM32MP253C_PART_NB:
219381b2a6bSYann Gautier 		cpu_s = "253C";
220381b2a6bSYann Gautier 		break;
221381b2a6bSYann Gautier 	case STM32MP253D_PART_NB:
222381b2a6bSYann Gautier 		cpu_s = "253D";
223381b2a6bSYann Gautier 		break;
224381b2a6bSYann Gautier 	case STM32MP253F_PART_NB:
225381b2a6bSYann Gautier 		cpu_s = "253F";
226381b2a6bSYann Gautier 		break;
227381b2a6bSYann Gautier 	case STM32MP255A_PART_NB:
228381b2a6bSYann Gautier 		cpu_s = "255A";
229381b2a6bSYann Gautier 		break;
230381b2a6bSYann Gautier 	case STM32MP255C_PART_NB:
231381b2a6bSYann Gautier 		cpu_s = "255C";
232381b2a6bSYann Gautier 		break;
233381b2a6bSYann Gautier 	case STM32MP255D_PART_NB:
234381b2a6bSYann Gautier 		cpu_s = "255D";
235381b2a6bSYann Gautier 		break;
236381b2a6bSYann Gautier 	case STM32MP255F_PART_NB:
237381b2a6bSYann Gautier 		cpu_s = "255F";
238381b2a6bSYann Gautier 		break;
239381b2a6bSYann Gautier 	case STM32MP257A_PART_NB:
240381b2a6bSYann Gautier 		cpu_s = "257A";
241381b2a6bSYann Gautier 		break;
242381b2a6bSYann Gautier 	case STM32MP257C_PART_NB:
243381b2a6bSYann Gautier 		cpu_s = "257C";
244381b2a6bSYann Gautier 		break;
245381b2a6bSYann Gautier 	case STM32MP257D_PART_NB:
246381b2a6bSYann Gautier 		cpu_s = "257D";
247381b2a6bSYann Gautier 		break;
248381b2a6bSYann Gautier 	case STM32MP257F_PART_NB:
249381b2a6bSYann Gautier 		cpu_s = "257F";
250381b2a6bSYann Gautier 		break;
251381b2a6bSYann Gautier 	default:
252381b2a6bSYann Gautier 		cpu_s = "????";
253381b2a6bSYann Gautier 		break;
254381b2a6bSYann Gautier 	}
255381b2a6bSYann Gautier 
256381b2a6bSYann Gautier 	/* Package */
257381b2a6bSYann Gautier 	switch (get_cpu_package()) {
258381b2a6bSYann Gautier 	case STM32MP25_PKG_CUSTOM:
259381b2a6bSYann Gautier 		pkg = "XX";
260381b2a6bSYann Gautier 		break;
261381b2a6bSYann Gautier 	case STM32MP25_PKG_AL_VFBGA361:
262381b2a6bSYann Gautier 		pkg = "AL";
263381b2a6bSYann Gautier 		break;
264381b2a6bSYann Gautier 	case STM32MP25_PKG_AK_VFBGA424:
265381b2a6bSYann Gautier 		pkg = "AK";
266381b2a6bSYann Gautier 		break;
267381b2a6bSYann Gautier 	case STM32MP25_PKG_AI_TFBGA436:
268381b2a6bSYann Gautier 		pkg = "AI";
269381b2a6bSYann Gautier 		break;
270381b2a6bSYann Gautier 	default:
271381b2a6bSYann Gautier 		pkg = "??";
272381b2a6bSYann Gautier 		break;
273381b2a6bSYann Gautier 	}
274381b2a6bSYann Gautier 
275381b2a6bSYann Gautier 	/* REVISION */
276381b2a6bSYann Gautier 	switch (stm32mp_get_chip_version()) {
277381b2a6bSYann Gautier 	case STM32MP2_REV_A:
278381b2a6bSYann Gautier 		cpu_r = "A";
279381b2a6bSYann Gautier 		break;
280381b2a6bSYann Gautier 	case STM32MP2_REV_B:
281381b2a6bSYann Gautier 		cpu_r = "B";
282381b2a6bSYann Gautier 		break;
283381b2a6bSYann Gautier 	case STM32MP2_REV_X:
284381b2a6bSYann Gautier 		cpu_r = "X";
285381b2a6bSYann Gautier 		break;
286381b2a6bSYann Gautier 	case STM32MP2_REV_Y:
287381b2a6bSYann Gautier 		cpu_r = "Y";
288381b2a6bSYann Gautier 		break;
289381b2a6bSYann Gautier 	case STM32MP2_REV_Z:
290381b2a6bSYann Gautier 		cpu_r = "Z";
291381b2a6bSYann Gautier 		break;
292381b2a6bSYann Gautier 	default:
293381b2a6bSYann Gautier 		cpu_r = "?";
294381b2a6bSYann Gautier 		break;
295381b2a6bSYann Gautier 	}
296381b2a6bSYann Gautier 
297381b2a6bSYann Gautier 	snprintf(name, STM32_SOC_NAME_SIZE,
298381b2a6bSYann Gautier 		 "STM32MP%s%s Rev.%s", cpu_s, pkg, cpu_r);
299381b2a6bSYann Gautier }
300381b2a6bSYann Gautier 
301381b2a6bSYann Gautier void stm32mp_print_cpuinfo(void)
302381b2a6bSYann Gautier {
303381b2a6bSYann Gautier 	char name[STM32_SOC_NAME_SIZE];
304381b2a6bSYann Gautier 
305381b2a6bSYann Gautier 	stm32mp_get_soc_name(name);
306381b2a6bSYann Gautier 	NOTICE("CPU: %s\n", name);
307381b2a6bSYann Gautier }
308381b2a6bSYann Gautier 
309cdaced36SYann Gautier void stm32mp_print_boardinfo(void)
310cdaced36SYann Gautier {
311cdaced36SYann Gautier 	uint32_t board_id = 0U;
312cdaced36SYann Gautier 
313cdaced36SYann Gautier 	if (stm32_get_otp_value(BOARD_ID_OTP, &board_id) != 0) {
314cdaced36SYann Gautier 		return;
315cdaced36SYann Gautier 	}
316cdaced36SYann Gautier 
317cdaced36SYann Gautier 	if (board_id != 0U) {
318cdaced36SYann Gautier 		stm32_display_board_info(board_id);
319cdaced36SYann Gautier 	}
320cdaced36SYann Gautier }
321cdaced36SYann Gautier 
322*2c831e4bSYann Gautier /* Return true when SoC provides a single Cortex-A35 core, and false otherwise */
323*2c831e4bSYann Gautier bool stm32mp_is_single_core(void)
324*2c831e4bSYann Gautier {
325*2c831e4bSYann Gautier 	bool single_core = false;
326*2c831e4bSYann Gautier 
327*2c831e4bSYann Gautier 	switch (get_part_number()) {
328*2c831e4bSYann Gautier 	case STM32MP251A_PART_NB:
329*2c831e4bSYann Gautier 	case STM32MP251C_PART_NB:
330*2c831e4bSYann Gautier 	case STM32MP251D_PART_NB:
331*2c831e4bSYann Gautier 	case STM32MP251F_PART_NB:
332*2c831e4bSYann Gautier 		single_core = true;
333*2c831e4bSYann Gautier 		break;
334*2c831e4bSYann Gautier 	default:
335*2c831e4bSYann Gautier 		break;
336*2c831e4bSYann Gautier 	}
337*2c831e4bSYann Gautier 
338*2c831e4bSYann Gautier 	return single_core;
339*2c831e4bSYann Gautier }
340*2c831e4bSYann Gautier 
341*2c831e4bSYann Gautier /* Return true when device is in closed state */
342*2c831e4bSYann Gautier uint32_t stm32mp_check_closed_device(void)
343*2c831e4bSYann Gautier {
344*2c831e4bSYann Gautier 	return STM32MP_CHIP_SEC_OPEN;
345*2c831e4bSYann Gautier }
346*2c831e4bSYann Gautier 
347*2c831e4bSYann Gautier /* Return true when device supports secure boot */
348*2c831e4bSYann Gautier bool stm32mp_is_auth_supported(void)
349*2c831e4bSYann Gautier {
350*2c831e4bSYann Gautier 	bool supported = false;
351*2c831e4bSYann Gautier 
352*2c831e4bSYann Gautier 	switch (get_part_number()) {
353*2c831e4bSYann Gautier 	case STM32MP251C_PART_NB:
354*2c831e4bSYann Gautier 	case STM32MP251F_PART_NB:
355*2c831e4bSYann Gautier 	case STM32MP253C_PART_NB:
356*2c831e4bSYann Gautier 	case STM32MP253F_PART_NB:
357*2c831e4bSYann Gautier 	case STM32MP255C_PART_NB:
358*2c831e4bSYann Gautier 	case STM32MP255F_PART_NB:
359*2c831e4bSYann Gautier 	case STM32MP257C_PART_NB:
360*2c831e4bSYann Gautier 	case STM32MP257F_PART_NB:
361*2c831e4bSYann Gautier 		supported = true;
362*2c831e4bSYann Gautier 		break;
363*2c831e4bSYann Gautier 	default:
364*2c831e4bSYann Gautier 		break;
365*2c831e4bSYann Gautier 	}
366*2c831e4bSYann Gautier 
367*2c831e4bSYann Gautier 	return supported;
368*2c831e4bSYann Gautier }
369*2c831e4bSYann Gautier 
37087cd847cSYann Gautier bool stm32mp_is_wakeup_from_standby(void)
37187cd847cSYann Gautier {
37287cd847cSYann Gautier 	/* TODO add source code to determine if platform is waking up from standby mode */
37387cd847cSYann Gautier 	return false;
37487cd847cSYann Gautier }
37587cd847cSYann Gautier 
376399cfdd4SNicolas Le Bayon int stm32_risaf_get_instance(uintptr_t base)
377399cfdd4SNicolas Le Bayon {
378399cfdd4SNicolas Le Bayon 	switch (base) {
379399cfdd4SNicolas Le Bayon 	case RISAF2_BASE:
380399cfdd4SNicolas Le Bayon 		return (int)RISAF2_INST;
381399cfdd4SNicolas Le Bayon 	case RISAF4_BASE:
382399cfdd4SNicolas Le Bayon 		return (int)RISAF4_INST;
383399cfdd4SNicolas Le Bayon 	default:
384399cfdd4SNicolas Le Bayon 		return -ENODEV;
385399cfdd4SNicolas Le Bayon 	}
386399cfdd4SNicolas Le Bayon }
387399cfdd4SNicolas Le Bayon 
388399cfdd4SNicolas Le Bayon uintptr_t stm32_risaf_get_base(int instance)
389399cfdd4SNicolas Le Bayon {
390399cfdd4SNicolas Le Bayon 	switch (instance) {
391399cfdd4SNicolas Le Bayon 	case RISAF2_INST:
392399cfdd4SNicolas Le Bayon 		return (uintptr_t)RISAF2_BASE;
393399cfdd4SNicolas Le Bayon 	case RISAF4_INST:
394399cfdd4SNicolas Le Bayon 		return (uintptr_t)RISAF4_BASE;
395399cfdd4SNicolas Le Bayon 	default:
396399cfdd4SNicolas Le Bayon 		return 0U;
397399cfdd4SNicolas Le Bayon 	}
398399cfdd4SNicolas Le Bayon }
399399cfdd4SNicolas Le Bayon 
400399cfdd4SNicolas Le Bayon int stm32_risaf_get_max_region(int instance)
401399cfdd4SNicolas Le Bayon {
402399cfdd4SNicolas Le Bayon 	switch (instance) {
403399cfdd4SNicolas Le Bayon 	case RISAF2_INST:
404399cfdd4SNicolas Le Bayon 		return (int)RISAF2_MAX_REGION;
405399cfdd4SNicolas Le Bayon 	case RISAF4_INST:
406399cfdd4SNicolas Le Bayon 		return (int)RISAF4_MAX_REGION;
407399cfdd4SNicolas Le Bayon 	default:
408399cfdd4SNicolas Le Bayon 		return 0;
409399cfdd4SNicolas Le Bayon 	}
410399cfdd4SNicolas Le Bayon }
411399cfdd4SNicolas Le Bayon 
412399cfdd4SNicolas Le Bayon uintptr_t stm32_risaf_get_memory_base(int instance)
413399cfdd4SNicolas Le Bayon {
414399cfdd4SNicolas Le Bayon 	switch (instance) {
415399cfdd4SNicolas Le Bayon 	case RISAF2_INST:
416399cfdd4SNicolas Le Bayon 		return (uintptr_t)STM32MP_OSPI_MM_BASE;
417399cfdd4SNicolas Le Bayon 	case RISAF4_INST:
418399cfdd4SNicolas Le Bayon 		return (uintptr_t)STM32MP_DDR_BASE;
419399cfdd4SNicolas Le Bayon 	default:
420399cfdd4SNicolas Le Bayon 		return 0U;
421399cfdd4SNicolas Le Bayon 	}
422399cfdd4SNicolas Le Bayon }
423399cfdd4SNicolas Le Bayon 
424399cfdd4SNicolas Le Bayon size_t stm32_risaf_get_memory_size(int instance)
425399cfdd4SNicolas Le Bayon {
426399cfdd4SNicolas Le Bayon 	switch (instance) {
427399cfdd4SNicolas Le Bayon 	case RISAF2_INST:
428399cfdd4SNicolas Le Bayon 		return STM32MP_OSPI_MM_SIZE;
429399cfdd4SNicolas Le Bayon 	case RISAF4_INST:
430399cfdd4SNicolas Le Bayon 		return dt_get_ddr_size();
431399cfdd4SNicolas Le Bayon 	default:
432399cfdd4SNicolas Le Bayon 		return 0U;
433399cfdd4SNicolas Le Bayon 	}
434399cfdd4SNicolas Le Bayon }
435399cfdd4SNicolas Le Bayon 
436db77f8bfSYann Gautier uintptr_t stm32_get_bkpr_boot_mode_addr(void)
437db77f8bfSYann Gautier {
438db77f8bfSYann Gautier 	return tamp_bkpr(BKPR_BOOT_MODE);
439db77f8bfSYann Gautier }
4402fd7b230SNicolas Le Bayon 
441c28c0ca2SYann Gautier #if PSA_FWU_SUPPORT
442c28c0ca2SYann Gautier uintptr_t stm32_get_bkpr_fwu_info_addr(void)
443c28c0ca2SYann Gautier {
444c28c0ca2SYann Gautier 	return tamp_bkpr(BKPR_FWU_INFO);
445c28c0ca2SYann Gautier }
446c28c0ca2SYann Gautier #endif /* PSA_FWU_SUPPORT */
447c28c0ca2SYann Gautier 
4482fd7b230SNicolas Le Bayon uintptr_t stm32_ddrdbg_get_base(void)
4492fd7b230SNicolas Le Bayon {
4502fd7b230SNicolas Le Bayon 	return DDRDBG_BASE;
4512fd7b230SNicolas Le Bayon }
452