@@ -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:
/*
Provide the Micron Xccela flash mt35xu01g with Octal command support. Signed-off-by: Francisco Iglesias <francisco.iglesias@amd.com> --- hw/block/m25p80.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+)