Boot failed after patch "mtd: rawnand: Support for sequential cache reads"
Miquel Raynal
miquel.raynal at bootlin.com
Mon May 29 01:12:40 PDT 2023
Hi Alexander,
eagle.alexander923 at gmail.com wrote on Mon, 29 May 2023 09:10:32 +0300:
> Hello Miquel.
>
> пт, 26 мая 2023 г. в 21:14, Miquel Raynal <miquel.raynal at bootlin.com>:
> > Hi Alexander,
> > eagle.alexander923 at gmail.com wrote on Thu, 25 May 2023 10:48:39 +0300:
> > > Hello.
> > > Kernel boot fails after patch "mtd: rawnand: Support for sequential
> > > cache reads" (thanks to git bisect).
> > > Please advise what can be done here and where to look for a bug.
> > Thanks for the report, and sorry for the trouble. Right now I don't
> > know what's wrong with the driver but as a first step, you could just
> > try to reset chip->controller->supported_op.cont_read after
> > rawnand_check_cont_read_support(). It should just avoid using the
> > optimization and solve the boot. That's of course a very early fix, we
> > now need to understand further what's going on.
>
> When I comment out the line "rawnand_check_cont_read_support(chip);"
> the booting works as expected.
>
> > My first guess would be that the sequential read patterns are not
> > supported by the controller or badly implemented by its driver. But
> > that is strange given the simplicity of this controller. This
> > controller is meant to be versatile, I doubt it does not support these
> > operations. Plus, I would expect page accesses to be directly
> > implemented by the driver and not be affected by this logic. Could you
> > try to trace the actual calls which are made through the mtd layer
> > which lead to these errors? Is ->exec_op() involved in the process?
> > Where? How?
>
> Yes, Here everything goes as expected, debugging shows that the correct
> opcodes are passing, for the NAND_CMD_READCACHESEQ it is 0x31.
>
> > Also, what kernel are you using exactly? I'm surprised there is no
> > mtd-related error. If you reboot with an older kernel, you get your
> > data, right?
>
> Right. This bug appeared in Linux 6.3. For 6.2 everything worked as expected,
> so I used "git bisect" to find the point where the error occurs.
>
> > Otherwise maybe the Micron chip is in fault. Which would mean that
> > there are unsupported commands. I believed they were all standard,
> > maybe some of them are optional? Could you check in the chip datasheet
> > if there is any command used there that is unsupported?
>
> According to the MT29F2G08ABAEAWP datasheet, the chip supports
> the READ PAGE CACHE SEQUENTIAL opcode, but with two caveats:
> 4. These commands supported only with ECC disabled.
> 5. Issuing a READ PAGE CACHE series (31h, 00h-31h, 3Fh) command
> when the array is busy (RDY = 1, ARDY = 0) is supported if the previous
> command was a READ PAGE (00h-30h) or READ PAGE CACHE series
> command; otherwise, it is prohibited.
>
> As far as I understand, the second remark suits us, since we create
> the correct sequence.
Exactly, we do:
READ0 (0), READSTART (30),
READCACHESEQ (31), data,
READCACHESEQ (31), data,
...
READCACHEEND (3f), data.
which is what the datasheet tells us I believe.
> But the first remark can be a problem in this case.
I was not aware of this limitation, it's only written in the summary,
not in the details about the commands, nice finding. We need to prevent
on-die ECC users from enabling this feature.
But given the below trace, you're not using the on-die ECC engine,
right? It looks like you're using the controller's ELM engine to
perform ECC correction, so I don't see why this specific limitation
would hit us. Can you confirm the ECC engine of the chip is disabled?
> > > ...
> > > omap-gpmc 50000000.gpmc: GPMC revision 6.0
> > > ...
> > > nand: device found, Manufacturer ID: 0x2c, Chip ID: 0xda
> > > nand: Micron MT29F2G08ABAEAWP
> > > nand: 256 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64
> > > nand: using OMAP_ECC_BCH8_CODE_HW ECC scheme
> > > ...
> > > VFS: Mounted root (squashfs filesystem) readonly on device 254:0.
> > > devtmpfs: mounted
> > > Freeing unused kernel image (initmem) memory: 1024K
> > > Run /sbin/init as init process
> > > SQUASHFS error: lzo decompression failed, data probably corrupt
> > > SQUASHFS error: Failed to read block 0xd291c2: -5
> > > SQUASHFS error: lzo decompression failed, data probably corrupt
> > > SQUASHFS error: Failed to read block 0xd291c2: -5
> > > SQUASHFS error: Unable to read data cache entry [d291c2]
> > > SQUASHFS error: Unable to read page, block d291c2, size 14307
> > > SQUASHFS error: Unable to read data cache entry [d291c2]
> > > SQUASHFS error: Unable to read page, block d291c2, size 14307
> > > Kernel panic - not syncing: Attempted to kill init!
> > > exitcode=0x00000007 CPU: 0 PID: 1 Comm: init Not tainted 6.3.0+ #105
> > > Hardware name: Generic AM33XX (Flattened Device Tree)
> > > unwind_backtrace from show_stack+0xb/0xc
> > > show_stack from dump_stack_lvl+0x2b/0x34
> > > dump_stack_lvl from panic+0xbd/0x230
> > > panic from make_task_dead+0x1/0x120
> > > make_task_dead from 0xc102ca80
> > > ---[ end Kernel panic - not syncing: Attempted to kill init!
> > > exitcode=0x00000007 ]---
Thanks,
Miquèl
More information about the linux-mtd
mailing list