1 /*- 2 * Copyright (c) 2007, Juniper Networks, Inc. 3 * Copyright (c) 2012-2013, SRI International 4 * All rights reserved. 5 * 6 * Portions of this software were developed by SRI International and the 7 * University of Cambridge Computer Laboratory under DARPA/AFRL contract 8 * (FA8750-10-C-0237) ("CTSRD"), as part of the DARPA CRASH research 9 * programme. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. Neither the name of the author nor the names of any co-contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 30 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 31 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36 #include <sys/cdefs.h> 37 __FBSDID("$FreeBSD$"); 38 39 #include "opt_cfi.h" 40 41 #include <sys/param.h> 42 #include <sys/systm.h> 43 #include <sys/bus.h> 44 #include <sys/conf.h> 45 #include <sys/endian.h> 46 #include <sys/kenv.h> 47 #include <sys/kernel.h> 48 #include <sys/malloc.h> 49 #include <sys/module.h> 50 #include <sys/rman.h> 51 #include <sys/sysctl.h> 52 53 #include <machine/bus.h> 54 55 #include <dev/cfi/cfi_reg.h> 56 #include <dev/cfi/cfi_var.h> 57 58 static void cfi_add_sysctls(struct cfi_softc *); 59 60 extern struct cdevsw cfi_cdevsw; 61 62 char cfi_driver_name[] = "cfi"; 63 devclass_t cfi_devclass; 64 devclass_t cfi_diskclass; 65 66 uint32_t 67 cfi_read_raw(struct cfi_softc *sc, u_int ofs) 68 { 69 uint32_t val; 70 71 ofs &= ~(sc->sc_width - 1); 72 switch (sc->sc_width) { 73 case 1: 74 val = bus_space_read_1(sc->sc_tag, sc->sc_handle, ofs); 75 break; 76 case 2: 77 val = bus_space_read_2(sc->sc_tag, sc->sc_handle, ofs); 78 break; 79 case 4: 80 val = bus_space_read_4(sc->sc_tag, sc->sc_handle, ofs); 81 break; 82 default: 83 val = ~0; 84 break; 85 } 86 return (val); 87 } 88 89 uint32_t 90 cfi_read(struct cfi_softc *sc, u_int ofs) 91 { 92 uint32_t val; 93 uint16_t sval; 94 95 ofs &= ~(sc->sc_width - 1); 96 switch (sc->sc_width) { 97 case 1: 98 val = bus_space_read_1(sc->sc_tag, sc->sc_handle, ofs); 99 break; 100 case 2: 101 sval = bus_space_read_2(sc->sc_tag, sc->sc_handle, ofs); 102 #ifdef CFI_HARDWAREBYTESWAP 103 val = sval; 104 #else 105 val = le16toh(sval); 106 #endif 107 break; 108 case 4: 109 val = bus_space_read_4(sc->sc_tag, sc->sc_handle, ofs); 110 #ifndef CFI_HARDWAREBYTESWAP 111 val = le32toh(val); 112 #endif 113 break; 114 default: 115 val = ~0; 116 break; 117 } 118 return (val); 119 } 120 121 static void 122 cfi_write(struct cfi_softc *sc, u_int ofs, u_int val) 123 { 124 125 ofs &= ~(sc->sc_width - 1); 126 switch (sc->sc_width) { 127 case 1: 128 bus_space_write_1(sc->sc_tag, sc->sc_handle, ofs, val); 129 break; 130 case 2: 131 #ifdef CFI_HARDWAREBYTESWAP 132 bus_space_write_2(sc->sc_tag, sc->sc_handle, ofs, val); 133 #else 134 bus_space_write_2(sc->sc_tag, sc->sc_handle, ofs, htole16(val)); 135 136 #endif 137 break; 138 case 4: 139 #ifdef CFI_HARDWAREBYTESWAP 140 bus_space_write_4(sc->sc_tag, sc->sc_handle, ofs, val); 141 #else 142 bus_space_write_4(sc->sc_tag, sc->sc_handle, ofs, htole32(val)); 143 #endif 144 break; 145 } 146 } 147 148 /* 149 * This is same workaound as NetBSD sys/dev/nor/cfi.c cfi_reset_default() 150 */ 151 static void 152 cfi_reset_default(struct cfi_softc *sc) 153 { 154 155 cfi_write(sc, 0, CFI_BCS_READ_ARRAY2); 156 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); 157 } 158 159 uint8_t 160 cfi_read_qry(struct cfi_softc *sc, u_int ofs) 161 { 162 uint8_t val; 163 164 cfi_write(sc, CFI_QRY_CMD_ADDR * sc->sc_width, CFI_QRY_CMD_DATA); 165 val = cfi_read(sc, ofs * sc->sc_width); 166 cfi_reset_default(sc); 167 return (val); 168 } 169 170 static void 171 cfi_amd_write(struct cfi_softc *sc, u_int ofs, u_int addr, u_int data) 172 { 173 174 cfi_write(sc, ofs + AMD_ADDR_START, CFI_AMD_UNLOCK); 175 cfi_write(sc, ofs + AMD_ADDR_ACK, CFI_AMD_UNLOCK_ACK); 176 cfi_write(sc, ofs + addr, data); 177 } 178 179 static char * 180 cfi_fmtsize(uint32_t sz) 181 { 182 static char buf[8]; 183 static const char *sfx[] = { "", "K", "M", "G" }; 184 int sfxidx; 185 186 sfxidx = 0; 187 while (sfxidx < 3 && sz > 1023) { 188 sz /= 1024; 189 sfxidx++; 190 } 191 192 sprintf(buf, "%u%sB", sz, sfx[sfxidx]); 193 return (buf); 194 } 195 196 int 197 cfi_probe(device_t dev) 198 { 199 char desc[80]; 200 struct cfi_softc *sc; 201 char *vend_str; 202 int error; 203 uint16_t iface, vend; 204 205 sc = device_get_softc(dev); 206 sc->sc_dev = dev; 207 208 sc->sc_rid = 0; 209 sc->sc_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->sc_rid, 210 RF_ACTIVE); 211 if (sc->sc_res == NULL) 212 return (ENXIO); 213 214 sc->sc_tag = rman_get_bustag(sc->sc_res); 215 sc->sc_handle = rman_get_bushandle(sc->sc_res); 216 217 if (sc->sc_width == 0) { 218 sc->sc_width = 1; 219 while (sc->sc_width <= 4) { 220 if (cfi_read_qry(sc, CFI_QRY_IDENT) == 'Q') 221 break; 222 sc->sc_width <<= 1; 223 } 224 } else if (cfi_read_qry(sc, CFI_QRY_IDENT) != 'Q') { 225 error = ENXIO; 226 goto out; 227 } 228 if (sc->sc_width > 4) { 229 error = ENXIO; 230 goto out; 231 } 232 233 /* We got a Q. Check if we also have the R and the Y. */ 234 if (cfi_read_qry(sc, CFI_QRY_IDENT + 1) != 'R' || 235 cfi_read_qry(sc, CFI_QRY_IDENT + 2) != 'Y') { 236 error = ENXIO; 237 goto out; 238 } 239 240 /* Get the vendor and command set. */ 241 vend = cfi_read_qry(sc, CFI_QRY_VEND) | 242 (cfi_read_qry(sc, CFI_QRY_VEND + 1) << 8); 243 244 sc->sc_cmdset = vend; 245 246 switch (vend) { 247 case CFI_VEND_AMD_ECS: 248 case CFI_VEND_AMD_SCS: 249 vend_str = "AMD/Fujitsu"; 250 break; 251 case CFI_VEND_INTEL_ECS: 252 vend_str = "Intel/Sharp"; 253 break; 254 case CFI_VEND_INTEL_SCS: 255 vend_str = "Intel"; 256 break; 257 case CFI_VEND_MITSUBISHI_ECS: 258 case CFI_VEND_MITSUBISHI_SCS: 259 vend_str = "Mitsubishi"; 260 break; 261 default: 262 vend_str = "Unknown vendor"; 263 break; 264 } 265 266 /* Get the device size. */ 267 sc->sc_size = 1U << cfi_read_qry(sc, CFI_QRY_SIZE); 268 269 /* Sanity-check the I/F */ 270 iface = cfi_read_qry(sc, CFI_QRY_IFACE) | 271 (cfi_read_qry(sc, CFI_QRY_IFACE + 1) << 8); 272 273 /* 274 * Adding 1 to iface will give us a bit-wise "switch" 275 * that allows us to test for the interface width by 276 * testing a single bit. 277 */ 278 iface++; 279 280 error = (iface & sc->sc_width) ? 0 : EINVAL; 281 if (error) 282 goto out; 283 284 snprintf(desc, sizeof(desc), "%s - %s", vend_str, 285 cfi_fmtsize(sc->sc_size)); 286 device_set_desc_copy(dev, desc); 287 288 out: 289 bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_rid, sc->sc_res); 290 return (error); 291 } 292 293 int 294 cfi_attach(device_t dev) 295 { 296 struct cfi_softc *sc; 297 u_int blksz, blocks; 298 u_int r, u; 299 uint64_t mtoexp, ttoexp; 300 #ifdef CFI_SUPPORT_STRATAFLASH 301 uint64_t ppr; 302 char name[KENV_MNAMELEN], value[32]; 303 #endif 304 305 sc = device_get_softc(dev); 306 sc->sc_dev = dev; 307 308 sc->sc_rid = 0; 309 sc->sc_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->sc_rid, 310 #ifndef ATSE_CFI_HACK 311 RF_ACTIVE); 312 #else 313 RF_ACTIVE | RF_SHAREABLE); 314 #endif 315 if (sc->sc_res == NULL) 316 return (ENXIO); 317 318 sc->sc_tag = rman_get_bustag(sc->sc_res); 319 sc->sc_handle = rman_get_bushandle(sc->sc_res); 320 321 /* Get time-out values for erase, write, and buffer write. */ 322 ttoexp = cfi_read_qry(sc, CFI_QRY_TTO_ERASE); 323 mtoexp = cfi_read_qry(sc, CFI_QRY_MTO_ERASE); 324 if (ttoexp == 0) { 325 device_printf(dev, "erase timeout == 0, using 2^16ms\n"); 326 ttoexp = 16; 327 } 328 if (ttoexp > 41) { 329 device_printf(dev, "insane timeout: 2^%jdms\n", ttoexp); 330 return (EINVAL); 331 } 332 if (mtoexp == 0) { 333 device_printf(dev, "max erase timeout == 0, using 2^%jdms\n", 334 ttoexp + 4); 335 mtoexp = 4; 336 } 337 if (ttoexp + mtoexp > 41) { 338 device_printf(dev, "insane max erase timeout: 2^%jd\n", 339 ttoexp + mtoexp); 340 return (EINVAL); 341 } 342 sc->sc_typical_timeouts[CFI_TIMEOUT_ERASE] = SBT_1MS * (1ULL << ttoexp); 343 sc->sc_max_timeouts[CFI_TIMEOUT_ERASE] = 344 sc->sc_typical_timeouts[CFI_TIMEOUT_ERASE] * (1ULL << mtoexp); 345 346 ttoexp = cfi_read_qry(sc, CFI_QRY_TTO_WRITE); 347 mtoexp = cfi_read_qry(sc, CFI_QRY_MTO_WRITE); 348 if (ttoexp == 0) { 349 device_printf(dev, "write timeout == 0, using 2^18ns\n"); 350 ttoexp = 18; 351 } 352 if (ttoexp > 51) { 353 device_printf(dev, "insane write timeout: 2^%jdus\n", ttoexp); 354 return (EINVAL); 355 } 356 if (mtoexp == 0) { 357 device_printf(dev, "max write timeout == 0, using 2^%jdms\n", 358 ttoexp + 4); 359 mtoexp = 4; 360 } 361 if (ttoexp + mtoexp > 51) { 362 device_printf(dev, "insane max write timeout: 2^%jdus\n", 363 ttoexp + mtoexp); 364 return (EINVAL); 365 } 366 sc->sc_typical_timeouts[CFI_TIMEOUT_WRITE] = SBT_1US * (1ULL << ttoexp); 367 sc->sc_max_timeouts[CFI_TIMEOUT_WRITE] = 368 sc->sc_typical_timeouts[CFI_TIMEOUT_WRITE] * (1ULL << mtoexp); 369 370 ttoexp = cfi_read_qry(sc, CFI_QRY_TTO_BUFWRITE); 371 mtoexp = cfi_read_qry(sc, CFI_QRY_MTO_BUFWRITE); 372 /* Don't check for 0, it means not-supported. */ 373 if (ttoexp > 51) { 374 device_printf(dev, "insane write timeout: 2^%jdus\n", ttoexp); 375 return (EINVAL); 376 } 377 if (ttoexp + mtoexp > 51) { 378 device_printf(dev, "insane max write timeout: 2^%jdus\n", 379 ttoexp + mtoexp); 380 return (EINVAL); 381 } 382 sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE] = 383 SBT_1US * (1ULL << cfi_read_qry(sc, CFI_QRY_TTO_BUFWRITE)); 384 sc->sc_max_timeouts[CFI_TIMEOUT_BUFWRITE] = 385 sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE] * 386 (1ULL << cfi_read_qry(sc, CFI_QRY_MTO_BUFWRITE)); 387 388 /* Get the maximum size of a multibyte program */ 389 if (sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE] != 0) 390 sc->sc_maxbuf = 1 << (cfi_read_qry(sc, CFI_QRY_MAXBUF) | 391 cfi_read_qry(sc, CFI_QRY_MAXBUF) << 8); 392 else 393 sc->sc_maxbuf = 0; 394 395 /* Get erase regions. */ 396 sc->sc_regions = cfi_read_qry(sc, CFI_QRY_NREGIONS); 397 sc->sc_region = malloc(sc->sc_regions * sizeof(struct cfi_region), 398 M_TEMP, M_WAITOK | M_ZERO); 399 for (r = 0; r < sc->sc_regions; r++) { 400 blocks = cfi_read_qry(sc, CFI_QRY_REGION(r)) | 401 (cfi_read_qry(sc, CFI_QRY_REGION(r) + 1) << 8); 402 sc->sc_region[r].r_blocks = blocks + 1; 403 404 blksz = cfi_read_qry(sc, CFI_QRY_REGION(r) + 2) | 405 (cfi_read_qry(sc, CFI_QRY_REGION(r) + 3) << 8); 406 sc->sc_region[r].r_blksz = (blksz == 0) ? 128 : 407 blksz * 256; 408 } 409 410 /* Reset the device to a default state. */ 411 cfi_write(sc, 0, CFI_BCS_CLEAR_STATUS); 412 413 if (bootverbose) { 414 device_printf(dev, "["); 415 for (r = 0; r < sc->sc_regions; r++) { 416 printf("%ux%s%s", sc->sc_region[r].r_blocks, 417 cfi_fmtsize(sc->sc_region[r].r_blksz), 418 (r == sc->sc_regions - 1) ? "]\n" : ","); 419 } 420 } 421 422 u = device_get_unit(dev); 423 sc->sc_nod = make_dev(&cfi_cdevsw, u, UID_ROOT, GID_WHEEL, 0600, 424 "%s%u", cfi_driver_name, u); 425 sc->sc_nod->si_drv1 = sc; 426 427 cfi_add_sysctls(sc); 428 429 #ifdef CFI_SUPPORT_STRATAFLASH 430 /* 431 * Store the Intel factory PPR in the environment. In some 432 * cases it is the most unique ID on a board. 433 */ 434 if (cfi_intel_get_factory_pr(sc, &ppr) == 0) { 435 if (snprintf(name, sizeof(name), "%s.factory_ppr", 436 device_get_nameunit(dev)) < (sizeof(name) - 1) && 437 snprintf(value, sizeof(value), "0x%016jx", ppr) < 438 (sizeof(value) - 1)) 439 (void) kern_setenv(name, value); 440 } 441 #endif 442 443 device_add_child(dev, "cfid", -1); 444 bus_generic_attach(dev); 445 446 return (0); 447 } 448 449 static void 450 cfi_add_sysctls(struct cfi_softc *sc) 451 { 452 struct sysctl_ctx_list *ctx; 453 struct sysctl_oid_list *children; 454 455 ctx = device_get_sysctl_ctx(sc->sc_dev); 456 children = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->sc_dev)); 457 458 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 459 "typical_erase_timout_count", 460 CTLFLAG_RD, &sc->sc_tto_counts[CFI_TIMEOUT_ERASE], 461 0, "Number of times the typical erase timeout was exceeded"); 462 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 463 "max_erase_timout_count", 464 CTLFLAG_RD, &sc->sc_mto_counts[CFI_TIMEOUT_ERASE], 0, 465 "Number of times the maximum erase timeout was exceeded"); 466 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 467 "typical_write_timout_count", 468 CTLFLAG_RD, &sc->sc_tto_counts[CFI_TIMEOUT_WRITE], 0, 469 "Number of times the typical write timeout was exceeded"); 470 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 471 "max_write_timout_count", 472 CTLFLAG_RD, &sc->sc_mto_counts[CFI_TIMEOUT_WRITE], 0, 473 "Number of times the maximum write timeout was exceeded"); 474 if (sc->sc_maxbuf > 0) { 475 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 476 "typical_bufwrite_timout_count", 477 CTLFLAG_RD, &sc->sc_tto_counts[CFI_TIMEOUT_BUFWRITE], 0, 478 "Number of times the typical buffered write timeout was " 479 "exceeded"); 480 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 481 "max_bufwrite_timout_count", 482 CTLFLAG_RD, &sc->sc_mto_counts[CFI_TIMEOUT_BUFWRITE], 0, 483 "Number of times the maximum buffered write timeout was " 484 "exceeded"); 485 } 486 } 487 488 int 489 cfi_detach(device_t dev) 490 { 491 struct cfi_softc *sc; 492 493 sc = device_get_softc(dev); 494 495 destroy_dev(sc->sc_nod); 496 free(sc->sc_region, M_TEMP); 497 bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_rid, sc->sc_res); 498 return (0); 499 } 500 501 static int 502 cfi_wait_ready(struct cfi_softc *sc, u_int ofs, sbintime_t start, 503 enum cfi_wait_cmd cmd) 504 { 505 int done, error, tto_exceeded; 506 uint32_t st0 = 0, st = 0; 507 sbintime_t now; 508 509 done = 0; 510 error = 0; 511 tto_exceeded = 0; 512 while (!done && !error) { 513 /* 514 * Save time before we start so we always do one check 515 * after the timeout has expired. 516 */ 517 now = sbinuptime(); 518 519 switch (sc->sc_cmdset) { 520 case CFI_VEND_INTEL_ECS: 521 case CFI_VEND_INTEL_SCS: 522 st = cfi_read(sc, ofs); 523 done = (st & CFI_INTEL_STATUS_WSMS); 524 if (done) { 525 /* NB: bit 0 is reserved */ 526 st &= ~(CFI_INTEL_XSTATUS_RSVD | 527 CFI_INTEL_STATUS_WSMS | 528 CFI_INTEL_STATUS_RSVD); 529 if (st & CFI_INTEL_STATUS_DPS) 530 error = EPERM; 531 else if (st & CFI_INTEL_STATUS_PSLBS) 532 error = EIO; 533 else if (st & CFI_INTEL_STATUS_ECLBS) 534 error = ENXIO; 535 else if (st) 536 error = EACCES; 537 } 538 break; 539 case CFI_VEND_AMD_SCS: 540 case CFI_VEND_AMD_ECS: 541 st0 = cfi_read(sc, ofs); 542 st = cfi_read(sc, ofs); 543 done = ((st & 0x40) == (st0 & 0x40)) ? 1 : 0; 544 break; 545 } 546 547 if (tto_exceeded || 548 now > start + sc->sc_typical_timeouts[cmd]) { 549 if (!tto_exceeded) { 550 tto_exceeded = 1; 551 sc->sc_tto_counts[cmd]++; 552 #ifdef CFI_DEBUG_TIMEOUT 553 device_printf(sc->sc_dev, 554 "typical timeout exceeded (cmd %d)", cmd); 555 #endif 556 } 557 if (now > start + sc->sc_max_timeouts[cmd]) { 558 sc->sc_mto_counts[cmd]++; 559 #ifdef CFI_DEBUG_TIMEOUT 560 device_printf(sc->sc_dev, 561 "max timeout exceeded (cmd %d)", cmd); 562 #endif 563 } 564 } 565 } 566 if (!done && !error) 567 error = ETIMEDOUT; 568 if (error) 569 printf("\nerror=%d (st 0x%x st0 0x%x)\n", error, st, st0); 570 return (error); 571 } 572 573 int 574 cfi_write_block(struct cfi_softc *sc) 575 { 576 union { 577 uint8_t *x8; 578 uint16_t *x16; 579 uint32_t *x32; 580 } ptr, cpyprt; 581 register_t intr; 582 int error, i, neederase = 0; 583 uint32_t st; 584 u_int wlen; 585 sbintime_t start; 586 587 /* Intel flash must be unlocked before modification */ 588 switch (sc->sc_cmdset) { 589 case CFI_VEND_INTEL_ECS: 590 case CFI_VEND_INTEL_SCS: 591 cfi_write(sc, sc->sc_wrofs, CFI_INTEL_LBS); 592 cfi_write(sc, sc->sc_wrofs, CFI_INTEL_UB); 593 cfi_write(sc, sc->sc_wrofs, CFI_BCS_READ_ARRAY); 594 break; 595 } 596 597 /* Check if an erase is required. */ 598 for (i = 0; i < sc->sc_wrbufsz; i++) 599 if ((sc->sc_wrbuf[i] & sc->sc_wrbufcpy[i]) != sc->sc_wrbuf[i]) { 600 neederase = 1; 601 break; 602 } 603 604 if (neederase) { 605 intr = intr_disable(); 606 start = sbinuptime(); 607 /* Erase the block. */ 608 switch (sc->sc_cmdset) { 609 case CFI_VEND_INTEL_ECS: 610 case CFI_VEND_INTEL_SCS: 611 cfi_write(sc, sc->sc_wrofs, CFI_BCS_BLOCK_ERASE); 612 cfi_write(sc, sc->sc_wrofs, CFI_BCS_CONFIRM); 613 break; 614 case CFI_VEND_AMD_SCS: 615 case CFI_VEND_AMD_ECS: 616 cfi_amd_write(sc, sc->sc_wrofs, AMD_ADDR_START, 617 CFI_AMD_ERASE_SECTOR); 618 cfi_amd_write(sc, sc->sc_wrofs, 0, CFI_AMD_BLOCK_ERASE); 619 break; 620 default: 621 /* Better safe than sorry... */ 622 intr_restore(intr); 623 return (ENODEV); 624 } 625 intr_restore(intr); 626 error = cfi_wait_ready(sc, sc->sc_wrofs, start, 627 CFI_TIMEOUT_ERASE); 628 if (error) 629 goto out; 630 } else 631 error = 0; 632 633 /* Write the block using a multibyte write if supported. */ 634 ptr.x8 = sc->sc_wrbuf; 635 cpyprt.x8 = sc->sc_wrbufcpy; 636 if (sc->sc_maxbuf > sc->sc_width) { 637 switch (sc->sc_cmdset) { 638 case CFI_VEND_INTEL_ECS: 639 case CFI_VEND_INTEL_SCS: 640 for (i = 0; i < sc->sc_wrbufsz; i += wlen) { 641 wlen = MIN(sc->sc_maxbuf, sc->sc_wrbufsz - i); 642 643 intr = intr_disable(); 644 645 start = sbinuptime(); 646 do { 647 cfi_write(sc, sc->sc_wrofs + i, 648 CFI_BCS_BUF_PROG_SETUP); 649 if (sbinuptime() > start + sc->sc_max_timeouts[CFI_TIMEOUT_BUFWRITE]) { 650 error = ETIMEDOUT; 651 goto out; 652 } 653 st = cfi_read(sc, sc->sc_wrofs + i); 654 } while (! (st & CFI_INTEL_STATUS_WSMS)); 655 656 cfi_write(sc, sc->sc_wrofs + i, 657 (wlen / sc->sc_width) - 1); 658 switch (sc->sc_width) { 659 case 1: 660 bus_space_write_region_1(sc->sc_tag, 661 sc->sc_handle, sc->sc_wrofs + i, 662 ptr.x8 + i, wlen); 663 break; 664 case 2: 665 bus_space_write_region_2(sc->sc_tag, 666 sc->sc_handle, sc->sc_wrofs + i, 667 ptr.x16 + i / 2, wlen / 2); 668 break; 669 case 4: 670 bus_space_write_region_4(sc->sc_tag, 671 sc->sc_handle, sc->sc_wrofs + i, 672 ptr.x32 + i / 4, wlen / 4); 673 break; 674 } 675 676 cfi_write(sc, sc->sc_wrofs + i, 677 CFI_BCS_CONFIRM); 678 679 intr_restore(intr); 680 681 error = cfi_wait_ready(sc, sc->sc_wrofs + i, 682 start, CFI_TIMEOUT_BUFWRITE); 683 if (error != 0) 684 goto out; 685 } 686 goto out; 687 default: 688 /* Fall through to single word case */ 689 break; 690 } 691 692 } 693 694 /* Write the block one byte/word at a time. */ 695 for (i = 0; i < sc->sc_wrbufsz; i += sc->sc_width) { 696 697 /* Avoid writing unless we are actually changing bits */ 698 if (!neederase) { 699 switch (sc->sc_width) { 700 case 1: 701 if(*(ptr.x8 + i) == *(cpyprt.x8 + i)) 702 continue; 703 break; 704 case 2: 705 if(*(ptr.x16 + i / 2) == *(cpyprt.x16 + i / 2)) 706 continue; 707 break; 708 case 4: 709 if(*(ptr.x32 + i / 4) == *(cpyprt.x32 + i / 4)) 710 continue; 711 break; 712 } 713 } 714 715 /* 716 * Make sure the command to start a write and the 717 * actual write happens back-to-back without any 718 * excessive delays. 719 */ 720 intr = intr_disable(); 721 722 start = sbinuptime(); 723 switch (sc->sc_cmdset) { 724 case CFI_VEND_INTEL_ECS: 725 case CFI_VEND_INTEL_SCS: 726 cfi_write(sc, sc->sc_wrofs + i, CFI_BCS_PROGRAM); 727 break; 728 case CFI_VEND_AMD_SCS: 729 case CFI_VEND_AMD_ECS: 730 cfi_amd_write(sc, 0, AMD_ADDR_START, CFI_AMD_PROGRAM); 731 break; 732 } 733 switch (sc->sc_width) { 734 case 1: 735 bus_space_write_1(sc->sc_tag, sc->sc_handle, 736 sc->sc_wrofs + i, *(ptr.x8 + i)); 737 break; 738 case 2: 739 bus_space_write_2(sc->sc_tag, sc->sc_handle, 740 sc->sc_wrofs + i, *(ptr.x16 + i / 2)); 741 break; 742 case 4: 743 bus_space_write_4(sc->sc_tag, sc->sc_handle, 744 sc->sc_wrofs + i, *(ptr.x32 + i / 4)); 745 break; 746 } 747 748 intr_restore(intr); 749 750 error = cfi_wait_ready(sc, sc->sc_wrofs, start, 751 CFI_TIMEOUT_WRITE); 752 if (error) 753 goto out; 754 } 755 756 /* error is 0. */ 757 758 out: 759 cfi_reset_default(sc); 760 761 /* Relock Intel flash */ 762 switch (sc->sc_cmdset) { 763 case CFI_VEND_INTEL_ECS: 764 case CFI_VEND_INTEL_SCS: 765 cfi_write(sc, sc->sc_wrofs, CFI_INTEL_LBS); 766 cfi_write(sc, sc->sc_wrofs, CFI_INTEL_LB); 767 cfi_write(sc, sc->sc_wrofs, CFI_BCS_READ_ARRAY); 768 break; 769 } 770 return (error); 771 } 772 773 #ifdef CFI_SUPPORT_STRATAFLASH 774 /* 775 * Intel StrataFlash Protection Register Support. 776 * 777 * The memory includes a 128-bit Protection Register that can be 778 * used for security. There are two 64-bit segments; one is programmed 779 * at the factory with a unique 64-bit number which is immutable. 780 * The other segment is left blank for User (OEM) programming. 781 * The User/OEM segment is One Time Programmable (OTP). It can also 782 * be locked to prevent any further writes by setting bit 0 of the 783 * Protection Lock Register (PLR). The PLR can written only once. 784 */ 785 786 static uint16_t 787 cfi_get16(struct cfi_softc *sc, int off) 788 { 789 uint16_t v = bus_space_read_2(sc->sc_tag, sc->sc_handle, off<<1); 790 return v; 791 } 792 793 #ifdef CFI_ARMEDANDDANGEROUS 794 static void 795 cfi_put16(struct cfi_softc *sc, int off, uint16_t v) 796 { 797 bus_space_write_2(sc->sc_tag, sc->sc_handle, off<<1, v); 798 } 799 #endif 800 801 /* 802 * Read the factory-defined 64-bit segment of the PR. 803 */ 804 int 805 cfi_intel_get_factory_pr(struct cfi_softc *sc, uint64_t *id) 806 { 807 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) 808 return EOPNOTSUPP; 809 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); 810 811 cfi_write(sc, 0, CFI_INTEL_READ_ID); 812 *id = ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(0)))<<48 | 813 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(1)))<<32 | 814 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(2)))<<16 | 815 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(3))); 816 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); 817 return 0; 818 } 819 820 /* 821 * Read the User/OEM 64-bit segment of the PR. 822 */ 823 int 824 cfi_intel_get_oem_pr(struct cfi_softc *sc, uint64_t *id) 825 { 826 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) 827 return EOPNOTSUPP; 828 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); 829 830 cfi_write(sc, 0, CFI_INTEL_READ_ID); 831 *id = ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(4)))<<48 | 832 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(5)))<<32 | 833 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(6)))<<16 | 834 ((uint64_t)cfi_get16(sc, CFI_INTEL_PR(7))); 835 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); 836 return 0; 837 } 838 839 /* 840 * Write the User/OEM 64-bit segment of the PR. 841 * XXX should allow writing individual words/bytes 842 */ 843 int 844 cfi_intel_set_oem_pr(struct cfi_softc *sc, uint64_t id) 845 { 846 #ifdef CFI_ARMEDANDDANGEROUS 847 register_t intr; 848 int i, error; 849 sbintime_t start; 850 #endif 851 852 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) 853 return EOPNOTSUPP; 854 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); 855 856 #ifdef CFI_ARMEDANDDANGEROUS 857 for (i = 7; i >= 4; i--, id >>= 16) { 858 intr = intr_disable(); 859 start = sbinuptime(); 860 cfi_write(sc, 0, CFI_INTEL_PP_SETUP); 861 cfi_put16(sc, CFI_INTEL_PR(i), id&0xffff); 862 intr_restore(intr); 863 error = cfi_wait_ready(sc, CFI_BCS_READ_STATUS, start, 864 CFI_TIMEOUT_WRITE); 865 if (error) 866 break; 867 } 868 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); 869 return error; 870 #else 871 device_printf(sc->sc_dev, "%s: OEM PR not set, " 872 "CFI_ARMEDANDDANGEROUS not configured\n", __func__); 873 return ENXIO; 874 #endif 875 } 876 877 /* 878 * Read the contents of the Protection Lock Register. 879 */ 880 int 881 cfi_intel_get_plr(struct cfi_softc *sc, uint32_t *plr) 882 { 883 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) 884 return EOPNOTSUPP; 885 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); 886 887 cfi_write(sc, 0, CFI_INTEL_READ_ID); 888 *plr = cfi_get16(sc, CFI_INTEL_PLR); 889 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); 890 return 0; 891 } 892 893 /* 894 * Write the Protection Lock Register to lock down the 895 * user-settable segment of the Protection Register. 896 * NOTE: this operation is not reversible. 897 */ 898 int 899 cfi_intel_set_plr(struct cfi_softc *sc) 900 { 901 #ifdef CFI_ARMEDANDDANGEROUS 902 register_t intr; 903 int error; 904 sbintime_t start; 905 #endif 906 if (sc->sc_cmdset != CFI_VEND_INTEL_ECS) 907 return EOPNOTSUPP; 908 KASSERT(sc->sc_width == 2, ("sc_width %d", sc->sc_width)); 909 910 #ifdef CFI_ARMEDANDDANGEROUS 911 /* worthy of console msg */ 912 device_printf(sc->sc_dev, "set PLR\n"); 913 intr = intr_disable(); 914 binuptime(&start); 915 cfi_write(sc, 0, CFI_INTEL_PP_SETUP); 916 cfi_put16(sc, CFI_INTEL_PLR, 0xFFFD); 917 intr_restore(intr); 918 error = cfi_wait_ready(sc, CFI_BCS_READ_STATUS, start, 919 CFI_TIMEOUT_WRITE); 920 cfi_write(sc, 0, CFI_BCS_READ_ARRAY); 921 return error; 922 #else 923 device_printf(sc->sc_dev, "%s: PLR not set, " 924 "CFI_ARMEDANDDANGEROUS not configured\n", __func__); 925 return ENXIO; 926 #endif 927 } 928 #endif /* CFI_SUPPORT_STRATAFLASH */ 929