1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2017-2022, STMicroelectronics - All Rights Reserved 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <assert.h> 8*91f16700Schasinglulu #include <stdint.h> 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <common/debug.h> 11*91f16700Schasinglulu #include <drivers/st/etzpc.h> 12*91f16700Schasinglulu #include <drivers/st/stm32_gpio.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu #include <platform_def.h> 15*91f16700Schasinglulu #include <stm32mp_shared_resources.h> 16*91f16700Schasinglulu 17*91f16700Schasinglulu /* 18*91f16700Schasinglulu * Once one starts to get the resource registering state, one cannot register 19*91f16700Schasinglulu * new resources. This ensures resource state cannot change. 20*91f16700Schasinglulu */ 21*91f16700Schasinglulu static bool registering_locked; 22*91f16700Schasinglulu 23*91f16700Schasinglulu /* 24*91f16700Schasinglulu * Shared peripherals and resources registration 25*91f16700Schasinglulu * 26*91f16700Schasinglulu * Each resource assignation is stored in a table. The state defaults 27*91f16700Schasinglulu * to PERIPH_UNREGISTERED if the resource is not explicitly assigned. 28*91f16700Schasinglulu * 29*91f16700Schasinglulu * Resource driver that as not embedded (a.k.a their related CFG_xxx build 30*91f16700Schasinglulu * directive is disabled) are assigned to the non-secure world. 31*91f16700Schasinglulu * 32*91f16700Schasinglulu * Each pin of the GPIOZ bank can be secure or non-secure. 33*91f16700Schasinglulu * 34*91f16700Schasinglulu * It is the platform responsibility the ensure resource assignation 35*91f16700Schasinglulu * matches the access permission firewalls configuration. 36*91f16700Schasinglulu */ 37*91f16700Schasinglulu enum shres_state { 38*91f16700Schasinglulu SHRES_UNREGISTERED = 0, 39*91f16700Schasinglulu SHRES_SECURE, 40*91f16700Schasinglulu SHRES_NON_SECURE, 41*91f16700Schasinglulu }; 42*91f16700Schasinglulu 43*91f16700Schasinglulu /* Force uint8_t array for array of enum shres_state for size considerations */ 44*91f16700Schasinglulu static uint8_t shres_state[STM32MP1_SHRES_COUNT]; 45*91f16700Schasinglulu 46*91f16700Schasinglulu static const char *shres2str_id_tbl[STM32MP1_SHRES_COUNT] __unused = { 47*91f16700Schasinglulu [STM32MP1_SHRES_GPIOZ(0)] = "GPIOZ0", 48*91f16700Schasinglulu [STM32MP1_SHRES_GPIOZ(1)] = "GPIOZ1", 49*91f16700Schasinglulu [STM32MP1_SHRES_GPIOZ(2)] = "GPIOZ2", 50*91f16700Schasinglulu [STM32MP1_SHRES_GPIOZ(3)] = "GPIOZ3", 51*91f16700Schasinglulu [STM32MP1_SHRES_GPIOZ(4)] = "GPIOZ4", 52*91f16700Schasinglulu [STM32MP1_SHRES_GPIOZ(5)] = "GPIOZ5", 53*91f16700Schasinglulu [STM32MP1_SHRES_GPIOZ(6)] = "GPIOZ6", 54*91f16700Schasinglulu [STM32MP1_SHRES_GPIOZ(7)] = "GPIOZ7", 55*91f16700Schasinglulu [STM32MP1_SHRES_IWDG1] = "IWDG1", 56*91f16700Schasinglulu [STM32MP1_SHRES_USART1] = "USART1", 57*91f16700Schasinglulu [STM32MP1_SHRES_SPI6] = "SPI6", 58*91f16700Schasinglulu [STM32MP1_SHRES_I2C4] = "I2C4", 59*91f16700Schasinglulu [STM32MP1_SHRES_RNG1] = "RNG1", 60*91f16700Schasinglulu [STM32MP1_SHRES_HASH1] = "HASH1", 61*91f16700Schasinglulu [STM32MP1_SHRES_CRYP1] = "CRYP1", 62*91f16700Schasinglulu [STM32MP1_SHRES_I2C6] = "I2C6", 63*91f16700Schasinglulu [STM32MP1_SHRES_RTC] = "RTC", 64*91f16700Schasinglulu [STM32MP1_SHRES_MCU] = "MCU", 65*91f16700Schasinglulu [STM32MP1_SHRES_MDMA] = "MDMA", 66*91f16700Schasinglulu [STM32MP1_SHRES_PLL3] = "PLL3", 67*91f16700Schasinglulu }; 68*91f16700Schasinglulu 69*91f16700Schasinglulu static const char __unused *shres2str_id(enum stm32mp_shres id) 70*91f16700Schasinglulu { 71*91f16700Schasinglulu assert(id < ARRAY_SIZE(shres2str_id_tbl)); 72*91f16700Schasinglulu 73*91f16700Schasinglulu return shres2str_id_tbl[id]; 74*91f16700Schasinglulu } 75*91f16700Schasinglulu 76*91f16700Schasinglulu static const char __unused *shres2str_state_tbl[] = { 77*91f16700Schasinglulu [SHRES_UNREGISTERED] = "unregistered", 78*91f16700Schasinglulu [SHRES_NON_SECURE] = "non-secure", 79*91f16700Schasinglulu [SHRES_SECURE] = "secure", 80*91f16700Schasinglulu }; 81*91f16700Schasinglulu 82*91f16700Schasinglulu static const char __unused *shres2str_state(unsigned int state) 83*91f16700Schasinglulu { 84*91f16700Schasinglulu assert(state < ARRAY_SIZE(shres2str_state_tbl)); 85*91f16700Schasinglulu 86*91f16700Schasinglulu return shres2str_state_tbl[state]; 87*91f16700Schasinglulu } 88*91f16700Schasinglulu 89*91f16700Schasinglulu /* Get resource state: these accesses lock the registering support */ 90*91f16700Schasinglulu static void lock_registering(void) 91*91f16700Schasinglulu { 92*91f16700Schasinglulu registering_locked = true; 93*91f16700Schasinglulu } 94*91f16700Schasinglulu 95*91f16700Schasinglulu static bool periph_is_non_secure(enum stm32mp_shres id) 96*91f16700Schasinglulu { 97*91f16700Schasinglulu lock_registering(); 98*91f16700Schasinglulu 99*91f16700Schasinglulu return (shres_state[id] == SHRES_NON_SECURE) || 100*91f16700Schasinglulu (shres_state[id] == SHRES_UNREGISTERED); 101*91f16700Schasinglulu } 102*91f16700Schasinglulu 103*91f16700Schasinglulu static bool periph_is_secure(enum stm32mp_shres id) 104*91f16700Schasinglulu { 105*91f16700Schasinglulu return !periph_is_non_secure(id); 106*91f16700Schasinglulu } 107*91f16700Schasinglulu 108*91f16700Schasinglulu /* GPIOZ pin count is saved in RAM to prevent parsing FDT several times */ 109*91f16700Schasinglulu static int8_t gpioz_nbpin = -1; 110*91f16700Schasinglulu 111*91f16700Schasinglulu static unsigned int get_gpio_nbpin(unsigned int bank) 112*91f16700Schasinglulu { 113*91f16700Schasinglulu if (bank != GPIO_BANK_Z) { 114*91f16700Schasinglulu int count = fdt_get_gpio_bank_pin_count(bank); 115*91f16700Schasinglulu 116*91f16700Schasinglulu assert((count >= 0) && ((unsigned int)count <= (GPIO_PIN_MAX + 1))); 117*91f16700Schasinglulu 118*91f16700Schasinglulu return (unsigned int)count; 119*91f16700Schasinglulu } 120*91f16700Schasinglulu 121*91f16700Schasinglulu if (gpioz_nbpin < 0) { 122*91f16700Schasinglulu int count = fdt_get_gpio_bank_pin_count(GPIO_BANK_Z); 123*91f16700Schasinglulu 124*91f16700Schasinglulu assert((count == 0) || (count == STM32MP_GPIOZ_PIN_MAX_COUNT)); 125*91f16700Schasinglulu 126*91f16700Schasinglulu gpioz_nbpin = count; 127*91f16700Schasinglulu } 128*91f16700Schasinglulu 129*91f16700Schasinglulu return (unsigned int)gpioz_nbpin; 130*91f16700Schasinglulu } 131*91f16700Schasinglulu 132*91f16700Schasinglulu static unsigned int get_gpioz_nbpin(void) 133*91f16700Schasinglulu { 134*91f16700Schasinglulu return get_gpio_nbpin(GPIO_BANK_Z); 135*91f16700Schasinglulu } 136*91f16700Schasinglulu 137*91f16700Schasinglulu static void register_periph(enum stm32mp_shres id, unsigned int state) 138*91f16700Schasinglulu { 139*91f16700Schasinglulu assert((id < STM32MP1_SHRES_COUNT) && 140*91f16700Schasinglulu ((state == SHRES_SECURE) || (state == SHRES_NON_SECURE))); 141*91f16700Schasinglulu 142*91f16700Schasinglulu if (registering_locked) { 143*91f16700Schasinglulu if (shres_state[id] == state) { 144*91f16700Schasinglulu return; 145*91f16700Schasinglulu } 146*91f16700Schasinglulu panic(); 147*91f16700Schasinglulu } 148*91f16700Schasinglulu 149*91f16700Schasinglulu if ((shres_state[id] != SHRES_UNREGISTERED) && 150*91f16700Schasinglulu (shres_state[id] != state)) { 151*91f16700Schasinglulu VERBOSE("Cannot change %s from %s to %s\n", 152*91f16700Schasinglulu shres2str_id(id), 153*91f16700Schasinglulu shres2str_state(shres_state[id]), 154*91f16700Schasinglulu shres2str_state(state)); 155*91f16700Schasinglulu panic(); 156*91f16700Schasinglulu } 157*91f16700Schasinglulu 158*91f16700Schasinglulu if (shres_state[id] == SHRES_UNREGISTERED) { 159*91f16700Schasinglulu VERBOSE("Register %s as %s\n", 160*91f16700Schasinglulu shres2str_id(id), shres2str_state(state)); 161*91f16700Schasinglulu } 162*91f16700Schasinglulu 163*91f16700Schasinglulu if ((id >= STM32MP1_SHRES_GPIOZ(0)) && 164*91f16700Schasinglulu (id <= STM32MP1_SHRES_GPIOZ(7)) && 165*91f16700Schasinglulu ((unsigned int)(id - STM32MP1_SHRES_GPIOZ(0)) >= get_gpioz_nbpin())) { 166*91f16700Schasinglulu ERROR("Invalid GPIO pin %d, %u pin(s) available\n", 167*91f16700Schasinglulu (int)(id - STM32MP1_SHRES_GPIOZ(0)), get_gpioz_nbpin()); 168*91f16700Schasinglulu panic(); 169*91f16700Schasinglulu } 170*91f16700Schasinglulu 171*91f16700Schasinglulu shres_state[id] = (uint8_t)state; 172*91f16700Schasinglulu 173*91f16700Schasinglulu /* Explore clock tree to lock dependencies */ 174*91f16700Schasinglulu if (state == SHRES_SECURE) { 175*91f16700Schasinglulu enum stm32mp_shres clock_res_id; 176*91f16700Schasinglulu 177*91f16700Schasinglulu switch (id) { 178*91f16700Schasinglulu case STM32MP1_SHRES_GPIOZ(0): 179*91f16700Schasinglulu case STM32MP1_SHRES_GPIOZ(1): 180*91f16700Schasinglulu case STM32MP1_SHRES_GPIOZ(2): 181*91f16700Schasinglulu case STM32MP1_SHRES_GPIOZ(3): 182*91f16700Schasinglulu case STM32MP1_SHRES_GPIOZ(4): 183*91f16700Schasinglulu case STM32MP1_SHRES_GPIOZ(5): 184*91f16700Schasinglulu case STM32MP1_SHRES_GPIOZ(6): 185*91f16700Schasinglulu case STM32MP1_SHRES_GPIOZ(7): 186*91f16700Schasinglulu clock_res_id = GPIOZ; 187*91f16700Schasinglulu break; 188*91f16700Schasinglulu case STM32MP1_SHRES_IWDG1: 189*91f16700Schasinglulu clock_res_id = IWDG1; 190*91f16700Schasinglulu break; 191*91f16700Schasinglulu case STM32MP1_SHRES_USART1: 192*91f16700Schasinglulu clock_res_id = USART1_K; 193*91f16700Schasinglulu break; 194*91f16700Schasinglulu case STM32MP1_SHRES_SPI6: 195*91f16700Schasinglulu clock_res_id = SPI6_K; 196*91f16700Schasinglulu break; 197*91f16700Schasinglulu case STM32MP1_SHRES_I2C4: 198*91f16700Schasinglulu clock_res_id = I2C4_K; 199*91f16700Schasinglulu break; 200*91f16700Schasinglulu case STM32MP1_SHRES_RNG1: 201*91f16700Schasinglulu clock_res_id = RNG1_K; 202*91f16700Schasinglulu break; 203*91f16700Schasinglulu case STM32MP1_SHRES_HASH1: 204*91f16700Schasinglulu clock_res_id = HASH1; 205*91f16700Schasinglulu break; 206*91f16700Schasinglulu case STM32MP1_SHRES_CRYP1: 207*91f16700Schasinglulu clock_res_id = CRYP1; 208*91f16700Schasinglulu break; 209*91f16700Schasinglulu case STM32MP1_SHRES_I2C6: 210*91f16700Schasinglulu clock_res_id = I2C6_K; 211*91f16700Schasinglulu break; 212*91f16700Schasinglulu case STM32MP1_SHRES_RTC: 213*91f16700Schasinglulu clock_res_id = RTC; 214*91f16700Schasinglulu break; 215*91f16700Schasinglulu default: 216*91f16700Schasinglulu /* No clock resource dependency */ 217*91f16700Schasinglulu return; 218*91f16700Schasinglulu } 219*91f16700Schasinglulu 220*91f16700Schasinglulu stm32mp1_register_clock_parents_secure(clock_res_id); 221*91f16700Schasinglulu } 222*91f16700Schasinglulu } 223*91f16700Schasinglulu 224*91f16700Schasinglulu /* Register resource by ID */ 225*91f16700Schasinglulu void stm32mp_register_secure_periph(enum stm32mp_shres id) 226*91f16700Schasinglulu { 227*91f16700Schasinglulu register_periph(id, SHRES_SECURE); 228*91f16700Schasinglulu } 229*91f16700Schasinglulu 230*91f16700Schasinglulu void stm32mp_register_non_secure_periph(enum stm32mp_shres id) 231*91f16700Schasinglulu { 232*91f16700Schasinglulu register_periph(id, SHRES_NON_SECURE); 233*91f16700Schasinglulu } 234*91f16700Schasinglulu 235*91f16700Schasinglulu static void register_periph_iomem(uintptr_t base, unsigned int state) 236*91f16700Schasinglulu { 237*91f16700Schasinglulu enum stm32mp_shres id; 238*91f16700Schasinglulu 239*91f16700Schasinglulu switch (base) { 240*91f16700Schasinglulu case CRYP1_BASE: 241*91f16700Schasinglulu id = STM32MP1_SHRES_CRYP1; 242*91f16700Schasinglulu break; 243*91f16700Schasinglulu case HASH1_BASE: 244*91f16700Schasinglulu id = STM32MP1_SHRES_HASH1; 245*91f16700Schasinglulu break; 246*91f16700Schasinglulu case I2C4_BASE: 247*91f16700Schasinglulu id = STM32MP1_SHRES_I2C4; 248*91f16700Schasinglulu break; 249*91f16700Schasinglulu case I2C6_BASE: 250*91f16700Schasinglulu id = STM32MP1_SHRES_I2C6; 251*91f16700Schasinglulu break; 252*91f16700Schasinglulu case IWDG1_BASE: 253*91f16700Schasinglulu id = STM32MP1_SHRES_IWDG1; 254*91f16700Schasinglulu break; 255*91f16700Schasinglulu case RNG1_BASE: 256*91f16700Schasinglulu id = STM32MP1_SHRES_RNG1; 257*91f16700Schasinglulu break; 258*91f16700Schasinglulu case RTC_BASE: 259*91f16700Schasinglulu id = STM32MP1_SHRES_RTC; 260*91f16700Schasinglulu break; 261*91f16700Schasinglulu case SPI6_BASE: 262*91f16700Schasinglulu id = STM32MP1_SHRES_SPI6; 263*91f16700Schasinglulu break; 264*91f16700Schasinglulu case USART1_BASE: 265*91f16700Schasinglulu id = STM32MP1_SHRES_USART1; 266*91f16700Schasinglulu break; 267*91f16700Schasinglulu 268*91f16700Schasinglulu case GPIOA_BASE: 269*91f16700Schasinglulu case GPIOB_BASE: 270*91f16700Schasinglulu case GPIOC_BASE: 271*91f16700Schasinglulu case GPIOD_BASE: 272*91f16700Schasinglulu case GPIOE_BASE: 273*91f16700Schasinglulu case GPIOF_BASE: 274*91f16700Schasinglulu case GPIOG_BASE: 275*91f16700Schasinglulu case GPIOH_BASE: 276*91f16700Schasinglulu case GPIOI_BASE: 277*91f16700Schasinglulu case GPIOJ_BASE: 278*91f16700Schasinglulu case GPIOK_BASE: 279*91f16700Schasinglulu case USART2_BASE: 280*91f16700Schasinglulu case USART3_BASE: 281*91f16700Schasinglulu case UART4_BASE: 282*91f16700Schasinglulu case UART5_BASE: 283*91f16700Schasinglulu case USART6_BASE: 284*91f16700Schasinglulu case UART7_BASE: 285*91f16700Schasinglulu case UART8_BASE: 286*91f16700Schasinglulu case IWDG2_BASE: 287*91f16700Schasinglulu /* Allow drivers to register some non-secure resources */ 288*91f16700Schasinglulu VERBOSE("IO for non-secure resource 0x%x\n", 289*91f16700Schasinglulu (unsigned int)base); 290*91f16700Schasinglulu if (state != SHRES_NON_SECURE) { 291*91f16700Schasinglulu panic(); 292*91f16700Schasinglulu } 293*91f16700Schasinglulu 294*91f16700Schasinglulu return; 295*91f16700Schasinglulu 296*91f16700Schasinglulu default: 297*91f16700Schasinglulu panic(); 298*91f16700Schasinglulu } 299*91f16700Schasinglulu 300*91f16700Schasinglulu register_periph(id, state); 301*91f16700Schasinglulu } 302*91f16700Schasinglulu 303*91f16700Schasinglulu void stm32mp_register_secure_periph_iomem(uintptr_t base) 304*91f16700Schasinglulu { 305*91f16700Schasinglulu register_periph_iomem(base, SHRES_SECURE); 306*91f16700Schasinglulu } 307*91f16700Schasinglulu 308*91f16700Schasinglulu void stm32mp_register_non_secure_periph_iomem(uintptr_t base) 309*91f16700Schasinglulu { 310*91f16700Schasinglulu register_periph_iomem(base, SHRES_NON_SECURE); 311*91f16700Schasinglulu } 312*91f16700Schasinglulu 313*91f16700Schasinglulu void stm32mp_register_secure_gpio(unsigned int bank, unsigned int pin) 314*91f16700Schasinglulu { 315*91f16700Schasinglulu switch (bank) { 316*91f16700Schasinglulu case GPIO_BANK_Z: 317*91f16700Schasinglulu register_periph(STM32MP1_SHRES_GPIOZ(pin), SHRES_SECURE); 318*91f16700Schasinglulu break; 319*91f16700Schasinglulu default: 320*91f16700Schasinglulu ERROR("GPIO bank %u cannot be secured\n", bank); 321*91f16700Schasinglulu panic(); 322*91f16700Schasinglulu } 323*91f16700Schasinglulu } 324*91f16700Schasinglulu 325*91f16700Schasinglulu void stm32mp_register_non_secure_gpio(unsigned int bank, unsigned int pin) 326*91f16700Schasinglulu { 327*91f16700Schasinglulu switch (bank) { 328*91f16700Schasinglulu case GPIO_BANK_Z: 329*91f16700Schasinglulu register_periph(STM32MP1_SHRES_GPIOZ(pin), SHRES_NON_SECURE); 330*91f16700Schasinglulu break; 331*91f16700Schasinglulu default: 332*91f16700Schasinglulu break; 333*91f16700Schasinglulu } 334*91f16700Schasinglulu } 335*91f16700Schasinglulu 336*91f16700Schasinglulu static bool stm32mp_gpio_bank_is_non_secure(unsigned int bank) 337*91f16700Schasinglulu { 338*91f16700Schasinglulu unsigned int non_secure = 0U; 339*91f16700Schasinglulu unsigned int i; 340*91f16700Schasinglulu 341*91f16700Schasinglulu lock_registering(); 342*91f16700Schasinglulu 343*91f16700Schasinglulu if (bank != GPIO_BANK_Z) { 344*91f16700Schasinglulu return true; 345*91f16700Schasinglulu } 346*91f16700Schasinglulu 347*91f16700Schasinglulu for (i = 0U; i < get_gpioz_nbpin(); i++) { 348*91f16700Schasinglulu if (periph_is_non_secure(STM32MP1_SHRES_GPIOZ(i))) { 349*91f16700Schasinglulu non_secure++; 350*91f16700Schasinglulu } 351*91f16700Schasinglulu } 352*91f16700Schasinglulu 353*91f16700Schasinglulu return non_secure == get_gpioz_nbpin(); 354*91f16700Schasinglulu } 355*91f16700Schasinglulu 356*91f16700Schasinglulu static bool stm32mp_gpio_bank_is_secure(unsigned int bank) 357*91f16700Schasinglulu { 358*91f16700Schasinglulu unsigned int secure = 0U; 359*91f16700Schasinglulu unsigned int i; 360*91f16700Schasinglulu 361*91f16700Schasinglulu lock_registering(); 362*91f16700Schasinglulu 363*91f16700Schasinglulu if (bank != GPIO_BANK_Z) { 364*91f16700Schasinglulu return false; 365*91f16700Schasinglulu } 366*91f16700Schasinglulu 367*91f16700Schasinglulu for (i = 0U; i < get_gpioz_nbpin(); i++) { 368*91f16700Schasinglulu if (periph_is_secure(STM32MP1_SHRES_GPIOZ(i))) { 369*91f16700Schasinglulu secure++; 370*91f16700Schasinglulu } 371*91f16700Schasinglulu } 372*91f16700Schasinglulu 373*91f16700Schasinglulu return secure == get_gpioz_nbpin(); 374*91f16700Schasinglulu } 375*91f16700Schasinglulu 376*91f16700Schasinglulu bool stm32mp_nsec_can_access_clock(unsigned long clock_id) 377*91f16700Schasinglulu { 378*91f16700Schasinglulu enum stm32mp_shres shres_id = STM32MP1_SHRES_COUNT; 379*91f16700Schasinglulu 380*91f16700Schasinglulu switch (clock_id) { 381*91f16700Schasinglulu case CK_CSI: 382*91f16700Schasinglulu case CK_HSE: 383*91f16700Schasinglulu case CK_HSE_DIV2: 384*91f16700Schasinglulu case CK_HSI: 385*91f16700Schasinglulu case CK_LSE: 386*91f16700Schasinglulu case CK_LSI: 387*91f16700Schasinglulu case PLL1_P: 388*91f16700Schasinglulu case PLL1_Q: 389*91f16700Schasinglulu case PLL1_R: 390*91f16700Schasinglulu case PLL2_P: 391*91f16700Schasinglulu case PLL2_Q: 392*91f16700Schasinglulu case PLL2_R: 393*91f16700Schasinglulu case PLL3_P: 394*91f16700Schasinglulu case PLL3_Q: 395*91f16700Schasinglulu case PLL3_R: 396*91f16700Schasinglulu case RTCAPB: 397*91f16700Schasinglulu return true; 398*91f16700Schasinglulu case GPIOZ: 399*91f16700Schasinglulu /* Allow clock access if at least one pin is non-secure */ 400*91f16700Schasinglulu return !stm32mp_gpio_bank_is_secure(GPIO_BANK_Z); 401*91f16700Schasinglulu case CRYP1: 402*91f16700Schasinglulu shres_id = STM32MP1_SHRES_CRYP1; 403*91f16700Schasinglulu break; 404*91f16700Schasinglulu case HASH1: 405*91f16700Schasinglulu shres_id = STM32MP1_SHRES_HASH1; 406*91f16700Schasinglulu break; 407*91f16700Schasinglulu case I2C4_K: 408*91f16700Schasinglulu shres_id = STM32MP1_SHRES_I2C4; 409*91f16700Schasinglulu break; 410*91f16700Schasinglulu case I2C6_K: 411*91f16700Schasinglulu shres_id = STM32MP1_SHRES_I2C6; 412*91f16700Schasinglulu break; 413*91f16700Schasinglulu case IWDG1: 414*91f16700Schasinglulu shres_id = STM32MP1_SHRES_IWDG1; 415*91f16700Schasinglulu break; 416*91f16700Schasinglulu case RNG1_K: 417*91f16700Schasinglulu shres_id = STM32MP1_SHRES_RNG1; 418*91f16700Schasinglulu break; 419*91f16700Schasinglulu case RTC: 420*91f16700Schasinglulu shres_id = STM32MP1_SHRES_RTC; 421*91f16700Schasinglulu break; 422*91f16700Schasinglulu case SPI6_K: 423*91f16700Schasinglulu shres_id = STM32MP1_SHRES_SPI6; 424*91f16700Schasinglulu break; 425*91f16700Schasinglulu case USART1_K: 426*91f16700Schasinglulu shres_id = STM32MP1_SHRES_USART1; 427*91f16700Schasinglulu break; 428*91f16700Schasinglulu default: 429*91f16700Schasinglulu return false; 430*91f16700Schasinglulu } 431*91f16700Schasinglulu 432*91f16700Schasinglulu return periph_is_non_secure(shres_id); 433*91f16700Schasinglulu } 434*91f16700Schasinglulu 435*91f16700Schasinglulu bool stm32mp_nsec_can_access_reset(unsigned int reset_id) 436*91f16700Schasinglulu { 437*91f16700Schasinglulu enum stm32mp_shres shres_id = STM32MP1_SHRES_COUNT; 438*91f16700Schasinglulu 439*91f16700Schasinglulu switch (reset_id) { 440*91f16700Schasinglulu case CRYP1_R: 441*91f16700Schasinglulu shres_id = STM32MP1_SHRES_CRYP1; 442*91f16700Schasinglulu break; 443*91f16700Schasinglulu case GPIOZ_R: 444*91f16700Schasinglulu /* GPIOZ reset mandates all pins are non-secure */ 445*91f16700Schasinglulu return stm32mp_gpio_bank_is_non_secure(GPIO_BANK_Z); 446*91f16700Schasinglulu case HASH1_R: 447*91f16700Schasinglulu shres_id = STM32MP1_SHRES_HASH1; 448*91f16700Schasinglulu break; 449*91f16700Schasinglulu case I2C4_R: 450*91f16700Schasinglulu shres_id = STM32MP1_SHRES_I2C4; 451*91f16700Schasinglulu break; 452*91f16700Schasinglulu case I2C6_R: 453*91f16700Schasinglulu shres_id = STM32MP1_SHRES_I2C6; 454*91f16700Schasinglulu break; 455*91f16700Schasinglulu case MCU_R: 456*91f16700Schasinglulu shres_id = STM32MP1_SHRES_MCU; 457*91f16700Schasinglulu break; 458*91f16700Schasinglulu case MDMA_R: 459*91f16700Schasinglulu shres_id = STM32MP1_SHRES_MDMA; 460*91f16700Schasinglulu break; 461*91f16700Schasinglulu case RNG1_R: 462*91f16700Schasinglulu shres_id = STM32MP1_SHRES_RNG1; 463*91f16700Schasinglulu break; 464*91f16700Schasinglulu case SPI6_R: 465*91f16700Schasinglulu shres_id = STM32MP1_SHRES_SPI6; 466*91f16700Schasinglulu break; 467*91f16700Schasinglulu case USART1_R: 468*91f16700Schasinglulu shres_id = STM32MP1_SHRES_USART1; 469*91f16700Schasinglulu break; 470*91f16700Schasinglulu default: 471*91f16700Schasinglulu return false; 472*91f16700Schasinglulu } 473*91f16700Schasinglulu 474*91f16700Schasinglulu return periph_is_non_secure(shres_id); 475*91f16700Schasinglulu } 476*91f16700Schasinglulu 477*91f16700Schasinglulu static bool mckprot_protects_periph(enum stm32mp_shres id) 478*91f16700Schasinglulu { 479*91f16700Schasinglulu switch (id) { 480*91f16700Schasinglulu case STM32MP1_SHRES_MCU: 481*91f16700Schasinglulu case STM32MP1_SHRES_PLL3: 482*91f16700Schasinglulu return true; 483*91f16700Schasinglulu default: 484*91f16700Schasinglulu return false; 485*91f16700Schasinglulu } 486*91f16700Schasinglulu } 487*91f16700Schasinglulu 488*91f16700Schasinglulu /* ETZPC configuration at drivers initialization completion */ 489*91f16700Schasinglulu static enum etzpc_decprot_attributes shres2decprot_attr(enum stm32mp_shres id) 490*91f16700Schasinglulu { 491*91f16700Schasinglulu assert((id < STM32MP1_SHRES_GPIOZ(0)) || 492*91f16700Schasinglulu (id > STM32MP1_SHRES_GPIOZ(7))); 493*91f16700Schasinglulu 494*91f16700Schasinglulu if (periph_is_non_secure(id)) { 495*91f16700Schasinglulu return ETZPC_DECPROT_NS_RW; 496*91f16700Schasinglulu } 497*91f16700Schasinglulu 498*91f16700Schasinglulu return ETZPC_DECPROT_S_RW; 499*91f16700Schasinglulu } 500*91f16700Schasinglulu 501*91f16700Schasinglulu static void set_etzpc_secure_configuration(void) 502*91f16700Schasinglulu { 503*91f16700Schasinglulu /* Some system peripherals shall be secure */ 504*91f16700Schasinglulu etzpc_configure_decprot(STM32MP1_ETZPC_STGENC_ID, ETZPC_DECPROT_S_RW); 505*91f16700Schasinglulu etzpc_configure_decprot(STM32MP1_ETZPC_BKPSRAM_ID, ETZPC_DECPROT_S_RW); 506*91f16700Schasinglulu etzpc_configure_decprot(STM32MP1_ETZPC_DDRCTRL_ID, 507*91f16700Schasinglulu ETZPC_DECPROT_NS_R_S_W); 508*91f16700Schasinglulu etzpc_configure_decprot(STM32MP1_ETZPC_DDRPHYC_ID, 509*91f16700Schasinglulu ETZPC_DECPROT_NS_R_S_W); 510*91f16700Schasinglulu 511*91f16700Schasinglulu /* Configure ETZPC with peripheral registering */ 512*91f16700Schasinglulu etzpc_configure_decprot(STM32MP1_ETZPC_CRYP1_ID, 513*91f16700Schasinglulu shres2decprot_attr(STM32MP1_SHRES_CRYP1)); 514*91f16700Schasinglulu etzpc_configure_decprot(STM32MP1_ETZPC_HASH1_ID, 515*91f16700Schasinglulu shres2decprot_attr(STM32MP1_SHRES_HASH1)); 516*91f16700Schasinglulu etzpc_configure_decprot(STM32MP1_ETZPC_I2C4_ID, 517*91f16700Schasinglulu shres2decprot_attr(STM32MP1_SHRES_I2C4)); 518*91f16700Schasinglulu etzpc_configure_decprot(STM32MP1_ETZPC_I2C6_ID, 519*91f16700Schasinglulu shres2decprot_attr(STM32MP1_SHRES_I2C6)); 520*91f16700Schasinglulu etzpc_configure_decprot(STM32MP1_ETZPC_IWDG1_ID, 521*91f16700Schasinglulu shres2decprot_attr(STM32MP1_SHRES_IWDG1)); 522*91f16700Schasinglulu etzpc_configure_decprot(STM32MP1_ETZPC_RNG1_ID, 523*91f16700Schasinglulu shres2decprot_attr(STM32MP1_SHRES_RNG1)); 524*91f16700Schasinglulu etzpc_configure_decprot(STM32MP1_ETZPC_USART1_ID, 525*91f16700Schasinglulu shres2decprot_attr(STM32MP1_SHRES_USART1)); 526*91f16700Schasinglulu etzpc_configure_decprot(STM32MP1_ETZPC_SPI6_ID, 527*91f16700Schasinglulu shres2decprot_attr(STM32MP1_SHRES_SPI6)); 528*91f16700Schasinglulu } 529*91f16700Schasinglulu 530*91f16700Schasinglulu static void check_rcc_secure_configuration(void) 531*91f16700Schasinglulu { 532*91f16700Schasinglulu uint32_t n; 533*91f16700Schasinglulu uint32_t error = 0U; 534*91f16700Schasinglulu bool mckprot = stm32mp1_rcc_is_mckprot(); 535*91f16700Schasinglulu bool secure = stm32mp1_rcc_is_secure(); 536*91f16700Schasinglulu 537*91f16700Schasinglulu for (n = 0U; n < ARRAY_SIZE(shres_state); n++) { 538*91f16700Schasinglulu if (shres_state[n] != SHRES_SECURE) { 539*91f16700Schasinglulu continue; 540*91f16700Schasinglulu } 541*91f16700Schasinglulu 542*91f16700Schasinglulu if (!secure || (mckprot_protects_periph(n) && (!mckprot))) { 543*91f16700Schasinglulu ERROR("RCC %s MCKPROT %s and %s secure\n", 544*91f16700Schasinglulu secure ? "secure" : "non-secure", 545*91f16700Schasinglulu mckprot ? "set" : "not set", 546*91f16700Schasinglulu shres2str_id(n)); 547*91f16700Schasinglulu error++; 548*91f16700Schasinglulu } 549*91f16700Schasinglulu } 550*91f16700Schasinglulu 551*91f16700Schasinglulu if (error != 0U) { 552*91f16700Schasinglulu panic(); 553*91f16700Schasinglulu } 554*91f16700Schasinglulu } 555*91f16700Schasinglulu 556*91f16700Schasinglulu static void set_gpio_secure_configuration(void) 557*91f16700Schasinglulu { 558*91f16700Schasinglulu uint32_t pin; 559*91f16700Schasinglulu 560*91f16700Schasinglulu for (pin = 0U; pin < get_gpioz_nbpin(); pin++) { 561*91f16700Schasinglulu bool secure_state = periph_is_secure(STM32MP1_SHRES_GPIOZ(pin)); 562*91f16700Schasinglulu 563*91f16700Schasinglulu set_gpio_secure_cfg(GPIO_BANK_Z, pin, secure_state); 564*91f16700Schasinglulu } 565*91f16700Schasinglulu } 566*91f16700Schasinglulu 567*91f16700Schasinglulu static void print_shared_resources_state(void) 568*91f16700Schasinglulu { 569*91f16700Schasinglulu unsigned int id; 570*91f16700Schasinglulu 571*91f16700Schasinglulu for (id = 0U; id < STM32MP1_SHRES_COUNT; id++) { 572*91f16700Schasinglulu switch (shres_state[id]) { 573*91f16700Schasinglulu case SHRES_SECURE: 574*91f16700Schasinglulu INFO("stm32mp1 %s is secure\n", shres2str_id(id)); 575*91f16700Schasinglulu break; 576*91f16700Schasinglulu case SHRES_NON_SECURE: 577*91f16700Schasinglulu case SHRES_UNREGISTERED: 578*91f16700Schasinglulu VERBOSE("stm32mp %s is non-secure\n", shres2str_id(id)); 579*91f16700Schasinglulu break; 580*91f16700Schasinglulu default: 581*91f16700Schasinglulu VERBOSE("stm32mp %s is invalid\n", shres2str_id(id)); 582*91f16700Schasinglulu panic(); 583*91f16700Schasinglulu } 584*91f16700Schasinglulu } 585*91f16700Schasinglulu } 586*91f16700Schasinglulu 587*91f16700Schasinglulu void stm32mp_lock_periph_registering(void) 588*91f16700Schasinglulu { 589*91f16700Schasinglulu registering_locked = true; 590*91f16700Schasinglulu 591*91f16700Schasinglulu print_shared_resources_state(); 592*91f16700Schasinglulu 593*91f16700Schasinglulu check_rcc_secure_configuration(); 594*91f16700Schasinglulu set_etzpc_secure_configuration(); 595*91f16700Schasinglulu set_gpio_secure_configuration(); 596*91f16700Schasinglulu } 597