Linux-mtd Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Bough Chen <haibo.chen@oss.nxp.com>
To: Miquel Raynal <miquel.raynal@bootlin.com>
Cc: Pratyush Yadav <pratyush@kernel.org>,
	Michael Walle <mwalle@kernel.org>,
	Takahiro Kuwano <takahiro.kuwano@infineon.com>,
	Richard Weinberger <richard@nod.at>,
	Vignesh Raghavendra <vigneshr@ti.com>,
	"linux-mtd@lists.infradead.org" <linux-mtd@lists.infradead.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"michael@walle.cc" <michael@walle.cc>,
	Bough Chen <haibo.chen@nxp.com>,
	"open list:NXP i.MX 7D/6SX/6UL/93 AND VF610 ADC DRIVER"
	<imx@lists.linux.dev>
Subject: Re: [PATCH v2] mtd: spi-nor: clear the default RDCR opcode when entering Octal DTR
Date: Thu, 15 Oct 2026 11:10:17 +0800	[thread overview]
Message-ID: <20261015031017.pdqnv2bp5627bhed@shlinux89> (raw)
In-Reply-To: <AS8PR04MB8820E136E7257FC5A02F1A3E908C2@AS8PR04MB8820.eurprd04.prod.outlook.com>

On Tue, Sep 29, 2026 at 09:10:37AM +0000, Bough Chen (OSS) wrote:
> > -----Original Message-----
> > From: Miquel Raynal <miquel.raynal@bootlin.com>
> > Sent: Tuesday, September 29, 2026 4:23 PM
> > To: Bough Chen (OSS) <haibo.chen@oss.nxp.com>
> > Cc: Pratyush Yadav <pratyush@kernel.org>; Michael Walle
> > <mwalle@kernel.org>; Takahiro Kuwano <takahiro.kuwano@infineon.com>;
> > Richard Weinberger <richard@nod.at>; Vignesh Raghavendra
> > <vigneshr@ti.com>; linux-mtd@lists.infradead.org; linux-
> > kernel@vger.kernel.org; michael@walle.cc; Bough Chen
> > <haibo.chen@nxp.com>
> > Subject: Re: [PATCH v2] mtd: spi-nor: clear the default RDCR opcode when
> > entering Octal DTR
> > 
> > On 29/09/2026 at 14:53:07 +08, haibo.chen@oss.nxp.com wrote:
> > 
> > > From: Haibo Chen <haibo.chen@nxp.com>
> > >
> > > The core defaults opcodes.read_sr2 to the legacy RDCR opcode (0x35).
> > > In 8D-8D-8D mode the opcode is extended to two bytes per cmd_ext_type,
> > > but the resulting command is not a valid SR2 read for these flashes,
> > > which access their status/config registers through a vendor-specific
> > > indirect register space. Since spi_nor_cache_sr_lock_bits() now reads
> > > SR2 during init, i.e. after the switch to Octal DTR, the extended RDCR
> > > gets no data back and the read times out (on i.MX FlexSPI: -ETIMEDOUT
> > > and a controller
> > > WARN() during probe with Micron MT35xU and Macronix octal parts).
> > >
> > > Clear read_sr2 when the switch to Octal DTR actually succeeds, so the
> > > SR2 read is skipped (a cleared opcode already means "unsupported").
> > > Doing it in spi_nor_set_octal_dtr() keys off the real runtime
> > > protocol: a flash that advertises Octal DTR but runs in (x)STR because
> > > the host lacks support keeps its usable RDCR.
> > >
> > > Assisted-by: LLM
> > > Fixes: b7b63475903c ("mtd: spi-nor: Create a local SR cache")
> > > Fixes: 63489002d397 ("mtd: spi-nor: Refactor Read Status/Write Status
> > > support")
> > > Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
> > > ---
> > > Changes in v2:
> > > - Rework the fix following review: instead of guarding the read at runtime
> > >   in spi_nor_read_sr2(), clear the default RDCR opcode.read_sr2 once, at the
> > >   point the switch to Octal DTR succeeds (spi_nor_set_octal_dtr()).
> > 
> > I don't get that choice. Why switching when Octal DTR succeeds only? SR2 is
> > either supported or not supported, I don't think it is anyway different when
> > entering octal DTR mode, is it? So I would expect SR2 to be cleared earlier than
> > that, once we know the chip is octal DTR capable. And this must be early
> > enough so that manufacturer drivers can still set their own value.
> > 
> > I am wondering whether we should simply drop sr2 opcode in the QER SFDP
> > parsing entirely for octal DTR devices (Michael?).
> 
> The reason I clear it at the point Octal DTR actually succeeds rather than
>  "once the chip is octal-DTR-capable" is that capability != running mode: 
> a chip can advertise Octal DTR while still running in (x)STR because the host 
> controller does not support 8D (see reply below). In that (x)STR case RDCR is
>  valid and needed, so keying off capability alone would wrongly drop a usable
>  SR2 read.
> 
> That said, I agree the current spot is awkward and does not let manufacturer 
> drivers override the value. I'm happy to move it earlier. Two options:
> 1, Clear it during SFDP QER parsing (as you suggest) for octal-DTR-capable devices.
>      This is the natural place next to the existing read_sr2 = 0 QER cases, and it runs 
>       before the manufacturer late_init/fixups, so a driver can still install its own SR2
>       opcode afterwards. 
>      My only concern is the capability-vs-running-mode point above — we'd be 
>      clearing based on advertised 8D capability, not on whether 8D is actually entered.
> 
> 2, Clear it in spi_nor_late_init_params() after the manufacturer hooks, gated on 
>      octal-DTR capability, so vendor values set in their late_init are preserved.
> 
> If the capability-based approach is acceptable (i.e. we accept that a chip advertising
>  8D but forced to STR by the host loses its RDCR), I'll go with dropping it in the QER SFDP
>  parsing. Michael, do you have a preference?

Hi Miquel,

Any suggestion?

Regards
Haibo Chen

> > 
> > 
> > > - Key the clear off the real runtime protocol so a flash that advertises
> > >   Octal DTR but runs in (x)STR (host without 8D support) keeps its
> > >   RDCR.
> > 
> > Are you sure this is a valid case?
> 
> Yes. spi_nor_setup() computes shared_mask = hwcaps->mask & params->hwcaps.mask, 
> i.e. the intersection of flash and controller capabilities. If the host does not support 8D, 
> SNOR_HWCAPS_READ_8_8_8_DTR is not in shared_mask, spi_nor_select_read() picks a 
> non-8D read_proto/write_proto, and spi_nor_set_octal_dtr() bails out early at:
> 
> if (!(nor->read_proto == SNOR_PROTO_8_8_8_DTR &&
>       nor->write_proto == SNOR_PROTO_8_8_8_DTR))
> 	return 0;
> 
> So the chip stays in (x)STR with reg_proto == SNOR_PROTO_1_1_1, and RDCR is still a valid 
> single-byte SR2 read there. That is the case I wanted to avoid breaking by keying the clear
>  off the negotiated runtime protocol rather than the advertised capability. If we move the 
> clear to capability-based SFDP/late_init as discussed, this is exactly the scenario we need to 
> be comfortable regressing (an 8D-capable part on a non-8D host would lose its RDCR read of SR2).
> 
> Regards
> Haibo Chen
> 
> > 
> > Thanks,
> > Miquèl

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

  reply	other threads:[~2026-10-15  3:06 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-29  6:53 [PATCH v2] mtd: spi-nor: clear the default RDCR opcode when entering Octal DTR haibo.chen
2026-09-29  6:59 ` sashiko-bot
2026-09-29  7:28   ` Miquel Raynal
2026-09-29  8:23 ` Miquel Raynal
2026-09-29  9:10   ` Bough Chen (OSS)
2026-10-15  3:10     ` Bough Chen [this message]
2026-10-15 10:23       ` Miquel Raynal
2026-09-29 14:02   ` Michael Walle

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=20261015031017.pdqnv2bp5627bhed@shlinux89 \
    --to=haibo.chen@oss.nxp.com \
    --cc=haibo.chen@nxp.com \
    --cc=imx@lists.linux.dev \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=michael@walle.cc \
    --cc=miquel.raynal@bootlin.com \
    --cc=mwalle@kernel.org \
    --cc=pratyush@kernel.org \
    --cc=richard@nod.at \
    --cc=takahiro.kuwano@infineon.com \
    --cc=vigneshr@ti.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