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