1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * OTP support for SPI NOR flashes
4  *
5  * Copyright (C) 2021 Michael Walle <michael@walle.cc>
6  */
7 
8 #include <linux/log2.h>
9 #include <linux/math64.h>
10 #include <linux/mtd/mtd.h>
11 #include <linux/mtd/spi-nor.h>
12 
13 #include "core.h"
14 
15 #define spi_nor_otp_region_len(nor) ((nor)->params->otp.org->len)
16 #define spi_nor_otp_n_regions(nor) ((nor)->params->otp.org->n_regions)
17 
18 /**
19  * spi_nor_otp_read_secr() - read security register
20  * @nor:	pointer to 'struct spi_nor'
21  * @addr:       offset to read from
22  * @len:        number of bytes to read
23  * @buf:        pointer to dst buffer
24  *
25  * Read a security register by using the SPINOR_OP_RSECR commands.
26  *
27  * In Winbond/GigaDevice datasheets the term "security register" stands for
28  * an one-time-programmable memory area, consisting of multiple bytes (usually
29  * 256). Thus one "security register" maps to one OTP region.
30  *
31  * This method is used on GigaDevice and Winbond flashes.
32  *
33  * Please note, the read must not span multiple registers.
34  *
35  * Return: number of bytes read successfully, -errno otherwise
36  */
37 int spi_nor_otp_read_secr(struct spi_nor *nor, loff_t addr, size_t len, u8 *buf)
38 {
39 	u8 addr_nbytes, read_opcode, read_dummy;
40 	struct spi_mem_dirmap_desc *rdesc;
41 	enum spi_nor_protocol read_proto;
42 	int ret;
43 
44 	read_opcode = nor->read_opcode;
45 	addr_nbytes = nor->addr_nbytes;
46 	read_dummy = nor->read_dummy;
47 	read_proto = nor->read_proto;
48 	rdesc = nor->dirmap.rdesc;
49 
50 	nor->read_opcode = SPINOR_OP_RSECR;
51 	nor->read_dummy = 8;
52 	nor->read_proto = SNOR_PROTO_1_1_1;
53 	nor->dirmap.rdesc = NULL;
54 
55 	ret = spi_nor_read_data(nor, addr, len, buf);
56 
57 	nor->read_opcode = read_opcode;
58 	nor->addr_nbytes = addr_nbytes;
59 	nor->read_dummy = read_dummy;
60 	nor->read_proto = read_proto;
61 	nor->dirmap.rdesc = rdesc;
62 
63 	return ret;
64 }
65 
66 /**
67  * spi_nor_otp_write_secr() - write security register
68  * @nor:        pointer to 'struct spi_nor'
69  * @addr:       offset to write to
70  * @len:        number of bytes to write
71  * @buf:        pointer to src buffer
72  *
73  * Write a security register by using the SPINOR_OP_PSECR commands.
74  *
75  * For more information on the term "security register", see the documentation
76  * of spi_nor_otp_read_secr().
77  *
78  * This method is used on GigaDevice and Winbond flashes.
79  *
80  * Please note, the write must not span multiple registers.
81  *
82  * Return: number of bytes written successfully, -errno otherwise
83  */
84 int spi_nor_otp_write_secr(struct spi_nor *nor, loff_t addr, size_t len,
85 			   const u8 *buf)
86 {
87 	enum spi_nor_protocol write_proto;
88 	struct spi_mem_dirmap_desc *wdesc;
89 	u8 addr_nbytes, program_opcode;
90 	int ret, written;
91 
92 	program_opcode = nor->program_opcode;
93 	addr_nbytes = nor->addr_nbytes;
94 	write_proto = nor->write_proto;
95 	wdesc = nor->dirmap.wdesc;
96 
97 	nor->program_opcode = SPINOR_OP_PSECR;
98 	nor->write_proto = SNOR_PROTO_1_1_1;
99 	nor->dirmap.wdesc = NULL;
100 
101 	/*
102 	 * We only support a write to one single page. For now all winbond
103 	 * flashes only have one page per security register.
104 	 */
105 	ret = spi_nor_write_enable(nor);
106 	if (ret)
107 		goto out;
108 
109 	written = spi_nor_write_data(nor, addr, len, buf);
110 	if (written < 0)
111 		goto out;
112 
113 	ret = spi_nor_wait_till_ready(nor);
114 
115 out:
116 	nor->program_opcode = program_opcode;
117 	nor->addr_nbytes = addr_nbytes;
118 	nor->write_proto = write_proto;
119 	nor->dirmap.wdesc = wdesc;
120 
121 	return ret ?: written;
122 }
123 
124 /**
125  * spi_nor_otp_erase_secr() - erase a security register
126  * @nor:        pointer to 'struct spi_nor'
127  * @addr:       offset of the security register to be erased
128  *
129  * Erase a security register by using the SPINOR_OP_ESECR command.
130  *
131  * For more information on the term "security register", see the documentation
132  * of spi_nor_otp_read_secr().
133  *
134  * This method is used on GigaDevice and Winbond flashes.
135  *
136  * Return: 0 on success, -errno otherwise
137  */
138 int spi_nor_otp_erase_secr(struct spi_nor *nor, loff_t addr)
139 {
140 	u8 erase_opcode = nor->erase_opcode;
141 	int ret;
142 
143 	ret = spi_nor_write_enable(nor);
144 	if (ret)
145 		return ret;
146 
147 	nor->erase_opcode = SPINOR_OP_ESECR;
148 	ret = spi_nor_erase_sector(nor, addr);
149 	nor->erase_opcode = erase_opcode;
150 	if (ret)
151 		return ret;
152 
153 	return spi_nor_wait_till_ready(nor);
154 }
155 
156 static int spi_nor_otp_lock_bit_cr(unsigned int region)
157 {
158 	static const int lock_bits[] = { SR2_LB1, SR2_LB2, SR2_LB3 };
159 
160 	if (region >= ARRAY_SIZE(lock_bits))
161 		return -EINVAL;
162 
163 	return lock_bits[region];
164 }
165 
166 /**
167  * spi_nor_otp_lock_sr2() - lock the OTP region
168  * @nor:        pointer to 'struct spi_nor'
169  * @region:     OTP region
170  *
171  * Lock the OTP region by writing the status register-2. This method is used on
172  * GigaDevice and Winbond flashes.
173  *
174  * Return: 0 on success, -errno otherwise.
175  */
176 int spi_nor_otp_lock_sr2(struct spi_nor *nor, unsigned int region)
177 {
178 	u8 *cr = nor->bouncebuf;
179 	int ret, lock_bit;
180 
181 	lock_bit = spi_nor_otp_lock_bit_cr(region);
182 	if (lock_bit < 0)
183 		return lock_bit;
184 
185 	ret = spi_nor_read_cr(nor, cr);
186 	if (ret)
187 		return ret;
188 
189 	/* no need to write the register if region is already locked */
190 	if (cr[0] & lock_bit)
191 		return 0;
192 
193 	cr[0] |= lock_bit;
194 
195 	return spi_nor_write_16bit_cr_and_check(nor, cr[0]);
196 }
197 
198 /**
199  * spi_nor_otp_is_locked_sr2() - get the OTP region lock status
200  * @nor:        pointer to 'struct spi_nor'
201  * @region:     OTP region
202  *
203  * Retrieve the OTP region lock bit by reading the status register-2. This
204  * method is used on GigaDevice and Winbond flashes.
205  *
206  * Return: 0 on success, -errno otherwise.
207  */
208 int spi_nor_otp_is_locked_sr2(struct spi_nor *nor, unsigned int region)
209 {
210 	u8 *cr = nor->bouncebuf;
211 	int ret, lock_bit;
212 
213 	lock_bit = spi_nor_otp_lock_bit_cr(region);
214 	if (lock_bit < 0)
215 		return lock_bit;
216 
217 	ret = spi_nor_read_cr(nor, cr);
218 	if (ret)
219 		return ret;
220 
221 	return cr[0] & lock_bit;
222 }
223 
224 static loff_t spi_nor_otp_region_start(const struct spi_nor *nor, unsigned int region)
225 {
226 	const struct spi_nor_otp_organization *org = nor->params->otp.org;
227 
228 	return org->base + region * org->offset;
229 }
230 
231 static size_t spi_nor_otp_size(struct spi_nor *nor)
232 {
233 	return spi_nor_otp_n_regions(nor) * spi_nor_otp_region_len(nor);
234 }
235 
236 /* Translate the file offsets from and to OTP regions. */
237 static loff_t spi_nor_otp_region_to_offset(struct spi_nor *nor, unsigned int region)
238 {
239 	return region * spi_nor_otp_region_len(nor);
240 }
241 
242 static unsigned int spi_nor_otp_offset_to_region(struct spi_nor *nor, loff_t ofs)
243 {
244 	return div64_u64(ofs, spi_nor_otp_region_len(nor));
245 }
246 
247 static int spi_nor_mtd_otp_info(struct mtd_info *mtd, size_t len,
248 				size_t *retlen, struct otp_info *buf)
249 {
250 	struct spi_nor *nor = mtd_to_spi_nor(mtd);
251 	const struct spi_nor_otp_ops *ops = nor->params->otp.ops;
252 	unsigned int n_regions = spi_nor_otp_n_regions(nor);
253 	unsigned int i;
254 	int ret, locked;
255 
256 	if (len < n_regions * sizeof(*buf))
257 		return -ENOSPC;
258 
259 	ret = spi_nor_prep_and_lock(nor);
260 	if (ret)
261 		return ret;
262 
263 	for (i = 0; i < n_regions; i++) {
264 		buf->start = spi_nor_otp_region_to_offset(nor, i);
265 		buf->length = spi_nor_otp_region_len(nor);
266 
267 		locked = ops->is_locked(nor, i);
268 		if (locked < 0) {
269 			ret = locked;
270 			goto out;
271 		}
272 
273 		buf->locked = !!locked;
274 		buf++;
275 	}
276 
277 	*retlen = n_regions * sizeof(*buf);
278 
279 out:
280 	spi_nor_unlock_and_unprep(nor);
281 
282 	return ret;
283 }
284 
285 static int spi_nor_mtd_otp_range_is_locked(struct spi_nor *nor, loff_t ofs,
286 					   size_t len)
287 {
288 	const struct spi_nor_otp_ops *ops = nor->params->otp.ops;
289 	unsigned int region;
290 	int locked;
291 
292 	/*
293 	 * If any of the affected OTP regions are locked the entire range is
294 	 * considered locked.
295 	 */
296 	for (region = spi_nor_otp_offset_to_region(nor, ofs);
297 	     region <= spi_nor_otp_offset_to_region(nor, ofs + len - 1);
298 	     region++) {
299 		locked = ops->is_locked(nor, region);
300 		/* take the branch it is locked or in case of an error */
301 		if (locked)
302 			return locked;
303 	}
304 
305 	return 0;
306 }
307 
308 static int spi_nor_mtd_otp_read_write(struct mtd_info *mtd, loff_t ofs,
309 				      size_t total_len, size_t *retlen,
310 				      const u8 *buf, bool is_write)
311 {
312 	struct spi_nor *nor = mtd_to_spi_nor(mtd);
313 	const struct spi_nor_otp_ops *ops = nor->params->otp.ops;
314 	const size_t rlen = spi_nor_otp_region_len(nor);
315 	loff_t rstart, rofs;
316 	unsigned int region;
317 	size_t len;
318 	int ret;
319 
320 	if (ofs < 0 || ofs >= spi_nor_otp_size(nor))
321 		return 0;
322 
323 	/* don't access beyond the end */
324 	total_len = min_t(size_t, total_len, spi_nor_otp_size(nor) - ofs);
325 
326 	if (!total_len)
327 		return 0;
328 
329 	ret = spi_nor_prep_and_lock(nor);
330 	if (ret)
331 		return ret;
332 
333 	if (is_write) {
334 		ret = spi_nor_mtd_otp_range_is_locked(nor, ofs, total_len);
335 		if (ret < 0) {
336 			goto out;
337 		} else if (ret) {
338 			ret = -EROFS;
339 			goto out;
340 		}
341 	}
342 
343 	while (total_len) {
344 		/*
345 		 * The OTP regions are mapped into a contiguous area starting
346 		 * at 0 as expected by the MTD layer. This will map the MTD
347 		 * file offsets to the address of an OTP region as used in the
348 		 * actual SPI commands.
349 		 */
350 		region = spi_nor_otp_offset_to_region(nor, ofs);
351 		rstart = spi_nor_otp_region_start(nor, region);
352 
353 		/*
354 		 * The size of a OTP region is expected to be a power of two,
355 		 * thus we can just mask the lower bits and get the offset into
356 		 * a region.
357 		 */
358 		rofs = ofs & (rlen - 1);
359 
360 		/* don't access beyond one OTP region */
361 		len = min_t(size_t, total_len, rlen - rofs);
362 
363 		if (is_write)
364 			ret = ops->write(nor, rstart + rofs, len, buf);
365 		else
366 			ret = ops->read(nor, rstart + rofs, len, (u8 *)buf);
367 		if (ret == 0)
368 			ret = -EIO;
369 		if (ret < 0)
370 			goto out;
371 
372 		*retlen += ret;
373 		ofs += ret;
374 		buf += ret;
375 		total_len -= ret;
376 	}
377 	ret = 0;
378 
379 out:
380 	spi_nor_unlock_and_unprep(nor);
381 	return ret;
382 }
383 
384 static int spi_nor_mtd_otp_read(struct mtd_info *mtd, loff_t from, size_t len,
385 				size_t *retlen, u8 *buf)
386 {
387 	return spi_nor_mtd_otp_read_write(mtd, from, len, retlen, buf, false);
388 }
389 
390 static int spi_nor_mtd_otp_write(struct mtd_info *mtd, loff_t to, size_t len,
391 				 size_t *retlen, const u8 *buf)
392 {
393 	return spi_nor_mtd_otp_read_write(mtd, to, len, retlen, buf, true);
394 }
395 
396 static int spi_nor_mtd_otp_erase(struct mtd_info *mtd, loff_t from, size_t len)
397 {
398 	struct spi_nor *nor = mtd_to_spi_nor(mtd);
399 	const struct spi_nor_otp_ops *ops = nor->params->otp.ops;
400 	const size_t rlen = spi_nor_otp_region_len(nor);
401 	unsigned int region;
402 	loff_t rstart;
403 	int ret;
404 
405 	/* OTP erase is optional */
406 	if (!ops->erase)
407 		return -EOPNOTSUPP;
408 
409 	if (!len)
410 		return 0;
411 
412 	if (from < 0 || (from + len) > spi_nor_otp_size(nor))
413 		return -EINVAL;
414 
415 	/* the user has to explicitly ask for whole regions */
416 	if (!IS_ALIGNED(len, rlen) || !IS_ALIGNED(from, rlen))
417 		return -EINVAL;
418 
419 	ret = spi_nor_prep_and_lock(nor);
420 	if (ret)
421 		return ret;
422 
423 	ret = spi_nor_mtd_otp_range_is_locked(nor, from, len);
424 	if (ret < 0) {
425 		goto out;
426 	} else if (ret) {
427 		ret = -EROFS;
428 		goto out;
429 	}
430 
431 	while (len) {
432 		region = spi_nor_otp_offset_to_region(nor, from);
433 		rstart = spi_nor_otp_region_start(nor, region);
434 
435 		ret = ops->erase(nor, rstart);
436 		if (ret)
437 			goto out;
438 
439 		len -= rlen;
440 		from += rlen;
441 	}
442 
443 out:
444 	spi_nor_unlock_and_unprep(nor);
445 
446 	return ret;
447 }
448 
449 static int spi_nor_mtd_otp_lock(struct mtd_info *mtd, loff_t from, size_t len)
450 {
451 	struct spi_nor *nor = mtd_to_spi_nor(mtd);
452 	const struct spi_nor_otp_ops *ops = nor->params->otp.ops;
453 	const size_t rlen = spi_nor_otp_region_len(nor);
454 	unsigned int region;
455 	int ret;
456 
457 	if (from < 0 || (from + len) > spi_nor_otp_size(nor))
458 		return -EINVAL;
459 
460 	/* the user has to explicitly ask for whole regions */
461 	if (!IS_ALIGNED(len, rlen) || !IS_ALIGNED(from, rlen))
462 		return -EINVAL;
463 
464 	ret = spi_nor_prep_and_lock(nor);
465 	if (ret)
466 		return ret;
467 
468 	while (len) {
469 		region = spi_nor_otp_offset_to_region(nor, from);
470 		ret = ops->lock(nor, region);
471 		if (ret)
472 			goto out;
473 
474 		len -= rlen;
475 		from += rlen;
476 	}
477 
478 out:
479 	spi_nor_unlock_and_unprep(nor);
480 
481 	return ret;
482 }
483 
484 void spi_nor_set_mtd_otp_ops(struct spi_nor *nor)
485 {
486 	struct mtd_info *mtd = &nor->mtd;
487 
488 	if (!nor->params->otp.ops)
489 		return;
490 
491 	if (WARN_ON(!is_power_of_2(spi_nor_otp_region_len(nor))))
492 		return;
493 
494 	/*
495 	 * We only support user_prot callbacks (yet).
496 	 *
497 	 * Some SPI NOR flashes like Macronix ones can be ordered in two
498 	 * different variants. One with a factory locked OTP area and one where
499 	 * it is left to the user to write to it. The factory locked OTP is
500 	 * usually preprogrammed with an "electrical serial number". We don't
501 	 * support these for now.
502 	 */
503 	mtd->_get_user_prot_info = spi_nor_mtd_otp_info;
504 	mtd->_read_user_prot_reg = spi_nor_mtd_otp_read;
505 	mtd->_write_user_prot_reg = spi_nor_mtd_otp_write;
506 	mtd->_lock_user_prot_reg = spi_nor_mtd_otp_lock;
507 	mtd->_erase_user_prot_reg = spi_nor_mtd_otp_erase;
508 }
509