From: Jisheng Zhang <jszhang@kernel.org>
To: "Nuno Sá" <noname.nuno@gmail.com>
Cc: "Miquel Raynal" <miquel.raynal@bootlin.com>,
"Nuno Sá" <nuno.sa@analog.com>, "Fei Xie" <fei.xie@horizon.auto>,
"Mark Brown" <broonie@kernel.org>,
linux-spi@vger.kernel.org, linux-mtd@lists.infradead.org
Subject: Re: [RFC PATCH 0/4] spi: cadence-xspi: add ACMD PIO support for NAND and NOR
Date: Thu, 8 Oct 2026 21:55:27 +0800 [thread overview]
Message-ID: <asegz79z-SNqphVs@xhacker> (raw)
In-Reply-To: <dde19ed4315a58bb7f109486a05277f40c2a2842.camel@gmail.com>
On Wed, Oct 07, 2026 at 07:12:57AM +0100, Nuno Sá wrote:
> On Wed, 2026-10-07 at 12:48 +0800, Jisheng Zhang wrote:
> > On Tue, Oct 06, 2026 at 07:50:44AM +0100, Nuno Sá wrote:
> > > On Sun, 2026-10-04 at 16:37 +0200, Miquel Raynal wrote:
> > > > Hello,
> > > >
> > > > On 28/09/2026 at 16:02:27 +01, Nuno Sá <nuno.sa@analog.com> wrote:
> > > >
> > > > > On Mon, Sep 28, 2026 at 01:50:05PM +0800, Fei Xie wrote:
> > > > >
> > > > > Hi Fei,
> > > > >
> > > > > > Hi Nuno, Miquel,
> > > > > >
> > > > > > Thanks for asking for benchmarks. I backported the 32/64-bit STIG SDMA
> > > > > > transfer changes from the patch Nuno pointed to [1] to our vendor 6.1
> > > > > > kernel, and compared that STIG path against the ACMD SPI NAND path from
> > > > > > this RFC. I have not applied Nuno's separate ACMD read implementation;
> > > > > > the figures below are for the implementation in this RFC.
> > > > > >
> > > > > > The device is a GD5F4GM8RE SPI NAND (2 KiB pages, 128 KiB eraseblocks)
> > > > > > on a Horizon J6B board, running at 80 MHz in quad SDR mode. Both paths
> > > > > > used the same board PHY configuration. STIG needed one additional dummy
> > > > > > clock for the EBh read-cache command on this board to return correct
> > > > > > data at 80 MHz. This is a local test adjustment, not part of the posted
> > > > > > RFC or [1]; I excluded the incorrect STIG reads from the comparison.
> > > > > >
> > > > > > I ran flash_speed -c 5 -d /dev/mtd18 three times with each mode. The
> > > > > > numbers below are the arithmetic means, in KiB/s:
> > > > > >
> > > > > > STIG ACMD PIO
> > > > > > eraseblock write speed 3685 3555
> > > > > > eraseblock read speed 12468 14222
> > > > > > page write speed 3671 3510
> > > > > > page read speed 11931 13716
> > > > > > erase speed 40000 37647
> > > > >
> > > > > So this goes along with my expectations. I think we can all agree that
> > > > > PROGRAM + ERASE is not worth the trouble? We even loose performance...
> > > >
> > > > Yeah.
> > > >
> > > > > > For a separate sequential-read test, I erased and programmed the first
> > > > > > 64 MiB with known random data, then checked that each mode read back
> > > > > > the complete area byte-for-byte. Both SHA-256 hashes matched the source;
> > > > > > the reported ECC failure counts were zero. I then ran:
> > > > >
> > > > > What do you mean by sequential read? Does your flash supports continuous
> > > > > rads (or buffered mode I think). If so, I would expect much better
> > > > > number for the ACMD case. But that can be the issue of having both the
> > > > > controller and the chip trying to walk pages.
> > > >
> > > > Sequential, continuous and buffered should mean the same in the NAND
> > > > context.
> > > >
> > > > > > /var/busybox/time -f 'real=%e user=%U sys=%S cpu=%P' \
> > > > > > dd if=/dev/mtd18 of=/dev/null bs=1M count=64
> > > > > >
> > > > > > STIG ACMD PIO
> > > > > > elapsed (three runs) 5.30/5.28/5.26 s 4.66/4.65/4.65 s
> > > > > > mean throughput 12.12 MiB/s 13.75 MiB/s
> > > > > > mean system time 3.55 s 1.06 s
> > > > > > process CPU usage 67% 22%
> > > > > >
> > > > > > On this NAND, ACMD improves the 64 MiB read throughput by about 13.5%
> > > > > > and reduces the reading process's CPU usage by 45 percentage points.
> > > > > > The flash_speed results show a similar gain for reads, including
> > > > > > single-page reads.
> > > >
> > > > FYI, if you pull a recent version of mtd-utils, flash_speed can
> > > > benchmark continuous read improvements with the -C option.
> > > >
> > > > > > I do not see a program or erase throughput benefit:
> > > > > > ACMD is slightly slower for both in this setup. These are SPI NAND
> > > > > > results only; I have not benchmarked the NOR path on this board.
> > > > >
> > > > > So CPU results are the bing thing here. I guess we need to decide if
> > > > > it's worth the amount of complexity it requires for the whole thing to
> > > > > work. As I mentioned, if the chip has continuous mode and we try to
> > > > > read anything bigger than page size we should let the nand chip to
> > > > > walk the pages and that means the behavior we have today (IMHO of
> > > > > course):
> > > > >
> > > > > 0x13 (STIG) + wait + read from cache (ACMD)
> > > > >
> > > > > If we're only reading a single page then the logic in this series would
> > > > > payoff (slight performance gain + significant drop in cpu load). One simple
> > > > > way for doing this as a starting point would be:
> > > > >
> > > > > * Nand has cont mode -> xspi controller does nothing special
> > > > > * Nand has no cont mode -> Aggregate the xfers together.
> > > >
> > > > I'm fine with static decisions like that, but my understanding of the
> > > > above is that ACMD mode is useful for all reads. so I don't get why you
> > > > would no use it for all. Maybe because it would break continuous reads?
> > > > (sorry I lost a bit of the context already).
> > >
> > > Exactly. In ACMD, is also capable of "walking pages" for reads bigger than page
> > > size
> > > (hence the need to know the flash geometry) and IIRC, that does not really work
> > > well
> > > when the flash is also doing it.
> > >
> > > >
> > > > For writes and erases however, it seems like we could keep the STIG path.
> > > >
> > > > > Doing something dynamic would be much more complex I guess. With the
> > > > > above reasoning, having some mem_info() kind of spi_mem callback to tell
> > > > > us things like geometry, continuous mode support, etc would be enough to
> > > > > handle the above I think. The reasoning is that reading a nand page is
> > > > > always like spinand_load_page_op() (opcode 0x13) + spinand_wait() +
> > > > > spinand_read_from_cache_op() so we could probably aggregate everything
> > > > > in the last call on the controller side without complicating the nand core
> > > > > logic.
> > > >
> > > > In general, drivers making assumptions has been a disaster in the raw
> > > > NAND world. This was the main reason for the ->exec_op() introduction
> > > > there: giving the whole operation to the controller so it can decide
> > > > what to do without guessing. But we thinking at the operation boundary,
> > > > not at the "set of operations" level. Since ->exec_op() in the SPI NAND
> > > > subsystem has been written following the same philosophy, I fear we're
> > > > going to try make rounds fit inside squares. One of the possible
> > >
> > > Fair enough! Agreed
> > >
> > > > approach would be to mimic what we've done for the some limited
> > > > controllers: pack everything in one single op (see the _monolithic
> > > > suffix in drivers/mtd/nand/raw/). That's just one idea.
> > > >
> > >
> > > I can take a look mostly for curiosity as my intention is not to "steal" this
> > > work
> > > from Fei. If everyone agrees (specially Fei), what I can do is to send my simpler
> > > patches that just support ACMD (without any special distinction between Nand and
> > > Nor)
> > > For Nands, I have a mix of STIG and ACMD, where big gains come from Nands with
> > > cont
> > > mode.
> > >
> > > Then we can build on top of it in order to improve Nand support (mostly on CPU
> > > load).
> >
> > I'm also interested in this driver's performance. A bit off the subject
> > but related question: Usually, the Soc may connect the xspi to dma
> > engine, I'm curious what would be the benefit of adding dma engine
> > support instead of ACMD? Is dma engine support simpler and
> > is the gain(performance + cpu load) more?
> >
>
> I'm not familiar with that approach tbh. But I would assume performance to be pretty
> much similar to what I have given that ACMD uses the IP internal DMA engine. But not
> using ACMD means not having the cpu gains at least for the smaller transfers as we
> would not be able to aggregate transfers. FWIW, given that you might not have looked
Hmm, my platforms connect two dmaengine channels to the xspi controller,
but I haven't added the dma-engine support to the driver yet. If the
ACMD is enough, why HW connects dma-engine then? Just curious, there
must be performance gain I guess. But I'm not sure and I don't have
performance numbers.
> at the whole thread, this is what I have:
>
> https://github.com/analogdevicesinc/linux/pull/3478/changes/477e6095508546552071b825a66522cf697c27c2
>
> - Nuno Sá
>
> > Regards
next prev parent reply other threads:[~2026-10-08 14:15 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-21 9:36 [RFC PATCH 0/4] spi: cadence-xspi: add ACMD PIO support for NAND and NOR Fei Xie
2026-09-21 9:36 ` [RFC PATCH 1/4] dt-bindings: spi: cdns,xspi: add SPI NAND compatible Fei Xie
2026-09-21 14:01 ` Mark Brown
2026-09-23 12:54 ` Krzysztof Kozlowski
2026-09-21 9:36 ` [RFC PATCH 2/4] spi: cadence-xspi: add ACMD support for SPI NAND Fei Xie
2026-09-21 14:51 ` Mark Brown
2026-09-23 6:12 ` Fei Xie
2026-09-24 18:55 ` Mark Brown
2026-09-25 9:45 ` Miquel Raynal
2026-09-25 10:14 ` Nuno Sá
2026-09-25 10:23 ` Miquel Raynal
2026-09-25 11:31 ` Nuno Sá
2026-09-25 11:59 ` Mark Brown
2026-09-25 12:59 ` Miquel Raynal
2026-09-25 16:38 ` Mark Brown
2026-09-23 12:37 ` Nuno Sá
2026-09-21 9:37 ` [RFC PATCH 3/4] spi: cadence-xspi: factor out reusable ACMD helpers Fei Xie
2026-09-21 9:37 ` [RFC PATCH 4/4] spi: cadence-xspi: add ACMD support for SPI NOR Fei Xie
2026-09-23 12:24 ` [RFC PATCH 0/4] spi: cadence-xspi: add ACMD PIO support for NAND and NOR Nuno Sá
2026-09-28 5:50 ` Fei Xie
2026-09-28 15:02 ` Nuno Sá
2026-10-04 14:37 ` Miquel Raynal
2026-10-06 6:50 ` Nuno Sá
2026-10-07 4:48 ` Jisheng Zhang
2026-10-07 6:12 ` Nuno Sá
2026-10-08 13:55 ` Jisheng Zhang [this message]
2026-10-09 4:30 ` Jisheng Zhang
2026-10-09 6:17 ` Nuno Sá
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=asegz79z-SNqphVs@xhacker \
--to=jszhang@kernel.org \
--cc=broonie@kernel.org \
--cc=fei.xie@horizon.auto \
--cc=linux-mtd@lists.infradead.org \
--cc=linux-spi@vger.kernel.org \
--cc=miquel.raynal@bootlin.com \
--cc=noname.nuno@gmail.com \
--cc=nuno.sa@analog.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox