[PATCH 0/3] mtd: rawnand: More continuous read fixes

Christophe Kerello christophe.kerello at foss.st.com
Mon Feb 26 06:28:59 PST 2024


Hi Miquel,

On 2/23/24 12:55, Miquel Raynal wrote:
> Hello,
> 
> Following Christophe report I manually inserted many different
> conditions to test the logic enablingand configuring continuous reads in
> the core, trying to clarify the core and hopefully fix it for real. I am
> pretty confident regarding the first patch but a bit more in the fog for
> the second/third. Even though I'm pretty sure they improve the situation
> there might still be corner cases I don't have in mind.

I have tested the patchset and the issue is fixed, so I will send a 
tested-by on patch 1.

But, I think that there is still an issue using FMC2 and probably others 
drivers.

FMC2 driver has 2 modes: polling mode that will called 
nand_read_page_op and the sequencer mode that is defining its own HW 
read algorithm.

The FMC2 sequencer do not support continuous read feature.

I have added basic logs in nand_do_read_ops. My understanding is that 
the continuous read feature should be disabled at the end of this function.

FMC2 polling mode:
root at stm32mp1:~# mtd_debug read /dev/mtd9 0 0x2000 /tmp/read.hex
[   41.083132] nand_do_read_ops starts: cont_read.ongoing=1
[   41.086410] nand_do_read_ops starts: cont_read.first_page=0, 
cont_read.last_page=1
[   41.094797] nand_do_read_ops ends: cont_read.ongoing=0
[   41.098111] nand_do_read_ops ends: cont_read.first_page=0, 
cont_read.last_page=1
Copied 8192 bytes from address 0x00000000 in flash to /tmp/read.hex

It is OK. In polling mode, con_read.ongoing is set to false before 
leaving nand_do_read_ops function.

FMC2 sequencer:
root at stm32mp1:~# mtd_debug read /dev/mtd9 0 0x2000 /tmp/read.hex
[   57.143059] nand_do_read_ops starts: cont_read.ongoing=1
[   57.146370] nand_do_read_ops starts: cont_read.first_page=0, 
cont_read.last_page=1
[   57.154469] nand_do_read_ops ends: cont_read.ongoing=1
[   57.158020] nand_do_read_ops ends: cont_read.first_page=0, 
cont_read.last_page=1
Copied 8192 bytes from address 0x00000000 in flash to /tmp/read.hex

KO, con_read.ongoing is set to true before leaving nand_do_read_ops 
function. That means that read_oob can returned wrong data (similar 
issue as the initial reported issue).

So, I see 2 ways to fix this issue.

On framework side by adding a callback (rawnand_disable_cont_reads) that 
will set to false con_read.ongoing before leaving nand_do_read_ops function.

Or

On FMC2 driver side by disabling the continuous read feature in case of 
the sequencer is used like it is done in nandsim.c driver.
Something like:
if (check_only) {
		for (op_id = 0; op_id < op->ninstrs; op_id++) {
			instr = &op->instrs[op_id];
			if (instr->type == NAND_OP_CMD_INSTR &&
			    (instr->ctx.cmd.opcode == NAND_CMD_READCACHEEND ||
			     instr->ctx.cmd.opcode == NAND_CMD_READCACHESEQ))
				return -EOPNOTSUPP;
		}

		return 0;
	}

So, should it be fixed on driver side or framework side?

Regards,
Christophe Kerello.

> 
> Link: https://lore.kernel.org/linux-mtd/20240221175327.42f7076d@xps-13/T/#m399bacb10db8f58f6b1f0149a1df867ec086bb0a
> 
> Cheers,
> Miquèl
> 
> Miquel Raynal (3):
>    mtd: rawnand: Fix and simplify again the continuous read derivations
>    mtd: rawnand: Add a helper for calculating a page index
>    mtd: rawnand: Ensure all continuous terms are always in sync
> 
>   drivers/mtd/nand/raw/nand_base.c | 77 +++++++++++++++++++-------------
>   1 file changed, 47 insertions(+), 30 deletions(-)
> 



More information about the linux-mtd mailing list