1c9d75b3cSYann Gautier /* 2c9d75b3cSYann Gautier * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. 3c9d75b3cSYann Gautier * 4c9d75b3cSYann Gautier * SPDX-License-Identifier: BSD-3-Clause 5c9d75b3cSYann Gautier */ 6c9d75b3cSYann Gautier 78f282daeSYann Gautier #include <assert.h> 88f282daeSYann Gautier 9c9d75b3cSYann Gautier #include <platform_def.h> 10c9d75b3cSYann Gautier 1173680c23SYann Gautier #include <drivers/st/stm32_iwdg.h> 12c9d75b3cSYann Gautier #include <lib/xlat_tables/xlat_tables_v2.h> 13c9d75b3cSYann Gautier 143f9c9784SYann Gautier #define MAP_SRAM MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \ 153f9c9784SYann Gautier STM32MP_SYSRAM_SIZE, \ 16c9d75b3cSYann Gautier MT_MEMORY | \ 17c9d75b3cSYann Gautier MT_RW | \ 18c9d75b3cSYann Gautier MT_SECURE | \ 19c9d75b3cSYann Gautier MT_EXECUTE_NEVER) 20c9d75b3cSYann Gautier 21c9d75b3cSYann Gautier #define MAP_DEVICE1 MAP_REGION_FLAT(STM32MP1_DEVICE1_BASE, \ 22c9d75b3cSYann Gautier STM32MP1_DEVICE1_SIZE, \ 23c9d75b3cSYann Gautier MT_DEVICE | \ 24c9d75b3cSYann Gautier MT_RW | \ 25c9d75b3cSYann Gautier MT_SECURE | \ 26c9d75b3cSYann Gautier MT_EXECUTE_NEVER) 27c9d75b3cSYann Gautier 28c9d75b3cSYann Gautier #define MAP_DEVICE2 MAP_REGION_FLAT(STM32MP1_DEVICE2_BASE, \ 29c9d75b3cSYann Gautier STM32MP1_DEVICE2_SIZE, \ 30c9d75b3cSYann Gautier MT_DEVICE | \ 31c9d75b3cSYann Gautier MT_RW | \ 32c9d75b3cSYann Gautier MT_SECURE | \ 33c9d75b3cSYann Gautier MT_EXECUTE_NEVER) 34c9d75b3cSYann Gautier 35c9d75b3cSYann Gautier #if defined(IMAGE_BL2) 36c9d75b3cSYann Gautier static const mmap_region_t stm32mp1_mmap[] = { 37c9d75b3cSYann Gautier MAP_SRAM, 38c9d75b3cSYann Gautier MAP_DEVICE1, 39c9d75b3cSYann Gautier MAP_DEVICE2, 40c9d75b3cSYann Gautier {0} 41c9d75b3cSYann Gautier }; 42c9d75b3cSYann Gautier #endif 43c9d75b3cSYann Gautier #if defined(IMAGE_BL32) 44c9d75b3cSYann Gautier static const mmap_region_t stm32mp1_mmap[] = { 45c9d75b3cSYann Gautier MAP_SRAM, 46c9d75b3cSYann Gautier MAP_DEVICE1, 47c9d75b3cSYann Gautier MAP_DEVICE2, 48c9d75b3cSYann Gautier {0} 49c9d75b3cSYann Gautier }; 50c9d75b3cSYann Gautier #endif 51c9d75b3cSYann Gautier 52c9d75b3cSYann Gautier void configure_mmu(void) 53c9d75b3cSYann Gautier { 54c9d75b3cSYann Gautier mmap_add(stm32mp1_mmap); 55c9d75b3cSYann Gautier init_xlat_tables(); 56c9d75b3cSYann Gautier 57c9d75b3cSYann Gautier enable_mmu_svc_mon(0); 58c9d75b3cSYann Gautier } 598f282daeSYann Gautier 608f282daeSYann Gautier unsigned long stm32_get_gpio_bank_clock(unsigned int bank) 618f282daeSYann Gautier { 628f282daeSYann Gautier if (bank == GPIO_BANK_Z) { 638f282daeSYann Gautier return GPIOZ; 648f282daeSYann Gautier } 658f282daeSYann Gautier 668f282daeSYann Gautier assert(GPIO_BANK_A == 0 && bank <= GPIO_BANK_K); 678f282daeSYann Gautier 688f282daeSYann Gautier return GPIOA + (bank - GPIO_BANK_A); 698f282daeSYann Gautier } 7073680c23SYann Gautier 71*dec286ddSYann Gautier static int get_part_number(uint32_t *part_nb) 72*dec286ddSYann Gautier { 73*dec286ddSYann Gautier uint32_t part_number; 74*dec286ddSYann Gautier uint32_t dev_id; 75*dec286ddSYann Gautier 76*dec286ddSYann Gautier if (stm32mp1_dbgmcu_get_chip_dev_id(&dev_id) < 0) { 77*dec286ddSYann Gautier return -1; 78*dec286ddSYann Gautier } 79*dec286ddSYann Gautier 80*dec286ddSYann Gautier if (bsec_shadow_read_otp(&part_number, PART_NUMBER_OTP) != BSEC_OK) { 81*dec286ddSYann Gautier ERROR("BSEC: PART_NUMBER_OTP Error\n"); 82*dec286ddSYann Gautier return -1; 83*dec286ddSYann Gautier } 84*dec286ddSYann Gautier 85*dec286ddSYann Gautier part_number = (part_number & PART_NUMBER_OTP_PART_MASK) >> 86*dec286ddSYann Gautier PART_NUMBER_OTP_PART_SHIFT; 87*dec286ddSYann Gautier 88*dec286ddSYann Gautier *part_nb = part_number | (dev_id << 16); 89*dec286ddSYann Gautier 90*dec286ddSYann Gautier return 0; 91*dec286ddSYann Gautier } 92*dec286ddSYann Gautier 93*dec286ddSYann Gautier static int get_cpu_package(uint32_t *cpu_package) 94*dec286ddSYann Gautier { 95*dec286ddSYann Gautier uint32_t package; 96*dec286ddSYann Gautier 97*dec286ddSYann Gautier if (bsec_shadow_read_otp(&package, PACKAGE_OTP) != BSEC_OK) { 98*dec286ddSYann Gautier ERROR("BSEC: PACKAGE_OTP Error\n"); 99*dec286ddSYann Gautier return -1; 100*dec286ddSYann Gautier } 101*dec286ddSYann Gautier 102*dec286ddSYann Gautier *cpu_package = (package & PACKAGE_OTP_PKG_MASK) >> 103*dec286ddSYann Gautier PACKAGE_OTP_PKG_SHIFT; 104*dec286ddSYann Gautier 105*dec286ddSYann Gautier return 0; 106*dec286ddSYann Gautier } 107*dec286ddSYann Gautier 108*dec286ddSYann Gautier void stm32mp_print_cpuinfo(void) 109*dec286ddSYann Gautier { 110*dec286ddSYann Gautier const char *cpu_s, *cpu_r, *pkg; 111*dec286ddSYann Gautier uint32_t part_number; 112*dec286ddSYann Gautier uint32_t cpu_package; 113*dec286ddSYann Gautier uint32_t chip_dev_id; 114*dec286ddSYann Gautier int ret; 115*dec286ddSYann Gautier 116*dec286ddSYann Gautier /* MPUs Part Numbers */ 117*dec286ddSYann Gautier ret = get_part_number(&part_number); 118*dec286ddSYann Gautier if (ret < 0) { 119*dec286ddSYann Gautier WARN("Cannot get part number\n"); 120*dec286ddSYann Gautier return; 121*dec286ddSYann Gautier } 122*dec286ddSYann Gautier 123*dec286ddSYann Gautier switch (part_number) { 124*dec286ddSYann Gautier case STM32MP157C_PART_NB: 125*dec286ddSYann Gautier cpu_s = "157C"; 126*dec286ddSYann Gautier break; 127*dec286ddSYann Gautier case STM32MP157A_PART_NB: 128*dec286ddSYann Gautier cpu_s = "157A"; 129*dec286ddSYann Gautier break; 130*dec286ddSYann Gautier case STM32MP153C_PART_NB: 131*dec286ddSYann Gautier cpu_s = "153C"; 132*dec286ddSYann Gautier break; 133*dec286ddSYann Gautier case STM32MP153A_PART_NB: 134*dec286ddSYann Gautier cpu_s = "153A"; 135*dec286ddSYann Gautier break; 136*dec286ddSYann Gautier case STM32MP151C_PART_NB: 137*dec286ddSYann Gautier cpu_s = "151C"; 138*dec286ddSYann Gautier break; 139*dec286ddSYann Gautier case STM32MP151A_PART_NB: 140*dec286ddSYann Gautier cpu_s = "151A"; 141*dec286ddSYann Gautier break; 142*dec286ddSYann Gautier default: 143*dec286ddSYann Gautier cpu_s = "????"; 144*dec286ddSYann Gautier break; 145*dec286ddSYann Gautier } 146*dec286ddSYann Gautier 147*dec286ddSYann Gautier /* Package */ 148*dec286ddSYann Gautier ret = get_cpu_package(&cpu_package); 149*dec286ddSYann Gautier if (ret < 0) { 150*dec286ddSYann Gautier WARN("Cannot get CPU package\n"); 151*dec286ddSYann Gautier return; 152*dec286ddSYann Gautier } 153*dec286ddSYann Gautier 154*dec286ddSYann Gautier switch (cpu_package) { 155*dec286ddSYann Gautier case PKG_AA_LFBGA448: 156*dec286ddSYann Gautier pkg = "AA"; 157*dec286ddSYann Gautier break; 158*dec286ddSYann Gautier case PKG_AB_LFBGA354: 159*dec286ddSYann Gautier pkg = "AB"; 160*dec286ddSYann Gautier break; 161*dec286ddSYann Gautier case PKG_AC_TFBGA361: 162*dec286ddSYann Gautier pkg = "AC"; 163*dec286ddSYann Gautier break; 164*dec286ddSYann Gautier case PKG_AD_TFBGA257: 165*dec286ddSYann Gautier pkg = "AD"; 166*dec286ddSYann Gautier break; 167*dec286ddSYann Gautier default: 168*dec286ddSYann Gautier pkg = "??"; 169*dec286ddSYann Gautier break; 170*dec286ddSYann Gautier } 171*dec286ddSYann Gautier 172*dec286ddSYann Gautier /* REVISION */ 173*dec286ddSYann Gautier ret = stm32mp1_dbgmcu_get_chip_version(&chip_dev_id); 174*dec286ddSYann Gautier if (ret < 0) { 175*dec286ddSYann Gautier WARN("Cannot get CPU version\n"); 176*dec286ddSYann Gautier return; 177*dec286ddSYann Gautier } 178*dec286ddSYann Gautier 179*dec286ddSYann Gautier switch (chip_dev_id) { 180*dec286ddSYann Gautier case STM32MP1_REV_B: 181*dec286ddSYann Gautier cpu_r = "B"; 182*dec286ddSYann Gautier break; 183*dec286ddSYann Gautier default: 184*dec286ddSYann Gautier cpu_r = "?"; 185*dec286ddSYann Gautier break; 186*dec286ddSYann Gautier } 187*dec286ddSYann Gautier 188*dec286ddSYann Gautier NOTICE("CPU: STM32MP%s%s Rev.%s\n", cpu_s, pkg, cpu_r); 189*dec286ddSYann Gautier } 190*dec286ddSYann Gautier 19173680c23SYann Gautier uint32_t stm32_iwdg_get_instance(uintptr_t base) 19273680c23SYann Gautier { 19373680c23SYann Gautier switch (base) { 19473680c23SYann Gautier case IWDG1_BASE: 19573680c23SYann Gautier return IWDG1_INST; 19673680c23SYann Gautier case IWDG2_BASE: 19773680c23SYann Gautier return IWDG2_INST; 19873680c23SYann Gautier default: 19973680c23SYann Gautier panic(); 20073680c23SYann Gautier } 20173680c23SYann Gautier } 20273680c23SYann Gautier 20373680c23SYann Gautier uint32_t stm32_iwdg_get_otp_config(uint32_t iwdg_inst) 20473680c23SYann Gautier { 20573680c23SYann Gautier uint32_t iwdg_cfg = 0U; 20673680c23SYann Gautier uint32_t otp_value; 20773680c23SYann Gautier 20873680c23SYann Gautier #if defined(IMAGE_BL2) 20973680c23SYann Gautier if (bsec_shadow_register(HW2_OTP) != BSEC_OK) { 21073680c23SYann Gautier panic(); 21173680c23SYann Gautier } 21273680c23SYann Gautier #endif 21373680c23SYann Gautier 21473680c23SYann Gautier if (bsec_read_otp(&otp_value, HW2_OTP) != BSEC_OK) { 21573680c23SYann Gautier panic(); 21673680c23SYann Gautier } 21773680c23SYann Gautier 21873680c23SYann Gautier if ((otp_value & BIT(iwdg_inst + HW2_OTP_IWDG_HW_POS)) != 0U) { 21973680c23SYann Gautier iwdg_cfg |= IWDG_HW_ENABLED; 22073680c23SYann Gautier } 22173680c23SYann Gautier 22273680c23SYann Gautier if ((otp_value & BIT(iwdg_inst + HW2_OTP_IWDG_FZ_STOP_POS)) != 0U) { 22373680c23SYann Gautier iwdg_cfg |= IWDG_DISABLE_ON_STOP; 22473680c23SYann Gautier } 22573680c23SYann Gautier 22673680c23SYann Gautier if ((otp_value & BIT(iwdg_inst + HW2_OTP_IWDG_FZ_STANDBY_POS)) != 0U) { 22773680c23SYann Gautier iwdg_cfg |= IWDG_DISABLE_ON_STANDBY; 22873680c23SYann Gautier } 22973680c23SYann Gautier 23073680c23SYann Gautier return iwdg_cfg; 23173680c23SYann Gautier } 23273680c23SYann Gautier 23373680c23SYann Gautier #if defined(IMAGE_BL2) 23473680c23SYann Gautier uint32_t stm32_iwdg_shadow_update(uint32_t iwdg_inst, uint32_t flags) 23573680c23SYann Gautier { 23673680c23SYann Gautier uint32_t otp; 23773680c23SYann Gautier uint32_t result; 23873680c23SYann Gautier 23973680c23SYann Gautier if (bsec_shadow_read_otp(&otp, HW2_OTP) != BSEC_OK) { 24073680c23SYann Gautier panic(); 24173680c23SYann Gautier } 24273680c23SYann Gautier 24373680c23SYann Gautier if ((flags & IWDG_DISABLE_ON_STOP) != 0U) { 24473680c23SYann Gautier otp |= BIT(iwdg_inst + HW2_OTP_IWDG_FZ_STOP_POS); 24573680c23SYann Gautier } 24673680c23SYann Gautier 24773680c23SYann Gautier if ((flags & IWDG_DISABLE_ON_STANDBY) != 0U) { 24873680c23SYann Gautier otp |= BIT(iwdg_inst + HW2_OTP_IWDG_FZ_STANDBY_POS); 24973680c23SYann Gautier } 25073680c23SYann Gautier 25173680c23SYann Gautier result = bsec_write_otp(otp, HW2_OTP); 25273680c23SYann Gautier if (result != BSEC_OK) { 25373680c23SYann Gautier return result; 25473680c23SYann Gautier } 25573680c23SYann Gautier 25673680c23SYann Gautier /* Sticky lock OTP_IWDG (read and write) */ 25773680c23SYann Gautier if (!bsec_write_sr_lock(HW2_OTP, 1U) || 25873680c23SYann Gautier !bsec_write_sw_lock(HW2_OTP, 1U)) { 25973680c23SYann Gautier return BSEC_LOCK_FAIL; 26073680c23SYann Gautier } 26173680c23SYann Gautier 26273680c23SYann Gautier return BSEC_OK; 26373680c23SYann Gautier } 26473680c23SYann Gautier #endif 265