pflash_cfi01.c (34113B)
1/* 2 * CFI parallel flash with Intel command set emulation 3 * 4 * Copyright (c) 2006 Thorsten Zitterell 5 * Copyright (c) 2005 Jocelyn Mayer 6 * 7 * This library is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this library; if not, see <http://www.gnu.org/licenses/>. 19 */ 20 21/* 22 * For now, this code can emulate flashes of 1, 2 or 4 bytes width. 23 * Supported commands/modes are: 24 * - flash read 25 * - flash write 26 * - flash ID read 27 * - sector erase 28 * - CFI queries 29 * 30 * It does not support timings 31 * It does not support flash interleaving 32 * It does not implement software data protection as found in many real chips 33 * It does not implement erase suspend/resume commands 34 * It does not implement multiple sectors erase 35 * 36 * It does not implement much more ... 37 */ 38 39#include "qemu/osdep.h" 40#include "hw/block/block.h" 41#include "hw/block/flash.h" 42#include "hw/qdev-properties.h" 43#include "hw/qdev-properties-system.h" 44#include "sysemu/block-backend.h" 45#include "qapi/error.h" 46#include "qemu/error-report.h" 47#include "qemu/bitops.h" 48#include "qemu/error-report.h" 49#include "qemu/host-utils.h" 50#include "qemu/log.h" 51#include "qemu/module.h" 52#include "qemu/option.h" 53#include "hw/sysbus.h" 54#include "migration/vmstate.h" 55#include "sysemu/blockdev.h" 56#include "sysemu/runstate.h" 57#include "trace.h" 58 59#define PFLASH_BE 0 60#define PFLASH_SECURE 1 61 62struct PFlashCFI01 { 63 /*< private >*/ 64 SysBusDevice parent_obj; 65 /*< public >*/ 66 67 BlockBackend *blk; 68 uint32_t nb_blocs; 69 uint64_t sector_len; 70 uint8_t bank_width; 71 uint8_t device_width; /* If 0, device width not specified. */ 72 uint8_t max_device_width; /* max device width in bytes */ 73 uint32_t features; 74 uint8_t wcycle; /* if 0, the flash is read normally */ 75 bool ro; 76 uint8_t cmd; 77 uint8_t status; 78 uint16_t ident0; 79 uint16_t ident1; 80 uint16_t ident2; 81 uint16_t ident3; 82 uint8_t cfi_table[0x52]; 83 uint64_t counter; 84 unsigned int writeblock_size; 85 MemoryRegion mem; 86 char *name; 87 void *storage; 88 VMChangeStateEntry *vmstate; 89 bool old_multiple_chip_handling; 90}; 91 92static int pflash_post_load(void *opaque, int version_id); 93 94static const VMStateDescription vmstate_pflash = { 95 .name = "pflash_cfi01", 96 .version_id = 1, 97 .minimum_version_id = 1, 98 .post_load = pflash_post_load, 99 .fields = (VMStateField[]) { 100 VMSTATE_UINT8(wcycle, PFlashCFI01), 101 VMSTATE_UINT8(cmd, PFlashCFI01), 102 VMSTATE_UINT8(status, PFlashCFI01), 103 VMSTATE_UINT64(counter, PFlashCFI01), 104 VMSTATE_END_OF_LIST() 105 } 106}; 107 108/* 109 * Perform a CFI query based on the bank width of the flash. 110 * If this code is called we know we have a device_width set for 111 * this flash. 112 */ 113static uint32_t pflash_cfi_query(PFlashCFI01 *pfl, hwaddr offset) 114{ 115 int i; 116 uint32_t resp = 0; 117 hwaddr boff; 118 119 /* 120 * Adjust incoming offset to match expected device-width 121 * addressing. CFI query addresses are always specified in terms of 122 * the maximum supported width of the device. This means that x8 123 * devices and x8/x16 devices in x8 mode behave differently. For 124 * devices that are not used at their max width, we will be 125 * provided with addresses that use higher address bits than 126 * expected (based on the max width), so we will shift them lower 127 * so that they will match the addresses used when 128 * device_width==max_device_width. 129 */ 130 boff = offset >> (ctz32(pfl->bank_width) + 131 ctz32(pfl->max_device_width) - ctz32(pfl->device_width)); 132 133 if (boff >= sizeof(pfl->cfi_table)) { 134 return 0; 135 } 136 /* 137 * Now we will construct the CFI response generated by a single 138 * device, then replicate that for all devices that make up the 139 * bus. For wide parts used in x8 mode, CFI query responses 140 * are different than native byte-wide parts. 141 */ 142 resp = pfl->cfi_table[boff]; 143 if (pfl->device_width != pfl->max_device_width) { 144 /* The only case currently supported is x8 mode for a 145 * wider part. 146 */ 147 if (pfl->device_width != 1 || pfl->bank_width > 4) { 148 trace_pflash_unsupported_device_configuration(pfl->name, 149 pfl->device_width, pfl->max_device_width); 150 return 0; 151 } 152 /* CFI query data is repeated, rather than zero padded for 153 * wide devices used in x8 mode. 154 */ 155 for (i = 1; i < pfl->max_device_width; i++) { 156 resp = deposit32(resp, 8 * i, 8, pfl->cfi_table[boff]); 157 } 158 } 159 /* Replicate responses for each device in bank. */ 160 if (pfl->device_width < pfl->bank_width) { 161 for (i = pfl->device_width; 162 i < pfl->bank_width; i += pfl->device_width) { 163 resp = deposit32(resp, 8 * i, 8 * pfl->device_width, resp); 164 } 165 } 166 167 return resp; 168} 169 170 171 172/* Perform a device id query based on the bank width of the flash. */ 173static uint32_t pflash_devid_query(PFlashCFI01 *pfl, hwaddr offset) 174{ 175 int i; 176 uint32_t resp; 177 hwaddr boff; 178 179 /* 180 * Adjust incoming offset to match expected device-width 181 * addressing. Device ID read addresses are always specified in 182 * terms of the maximum supported width of the device. This means 183 * that x8 devices and x8/x16 devices in x8 mode behave 184 * differently. For devices that are not used at their max width, 185 * we will be provided with addresses that use higher address bits 186 * than expected (based on the max width), so we will shift them 187 * lower so that they will match the addresses used when 188 * device_width==max_device_width. 189 */ 190 boff = offset >> (ctz32(pfl->bank_width) + 191 ctz32(pfl->max_device_width) - ctz32(pfl->device_width)); 192 193 /* 194 * Mask off upper bits which may be used in to query block 195 * or sector lock status at other addresses. 196 * Offsets 2/3 are block lock status, is not emulated. 197 */ 198 switch (boff & 0xFF) { 199 case 0: 200 resp = pfl->ident0; 201 trace_pflash_manufacturer_id(pfl->name, resp); 202 break; 203 case 1: 204 resp = pfl->ident1; 205 trace_pflash_device_id(pfl->name, resp); 206 break; 207 default: 208 trace_pflash_device_info(pfl->name, offset); 209 return 0; 210 } 211 /* Replicate responses for each device in bank. */ 212 if (pfl->device_width < pfl->bank_width) { 213 for (i = pfl->device_width; 214 i < pfl->bank_width; i += pfl->device_width) { 215 resp = deposit32(resp, 8 * i, 8 * pfl->device_width, resp); 216 } 217 } 218 219 return resp; 220} 221 222static uint32_t pflash_data_read(PFlashCFI01 *pfl, hwaddr offset, 223 int width, int be) 224{ 225 uint8_t *p; 226 uint32_t ret; 227 228 p = pfl->storage; 229 switch (width) { 230 case 1: 231 ret = p[offset]; 232 break; 233 case 2: 234 if (be) { 235 ret = p[offset] << 8; 236 ret |= p[offset + 1]; 237 } else { 238 ret = p[offset]; 239 ret |= p[offset + 1] << 8; 240 } 241 break; 242 case 4: 243 if (be) { 244 ret = p[offset] << 24; 245 ret |= p[offset + 1] << 16; 246 ret |= p[offset + 2] << 8; 247 ret |= p[offset + 3]; 248 } else { 249 ret = p[offset]; 250 ret |= p[offset + 1] << 8; 251 ret |= p[offset + 2] << 16; 252 ret |= p[offset + 3] << 24; 253 } 254 break; 255 default: 256 abort(); 257 } 258 trace_pflash_data_read(pfl->name, offset, width, ret); 259 return ret; 260} 261 262static uint32_t pflash_read(PFlashCFI01 *pfl, hwaddr offset, 263 int width, int be) 264{ 265 hwaddr boff; 266 uint32_t ret; 267 268 ret = -1; 269 switch (pfl->cmd) { 270 default: 271 /* This should never happen : reset state & treat it as a read */ 272 trace_pflash_read_unknown_state(pfl->name, pfl->cmd); 273 pfl->wcycle = 0; 274 /* 275 * The command 0x00 is not assigned by the CFI open standard, 276 * but QEMU historically uses it for the READ_ARRAY command (0xff). 277 */ 278 pfl->cmd = 0x00; 279 /* fall through to read code */ 280 case 0x00: /* This model reset value for READ_ARRAY (not CFI compliant) */ 281 /* Flash area read */ 282 ret = pflash_data_read(pfl, offset, width, be); 283 break; 284 case 0x10: /* Single byte program */ 285 case 0x20: /* Block erase */ 286 case 0x28: /* Block erase */ 287 case 0x40: /* single byte program */ 288 case 0x50: /* Clear status register */ 289 case 0x60: /* Block /un)lock */ 290 case 0x70: /* Status Register */ 291 case 0xe8: /* Write block */ 292 /* 293 * Status register read. Return status from each device in 294 * bank. 295 */ 296 ret = pfl->status; 297 if (pfl->device_width && width > pfl->device_width) { 298 int shift = pfl->device_width * 8; 299 while (shift + pfl->device_width * 8 <= width * 8) { 300 ret |= pfl->status << shift; 301 shift += pfl->device_width * 8; 302 } 303 } else if (!pfl->device_width && width > 2) { 304 /* 305 * Handle 32 bit flash cases where device width is not 306 * set. (Existing behavior before device width added.) 307 */ 308 ret |= pfl->status << 16; 309 } 310 trace_pflash_read_status(pfl->name, ret); 311 break; 312 case 0x90: 313 if (!pfl->device_width) { 314 /* Preserve old behavior if device width not specified */ 315 boff = offset & 0xFF; 316 if (pfl->bank_width == 2) { 317 boff = boff >> 1; 318 } else if (pfl->bank_width == 4) { 319 boff = boff >> 2; 320 } 321 322 switch (boff) { 323 case 0: 324 ret = pfl->ident0 << 8 | pfl->ident1; 325 trace_pflash_manufacturer_id(pfl->name, ret); 326 break; 327 case 1: 328 ret = pfl->ident2 << 8 | pfl->ident3; 329 trace_pflash_device_id(pfl->name, ret); 330 break; 331 default: 332 trace_pflash_device_info(pfl->name, boff); 333 ret = 0; 334 break; 335 } 336 } else { 337 /* 338 * If we have a read larger than the bank_width, combine multiple 339 * manufacturer/device ID queries into a single response. 340 */ 341 int i; 342 for (i = 0; i < width; i += pfl->bank_width) { 343 ret = deposit32(ret, i * 8, pfl->bank_width * 8, 344 pflash_devid_query(pfl, 345 offset + i * pfl->bank_width)); 346 } 347 } 348 break; 349 case 0x98: /* Query mode */ 350 if (!pfl->device_width) { 351 /* Preserve old behavior if device width not specified */ 352 boff = offset & 0xFF; 353 if (pfl->bank_width == 2) { 354 boff = boff >> 1; 355 } else if (pfl->bank_width == 4) { 356 boff = boff >> 2; 357 } 358 359 if (boff < sizeof(pfl->cfi_table)) { 360 ret = pfl->cfi_table[boff]; 361 } else { 362 ret = 0; 363 } 364 } else { 365 /* 366 * If we have a read larger than the bank_width, combine multiple 367 * CFI queries into a single response. 368 */ 369 int i; 370 for (i = 0; i < width; i += pfl->bank_width) { 371 ret = deposit32(ret, i * 8, pfl->bank_width * 8, 372 pflash_cfi_query(pfl, 373 offset + i * pfl->bank_width)); 374 } 375 } 376 377 break; 378 } 379 trace_pflash_io_read(pfl->name, offset, width, ret, pfl->cmd, pfl->wcycle); 380 381 return ret; 382} 383 384/* update flash content on disk */ 385static void pflash_update(PFlashCFI01 *pfl, int offset, 386 int size) 387{ 388 int offset_end; 389 int ret; 390 if (pfl->blk) { 391 offset_end = offset + size; 392 /* widen to sector boundaries */ 393 offset = QEMU_ALIGN_DOWN(offset, BDRV_SECTOR_SIZE); 394 offset_end = QEMU_ALIGN_UP(offset_end, BDRV_SECTOR_SIZE); 395 ret = blk_pwrite(pfl->blk, offset, pfl->storage + offset, 396 offset_end - offset, 0); 397 if (ret < 0) { 398 /* TODO set error bit in status */ 399 error_report("Could not update PFLASH: %s", strerror(-ret)); 400 } 401 } 402} 403 404static inline void pflash_data_write(PFlashCFI01 *pfl, hwaddr offset, 405 uint32_t value, int width, int be) 406{ 407 uint8_t *p = pfl->storage; 408 409 trace_pflash_data_write(pfl->name, offset, width, value, pfl->counter); 410 switch (width) { 411 case 1: 412 p[offset] = value; 413 break; 414 case 2: 415 if (be) { 416 p[offset] = value >> 8; 417 p[offset + 1] = value; 418 } else { 419 p[offset] = value; 420 p[offset + 1] = value >> 8; 421 } 422 break; 423 case 4: 424 if (be) { 425 p[offset] = value >> 24; 426 p[offset + 1] = value >> 16; 427 p[offset + 2] = value >> 8; 428 p[offset + 3] = value; 429 } else { 430 p[offset] = value; 431 p[offset + 1] = value >> 8; 432 p[offset + 2] = value >> 16; 433 p[offset + 3] = value >> 24; 434 } 435 break; 436 } 437 438} 439 440static void pflash_write(PFlashCFI01 *pfl, hwaddr offset, 441 uint32_t value, int width, int be) 442{ 443 uint8_t *p; 444 uint8_t cmd; 445 446 cmd = value; 447 448 trace_pflash_io_write(pfl->name, offset, width, value, pfl->wcycle); 449 if (!pfl->wcycle) { 450 /* Set the device in I/O access mode */ 451 memory_region_rom_device_set_romd(&pfl->mem, false); 452 } 453 454 switch (pfl->wcycle) { 455 case 0: 456 /* read mode */ 457 switch (cmd) { 458 case 0x00: /* This model reset value for READ_ARRAY (not CFI) */ 459 goto mode_read_array; 460 case 0x10: /* Single Byte Program */ 461 case 0x40: /* Single Byte Program */ 462 trace_pflash_write(pfl->name, "single byte program (0)"); 463 break; 464 case 0x20: /* Block erase */ 465 p = pfl->storage; 466 offset &= ~(pfl->sector_len - 1); 467 468 trace_pflash_write_block_erase(pfl->name, offset, pfl->sector_len); 469 470 if (!pfl->ro) { 471 memset(p + offset, 0xff, pfl->sector_len); 472 pflash_update(pfl, offset, pfl->sector_len); 473 } else { 474 pfl->status |= 0x20; /* Block erase error */ 475 } 476 pfl->status |= 0x80; /* Ready! */ 477 break; 478 case 0x50: /* Clear status bits */ 479 trace_pflash_write(pfl->name, "clear status bits"); 480 pfl->status = 0x0; 481 goto mode_read_array; 482 case 0x60: /* Block (un)lock */ 483 trace_pflash_write(pfl->name, "block unlock"); 484 break; 485 case 0x70: /* Status Register */ 486 trace_pflash_write(pfl->name, "read status register"); 487 pfl->cmd = cmd; 488 return; 489 case 0x90: /* Read Device ID */ 490 trace_pflash_write(pfl->name, "read device information"); 491 pfl->cmd = cmd; 492 return; 493 case 0x98: /* CFI query */ 494 trace_pflash_write(pfl->name, "CFI query"); 495 break; 496 case 0xe8: /* Write to buffer */ 497 trace_pflash_write(pfl->name, "write to buffer"); 498 /* FIXME should save @offset, @width for case 1+ */ 499 qemu_log_mask(LOG_UNIMP, 500 "%s: Write to buffer emulation is flawed\n", 501 __func__); 502 pfl->status |= 0x80; /* Ready! */ 503 break; 504 case 0xf0: /* Probe for AMD flash */ 505 trace_pflash_write(pfl->name, "probe for AMD flash"); 506 goto mode_read_array; 507 case 0xff: /* Read Array */ 508 trace_pflash_write(pfl->name, "read array mode"); 509 goto mode_read_array; 510 default: 511 goto error_flash; 512 } 513 pfl->wcycle++; 514 pfl->cmd = cmd; 515 break; 516 case 1: 517 switch (pfl->cmd) { 518 case 0x10: /* Single Byte Program */ 519 case 0x40: /* Single Byte Program */ 520 trace_pflash_write(pfl->name, "single byte program (1)"); 521 if (!pfl->ro) { 522 pflash_data_write(pfl, offset, value, width, be); 523 pflash_update(pfl, offset, width); 524 } else { 525 pfl->status |= 0x10; /* Programming error */ 526 } 527 pfl->status |= 0x80; /* Ready! */ 528 pfl->wcycle = 0; 529 break; 530 case 0x20: /* Block erase */ 531 case 0x28: 532 if (cmd == 0xd0) { /* confirm */ 533 pfl->wcycle = 0; 534 pfl->status |= 0x80; 535 } else if (cmd == 0xff) { /* Read Array */ 536 goto mode_read_array; 537 } else 538 goto error_flash; 539 540 break; 541 case 0xe8: 542 /* 543 * Mask writeblock size based on device width, or bank width if 544 * device width not specified. 545 */ 546 /* FIXME check @offset, @width */ 547 if (pfl->device_width) { 548 value = extract32(value, 0, pfl->device_width * 8); 549 } else { 550 value = extract32(value, 0, pfl->bank_width * 8); 551 } 552 trace_pflash_write_block(pfl->name, value); 553 pfl->counter = value; 554 pfl->wcycle++; 555 break; 556 case 0x60: 557 if (cmd == 0xd0) { 558 pfl->wcycle = 0; 559 pfl->status |= 0x80; 560 } else if (cmd == 0x01) { 561 pfl->wcycle = 0; 562 pfl->status |= 0x80; 563 } else if (cmd == 0xff) { /* Read Array */ 564 goto mode_read_array; 565 } else { 566 trace_pflash_write(pfl->name, "unknown (un)locking command"); 567 goto mode_read_array; 568 } 569 break; 570 case 0x98: 571 if (cmd == 0xff) { /* Read Array */ 572 goto mode_read_array; 573 } else { 574 trace_pflash_write(pfl->name, "leaving query mode"); 575 } 576 break; 577 default: 578 goto error_flash; 579 } 580 break; 581 case 2: 582 switch (pfl->cmd) { 583 case 0xe8: /* Block write */ 584 /* FIXME check @offset, @width */ 585 if (!pfl->ro) { 586 /* 587 * FIXME writing straight to memory is *wrong*. We 588 * should write to a buffer, and flush it to memory 589 * only on confirm command (see below). 590 */ 591 pflash_data_write(pfl, offset, value, width, be); 592 } else { 593 pfl->status |= 0x10; /* Programming error */ 594 } 595 596 pfl->status |= 0x80; 597 598 if (!pfl->counter) { 599 hwaddr mask = pfl->writeblock_size - 1; 600 mask = ~mask; 601 602 trace_pflash_write(pfl->name, "block write finished"); 603 pfl->wcycle++; 604 if (!pfl->ro) { 605 /* Flush the entire write buffer onto backing storage. */ 606 /* FIXME premature! */ 607 pflash_update(pfl, offset & mask, pfl->writeblock_size); 608 } else { 609 pfl->status |= 0x10; /* Programming error */ 610 } 611 } 612 613 pfl->counter--; 614 break; 615 default: 616 goto error_flash; 617 } 618 break; 619 case 3: /* Confirm mode */ 620 switch (pfl->cmd) { 621 case 0xe8: /* Block write */ 622 if (cmd == 0xd0) { 623 /* FIXME this is where we should write out the buffer */ 624 pfl->wcycle = 0; 625 pfl->status |= 0x80; 626 } else { 627 qemu_log_mask(LOG_UNIMP, 628 "%s: Aborting write to buffer not implemented," 629 " the data is already written to storage!\n" 630 "Flash device reset into READ mode.\n", 631 __func__); 632 goto mode_read_array; 633 } 634 break; 635 default: 636 goto error_flash; 637 } 638 break; 639 default: 640 /* Should never happen */ 641 trace_pflash_write(pfl->name, "invalid write state"); 642 goto mode_read_array; 643 } 644 return; 645 646 error_flash: 647 qemu_log_mask(LOG_UNIMP, "%s: Unimplemented flash cmd sequence " 648 "(offset " TARGET_FMT_plx ", wcycle 0x%x cmd 0x%x value 0x%x)" 649 "\n", __func__, offset, pfl->wcycle, pfl->cmd, value); 650 651 mode_read_array: 652 trace_pflash_mode_read_array(pfl->name); 653 memory_region_rom_device_set_romd(&pfl->mem, true); 654 pfl->wcycle = 0; 655 pfl->cmd = 0x00; /* This model reset value for READ_ARRAY (not CFI) */ 656} 657 658 659static MemTxResult pflash_mem_read_with_attrs(void *opaque, hwaddr addr, uint64_t *value, 660 unsigned len, MemTxAttrs attrs) 661{ 662 PFlashCFI01 *pfl = opaque; 663 bool be = !!(pfl->features & (1 << PFLASH_BE)); 664 665 if ((pfl->features & (1 << PFLASH_SECURE)) && !attrs.secure) { 666 *value = pflash_data_read(opaque, addr, len, be); 667 } else { 668 *value = pflash_read(opaque, addr, len, be); 669 } 670 return MEMTX_OK; 671} 672 673static MemTxResult pflash_mem_write_with_attrs(void *opaque, hwaddr addr, uint64_t value, 674 unsigned len, MemTxAttrs attrs) 675{ 676 PFlashCFI01 *pfl = opaque; 677 bool be = !!(pfl->features & (1 << PFLASH_BE)); 678 679 if ((pfl->features & (1 << PFLASH_SECURE)) && !attrs.secure) { 680 return MEMTX_ERROR; 681 } else { 682 pflash_write(opaque, addr, value, len, be); 683 return MEMTX_OK; 684 } 685} 686 687static const MemoryRegionOps pflash_cfi01_ops = { 688 .read_with_attrs = pflash_mem_read_with_attrs, 689 .write_with_attrs = pflash_mem_write_with_attrs, 690 .endianness = DEVICE_NATIVE_ENDIAN, 691}; 692 693static void pflash_cfi01_fill_cfi_table(PFlashCFI01 *pfl) 694{ 695 uint64_t blocks_per_device, sector_len_per_device, device_len; 696 int num_devices; 697 698 /* 699 * These are only used to expose the parameters of each device 700 * in the cfi_table[]. 701 */ 702 num_devices = pfl->device_width ? (pfl->bank_width / pfl->device_width) : 1; 703 if (pfl->old_multiple_chip_handling) { 704 blocks_per_device = pfl->nb_blocs / num_devices; 705 sector_len_per_device = pfl->sector_len; 706 } else { 707 blocks_per_device = pfl->nb_blocs; 708 sector_len_per_device = pfl->sector_len / num_devices; 709 } 710 device_len = sector_len_per_device * blocks_per_device; 711 712 /* Hardcoded CFI table */ 713 /* Standard "QRY" string */ 714 pfl->cfi_table[0x10] = 'Q'; 715 pfl->cfi_table[0x11] = 'R'; 716 pfl->cfi_table[0x12] = 'Y'; 717 /* Command set (Intel) */ 718 pfl->cfi_table[0x13] = 0x01; 719 pfl->cfi_table[0x14] = 0x00; 720 /* Primary extended table address (none) */ 721 pfl->cfi_table[0x15] = 0x31; 722 pfl->cfi_table[0x16] = 0x00; 723 /* Alternate command set (none) */ 724 pfl->cfi_table[0x17] = 0x00; 725 pfl->cfi_table[0x18] = 0x00; 726 /* Alternate extended table (none) */ 727 pfl->cfi_table[0x19] = 0x00; 728 pfl->cfi_table[0x1A] = 0x00; 729 /* Vcc min */ 730 pfl->cfi_table[0x1B] = 0x45; 731 /* Vcc max */ 732 pfl->cfi_table[0x1C] = 0x55; 733 /* Vpp min (no Vpp pin) */ 734 pfl->cfi_table[0x1D] = 0x00; 735 /* Vpp max (no Vpp pin) */ 736 pfl->cfi_table[0x1E] = 0x00; 737 /* Reserved */ 738 pfl->cfi_table[0x1F] = 0x07; 739 /* Timeout for min size buffer write */ 740 pfl->cfi_table[0x20] = 0x07; 741 /* Typical timeout for block erase */ 742 pfl->cfi_table[0x21] = 0x0a; 743 /* Typical timeout for full chip erase (4096 ms) */ 744 pfl->cfi_table[0x22] = 0x00; 745 /* Reserved */ 746 pfl->cfi_table[0x23] = 0x04; 747 /* Max timeout for buffer write */ 748 pfl->cfi_table[0x24] = 0x04; 749 /* Max timeout for block erase */ 750 pfl->cfi_table[0x25] = 0x04; 751 /* Max timeout for chip erase */ 752 pfl->cfi_table[0x26] = 0x00; 753 /* Device size */ 754 pfl->cfi_table[0x27] = ctz32(device_len); /* + 1; */ 755 /* Flash device interface (8 & 16 bits) */ 756 pfl->cfi_table[0x28] = 0x02; 757 pfl->cfi_table[0x29] = 0x00; 758 /* Max number of bytes in multi-bytes write */ 759 if (pfl->bank_width == 1) { 760 pfl->cfi_table[0x2A] = 0x08; 761 } else { 762 pfl->cfi_table[0x2A] = 0x0B; 763 } 764 pfl->writeblock_size = 1 << pfl->cfi_table[0x2A]; 765 if (!pfl->old_multiple_chip_handling && num_devices > 1) { 766 pfl->writeblock_size *= num_devices; 767 } 768 769 pfl->cfi_table[0x2B] = 0x00; 770 /* Number of erase block regions (uniform) */ 771 pfl->cfi_table[0x2C] = 0x01; 772 /* Erase block region 1 */ 773 pfl->cfi_table[0x2D] = blocks_per_device - 1; 774 pfl->cfi_table[0x2E] = (blocks_per_device - 1) >> 8; 775 pfl->cfi_table[0x2F] = sector_len_per_device >> 8; 776 pfl->cfi_table[0x30] = sector_len_per_device >> 16; 777 778 /* Extended */ 779 pfl->cfi_table[0x31] = 'P'; 780 pfl->cfi_table[0x32] = 'R'; 781 pfl->cfi_table[0x33] = 'I'; 782 783 pfl->cfi_table[0x34] = '1'; 784 pfl->cfi_table[0x35] = '0'; 785 786 pfl->cfi_table[0x36] = 0x00; 787 pfl->cfi_table[0x37] = 0x00; 788 pfl->cfi_table[0x38] = 0x00; 789 pfl->cfi_table[0x39] = 0x00; 790 791 pfl->cfi_table[0x3a] = 0x00; 792 793 pfl->cfi_table[0x3b] = 0x00; 794 pfl->cfi_table[0x3c] = 0x00; 795 796 pfl->cfi_table[0x3f] = 0x01; /* Number of protection fields */ 797} 798 799static void pflash_cfi01_realize(DeviceState *dev, Error **errp) 800{ 801 ERRP_GUARD(); 802 PFlashCFI01 *pfl = PFLASH_CFI01(dev); 803 uint64_t total_len; 804 int ret; 805 806 if (pfl->sector_len == 0) { 807 error_setg(errp, "attribute \"sector-length\" not specified or zero."); 808 return; 809 } 810 if (pfl->nb_blocs == 0) { 811 error_setg(errp, "attribute \"num-blocks\" not specified or zero."); 812 return; 813 } 814 if (pfl->name == NULL) { 815 error_setg(errp, "attribute \"name\" not specified."); 816 return; 817 } 818 819 total_len = pfl->sector_len * pfl->nb_blocs; 820 821 memory_region_init_rom_device( 822 &pfl->mem, OBJECT(dev), 823 &pflash_cfi01_ops, 824 pfl, 825 pfl->name, total_len, errp); 826 if (*errp) { 827 return; 828 } 829 830 pfl->storage = memory_region_get_ram_ptr(&pfl->mem); 831 sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem); 832 833 if (pfl->blk) { 834 uint64_t perm; 835 pfl->ro = !blk_supports_write_perm(pfl->blk); 836 perm = BLK_PERM_CONSISTENT_READ | (pfl->ro ? 0 : BLK_PERM_WRITE); 837 ret = blk_set_perm(pfl->blk, perm, BLK_PERM_ALL, errp); 838 if (ret < 0) { 839 return; 840 } 841 } else { 842 pfl->ro = false; 843 } 844 845 if (pfl->blk) { 846 if (!blk_check_size_and_read_all(pfl->blk, pfl->storage, total_len, 847 errp)) { 848 vmstate_unregister_ram(&pfl->mem, DEVICE(pfl)); 849 return; 850 } 851 } 852 853 /* 854 * Default to devices being used at their maximum device width. This was 855 * assumed before the device_width support was added. 856 */ 857 if (!pfl->max_device_width) { 858 pfl->max_device_width = pfl->device_width; 859 } 860 861 pfl->wcycle = 0; 862 /* 863 * The command 0x00 is not assigned by the CFI open standard, 864 * but QEMU historically uses it for the READ_ARRAY command (0xff). 865 */ 866 pfl->cmd = 0x00; 867 pfl->status = 0x80; /* WSM ready */ 868 pflash_cfi01_fill_cfi_table(pfl); 869} 870 871static void pflash_cfi01_system_reset(DeviceState *dev) 872{ 873 PFlashCFI01 *pfl = PFLASH_CFI01(dev); 874 875 trace_pflash_reset(pfl->name); 876 /* 877 * The command 0x00 is not assigned by the CFI open standard, 878 * but QEMU historically uses it for the READ_ARRAY command (0xff). 879 */ 880 pfl->cmd = 0x00; 881 pfl->wcycle = 0; 882 memory_region_rom_device_set_romd(&pfl->mem, true); 883 /* 884 * The WSM ready timer occurs at most 150ns after system reset. 885 * This model deliberately ignores this delay. 886 */ 887 pfl->status = 0x80; 888} 889 890static Property pflash_cfi01_properties[] = { 891 DEFINE_PROP_DRIVE("drive", PFlashCFI01, blk), 892 /* num-blocks is the number of blocks actually visible to the guest, 893 * ie the total size of the device divided by the sector length. 894 * If we're emulating flash devices wired in parallel the actual 895 * number of blocks per indvidual device will differ. 896 */ 897 DEFINE_PROP_UINT32("num-blocks", PFlashCFI01, nb_blocs, 0), 898 DEFINE_PROP_UINT64("sector-length", PFlashCFI01, sector_len, 0), 899 /* width here is the overall width of this QEMU device in bytes. 900 * The QEMU device may be emulating a number of flash devices 901 * wired up in parallel; the width of each individual flash 902 * device should be specified via device-width. If the individual 903 * devices have a maximum width which is greater than the width 904 * they are being used for, this maximum width should be set via 905 * max-device-width (which otherwise defaults to device-width). 906 * So for instance a 32-bit wide QEMU flash device made from four 907 * 16-bit flash devices used in 8-bit wide mode would be configured 908 * with width = 4, device-width = 1, max-device-width = 2. 909 * 910 * If device-width is not specified we default to backwards 911 * compatible behaviour which is a bad emulation of two 912 * 16 bit devices making up a 32 bit wide QEMU device. This 913 * is deprecated for new uses of this device. 914 */ 915 DEFINE_PROP_UINT8("width", PFlashCFI01, bank_width, 0), 916 DEFINE_PROP_UINT8("device-width", PFlashCFI01, device_width, 0), 917 DEFINE_PROP_UINT8("max-device-width", PFlashCFI01, max_device_width, 0), 918 DEFINE_PROP_BIT("big-endian", PFlashCFI01, features, PFLASH_BE, 0), 919 DEFINE_PROP_BIT("secure", PFlashCFI01, features, PFLASH_SECURE, 0), 920 DEFINE_PROP_UINT16("id0", PFlashCFI01, ident0, 0), 921 DEFINE_PROP_UINT16("id1", PFlashCFI01, ident1, 0), 922 DEFINE_PROP_UINT16("id2", PFlashCFI01, ident2, 0), 923 DEFINE_PROP_UINT16("id3", PFlashCFI01, ident3, 0), 924 DEFINE_PROP_STRING("name", PFlashCFI01, name), 925 DEFINE_PROP_BOOL("old-multiple-chip-handling", PFlashCFI01, 926 old_multiple_chip_handling, false), 927 DEFINE_PROP_END_OF_LIST(), 928}; 929 930static void pflash_cfi01_class_init(ObjectClass *klass, void *data) 931{ 932 DeviceClass *dc = DEVICE_CLASS(klass); 933 934 dc->reset = pflash_cfi01_system_reset; 935 dc->realize = pflash_cfi01_realize; 936 device_class_set_props(dc, pflash_cfi01_properties); 937 dc->vmsd = &vmstate_pflash; 938 set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); 939} 940 941 942static const TypeInfo pflash_cfi01_info = { 943 .name = TYPE_PFLASH_CFI01, 944 .parent = TYPE_SYS_BUS_DEVICE, 945 .instance_size = sizeof(PFlashCFI01), 946 .class_init = pflash_cfi01_class_init, 947}; 948 949static void pflash_cfi01_register_types(void) 950{ 951 type_register_static(&pflash_cfi01_info); 952} 953 954type_init(pflash_cfi01_register_types) 955 956PFlashCFI01 *pflash_cfi01_register(hwaddr base, 957 const char *name, 958 hwaddr size, 959 BlockBackend *blk, 960 uint32_t sector_len, 961 int bank_width, 962 uint16_t id0, uint16_t id1, 963 uint16_t id2, uint16_t id3, 964 int be) 965{ 966 DeviceState *dev = qdev_new(TYPE_PFLASH_CFI01); 967 968 if (blk) { 969 qdev_prop_set_drive(dev, "drive", blk); 970 } 971 assert(QEMU_IS_ALIGNED(size, sector_len)); 972 qdev_prop_set_uint32(dev, "num-blocks", size / sector_len); 973 qdev_prop_set_uint64(dev, "sector-length", sector_len); 974 qdev_prop_set_uint8(dev, "width", bank_width); 975 qdev_prop_set_bit(dev, "big-endian", !!be); 976 qdev_prop_set_uint16(dev, "id0", id0); 977 qdev_prop_set_uint16(dev, "id1", id1); 978 qdev_prop_set_uint16(dev, "id2", id2); 979 qdev_prop_set_uint16(dev, "id3", id3); 980 qdev_prop_set_string(dev, "name", name); 981 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); 982 983 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base); 984 return PFLASH_CFI01(dev); 985} 986 987BlockBackend *pflash_cfi01_get_blk(PFlashCFI01 *fl) 988{ 989 return fl->blk; 990} 991 992MemoryRegion *pflash_cfi01_get_memory(PFlashCFI01 *fl) 993{ 994 return &fl->mem; 995} 996 997/* 998 * Handle -drive if=pflash for machines that use properties. 999 * If @dinfo is null, do nothing. 1000 * Else if @fl's property "drive" is already set, fatal error. 1001 * Else set it to the BlockBackend with @dinfo. 1002 */ 1003void pflash_cfi01_legacy_drive(PFlashCFI01 *fl, DriveInfo *dinfo) 1004{ 1005 Location loc; 1006 1007 if (!dinfo) { 1008 return; 1009 } 1010 1011 loc_push_none(&loc); 1012 qemu_opts_loc_restore(dinfo->opts); 1013 if (fl->blk) { 1014 error_report("clashes with -machine"); 1015 exit(1); 1016 } 1017 qdev_prop_set_drive_err(DEVICE(fl), "drive", blk_by_legacy_dinfo(dinfo), 1018 &error_fatal); 1019 loc_pop(&loc); 1020} 1021 1022static void postload_update_cb(void *opaque, bool running, RunState state) 1023{ 1024 PFlashCFI01 *pfl = opaque; 1025 1026 /* This is called after bdrv_invalidate_cache_all. */ 1027 qemu_del_vm_change_state_handler(pfl->vmstate); 1028 pfl->vmstate = NULL; 1029 1030 trace_pflash_postload_cb(pfl->name); 1031 pflash_update(pfl, 0, pfl->sector_len * pfl->nb_blocs); 1032} 1033 1034static int pflash_post_load(void *opaque, int version_id) 1035{ 1036 PFlashCFI01 *pfl = opaque; 1037 1038 if (!pfl->ro) { 1039 pfl->vmstate = qemu_add_vm_change_state_handler(postload_update_cb, 1040 pfl); 1041 } 1042 return 0; 1043}