xref: /aosp_15_r20/external/arm-trusted-firmware/include/drivers/st/bsec.h (revision 54fd6939e177f8ff529b10183254802c76df6d08)
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