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