summaryrefslogtreecommitdiffstats
path: root/hw
diff options
context:
space:
mode:
authorJoe Komlodi2020-11-17 00:11:04 +0100
committerPeter Maydell2020-12-15 14:39:30 +0100
commit23af268566069183285bebbdf95b1b37cb7c0942 (patch)
treee5b1da75efa6048413e01e45df22b6c66a8794cb /hw
parenthw/block/m25p80: Check SPI mode before running some Numonyx commands (diff)
downloadqemu-23af268566069183285bebbdf95b1b37cb7c0942.tar.gz
qemu-23af268566069183285bebbdf95b1b37cb7c0942.tar.xz
qemu-23af268566069183285bebbdf95b1b37cb7c0942.zip
hw/block/m25p80: Fix Numonyx fast read dummy cycle count
Numonyx chips determine the number of cycles to wait based on bits 7:4 in the volatile configuration register. However, if these bits are 0x0 or 0xF, the number of dummy cycles to wait is 10 for QIOR and QIOR4 commands or when in QIO mode, and otherwise 8 for the currently supported fast read commands. [1] [1] https://www.micron.com/-/media/client/global/documents/products/data-sheet/nor-flash/serial-nor/mt25q/die-rev-b/mt25q_qlkt_u_02g_cbb_0.pdf?rev=9b167fbf2b3645efba6385949a72e453 Signed-off-by: Joe Komlodi <komlodi@xilinx.com> Reviewed-by: Francisco Iglesias <francisco.iglesias@xilinx.com> Message-id: 1605568264-26376-5-git-send-email-komlodi@xilinx.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw')
-rw-r--r--hw/block/m25p80.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index f1d7da65c8..c45afdd2cb 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -837,6 +837,30 @@ static uint8_t numonyx_mode(Flash *s)
}
}
+static uint8_t numonyx_extract_cfg_num_dummies(Flash *s)
+{
+ uint8_t num_dummies;
+ uint8_t mode;
+ assert(get_man(s) == MAN_NUMONYX);
+
+ mode = numonyx_mode(s);
+ num_dummies = extract32(s->volatile_cfg, 4, 4);
+
+ if (num_dummies == 0x0 || num_dummies == 0xf) {
+ switch (s->cmd_in_progress) {
+ case QIOR:
+ case QIOR4:
+ num_dummies = 10;
+ break;
+ default:
+ num_dummies = (mode == MODE_QIO) ? 10 : 8;
+ break;
+ }
+ }
+
+ return num_dummies;
+}
+
static void decode_fast_read_cmd(Flash *s)
{
s->needed_bytes = get_addr_length(s);
@@ -846,7 +870,7 @@ static void decode_fast_read_cmd(Flash *s)
s->needed_bytes += 8;
break;
case MAN_NUMONYX:
- s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
+ s->needed_bytes += numonyx_extract_cfg_num_dummies(s);
break;
case MAN_MACRONIX:
if (extract32(s->volatile_cfg, 6, 2) == 1) {
@@ -885,7 +909,7 @@ static void decode_dio_read_cmd(Flash *s)
);
break;
case MAN_NUMONYX:
- s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
+ s->needed_bytes += numonyx_extract_cfg_num_dummies(s);
break;
case MAN_MACRONIX:
switch (extract32(s->volatile_cfg, 6, 2)) {
@@ -925,7 +949,7 @@ static void decode_qio_read_cmd(Flash *s)
);
break;
case MAN_NUMONYX:
- s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
+ s->needed_bytes += numonyx_extract_cfg_num_dummies(s);
break;
case MAN_MACRONIX:
switch (extract32(s->volatile_cfg, 6, 2)) {