xref: /openbmc/u-boot/arch/arm/mach-stm32mp/bsec.c (revision 3ebd892f)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
4  */
5 
6 #include <common.h>
7 #include <dm.h>
8 #include <misc.h>
9 #include <asm/io.h>
10 #include <linux/iopoll.h>
11 
12 #define BSEC_OTP_MAX_VALUE		95
13 
14 #define BSEC_TIMEOUT_US			10000
15 
16 /* BSEC REGISTER OFFSET (base relative) */
17 #define BSEC_OTP_CONF_OFF		0x000
18 #define BSEC_OTP_CTRL_OFF		0x004
19 #define BSEC_OTP_WRDATA_OFF		0x008
20 #define BSEC_OTP_STATUS_OFF		0x00C
21 #define BSEC_OTP_LOCK_OFF		0x010
22 #define BSEC_DISTURBED_OFF		0x01C
23 #define BSEC_ERROR_OFF			0x034
24 #define BSEC_SPLOCK_OFF			0x064 /* Program safmem sticky lock */
25 #define BSEC_SWLOCK_OFF			0x07C /* write in OTP sticky lock */
26 #define BSEC_SRLOCK_OFF			0x094 /* shadowing sticky lock */
27 #define BSEC_OTP_DATA_OFF		0x200
28 
29 /* BSEC_CONFIGURATION Register MASK */
30 #define BSEC_CONF_POWER_UP		0x001
31 
32 /* BSEC_CONTROL Register */
33 #define BSEC_READ			0x000
34 #define BSEC_WRITE			0x100
35 
36 /* LOCK Register */
37 #define OTP_LOCK_MASK			0x1F
38 #define OTP_LOCK_BANK_SHIFT		0x05
39 #define OTP_LOCK_BIT_MASK		0x01
40 
41 /* STATUS Register */
42 #define BSEC_MODE_BUSY_MASK		0x08
43 #define BSEC_MODE_PROGFAIL_MASK		0x10
44 #define BSEC_MODE_PWR_MASK		0x20
45 
46 /*
47  * OTP Lock services definition
48  * Value must corresponding to the bit number in the register
49  */
50 #define BSEC_LOCK_PROGRAM		0x04
51 
52 /**
53  * bsec_check_error() - Check status of one otp
54  * @base: base address of bsec IP
55  * @otp: otp number (0 - BSEC_OTP_MAX_VALUE)
56  * Return: 0 if no error, -EAGAIN or -ENOTSUPP
57  */
58 static u32 bsec_check_error(u32 base, u32 otp)
59 {
60 	u32 bit;
61 	u32 bank;
62 
63 	bit = 1 << (otp & OTP_LOCK_MASK);
64 	bank = ((otp >> OTP_LOCK_BANK_SHIFT) & OTP_LOCK_MASK) * sizeof(u32);
65 
66 	if (readl(base + BSEC_DISTURBED_OFF + bank) & bit)
67 		return -EAGAIN;
68 	else if (readl(base + BSEC_ERROR_OFF + bank) & bit)
69 		return -ENOTSUPP;
70 
71 	return 0;
72 }
73 
74 /**
75  * bsec_lock() - manage lock for each type SR/SP/SW
76  * @address: address of bsec IP register
77  * @otp: otp number (0 - BSEC_OTP_MAX_VALUE)
78  * Return: true if locked else false
79  */
80 static bool bsec_read_lock(u32 address, u32 otp)
81 {
82 	u32 bit;
83 	u32 bank;
84 
85 	bit = 1 << (otp & OTP_LOCK_MASK);
86 	bank = ((otp >> OTP_LOCK_BANK_SHIFT) & OTP_LOCK_MASK) * sizeof(u32);
87 
88 	return !!(readl(address + bank) & bit);
89 }
90 
91 /**
92  * bsec_read_SR_lock() - read SR lock (Shadowing)
93  * @base: base address of bsec IP
94  * @otp: otp number (0 - BSEC_OTP_MAX_VALUE)
95  * Return: true if locked else false
96  */
97 static bool bsec_read_SR_lock(u32 base, u32 otp)
98 {
99 	return bsec_read_lock(base + BSEC_SRLOCK_OFF, otp);
100 }
101 
102 /**
103  * bsec_read_SP_lock() - read SP lock (program Lock)
104  * @base: base address of bsec IP
105  * @otp: otp number (0 - BSEC_OTP_MAX_VALUE)
106  * Return: true if locked else false
107  */
108 static bool bsec_read_SP_lock(u32 base, u32 otp)
109 {
110 	return bsec_read_lock(base + BSEC_SPLOCK_OFF, otp);
111 }
112 
113 /**
114  * bsec_SW_lock() - manage SW lock (Write in Shadow)
115  * @base: base address of bsec IP
116  * @otp: otp number (0 - BSEC_OTP_MAX_VALUE)
117  * Return: true if locked else false
118  */
119 static bool bsec_read_SW_lock(u32 base, u32 otp)
120 {
121 	return bsec_read_lock(base + BSEC_SWLOCK_OFF, otp);
122 }
123 
124 /**
125  * bsec_power_safmem() - Activate or deactivate safmem power
126  * @base: base address of bsec IP
127  * @power: true to power up , false to power down
128  * Return: 0 if succeed
129  */
130 static int bsec_power_safmem(u32 base, bool power)
131 {
132 	u32 val;
133 	u32 mask;
134 
135 	if (power) {
136 		setbits_le32(base + BSEC_OTP_CONF_OFF, BSEC_CONF_POWER_UP);
137 		mask = BSEC_MODE_PWR_MASK;
138 	} else {
139 		clrbits_le32(base + BSEC_OTP_CONF_OFF, BSEC_CONF_POWER_UP);
140 		mask = 0;
141 	}
142 
143 	/* waiting loop */
144 	return readl_poll_timeout(base + BSEC_OTP_STATUS_OFF,
145 				  val, (val & BSEC_MODE_PWR_MASK) == mask,
146 				  BSEC_TIMEOUT_US);
147 }
148 
149 /**
150  * bsec_shadow_register() - copy safmen otp to bsec data
151  * @base: base address of bsec IP
152  * @otp: otp number (0 - BSEC_OTP_MAX_VALUE)
153  * Return: 0 if no error
154  */
155 static int bsec_shadow_register(u32 base, u32 otp)
156 {
157 	u32 val;
158 	int ret;
159 	bool power_up = false;
160 
161 	/* check if shadowing of otp is locked */
162 	if (bsec_read_SR_lock(base, otp))
163 		pr_debug("bsec : OTP %d is locked and refreshed with 0\n", otp);
164 
165 	/* check if safemem is power up */
166 	val = readl(base + BSEC_OTP_STATUS_OFF);
167 	if (!(val & BSEC_MODE_PWR_MASK)) {
168 		ret = bsec_power_safmem(base, true);
169 		if (ret)
170 			return ret;
171 		power_up = 1;
172 	}
173 	/* set BSEC_OTP_CTRL_OFF with the otp value*/
174 	writel(otp | BSEC_READ, base + BSEC_OTP_CTRL_OFF);
175 
176 	/* check otp status*/
177 	ret = readl_poll_timeout(base + BSEC_OTP_STATUS_OFF,
178 				 val, (val & BSEC_MODE_BUSY_MASK) == 0,
179 				 BSEC_TIMEOUT_US);
180 	if (ret)
181 		return ret;
182 
183 	ret = bsec_check_error(base, otp);
184 
185 	if (power_up)
186 		bsec_power_safmem(base, false);
187 
188 	return ret;
189 }
190 
191 /**
192  * bsec_read_shadow() - read an otp data value from shadow
193  * @base: base address of bsec IP
194  * @val: read value
195  * @otp: otp number (0 - BSEC_OTP_MAX_VALUE)
196  * Return: 0 if no error
197  */
198 static int bsec_read_shadow(u32 base, u32 *val, u32 otp)
199 {
200 	*val = readl(base + BSEC_OTP_DATA_OFF + otp * sizeof(u32));
201 
202 	return bsec_check_error(base, otp);
203 }
204 
205 /**
206  * bsec_write_shadow() - write value in BSEC data register in shadow
207  * @base: base address of bsec IP
208  * @val: value to write
209  * @otp: otp number (0 - BSEC_OTP_MAX_VALUE)
210  * Return: 0 if no error
211  */
212 static int bsec_write_shadow(u32 base, u32 val, u32 otp)
213 {
214 	/* check if programming of otp is locked */
215 	if (bsec_read_SW_lock(base, otp))
216 		pr_debug("bsec : OTP %d is lock, write will be ignore\n", otp);
217 
218 	writel(val, base + BSEC_OTP_DATA_OFF + otp * sizeof(u32));
219 
220 	return bsec_check_error(base, otp);
221 }
222 
223 /**
224  * bsec_program_otp() - program a bit in SAFMEM
225  * @base: base address of bsec IP
226  * @val: value to program
227  * @otp: otp number (0 - BSEC_OTP_MAX_VALUE)
228  * after the function the otp data is not refreshed in shadow
229  * Return: 0 if no error
230  */
231 static int bsec_program_otp(long base, u32 val, u32 otp)
232 {
233 	u32 ret;
234 	bool power_up = false;
235 
236 	if (bsec_read_SP_lock(base, otp))
237 		pr_debug("bsec : OTP %d locked, prog will be ignore\n", otp);
238 
239 	if (readl(base + BSEC_OTP_LOCK_OFF) & (1 << BSEC_LOCK_PROGRAM))
240 		pr_debug("bsec : Global lock, prog will be ignore\n");
241 
242 	/* check if safemem is power up */
243 	if (!(readl(base + BSEC_OTP_STATUS_OFF) & BSEC_MODE_PWR_MASK)) {
244 		ret = bsec_power_safmem(base, true);
245 		if (ret)
246 			return ret;
247 
248 		power_up = true;
249 	}
250 	/* set value in write register*/
251 	writel(val, base + BSEC_OTP_WRDATA_OFF);
252 
253 	/* set BSEC_OTP_CTRL_OFF with the otp value */
254 	writel(otp | BSEC_WRITE, base + BSEC_OTP_CTRL_OFF);
255 
256 	/* check otp status*/
257 	ret = readl_poll_timeout(base + BSEC_OTP_STATUS_OFF,
258 				 val, (val & BSEC_MODE_BUSY_MASK) == 0,
259 				 BSEC_TIMEOUT_US);
260 	if (ret)
261 		return ret;
262 
263 	if (val & BSEC_MODE_PROGFAIL_MASK)
264 		ret = -EACCES;
265 	else
266 		ret = bsec_check_error(base, otp);
267 
268 	if (power_up)
269 		bsec_power_safmem(base, false);
270 
271 	return ret;
272 }
273 
274 /* BSEC MISC driver *******************************************************/
275 struct stm32mp_bsec_platdata {
276 	u32 base;
277 };
278 
279 static int stm32mp_bsec_read_otp(struct udevice *dev, u32 *val, u32 otp)
280 {
281 	struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
282 	u32 tmp_data = 0;
283 	int ret;
284 
285 	/* read current shadow value */
286 	ret = bsec_read_shadow(plat->base, &tmp_data, otp);
287 	if (ret)
288 		return ret;
289 
290 	/* copy otp in shadow */
291 	ret = bsec_shadow_register(plat->base, otp);
292 	if (ret)
293 		return ret;
294 
295 	ret = bsec_read_shadow(plat->base, val, otp);
296 	if (ret)
297 		return ret;
298 
299 	/* restore shadow value */
300 	ret = bsec_write_shadow(plat->base, tmp_data, otp);
301 	return ret;
302 }
303 
304 static int stm32mp_bsec_read_shadow(struct udevice *dev, u32 *val, u32 otp)
305 {
306 	struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
307 
308 	return bsec_read_shadow(plat->base, val, otp);
309 }
310 
311 static int stm32mp_bsec_write_otp(struct udevice *dev, u32 val, u32 otp)
312 {
313 	struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
314 
315 	return bsec_program_otp(plat->base, val, otp);
316 }
317 
318 static int stm32mp_bsec_write_shadow(struct udevice *dev, u32 val, u32 otp)
319 {
320 	struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
321 
322 	return bsec_write_shadow(plat->base, val, otp);
323 }
324 
325 static int stm32mp_bsec_read(struct udevice *dev, int offset,
326 			     void *buf, int size)
327 {
328 	int ret;
329 	int i;
330 	bool shadow = true;
331 	int nb_otp = size / sizeof(u32);
332 	int otp;
333 
334 	if (offset >= STM32_BSEC_OTP_OFFSET) {
335 		offset -= STM32_BSEC_OTP_OFFSET;
336 		shadow = false;
337 	}
338 	otp = offset / sizeof(u32);
339 
340 	if (otp < 0 || (otp + nb_otp - 1) > BSEC_OTP_MAX_VALUE) {
341 		dev_err(dev, "wrong value for otp, max value : %i\n",
342 			BSEC_OTP_MAX_VALUE);
343 		return -EINVAL;
344 	}
345 
346 	for (i = otp; i < (otp + nb_otp); i++) {
347 		u32 *addr = &((u32 *)buf)[i - otp];
348 
349 		if (shadow)
350 			ret = stm32mp_bsec_read_shadow(dev, addr, i);
351 		else
352 			ret = stm32mp_bsec_read_otp(dev, addr, i);
353 
354 		if (ret)
355 			break;
356 	}
357 	return ret;
358 }
359 
360 static int stm32mp_bsec_write(struct udevice *dev, int offset,
361 			      const void *buf, int size)
362 {
363 	int ret = 0;
364 	int i;
365 	bool shadow = true;
366 	int nb_otp = size / sizeof(u32);
367 	int otp;
368 
369 	if (offset >= STM32_BSEC_OTP_OFFSET) {
370 		offset -= STM32_BSEC_OTP_OFFSET;
371 		shadow = false;
372 	}
373 	otp = offset / sizeof(u32);
374 
375 	if (otp < 0 || (otp + nb_otp - 1) > BSEC_OTP_MAX_VALUE) {
376 		dev_err(dev, "wrong value for otp, max value : %d\n",
377 			BSEC_OTP_MAX_VALUE);
378 		return -EINVAL;
379 	}
380 
381 	for (i = otp; i < otp + nb_otp; i++) {
382 		u32 *val = &((u32 *)buf)[i - otp];
383 
384 		if (shadow)
385 			ret = stm32mp_bsec_write_shadow(dev, *val, i);
386 		else
387 			ret = stm32mp_bsec_write_otp(dev, *val, i);
388 		if (ret)
389 			break;
390 	}
391 	return ret;
392 }
393 
394 static const struct misc_ops stm32mp_bsec_ops = {
395 	.read = stm32mp_bsec_read,
396 	.write = stm32mp_bsec_write,
397 };
398 
399 static int stm32mp_bsec_ofdata_to_platdata(struct udevice *dev)
400 {
401 	struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
402 
403 	plat->base = (u32)dev_read_addr_ptr(dev);
404 
405 	return 0;
406 }
407 
408 static const struct udevice_id stm32mp_bsec_ids[] = {
409 	{ .compatible = "st,stm32mp-bsec" },
410 	{}
411 };
412 
413 U_BOOT_DRIVER(stm32mp_bsec) = {
414 	.name = "stm32mp_bsec",
415 	.id = UCLASS_MISC,
416 	.of_match = stm32mp_bsec_ids,
417 	.ofdata_to_platdata = stm32mp_bsec_ofdata_to_platdata,
418 	.platdata_auto_alloc_size = sizeof(struct stm32mp_bsec_platdata),
419 	.ops = &stm32mp_bsec_ops,
420 	.flags  = DM_FLAG_PRE_RELOC,
421 };
422 
423 /* bsec IP is not present in device tee, manage IP address by platdata */
424 static struct stm32mp_bsec_platdata stm32_bsec_platdata = {
425 	.base = STM32_BSEC_BASE,
426 };
427 
428 U_BOOT_DEVICE(stm32mp_bsec) = {
429 	.name = "stm32mp_bsec",
430 	.platdata = &stm32_bsec_platdata,
431 };
432