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 15*03020b66SYann Gautier #if defined(IMAGE_BL31) 16*03020b66SYann Gautier /* BL31 only uses the first half of the SYSRAM */ 17*03020b66SYann Gautier #define MAP_SYSRAM MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \ 18*03020b66SYann Gautier STM32MP_SYSRAM_SIZE / 2U, \ 19*03020b66SYann Gautier MT_MEMORY | \ 20*03020b66SYann Gautier MT_RW | \ 21*03020b66SYann Gautier MT_SECURE | \ 22*03020b66SYann Gautier MT_EXECUTE_NEVER) 23*03020b66SYann 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) 30*03020b66SYann Gautier #endif 31db77f8bfSYann Gautier 32db77f8bfSYann Gautier #define MAP_DEVICE MAP_REGION_FLAT(STM32MP_DEVICE_BASE, \ 33db77f8bfSYann Gautier STM32MP_DEVICE_SIZE, \ 34db77f8bfSYann Gautier MT_DEVICE | \ 35db77f8bfSYann Gautier MT_RW | \ 36db77f8bfSYann Gautier MT_SECURE | \ 37db77f8bfSYann Gautier MT_EXECUTE_NEVER) 38db77f8bfSYann Gautier 39db77f8bfSYann Gautier #if defined(IMAGE_BL2) 40db77f8bfSYann Gautier static const mmap_region_t stm32mp2_mmap[] = { 41db77f8bfSYann Gautier MAP_SYSRAM, 42db77f8bfSYann Gautier MAP_DEVICE, 43db77f8bfSYann Gautier {0} 44db77f8bfSYann Gautier }; 45db77f8bfSYann Gautier #endif 46*03020b66SYann Gautier #if defined(IMAGE_BL31) 47*03020b66SYann Gautier static const mmap_region_t stm32mp2_mmap[] = { 48*03020b66SYann Gautier MAP_SYSRAM, 49*03020b66SYann Gautier MAP_DEVICE, 50*03020b66SYann Gautier {0} 51*03020b66SYann Gautier }; 52*03020b66SYann Gautier #endif 53db77f8bfSYann Gautier 54db77f8bfSYann Gautier void configure_mmu(void) 55db77f8bfSYann Gautier { 56db77f8bfSYann Gautier mmap_add(stm32mp2_mmap); 57db77f8bfSYann Gautier init_xlat_tables(); 58db77f8bfSYann Gautier 59db77f8bfSYann Gautier enable_mmu_el3(0); 60db77f8bfSYann Gautier } 61db77f8bfSYann Gautier 62db77f8bfSYann Gautier uintptr_t stm32_get_gpio_bank_base(unsigned int bank) 63db77f8bfSYann Gautier { 64db77f8bfSYann Gautier if (bank == GPIO_BANK_Z) { 65db77f8bfSYann Gautier return GPIOZ_BASE; 66db77f8bfSYann Gautier } 67db77f8bfSYann Gautier 68db77f8bfSYann Gautier assert(bank <= GPIO_BANK_K); 69db77f8bfSYann Gautier 70db77f8bfSYann Gautier return GPIOA_BASE + (bank * GPIO_BANK_OFFSET); 71db77f8bfSYann Gautier } 72db77f8bfSYann Gautier 73db77f8bfSYann Gautier uint32_t stm32_get_gpio_bank_offset(unsigned int bank) 74db77f8bfSYann Gautier { 75db77f8bfSYann Gautier if (bank == GPIO_BANK_Z) { 76db77f8bfSYann Gautier return 0; 77db77f8bfSYann Gautier } 78db77f8bfSYann Gautier 79db77f8bfSYann Gautier assert(bank <= GPIO_BANK_K); 80db77f8bfSYann Gautier 81db77f8bfSYann Gautier return bank * GPIO_BANK_OFFSET; 82db77f8bfSYann Gautier } 83db77f8bfSYann Gautier 84db77f8bfSYann Gautier unsigned long stm32_get_gpio_bank_clock(unsigned int bank) 85db77f8bfSYann Gautier { 86db77f8bfSYann Gautier if (bank == GPIO_BANK_Z) { 87db77f8bfSYann Gautier return CK_BUS_GPIOZ; 88db77f8bfSYann Gautier } 89db77f8bfSYann Gautier 90db77f8bfSYann Gautier assert(bank <= GPIO_BANK_K); 91db77f8bfSYann Gautier 92db77f8bfSYann Gautier return CK_BUS_GPIOA + (bank - GPIO_BANK_A); 93db77f8bfSYann Gautier } 94db77f8bfSYann Gautier 95381b2a6bSYann Gautier uint32_t stm32mp_get_chip_version(void) 96381b2a6bSYann Gautier { 97381b2a6bSYann Gautier static uint32_t rev; 98381b2a6bSYann Gautier 99381b2a6bSYann Gautier if (rev != 0U) { 100381b2a6bSYann Gautier return rev; 101381b2a6bSYann Gautier } 102381b2a6bSYann Gautier 103381b2a6bSYann Gautier if (stm32_get_otp_value(REVISION_OTP, &rev) != 0) { 104381b2a6bSYann Gautier panic(); 105381b2a6bSYann Gautier } 106381b2a6bSYann Gautier 107381b2a6bSYann Gautier return rev; 108381b2a6bSYann Gautier } 109381b2a6bSYann Gautier 110381b2a6bSYann Gautier uint32_t stm32mp_get_chip_dev_id(void) 111381b2a6bSYann Gautier { 112381b2a6bSYann Gautier return stm32mp_syscfg_get_chip_dev_id(); 113381b2a6bSYann Gautier } 114381b2a6bSYann Gautier 115381b2a6bSYann Gautier static uint32_t get_part_number(void) 116381b2a6bSYann Gautier { 117381b2a6bSYann Gautier static uint32_t part_number; 118381b2a6bSYann Gautier 119381b2a6bSYann Gautier if (part_number != 0U) { 120381b2a6bSYann Gautier return part_number; 121381b2a6bSYann Gautier } 122381b2a6bSYann Gautier 123381b2a6bSYann Gautier if (stm32_get_otp_value(PART_NUMBER_OTP, &part_number) != 0) { 124381b2a6bSYann Gautier panic(); 125381b2a6bSYann Gautier } 126381b2a6bSYann Gautier 127381b2a6bSYann Gautier return part_number; 128381b2a6bSYann Gautier } 129381b2a6bSYann Gautier 130381b2a6bSYann Gautier static uint32_t get_cpu_package(void) 131381b2a6bSYann Gautier { 132381b2a6bSYann Gautier static uint32_t package = UINT32_MAX; 133381b2a6bSYann Gautier 134381b2a6bSYann Gautier if (package == UINT32_MAX) { 135381b2a6bSYann Gautier if (stm32_get_otp_value(PACKAGE_OTP, &package) != 0) { 136381b2a6bSYann Gautier panic(); 137381b2a6bSYann Gautier } 138381b2a6bSYann Gautier } 139381b2a6bSYann Gautier 140381b2a6bSYann Gautier return (package & PACKAGE_OTP_PKG_MASK) >> PACKAGE_OTP_PKG_SHIFT; 141381b2a6bSYann Gautier } 142381b2a6bSYann Gautier 143381b2a6bSYann Gautier void stm32mp_get_soc_name(char name[STM32_SOC_NAME_SIZE]) 144381b2a6bSYann Gautier { 145381b2a6bSYann Gautier char *cpu_s, *cpu_r, *pkg; 146381b2a6bSYann Gautier 147381b2a6bSYann Gautier /* MPUs Part Numbers */ 148381b2a6bSYann Gautier switch (get_part_number()) { 149381b2a6bSYann Gautier case STM32MP251A_PART_NB: 150381b2a6bSYann Gautier cpu_s = "251A"; 151381b2a6bSYann Gautier break; 152381b2a6bSYann Gautier case STM32MP251C_PART_NB: 153381b2a6bSYann Gautier cpu_s = "251C"; 154381b2a6bSYann Gautier break; 155381b2a6bSYann Gautier case STM32MP251D_PART_NB: 156381b2a6bSYann Gautier cpu_s = "251D"; 157381b2a6bSYann Gautier break; 158381b2a6bSYann Gautier case STM32MP251F_PART_NB: 159381b2a6bSYann Gautier cpu_s = "251F"; 160381b2a6bSYann Gautier break; 161381b2a6bSYann Gautier case STM32MP253A_PART_NB: 162381b2a6bSYann Gautier cpu_s = "253A"; 163381b2a6bSYann Gautier break; 164381b2a6bSYann Gautier case STM32MP253C_PART_NB: 165381b2a6bSYann Gautier cpu_s = "253C"; 166381b2a6bSYann Gautier break; 167381b2a6bSYann Gautier case STM32MP253D_PART_NB: 168381b2a6bSYann Gautier cpu_s = "253D"; 169381b2a6bSYann Gautier break; 170381b2a6bSYann Gautier case STM32MP253F_PART_NB: 171381b2a6bSYann Gautier cpu_s = "253F"; 172381b2a6bSYann Gautier break; 173381b2a6bSYann Gautier case STM32MP255A_PART_NB: 174381b2a6bSYann Gautier cpu_s = "255A"; 175381b2a6bSYann Gautier break; 176381b2a6bSYann Gautier case STM32MP255C_PART_NB: 177381b2a6bSYann Gautier cpu_s = "255C"; 178381b2a6bSYann Gautier break; 179381b2a6bSYann Gautier case STM32MP255D_PART_NB: 180381b2a6bSYann Gautier cpu_s = "255D"; 181381b2a6bSYann Gautier break; 182381b2a6bSYann Gautier case STM32MP255F_PART_NB: 183381b2a6bSYann Gautier cpu_s = "255F"; 184381b2a6bSYann Gautier break; 185381b2a6bSYann Gautier case STM32MP257A_PART_NB: 186381b2a6bSYann Gautier cpu_s = "257A"; 187381b2a6bSYann Gautier break; 188381b2a6bSYann Gautier case STM32MP257C_PART_NB: 189381b2a6bSYann Gautier cpu_s = "257C"; 190381b2a6bSYann Gautier break; 191381b2a6bSYann Gautier case STM32MP257D_PART_NB: 192381b2a6bSYann Gautier cpu_s = "257D"; 193381b2a6bSYann Gautier break; 194381b2a6bSYann Gautier case STM32MP257F_PART_NB: 195381b2a6bSYann Gautier cpu_s = "257F"; 196381b2a6bSYann Gautier break; 197381b2a6bSYann Gautier default: 198381b2a6bSYann Gautier cpu_s = "????"; 199381b2a6bSYann Gautier break; 200381b2a6bSYann Gautier } 201381b2a6bSYann Gautier 202381b2a6bSYann Gautier /* Package */ 203381b2a6bSYann Gautier switch (get_cpu_package()) { 204381b2a6bSYann Gautier case STM32MP25_PKG_CUSTOM: 205381b2a6bSYann Gautier pkg = "XX"; 206381b2a6bSYann Gautier break; 207381b2a6bSYann Gautier case STM32MP25_PKG_AL_VFBGA361: 208381b2a6bSYann Gautier pkg = "AL"; 209381b2a6bSYann Gautier break; 210381b2a6bSYann Gautier case STM32MP25_PKG_AK_VFBGA424: 211381b2a6bSYann Gautier pkg = "AK"; 212381b2a6bSYann Gautier break; 213381b2a6bSYann Gautier case STM32MP25_PKG_AI_TFBGA436: 214381b2a6bSYann Gautier pkg = "AI"; 215381b2a6bSYann Gautier break; 216381b2a6bSYann Gautier default: 217381b2a6bSYann Gautier pkg = "??"; 218381b2a6bSYann Gautier break; 219381b2a6bSYann Gautier } 220381b2a6bSYann Gautier 221381b2a6bSYann Gautier /* REVISION */ 222381b2a6bSYann Gautier switch (stm32mp_get_chip_version()) { 223381b2a6bSYann Gautier case STM32MP2_REV_A: 224381b2a6bSYann Gautier cpu_r = "A"; 225381b2a6bSYann Gautier break; 226381b2a6bSYann Gautier case STM32MP2_REV_B: 227381b2a6bSYann Gautier cpu_r = "B"; 228381b2a6bSYann Gautier break; 229381b2a6bSYann Gautier case STM32MP2_REV_X: 230381b2a6bSYann Gautier cpu_r = "X"; 231381b2a6bSYann Gautier break; 232381b2a6bSYann Gautier case STM32MP2_REV_Y: 233381b2a6bSYann Gautier cpu_r = "Y"; 234381b2a6bSYann Gautier break; 235381b2a6bSYann Gautier case STM32MP2_REV_Z: 236381b2a6bSYann Gautier cpu_r = "Z"; 237381b2a6bSYann Gautier break; 238381b2a6bSYann Gautier default: 239381b2a6bSYann Gautier cpu_r = "?"; 240381b2a6bSYann Gautier break; 241381b2a6bSYann Gautier } 242381b2a6bSYann Gautier 243381b2a6bSYann Gautier snprintf(name, STM32_SOC_NAME_SIZE, 244381b2a6bSYann Gautier "STM32MP%s%s Rev.%s", cpu_s, pkg, cpu_r); 245381b2a6bSYann Gautier } 246381b2a6bSYann Gautier 247381b2a6bSYann Gautier void stm32mp_print_cpuinfo(void) 248381b2a6bSYann Gautier { 249381b2a6bSYann Gautier char name[STM32_SOC_NAME_SIZE]; 250381b2a6bSYann Gautier 251381b2a6bSYann Gautier stm32mp_get_soc_name(name); 252381b2a6bSYann Gautier NOTICE("CPU: %s\n", name); 253381b2a6bSYann Gautier } 254381b2a6bSYann Gautier 255cdaced36SYann Gautier void stm32mp_print_boardinfo(void) 256cdaced36SYann Gautier { 257cdaced36SYann Gautier uint32_t board_id = 0U; 258cdaced36SYann Gautier 259cdaced36SYann Gautier if (stm32_get_otp_value(BOARD_ID_OTP, &board_id) != 0) { 260cdaced36SYann Gautier return; 261cdaced36SYann Gautier } 262cdaced36SYann Gautier 263cdaced36SYann Gautier if (board_id != 0U) { 264cdaced36SYann Gautier stm32_display_board_info(board_id); 265cdaced36SYann Gautier } 266cdaced36SYann Gautier } 267cdaced36SYann Gautier 268db77f8bfSYann Gautier uintptr_t stm32_get_bkpr_boot_mode_addr(void) 269db77f8bfSYann Gautier { 270db77f8bfSYann Gautier return tamp_bkpr(BKPR_BOOT_MODE); 271db77f8bfSYann Gautier } 272