OSDN Git Service

hw/block/pflash_cfi02: Factor out pflash_reset_state_machine()
authorPhilippe Mathieu-Daudé <philmd@redhat.com>
Tue, 9 Mar 2021 23:27:18 +0000 (00:27 +0100)
committerPhilippe Mathieu-Daudé <philmd@redhat.com>
Thu, 18 Mar 2021 10:16:31 +0000 (11:16 +0100)
There is multiple places resetting the internal state machine.
Factor the code out in a new pflash_reset_state_machine() method.

Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Reviewed-by: David Edmondson <david.edmondson@oracle.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Message-Id: <20210310170528.1184868-8-philmd@redhat.com>

hw/block/pflash_cfi02.c

index 2ba77a0..aea47a9 100644 (file)
@@ -184,11 +184,17 @@ static void pflash_setup_mappings(PFlashCFI02 *pfl)
     pfl->rom_mode = true;
 }
 
-static void pflash_mode_read_array(PFlashCFI02 *pfl)
+static void pflash_reset_state_machine(PFlashCFI02 *pfl)
 {
-    trace_pflash_mode_read_array();
+    trace_pflash_reset();
     pfl->cmd = 0x00;
     pfl->wcycle = 0;
+}
+
+static void pflash_mode_read_array(PFlashCFI02 *pfl)
+{
+    trace_pflash_mode_read_array();
+    pflash_reset_state_machine(pfl);
     pfl->rom_mode = true;
     memory_region_rom_device_set_romd(&pfl->orig_mem, true);
 }
@@ -330,8 +336,7 @@ static uint64_t pflash_read(void *opaque, hwaddr offset, unsigned int width)
     default:
         /* This should never happen : reset state & treat it as a read*/
         DPRINTF("%s: unknown command state: %x\n", __func__, pfl->cmd);
-        pfl->wcycle = 0;
-        pfl->cmd = 0;
+        pflash_reset_state_machine(pfl);
         /* fall through to the read code */
     case 0x80: /* Erase (unlock) */
         /* We accept reads during second unlock sequence... */
@@ -669,8 +674,7 @@ static void pflash_write(void *opaque, hwaddr offset, uint64_t value,
                 }
                 reset_dq3(pfl);
                 timer_del(&pfl->timer);
-                pfl->wcycle = 0;
-                pfl->cmd = 0;
+                pflash_reset_state_machine(pfl);
                 return;
             }
             /*
@@ -710,10 +714,8 @@ static void pflash_write(void *opaque, hwaddr offset, uint64_t value,
 
     /* Reset flash */
  reset_flash:
-    trace_pflash_reset();
     pfl->bypass = 0;
-    pfl->wcycle = 0;
-    pfl->cmd = 0;
+    pflash_reset_state_machine(pfl);
     return;
 
  do_bypass: