1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2017-2019, STMicroelectronics - All Rights Reserved 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park #ifndef BSEC_H 8*54fd6939SJiyong Park #define BSEC_H 9*54fd6939SJiyong Park 10*54fd6939SJiyong Park #include <stdbool.h> 11*54fd6939SJiyong Park #include <stdint.h> 12*54fd6939SJiyong Park 13*54fd6939SJiyong Park #include <lib/utils_def.h> 14*54fd6939SJiyong Park 15*54fd6939SJiyong Park /* 16*54fd6939SJiyong Park * IP configuration 17*54fd6939SJiyong Park */ 18*54fd6939SJiyong Park #define BSEC_OTP_MASK GENMASK(4, 0) 19*54fd6939SJiyong Park #define BSEC_OTP_BANK_SHIFT 5 20*54fd6939SJiyong Park #define BSEC_TIMEOUT_VALUE 0xFFFF 21*54fd6939SJiyong Park 22*54fd6939SJiyong Park #define ADDR_LOWER_OTP_PERLOCK_SHIFT 0x03 23*54fd6939SJiyong Park #define DATA_LOWER_OTP_PERLOCK_BIT 0x03U /* 2 significants bits are used */ 24*54fd6939SJiyong Park #define DATA_LOWER_OTP_PERLOCK_MASK GENMASK(2, 0) 25*54fd6939SJiyong Park #define ADDR_UPPER_OTP_PERLOCK_SHIFT 0x04 26*54fd6939SJiyong Park #define DATA_UPPER_OTP_PERLOCK_BIT 0x01U /* 1 significants bits are used */ 27*54fd6939SJiyong Park #define DATA_UPPER_OTP_PERLOCK_MASK GENMASK(3, 0) 28*54fd6939SJiyong Park 29*54fd6939SJiyong Park /* 30*54fd6939SJiyong Park * Return status 31*54fd6939SJiyong Park */ 32*54fd6939SJiyong Park #define BSEC_OK 0U 33*54fd6939SJiyong Park #define BSEC_ERROR 0xFFFFFFFFU 34*54fd6939SJiyong Park #define BSEC_DISTURBED 0xFFFFFFFEU 35*54fd6939SJiyong Park #define BSEC_INVALID_PARAM 0xFFFFFFFCU 36*54fd6939SJiyong Park #define BSEC_PROG_FAIL 0xFFFFFFFBU 37*54fd6939SJiyong Park #define BSEC_LOCK_FAIL 0xFFFFFFFAU 38*54fd6939SJiyong Park #define BSEC_WRITE_FAIL 0xFFFFFFF9U 39*54fd6939SJiyong Park #define BSEC_SHADOW_FAIL 0xFFFFFFF8U 40*54fd6939SJiyong Park #define BSEC_TIMEOUT 0xFFFFFFF7U 41*54fd6939SJiyong Park 42*54fd6939SJiyong Park /* 43*54fd6939SJiyong Park * BSEC REGISTER OFFSET (base relative) 44*54fd6939SJiyong Park */ 45*54fd6939SJiyong Park #define BSEC_OTP_CONF_OFF 0x000U 46*54fd6939SJiyong Park #define BSEC_OTP_CTRL_OFF 0x004U 47*54fd6939SJiyong Park #define BSEC_OTP_WRDATA_OFF 0x008U 48*54fd6939SJiyong Park #define BSEC_OTP_STATUS_OFF 0x00CU 49*54fd6939SJiyong Park #define BSEC_OTP_LOCK_OFF 0x010U 50*54fd6939SJiyong Park #define BSEC_DEN_OFF 0x014U 51*54fd6939SJiyong Park #define BSEC_DISTURBED_OFF 0x01CU 52*54fd6939SJiyong Park #define BSEC_DISTURBED1_OFF 0x020U 53*54fd6939SJiyong Park #define BSEC_DISTURBED2_OFF 0x024U 54*54fd6939SJiyong Park #define BSEC_ERROR_OFF 0x034U 55*54fd6939SJiyong Park #define BSEC_ERROR1_OFF 0x038U 56*54fd6939SJiyong Park #define BSEC_ERROR2_OFF 0x03CU 57*54fd6939SJiyong Park #define BSEC_WRLOCK_OFF 0x04CU /* Safmem permanent lock */ 58*54fd6939SJiyong Park #define BSEC_WRLOCK1_OFF 0x050U 59*54fd6939SJiyong Park #define BSEC_WRLOCK2_OFF 0x054U 60*54fd6939SJiyong Park #define BSEC_SPLOCK_OFF 0x064U /* Program safmem sticky lock */ 61*54fd6939SJiyong Park #define BSEC_SPLOCK1_OFF 0x068U 62*54fd6939SJiyong Park #define BSEC_SPLOCK2_OFF 0x06CU 63*54fd6939SJiyong Park #define BSEC_SWLOCK_OFF 0x07CU /* Write in OTP sticky lock */ 64*54fd6939SJiyong Park #define BSEC_SWLOCK1_OFF 0x080U 65*54fd6939SJiyong Park #define BSEC_SWLOCK2_OFF 0x084U 66*54fd6939SJiyong Park #define BSEC_SRLOCK_OFF 0x094U /* Shadowing sticky lock */ 67*54fd6939SJiyong Park #define BSEC_SRLOCK1_OFF 0x098U 68*54fd6939SJiyong Park #define BSEC_SRLOCK2_OFF 0x09CU 69*54fd6939SJiyong Park #define BSEC_JTAG_IN_OFF 0x0ACU 70*54fd6939SJiyong Park #define BSEC_JTAG_OUT_OFF 0x0B0U 71*54fd6939SJiyong Park #define BSEC_SCRATCH_OFF 0x0B4U 72*54fd6939SJiyong Park #define BSEC_OTP_DATA_OFF 0x200U 73*54fd6939SJiyong Park #define BSEC_IPHW_CFG_OFF 0xFF0U 74*54fd6939SJiyong Park #define BSEC_IPVR_OFF 0xFF4U 75*54fd6939SJiyong Park #define BSEC_IP_ID_OFF 0xFF8U 76*54fd6939SJiyong Park #define BSEC_IP_MAGIC_ID_OFF 0xFFCU 77*54fd6939SJiyong Park 78*54fd6939SJiyong Park /* 79*54fd6939SJiyong Park * BSEC_CONFIGURATION Register 80*54fd6939SJiyong Park */ 81*54fd6939SJiyong Park #define BSEC_CONF_POWER_UP_MASK BIT(0) 82*54fd6939SJiyong Park #define BSEC_CONF_POWER_UP_SHIFT 0 83*54fd6939SJiyong Park #define BSEC_CONF_FRQ_MASK GENMASK(2, 1) 84*54fd6939SJiyong Park #define BSEC_CONF_FRQ_SHIFT 1 85*54fd6939SJiyong Park #define BSEC_CONF_PRG_WIDTH_MASK GENMASK(6, 3) 86*54fd6939SJiyong Park #define BSEC_CONF_PRG_WIDTH_SHIFT 3 87*54fd6939SJiyong Park #define BSEC_CONF_TREAD_MASK GENMASK(8, 7) 88*54fd6939SJiyong Park #define BSEC_CONF_TREAD_SHIFT 7 89*54fd6939SJiyong Park 90*54fd6939SJiyong Park /* 91*54fd6939SJiyong Park * BSEC_CONTROL Register 92*54fd6939SJiyong Park */ 93*54fd6939SJiyong Park #define BSEC_READ 0x000U 94*54fd6939SJiyong Park #define BSEC_WRITE 0x100U 95*54fd6939SJiyong Park #define BSEC_LOCK 0x200U 96*54fd6939SJiyong Park 97*54fd6939SJiyong Park /* 98*54fd6939SJiyong Park * BSEC_OTP_LOCK register 99*54fd6939SJiyong Park */ 100*54fd6939SJiyong Park #define UPPER_OTP_LOCK_MASK BIT(0) 101*54fd6939SJiyong Park #define UPPER_OTP_LOCK_SHIFT 0 102*54fd6939SJiyong Park #define DENREG_LOCK_MASK BIT(2) 103*54fd6939SJiyong Park #define DENREG_LOCK_SHIFT 2 104*54fd6939SJiyong Park #define GPLOCK_LOCK_MASK BIT(4) 105*54fd6939SJiyong Park #define GPLOCK_LOCK_SHIFT 4 106*54fd6939SJiyong Park 107*54fd6939SJiyong Park /* 108*54fd6939SJiyong Park * BSEC_OTP_STATUS Register 109*54fd6939SJiyong Park */ 110*54fd6939SJiyong Park #define BSEC_MODE_STATUS_MASK GENMASK(2, 0) 111*54fd6939SJiyong Park #define BSEC_MODE_BUSY_MASK BIT(3) 112*54fd6939SJiyong Park #define BSEC_MODE_PROGFAIL_MASK BIT(4) 113*54fd6939SJiyong Park #define BSEC_MODE_PWR_MASK BIT(5) 114*54fd6939SJiyong Park #define BSEC_MODE_BIST1_LOCK_MASK BIT(6) 115*54fd6939SJiyong Park #define BSEC_MODE_BIST2_LOCK_MASK BIT(7) 116*54fd6939SJiyong Park 117*54fd6939SJiyong Park /* OTP MODE*/ 118*54fd6939SJiyong Park #define BSEC_MODE_OPEN1 0x00 119*54fd6939SJiyong Park #define BSEC_MODE_SECURED 0x01 120*54fd6939SJiyong Park #define BSEC_MODE_OPEN2 0x02 121*54fd6939SJiyong Park #define BSEC_MODE_INVALID 0x04 122*54fd6939SJiyong Park 123*54fd6939SJiyong Park /* BSEC_DENABLE Register */ 124*54fd6939SJiyong Park #define BSEC_HDPEN BIT(4) 125*54fd6939SJiyong Park #define BSEC_SPIDEN BIT(5) 126*54fd6939SJiyong Park #define BSEC_SPINDEN BIT(6) 127*54fd6939SJiyong Park #define BSEC_DBGSWGEN BIT(10) 128*54fd6939SJiyong Park #define BSEC_DEN_ALL_MSK GENMASK(10, 0) 129*54fd6939SJiyong Park 130*54fd6939SJiyong Park /* BSEC_FENABLE Register */ 131*54fd6939SJiyong Park #define BSEC_FEN_ALL_MSK GENMASK(14, 0) 132*54fd6939SJiyong Park 133*54fd6939SJiyong Park /* 134*54fd6939SJiyong Park * OTP Lock services definition 135*54fd6939SJiyong Park * Value must corresponding to the bit number in the register 136*54fd6939SJiyong Park */ 137*54fd6939SJiyong Park #define BSEC_LOCK_UPPER_OTP 0x00 138*54fd6939SJiyong Park #define BSEC_LOCK_DEBUG 0x02 139*54fd6939SJiyong Park #define BSEC_LOCK_PROGRAM 0x03 140*54fd6939SJiyong Park 141*54fd6939SJiyong Park /* Values for struct bsec_config::freq */ 142*54fd6939SJiyong Park #define FREQ_10_20_MHZ 0x0 143*54fd6939SJiyong Park #define FREQ_20_30_MHZ 0x1 144*54fd6939SJiyong Park #define FREQ_30_45_MHZ 0x2 145*54fd6939SJiyong Park #define FREQ_45_67_MHZ 0x3 146*54fd6939SJiyong Park 147*54fd6939SJiyong Park /* 148*54fd6939SJiyong Park * Device info structure, providing device-specific functions and a means of 149*54fd6939SJiyong Park * adding driver-specific state 150*54fd6939SJiyong Park */ 151*54fd6939SJiyong Park struct bsec_config { 152*54fd6939SJiyong Park uint8_t tread; /* SAFMEM Reading current level default 0 */ 153*54fd6939SJiyong Park uint8_t pulse_width; /* SAFMEM Programming pulse width default 1 */ 154*54fd6939SJiyong Park uint8_t freq; /* SAFMEM CLOCK see freq value define 155*54fd6939SJiyong Park * default FREQ_45_67_MHZ 156*54fd6939SJiyong Park */ 157*54fd6939SJiyong Park uint8_t power; /* Power up SAFMEM. 1 power up, 0 power off */ 158*54fd6939SJiyong Park uint8_t prog_lock; /* Programming Sticky lock 159*54fd6939SJiyong Park * 1 programming is locked until next reset 160*54fd6939SJiyong Park */ 161*54fd6939SJiyong Park uint8_t den_lock; /* Debug enable sticky lock 162*54fd6939SJiyong Park * 1 debug enable is locked until next reset 163*54fd6939SJiyong Park */ 164*54fd6939SJiyong Park uint8_t upper_otp_lock; /* Shadowing of upper OTP sticky lock 165*54fd6939SJiyong Park * 1 shadowing of upper OTP is locked 166*54fd6939SJiyong Park * until next reset 167*54fd6939SJiyong Park */ 168*54fd6939SJiyong Park }; 169*54fd6939SJiyong Park 170*54fd6939SJiyong Park uint32_t bsec_probe(void); 171*54fd6939SJiyong Park uint32_t bsec_get_base(void); 172*54fd6939SJiyong Park 173*54fd6939SJiyong Park uint32_t bsec_set_config(struct bsec_config *cfg); 174*54fd6939SJiyong Park uint32_t bsec_get_config(struct bsec_config *cfg); 175*54fd6939SJiyong Park 176*54fd6939SJiyong Park uint32_t bsec_shadow_register(uint32_t otp); 177*54fd6939SJiyong Park uint32_t bsec_read_otp(uint32_t *val, uint32_t otp); 178*54fd6939SJiyong Park uint32_t bsec_write_otp(uint32_t val, uint32_t otp); 179*54fd6939SJiyong Park uint32_t bsec_program_otp(uint32_t val, uint32_t otp); 180*54fd6939SJiyong Park uint32_t bsec_permanent_lock_otp(uint32_t otp); 181*54fd6939SJiyong Park 182*54fd6939SJiyong Park uint32_t bsec_write_debug_conf(uint32_t val); 183*54fd6939SJiyong Park uint32_t bsec_read_debug_conf(void); 184*54fd6939SJiyong Park uint32_t bsec_write_feature_conf(uint32_t val); 185*54fd6939SJiyong Park uint32_t bsec_read_feature_conf(uint32_t *val); 186*54fd6939SJiyong Park 187*54fd6939SJiyong Park uint32_t bsec_get_status(void); 188*54fd6939SJiyong Park uint32_t bsec_get_hw_conf(void); 189*54fd6939SJiyong Park uint32_t bsec_get_version(void); 190*54fd6939SJiyong Park uint32_t bsec_get_id(void); 191*54fd6939SJiyong Park uint32_t bsec_get_magic_id(void); 192*54fd6939SJiyong Park 193*54fd6939SJiyong Park bool bsec_write_sr_lock(uint32_t otp, uint32_t value); 194*54fd6939SJiyong Park bool bsec_read_sr_lock(uint32_t otp); 195*54fd6939SJiyong Park bool bsec_write_sw_lock(uint32_t otp, uint32_t value); 196*54fd6939SJiyong Park bool bsec_read_sw_lock(uint32_t otp); 197*54fd6939SJiyong Park bool bsec_write_sp_lock(uint32_t otp, uint32_t value); 198*54fd6939SJiyong Park bool bsec_read_sp_lock(uint32_t otp); 199*54fd6939SJiyong Park bool bsec_wr_lock(uint32_t otp); 200*54fd6939SJiyong Park uint32_t bsec_otp_lock(uint32_t service, uint32_t value); 201*54fd6939SJiyong Park 202*54fd6939SJiyong Park uint32_t bsec_shadow_read_otp(uint32_t *otp_value, uint32_t word); 203*54fd6939SJiyong Park uint32_t bsec_check_nsec_access_rights(uint32_t otp); 204*54fd6939SJiyong Park 205*54fd6939SJiyong Park #endif /* BSEC_H */ 206