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 11*73680c23SYann 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 } 70*73680c23SYann Gautier 71*73680c23SYann Gautier uint32_t stm32_iwdg_get_instance(uintptr_t base) 72*73680c23SYann Gautier { 73*73680c23SYann Gautier switch (base) { 74*73680c23SYann Gautier case IWDG1_BASE: 75*73680c23SYann Gautier return IWDG1_INST; 76*73680c23SYann Gautier case IWDG2_BASE: 77*73680c23SYann Gautier return IWDG2_INST; 78*73680c23SYann Gautier default: 79*73680c23SYann Gautier panic(); 80*73680c23SYann Gautier } 81*73680c23SYann Gautier } 82*73680c23SYann Gautier 83*73680c23SYann Gautier uint32_t stm32_iwdg_get_otp_config(uint32_t iwdg_inst) 84*73680c23SYann Gautier { 85*73680c23SYann Gautier uint32_t iwdg_cfg = 0U; 86*73680c23SYann Gautier uint32_t otp_value; 87*73680c23SYann Gautier 88*73680c23SYann Gautier #if defined(IMAGE_BL2) 89*73680c23SYann Gautier if (bsec_shadow_register(HW2_OTP) != BSEC_OK) { 90*73680c23SYann Gautier panic(); 91*73680c23SYann Gautier } 92*73680c23SYann Gautier #endif 93*73680c23SYann Gautier 94*73680c23SYann Gautier if (bsec_read_otp(&otp_value, HW2_OTP) != BSEC_OK) { 95*73680c23SYann Gautier panic(); 96*73680c23SYann Gautier } 97*73680c23SYann Gautier 98*73680c23SYann Gautier if ((otp_value & BIT(iwdg_inst + HW2_OTP_IWDG_HW_POS)) != 0U) { 99*73680c23SYann Gautier iwdg_cfg |= IWDG_HW_ENABLED; 100*73680c23SYann Gautier } 101*73680c23SYann Gautier 102*73680c23SYann Gautier if ((otp_value & BIT(iwdg_inst + HW2_OTP_IWDG_FZ_STOP_POS)) != 0U) { 103*73680c23SYann Gautier iwdg_cfg |= IWDG_DISABLE_ON_STOP; 104*73680c23SYann Gautier } 105*73680c23SYann Gautier 106*73680c23SYann Gautier if ((otp_value & BIT(iwdg_inst + HW2_OTP_IWDG_FZ_STANDBY_POS)) != 0U) { 107*73680c23SYann Gautier iwdg_cfg |= IWDG_DISABLE_ON_STANDBY; 108*73680c23SYann Gautier } 109*73680c23SYann Gautier 110*73680c23SYann Gautier return iwdg_cfg; 111*73680c23SYann Gautier } 112*73680c23SYann Gautier 113*73680c23SYann Gautier #if defined(IMAGE_BL2) 114*73680c23SYann Gautier uint32_t stm32_iwdg_shadow_update(uint32_t iwdg_inst, uint32_t flags) 115*73680c23SYann Gautier { 116*73680c23SYann Gautier uint32_t otp; 117*73680c23SYann Gautier uint32_t result; 118*73680c23SYann Gautier 119*73680c23SYann Gautier if (bsec_shadow_read_otp(&otp, HW2_OTP) != BSEC_OK) { 120*73680c23SYann Gautier panic(); 121*73680c23SYann Gautier } 122*73680c23SYann Gautier 123*73680c23SYann Gautier if ((flags & IWDG_DISABLE_ON_STOP) != 0U) { 124*73680c23SYann Gautier otp |= BIT(iwdg_inst + HW2_OTP_IWDG_FZ_STOP_POS); 125*73680c23SYann Gautier } 126*73680c23SYann Gautier 127*73680c23SYann Gautier if ((flags & IWDG_DISABLE_ON_STANDBY) != 0U) { 128*73680c23SYann Gautier otp |= BIT(iwdg_inst + HW2_OTP_IWDG_FZ_STANDBY_POS); 129*73680c23SYann Gautier } 130*73680c23SYann Gautier 131*73680c23SYann Gautier result = bsec_write_otp(otp, HW2_OTP); 132*73680c23SYann Gautier if (result != BSEC_OK) { 133*73680c23SYann Gautier return result; 134*73680c23SYann Gautier } 135*73680c23SYann Gautier 136*73680c23SYann Gautier /* Sticky lock OTP_IWDG (read and write) */ 137*73680c23SYann Gautier if (!bsec_write_sr_lock(HW2_OTP, 1U) || 138*73680c23SYann Gautier !bsec_write_sw_lock(HW2_OTP, 1U)) { 139*73680c23SYann Gautier return BSEC_LOCK_FAIL; 140*73680c23SYann Gautier } 141*73680c23SYann Gautier 142*73680c23SYann Gautier return BSEC_OK; 143*73680c23SYann Gautier } 144*73680c23SYann Gautier #endif 145