qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v1 1/1] hw/block/m25p80: Micron Xccela mt35xu01g flash Octal comm


From: Francisco Iglesias
Subject: [PATCH v1 1/1] hw/block/m25p80: Micron Xccela mt35xu01g flash Octal command support
Date: Fri, 30 Sep 2022 18:25:55 +0200

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(+)

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]