1db77f8bfSYann Gautier /* 2db77f8bfSYann Gautier * Copyright (c) 2023-2024, STMicroelectronics - All Rights Reserved 3db77f8bfSYann Gautier * 4db77f8bfSYann Gautier * SPDX-License-Identifier: BSD-3-Clause 5db77f8bfSYann Gautier */ 6db77f8bfSYann Gautier 7db77f8bfSYann Gautier #include <assert.h> 8db77f8bfSYann Gautier 9db77f8bfSYann Gautier #include <lib/xlat_tables/xlat_tables_v2.h> 10db77f8bfSYann Gautier 11db77f8bfSYann Gautier #include <platform_def.h> 12db77f8bfSYann Gautier 13db77f8bfSYann Gautier #define BKPR_BOOT_MODE 96U 14db77f8bfSYann Gautier 1503020b66SYann Gautier #if defined(IMAGE_BL31) 1603020b66SYann Gautier /* BL31 only uses the first half of the SYSRAM */ 1703020b66SYann Gautier #define MAP_SYSRAM MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \ 1803020b66SYann Gautier STM32MP_SYSRAM_SIZE / 2U, \ 1903020b66SYann Gautier MT_MEMORY | \ 2003020b66SYann Gautier MT_RW | \ 2103020b66SYann Gautier MT_SECURE | \ 2203020b66SYann Gautier MT_EXECUTE_NEVER) 2303020b66SYann Gautier #else 24db77f8bfSYann Gautier #define MAP_SYSRAM MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \ 25db77f8bfSYann Gautier STM32MP_SYSRAM_SIZE, \ 26db77f8bfSYann Gautier MT_MEMORY | \ 27db77f8bfSYann Gautier MT_RW | \ 28db77f8bfSYann Gautier MT_SECURE | \ 29db77f8bfSYann Gautier MT_EXECUTE_NEVER) 3003020b66SYann Gautier #endif 31db77f8bfSYann Gautier 32ae84525fSMaxime Méré #if STM32MP_DDR_FIP_IO_STORAGE 33ae84525fSMaxime Méré #define MAP_SRAM1 MAP_REGION_FLAT(SRAM1_BASE, \ 34ae84525fSMaxime Méré SRAM1_SIZE_FOR_TFA, \ 35ae84525fSMaxime Méré MT_MEMORY | \ 36ae84525fSMaxime Méré MT_RW | \ 37ae84525fSMaxime Méré MT_SECURE | \ 38ae84525fSMaxime Méré MT_EXECUTE_NEVER) 39ae84525fSMaxime Méré #endif 40ae84525fSMaxime Méré 41db77f8bfSYann Gautier #define MAP_DEVICE MAP_REGION_FLAT(STM32MP_DEVICE_BASE, \ 42db77f8bfSYann Gautier STM32MP_DEVICE_SIZE, \ 43db77f8bfSYann Gautier MT_DEVICE | \ 44db77f8bfSYann Gautier MT_RW | \ 45db77f8bfSYann Gautier MT_SECURE | \ 46db77f8bfSYann Gautier MT_EXECUTE_NEVER) 47db77f8bfSYann Gautier 48db77f8bfSYann Gautier #if defined(IMAGE_BL2) 49db77f8bfSYann Gautier static const mmap_region_t stm32mp2_mmap[] = { 50db77f8bfSYann Gautier MAP_SYSRAM, 51ae84525fSMaxime Méré #if STM32MP_DDR_FIP_IO_STORAGE 52ae84525fSMaxime Méré MAP_SRAM1, 53ae84525fSMaxime Méré #endif 54db77f8bfSYann Gautier MAP_DEVICE, 55db77f8bfSYann Gautier {0} 56db77f8bfSYann Gautier }; 57db77f8bfSYann Gautier #endif 5803020b66SYann Gautier #if defined(IMAGE_BL31) 5903020b66SYann Gautier static const mmap_region_t stm32mp2_mmap[] = { 6003020b66SYann Gautier MAP_SYSRAM, 6103020b66SYann Gautier MAP_DEVICE, 6203020b66SYann Gautier {0} 6303020b66SYann Gautier }; 6403020b66SYann Gautier #endif 65db77f8bfSYann Gautier 66db77f8bfSYann Gautier void configure_mmu(void) 67db77f8bfSYann Gautier { 68db77f8bfSYann Gautier mmap_add(stm32mp2_mmap); 69db77f8bfSYann Gautier init_xlat_tables(); 70db77f8bfSYann Gautier 71db77f8bfSYann Gautier enable_mmu_el3(0); 72db77f8bfSYann Gautier } 73db77f8bfSYann Gautier 7452f530d3SMaxime Méré int stm32mp_map_retram(void) 7552f530d3SMaxime Méré { 7652f530d3SMaxime Méré return mmap_add_dynamic_region(RETRAM_BASE, RETRAM_BASE, 7752f530d3SMaxime Méré RETRAM_SIZE, 7852f530d3SMaxime Méré MT_RW | MT_SECURE); 7952f530d3SMaxime Méré } 8052f530d3SMaxime Méré 8152f530d3SMaxime Méré int stm32mp_unmap_retram(void) 8252f530d3SMaxime Méré { 8352f530d3SMaxime Méré return mmap_remove_dynamic_region(RETRAM_BASE, 8452f530d3SMaxime Méré RETRAM_SIZE); 8552f530d3SMaxime Méré } 8652f530d3SMaxime Méré 87db77f8bfSYann Gautier uintptr_t stm32_get_gpio_bank_base(unsigned int bank) 88db77f8bfSYann Gautier { 89db77f8bfSYann Gautier if (bank == GPIO_BANK_Z) { 90db77f8bfSYann Gautier return GPIOZ_BASE; 91db77f8bfSYann Gautier } 92db77f8bfSYann Gautier 93db77f8bfSYann Gautier assert(bank <= GPIO_BANK_K); 94db77f8bfSYann Gautier 95db77f8bfSYann Gautier return GPIOA_BASE + (bank * GPIO_BANK_OFFSET); 96db77f8bfSYann Gautier } 97db77f8bfSYann Gautier 98db77f8bfSYann Gautier uint32_t stm32_get_gpio_bank_offset(unsigned int bank) 99db77f8bfSYann Gautier { 100db77f8bfSYann Gautier if (bank == GPIO_BANK_Z) { 101db77f8bfSYann Gautier return 0; 102db77f8bfSYann Gautier } 103db77f8bfSYann Gautier 104db77f8bfSYann Gautier assert(bank <= GPIO_BANK_K); 105db77f8bfSYann Gautier 106db77f8bfSYann Gautier return bank * GPIO_BANK_OFFSET; 107db77f8bfSYann Gautier } 108db77f8bfSYann Gautier 109db77f8bfSYann Gautier unsigned long stm32_get_gpio_bank_clock(unsigned int bank) 110db77f8bfSYann Gautier { 111db77f8bfSYann Gautier if (bank == GPIO_BANK_Z) { 112db77f8bfSYann Gautier return CK_BUS_GPIOZ; 113db77f8bfSYann Gautier } 114db77f8bfSYann Gautier 115db77f8bfSYann Gautier assert(bank <= GPIO_BANK_K); 116db77f8bfSYann Gautier 117db77f8bfSYann Gautier return CK_BUS_GPIOA + (bank - GPIO_BANK_A); 118db77f8bfSYann Gautier } 119db77f8bfSYann Gautier 120*27dd11dbSMaxime Méré #if STM32MP_UART_PROGRAMMER || !defined(IMAGE_BL2) 121*27dd11dbSMaxime Méré /* 122*27dd11dbSMaxime Méré * UART Management 123*27dd11dbSMaxime Méré */ 124*27dd11dbSMaxime Méré static const uintptr_t stm32mp2_uart_addresses[STM32MP_NB_OF_UART] = { 125*27dd11dbSMaxime Méré USART1_BASE, 126*27dd11dbSMaxime Méré USART2_BASE, 127*27dd11dbSMaxime Méré USART3_BASE, 128*27dd11dbSMaxime Méré UART4_BASE, 129*27dd11dbSMaxime Méré UART5_BASE, 130*27dd11dbSMaxime Méré USART6_BASE, 131*27dd11dbSMaxime Méré UART7_BASE, 132*27dd11dbSMaxime Méré UART8_BASE, 133*27dd11dbSMaxime Méré UART9_BASE, 134*27dd11dbSMaxime Méré }; 135*27dd11dbSMaxime Méré 136*27dd11dbSMaxime Méré uintptr_t get_uart_address(uint32_t instance_nb) 137*27dd11dbSMaxime Méré { 138*27dd11dbSMaxime Méré if ((instance_nb == 0U) || 139*27dd11dbSMaxime Méré (instance_nb > STM32MP_NB_OF_UART)) { 140*27dd11dbSMaxime Méré return 0U; 141*27dd11dbSMaxime Méré } 142*27dd11dbSMaxime Méré 143*27dd11dbSMaxime Méré return stm32mp2_uart_addresses[instance_nb - 1U]; 144*27dd11dbSMaxime Méré } 145*27dd11dbSMaxime Méré #endif 146*27dd11dbSMaxime Méré 147381b2a6bSYann Gautier uint32_t stm32mp_get_chip_version(void) 148381b2a6bSYann Gautier { 149381b2a6bSYann Gautier static uint32_t rev; 150381b2a6bSYann Gautier 151381b2a6bSYann Gautier if (rev != 0U) { 152381b2a6bSYann Gautier return rev; 153381b2a6bSYann Gautier } 154381b2a6bSYann Gautier 155381b2a6bSYann Gautier if (stm32_get_otp_value(REVISION_OTP, &rev) != 0) { 156381b2a6bSYann Gautier panic(); 157381b2a6bSYann Gautier } 158381b2a6bSYann Gautier 159381b2a6bSYann Gautier return rev; 160381b2a6bSYann Gautier } 161381b2a6bSYann Gautier 162381b2a6bSYann Gautier uint32_t stm32mp_get_chip_dev_id(void) 163381b2a6bSYann Gautier { 164381b2a6bSYann Gautier return stm32mp_syscfg_get_chip_dev_id(); 165381b2a6bSYann Gautier } 166381b2a6bSYann Gautier 167381b2a6bSYann Gautier static uint32_t get_part_number(void) 168381b2a6bSYann Gautier { 169381b2a6bSYann Gautier static uint32_t part_number; 170381b2a6bSYann Gautier 171381b2a6bSYann Gautier if (part_number != 0U) { 172381b2a6bSYann Gautier return part_number; 173381b2a6bSYann Gautier } 174381b2a6bSYann Gautier 175381b2a6bSYann Gautier if (stm32_get_otp_value(PART_NUMBER_OTP, &part_number) != 0) { 176381b2a6bSYann Gautier panic(); 177381b2a6bSYann Gautier } 178381b2a6bSYann Gautier 179381b2a6bSYann Gautier return part_number; 180381b2a6bSYann Gautier } 181381b2a6bSYann Gautier 182381b2a6bSYann Gautier static uint32_t get_cpu_package(void) 183381b2a6bSYann Gautier { 184381b2a6bSYann Gautier static uint32_t package = UINT32_MAX; 185381b2a6bSYann Gautier 186381b2a6bSYann Gautier if (package == UINT32_MAX) { 187381b2a6bSYann Gautier if (stm32_get_otp_value(PACKAGE_OTP, &package) != 0) { 188381b2a6bSYann Gautier panic(); 189381b2a6bSYann Gautier } 190381b2a6bSYann Gautier } 191381b2a6bSYann Gautier 192381b2a6bSYann Gautier return (package & PACKAGE_OTP_PKG_MASK) >> PACKAGE_OTP_PKG_SHIFT; 193381b2a6bSYann Gautier } 194381b2a6bSYann Gautier 195381b2a6bSYann Gautier void stm32mp_get_soc_name(char name[STM32_SOC_NAME_SIZE]) 196381b2a6bSYann Gautier { 197381b2a6bSYann Gautier char *cpu_s, *cpu_r, *pkg; 198381b2a6bSYann Gautier 199381b2a6bSYann Gautier /* MPUs Part Numbers */ 200381b2a6bSYann Gautier switch (get_part_number()) { 201381b2a6bSYann Gautier case STM32MP251A_PART_NB: 202381b2a6bSYann Gautier cpu_s = "251A"; 203381b2a6bSYann Gautier break; 204381b2a6bSYann Gautier case STM32MP251C_PART_NB: 205381b2a6bSYann Gautier cpu_s = "251C"; 206381b2a6bSYann Gautier break; 207381b2a6bSYann Gautier case STM32MP251D_PART_NB: 208381b2a6bSYann Gautier cpu_s = "251D"; 209381b2a6bSYann Gautier break; 210381b2a6bSYann Gautier case STM32MP251F_PART_NB: 211381b2a6bSYann Gautier cpu_s = "251F"; 212381b2a6bSYann Gautier break; 213381b2a6bSYann Gautier case STM32MP253A_PART_NB: 214381b2a6bSYann Gautier cpu_s = "253A"; 215381b2a6bSYann Gautier break; 216381b2a6bSYann Gautier case STM32MP253C_PART_NB: 217381b2a6bSYann Gautier cpu_s = "253C"; 218381b2a6bSYann Gautier break; 219381b2a6bSYann Gautier case STM32MP253D_PART_NB: 220381b2a6bSYann Gautier cpu_s = "253D"; 221381b2a6bSYann Gautier break; 222381b2a6bSYann Gautier case STM32MP253F_PART_NB: 223381b2a6bSYann Gautier cpu_s = "253F"; 224381b2a6bSYann Gautier break; 225381b2a6bSYann Gautier case STM32MP255A_PART_NB: 226381b2a6bSYann Gautier cpu_s = "255A"; 227381b2a6bSYann Gautier break; 228381b2a6bSYann Gautier case STM32MP255C_PART_NB: 229381b2a6bSYann Gautier cpu_s = "255C"; 230381b2a6bSYann Gautier break; 231381b2a6bSYann Gautier case STM32MP255D_PART_NB: 232381b2a6bSYann Gautier cpu_s = "255D"; 233381b2a6bSYann Gautier break; 234381b2a6bSYann Gautier case STM32MP255F_PART_NB: 235381b2a6bSYann Gautier cpu_s = "255F"; 236381b2a6bSYann Gautier break; 237381b2a6bSYann Gautier case STM32MP257A_PART_NB: 238381b2a6bSYann Gautier cpu_s = "257A"; 239381b2a6bSYann Gautier break; 240381b2a6bSYann Gautier case STM32MP257C_PART_NB: 241381b2a6bSYann Gautier cpu_s = "257C"; 242381b2a6bSYann Gautier break; 243381b2a6bSYann Gautier case STM32MP257D_PART_NB: 244381b2a6bSYann Gautier cpu_s = "257D"; 245381b2a6bSYann Gautier break; 246381b2a6bSYann Gautier case STM32MP257F_PART_NB: 247381b2a6bSYann Gautier cpu_s = "257F"; 248381b2a6bSYann Gautier break; 249381b2a6bSYann Gautier default: 250381b2a6bSYann Gautier cpu_s = "????"; 251381b2a6bSYann Gautier break; 252381b2a6bSYann Gautier } 253381b2a6bSYann Gautier 254381b2a6bSYann Gautier /* Package */ 255381b2a6bSYann Gautier switch (get_cpu_package()) { 256381b2a6bSYann Gautier case STM32MP25_PKG_CUSTOM: 257381b2a6bSYann Gautier pkg = "XX"; 258381b2a6bSYann Gautier break; 259381b2a6bSYann Gautier case STM32MP25_PKG_AL_VFBGA361: 260381b2a6bSYann Gautier pkg = "AL"; 261381b2a6bSYann Gautier break; 262381b2a6bSYann Gautier case STM32MP25_PKG_AK_VFBGA424: 263381b2a6bSYann Gautier pkg = "AK"; 264381b2a6bSYann Gautier break; 265381b2a6bSYann Gautier case STM32MP25_PKG_AI_TFBGA436: 266381b2a6bSYann Gautier pkg = "AI"; 267381b2a6bSYann Gautier break; 268381b2a6bSYann Gautier default: 269381b2a6bSYann Gautier pkg = "??"; 270381b2a6bSYann Gautier break; 271381b2a6bSYann Gautier } 272381b2a6bSYann Gautier 273381b2a6bSYann Gautier /* REVISION */ 274381b2a6bSYann Gautier switch (stm32mp_get_chip_version()) { 275381b2a6bSYann Gautier case STM32MP2_REV_A: 276381b2a6bSYann Gautier cpu_r = "A"; 277381b2a6bSYann Gautier break; 278381b2a6bSYann Gautier case STM32MP2_REV_B: 279381b2a6bSYann Gautier cpu_r = "B"; 280381b2a6bSYann Gautier break; 281381b2a6bSYann Gautier case STM32MP2_REV_X: 282381b2a6bSYann Gautier cpu_r = "X"; 283381b2a6bSYann Gautier break; 284381b2a6bSYann Gautier case STM32MP2_REV_Y: 285381b2a6bSYann Gautier cpu_r = "Y"; 286381b2a6bSYann Gautier break; 287381b2a6bSYann Gautier case STM32MP2_REV_Z: 288381b2a6bSYann Gautier cpu_r = "Z"; 289381b2a6bSYann Gautier break; 290381b2a6bSYann Gautier default: 291381b2a6bSYann Gautier cpu_r = "?"; 292381b2a6bSYann Gautier break; 293381b2a6bSYann Gautier } 294381b2a6bSYann Gautier 295381b2a6bSYann Gautier snprintf(name, STM32_SOC_NAME_SIZE, 296381b2a6bSYann Gautier "STM32MP%s%s Rev.%s", cpu_s, pkg, cpu_r); 297381b2a6bSYann Gautier } 298381b2a6bSYann Gautier 299381b2a6bSYann Gautier void stm32mp_print_cpuinfo(void) 300381b2a6bSYann Gautier { 301381b2a6bSYann Gautier char name[STM32_SOC_NAME_SIZE]; 302381b2a6bSYann Gautier 303381b2a6bSYann Gautier stm32mp_get_soc_name(name); 304381b2a6bSYann Gautier NOTICE("CPU: %s\n", name); 305381b2a6bSYann Gautier } 306381b2a6bSYann Gautier 307cdaced36SYann Gautier void stm32mp_print_boardinfo(void) 308cdaced36SYann Gautier { 309cdaced36SYann Gautier uint32_t board_id = 0U; 310cdaced36SYann Gautier 311cdaced36SYann Gautier if (stm32_get_otp_value(BOARD_ID_OTP, &board_id) != 0) { 312cdaced36SYann Gautier return; 313cdaced36SYann Gautier } 314cdaced36SYann Gautier 315cdaced36SYann Gautier if (board_id != 0U) { 316cdaced36SYann Gautier stm32_display_board_info(board_id); 317cdaced36SYann Gautier } 318cdaced36SYann Gautier } 319cdaced36SYann Gautier 32087cd847cSYann Gautier bool stm32mp_is_wakeup_from_standby(void) 32187cd847cSYann Gautier { 32287cd847cSYann Gautier /* TODO add source code to determine if platform is waking up from standby mode */ 32387cd847cSYann Gautier return false; 32487cd847cSYann Gautier } 32587cd847cSYann Gautier 326db77f8bfSYann Gautier uintptr_t stm32_get_bkpr_boot_mode_addr(void) 327db77f8bfSYann Gautier { 328db77f8bfSYann Gautier return tamp_bkpr(BKPR_BOOT_MODE); 329db77f8bfSYann Gautier } 3302fd7b230SNicolas Le Bayon 3312fd7b230SNicolas Le Bayon uintptr_t stm32_ddrdbg_get_base(void) 3322fd7b230SNicolas Le Bayon { 3332fd7b230SNicolas Le Bayon return DDRDBG_BASE; 3342fd7b230SNicolas Le Bayon } 335