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 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 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é 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é 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 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 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é 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é 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 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 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 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 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 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 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 */ 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 */ 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 */ 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 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 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 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 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 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 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 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 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 4692fd7b230SNicolas Le Bayon uintptr_t stm32_ddrdbg_get_base(void) 4702fd7b230SNicolas Le Bayon { 4712fd7b230SNicolas Le Bayon return DDRDBG_BASE; 4722fd7b230SNicolas Le Bayon } 473