xref: /rk3399_ARM-atf/include/drivers/st/bsec.h (revision 88ef0425da07672bd2e20f548533bdf6f258d888)
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