xref: /openbmc/qemu/hw/block/pflash_cfi01.c (revision b14df228)
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 
62 struct 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 
92 static int pflash_post_load(void *opaque, int version_id);
93 
94 static 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  */
113 static 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. */
173 static 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 
222 static 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 
262 static 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 */
385 static 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, offset_end - offset,
396                          pfl->storage + 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 
404 static 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 
440 static 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 
659 static 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 
673 static 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 
687 static 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 
693 static 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 
799 static 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 
871 static 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 
890 static 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 
930 static 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 
942 static 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 
949 static void pflash_cfi01_register_types(void)
950 {
951     type_register_static(&pflash_cfi01_info);
952 }
953 
954 type_init(pflash_cfi01_register_types)
955 
956 PFlashCFI01 *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 
987 BlockBackend *pflash_cfi01_get_blk(PFlashCFI01 *fl)
988 {
989     return fl->blk;
990 }
991 
992 MemoryRegion *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  */
1003 void 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 
1022 static void postload_update_cb(void *opaque, bool running, RunState state)
1023 {
1024     PFlashCFI01 *pfl = opaque;
1025 
1026     /* This is called after bdrv_activate_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 
1034 static 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 }
1044