Provide the Micron Xccela flash mt35xu01g with Octal command support. Signed-off-by: Francisco Iglesias <francisco.igles...@amd.com> --- hw/block/m25p80.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+)
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c index a8d2519141..79e26424ec 100644 --- a/hw/block/m25p80.c +++ b/hw/block/m25p80.c @@ -360,6 +360,8 @@ typedef enum { READ4 = 0x13, FAST_READ = 0x0b, FAST_READ4 = 0x0c, + O_FAST_READ = 0x9d, + O_FAST_READ4 = 0xfd, DOR = 0x3b, DOR4 = 0x3c, QOR = 0x6b, @@ -368,6 +370,10 @@ typedef enum { DIOR4 = 0xbc, QIOR = 0xeb, QIOR4 = 0xec, + OOR = 0x8b, + OOR4 = 0x7c, + OIOR = 0xcb, + OIOR4 = 0xcc, PP = 0x02, PP4 = 0x12, @@ -375,6 +381,10 @@ typedef enum { DPP = 0xa2, QPP = 0x32, QPP_4 = 0x34, + OPP = 0x82, + OPP4 = 0x84, + EOPP = 0xc2, + EOPP4 = 0x8e, RDID_90 = 0x90, RDID_AB = 0xab, AAI_WP = 0xad, @@ -430,6 +440,7 @@ typedef enum { MAN_WINBOND, MAN_SST, MAN_ISSI, + MAN_MICRON_OCTAL, MAN_GENERIC, } Manufacturer; @@ -514,6 +525,8 @@ static inline Manufacturer get_man(Flash *s) return MAN_SST; case 0x9D: return MAN_ISSI; + case 0x2C: + return MAN_MICRON_OCTAL; default: return MAN_GENERIC; } @@ -682,15 +695,20 @@ static inline int get_addr_length(Flash *s) case PP4: case PP4_4: case QPP_4: + case OPP4: + case EOPP4: case READ4: case QIOR4: case ERASE4_4K: case ERASE4_32K: case ERASE4_SECTOR: case FAST_READ4: + case O_FAST_READ4: case DOR4: case QOR4: case DIOR4: + case OOR4: + case OIOR4: return 4; default: return s->four_bytes_address_mode ? 4 : 3; @@ -722,6 +740,10 @@ static void complete_collecting_data(Flash *s) case PP: case PP4: case PP4_4: + case OPP: + case OPP4: + case EOPP: + case EOPP4: s->state = STATE_PAGE_PROGRAM; break; case AAI_WP: @@ -741,6 +763,12 @@ static void complete_collecting_data(Flash *s) case DIOR4: case QIOR: case QIOR4: + case OOR: + case OOR4: + case OIOR: + case OIOR4: + case O_FAST_READ: + case O_FAST_READ4: s->state = STATE_READ; break; case ERASE_4K: @@ -963,6 +991,9 @@ static void decode_fast_read_cmd(Flash *s) SPANSION_DUMMY_CLK_LEN ); break; + case MAN_MICRON_OCTAL: + s->needed_bytes += 8; + break; case MAN_ISSI: /* * The Fast Read instruction code is followed by address bytes and @@ -1117,6 +1148,10 @@ static void decode_new_cmd(Flash *s, uint32_t value) case ERASE4_SECTOR: case PP: case PP4: + case OPP: + case OPP4: + case EOPP: + case EOPP4: case DIE_ERASE: case RDID_90: case RDID_AB: @@ -1184,6 +1219,15 @@ static void decode_new_cmd(Flash *s, uint32_t value) "DIO mode\n", s->cmd_in_progress); } break; + case OOR: + case OOR4: + case O_FAST_READ: + if (get_man(s) == MAN_MICRON_OCTAL) { + decode_fast_read_cmd(s); + } else { + qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Unknown cmd %x\n", value); + } + break; case DIOR: case DIOR4: @@ -1204,6 +1248,19 @@ static void decode_new_cmd(Flash *s, uint32_t value) "DIO mode\n", s->cmd_in_progress); } break; + case OIOR: + case OIOR4: + case O_FAST_READ4: + if (get_man(s) == MAN_MICRON_OCTAL) { + s->needed_bytes = get_addr_length(s); + s->needed_bytes += 16; + s->pos = 0; + s->len = 0; + s->state = STATE_COLLECTING_DATA; + } else { + qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Unknown cmd %x\n", value); + } + break; case WRSR: /* -- 2.20.1