qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256
@ 2016-03-20 18:28 marcin.krzeminski
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 01/11] block: m25p80: Removed unused variable marcin.krzeminski
                   ` (11 more replies)
  0 siblings, 12 replies; 17+ messages in thread
From: marcin.krzeminski @ 2016-03-20 18:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: crosthwaitepeter, clg, rfsw-patches, pawel.lenkow,
	marcin.krzeminski

From: Marcin Krzeminski <marcin.krzeminski@nokia.com>

V5: Changes after review
- Macrofication of registers values
- Numonyx is default value in switch for fast read family
V4:
- Fixed RNVCR command (needed bytes set to 2 instead of 1)
- Config registers are configured only for micron flash devices
- Move config registers initialization to reset_memory function
- Removed clearing reset_enable flag when chip was selcted by CS signal
V3:
- Checkpatch run on patches
- Renamed function
V2:
- Removed support for mx66u51235 and s25fl512s from this series
- Corrected/implemented dummy cycles
- rebased to master

Marcin Krzeminski (11):
  block: m25p80: Removed unused variable
  block: m25p80: RESET_ENABLE and RESET_MEMORY commands
  block: m25p80: Widen flags variable
  block: m25p80: Extend address mode
  block: m25p80: 4byte address mode
  block: m25p80: Add configuration registers
  block: m25p80: Dummy cycles for N25Q256/512
  block: m25p80: Fast read and 4bytes commands
  block: m25p80: Implemented FSR register
  block: m25p80: n25q256a/n25q512a models
  block: m25p80: at25128a/at25256a models

 hw/block/m25p80.c | 330 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 311 insertions(+), 19 deletions(-)

-- 
2.5.0

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 01/11] block: m25p80: Removed unused variable
  2016-03-20 18:28 [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
@ 2016-03-20 18:28 ` marcin.krzeminski
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 02/11] block: m25p80: RESET_ENABLE and RESET_MEMORY commands marcin.krzeminski
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: marcin.krzeminski @ 2016-03-20 18:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: crosthwaitepeter, clg, rfsw-patches, pawel.lenkow,
	marcin.krzeminski

From: Marcin Krzeminski <marcin.krzeminski@nokia.com>

Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
---
 hw/block/m25p80.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index de24f42..2222124 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -246,8 +246,6 @@ typedef enum {
 typedef struct Flash {
     SSISlave parent_obj;
 
-    uint32_t r;
-
     BlockBackend *blk;
 
     uint8_t *storage;
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 02/11] block: m25p80: RESET_ENABLE and RESET_MEMORY commands
  2016-03-20 18:28 [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 01/11] block: m25p80: Removed unused variable marcin.krzeminski
@ 2016-03-20 18:28 ` marcin.krzeminski
  2016-03-21 17:02   ` Cédric Le Goater
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 03/11] block: m25p80: Widen flags variable marcin.krzeminski
                   ` (9 subsequent siblings)
  11 siblings, 1 reply; 17+ messages in thread
From: marcin.krzeminski @ 2016-03-20 18:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: crosthwaitepeter, clg, rfsw-patches, pawel.lenkow,
	marcin.krzeminski

From: Marcin Krzeminski <marcin.krzeminski@nokia.com>

Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
---
 hw/block/m25p80.c | 41 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 40 insertions(+), 1 deletion(-)

diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 2222124..1d053a5 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -233,6 +233,9 @@ typedef enum {
     ERASE_4K = 0x20,
     ERASE_32K = 0x52,
     ERASE_SECTOR = 0xd8,
+
+    RESET_ENABLE = 0x66,
+    RESET_MEMORY = 0x99,
 } FlashCMD;
 
 typedef enum {
@@ -260,6 +263,7 @@ typedef struct Flash {
     uint8_t cmd_in_progress;
     uint64_t cur_addr;
     bool write_enable;
+    bool reset_enable;
 
     int64_t dirty_page;
 
@@ -432,11 +436,29 @@ static void complete_collecting_data(Flash *s)
     }
 }
 
+static void reset_memory(Flash *s)
+{
+    s->cmd_in_progress = NOP;
+    s->cur_addr = 0;
+    s->len = 0;
+    s->needed_bytes = 0;
+    s->pos = 0;
+    s->state = STATE_IDLE;
+    s->write_enable = false;
+    s->reset_enable = false;
+
+    DB_PRINT_L(0, "Reset done.\n");
+}
+
 static void decode_new_cmd(Flash *s, uint32_t value)
 {
     s->cmd_in_progress = value;
     DB_PRINT_L(0, "decoded new command:%x\n", value);
 
+    if (value != RESET_MEMORY) {
+        s->reset_enable = false;
+    }
+
     switch (value) {
 
     case ERASE_4K:
@@ -541,6 +563,14 @@ static void decode_new_cmd(Flash *s, uint32_t value)
         break;
     case NOP:
         break;
+    case RESET_ENABLE:
+        s->reset_enable = true;
+        break;
+    case RESET_MEMORY:
+        if (s->reset_enable) {
+            reset_memory(s);
+        }
+        break;
     default:
         qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Unknown cmd %x\n", value);
         break;
@@ -647,6 +677,13 @@ static int m25p80_init(SSISlave *ss)
     return 0;
 }
 
+static void m25p80_reset(DeviceState *d)
+{
+    Flash *s = M25P80(d);
+
+    reset_memory(s);
+}
+
 static void m25p80_pre_save(void *opaque)
 {
     flash_sync_dirty((Flash *)opaque, -1);
@@ -654,7 +691,7 @@ static void m25p80_pre_save(void *opaque)
 
 static const VMStateDescription vmstate_m25p80 = {
     .name = "xilinx_spi",
-    .version_id = 1,
+    .version_id = 2,
     .minimum_version_id = 1,
     .pre_save = m25p80_pre_save,
     .fields = (VMStateField[]) {
@@ -666,6 +703,7 @@ static const VMStateDescription vmstate_m25p80 = {
         VMSTATE_UINT8(cmd_in_progress, Flash),
         VMSTATE_UINT64(cur_addr, Flash),
         VMSTATE_BOOL(write_enable, Flash),
+        VMSTATE_BOOL(reset_enable, Flash),
         VMSTATE_END_OF_LIST()
     }
 };
@@ -681,6 +719,7 @@ static void m25p80_class_init(ObjectClass *klass, void *data)
     k->set_cs = m25p80_cs;
     k->cs_polarity = SSI_CS_LOW;
     dc->vmsd = &vmstate_m25p80;
+    dc->reset = m25p80_reset;
     mc->pi = data;
 }
 
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 03/11] block: m25p80: Widen flags variable
  2016-03-20 18:28 [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 01/11] block: m25p80: Removed unused variable marcin.krzeminski
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 02/11] block: m25p80: RESET_ENABLE and RESET_MEMORY commands marcin.krzeminski
@ 2016-03-20 18:28 ` marcin.krzeminski
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 04/11] block: m25p80: Extend address mode marcin.krzeminski
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: marcin.krzeminski @ 2016-03-20 18:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: crosthwaitepeter, clg, rfsw-patches, pawel.lenkow,
	marcin.krzeminski

From: Marcin Krzeminski <marcin.krzeminski@nokia.com>

Extend the width of the flags variable to support the already existing
(but unused) WR_1 flag, which is above the range of 8 bits.
This allows support of EEPROM emulation which requires the WR_1 feature.

Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
---
 hw/block/m25p80.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 1d053a5..cbb8b3e 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -61,7 +61,7 @@ typedef struct FlashPartInfo {
     uint32_t sector_size;
     uint32_t n_sectors;
     uint32_t page_size;
-    uint8_t flags;
+    uint16_t flags;
 } FlashPartInfo;
 
 /* adapted from linux */
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 04/11] block: m25p80: Extend address mode
  2016-03-20 18:28 [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
                   ` (2 preceding siblings ...)
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 03/11] block: m25p80: Widen flags variable marcin.krzeminski
@ 2016-03-20 18:28 ` marcin.krzeminski
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 05/11] block: m25p80: 4byte " marcin.krzeminski
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: marcin.krzeminski @ 2016-03-20 18:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: crosthwaitepeter, clg, rfsw-patches, pawel.lenkow,
	marcin.krzeminski

From: Marcin Krzeminski <marcin.krzeminski@nokia.com>

Extend address mode allows to switch flash 16 MiB banks,
allowing user to access all flash sectors.
This access mode is used by u-boot.

Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
---
 hw/block/m25p80.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index cbb8b3e..c5de4ee 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -48,6 +48,9 @@
  */
 #define WR_1 0x100
 
+/* 16 MiB max in 3 byte address mode */
+#define MAX_3BYTES_SIZE 0x1000000
+
 typedef struct FlashPartInfo {
     const char *part_name;
     /* jedec code. (jedec >> 16) & 0xff is the 1st byte, >> 8 the 2nd etc */
@@ -234,6 +237,9 @@ typedef enum {
     ERASE_32K = 0x52,
     ERASE_SECTOR = 0xd8,
 
+    EXTEND_ADDR_READ = 0xC8,
+    EXTEND_ADDR_WRITE = 0xC5,
+
     RESET_ENABLE = 0x66,
     RESET_MEMORY = 0x99,
 } FlashCMD;
@@ -264,6 +270,7 @@ typedef struct Flash {
     uint64_t cur_addr;
     bool write_enable;
     bool reset_enable;
+    uint8_t ear;
 
     int64_t dirty_page;
 
@@ -404,6 +411,7 @@ static void complete_collecting_data(Flash *s)
     s->cur_addr = s->data[0] << 16;
     s->cur_addr |= s->data[1] << 8;
     s->cur_addr |= s->data[2];
+    s->cur_addr += (s->ear & 0x3) * MAX_3BYTES_SIZE;
 
     s->state = STATE_IDLE;
 
@@ -431,6 +439,9 @@ static void complete_collecting_data(Flash *s)
             s->write_enable = false;
         }
         break;
+    case EXTEND_ADDR_WRITE:
+        s->ear = s->data[0];
+        break;
     default:
         break;
     }
@@ -440,6 +451,7 @@ static void reset_memory(Flash *s)
 {
     s->cmd_in_progress = NOP;
     s->cur_addr = 0;
+    s->ear = 0;
     s->len = 0;
     s->needed_bytes = 0;
     s->pos = 0;
@@ -563,6 +575,20 @@ static void decode_new_cmd(Flash *s, uint32_t value)
         break;
     case NOP:
         break;
+    case EXTEND_ADDR_READ:
+        s->data[0] = s->ear;
+        s->pos = 0;
+        s->len = 1;
+        s->state = STATE_READING_DATA;
+        break;
+    case EXTEND_ADDR_WRITE:
+        if (s->write_enable) {
+            s->needed_bytes = 1;
+            s->pos = 0;
+            s->len = 0;
+            s->state = STATE_COLLECTING_DATA;
+        }
+        break;
     case RESET_ENABLE:
         s->reset_enable = true;
         break;
@@ -703,6 +729,7 @@ static const VMStateDescription vmstate_m25p80 = {
         VMSTATE_UINT8(cmd_in_progress, Flash),
         VMSTATE_UINT64(cur_addr, Flash),
         VMSTATE_BOOL(write_enable, Flash),
+        VMSTATE_UINT8(ear, Flash),
         VMSTATE_BOOL(reset_enable, Flash),
         VMSTATE_END_OF_LIST()
     }
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 05/11] block: m25p80: 4byte address mode
  2016-03-20 18:28 [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
                   ` (3 preceding siblings ...)
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 04/11] block: m25p80: Extend address mode marcin.krzeminski
@ 2016-03-20 18:28 ` marcin.krzeminski
  2016-03-21 17:47   ` Cédric Le Goater
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 06/11] block: m25p80: Add configuration registers marcin.krzeminski
                   ` (6 subsequent siblings)
  11 siblings, 1 reply; 17+ messages in thread
From: marcin.krzeminski @ 2016-03-20 18:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: crosthwaitepeter, clg, rfsw-patches, pawel.lenkow,
	marcin.krzeminski

From: Marcin Krzeminski <marcin.krzeminski@nokia.com>

This patch adds only 4byte address mode (does not cover dummy cycles).
This mode is needed to access more than 16 MiB of flash.

Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
---
 hw/block/m25p80.c | 43 +++++++++++++++++++++++++++++++++----------
 1 file changed, 33 insertions(+), 10 deletions(-)

diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index c5de4ee..101a43f 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -237,6 +237,9 @@ typedef enum {
     ERASE_32K = 0x52,
     ERASE_SECTOR = 0xd8,
 
+    EN_4BYTE_ADDR = 0xB7,
+    EX_4BYTE_ADDR = 0xE9,
+
     EXTEND_ADDR_READ = 0xC8,
     EXTEND_ADDR_WRITE = 0xC5,
 
@@ -269,6 +272,7 @@ typedef struct Flash {
     uint8_t cmd_in_progress;
     uint64_t cur_addr;
     bool write_enable;
+    bool four_bytes_address_mode;
     bool reset_enable;
     uint8_t ear;
 
@@ -406,12 +410,25 @@ void flash_write8(Flash *s, uint64_t addr, uint8_t data)
     s->dirty_page = page;
 }
 
+static inline int get_addr_length(Flash *s)
+{
+    return s->four_bytes_address_mode ? 4 : 3;
+}
+
 static void complete_collecting_data(Flash *s)
 {
-    s->cur_addr = s->data[0] << 16;
-    s->cur_addr |= s->data[1] << 8;
-    s->cur_addr |= s->data[2];
-    s->cur_addr += (s->ear & 0x3) * MAX_3BYTES_SIZE;
+    int i;
+
+    s->cur_addr = 0;
+
+    for (i = 0; i < get_addr_length(s); ++i) {
+        s->cur_addr <<= 8;
+        s->cur_addr |= s->data[i];
+    }
+
+    if (get_addr_length(s) == 3) {
+        s->cur_addr += (s->ear & 0x3) * MAX_3BYTES_SIZE;
+    }
 
     s->state = STATE_IDLE;
 
@@ -452,6 +469,7 @@ static void reset_memory(Flash *s)
     s->cmd_in_progress = NOP;
     s->cur_addr = 0;
     s->ear = 0;
+    s->four_bytes_address_mode = false;
     s->len = 0;
     s->needed_bytes = 0;
     s->pos = 0;
@@ -480,7 +498,7 @@ static void decode_new_cmd(Flash *s, uint32_t value)
     case DPP:
     case QPP:
     case PP:
-        s->needed_bytes = 3;
+        s->needed_bytes = get_addr_length(s);
         s->pos = 0;
         s->len = 0;
         s->state = STATE_COLLECTING_DATA;
@@ -489,7 +507,7 @@ static void decode_new_cmd(Flash *s, uint32_t value)
     case FAST_READ:
     case DOR:
     case QOR:
-        s->needed_bytes = 4;
+        s->needed_bytes = get_addr_length(s) + 1;
         s->pos = 0;
         s->len = 0;
         s->state = STATE_COLLECTING_DATA;
@@ -501,9 +519,8 @@ static void decode_new_cmd(Flash *s, uint32_t value)
         case JEDEC_SPANSION:
             s->needed_bytes = 4;
             break;
-        case JEDEC_NUMONYX:
         default:
-            s->needed_bytes = 5;
+            s->needed_bytes = get_addr_length(s) + 2;
         }
         s->pos = 0;
         s->len = 0;
@@ -516,9 +533,8 @@ static void decode_new_cmd(Flash *s, uint32_t value)
         case JEDEC_SPANSION:
             s->needed_bytes = 6;
             break;
-        case JEDEC_NUMONYX:
         default:
-            s->needed_bytes = 8;
+            s->needed_bytes = get_addr_length(s) + 4;
         }
         s->pos = 0;
         s->len = 0;
@@ -575,6 +591,12 @@ static void decode_new_cmd(Flash *s, uint32_t value)
         break;
     case NOP:
         break;
+    case EN_4BYTE_ADDR:
+        s->four_bytes_address_mode = true;
+        break;
+    case EX_4BYTE_ADDR:
+        s->four_bytes_address_mode = false;
+        break;
     case EXTEND_ADDR_READ:
         s->data[0] = s->ear;
         s->pos = 0;
@@ -729,6 +751,7 @@ static const VMStateDescription vmstate_m25p80 = {
         VMSTATE_UINT8(cmd_in_progress, Flash),
         VMSTATE_UINT64(cur_addr, Flash),
         VMSTATE_BOOL(write_enable, Flash),
+        VMSTATE_BOOL(four_bytes_address_mode, Flash),
         VMSTATE_UINT8(ear, Flash),
         VMSTATE_BOOL(reset_enable, Flash),
         VMSTATE_END_OF_LIST()
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 06/11] block: m25p80: Add configuration registers
  2016-03-20 18:28 [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
                   ` (4 preceding siblings ...)
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 05/11] block: m25p80: 4byte " marcin.krzeminski
@ 2016-03-20 18:28 ` marcin.krzeminski
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 07/11] block: m25p80: Dummy cycles for N25Q256/512 marcin.krzeminski
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: marcin.krzeminski @ 2016-03-20 18:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: crosthwaitepeter, clg, rfsw-patches, pawel.lenkow,
	marcin.krzeminski

From: Marcin Krzeminski <marcin.krzeminski@nokia.com>

This patch adds both volatile and non volatile configuration registers
and commands to allow modify them. It is needed for proper handling
dummy cycles. Initialization of those registers and flash state
has been included as well.
Some of this registers are used by kernel.

Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
Acked-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
---
 hw/block/m25p80.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 128 insertions(+)

diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 101a43f..6dc5b6f 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -26,6 +26,7 @@
 #include "sysemu/block-backend.h"
 #include "sysemu/blockdev.h"
 #include "hw/ssi/ssi.h"
+#include "qemu/bitops.h"
 
 #ifndef M25P80_ERR_DEBUG
 #define M25P80_ERR_DEBUG 0
@@ -82,6 +83,26 @@ typedef struct FlashPartInfo {
 #define JEDEC_WINBOND 0xEF
 #define JEDEC_SPANSION 0x01
 
+/* Numonyx (Micron) Configuration register macros */
+#define VCFG_DUMMY 0x1
+#define VCFG_WRAP_SEQUENTIAL 0x2
+#define NVCFG_XIP_MODE_DISABLED (7 << 9)
+#define NVCFG_XIP_MODE_MASK (7 << 9)
+#define VCFG_XIP_MODE_ENABLED (1 << 3)
+#define CFG_DUMMY_CLK_LEN 4
+#define NVCFG_DUMMY_CLK_POS 12
+#define VCFG_DUMMY_CLK_POS 4
+#define EVCFG_OUT_DRIVER_STRENGHT_DEF 7
+#define EVCFG_VPP_ACCELERATOR (1 << 3)
+#define EVCFG_RESET_HOLD_ENABLED (1 << 4)
+#define NVCFG_DUAL_IO_MASK (1 << 2)
+#define EVCFG_DUAL_IO_ENABLED (1 << 6)
+#define NVCFG_QUAD_IO_MASK (1 << 3)
+#define EVCFG_QUAD_IO_ENABLED (1 << 7)
+#define NVCFG_4BYTE_ADDR_MASK (1 << 0)
+#define NVCFG_LOWER_SEGMENT_MASK (1 << 1)
+#define CFG_UPPER_128MB_SEG_ENABLED 0x3
+
 static const FlashPartInfo known_devices[] = {
     /* Atmel -- some are (confusingly) marketed as "DataFlash" */
     { INFO("at25fs010",   0x1f6601,      0,  32 << 10,   4, ER_4K) },
@@ -245,6 +266,15 @@ typedef enum {
 
     RESET_ENABLE = 0x66,
     RESET_MEMORY = 0x99,
+
+    RNVCR = 0xB5,
+    WNVCR = 0xB1,
+
+    RVCR = 0x85,
+    WVCR = 0x81,
+
+    REVCR = 0x65,
+    WEVCR = 0x61,
 } FlashCMD;
 
 typedef enum {
@@ -271,6 +301,9 @@ typedef struct Flash {
     uint8_t needed_bytes;
     uint8_t cmd_in_progress;
     uint64_t cur_addr;
+    uint32_t nonvolatile_cfg;
+    uint32_t volatile_cfg;
+    uint32_t enh_volatile_cfg;
     bool write_enable;
     bool four_bytes_address_mode;
     bool reset_enable;
@@ -459,6 +492,15 @@ static void complete_collecting_data(Flash *s)
     case EXTEND_ADDR_WRITE:
         s->ear = s->data[0];
         break;
+    case WNVCR:
+        s->nonvolatile_cfg = s->data[0] | (s->data[1] << 8);
+        break;
+    case WVCR:
+        s->volatile_cfg = s->data[0];
+        break;
+    case WEVCR:
+        s->enh_volatile_cfg = s->data[0];
+        break;
     default:
         break;
     }
@@ -477,6 +519,40 @@ static void reset_memory(Flash *s)
     s->write_enable = false;
     s->reset_enable = false;
 
+    if (((s->pi->jedec >> 16) & 0xFF) == JEDEC_NUMONYX) {
+        s->volatile_cfg = 0;
+        s->volatile_cfg |= VCFG_DUMMY;
+        s->volatile_cfg |= VCFG_WRAP_SEQUENTIAL;
+        if ((s->nonvolatile_cfg & NVCFG_XIP_MODE_MASK)
+                                != NVCFG_XIP_MODE_DISABLED) {
+            s->volatile_cfg |= VCFG_XIP_MODE_ENABLED;
+        }
+        s->volatile_cfg |= deposit32(s->volatile_cfg,
+                            VCFG_DUMMY_CLK_POS,
+                            CFG_DUMMY_CLK_LEN,
+                            extract32(s->nonvolatile_cfg,
+                                        NVCFG_DUMMY_CLK_POS,
+                                        CFG_DUMMY_CLK_LEN)
+                            );
+
+        s->enh_volatile_cfg = 0;
+        s->enh_volatile_cfg |= EVCFG_OUT_DRIVER_STRENGHT_DEF;
+        s->enh_volatile_cfg |= EVCFG_VPP_ACCELERATOR;
+        s->enh_volatile_cfg |= EVCFG_RESET_HOLD_ENABLED;
+        if (s->nonvolatile_cfg & NVCFG_DUAL_IO_MASK) {
+            s->enh_volatile_cfg |= EVCFG_DUAL_IO_ENABLED;
+        }
+        if (s->nonvolatile_cfg & NVCFG_QUAD_IO_MASK) {
+            s->enh_volatile_cfg |= EVCFG_QUAD_IO_ENABLED;
+        }
+        if (!(s->nonvolatile_cfg & NVCFG_4BYTE_ADDR_MASK)) {
+            s->four_bytes_address_mode = true;
+        }
+        if (!(s->nonvolatile_cfg & NVCFG_LOWER_SEGMENT_MASK)) {
+            s->ear = CFG_UPPER_128MB_SEG_ENABLED;
+        }
+    }
+
     DB_PRINT_L(0, "Reset done.\n");
 }
 
@@ -611,6 +687,49 @@ static void decode_new_cmd(Flash *s, uint32_t value)
             s->state = STATE_COLLECTING_DATA;
         }
         break;
+    case RNVCR:
+        s->data[0] = s->nonvolatile_cfg & 0xFF;
+        s->data[1] = (s->nonvolatile_cfg >> 8) & 0xFF;
+        s->pos = 0;
+        s->len = 2;
+        s->state = STATE_READING_DATA;
+        break;
+    case WNVCR:
+        if (s->write_enable) {
+            s->needed_bytes = 2;
+            s->pos = 0;
+            s->len = 0;
+            s->state = STATE_COLLECTING_DATA;
+        }
+        break;
+    case RVCR:
+        s->data[0] = s->volatile_cfg & 0xFF;
+        s->pos = 0;
+        s->len = 1;
+        s->state = STATE_READING_DATA;
+        break;
+    case WVCR:
+        if (s->write_enable) {
+            s->needed_bytes = 1;
+            s->pos = 0;
+            s->len = 0;
+            s->state = STATE_COLLECTING_DATA;
+        }
+        break;
+    case REVCR:
+        s->data[0] = s->enh_volatile_cfg & 0xFF;
+        s->pos = 0;
+        s->len = 1;
+        s->state = STATE_READING_DATA;
+        break;
+    case WEVCR:
+        if (s->write_enable) {
+            s->needed_bytes = 1;
+            s->pos = 0;
+            s->len = 0;
+            s->state = STATE_COLLECTING_DATA;
+        }
+        break;
     case RESET_ENABLE:
         s->reset_enable = true;
         break;
@@ -737,6 +856,11 @@ static void m25p80_pre_save(void *opaque)
     flash_sync_dirty((Flash *)opaque, -1);
 }
 
+static Property m25p80_properties[] = {
+    DEFINE_PROP_UINT32("nonvolatile-cfg", Flash, nonvolatile_cfg, 0x8FFF),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
 static const VMStateDescription vmstate_m25p80 = {
     .name = "xilinx_spi",
     .version_id = 2,
@@ -754,6 +878,9 @@ static const VMStateDescription vmstate_m25p80 = {
         VMSTATE_BOOL(four_bytes_address_mode, Flash),
         VMSTATE_UINT8(ear, Flash),
         VMSTATE_BOOL(reset_enable, Flash),
+        VMSTATE_UINT32(nonvolatile_cfg, Flash),
+        VMSTATE_UINT32(volatile_cfg, Flash),
+        VMSTATE_UINT32(enh_volatile_cfg, Flash),
         VMSTATE_END_OF_LIST()
     }
 };
@@ -769,6 +896,7 @@ static void m25p80_class_init(ObjectClass *klass, void *data)
     k->set_cs = m25p80_cs;
     k->cs_polarity = SSI_CS_LOW;
     dc->vmsd = &vmstate_m25p80;
+    dc->props = m25p80_properties;
     dc->reset = m25p80_reset;
     mc->pi = data;
 }
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 07/11] block: m25p80: Dummy cycles for N25Q256/512
  2016-03-20 18:28 [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
                   ` (5 preceding siblings ...)
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 06/11] block: m25p80: Add configuration registers marcin.krzeminski
@ 2016-03-20 18:28 ` marcin.krzeminski
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 08/11] block: m25p80: Fast read and 4bytes commands marcin.krzeminski
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: marcin.krzeminski @ 2016-03-20 18:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: crosthwaitepeter, clg, rfsw-patches, pawel.lenkow,
	marcin.krzeminski

From: Marcin Krzeminski <marcin.krzeminski@nokia.com>

Use the setting from the volatile cfg register to correctly
set the number of dummy cycles.

Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
---
 hw/block/m25p80.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 6dc5b6f..c245531 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -583,7 +583,11 @@ static void decode_new_cmd(Flash *s, uint32_t value)
     case FAST_READ:
     case DOR:
     case QOR:
-        s->needed_bytes = get_addr_length(s) + 1;
+        s->needed_bytes = get_addr_length(s);
+        if (((s->pi->jedec >> 16) & 0xFF) == JEDEC_NUMONYX) {
+            /* Dummy cycles modeled with bytes writes instead of bits */
+            s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
+        }
         s->pos = 0;
         s->len = 0;
         s->state = STATE_COLLECTING_DATA;
@@ -596,7 +600,9 @@ static void decode_new_cmd(Flash *s, uint32_t value)
             s->needed_bytes = 4;
             break;
         default:
-            s->needed_bytes = get_addr_length(s) + 2;
+            s->needed_bytes = get_addr_length(s);
+            /* Dummy cycles modeled with bytes writes instead of bits */
+            s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
         }
         s->pos = 0;
         s->len = 0;
@@ -610,7 +616,9 @@ static void decode_new_cmd(Flash *s, uint32_t value)
             s->needed_bytes = 6;
             break;
         default:
-            s->needed_bytes = get_addr_length(s) + 4;
+            s->needed_bytes = get_addr_length(s);
+            /* Dummy cycles modeled with bytes writes instead of bits */
+            s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
         }
         s->pos = 0;
         s->len = 0;
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 08/11] block: m25p80: Fast read and 4bytes commands
  2016-03-20 18:28 [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
                   ` (6 preceding siblings ...)
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 07/11] block: m25p80: Dummy cycles for N25Q256/512 marcin.krzeminski
@ 2016-03-20 18:28 ` marcin.krzeminski
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 09/11] block: m25p80: Implemented FSR register marcin.krzeminski
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: marcin.krzeminski @ 2016-03-20 18:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: crosthwaitepeter, clg, rfsw-patches, pawel.lenkow,
	marcin.krzeminski

From: Marcin Krzeminski <marcin.krzeminski@nokia.com>

Adds fast read and 4bytes commands family.
This work is based on Pawel Lenkow patch from v1.

Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
---
 hw/block/m25p80.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 46 insertions(+), 4 deletions(-)

diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index c245531..c0b7b8c 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -243,20 +243,29 @@ typedef enum {
     JEDEC_READ = 0x9f,
     BULK_ERASE = 0xc7,
 
-    READ = 0x3,
-    FAST_READ = 0xb,
+    READ = 0x03,
+    READ4 = 0x13,
+    FAST_READ = 0x0b,
+    FAST_READ4 = 0x0c,
     DOR = 0x3b,
+    DOR4 = 0x3c,
     QOR = 0x6b,
+    QOR4 = 0x6c,
     DIOR = 0xbb,
+    DIOR4 = 0xbc,
     QIOR = 0xeb,
+    QIOR4 = 0xec,
 
-    PP = 0x2,
+    PP = 0x02,
+    PP4 = 0x12,
     DPP = 0xa2,
     QPP = 0x32,
 
     ERASE_4K = 0x20,
+    ERASE4_4K = 0x21,
     ERASE_32K = 0x52,
     ERASE_SECTOR = 0xd8,
+    ERASE4_SECTOR = 0xdc,
 
     EN_4BYTE_ADDR = 0xB7,
     EX_4BYTE_ADDR = 0xE9,
@@ -379,6 +388,7 @@ static void flash_erase(Flash *s, int offset, FlashCMD cmd)
 
     switch (cmd) {
     case ERASE_4K:
+    case ERASE4_4K:
         len = 4 << 10;
         capa_to_assert = ER_4K;
         break;
@@ -387,6 +397,7 @@ static void flash_erase(Flash *s, int offset, FlashCMD cmd)
         capa_to_assert = ER_32K;
         break;
     case ERASE_SECTOR:
+    case ERASE4_SECTOR:
         len = s->pi->sector_size;
         break;
     case BULK_ERASE:
@@ -445,7 +456,20 @@ void flash_write8(Flash *s, uint64_t addr, uint8_t data)
 
 static inline int get_addr_length(Flash *s)
 {
-    return s->four_bytes_address_mode ? 4 : 3;
+   switch (s->cmd_in_progress) {
+   case PP4:
+   case READ4:
+   case QIOR4:
+   case ERASE4_4K:
+   case ERASE4_SECTOR:
+   case FAST_READ4:
+   case DOR4:
+   case QOR4:
+   case DIOR4:
+       return 4;
+   default:
+       return s->four_bytes_address_mode ? 4 : 3;
+   }
 }
 
 static void complete_collecting_data(Flash *s)
@@ -469,19 +493,28 @@ static void complete_collecting_data(Flash *s)
     case DPP:
     case QPP:
     case PP:
+    case PP4:
         s->state = STATE_PAGE_PROGRAM;
         break;
     case READ:
+    case READ4:
     case FAST_READ:
+    case FAST_READ4:
     case DOR:
+    case DOR4:
     case QOR:
+    case QOR4:
     case DIOR:
+    case DIOR4:
     case QIOR:
+    case QIOR4:
         s->state = STATE_READ;
         break;
     case ERASE_4K:
+    case ERASE4_4K:
     case ERASE_32K:
     case ERASE_SECTOR:
+    case ERASE4_SECTOR:
         flash_erase(s, s->cur_addr, s->cmd_in_progress);
         break;
     case WRSR:
@@ -568,12 +601,16 @@ static void decode_new_cmd(Flash *s, uint32_t value)
     switch (value) {
 
     case ERASE_4K:
+    case ERASE4_4K:
     case ERASE_32K:
     case ERASE_SECTOR:
+    case ERASE4_SECTOR:
     case READ:
+    case READ4:
     case DPP:
     case QPP:
     case PP:
+    case PP4:
         s->needed_bytes = get_addr_length(s);
         s->pos = 0;
         s->len = 0;
@@ -581,8 +618,11 @@ static void decode_new_cmd(Flash *s, uint32_t value)
         break;
 
     case FAST_READ:
+    case FAST_READ4:
     case DOR:
+    case DOR4:
     case QOR:
+    case QOR4:
         s->needed_bytes = get_addr_length(s);
         if (((s->pi->jedec >> 16) & 0xFF) == JEDEC_NUMONYX) {
             /* Dummy cycles modeled with bytes writes instead of bits */
@@ -594,6 +634,7 @@ static void decode_new_cmd(Flash *s, uint32_t value)
         break;
 
     case DIOR:
+    case DIOR4:
         switch ((s->pi->jedec >> 16) & 0xFF) {
         case JEDEC_WINBOND:
         case JEDEC_SPANSION:
@@ -610,6 +651,7 @@ static void decode_new_cmd(Flash *s, uint32_t value)
         break;
 
     case QIOR:
+    case QIOR4:
         switch ((s->pi->jedec >> 16) & 0xFF) {
         case JEDEC_WINBOND:
         case JEDEC_SPANSION:
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 09/11] block: m25p80: Implemented FSR register
  2016-03-20 18:28 [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
                   ` (7 preceding siblings ...)
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 08/11] block: m25p80: Fast read and 4bytes commands marcin.krzeminski
@ 2016-03-20 18:28 ` marcin.krzeminski
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 10/11] block: m25p80: n25q256a/n25q512a models marcin.krzeminski
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: marcin.krzeminski @ 2016-03-20 18:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: crosthwaitepeter, clg, rfsw-patches, pawel.lenkow,
	marcin.krzeminski

From: Marcin Krzeminski <marcin.krzeminski@nokia.com>

Implements FSR register, it is used for busy waits.

Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
---
 hw/block/m25p80.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index c0b7b8c..63c99f3 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -103,6 +103,10 @@ typedef struct FlashPartInfo {
 #define NVCFG_LOWER_SEGMENT_MASK (1 << 1)
 #define CFG_UPPER_128MB_SEG_ENABLED 0x3
 
+/* Numonyx (Micron) Flag Status Register macros */
+#define FSR_4BYTE_ADDR_MODE_ENABLED 0x1
+#define FSR_FLASH_READY (1 << 7)
+
 static const FlashPartInfo known_devices[] = {
     /* Atmel -- some are (confusingly) marketed as "DataFlash" */
     { INFO("at25fs010",   0x1f6601,      0,  32 << 10,   4, ER_4K) },
@@ -242,6 +246,7 @@ typedef enum {
     WREN = 0x6,
     JEDEC_READ = 0x9f,
     BULK_ERASE = 0xc7,
+    READ_FSR = 0x70,
 
     READ = 0x03,
     READ4 = 0x13,
@@ -690,6 +695,16 @@ static void decode_new_cmd(Flash *s, uint32_t value)
         s->state = STATE_READING_DATA;
         break;
 
+    case READ_FSR:
+        s->data[0] = FSR_FLASH_READY;
+        if (s->four_bytes_address_mode) {
+            s->data[0] |= FSR_4BYTE_ADDR_MODE_ENABLED;
+        }
+        s->pos = 0;
+        s->len = 1;
+        s->state = STATE_READING_DATA;
+        break;
+
     case JEDEC_READ:
         DB_PRINT_L(0, "populated jedec code\n");
         s->data[0] = (s->pi->jedec >> 16) & 0xff;
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 10/11] block: m25p80: n25q256a/n25q512a models
  2016-03-20 18:28 [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
                   ` (8 preceding siblings ...)
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 09/11] block: m25p80: Implemented FSR register marcin.krzeminski
@ 2016-03-20 18:28 ` marcin.krzeminski
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 11/11] block: m25p80: at25128a/at25256a models marcin.krzeminski
  2016-03-23 15:30 ` [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 Peter Maydell
  11 siblings, 0 replies; 17+ messages in thread
From: marcin.krzeminski @ 2016-03-20 18:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: crosthwaitepeter, clg, rfsw-patches, pawel.lenkow,
	marcin.krzeminski

From: Marcin Krzeminski <marcin.krzeminski@nokia.com>

Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
---
 hw/block/m25p80.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 63c99f3..2bbf492 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -234,8 +234,9 @@ static const FlashPartInfo known_devices[] = {
     { INFO("w25q80bl",    0xef4014,      0,  64 << 10,  16, ER_4K) },
     { INFO("w25q256",     0xef4019,      0,  64 << 10, 512, ER_4K) },
 
-    /* Numonyx -- n25q128 */
     { INFO("n25q128",      0x20ba18,      0,  64 << 10, 256, 0) },
+    { INFO("n25q256a",     0x20ba19,      0,  64 << 10, 512, ER_4K) },
+    { INFO("n25q512a",     0x20ba20,      0,  64 << 10, 1024, ER_4K) },
 };
 
 typedef enum {
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Qemu-devel] [PATCH v5 11/11] block: m25p80: at25128a/at25256a models
  2016-03-20 18:28 [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
                   ` (9 preceding siblings ...)
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 10/11] block: m25p80: n25q256a/n25q512a models marcin.krzeminski
@ 2016-03-20 18:28 ` marcin.krzeminski
  2016-03-23 15:30 ` [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 Peter Maydell
  11 siblings, 0 replies; 17+ messages in thread
From: marcin.krzeminski @ 2016-03-20 18:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: crosthwaitepeter, clg, rfsw-patches, pawel.lenkow,
	marcin.krzeminski

From: Marcin Krzeminski <marcin.krzeminski@nokia.com>

Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
---
 hw/block/m25p80.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 2bbf492..1b75c87 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -47,7 +47,7 @@
 /* set to allow the page program command to write 0s back to 1. Useful for
  * modelling EEPROM with SPI flash command set
  */
-#define WR_1 0x100
+#define EEPROM 0x100
 
 /* 16 MiB max in 3 byte address mode */
 #define MAX_3BYTES_SIZE 0x1000000
@@ -123,6 +123,12 @@ static const FlashPartInfo known_devices[] = {
 
     { INFO("at45db081d",  0x1f2500,      0,  64 << 10,  16, ER_4K) },
 
+    /* Atmel EEPROMS - it is assumed, that don't care bit in command
+     * is set to 0. Block protection is not supported.
+     */
+    { INFO("at25128a-nonjedec", 0x0,     0,         1, 131072, EEPROM) },
+    { INFO("at25256a-nonjedec", 0x0,     0,         1, 262144, EEPROM) },
+
     /* EON -- en25xxx */
     { INFO("en25f32",     0x1c3116,      0,  64 << 10,  64, ER_4K) },
     { INFO("en25p32",     0x1c2016,      0,  64 << 10,  64, 0) },
@@ -450,7 +456,7 @@ void flash_write8(Flash *s, uint64_t addr, uint8_t data)
                    " -> %" PRIx8 "\n", addr, prev, data);
     }
 
-    if (s->pi->flags & WR_1) {
+    if (s->pi->flags & EEPROM) {
         s->storage[s->cur_addr] = data;
     } else {
         s->storage[s->cur_addr] &= data;
@@ -462,6 +468,11 @@ void flash_write8(Flash *s, uint64_t addr, uint8_t data)
 
 static inline int get_addr_length(Flash *s)
 {
+   /* check if eeprom is in use */
+    if (s->pi->flags == EEPROM) {
+        return 2;
+    }
+
    switch (s->cmd_in_progress) {
    case PP4:
    case READ4:
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [Qemu-devel] [PATCH v5 02/11] block: m25p80: RESET_ENABLE and RESET_MEMORY commands
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 02/11] block: m25p80: RESET_ENABLE and RESET_MEMORY commands marcin.krzeminski
@ 2016-03-21 17:02   ` Cédric Le Goater
  2016-03-21 17:38     ` [Qemu-devel] ODP: " Krzeminski, Marcin (Nokia - PL/Wroclaw)
  0 siblings, 1 reply; 17+ messages in thread
From: Cédric Le Goater @ 2016-03-21 17:02 UTC (permalink / raw)
  To: marcin.krzeminski, qemu-devel
  Cc: crosthwaitepeter, pawel.lenkow, rfsw-patches

Hello Marcin,

One minor comment below,


On 03/20/2016 07:28 PM, marcin.krzeminski@nokia.com wrote:
> From: Marcin Krzeminski <marcin.krzeminski@nokia.com>
> 
> Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
> Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
> ---
>  hw/block/m25p80.c | 41 ++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 40 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
> index 2222124..1d053a5 100644
> --- a/hw/block/m25p80.c
> +++ b/hw/block/m25p80.c
> @@ -233,6 +233,9 @@ typedef enum {
>      ERASE_4K = 0x20,
>      ERASE_32K = 0x52,
>      ERASE_SECTOR = 0xd8,
> +
> +    RESET_ENABLE = 0x66,
> +    RESET_MEMORY = 0x99,
>  } FlashCMD;
> 
>  typedef enum {
> @@ -260,6 +263,7 @@ typedef struct Flash {
>      uint8_t cmd_in_progress;
>      uint64_t cur_addr;
>      bool write_enable;
> +    bool reset_enable;
> 
>      int64_t dirty_page;
> 
> @@ -432,11 +436,29 @@ static void complete_collecting_data(Flash *s)
>      }
>  }
> 
> +static void reset_memory(Flash *s)
> +{
> +    s->cmd_in_progress = NOP;
> +    s->cur_addr = 0;
> +    s->len = 0;
> +    s->needed_bytes = 0;
> +    s->pos = 0;
> +    s->state = STATE_IDLE;
> +    s->write_enable = false;
> +    s->reset_enable = false;
> +
> +    DB_PRINT_L(0, "Reset done.\n");
> +}
> +
>  static void decode_new_cmd(Flash *s, uint32_t value)
>  {
>      s->cmd_in_progress = value;
>      DB_PRINT_L(0, "decoded new command:%x\n", value);
> 
> +    if (value != RESET_MEMORY) {
> +        s->reset_enable = false;
> +    }
> +
>      switch (value) {
> 
>      case ERASE_4K:
> @@ -541,6 +563,14 @@ static void decode_new_cmd(Flash *s, uint32_t value)
>          break;
>      case NOP:
>          break;
> +    case RESET_ENABLE:
> +        s->reset_enable = true;
> +        break;
> +    case RESET_MEMORY:
> +        if (s->reset_enable) {
> +            reset_memory(s);
> +        }
> +        break;
>      default:
>          qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Unknown cmd %x\n", value);
>          break;
> @@ -647,6 +677,13 @@ static int m25p80_init(SSISlave *ss)
>      return 0;
>  }
> 
> +static void m25p80_reset(DeviceState *d)
> +{
> +    Flash *s = M25P80(d);
> +
> +    reset_memory(s);
> +}
> +
>  static void m25p80_pre_save(void *opaque)
>  {
>      flash_sync_dirty((Flash *)opaque, -1);
> @@ -654,7 +691,7 @@ static void m25p80_pre_save(void *opaque)
> 
>  static const VMStateDescription vmstate_m25p80 = {
>      .name = "xilinx_spi",
> -    .version_id = 1,
> +    .version_id = 2,
>      .minimum_version_id = 1,
>      .pre_save = m25p80_pre_save,
>      .fields = (VMStateField[]) {
> @@ -666,6 +703,7 @@ static const VMStateDescription vmstate_m25p80 = {
>          VMSTATE_UINT8(cmd_in_progress, Flash),
>          VMSTATE_UINT64(cur_addr, Flash),
>          VMSTATE_BOOL(write_enable, Flash),
> +        VMSTATE_BOOL(reset_enable, Flash),

Shouldn't that be VMSTATE_BOOL_V(reset_enable, Flash, 2) ? 

C.

>          VMSTATE_END_OF_LIST()
>      }
>  };
> @@ -681,6 +719,7 @@ static void m25p80_class_init(ObjectClass *klass, void *data)
>      k->set_cs = m25p80_cs;
>      k->cs_polarity = SSI_CS_LOW;
>      dc->vmsd = &vmstate_m25p80;
> +    dc->reset = m25p80_reset;
>      mc->pi = data;
>  }
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Qemu-devel] ODP: [PATCH v5 02/11] block: m25p80: RESET_ENABLE and RESET_MEMORY commands
  2016-03-21 17:02   ` Cédric Le Goater
@ 2016-03-21 17:38     ` Krzeminski, Marcin (Nokia - PL/Wroclaw)
  0 siblings, 0 replies; 17+ messages in thread
From: Krzeminski, Marcin (Nokia - PL/Wroclaw) @ 2016-03-21 17:38 UTC (permalink / raw)
  To: EXT Cédric Le Goater, qemu-devel@nongnu.org
  Cc: crosthwaitepeter@gmail.com, pawel.lenkow@itlen.com,
	rfsw-patches@mlist.nsn-inter.net



W dniu 21.03.2016 o 18:02, Cédric Le Goater pisze:
> Hello Marcin,
>
> One minor comment below,
>
>
> On 03/20/2016 07:28 PM, marcin.krzeminski@nokia.com wrote:
>> From: Marcin Krzeminski <marcin.krzeminski@nokia.com>
>>
>> Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
>> Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
>> ---
>>  hw/block/m25p80.c | 41 ++++++++++++++++++++++++++++++++++++++++-
>>  1 file changed, 40 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
>> index 2222124..1d053a5 100644
>> --- a/hw/block/m25p80.c
>> +++ b/hw/block/m25p80.c
>> @@ -233,6 +233,9 @@ typedef enum {
>>      ERASE_4K = 0x20,
>>      ERASE_32K = 0x52,
>>      ERASE_SECTOR = 0xd8,
>> +
>> +    RESET_ENABLE = 0x66,
>> +    RESET_MEMORY = 0x99,
>>  } FlashCMD;
>>
>>  typedef enum {
>> @@ -260,6 +263,7 @@ typedef struct Flash {
>>      uint8_t cmd_in_progress;
>>      uint64_t cur_addr;
>>      bool write_enable;
>> +    bool reset_enable;
>>
>>      int64_t dirty_page;
>>
>> @@ -432,11 +436,29 @@ static void complete_collecting_data(Flash *s)
>>      }
>>  }
>>
>> +static void reset_memory(Flash *s)
>> +{
>> +    s->cmd_in_progress = NOP;
>> +    s->cur_addr = 0;
>> +    s->len = 0;
>> +    s->needed_bytes = 0;
>> +    s->pos = 0;
>> +    s->state = STATE_IDLE;
>> +    s->write_enable = false;
>> +    s->reset_enable = false;
>> +
>> +    DB_PRINT_L(0, "Reset done.\n");
>> +}
>> +
>>  static void decode_new_cmd(Flash *s, uint32_t value)
>>  {
>>      s->cmd_in_progress = value;
>>      DB_PRINT_L(0, "decoded new command:%x\n", value);
>>
>> +    if (value != RESET_MEMORY) {
>> +        s->reset_enable = false;
>> +    }
>> +
>>      switch (value) {
>>
>>      case ERASE_4K:
>> @@ -541,6 +563,14 @@ static void decode_new_cmd(Flash *s, uint32_t value)
>>          break;
>>      case NOP:
>>          break;
>> +    case RESET_ENABLE:
>> +        s->reset_enable = true;
>> +        break;
>> +    case RESET_MEMORY:
>> +        if (s->reset_enable) {
>> +            reset_memory(s);
>> +        }
>> +        break;
>>      default:
>>          qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Unknown cmd %x\n", value);
>>          break;
>> @@ -647,6 +677,13 @@ static int m25p80_init(SSISlave *ss)
>>      return 0;
>>  }
>>
>> +static void m25p80_reset(DeviceState *d)
>> +{
>> +    Flash *s = M25P80(d);
>> +
>> +    reset_memory(s);
>> +}
>> +
>>  static void m25p80_pre_save(void *opaque)
>>  {
>>      flash_sync_dirty((Flash *)opaque, -1);
>> @@ -654,7 +691,7 @@ static void m25p80_pre_save(void *opaque)
>>
>>  static const VMStateDescription vmstate_m25p80 = {
>>      .name = "xilinx_spi",
>> -    .version_id = 1,
>> +    .version_id = 2,
>>      .minimum_version_id = 1,
>>      .pre_save = m25p80_pre_save,
>>      .fields = (VMStateField[]) {
>> @@ -666,6 +703,7 @@ static const VMStateDescription vmstate_m25p80 = {
>>          VMSTATE_UINT8(cmd_in_progress, Flash),
>>          VMSTATE_UINT64(cur_addr, Flash),
>>          VMSTATE_BOOL(write_enable, Flash),
>> +        VMSTATE_BOOL(reset_enable, Flash),
If I understand this correctly, VMSTATE_BOOL_V indicates that this field is available from vmstate v_id2 and higher.
This allow to have backward compatibility of vmstate, isn't it?
If yes, this remarks also applies to more patches from this series.

Thanks,
Marcin

>
> Shouldn't that be VMSTATE_BOOL_V(reset_enable, Flash, 2) ? 
>
> C.
>
>>          VMSTATE_END_OF_LIST()
>>      }
>>  };
>> @@ -681,6 +719,7 @@ static void m25p80_class_init(ObjectClass *klass, void *data)
>>      k->set_cs = m25p80_cs;
>>      k->cs_polarity = SSI_CS_LOW;
>>      dc->vmsd = &vmstate_m25p80;
>> +    dc->reset = m25p80_reset;
>>      mc->pi = data;
>>  }
>>
>
>
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Qemu-devel] [PATCH v5 05/11] block: m25p80: 4byte address mode
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 05/11] block: m25p80: 4byte " marcin.krzeminski
@ 2016-03-21 17:47   ` Cédric Le Goater
  2016-03-21 18:00     ` [Qemu-devel] ODP: " Krzeminski, Marcin (Nokia - PL/Wroclaw)
  0 siblings, 1 reply; 17+ messages in thread
From: Cédric Le Goater @ 2016-03-21 17:47 UTC (permalink / raw)
  To: marcin.krzeminski, qemu-devel
  Cc: crosthwaitepeter, pawel.lenkow, rfsw-patches

Hello again,

One question below.


On 03/20/2016 07:28 PM, marcin.krzeminski@nokia.com wrote:
> From: Marcin Krzeminski <marcin.krzeminski@nokia.com>
> 
> This patch adds only 4byte address mode (does not cover dummy cycles).
> This mode is needed to access more than 16 MiB of flash.
> 
> Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
> Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
> ---
>  hw/block/m25p80.c | 43 +++++++++++++++++++++++++++++++++----------
>  1 file changed, 33 insertions(+), 10 deletions(-)
> 
> diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
> index c5de4ee..101a43f 100644
> --- a/hw/block/m25p80.c
> +++ b/hw/block/m25p80.c
> @@ -237,6 +237,9 @@ typedef enum {
>      ERASE_32K = 0x52,
>      ERASE_SECTOR = 0xd8,
> 
> +    EN_4BYTE_ADDR = 0xB7,
> +    EX_4BYTE_ADDR = 0xE9,
> +
>      EXTEND_ADDR_READ = 0xC8,
>      EXTEND_ADDR_WRITE = 0xC5,
> 
> @@ -269,6 +272,7 @@ typedef struct Flash {
>      uint8_t cmd_in_progress;
>      uint64_t cur_addr;
>      bool write_enable;
> +    bool four_bytes_address_mode;
>      bool reset_enable;
>      uint8_t ear;
> 
> @@ -406,12 +410,25 @@ void flash_write8(Flash *s, uint64_t addr, uint8_t data)
>      s->dirty_page = page;
>  }
> 
> +static inline int get_addr_length(Flash *s)
> +{
> +    return s->four_bytes_address_mode ? 4 : 3;
> +}
> +
>  static void complete_collecting_data(Flash *s)
>  {
> -    s->cur_addr = s->data[0] << 16;
> -    s->cur_addr |= s->data[1] << 8;
> -    s->cur_addr |= s->data[2];
> -    s->cur_addr += (s->ear & 0x3) * MAX_3BYTES_SIZE;
> +    int i;
> +
> +    s->cur_addr = 0;
> +
> +    for (i = 0; i < get_addr_length(s); ++i) {
> +        s->cur_addr <<= 8;
> +        s->cur_addr |= s->data[i];
> +    }
> +
> +    if (get_addr_length(s) == 3) {
> +        s->cur_addr += (s->ear & 0x3) * MAX_3BYTES_SIZE;
> +    }
> 
>      s->state = STATE_IDLE;
> 
> @@ -452,6 +469,7 @@ static void reset_memory(Flash *s)
>      s->cmd_in_progress = NOP;
>      s->cur_addr = 0;
>      s->ear = 0;
> +    s->four_bytes_address_mode = false;
>      s->len = 0;
>      s->needed_bytes = 0;
>      s->pos = 0;
> @@ -480,7 +498,7 @@ static void decode_new_cmd(Flash *s, uint32_t value)
>      case DPP:
>      case QPP:
>      case PP:
> -        s->needed_bytes = 3;
> +        s->needed_bytes = get_addr_length(s);
>          s->pos = 0;
>          s->len = 0;
>          s->state = STATE_COLLECTING_DATA;
> @@ -489,7 +507,7 @@ static void decode_new_cmd(Flash *s, uint32_t value)
>      case FAST_READ:
>      case DOR:
>      case QOR:
> -        s->needed_bytes = 4;
> +        s->needed_bytes = get_addr_length(s) + 1;
>          s->pos = 0;
>          s->len = 0;
>          s->state = STATE_COLLECTING_DATA;
> @@ -501,9 +519,8 @@ static void decode_new_cmd(Flash *s, uint32_t value)
>          case JEDEC_SPANSION:
>              s->needed_bytes = 4;
>              break;
> -        case JEDEC_NUMONYX:

JEDEC_NUMONYX is being removed ?

>          default:
> -            s->needed_bytes = 5;
> +            s->needed_bytes = get_addr_length(s) + 2;
>          }
>          s->pos = 0;
>          s->len = 0;
> @@ -516,9 +533,8 @@ static void decode_new_cmd(Flash *s, uint32_t value)
>          case JEDEC_SPANSION:
>              s->needed_bytes = 6;
>              break;
> -        case JEDEC_NUMONYX:

and here also. Is that a typo ? 

Thanks,

C.


>          default:
> -            s->needed_bytes = 8;
> +            s->needed_bytes = get_addr_length(s) + 4;
>          }
>          s->pos = 0;
>          s->len = 0;
> @@ -575,6 +591,12 @@ static void decode_new_cmd(Flash *s, uint32_t value)
>          break;
>      case NOP:
>          break;
> +    case EN_4BYTE_ADDR:
> +        s->four_bytes_address_mode = true;
> +        break;
> +    case EX_4BYTE_ADDR:
> +        s->four_bytes_address_mode = false;
> +        break;
>      case EXTEND_ADDR_READ:
>          s->data[0] = s->ear;
>          s->pos = 0;
> @@ -729,6 +751,7 @@ static const VMStateDescription vmstate_m25p80 = {
>          VMSTATE_UINT8(cmd_in_progress, Flash),
>          VMSTATE_UINT64(cur_addr, Flash),
>          VMSTATE_BOOL(write_enable, Flash),
> +        VMSTATE_BOOL(four_bytes_address_mode, Flash),
>          VMSTATE_UINT8(ear, Flash),
>          VMSTATE_BOOL(reset_enable, Flash),
>          VMSTATE_END_OF_LIST()
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Qemu-devel] ODP: [PATCH v5 05/11] block: m25p80: 4byte address mode
  2016-03-21 17:47   ` Cédric Le Goater
@ 2016-03-21 18:00     ` Krzeminski, Marcin (Nokia - PL/Wroclaw)
  0 siblings, 0 replies; 17+ messages in thread
From: Krzeminski, Marcin (Nokia - PL/Wroclaw) @ 2016-03-21 18:00 UTC (permalink / raw)
  To: EXT Cédric Le Goater, qemu-devel@nongnu.org
  Cc: crosthwaitepeter@gmail.com, pawel.lenkow@itlen.com,
	rfsw-patches@mlist.nsn-inter.net



W dniu 21.03.2016 o 18:47, Cédric Le Goater pisze:
> Hello again,
>
> One question below.
>
>
> On 03/20/2016 07:28 PM, marcin.krzeminski@nokia.com wrote:
>> From: Marcin Krzeminski <marcin.krzeminski@nokia.com>
>>
>> This patch adds only 4byte address mode (does not cover dummy cycles).
>> This mode is needed to access more than 16 MiB of flash.
>>
>> Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
>> Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
>> ---
>>  hw/block/m25p80.c | 43 +++++++++++++++++++++++++++++++++----------
>>  1 file changed, 33 insertions(+), 10 deletions(-)
>>
>> diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
>> index c5de4ee..101a43f 100644
>> --- a/hw/block/m25p80.c
>> +++ b/hw/block/m25p80.c
>> @@ -237,6 +237,9 @@ typedef enum {
>>      ERASE_32K = 0x52,
>>      ERASE_SECTOR = 0xd8,
>>
>> +    EN_4BYTE_ADDR = 0xB7,
>> +    EX_4BYTE_ADDR = 0xE9,
>> +
>>      EXTEND_ADDR_READ = 0xC8,
>>      EXTEND_ADDR_WRITE = 0xC5,
>>
>> @@ -269,6 +272,7 @@ typedef struct Flash {
>>      uint8_t cmd_in_progress;
>>      uint64_t cur_addr;
>>      bool write_enable;
>> +    bool four_bytes_address_mode;
>>      bool reset_enable;
>>      uint8_t ear;
>>
>> @@ -406,12 +410,25 @@ void flash_write8(Flash *s, uint64_t addr, uint8_t data)
>>      s->dirty_page = page;
>>  }
>>
>> +static inline int get_addr_length(Flash *s)
>> +{
>> +    return s->four_bytes_address_mode ? 4 : 3;
>> +}
>> +
>>  static void complete_collecting_data(Flash *s)
>>  {
>> -    s->cur_addr = s->data[0] << 16;
>> -    s->cur_addr |= s->data[1] << 8;
>> -    s->cur_addr |= s->data[2];
>> -    s->cur_addr += (s->ear & 0x3) * MAX_3BYTES_SIZE;
>> +    int i;
>> +
>> +    s->cur_addr = 0;
>> +
>> +    for (i = 0; i < get_addr_length(s); ++i) {
>> +        s->cur_addr <<= 8;
>> +        s->cur_addr |= s->data[i];
>> +    }
>> +
>> +    if (get_addr_length(s) == 3) {
>> +        s->cur_addr += (s->ear & 0x3) * MAX_3BYTES_SIZE;
>> +    }
>>
>>      s->state = STATE_IDLE;
>>
>> @@ -452,6 +469,7 @@ static void reset_memory(Flash *s)
>>      s->cmd_in_progress = NOP;
>>      s->cur_addr = 0;
>>      s->ear = 0;
>> +    s->four_bytes_address_mode = false;
>>      s->len = 0;
>>      s->needed_bytes = 0;
>>      s->pos = 0;
>> @@ -480,7 +498,7 @@ static void decode_new_cmd(Flash *s, uint32_t value)
>>      case DPP:
>>      case QPP:
>>      case PP:
>> -        s->needed_bytes = 3;
>> +        s->needed_bytes = get_addr_length(s);
>>          s->pos = 0;
>>          s->len = 0;
>>          s->state = STATE_COLLECTING_DATA;
>> @@ -489,7 +507,7 @@ static void decode_new_cmd(Flash *s, uint32_t value)
>>      case FAST_READ:
>>      case DOR:
>>      case QOR:
>> -        s->needed_bytes = 4;
>> +        s->needed_bytes = get_addr_length(s) + 1;
>>          s->pos = 0;
>>          s->len = 0;
>>          s->state = STATE_COLLECTING_DATA;
>> @@ -501,9 +519,8 @@ static void decode_new_cmd(Flash *s, uint32_t value)
>>          case JEDEC_SPANSION:
>>              s->needed_bytes = 4;
>>              break;
>> -        case JEDEC_NUMONYX:
>
> JEDEC_NUMONYX is being removed ?
>
>>          default:
>> -            s->needed_bytes = 5;
>> +            s->needed_bytes = get_addr_length(s) + 2;
>>          }
>>          s->pos = 0;
>>          s->len = 0;
>> @@ -516,9 +533,8 @@ static void decode_new_cmd(Flash *s, uint32_t value)
>>          case JEDEC_SPANSION:
>>              s->needed_bytes = 6;
>>              break;
>> -        case JEDEC_NUMONYX:
>
> and here also. Is that a typo ? 
Hello,

As Peter C request NUMONYX is default for this series.
As more flashes models are ongoing I plan to restore case JEDEC_NUMONYX and leave default to does nothing.

Thanks,
Marcin
>
>
> Thanks,
>
> C.
>
>
>>          default:
>> -            s->needed_bytes = 8;
>> +            s->needed_bytes = get_addr_length(s) + 4;
>>          }
>>          s->pos = 0;
>>          s->len = 0;
>> @@ -575,6 +591,12 @@ static void decode_new_cmd(Flash *s, uint32_t value)
>>          break;
>>      case NOP:
>>          break;
>> +    case EN_4BYTE_ADDR:
>> +        s->four_bytes_address_mode = true;
>> +        break;
>> +    case EX_4BYTE_ADDR:
>> +        s->four_bytes_address_mode = false;
>> +        break;
>>      case EXTEND_ADDR_READ:
>>          s->data[0] = s->ear;
>>          s->pos = 0;
>> @@ -729,6 +751,7 @@ static const VMStateDescription vmstate_m25p80 = {
>>          VMSTATE_UINT8(cmd_in_progress, Flash),
>>          VMSTATE_UINT64(cur_addr, Flash),
>>          VMSTATE_BOOL(write_enable, Flash),
>> +        VMSTATE_BOOL(four_bytes_address_mode, Flash),
>>          VMSTATE_UINT8(ear, Flash),
>>          VMSTATE_BOOL(reset_enable, Flash),
>>          VMSTATE_END_OF_LIST()
>>
>
>
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256
  2016-03-20 18:28 [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
                   ` (10 preceding siblings ...)
  2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 11/11] block: m25p80: at25128a/at25256a models marcin.krzeminski
@ 2016-03-23 15:30 ` Peter Maydell
  11 siblings, 0 replies; 17+ messages in thread
From: Peter Maydell @ 2016-03-23 15:30 UTC (permalink / raw)
  To: Krzeminski, Marcin (Nokia - PL/Wroclaw)
  Cc: Peter Crosthwaite, clg, QEMU Developers, pawel.lenkow,
	rfsw-patches

On 20 March 2016 at 18:28,  <marcin.krzeminski@nokia.com> wrote:
> From: Marcin Krzeminski <marcin.krzeminski@nokia.com>
>
> V5: Changes after review
> - Macrofication of registers values
> - Numonyx is default value in switch for fast read family
> V4:
> - Fixed RNVCR command (needed bytes set to 2 instead of 1)
> - Config registers are configured only for micron flash devices
> - Move config registers initialization to reset_memory function
> - Removed clearing reset_enable flag when chip was selcted by CS signal
> V3:
> - Checkpatch run on patches
> - Renamed function
> V2:
> - Removed support for mx66u51235 and s25fl512s from this series
> - Corrected/implemented dummy cycles
> - rebased to master



Applied to target-arm.next, thanks.

-- PMM

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2016-03-23 15:31 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-20 18:28 [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 01/11] block: m25p80: Removed unused variable marcin.krzeminski
2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 02/11] block: m25p80: RESET_ENABLE and RESET_MEMORY commands marcin.krzeminski
2016-03-21 17:02   ` Cédric Le Goater
2016-03-21 17:38     ` [Qemu-devel] ODP: " Krzeminski, Marcin (Nokia - PL/Wroclaw)
2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 03/11] block: m25p80: Widen flags variable marcin.krzeminski
2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 04/11] block: m25p80: Extend address mode marcin.krzeminski
2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 05/11] block: m25p80: 4byte " marcin.krzeminski
2016-03-21 17:47   ` Cédric Le Goater
2016-03-21 18:00     ` [Qemu-devel] ODP: " Krzeminski, Marcin (Nokia - PL/Wroclaw)
2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 06/11] block: m25p80: Add configuration registers marcin.krzeminski
2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 07/11] block: m25p80: Dummy cycles for N25Q256/512 marcin.krzeminski
2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 08/11] block: m25p80: Fast read and 4bytes commands marcin.krzeminski
2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 09/11] block: m25p80: Implemented FSR register marcin.krzeminski
2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 10/11] block: m25p80: n25q256a/n25q512a models marcin.krzeminski
2016-03-20 18:28 ` [Qemu-devel] [PATCH v5 11/11] block: m25p80: at25128a/at25256a models marcin.krzeminski
2016-03-23 15:30 ` [Qemu-devel] [PATCH v5 00/11] Support for N25Q256/512 and AT25128/256 Peter Maydell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).