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 <errno.h> 9*91f16700Schasinglulu #include <stdint.h> 10*91f16700Schasinglulu 11*91f16700Schasinglulu #include <arch_helpers.h> 12*91f16700Schasinglulu #include <common/debug.h> 13*91f16700Schasinglulu #include <drivers/st/etzpc.h> 14*91f16700Schasinglulu #include <dt-bindings/soc/st,stm32-etzpc.h> 15*91f16700Schasinglulu #include <lib/mmio.h> 16*91f16700Schasinglulu #include <lib/utils_def.h> 17*91f16700Schasinglulu #include <libfdt.h> 18*91f16700Schasinglulu 19*91f16700Schasinglulu #include <platform_def.h> 20*91f16700Schasinglulu 21*91f16700Schasinglulu /* Device Tree related definitions */ 22*91f16700Schasinglulu #define ETZPC_COMPAT "st,stm32-etzpc" 23*91f16700Schasinglulu #define ETZPC_LOCK_MASK 0x1U 24*91f16700Schasinglulu #define ETZPC_MODE_SHIFT 8 25*91f16700Schasinglulu #define ETZPC_MODE_MASK GENMASK(1, 0) 26*91f16700Schasinglulu #define ETZPC_ID_SHIFT 16 27*91f16700Schasinglulu #define ETZPC_ID_MASK GENMASK(7, 0) 28*91f16700Schasinglulu 29*91f16700Schasinglulu /* ID Registers */ 30*91f16700Schasinglulu #define ETZPC_TZMA0_SIZE 0x000U 31*91f16700Schasinglulu #define ETZPC_DECPROT0 0x010U 32*91f16700Schasinglulu #define ETZPC_DECPROT_LOCK0 0x030U 33*91f16700Schasinglulu #define ETZPC_HWCFGR 0x3F0U 34*91f16700Schasinglulu #define ETZPC_VERR 0x3F4U 35*91f16700Schasinglulu 36*91f16700Schasinglulu /* ID Registers fields */ 37*91f16700Schasinglulu #define ETZPC_TZMA0_SIZE_LOCK BIT(31) 38*91f16700Schasinglulu #define ETZPC_DECPROT0_MASK GENMASK(1, 0) 39*91f16700Schasinglulu #define ETZPC_HWCFGR_NUM_TZMA_SHIFT 0 40*91f16700Schasinglulu #define ETZPC_HWCFGR_NUM_PER_SEC_SHIFT 8 41*91f16700Schasinglulu #define ETZPC_HWCFGR_NUM_AHB_SEC_SHIFT 16 42*91f16700Schasinglulu #define ETZPC_HWCFGR_CHUNCKS1N4_SHIFT 24 43*91f16700Schasinglulu 44*91f16700Schasinglulu #define DECPROT_SHIFT 1 45*91f16700Schasinglulu #define IDS_PER_DECPROT_REGS 16U 46*91f16700Schasinglulu #define IDS_PER_DECPROT_LOCK_REGS 32U 47*91f16700Schasinglulu 48*91f16700Schasinglulu /* 49*91f16700Schasinglulu * etzpc_instance. 50*91f16700Schasinglulu * base : register base address set during init given by user 51*91f16700Schasinglulu * chunk_size : supported TZMA size steps 52*91f16700Schasinglulu * num_tzma: number of TZMA zone read from register at init 53*91f16700Schasinglulu * num_ahb_sec : number of securable AHB master zone read from register 54*91f16700Schasinglulu * num_per_sec : number of securable AHB & APB Peripherals read from register 55*91f16700Schasinglulu * revision : IP revision read from register at init 56*91f16700Schasinglulu */ 57*91f16700Schasinglulu struct etzpc_instance { 58*91f16700Schasinglulu uintptr_t base; 59*91f16700Schasinglulu uint8_t chunck_size; 60*91f16700Schasinglulu uint8_t num_tzma; 61*91f16700Schasinglulu uint8_t num_per_sec; 62*91f16700Schasinglulu uint8_t num_ahb_sec; 63*91f16700Schasinglulu uint8_t revision; 64*91f16700Schasinglulu }; 65*91f16700Schasinglulu 66*91f16700Schasinglulu /* Only 1 instance of the ETZPC is expected per platform */ 67*91f16700Schasinglulu static struct etzpc_instance etzpc_dev; 68*91f16700Schasinglulu 69*91f16700Schasinglulu /* 70*91f16700Schasinglulu * Implementation uses uint8_t to store each securable DECPROT configuration. 71*91f16700Schasinglulu * When resuming from deep suspend, the DECPROT configurations are restored. 72*91f16700Schasinglulu */ 73*91f16700Schasinglulu #define PERIPH_LOCK_BIT BIT(7) 74*91f16700Schasinglulu #define PERIPH_ATTR_MASK GENMASK(2, 0) 75*91f16700Schasinglulu 76*91f16700Schasinglulu #if ENABLE_ASSERTIONS 77*91f16700Schasinglulu static bool valid_decprot_id(unsigned int id) 78*91f16700Schasinglulu { 79*91f16700Schasinglulu return id < (unsigned int)etzpc_dev.num_per_sec; 80*91f16700Schasinglulu } 81*91f16700Schasinglulu 82*91f16700Schasinglulu static bool valid_tzma_id(unsigned int id) 83*91f16700Schasinglulu { 84*91f16700Schasinglulu return id < (unsigned int)etzpc_dev.num_tzma; 85*91f16700Schasinglulu } 86*91f16700Schasinglulu #endif 87*91f16700Schasinglulu 88*91f16700Schasinglulu /* 89*91f16700Schasinglulu * etzpc_configure_decprot : Load a DECPROT configuration 90*91f16700Schasinglulu * decprot_id : ID of the IP 91*91f16700Schasinglulu * decprot_attr : Restriction access attribute 92*91f16700Schasinglulu */ 93*91f16700Schasinglulu void etzpc_configure_decprot(uint32_t decprot_id, 94*91f16700Schasinglulu enum etzpc_decprot_attributes decprot_attr) 95*91f16700Schasinglulu { 96*91f16700Schasinglulu uintptr_t offset = 4U * (decprot_id / IDS_PER_DECPROT_REGS); 97*91f16700Schasinglulu uint32_t shift = (decprot_id % IDS_PER_DECPROT_REGS) << DECPROT_SHIFT; 98*91f16700Schasinglulu uint32_t masked_decprot = (uint32_t)decprot_attr & ETZPC_DECPROT0_MASK; 99*91f16700Schasinglulu 100*91f16700Schasinglulu assert(valid_decprot_id(decprot_id)); 101*91f16700Schasinglulu 102*91f16700Schasinglulu mmio_clrsetbits_32(etzpc_dev.base + ETZPC_DECPROT0 + offset, 103*91f16700Schasinglulu (uint32_t)ETZPC_DECPROT0_MASK << shift, 104*91f16700Schasinglulu masked_decprot << shift); 105*91f16700Schasinglulu } 106*91f16700Schasinglulu 107*91f16700Schasinglulu /* 108*91f16700Schasinglulu * etzpc_get_decprot : Get the DECPROT attribute 109*91f16700Schasinglulu * decprot_id : ID of the IP 110*91f16700Schasinglulu * return : Attribute of this DECPROT 111*91f16700Schasinglulu */ 112*91f16700Schasinglulu enum etzpc_decprot_attributes etzpc_get_decprot(uint32_t decprot_id) 113*91f16700Schasinglulu { 114*91f16700Schasinglulu uintptr_t offset = 4U * (decprot_id / IDS_PER_DECPROT_REGS); 115*91f16700Schasinglulu uint32_t shift = (decprot_id % IDS_PER_DECPROT_REGS) << DECPROT_SHIFT; 116*91f16700Schasinglulu uintptr_t base_decprot = etzpc_dev.base + offset; 117*91f16700Schasinglulu uint32_t value; 118*91f16700Schasinglulu 119*91f16700Schasinglulu assert(valid_decprot_id(decprot_id)); 120*91f16700Schasinglulu 121*91f16700Schasinglulu value = (mmio_read_32(base_decprot + ETZPC_DECPROT0) >> shift) & 122*91f16700Schasinglulu ETZPC_DECPROT0_MASK; 123*91f16700Schasinglulu 124*91f16700Schasinglulu return (enum etzpc_decprot_attributes)value; 125*91f16700Schasinglulu } 126*91f16700Schasinglulu 127*91f16700Schasinglulu /* 128*91f16700Schasinglulu * etzpc_lock_decprot : Lock access to the DECPROT attribute 129*91f16700Schasinglulu * decprot_id : ID of the IP 130*91f16700Schasinglulu */ 131*91f16700Schasinglulu void etzpc_lock_decprot(uint32_t decprot_id) 132*91f16700Schasinglulu { 133*91f16700Schasinglulu uintptr_t offset = 4U * (decprot_id / IDS_PER_DECPROT_LOCK_REGS); 134*91f16700Schasinglulu uint32_t shift = BIT(decprot_id % IDS_PER_DECPROT_LOCK_REGS); 135*91f16700Schasinglulu uintptr_t base_decprot = etzpc_dev.base + offset; 136*91f16700Schasinglulu 137*91f16700Schasinglulu assert(valid_decprot_id(decprot_id)); 138*91f16700Schasinglulu 139*91f16700Schasinglulu mmio_write_32(base_decprot + ETZPC_DECPROT_LOCK0, shift); 140*91f16700Schasinglulu } 141*91f16700Schasinglulu 142*91f16700Schasinglulu /* 143*91f16700Schasinglulu * etzpc_configure_tzma : Configure the target TZMA read only size 144*91f16700Schasinglulu * tzma_id : ID of the memory 145*91f16700Schasinglulu * tzma_value : read-only size 146*91f16700Schasinglulu */ 147*91f16700Schasinglulu void etzpc_configure_tzma(uint32_t tzma_id, uint16_t tzma_value) 148*91f16700Schasinglulu { 149*91f16700Schasinglulu assert(valid_tzma_id(tzma_id)); 150*91f16700Schasinglulu 151*91f16700Schasinglulu mmio_write_32(etzpc_dev.base + ETZPC_TZMA0_SIZE + 152*91f16700Schasinglulu (sizeof(uint32_t) * tzma_id), tzma_value); 153*91f16700Schasinglulu } 154*91f16700Schasinglulu 155*91f16700Schasinglulu /* 156*91f16700Schasinglulu * etzpc_get_tzma : Get the target TZMA read only size 157*91f16700Schasinglulu * tzma_id : TZMA ID 158*91f16700Schasinglulu * return : Size of read only size 159*91f16700Schasinglulu */ 160*91f16700Schasinglulu uint16_t etzpc_get_tzma(uint32_t tzma_id) 161*91f16700Schasinglulu { 162*91f16700Schasinglulu assert(valid_tzma_id(tzma_id)); 163*91f16700Schasinglulu 164*91f16700Schasinglulu return (uint16_t)mmio_read_32(etzpc_dev.base + ETZPC_TZMA0_SIZE + 165*91f16700Schasinglulu (sizeof(uint32_t) * tzma_id)); 166*91f16700Schasinglulu } 167*91f16700Schasinglulu 168*91f16700Schasinglulu /* 169*91f16700Schasinglulu * etzpc_lock_tzma : Lock the target TZMA 170*91f16700Schasinglulu * tzma_id : TZMA ID 171*91f16700Schasinglulu */ 172*91f16700Schasinglulu void etzpc_lock_tzma(uint32_t tzma_id) 173*91f16700Schasinglulu { 174*91f16700Schasinglulu assert(valid_tzma_id(tzma_id)); 175*91f16700Schasinglulu 176*91f16700Schasinglulu mmio_setbits_32(etzpc_dev.base + ETZPC_TZMA0_SIZE + 177*91f16700Schasinglulu (sizeof(uint32_t) * tzma_id), ETZPC_TZMA0_SIZE_LOCK); 178*91f16700Schasinglulu } 179*91f16700Schasinglulu 180*91f16700Schasinglulu /* 181*91f16700Schasinglulu * etzpc_get_lock_tzma : Return the lock status of the target TZMA 182*91f16700Schasinglulu * tzma_id : TZMA ID 183*91f16700Schasinglulu * return : True if TZMA is locked, false otherwise 184*91f16700Schasinglulu */ 185*91f16700Schasinglulu bool etzpc_get_lock_tzma(uint32_t tzma_id) 186*91f16700Schasinglulu { 187*91f16700Schasinglulu uint32_t tzma_size; 188*91f16700Schasinglulu 189*91f16700Schasinglulu assert(valid_tzma_id(tzma_id)); 190*91f16700Schasinglulu 191*91f16700Schasinglulu tzma_size = mmio_read_32(etzpc_dev.base + ETZPC_TZMA0_SIZE + 192*91f16700Schasinglulu (sizeof(uint32_t) * tzma_id)); 193*91f16700Schasinglulu 194*91f16700Schasinglulu return (tzma_size & ETZPC_TZMA0_SIZE_LOCK) != 0; 195*91f16700Schasinglulu } 196*91f16700Schasinglulu 197*91f16700Schasinglulu /* 198*91f16700Schasinglulu * etzpc_get_num_per_sec : Return the DECPROT ID limit value 199*91f16700Schasinglulu */ 200*91f16700Schasinglulu uint8_t etzpc_get_num_per_sec(void) 201*91f16700Schasinglulu { 202*91f16700Schasinglulu return etzpc_dev.num_per_sec; 203*91f16700Schasinglulu } 204*91f16700Schasinglulu 205*91f16700Schasinglulu /* 206*91f16700Schasinglulu * etzpc_get_revision : Return the ETZPC IP revision 207*91f16700Schasinglulu */ 208*91f16700Schasinglulu uint8_t etzpc_get_revision(void) 209*91f16700Schasinglulu { 210*91f16700Schasinglulu return etzpc_dev.revision; 211*91f16700Schasinglulu } 212*91f16700Schasinglulu 213*91f16700Schasinglulu /* 214*91f16700Schasinglulu * etzpc_get_base_address : Return the ETZPC IP base address 215*91f16700Schasinglulu */ 216*91f16700Schasinglulu uintptr_t etzpc_get_base_address(void) 217*91f16700Schasinglulu { 218*91f16700Schasinglulu return etzpc_dev.base; 219*91f16700Schasinglulu } 220*91f16700Schasinglulu 221*91f16700Schasinglulu /* 222*91f16700Schasinglulu * etzpc_init : Initialize the ETZPC driver 223*91f16700Schasinglulu * Return 0 on success and a negative errno on failure 224*91f16700Schasinglulu */ 225*91f16700Schasinglulu int etzpc_init(void) 226*91f16700Schasinglulu { 227*91f16700Schasinglulu uint32_t hwcfg; 228*91f16700Schasinglulu 229*91f16700Schasinglulu etzpc_dev.base = STM32MP1_ETZPC_BASE; 230*91f16700Schasinglulu 231*91f16700Schasinglulu hwcfg = mmio_read_32(etzpc_dev.base + ETZPC_HWCFGR); 232*91f16700Schasinglulu 233*91f16700Schasinglulu etzpc_dev.num_tzma = (uint8_t)(hwcfg >> ETZPC_HWCFGR_NUM_TZMA_SHIFT); 234*91f16700Schasinglulu etzpc_dev.num_per_sec = (uint8_t)(hwcfg >> 235*91f16700Schasinglulu ETZPC_HWCFGR_NUM_PER_SEC_SHIFT); 236*91f16700Schasinglulu etzpc_dev.num_ahb_sec = (uint8_t)(hwcfg >> 237*91f16700Schasinglulu ETZPC_HWCFGR_NUM_AHB_SEC_SHIFT); 238*91f16700Schasinglulu etzpc_dev.chunck_size = (uint8_t)(hwcfg >> 239*91f16700Schasinglulu ETZPC_HWCFGR_CHUNCKS1N4_SHIFT); 240*91f16700Schasinglulu 241*91f16700Schasinglulu etzpc_dev.revision = mmio_read_8(etzpc_dev.base + ETZPC_VERR); 242*91f16700Schasinglulu 243*91f16700Schasinglulu VERBOSE("ETZPC version 0x%x", etzpc_dev.revision); 244*91f16700Schasinglulu 245*91f16700Schasinglulu return 0; 246*91f16700Schasinglulu } 247