All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bin Meng <bin.meng@processmission.com>
To: QEMU <qemu-devel@nongnu.org>
Cc: Alistair Francis <alistair@alistair23.me>,
	Hanna Reitz <hreitz@redhat.com>, Kevin Wolf <kwolf@redhat.com>,
	qemu-block@nongnu.org
Subject: [PATCH 04/10] hw/block: m25p80: Fix dummy byte handling for Spansion flash
Date: Tue, 30 Jun 2026 21:57:23 +0800	[thread overview]
Message-ID: <20260630135729.466264-5-bin.meng@processmission.com> (raw)
In-Reply-To: <20260630135729.466264-1-bin.meng@processmission.com>

Spansion flashes expose the number of dummy clock cycles through CR2V
register [1]. The value is a cycle count, not a byte count, so the
m25p80 model has to convert it to the number of whole SSI transfer
bytes consumed while collecting read command data.

Add a helper that multiplies the CR2V dummy cycle count by the phase
width and rounds up non-byte-aligned counts, matching the byte-oriented
SSI model. The default eight-cycle configuration keeps the same byte
counts as before.

[1] https://www.infineon.com/assets/row/public/documents/10/49/infineon-s25fs128s-s25fs256s-1-datasheet-en.pdf

Fixes: cf6f1efe0b57 ("m25p80: Fast read commands family changes")
Signed-off-by: Bin Meng <bin.meng@processmission.com>
---

 hw/block/m25p80.c | 32 ++++++++++++++++++++------------
 1 file changed, 20 insertions(+), 12 deletions(-)

diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 745d13dff6..e5d1bea5fc 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -1028,6 +1028,23 @@ static uint8_t numonyx_extract_cfg_num_dummies(Flash *s)
     return num_dummies / 8;
 }
 
+static uint8_t spansion_extract_cfg_num_dummies(Flash *s, uint8_t bus_width)
+{
+    uint8_t num_dummies;
+
+    num_dummies = extract32(s->spansion_cr2v, SPANSION_DUMMY_CLK_POS,
+                            SPANSION_DUMMY_CLK_LEN);
+    num_dummies *= bus_width;
+
+    if (num_dummies % 8) {
+        qemu_log_mask(LOG_UNIMP,
+                      "M25P80: the number of dummy bits is not multiple of 8");
+        num_dummies = ROUND_UP(num_dummies, 8);
+    }
+
+    return num_dummies / 8;
+}
+
 static uint8_t macronix_extract_cfg_num_dummies(Flash *s, uint8_t bus_width)
 {
     static const uint8_t dummy_cycles_fast[4] = { 8, 6, 8, 10 };
@@ -1081,10 +1098,7 @@ static void decode_fast_read_cmd(Flash *s)
         s->needed_bytes += macronix_extract_cfg_num_dummies(s, 1);
         break;
     case MAN_SPANSION:
-        s->needed_bytes += extract32(s->spansion_cr2v,
-                                    SPANSION_DUMMY_CLK_POS,
-                                    SPANSION_DUMMY_CLK_LEN
-                                    );
+        s->needed_bytes += spansion_extract_cfg_num_dummies(s, 1);
         break;
     case MAN_ISSI:
         /*
@@ -1117,10 +1131,7 @@ static void decode_dio_read_cmd(Flash *s)
         break;
     case MAN_SPANSION:
         s->needed_bytes += SPANSION_CONTINUOUS_READ_MODE_CMD_LEN;
-        s->needed_bytes += extract32(s->spansion_cr2v,
-                                    SPANSION_DUMMY_CLK_POS,
-                                    SPANSION_DUMMY_CLK_LEN
-                                    );
+        s->needed_bytes += spansion_extract_cfg_num_dummies(s, 2);
         break;
     case MAN_NUMONYX:
         s->needed_bytes += numonyx_extract_cfg_num_dummies(s);
@@ -1157,10 +1168,7 @@ static void decode_qio_read_cmd(Flash *s)
         break;
     case MAN_SPANSION:
         s->needed_bytes += SPANSION_CONTINUOUS_READ_MODE_CMD_LEN;
-        s->needed_bytes += extract32(s->spansion_cr2v,
-                                    SPANSION_DUMMY_CLK_POS,
-                                    SPANSION_DUMMY_CLK_LEN
-                                    );
+        s->needed_bytes += spansion_extract_cfg_num_dummies(s, 4);
         break;
     case MAN_NUMONYX:
         s->needed_bytes += numonyx_extract_cfg_num_dummies(s);
-- 
2.34.1



  parent reply	other threads:[~2026-06-30 13:58 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-30 13:57 [PATCH 00/10] hw/{block,ssi}: Fix spi-nor flash dummy byte handling Bin Meng
2026-06-30 13:57 ` [PATCH 01/10] hw/block: m25p80: Fix dummy byte handling for Winbond flash Bin Meng
2026-07-06  7:48   ` Philippe Mathieu-Daudé
2026-07-06 16:54     ` Bin Meng
2026-06-30 13:57 ` [PATCH 02/10] hw/block: m25p80: Fix dummy byte handling for Numonyx/Micron flash Bin Meng
2026-06-30 13:57 ` [PATCH 03/10] hw/block: m25p80: Fix dummy byte handling for Macronix flash Bin Meng
2026-07-06  7:52   ` Philippe Mathieu-Daudé
2026-06-30 13:57 ` Bin Meng [this message]
2026-06-30 13:57 ` [PATCH 05/10] hw/ssi: npcm7xx_fiu: Correct the dummy cycle emulation logic Bin Meng
2026-06-30 13:57 ` [PATCH 06/10] hw/ssi: xilinx_spips: Fix dummy phase handling Bin Meng
2026-07-06  8:10   ` Philippe Mathieu-Daudé
2026-07-06 17:27     ` Bin Meng
2026-06-30 13:57 ` [PATCH 07/10] hw/ssi: aspeed_smc: Fix direct-read dummy bytes Bin Meng
2026-06-30 14:45   ` Cédric Le Goater
2026-06-30 13:57 ` [PATCH 08/10] Revert "aspeed/smc: Fix number of dummy cycles for FAST_READ_4 command" Bin Meng
2026-06-30 14:45   ` Cédric Le Goater
2026-06-30 13:57 ` [PATCH 09/10] Revert "aspeed/smc: snoop SPI transfers to fake dummy cycles" Bin Meng
2026-06-30 14:46   ` Cédric Le Goater
2026-06-30 13:57 ` [PATCH 10/10] docs/devel: Document SSI dummy-cycle ownership Bin Meng
2026-07-06  8:13   ` Philippe Mathieu-Daudé
2026-06-30 14:45 ` [PATCH 00/10] hw/{block,ssi}: Fix spi-nor flash dummy byte handling Cédric Le Goater
2026-07-06  7:13 ` Cédric Le Goater
2026-07-06  8:19 ` Philippe Mathieu-Daudé
2026-07-06  8:40   ` Cédric Le Goater
2026-07-06  9:58     ` Philippe Mathieu-Daudé
2026-07-06 10:26       ` Cédric Le Goater

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260630135729.466264-5-bin.meng@processmission.com \
    --to=bin.meng@processmission.com \
    --cc=alistair@alistair23.me \
    --cc=hreitz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.