1 // SPDX-License-Identifier: GPL-2.0
3 * OTP support for SPI NOR flashes
5 * Copyright (C) 2021 Michael Walle <michael@walle.cc>
8 #include <linux/log2.h>
9 #include <linux/mtd/mtd.h>
10 #include <linux/mtd/spi-nor.h>
14 #define spi_nor_otp_region_len(nor) ((nor)->params->otp.org->len)
15 #define spi_nor_otp_n_regions(nor) ((nor)->params->otp.org->n_regions)
18 * spi_nor_otp_read_secr() - read security register
19 * @nor: pointer to 'struct spi_nor'
20 * @addr: offset to read from
21 * @len: number of bytes to read
22 * @buf: pointer to dst buffer
24 * Read a security register by using the SPINOR_OP_RSECR commands.
26 * In Winbond/GigaDevice datasheets the term "security register" stands for
27 * an one-time-programmable memory area, consisting of multiple bytes (usually
28 * 256). Thus one "security register" maps to one OTP region.
30 * This method is used on GigaDevice and Winbond flashes.
32 * Please note, the read must not span multiple registers.
34 * Return: number of bytes read successfully, -errno otherwise
36 int spi_nor_otp_read_secr(struct spi_nor
*nor
, loff_t addr
, size_t len
, u8
*buf
)
38 u8 addr_nbytes
, read_opcode
, read_dummy
;
39 struct spi_mem_dirmap_desc
*rdesc
;
40 enum spi_nor_protocol read_proto
;
43 read_opcode
= nor
->read_opcode
;
44 addr_nbytes
= nor
->addr_nbytes
;
45 read_dummy
= nor
->read_dummy
;
46 read_proto
= nor
->read_proto
;
47 rdesc
= nor
->dirmap
.rdesc
;
49 nor
->read_opcode
= SPINOR_OP_RSECR
;
51 nor
->read_proto
= SNOR_PROTO_1_1_1
;
52 nor
->dirmap
.rdesc
= NULL
;
54 ret
= spi_nor_read_data(nor
, addr
, len
, buf
);
56 nor
->read_opcode
= read_opcode
;
57 nor
->addr_nbytes
= addr_nbytes
;
58 nor
->read_dummy
= read_dummy
;
59 nor
->read_proto
= read_proto
;
60 nor
->dirmap
.rdesc
= rdesc
;
66 * spi_nor_otp_write_secr() - write security register
67 * @nor: pointer to 'struct spi_nor'
68 * @addr: offset to write to
69 * @len: number of bytes to write
70 * @buf: pointer to src buffer
72 * Write a security register by using the SPINOR_OP_PSECR commands.
74 * For more information on the term "security register", see the documentation
75 * of spi_nor_otp_read_secr().
77 * This method is used on GigaDevice and Winbond flashes.
79 * Please note, the write must not span multiple registers.
81 * Return: number of bytes written successfully, -errno otherwise
83 int spi_nor_otp_write_secr(struct spi_nor
*nor
, loff_t addr
, size_t len
,
86 enum spi_nor_protocol write_proto
;
87 struct spi_mem_dirmap_desc
*wdesc
;
88 u8 addr_nbytes
, program_opcode
;
91 program_opcode
= nor
->program_opcode
;
92 addr_nbytes
= nor
->addr_nbytes
;
93 write_proto
= nor
->write_proto
;
94 wdesc
= nor
->dirmap
.wdesc
;
96 nor
->program_opcode
= SPINOR_OP_PSECR
;
97 nor
->write_proto
= SNOR_PROTO_1_1_1
;
98 nor
->dirmap
.wdesc
= NULL
;
101 * We only support a write to one single page. For now all winbond
102 * flashes only have one page per security register.
104 ret
= spi_nor_write_enable(nor
);
108 written
= spi_nor_write_data(nor
, addr
, len
, buf
);
112 ret
= spi_nor_wait_till_ready(nor
);
115 nor
->program_opcode
= program_opcode
;
116 nor
->addr_nbytes
= addr_nbytes
;
117 nor
->write_proto
= write_proto
;
118 nor
->dirmap
.wdesc
= wdesc
;
120 return ret
?: written
;
124 * spi_nor_otp_erase_secr() - erase a security register
125 * @nor: pointer to 'struct spi_nor'
126 * @addr: offset of the security register to be erased
128 * Erase a security register by using the SPINOR_OP_ESECR command.
130 * For more information on the term "security register", see the documentation
131 * of spi_nor_otp_read_secr().
133 * This method is used on GigaDevice and Winbond flashes.
135 * Return: 0 on success, -errno otherwise
137 int spi_nor_otp_erase_secr(struct spi_nor
*nor
, loff_t addr
)
139 u8 erase_opcode
= nor
->erase_opcode
;
142 ret
= spi_nor_write_enable(nor
);
146 nor
->erase_opcode
= SPINOR_OP_ESECR
;
147 ret
= spi_nor_erase_sector(nor
, addr
);
148 nor
->erase_opcode
= erase_opcode
;
152 return spi_nor_wait_till_ready(nor
);
155 static int spi_nor_otp_lock_bit_cr(unsigned int region
)
157 static const int lock_bits
[] = { SR2_LB1
, SR2_LB2
, SR2_LB3
};
159 if (region
>= ARRAY_SIZE(lock_bits
))
162 return lock_bits
[region
];
166 * spi_nor_otp_lock_sr2() - lock the OTP region
167 * @nor: pointer to 'struct spi_nor'
168 * @region: OTP region
170 * Lock the OTP region by writing the status register-2. This method is used on
171 * GigaDevice and Winbond flashes.
173 * Return: 0 on success, -errno otherwise.
175 int spi_nor_otp_lock_sr2(struct spi_nor
*nor
, unsigned int region
)
177 u8
*cr
= nor
->bouncebuf
;
180 lock_bit
= spi_nor_otp_lock_bit_cr(region
);
184 ret
= spi_nor_read_cr(nor
, cr
);
188 /* no need to write the register if region is already locked */
189 if (cr
[0] & lock_bit
)
194 return spi_nor_write_16bit_cr_and_check(nor
, cr
[0]);
198 * spi_nor_otp_is_locked_sr2() - get the OTP region lock status
199 * @nor: pointer to 'struct spi_nor'
200 * @region: OTP region
202 * Retrieve the OTP region lock bit by reading the status register-2. This
203 * method is used on GigaDevice and Winbond flashes.
205 * Return: 0 on success, -errno otherwise.
207 int spi_nor_otp_is_locked_sr2(struct spi_nor
*nor
, unsigned int region
)
209 u8
*cr
= nor
->bouncebuf
;
212 lock_bit
= spi_nor_otp_lock_bit_cr(region
);
216 ret
= spi_nor_read_cr(nor
, cr
);
220 return cr
[0] & lock_bit
;
223 static loff_t
spi_nor_otp_region_start(const struct spi_nor
*nor
, unsigned int region
)
225 const struct spi_nor_otp_organization
*org
= nor
->params
->otp
.org
;
227 return org
->base
+ region
* org
->offset
;
230 static size_t spi_nor_otp_size(struct spi_nor
*nor
)
232 return spi_nor_otp_n_regions(nor
) * spi_nor_otp_region_len(nor
);
235 /* Translate the file offsets from and to OTP regions. */
236 static loff_t
spi_nor_otp_region_to_offset(struct spi_nor
*nor
, unsigned int region
)
238 return region
* spi_nor_otp_region_len(nor
);
241 static unsigned int spi_nor_otp_offset_to_region(struct spi_nor
*nor
, loff_t ofs
)
243 return div64_u64(ofs
, spi_nor_otp_region_len(nor
));
246 static int spi_nor_mtd_otp_info(struct mtd_info
*mtd
, size_t len
,
247 size_t *retlen
, struct otp_info
*buf
)
249 struct spi_nor
*nor
= mtd_to_spi_nor(mtd
);
250 const struct spi_nor_otp_ops
*ops
= nor
->params
->otp
.ops
;
251 unsigned int n_regions
= spi_nor_otp_n_regions(nor
);
255 if (len
< n_regions
* sizeof(*buf
))
258 ret
= spi_nor_prep_and_lock(nor
);
262 for (i
= 0; i
< n_regions
; i
++) {
263 buf
->start
= spi_nor_otp_region_to_offset(nor
, i
);
264 buf
->length
= spi_nor_otp_region_len(nor
);
266 locked
= ops
->is_locked(nor
, i
);
272 buf
->locked
= !!locked
;
276 *retlen
= n_regions
* sizeof(*buf
);
279 spi_nor_unlock_and_unprep(nor
);
284 static int spi_nor_mtd_otp_range_is_locked(struct spi_nor
*nor
, loff_t ofs
,
287 const struct spi_nor_otp_ops
*ops
= nor
->params
->otp
.ops
;
292 * If any of the affected OTP regions are locked the entire range is
295 for (region
= spi_nor_otp_offset_to_region(nor
, ofs
);
296 region
<= spi_nor_otp_offset_to_region(nor
, ofs
+ len
- 1);
298 locked
= ops
->is_locked(nor
, region
);
299 /* take the branch it is locked or in case of an error */
307 static int spi_nor_mtd_otp_read_write(struct mtd_info
*mtd
, loff_t ofs
,
308 size_t total_len
, size_t *retlen
,
309 const u8
*buf
, bool is_write
)
311 struct spi_nor
*nor
= mtd_to_spi_nor(mtd
);
312 const struct spi_nor_otp_ops
*ops
= nor
->params
->otp
.ops
;
313 const size_t rlen
= spi_nor_otp_region_len(nor
);
319 if (ofs
< 0 || ofs
>= spi_nor_otp_size(nor
))
322 /* don't access beyond the end */
323 total_len
= min_t(size_t, total_len
, spi_nor_otp_size(nor
) - ofs
);
328 ret
= spi_nor_prep_and_lock(nor
);
333 ret
= spi_nor_mtd_otp_range_is_locked(nor
, ofs
, total_len
);
344 * The OTP regions are mapped into a contiguous area starting
345 * at 0 as expected by the MTD layer. This will map the MTD
346 * file offsets to the address of an OTP region as used in the
347 * actual SPI commands.
349 region
= spi_nor_otp_offset_to_region(nor
, ofs
);
350 rstart
= spi_nor_otp_region_start(nor
, region
);
353 * The size of a OTP region is expected to be a power of two,
354 * thus we can just mask the lower bits and get the offset into
357 rofs
= ofs
& (rlen
- 1);
359 /* don't access beyond one OTP region */
360 len
= min_t(size_t, total_len
, rlen
- rofs
);
363 ret
= ops
->write(nor
, rstart
+ rofs
, len
, buf
);
365 ret
= ops
->read(nor
, rstart
+ rofs
, len
, (u8
*)buf
);
379 spi_nor_unlock_and_unprep(nor
);
383 static int spi_nor_mtd_otp_read(struct mtd_info
*mtd
, loff_t from
, size_t len
,
384 size_t *retlen
, u8
*buf
)
386 return spi_nor_mtd_otp_read_write(mtd
, from
, len
, retlen
, buf
, false);
389 static int spi_nor_mtd_otp_write(struct mtd_info
*mtd
, loff_t to
, size_t len
,
390 size_t *retlen
, const u8
*buf
)
392 return spi_nor_mtd_otp_read_write(mtd
, to
, len
, retlen
, buf
, true);
395 static int spi_nor_mtd_otp_erase(struct mtd_info
*mtd
, loff_t from
, size_t len
)
397 struct spi_nor
*nor
= mtd_to_spi_nor(mtd
);
398 const struct spi_nor_otp_ops
*ops
= nor
->params
->otp
.ops
;
399 const size_t rlen
= spi_nor_otp_region_len(nor
);
404 /* OTP erase is optional */
411 if (from
< 0 || (from
+ len
) > spi_nor_otp_size(nor
))
414 /* the user has to explicitly ask for whole regions */
415 if (!IS_ALIGNED(len
, rlen
) || !IS_ALIGNED(from
, rlen
))
418 ret
= spi_nor_prep_and_lock(nor
);
422 ret
= spi_nor_mtd_otp_range_is_locked(nor
, from
, len
);
431 region
= spi_nor_otp_offset_to_region(nor
, from
);
432 rstart
= spi_nor_otp_region_start(nor
, region
);
434 ret
= ops
->erase(nor
, rstart
);
443 spi_nor_unlock_and_unprep(nor
);
448 static int spi_nor_mtd_otp_lock(struct mtd_info
*mtd
, loff_t from
, size_t len
)
450 struct spi_nor
*nor
= mtd_to_spi_nor(mtd
);
451 const struct spi_nor_otp_ops
*ops
= nor
->params
->otp
.ops
;
452 const size_t rlen
= spi_nor_otp_region_len(nor
);
456 if (from
< 0 || (from
+ len
) > spi_nor_otp_size(nor
))
459 /* the user has to explicitly ask for whole regions */
460 if (!IS_ALIGNED(len
, rlen
) || !IS_ALIGNED(from
, rlen
))
463 ret
= spi_nor_prep_and_lock(nor
);
468 region
= spi_nor_otp_offset_to_region(nor
, from
);
469 ret
= ops
->lock(nor
, region
);
478 spi_nor_unlock_and_unprep(nor
);
483 void spi_nor_set_mtd_otp_ops(struct spi_nor
*nor
)
485 struct mtd_info
*mtd
= &nor
->mtd
;
487 if (!nor
->params
->otp
.ops
)
490 if (WARN_ON(!is_power_of_2(spi_nor_otp_region_len(nor
))))
494 * We only support user_prot callbacks (yet).
496 * Some SPI NOR flashes like Macronix ones can be ordered in two
497 * different variants. One with a factory locked OTP area and one where
498 * it is left to the user to write to it. The factory locked OTP is
499 * usually preprogrammed with an "electrical serial number". We don't
500 * support these for now.
502 mtd
->_get_user_prot_info
= spi_nor_mtd_otp_info
;
503 mtd
->_read_user_prot_reg
= spi_nor_mtd_otp_read
;
504 mtd
->_write_user_prot_reg
= spi_nor_mtd_otp_write
;
505 mtd
->_lock_user_prot_reg
= spi_nor_mtd_otp_lock
;
506 mtd
->_erase_user_prot_reg
= spi_nor_mtd_otp_erase
;