* [Qemu-devel] [PATCH v2 00/11] Support for N25Q256/512 and AT25128/256
@ 2016-02-04 12:23 marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 01/11] block: m25p80: Removed unused variable marcin.krzeminski
` (10 more replies)
0 siblings, 11 replies; 18+ messages in thread
From: marcin.krzeminski @ 2016-02-04 12:23 UTC (permalink / raw)
To: qemu-devel; +Cc: crosthwaitepeter, clg, pawel.lenkow, marcin.krzeminski
From: Marcin Krzeminski <marcin.krzeminski@nokia.com>
V2:
- Removed support for mx66u51235 and s25fl512s from this series
- Corrected/implemented dummy cycles
- rebased to master
Model was tested on u-boot and kernel using custom qemu machine.
Marcin Krzeminski (11):
block: m25p80: Removed unused variable
block: m25p80: RESET_ENABLE and RESET_MEMORY commnads
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 | 290 +++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 279 insertions(+), 11 deletions(-)
--
2.5.0
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH v2 01/11] block: m25p80: Removed unused variable
2016-02-04 12:23 [Qemu-devel] [PATCH v2 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
@ 2016-02-04 12:23 ` marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 02/11] block: m25p80: RESET_ENABLE and RESET_MEMORY commnads marcin.krzeminski
` (9 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: marcin.krzeminski @ 2016-02-04 12:23 UTC (permalink / raw)
To: qemu-devel; +Cc: crosthwaitepeter, clg, 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] 18+ messages in thread
* [Qemu-devel] [PATCH v2 02/11] block: m25p80: RESET_ENABLE and RESET_MEMORY commnads
2016-02-04 12:23 [Qemu-devel] [PATCH v2 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 01/11] block: m25p80: Removed unused variable marcin.krzeminski
@ 2016-02-04 12:23 ` marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 03/11] block: m25p80: Widen flags variable marcin.krzeminski
` (8 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: marcin.krzeminski @ 2016-02-04 12:23 UTC (permalink / raw)
To: qemu-devel; +Cc: crosthwaitepeter, clg, pawel.lenkow, marcin.krzeminski
From: Marcin Krzeminski <marcin.krzeminski@nokia.com>
Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
---
hw/block/m25p80.c | 36 +++++++++++++++++++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 2222124..b986df4 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;
@@ -555,6 +585,7 @@ static int m25p80_cs(SSISlave *ss, bool select)
s->len = 0;
s->pos = 0;
s->state = STATE_IDLE;
+ s->reset_enable = false;
flash_sync_dirty(s, -1);
}
@@ -622,6 +653,8 @@ static int m25p80_init(SSISlave *ss)
s->size = s->pi->sector_size * s->pi->n_sectors;
s->dirty_page = -1;
+ reset_memory(s);
+
/* FIXME use a qdev drive property instead of drive_get_next() */
dinfo = drive_get_next(IF_MTD);
@@ -654,7 +687,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 +699,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()
}
};
--
2.5.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH v2 03/11] block: m25p80: Widen flags variable
2016-02-04 12:23 [Qemu-devel] [PATCH v2 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 01/11] block: m25p80: Removed unused variable marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 02/11] block: m25p80: RESET_ENABLE and RESET_MEMORY commnads marcin.krzeminski
@ 2016-02-04 12:23 ` marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 04/11] block: m25p80: Extend address mode marcin.krzeminski
` (7 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: marcin.krzeminski @ 2016-02-04 12:23 UTC (permalink / raw)
To: qemu-devel; +Cc: crosthwaitepeter, clg, 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 b986df4..f9088c5 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] 18+ messages in thread
* [Qemu-devel] [PATCH v2 04/11] block: m25p80: Extend address mode
2016-02-04 12:23 [Qemu-devel] [PATCH v2 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
` (2 preceding siblings ...)
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 03/11] block: m25p80: Widen flags variable marcin.krzeminski
@ 2016-02-04 12:23 ` marcin.krzeminski
2016-02-05 7:58 ` Cédric Le Goater
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 05/11] block: m25p80: 4byte " marcin.krzeminski
` (6 subsequent siblings)
10 siblings, 1 reply; 18+ messages in thread
From: marcin.krzeminski @ 2016-02-04 12:23 UTC (permalink / raw)
To: qemu-devel; +Cc: crosthwaitepeter, clg, 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 f9088c5..6b5f00d 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;
@@ -699,6 +725,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] 18+ messages in thread
* [Qemu-devel] [PATCH v2 05/11] block: m25p80: 4byte address mode
2016-02-04 12:23 [Qemu-devel] [PATCH v2 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
` (3 preceding siblings ...)
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 04/11] block: m25p80: Extend address mode marcin.krzeminski
@ 2016-02-04 12:23 ` marcin.krzeminski
2016-02-05 7:53 ` Cédric Le Goater
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 06/11] block: m25p80: Add configuration registers marcin.krzeminski
` (5 subsequent siblings)
10 siblings, 1 reply; 18+ messages in thread
From: marcin.krzeminski @ 2016-02-04 12:23 UTC (permalink / raw)
To: qemu-devel; +Cc: crosthwaitepeter, clg, 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>
---
hw/block/m25p80.c | 40 +++++++++++++++++++++++++++++++++++-----
1 file changed, 35 insertions(+), 5 deletions(-)
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 6b5f00d..e306356 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,26 @@ void flash_write8(Flash *s, uint64_t addr, uint8_t data)
s->dirty_page = page;
}
+static inline int get_cmd_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];
+ int i;
+
+ s->cur_addr = 0;
+
+ for ( i=0; i< get_cmd_length(s); ++i ) {
+ s->cur_addr <<= 8;
+ s->cur_addr |= s->data[i];
+ }
+
+ if ( get_cmd_length(s) == 3) {
s->cur_addr += (s->ear & 0x3) * MAX_3BYTES_SIZE;
+ }
s->state = STATE_IDLE;
@@ -452,6 +470,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 +499,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_cmd_length(s);
s->pos = 0;
s->len = 0;
s->state = STATE_COLLECTING_DATA;
@@ -489,7 +508,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_cmd_length(s);
s->pos = 0;
s->len = 0;
s->state = STATE_COLLECTING_DATA;
@@ -502,6 +521,8 @@ static void decode_new_cmd(Flash *s, uint32_t value)
s->needed_bytes = 4;
break;
case JEDEC_NUMONYX:
+ s->needed_bytes = get_cmd_length(s);
+ break;
default:
s->needed_bytes = 5;
}
@@ -517,6 +538,8 @@ static void decode_new_cmd(Flash *s, uint32_t value)
s->needed_bytes = 6;
break;
case JEDEC_NUMONYX:
+ s->needed_bytes = get_cmd_length(s);
+ break;
default:
s->needed_bytes = 8;
}
@@ -575,6 +598,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;
@@ -725,6 +754,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] 18+ messages in thread
* [Qemu-devel] [PATCH v2 06/11] block: m25p80: Add configuration registers
2016-02-04 12:23 [Qemu-devel] [PATCH v2 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
` (4 preceding siblings ...)
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 05/11] block: m25p80: 4byte " marcin.krzeminski
@ 2016-02-04 12:23 ` marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 07/11] block: m25p80: Dummy cycles for N25Q256/512 marcin.krzeminski
` (4 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: marcin.krzeminski @ 2016-02-04 12:23 UTC (permalink / raw)
To: qemu-devel; +Cc: crosthwaitepeter, clg, 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. Power-on 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>
---
hw/block/m25p80.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 109 insertions(+)
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index e306356..a213587 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
@@ -245,6 +246,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 +281,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;
@@ -460,6 +473,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;
}
@@ -618,6 +640,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 = 1;
+ 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;
@@ -710,6 +775,41 @@ static int m25p80_init(SSISlave *ss)
reset_memory(s);
+ s->volatile_cfg = 0;
+ /* WRAP & reserved*/
+ s->volatile_cfg |= 0x3;
+ /* XIP */
+ if (extract32(s->nonvolatile_cfg,9,3) != 0x7)
+ {
+ s->volatile_cfg |= (1 << 3);
+ }
+ /* Number of dummy cycles */
+ s->volatile_cfg |= deposit32(s->volatile_cfg,4,4,extract32(s->nonvolatile_cfg,12,4));
+
+ s->enh_volatile_cfg = 0;
+ /* Output driver strength */
+ s->enh_volatile_cfg |= 0x7;
+ /* Vpp accelerator */
+ s->enh_volatile_cfg |= (1 << 3);
+ /* Reset/hold & reserved */
+ s->enh_volatile_cfg |= (1 << 4);
+ /* Dual I/O protocol */
+ if ( (s->nonvolatile_cfg >> 1) & 0x1) {
+ s->enh_volatile_cfg |= (1 << 6);
+ }
+ /* Quad I/O protocol */
+ if ( (s->nonvolatile_cfg >> 3) & 0x1) {
+ s->enh_volatile_cfg |= (1 << 7);
+ }
+
+ if ( !(s->nonvolatile_cfg & 0x1)) {
+ s->four_bytes_address_mode = true;
+ }
+
+ if ( !((s->nonvolatile_cfg >> 1) & 0x1)) {
+ s->ear = 0x3;
+ }
+
/* FIXME use a qdev drive property instead of drive_get_next() */
dinfo = drive_get_next(IF_MTD);
@@ -740,6 +840,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,
@@ -757,6 +862,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()
}
};
@@ -772,6 +880,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;
mc->pi = data;
}
--
2.5.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH v2 07/11] block: m25p80: Dummy cycles for N25Q256/512
2016-02-04 12:23 [Qemu-devel] [PATCH v2 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
` (5 preceding siblings ...)
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 06/11] block: m25p80: Add configuration registers marcin.krzeminski
@ 2016-02-04 12:23 ` marcin.krzeminski
2016-02-05 8:05 ` Cédric Le Goater
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 08/11] block: m25p80: Fast read and 4bytes commands marcin.krzeminski
` (3 subsequent siblings)
10 siblings, 1 reply; 18+ messages in thread
From: marcin.krzeminski @ 2016-02-04 12:23 UTC (permalink / raw)
To: qemu-devel; +Cc: crosthwaitepeter, clg, pawel.lenkow, marcin.krzeminski
From: Marcin Krzeminski <marcin.krzeminski@nokia.com>
This patch handles dummy cycles.
Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
---
hw/block/m25p80.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index a213587..df1f829 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -531,6 +531,10 @@ static void decode_new_cmd(Flash *s, uint32_t value)
case DOR:
case QOR:
s->needed_bytes = get_cmd_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;
@@ -544,6 +548,7 @@ static void decode_new_cmd(Flash *s, uint32_t value)
break;
case JEDEC_NUMONYX:
s->needed_bytes = get_cmd_length(s);
+ s->needed_bytes += extract32(s->volatile_cfg,4,4);
break;
default:
s->needed_bytes = 5;
@@ -561,6 +566,7 @@ static void decode_new_cmd(Flash *s, uint32_t value)
break;
case JEDEC_NUMONYX:
s->needed_bytes = get_cmd_length(s);
+ s->needed_bytes += extract32(s->volatile_cfg,4,4);
break;
default:
s->needed_bytes = 8;
--
2.5.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH v2 08/11] block: m25p80: Fast read and 4bytes commands
2016-02-04 12:23 [Qemu-devel] [PATCH v2 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
` (6 preceding siblings ...)
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 07/11] block: m25p80: Dummy cycles for N25Q256/512 marcin.krzeminski
@ 2016-02-04 12:23 ` marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 09/11] block: m25p80: Implemented FSR register marcin.krzeminski
` (2 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: marcin.krzeminski @ 2016-02-04 12:23 UTC (permalink / raw)
To: qemu-devel; +Cc: crosthwaitepeter, clg, 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>
---
hw/block/m25p80.c | 43 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 42 insertions(+), 1 deletion(-)
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index df1f829..faf1212 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -224,19 +224,28 @@ typedef enum {
BULK_ERASE = 0xc7,
READ = 0x3,
- FAST_READ = 0xb,
+ 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,
+ 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,
@@ -359,6 +368,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;
@@ -367,6 +377,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:
@@ -425,6 +436,18 @@ void flash_write8(Flash *s, uint64_t addr, uint8_t data)
static inline int get_cmd_length(Flash *s)
{
+ 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;
}
}
@@ -450,19 +473,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:
@@ -515,12 +547,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_cmd_length(s);
s->pos = 0;
s->len = 0;
@@ -528,8 +564,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_cmd_length(s);
if ( ((s->pi->jedec >> 16) & 0xFF) == JEDEC_NUMONYX ) {
/* Dummy cycles - modeled with bytes writes instead of bits */
@@ -541,6 +580,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:
@@ -559,6 +599,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] 18+ messages in thread
* [Qemu-devel] [PATCH v2 09/11] block: m25p80: Implemented FSR register
2016-02-04 12:23 [Qemu-devel] [PATCH v2 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
` (7 preceding siblings ...)
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 08/11] block: m25p80: Fast read and 4bytes commands marcin.krzeminski
@ 2016-02-04 12:23 ` marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 10/11] block: m25p80: n25q256a/n25q512a models marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 11/11] block: m25p80: at25128a/at25256a models marcin.krzeminski
10 siblings, 0 replies; 18+ messages in thread
From: marcin.krzeminski @ 2016-02-04 12:23 UTC (permalink / raw)
To: qemu-devel; +Cc: crosthwaitepeter, clg, 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>
---
hw/block/m25p80.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index faf1212..116e098 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -222,6 +222,7 @@ typedef enum {
WREN = 0x6,
JEDEC_READ = 0x9f,
BULK_ERASE = 0xc7,
+ READ_FSR = 0x70,
READ = 0x3,
READ4 = 0x13,
@@ -640,6 +641,16 @@ static void decode_new_cmd(Flash *s, uint32_t value)
s->state = STATE_READING_DATA;
break;
+ case READ_FSR:
+ s->data[0] = (1<<7); /*Indicates flash is ready */
+ if (s->four_bytes_address_mode) {
+ s->data[0] |= 0x1;
+ }
+ 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] 18+ messages in thread
* [Qemu-devel] [PATCH v2 10/11] block: m25p80: n25q256a/n25q512a models
2016-02-04 12:23 [Qemu-devel] [PATCH v2 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
` (8 preceding siblings ...)
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 09/11] block: m25p80: Implemented FSR register marcin.krzeminski
@ 2016-02-04 12:23 ` marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 11/11] block: m25p80: at25128a/at25256a models marcin.krzeminski
10 siblings, 0 replies; 18+ messages in thread
From: marcin.krzeminski @ 2016-02-04 12:23 UTC (permalink / raw)
To: qemu-devel; +Cc: crosthwaitepeter, clg, 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 116e098..ec1013d 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -210,8 +210,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] 18+ messages in thread
* [Qemu-devel] [PATCH v2 11/11] block: m25p80: at25128a/at25256a models
2016-02-04 12:23 [Qemu-devel] [PATCH v2 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
` (9 preceding siblings ...)
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 10/11] block: m25p80: n25q256a/n25q512a models marcin.krzeminski
@ 2016-02-04 12:23 ` marcin.krzeminski
10 siblings, 0 replies; 18+ messages in thread
From: marcin.krzeminski @ 2016-02-04 12:23 UTC (permalink / raw)
To: qemu-devel; +Cc: crosthwaitepeter, clg, pawel.lenkow, marcin.krzeminski
From: Marcin Krzeminski <marcin.krzeminski@nokia.com>
Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
---
hw/block/m25p80.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index ec1013d..3ff418f 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -99,6 +99,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, WR_1) },
+ { INFO("at25256a-nonjedec", 0x0, 0, 1, 262144, WR_1) },
+
/* EON -- en25xxx */
{ INFO("en25f32", 0x1c3116, 0, 64 << 10, 64, ER_4K) },
{ INFO("en25p32", 0x1c2016, 0, 64 << 10, 64, 0) },
@@ -438,6 +444,11 @@ void flash_write8(Flash *s, uint64_t addr, uint8_t data)
static inline int get_cmd_length(Flash *s)
{
+ /* check if eeprom is in use */
+ if (s->pi->flags == WR_1) {
+ return 2;
+ }
+
switch (s->cmd_in_progress) {
case PP4:
case READ4:
--
2.5.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 05/11] block: m25p80: 4byte address mode
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 05/11] block: m25p80: 4byte " marcin.krzeminski
@ 2016-02-05 7:53 ` Cédric Le Goater
2016-02-05 9:56 ` Krzeminski, Marcin (Nokia - PL/Wroclaw)
0 siblings, 1 reply; 18+ messages in thread
From: Cédric Le Goater @ 2016-02-05 7:53 UTC (permalink / raw)
To: marcin.krzeminski, qemu-devel; +Cc: crosthwaitepeter, pawel.lenkow
Hello Marcin,
Some comments below
On 02/04/2016 01:23 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>
> ---
> hw/block/m25p80.c | 40 +++++++++++++++++++++++++++++++++++-----
> 1 file changed, 35 insertions(+), 5 deletions(-)
>
> diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
> index 6b5f00d..e306356 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,26 @@ void flash_write8(Flash *s, uint64_t addr, uint8_t data)
> s->dirty_page = page;
> }
>
> +static inline int get_cmd_length(Flash *s)
The name is bit confusing, it is not really a command length
but an address width ?
> +{
> + return s->four_bytes_address_mode ? 4 : 3;
> + }
one '}' should be enough :)
> +}
> +
> 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];
> + int i;
> +
> + s->cur_addr = 0;
> +
> + for ( i=0; i< get_cmd_length(s); ++i ) {
white space issues above
> + s->cur_addr <<= 8;
> + s->cur_addr |= s->data[i];
> + }
> +
> + if ( get_cmd_length(s) == 3) {
white space issues above
C.
> s->cur_addr += (s->ear & 0x3) * MAX_3BYTES_SIZE;
> + }
>
> s->state = STATE_IDLE;
>
> @@ -452,6 +470,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 +499,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_cmd_length(s);
> s->pos = 0;
> s->len = 0;
> s->state = STATE_COLLECTING_DATA;
> @@ -489,7 +508,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_cmd_length(s);
> s->pos = 0;
> s->len = 0;
> s->state = STATE_COLLECTING_DATA;
> @@ -502,6 +521,8 @@ static void decode_new_cmd(Flash *s, uint32_t value)
> s->needed_bytes = 4;
> break;
> case JEDEC_NUMONYX:
> + s->needed_bytes = get_cmd_length(s);
> + break;
> default:
> s->needed_bytes = 5;
> }
> @@ -517,6 +538,8 @@ static void decode_new_cmd(Flash *s, uint32_t value)
> s->needed_bytes = 6;
> break;
> case JEDEC_NUMONYX:
> + s->needed_bytes = get_cmd_length(s);
> + break;
> default:
> s->needed_bytes = 8;
> }
> @@ -575,6 +598,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;
> @@ -725,6 +754,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] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 04/11] block: m25p80: Extend address mode
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 04/11] block: m25p80: Extend address mode marcin.krzeminski
@ 2016-02-05 7:58 ` Cédric Le Goater
2016-02-05 10:11 ` Krzeminski, Marcin (Nokia - PL/Wroclaw)
0 siblings, 1 reply; 18+ messages in thread
From: Cédric Le Goater @ 2016-02-05 7:58 UTC (permalink / raw)
To: marcin.krzeminski, qemu-devel; +Cc: crosthwaitepeter, pawel.lenkow
On 02/04/2016 01:23 PM, marcin.krzeminski@nokia.com wrote:
> 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 f9088c5..6b5f00d 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;
here ^
and this line does not appear in patch 5 which is curious. Is that a refresh
issue ?
Thanks,
C.
>
> 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;
> @@ -699,6 +725,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()
> }
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 07/11] block: m25p80: Dummy cycles for N25Q256/512
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 07/11] block: m25p80: Dummy cycles for N25Q256/512 marcin.krzeminski
@ 2016-02-05 8:05 ` Cédric Le Goater
2016-02-05 10:15 ` Krzeminski, Marcin (Nokia - PL/Wroclaw)
0 siblings, 1 reply; 18+ messages in thread
From: Cédric Le Goater @ 2016-02-05 8:05 UTC (permalink / raw)
To: marcin.krzeminski, qemu-devel; +Cc: crosthwaitepeter, pawel.lenkow
On 02/04/2016 01:23 PM, marcin.krzeminski@nokia.com wrote:
> From: Marcin Krzeminski <marcin.krzeminski@nokia.com>
>
> This patch handles dummy cycles.
>
> Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
> ---
> hw/block/m25p80.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
> index a213587..df1f829 100644
> --- a/hw/block/m25p80.c
> +++ b/hw/block/m25p80.c
> @@ -531,6 +531,10 @@ static void decode_new_cmd(Flash *s, uint32_t value)
> case DOR:
> case QOR:
> s->needed_bytes = get_cmd_length(s);
> + if ( ((s->pi->jedec >> 16) & 0xFF) == JEDEC_NUMONYX ) {
There are a few other areas where we check the manufactory id. May be we
could add :
#define manuf_id(pinfo) ((pinfo)->jedec >> 16) & 0xFF
> + /* Dummy cycles - modeled with bytes writes instead of bits */
> + s->needed_bytes += extract32(s->volatile_cfg,4,4);
white space issues ^
> + }
> s->pos = 0;
> s->len = 0;
> s->state = STATE_COLLECTING_DATA;
> @@ -544,6 +548,7 @@ static void decode_new_cmd(Flash *s, uint32_t value)
> break;
> case JEDEC_NUMONYX:
> s->needed_bytes = get_cmd_length(s);
> + s->needed_bytes += extract32(s->volatile_cfg,4,4);
> break;
> default:
> s->needed_bytes = 5;
> @@ -561,6 +566,7 @@ static void decode_new_cmd(Flash *s, uint32_t value)
> break;
> case JEDEC_NUMONYX:
> s->needed_bytes = get_cmd_length(s);
> + s->needed_bytes += extract32(s->volatile_cfg,4,4);
> break;
> default:
> s->needed_bytes = 8;
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 05/11] block: m25p80: 4byte address mode
2016-02-05 7:53 ` Cédric Le Goater
@ 2016-02-05 9:56 ` Krzeminski, Marcin (Nokia - PL/Wroclaw)
0 siblings, 0 replies; 18+ messages in thread
From: Krzeminski, Marcin (Nokia - PL/Wroclaw) @ 2016-02-05 9:56 UTC (permalink / raw)
To: EXT Cédric Le Goater, qemu-devel; +Cc: crosthwaitepeter, pawel.lenkow
Hello,
> -----Original Message-----
> From: EXT Cédric Le Goater [mailto:clg@fr.ibm.com]
> Sent: Friday, February 05, 2016 8:53 AM
> To: Krzeminski, Marcin (Nokia - PL/Wroclaw); qemu-devel@nongnu.org
> Cc: crosthwaitepeter@gmail.com; pawel.lenkow@itlen.com
> Subject: Re: [PATCH v2 05/11] block: m25p80: 4byte address mode
>
> Hello Marcin,
>
> Some comments below
>
>
> On 02/04/2016 01:23 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>
> > ---
> > hw/block/m25p80.c | 40 +++++++++++++++++++++++++++++++++++-----
> > 1 file changed, 35 insertions(+), 5 deletions(-)
> >
> > diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c index
> > 6b5f00d..e306356 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,26 @@ void flash_write8(Flash *s, uint64_t addr, uint8_t
> data)
> > s->dirty_page = page;
> > }
> >
> > +static inline int get_cmd_length(Flash *s)
>
> The name is bit confusing, it is not really a command length but an address
> width ?
>
Yes, this function returns number of bytes that follows after command.
I can change it to get_address_width.
> > +{
> > + return s->four_bytes_address_mode ? 4 : 3;
> > + }
>
> one '}' should be enough :)
>
Still problems with creating patches from one file...
> > +}
> > +
> > 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];
> > + int i;
> > +
> > + s->cur_addr = 0;
> > +
> > + for ( i=0; i< get_cmd_length(s); ++i ) {
>
> white space issues above
>
> > + s->cur_addr <<= 8;
> > + s->cur_addr |= s->data[i];
> > + }
> > +
> > + if ( get_cmd_length(s) == 3) {
>
> white space issues above
>
I forgot to run checkpatch script.
>
> C.
Thanks,
Marcin
>
> > s->cur_addr += (s->ear & 0x3) * MAX_3BYTES_SIZE;
> > + }
> >
> > s->state = STATE_IDLE;
> >
> > @@ -452,6 +470,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 +499,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_cmd_length(s);
> > s->pos = 0;
> > s->len = 0;
> > s->state = STATE_COLLECTING_DATA; @@ -489,7 +508,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_cmd_length(s);
> > s->pos = 0;
> > s->len = 0;
> > s->state = STATE_COLLECTING_DATA; @@ -502,6 +521,8 @@ static
> > void decode_new_cmd(Flash *s, uint32_t value)
> > s->needed_bytes = 4;
> > break;
> > case JEDEC_NUMONYX:
> > + s->needed_bytes = get_cmd_length(s);
> > + break;
> > default:
> > s->needed_bytes = 5;
> > }
> > @@ -517,6 +538,8 @@ static void decode_new_cmd(Flash *s, uint32_t
> value)
> > s->needed_bytes = 6;
> > break;
> > case JEDEC_NUMONYX:
> > + s->needed_bytes = get_cmd_length(s);
> > + break;
> > default:
> > s->needed_bytes = 8;
> > }
> > @@ -575,6 +598,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;
> > @@ -725,6 +754,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] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 04/11] block: m25p80: Extend address mode
2016-02-05 7:58 ` Cédric Le Goater
@ 2016-02-05 10:11 ` Krzeminski, Marcin (Nokia - PL/Wroclaw)
0 siblings, 0 replies; 18+ messages in thread
From: Krzeminski, Marcin (Nokia - PL/Wroclaw) @ 2016-02-05 10:11 UTC (permalink / raw)
To: EXT Cédric Le Goater, qemu-devel; +Cc: crosthwaitepeter, pawel.lenkow
> -----Original Message-----
> From: EXT Cédric Le Goater [mailto:clg@fr.ibm.com]
> Sent: Friday, February 05, 2016 8:58 AM
> To: Krzeminski, Marcin (Nokia - PL/Wroclaw); qemu-devel@nongnu.org
> Cc: crosthwaitepeter@gmail.com; pawel.lenkow@itlen.com
> Subject: Re: [PATCH v2 04/11] block: m25p80: Extend address mode
>
> On 02/04/2016 01:23 PM, marcin.krzeminski@nokia.com wrote:
> > 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
> > f9088c5..6b5f00d 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)uu
> > 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;
>
> here ^
>
> and this line does not appear in patch 5 which is curious. Is that a refresh
> issue ?
>
s->cur_addr += (s->ear & 0x3) * MAX_3BYTES_SIZE; is at line 61.
Thanks,
Marcin
> Thanks,
>
> C.
>
> >
> > 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;
> > @@ -699,6 +725,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()
> > }
> >
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 07/11] block: m25p80: Dummy cycles for N25Q256/512
2016-02-05 8:05 ` Cédric Le Goater
@ 2016-02-05 10:15 ` Krzeminski, Marcin (Nokia - PL/Wroclaw)
0 siblings, 0 replies; 18+ messages in thread
From: Krzeminski, Marcin (Nokia - PL/Wroclaw) @ 2016-02-05 10:15 UTC (permalink / raw)
To: EXT Cédric Le Goater, qemu-devel; +Cc: crosthwaitepeter, pawel.lenkow
> -----Original Message-----
> From: EXT Cédric Le Goater [mailto:clg@fr.ibm.com]
> Sent: Friday, February 05, 2016 9:06 AM
> To: Krzeminski, Marcin (Nokia - PL/Wroclaw); qemu-devel@nongnu.org
> Cc: crosthwaitepeter@gmail.com; pawel.lenkow@itlen.com
> Subject: Re: [PATCH v2 07/11] block: m25p80: Dummy cycles for
> N25Q256/512
>
> On 02/04/2016 01:23 PM, marcin.krzeminski@nokia.com wrote:
> > From: Marcin Krzeminski <marcin.krzeminski@nokia.com>
> >
> > This patch handles dummy cycles.
> >
> > Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com>
> > ---
> > hw/block/m25p80.c | 6 ++++++
> > 1 file changed, 6 insertions(+)
> >
> > diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c index
> > a213587..df1f829 100644
> > --- a/hw/block/m25p80.c
> > +++ b/hw/block/m25p80.c
> > @@ -531,6 +531,10 @@ static void decode_new_cmd(Flash *s, uint32_t
> value)
> > case DOR:
> > case QOR:
> > s->needed_bytes = get_cmd_length(s);
> > + if ( ((s->pi->jedec >> 16) & 0xFF) == JEDEC_NUMONYX ) {
>
> There are a few other areas where we check the manufactory id. May be we
> could add :
>
> #define manuf_id(pinfo) ((pinfo)->jedec >> 16) & 0xFF
>
>
I will probably add this with Micronics/Spansion patches.
> > + /* Dummy cycles - modeled with bytes writes instead of bits */
> > + s->needed_bytes += extract32(s->volatile_cfg,4,4);
>
> white space issues ^
>
Thanks,
Marcin
> > + }
> > s->pos = 0;
> > s->len = 0;
> > s->state = STATE_COLLECTING_DATA; @@ -544,6 +548,7 @@ static
> > void decode_new_cmd(Flash *s, uint32_t value)
> > break;
> > case JEDEC_NUMONYX:
> > s->needed_bytes = get_cmd_length(s);
> > + s->needed_bytes += extract32(s->volatile_cfg,4,4);
> > break;
> > default:
> > s->needed_bytes = 5;
> > @@ -561,6 +566,7 @@ static void decode_new_cmd(Flash *s, uint32_t
> value)
> > break;
> > case JEDEC_NUMONYX:
> > s->needed_bytes = get_cmd_length(s);
> > + s->needed_bytes += extract32(s->volatile_cfg,4,4);
> > break;
> > default:
> > s->needed_bytes = 8;
> >
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2016-02-05 10:15 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-04 12:23 [Qemu-devel] [PATCH v2 00/11] Support for N25Q256/512 and AT25128/256 marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 01/11] block: m25p80: Removed unused variable marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 02/11] block: m25p80: RESET_ENABLE and RESET_MEMORY commnads marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 03/11] block: m25p80: Widen flags variable marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 04/11] block: m25p80: Extend address mode marcin.krzeminski
2016-02-05 7:58 ` Cédric Le Goater
2016-02-05 10:11 ` Krzeminski, Marcin (Nokia - PL/Wroclaw)
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 05/11] block: m25p80: 4byte " marcin.krzeminski
2016-02-05 7:53 ` Cédric Le Goater
2016-02-05 9:56 ` Krzeminski, Marcin (Nokia - PL/Wroclaw)
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 06/11] block: m25p80: Add configuration registers marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 07/11] block: m25p80: Dummy cycles for N25Q256/512 marcin.krzeminski
2016-02-05 8:05 ` Cédric Le Goater
2016-02-05 10:15 ` Krzeminski, Marcin (Nokia - PL/Wroclaw)
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 08/11] block: m25p80: Fast read and 4bytes commands marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 09/11] block: m25p80: Implemented FSR register marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 10/11] block: m25p80: n25q256a/n25q512a models marcin.krzeminski
2016-02-04 12:23 ` [Qemu-devel] [PATCH v2 11/11] block: m25p80: at25128a/at25256a models marcin.krzeminski
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).