[PATCH 0/2] mtd: nand: raw: atmel: R/B gpio on sam9x60

Alexander Dahl ada at thorsis.com
Wed Aug 9 10:34:06 CEST 2023


Hello,

just a short supplement …

Am Wed, Aug 09, 2023 at 09:40:15AM +0200 schrieb Alexander Dahl:
> Hello everyone,
> 
> I had a closer look into the SAMA5D2 Series Datasheet and the SAM9X60
> Data Sheet again.  See below.
> 
> Am Tue, Aug 08, 2023 at 05:00:48PM +0200 schrieb Alexander Dahl:
> > Hello Mihai,
> > 
> > Am Tue, Aug 08, 2023 at 01:40:26PM +0000 schrieb Mihai.Sain at microchip.com:
> > > Hi Alex,
> > > 
> > > Please find bellow my answer:
> > > 
> > > ------------------------------
> > > 
> > > Added Mihai who tested this a lot at some point in time
> > > 
> > > Eugen
> > > 
> > > On 8/8/23 16:02, Alexander Dahl wrote:
> > > > Hello everyone,
> > > >
> > > > this is a patch series wtih some real fixes _and_ a question or some 
> > > > kind of support request in the cover letter.  I would be happy if 
> > > > anyone could read the cover letter carefully and answer to that one 
> > > > what might be the problem I see. O:-)
> > > >
> > > > I'm currently working on the sam9x60-curiosity board and especially 
> > > > trying to get it booting from onboard raw NAND flash.  As reported in 
> > > > my last series I got the flash recognized already.  However 
> > > > interacting with it was terribly slow, because nand_wait_ready() 
> > > > calling
> > > > atmel_nand_dev_ready() ran into a 400ms timeout in several occasions, 
> > > > especially when reading from the device.  Reading a single block 
> > > > triggered that timeout two times per page, which summed up to over 50 
> > > > seconds for 64 × 4096 = 256k Bytes!
> > > >
> > > > (You can have U-Boot print that warning from nand_wait_ready() by 
> > > > increasing the console log level to at least "warn".)
> > > >
> > > > Note: the dts from atmel/next seems correct to me, I double checked 
> > > > that again.  My own debug log messages showed the GPIO is accessed, 
> > > > and if you add enough debug messages sometimes the timeout is not 
> > > > reached, so I'm sure the NAND chip eventually switches that R/B line 
> > > > and the code correctly sees that, that line level change however takes 
> > > > ages, something between 400ms and 500ms most of the times.
> > > >
> > > > I vaguely remembered on SAMA5D2 the old atmel raw nand driver is used 
> > > > which does not support reading the R/B signal, but nevertheless works.
> > > > I'm not familiar in detail with those raw NAND flash chips, but as far 
> > > > as I can understand, there are other ways to determine if the chip is 
> > > > ready or busy.  So after I removed that rb-gpio parameter from 
> > > > 'at91-sam9x60_curiosity.dts' I ran into the bug fixed by patch 2.
> > 
> > Maybe I should add: currently there are two different drivers for
> > atmel raw nand controllers in U-Boot, the old non-DM driver used by
> > sam9g20 or sama5 based boards for example and a new driver used by
> > sam9x60 based boards.  We are talking about sam9x60 and the new driver
> > in 'drivers/mtd/nand/raw/atmel/nand-controller.c' here.
> 
> The old one is enabled by CONFIG_NAND_ATMEL, the new one by
> CONFIG_DM_NAND_ATMEL instead.
> 
> > > > With that patch applied _and_ rb-gpio still removed from dts, raw NAND 
> > > > access is reasonably fast on sam9x60-curiosity board.  (You might want 
> > > > to rebase to atmel/next for testing this.)  Not sure if I should send 
> > > > a patch for that dts change, because I suppose it's a workaround only 
> > > > and not addressing the actual cause?
> > > >
> > > > I think the fix is correct in itself, I tested different combinations 
> > > > and compared with the driver in Linux, however …
> > > >
> > > > Can anyone explain to me, why flash access is sooo slow if the R/B 
> > > > gpio is used?  Especially in comparision to Linux, where I don't need 
> > > > to remove that thing from dts and it works reasonably fast?
> > > 
> > > // I'm sorry for quoting (email is sent from Outlook)
> > > # Please add in your board dts: atmel,rb = <0>
> > 
> > Although the new U-Boot driver tests for that, it is not documented in
> > U-Boot devicetree bindings.  According to Linux kernel (v6.4) device
> > tree binding documentation it is only meaningful for sama5.  Those
> > binding documentation was added to Linux back in 2019 by Boris
> > Brezillon.  And that line is not present in the dts file for
> > sam9x60-curiosity in Linux, so access is fast on Linux without that
> > line (this is the part I don't understand yet).
> > 
> > From what I saw in datasheets sam9x60 and sama5d2 have different
> > controllers (named 'SMC' and 'HSMC') and the U-Boot driver reflects
> > that.  That's why I did not add 'atmel,rb' to dts before, I though SMC
> > is the older one which does not support native R/B line handling?
> > (And because I took it from U-Boot sam9x60ek.dts which also does not have
> > it.)
> > 
> > Nevertheless, I tried to add it now in U-Boot as you suggested
> > (although without adapting pinctrl), and to my suprise it works … o.O
> > 
> > Trying the same in Linux leads to not finding a NAND device and thus
> > failing of the atmel-nand-controller driver probe.
> 
> From datasheet POV this all makes sense.  The HSMC on SAMA5D2 has a
> native NANDRDY signal/peripheral function to handle the R/B pin of the
> flash and can do the low level communication by itself with an
> embedded Nand Flash Controller (NFC).  The SMC on SAM9X60 has no such
> thing and the datasheet explicitly recommends to connect the R/B pin
> to _any_ GPIO.
> 
> The new dm-based nand-controller driver in U-Boot only checks if
> dts has the 'rb-gpios' property and only then overrides the
> chip->dev_ready function.  So for U-Boot this explains why adding that
> line yields the same result: it's effectivly the same handling as with
> ATMEL_NAND_NO_RB.
> 
> And because Linux can also not use a SoC feature which simply is not
> there, the question remains:
> 
> If both Linux and U-Boot have the GPIO handling for R/B setup, why
> can Linux access the chip fast and U-Boot can not?
> 
> I suspect because they have different drivers doing different things?
> One would have to look in deep detail what is done differently?

The answer is maybe simpler than I thought?  No driver at all in Linux
(v6.4) evaluates the 'rb-gpios' devicetree property.  The Linux atmel
nand controller driver only considers an old binding, which is not
used in recent dts for sam9x60.  So I guess Linux also does "soft
wait" only and does not read the R/B pin.  I suggest to discuss this
topic separately on linux-mtd …

Greets
Alex

P.S.: according to the schematic/layout files of the sam9x60-curiosity
board it's not easily possible to probe the R/B signal with an
oscilloscope or logic analyzer, because it's a direct wire between a
ball of the flash chip and a ball of the SoC, which is not exposed.
No pads to probe, one would have to scratch away the covering solder
mask …

> Whatever it is, from my POV it makes no sense to add the 'atmel,rb'
> property to the sam9x60 dts.  The only two possible paths I see:
> 
> 1. Short workaround: Remove the 'rb-gpios' property from U-Boot dts.
> The status can also be fetched through a NAND command from status
> register bit 6 of the flash (NAND_STATUS_READY) and that is done in
> drivers/mtd/nand/raw/nand_base.c all over the place.  (This is probably
> why it works in this case and also why it works for SAMA5D2 in U-Boot
> with other boards, where we explicitly had to undef
> SYS_NAND_READY_PIN.)
> 
> 2. Long term solution: Find the real cause and fix the U-Boot
> driver(s) …
> 
> > (Note: all this while booting from SD card, so at91bootstrap should
> > not interfere, because it does not touch nand.)
> > 
> > What I did not test yet:
> > 
> > - How it behaves in U-Boot when also adapting pinctrl
> > - How other combinations of adaptions to dts behave in Linux
> 
> Won't pursue these tests.  Makes no sense in my opinion, because of
> the reasons stated above.
> 
> Greets
> Alex
> 
> > Sending this mail now anyway, it's too long already and office time is
> > up for today.  Will do more systematic tests tomorrow.  Any more
> > insights welcome.
> > 
> > Greets
> > Alex
> > 
> > > # nand at 3 {
> > > #			reg = <0x3 0x0 0x800000>;
> > > #			atmel,rb = <0>;
> > > #			cs-gpios = <&pioD 4 GPIO_ACTIVE_HIGH>;
> > > #			rb-gpios = <&pioD 5 GPIO_ACTIVE_HIGH>;
> > > #			nand-bus-width = <8>;
> > > #			nand-ecc-mode = "hw";
> > > #			nand-ecc-strength = <8>;
> > > #			nand-ecc-step-size = <512>;
> > > #			nand-on-flash-bbt;>
> > > 
> > > > The actual flash chip is a Macronix MX30LF4G28AD, 512 MiB, SLC, erase
> > > > size: 256 KiB, page size: 4096, OOB size: 256.
> > > >
> > > > Greets
> > > > Alex
> > > >
> > > > P.S.: although not returned by get_maintainer.pl I added Eugen to Cc 
> > > > because he is maintainer of the at91 and might have some insight if it 
> > > > is a general problem of the nand controller in at91 socs?
> > > >
> > > > Alexander Dahl (2):
> > > >    mtd: nand: raw: atmel: Remove duplicate line
> > > >    mtd: nand: raw: atmel: Add error handling when rb-gpios missing
> > > >
> > > >   drivers/mtd/nand/raw/atmel/nand-controller.c | 12 +++++++-----
> > > >   1 file changed, 7 insertions(+), 5 deletions(-)
> > > >
> > > >
> > > > base-commit: a169438411f9277cc689c14078151aa1d1caae3c
> > > 


More information about the U-Boot mailing list