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 #ifndef BSEC_H 8*91f16700Schasinglulu #define BSEC_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <stdbool.h> 11*91f16700Schasinglulu #include <stdint.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu #include <lib/utils_def.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu /* 16*91f16700Schasinglulu * IP configuration 17*91f16700Schasinglulu */ 18*91f16700Schasinglulu #define BSEC_OTP_MASK GENMASK(4, 0) 19*91f16700Schasinglulu #define BSEC_OTP_BANK_SHIFT 5 20*91f16700Schasinglulu #define BSEC_TIMEOUT_VALUE 0xFFFF 21*91f16700Schasinglulu 22*91f16700Schasinglulu /* 23*91f16700Schasinglulu * Return status 24*91f16700Schasinglulu */ 25*91f16700Schasinglulu #define BSEC_OK 0U 26*91f16700Schasinglulu #define BSEC_ERROR 0xFFFFFFFFU 27*91f16700Schasinglulu #define BSEC_DISTURBED 0xFFFFFFFEU 28*91f16700Schasinglulu #define BSEC_INVALID_PARAM 0xFFFFFFFCU 29*91f16700Schasinglulu #define BSEC_PROG_FAIL 0xFFFFFFFBU 30*91f16700Schasinglulu #define BSEC_LOCK_FAIL 0xFFFFFFFAU 31*91f16700Schasinglulu #define BSEC_TIMEOUT 0xFFFFFFF9U 32*91f16700Schasinglulu #define BSEC_RETRY 0xFFFFFFF8U 33*91f16700Schasinglulu #define BSEC_NOT_SUPPORTED 0xFFFFFFF7U 34*91f16700Schasinglulu #define BSEC_WRITE_LOCKED 0xFFFFFFF6U 35*91f16700Schasinglulu #define BSEC_ERROR_INVALID_FVR 0xFFFFFFF5U 36*91f16700Schasinglulu 37*91f16700Schasinglulu /* 38*91f16700Schasinglulu * OTP MODE 39*91f16700Schasinglulu */ 40*91f16700Schasinglulu #define BSEC_MODE_OPEN1 0x00U 41*91f16700Schasinglulu #define BSEC_MODE_SECURED 0x01U 42*91f16700Schasinglulu #define BSEC_MODE_OPEN2 0x02U 43*91f16700Schasinglulu #define BSEC_MODE_INVALID 0x04U 44*91f16700Schasinglulu 45*91f16700Schasinglulu /* 46*91f16700Schasinglulu * OTP Lock services definition. 47*91f16700Schasinglulu * Value must corresponding to the bit number in the register. 48*91f16700Schasinglulu * Special case: (bit number << 1) for BSEC3. 49*91f16700Schasinglulu */ 50*91f16700Schasinglulu #define BSEC_LOCK_UPPER_OTP 0x00 51*91f16700Schasinglulu #define BSEC_LOCK_GWLOCK 0x01 52*91f16700Schasinglulu #define BSEC_LOCK_DEBUG 0x02 53*91f16700Schasinglulu #define BSEC_LOCK_PROGRAM 0x03 54*91f16700Schasinglulu #define BSEC_LOCK_KVLOCK 0x04 55*91f16700Schasinglulu 56*91f16700Schasinglulu /* 57*91f16700Schasinglulu * Values for struct bsec_config::freq 58*91f16700Schasinglulu */ 59*91f16700Schasinglulu #define FREQ_10_20_MHZ 0x0 60*91f16700Schasinglulu #define FREQ_20_30_MHZ 0x1 61*91f16700Schasinglulu #define FREQ_30_45_MHZ 0x2 62*91f16700Schasinglulu #define FREQ_45_67_MHZ 0x3 63*91f16700Schasinglulu 64*91f16700Schasinglulu /* 65*91f16700Schasinglulu * Device info structure, providing device-specific functions and a means of 66*91f16700Schasinglulu * adding driver-specific state. 67*91f16700Schasinglulu */ 68*91f16700Schasinglulu struct bsec_config { 69*91f16700Schasinglulu uint8_t den_lock; /* 70*91f16700Schasinglulu * Debug enable sticky lock 71*91f16700Schasinglulu * 1 debug enable is locked until next reset 72*91f16700Schasinglulu */ 73*91f16700Schasinglulu 74*91f16700Schasinglulu /* BSEC2 only */ 75*91f16700Schasinglulu uint8_t tread; /* SAFMEM Reading current level default 0 */ 76*91f16700Schasinglulu uint8_t pulse_width; /* SAFMEM Programming pulse width default 1 */ 77*91f16700Schasinglulu uint8_t freq; /* 78*91f16700Schasinglulu * SAFMEM CLOCK see freq value define 79*91f16700Schasinglulu * default FREQ_45_67_MHZ 80*91f16700Schasinglulu */ 81*91f16700Schasinglulu uint8_t power; /* Power up SAFMEM. 1 power up, 0 power off */ 82*91f16700Schasinglulu uint8_t prog_lock; /* 83*91f16700Schasinglulu * Programming Sticky lock 84*91f16700Schasinglulu * 1 programming is locked until next reset 85*91f16700Schasinglulu */ 86*91f16700Schasinglulu uint8_t upper_otp_lock; /* 87*91f16700Schasinglulu * Shadowing of upper OTP sticky lock 88*91f16700Schasinglulu * 1 shadowing of upper OTP is locked 89*91f16700Schasinglulu * until next reset 90*91f16700Schasinglulu */ 91*91f16700Schasinglulu }; 92*91f16700Schasinglulu 93*91f16700Schasinglulu uint32_t bsec_probe(void); 94*91f16700Schasinglulu uint32_t bsec_get_base(void); 95*91f16700Schasinglulu 96*91f16700Schasinglulu uint32_t bsec_set_config(struct bsec_config *cfg); 97*91f16700Schasinglulu uint32_t bsec_get_config(struct bsec_config *cfg); 98*91f16700Schasinglulu 99*91f16700Schasinglulu uint32_t bsec_shadow_register(uint32_t otp); 100*91f16700Schasinglulu uint32_t bsec_read_otp(uint32_t *val, uint32_t otp); 101*91f16700Schasinglulu uint32_t bsec_write_otp(uint32_t val, uint32_t otp); 102*91f16700Schasinglulu uint32_t bsec_program_otp(uint32_t val, uint32_t otp); 103*91f16700Schasinglulu uint32_t bsec_permanent_lock_otp(uint32_t otp); 104*91f16700Schasinglulu 105*91f16700Schasinglulu void bsec_write_debug_conf(uint32_t val); 106*91f16700Schasinglulu uint32_t bsec_read_debug_conf(void); 107*91f16700Schasinglulu 108*91f16700Schasinglulu void bsec_write_scratch(uint32_t val); 109*91f16700Schasinglulu uint32_t bsec_read_scratch(void); 110*91f16700Schasinglulu 111*91f16700Schasinglulu uint32_t bsec_get_status(void); 112*91f16700Schasinglulu uint32_t bsec_get_hw_conf(void); 113*91f16700Schasinglulu uint32_t bsec_get_version(void); 114*91f16700Schasinglulu uint32_t bsec_get_id(void); 115*91f16700Schasinglulu uint32_t bsec_get_magic_id(void); 116*91f16700Schasinglulu 117*91f16700Schasinglulu uint32_t bsec_set_sr_lock(uint32_t otp); 118*91f16700Schasinglulu uint32_t bsec_read_sr_lock(uint32_t otp, bool *value); 119*91f16700Schasinglulu uint32_t bsec_set_sw_lock(uint32_t otp); 120*91f16700Schasinglulu uint32_t bsec_read_sw_lock(uint32_t otp, bool *value); 121*91f16700Schasinglulu uint32_t bsec_set_sp_lock(uint32_t otp); 122*91f16700Schasinglulu uint32_t bsec_read_sp_lock(uint32_t otp, bool *value); 123*91f16700Schasinglulu uint32_t bsec_read_permanent_lock(uint32_t otp, bool *value); 124*91f16700Schasinglulu uint32_t bsec_otp_lock(uint32_t service); 125*91f16700Schasinglulu 126*91f16700Schasinglulu uint32_t bsec_shadow_read_otp(uint32_t *otp_value, uint32_t word); 127*91f16700Schasinglulu uint32_t bsec_check_nsec_access_rights(uint32_t otp); 128*91f16700Schasinglulu 129*91f16700Schasinglulu #endif /* BSEC_H */ 130