[PATCH v3 0/7] Marvell NAND controller rework with ->exec_op()

Boris Brezillon boris.brezillon at free-electrons.com
Fri Jan 12 00:45:01 PST 2018


On Fri, 12 Jan 2018 09:09:17 +0100
Robert Jarzmik <robert.jarzmik at free.fr> wrote:

> Miquel RAYNAL <miquel.raynal at free-electrons.com> writes:
> 
> I begun all your test procedure (on my zylonite board).
> The timing registers are the same in both pxa3xx_nand and marvell_nand, ie :
> [    3.085539] Timing registers from Bootloader:
> [    3.089971] -  NDTR0: 0x00161c1c
> [    3.095979] -  NDTR1: 0x0f3c00a2
> 
> I can attach the dmesg of the first run (dump of OOB). Yet I think you're
> missing the point as to where the bug lies.

We definitely don't know where the bug lies, otherwise we wouldn't do
the remote debug session we're doing here.

> 
> In the zylonite setup, the BBT is _not_ in the OOB of each block. Instead, it
> lies at the end of the NAND, in the last blocks (see struct
> nand_bbt_descr). Reading each block and declaring it as bad as is done in
> marvell_nand (at least that is my understanding of your traces), but it is not
> what should be done if a match is found for the bbt_pattern. Instead, the BBT
> should be loaded from the last 8 blocks of the NAND, ie. page 130944 and page
> 131008 in my setup.

The driver is not searching for a BBT because it's explicitly disabled
in your pdata (if it was enabled we would see something like "Bad block
table not found ..." or "Bad block table found ..." in the logs). And
that's anyway not the bug we're trying to fix here. In your setup (2k
pages with Hamming ECC), the bad block markers, i.e. the markers
present in each block and used to mark a block good or bad (0xffff =>
good, != 0xffff => bad), should be preserved. So, the symptoms we're
seeing here, where almost all blocks are reported as bad when scanning
BBMs, is not expected, and that's what we're trying to debug/fix.

> 
> Therefore, I would rather think that marvell-nand is not using the BBT at the
> end of the nand rather than misconfiguring the timing registers.

Timing mis-configuration was just a lead we had to follow. It seems
that it's not the problem here, but we had to test it. Now, the missing
BBT scan is clearly caused by an explicit config telling the driver to
ignore the BBT. You can try to enable it if you want to test BBT
handling (pdata->flash_bbt = 1), but even if that works, we'd like to
understand why the regular BBM scanning does not work.

Honestly, it's hard to be sure what you're testing, because we don't
know whether you're testing the branch Miquel provided or manually
apply some changes locally. Can you push your local changes somewhere
(if any)?

> 
> Cheers.
> 
> --
> Robert
> 
> PS: You really should expunge the mailing recipients a bit ...

Indeed!

> 
> [1] DMesg extract
> netconsole: port not set
> netconsole: registered as netconsole-1
> smc91c111 smc91c1110: chip is revision= 9, version= 2
> mdio_bus: miibus0: probed
> eth0: got preset MAC address: 00:0e:0c:a7:26:f7
> nand: NAND device: Manufacturer ID: 0x20, Chip ID: 0xba (ST Micro NAND 256MiB 1,8V 16-bit), 256MiB, page size: 2048, OOB size: 64
> mrvl_nand mrvl_nand0: ECC strength 1, ECC step size 512
> Bad block table found at page 131008, version 0x04
> Bad block table found at page 130944, version 0x04
> malloc space: 0x83700000 -> 0x83efffff (size 8 MiB)
> running /env/bin/init...
> magicvar: No such file or directory
> magicvar: No such file or directory
> magicvar: No such file or directory
> 
> Hit any key to stop autoboot:  3 2 1 0
> booting net
> netconsole: netconsole initialized with 255.255.255.255:6662
> eth0: 100Mbps full duplex link detected
> DHCP client bound to address 192.168.1.232
> netconsole: netconsole initialized with 255.255.255.255:6662
> could not open /mnt/tftp/none-linux-zylonite: No such file or directory
> Booting net failed: No such file or directory
> booting net failed: No such file or directory
> boot: No such file or directory
> .[1;32mbarebox at .[1;36mZylonite:/.[0m global linux.bootargs.debug=earlycon
> .[1;32mbarebox at .[1;36mZylonite:/.[0m bootm /mnt/tftp/zImage_jenkins
> 
> Loading ARM Linux zImage '/mnt/tftp/zImage_jenkins'
> commandline: ram=64M console=ttyS0,115200 ip=dhcp root=/dev/nfs nfsroot=/home/none/nfsroot/zylonite,v3,tcp earlycon mtdparts=pxa3xx_nand-0:128k at 0(TIMH)ro,128k at 128k(OBMI)ro,768k at 256k(barebox),256k at 1024k(barebox-env),12M at 1280k(kernel),38016k at 13568k(root)
> arch_number: 1233
> Uncompressing Linux... done, booting the kernel.
> [    0.000000] Booting Linux on physical CPU 0x0
> [    0.000000] Linux version 4.15.0-rc1-00047-g3085f79 (jenkins at belgarath) (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) #889 PREEMPT Fri Jan 12 08:26:17 CET 2018
> [    0.000000] CPU: XScale-V3 based processor [69056891] revision 1 (ARMv5TE), cr=0000397f
> [    0.000000] CPU: VIVT data cache, VIVT instruction cache
> [    0.000000] Machine: PXA3xx Platform Development Kit (aka Zylonite)
> [    0.000000] Ignoring tag cmdline (using the default kernel command line)
> [    0.000000] Memory policy: Data cache writeback
> [    0.000000] RO Mode clock: 0.00MHz
> [    0.000000] Run Mode clock: 0.00MHz
> [    0.000000] Turbo Mode clock: 0.00MHz
> [    0.000000] System bus clock: 0.00MHz
> [    0.000000] On node 0 totalpages: 16384
> [    0.000000]   Normal zone: 128 pages used for memmap
> [    0.000000]   Normal zone: 0 pages reserved
> [    0.000000]   Normal zone: 16384 pages, LIFO batch:3
> [    0.000000] random: fast init done
> [    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
> [    0.000000] pcpu-alloc: [0] 0 
> [    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 16256
> [    0.000000] Kernel command line: root=/dev/ram0 ip=192.168.1.232:192.168.1.5::255.255.255.0::eth0:on console=ttyS0,115200 mem=64M mtdparts=pxa3xx_nand-0:128k at 0(TIMH)ro,128k at 128k(OBMI)ro,768k at 256k(barebox),256k at 1024k(barebox-env),12M at 1280k(kernel),38016k at 13568k(root) ubi.mtd=5 earlycon=pxa,io,0xf6200000,115200n8 debug no_console_suspend
> [    0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
> [    0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
> [    0.000000] Memory: 56856K/65536K available (4226K kernel code, 202K rwdata, 972K rodata, 2396K init, 102K bss, 8680K reserved, 0K cma-reserved)
> [    0.000000] Virtual kernel memory layout:
> [    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
> [    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
> [    0.000000]     vmalloc : 0xc4800000 - 0xff800000   ( 944 MB)
> [    0.000000]     lowmem  : 0xc0000000 - 0xc4000000   (  64 MB)
> [    0.000000]     modules : 0xbf000000 - 0xc0000000   (  16 MB)
> [    0.000000]       .text : 0xc0008000 - 0xc0428a48   (4227 kB)
> [    0.000000]       .init : 0xc053f000 - 0xc0796000   (2396 kB)
> [    0.000000]       .data : 0xc0796000 - 0xc07c8bec   ( 203 kB)
> [    0.000000]        .bss : 0xc07c8bec - 0xc07e25fc   ( 103 kB)
> [    0.000000] Preemptible hierarchical RCU implementation.
> [    0.000000] 	Tasks RCU enabled.
> [    0.000000] NR_IRQS: 16, nr_irqs: 336, preallocated irqs: 336
> [    0.000000] RJK: parent_rate=13000000, xl=8, xn=1
> [    0.000070] sched_clock: 32 bits at 3250kHz, resolution 307ns, wraps every 660764198758ns
> [    0.000266] clocksource: oscr0: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 588080137591 ns
> [    0.002134] Console: colour dummy device 80x30
> [    0.002294] Calibrating delay loop... 103.83 BogoMIPS (lpj=519168)
> [    0.081019] pid_max: default: 32768 minimum: 301
> [    0.081862] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
> [    0.081960] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
> [    0.085156] CPU: Testing write buffer coherency: ok
> [    0.088957] Setting up static identity map for 0x80008200 - 0x80008260
> [    0.089916] Hierarchical SRCU implementation.
> [    0.102924] devtmpfs: initialized
> [    0.113807] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
> [    0.113948] futex hash table entries: 256 (order: -1, 3072 bytes)
> [    0.116278] NET: Registered protocol family 16
> [    0.119090] DMA: preallocated 256 KiB pool for atomic coherent allocations
> [    0.389530] Advanced Linux Sound Architecture Driver Initialized.
> [    0.400350] clocksource: Switched to clocksource oscr0
> [    0.553012] NET: Registered protocol family 2
> [    0.558410] TCP established hash table entries: 1024 (order: 0, 4096 bytes)
> [    0.558634] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
> [    0.558815] TCP: Hash tables configured (established 1024 bind 1024)
> [    0.559367] UDP hash table entries: 256 (order: 0, 4096 bytes)
> [    0.559547] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
> [    0.561234] NET: Registered protocol family 1
> [    0.563263] RPC: Registered named UNIX socket transport module.
> [    0.563363] RPC: Registered udp transport module.
> [    0.563418] RPC: Registered tcp transport module.
> [    0.563475] RPC: Registered tcp NFSv4.1 backchannel transport module.
> [    2.498791] Initialise system trusted keyrings
> [    2.501003] workingset: timestamp_bits=30 max_order=14 bucket_order=0
> [    2.504911] NFS: Registering the id_resolver key type
> [    2.505141] Key type id_resolver registered
> [    2.505204] Key type id_legacy registered
> [    2.511301] Key type asymmetric registered
> [    2.511404] Asymmetric key parser 'x509' registered
> [    2.511567] io scheduler noop registered
> [    2.511632] io scheduler deadline registered
> [    2.512023] io scheduler cfq registered (default)
> [    2.512092] io scheduler mq-deadline registered
> [    2.512155] io scheduler kyber registered
> [    2.569944] pxa-dma pxa-dma.0: initialized 32 channels on 100 requestors
> [    2.575695] pxa2xx-uart.0: ttyS0 at MMIO 0x40100000 (irq = 38, base_baud = 928571) is a UART1
> [    3.050762] console [ttyS0] enabled
> [    3.057118] pxa2xx-uart.1: ttyS1 at MMIO 0x40200000 (irq = 37, base_baud = 928571) is a UART2
> [    3.069632] pxa2xx-uart.2: ttyS2 at MMIO 0x40700000 (irq = 36, base_baud = 928571) is a UART3
> [    3.085539] Timing registers from Bootloader:
> [    3.089971] -  NDTR0: 0x00161c1c
> [    3.095979] -  NDTR1: 0x0f3c00a2
> [    3.099319] nand: executing subop:
> [    3.103209] nand:     ->CMD      [0xff]
> [    3.107105] nand:     ->WAITRDY  [max 250 ms]
> [    3.111915] marvell-nfc pxa3xx-nand: 
> [    3.111915] NDCR:  0x90071fff
> [    3.111915] NDCB0: 0x00a000ff
> [    3.111915] NDCB1: 0x00000000
> [    3.111915] NDCB2: 0x00000000
> [    3.111915] NDCB3: 0x00000000
> [    3.131170] nand: executing subop:
> [    3.134638] nand:     ->CMD      [0x90]
> [    3.138513] nand:     ->ADDR     [1 cyc: 00]
> [    3.143174] nand:     ->DATA_IN  [2 B, force 8-bit]
> [    3.148182] marvell-nfc pxa3xx-nand: 
> [    3.148182] NDCR:  0x90071fff
> [    3.148182] NDCB0: 0x00610090
> [    3.148182] NDCB1: 0x00000000
> [    3.148182] NDCB2: 0x00000000
> [    3.148182] NDCB3: 0x00000000
> [    3.167016] nand: executing subop:
> [    3.170656] nand:     ->CMD      [0x90]
> [    3.174543] nand:     ->ADDR     [1 cyc: 00]
> [    3.178842] nand:     ->DATA_IN  [8 B, force 8-bit]
> [    3.183955] marvell-nfc pxa3xx-nand: 
> [    3.183955] NDCR:  0x90071fff
> [    3.183955] NDCB0: 0x00610090
> [    3.183955] NDCB1: 0x00000000
> [    3.183955] NDCB2: 0x00000000
> [    3.183955] NDCB3: 0x00000000
> [    3.202627] nand: executing subop:
> [    3.206083] nand:     ->CMD      [0x90]
> [    3.209958] nand:     ->ADDR     [1 cyc: 20]
> [    3.214403] nand:     ->DATA_IN  [4 B, force 8-bit]
> [    3.219383] marvell-nfc pxa3xx-nand: 
> [    3.219383] NDCR:  0x90071fff
> [    3.219383] NDCB0: 0x00610090
> [    3.219383] NDCB1: 0x00000020
> [    3.219383] NDCB2: 0x00000000
> [    3.219383] NDCB3: 0x00000000
> [    3.238001] nand: executing subop:
> [    3.241598] nand:     ->CMD      [0x90]
> [    3.245491] nand:     ->ADDR     [1 cyc: 40]
> [    3.249790] nand:     ->DATA_IN  [5 B, force 8-bit]
> [    3.254897] marvell-nfc pxa3xx-nand: 
> [    3.254897] NDCR:  0x90071fff
> [    3.254897] NDCB0: 0x00610090
> [    3.254897] NDCB1: 0x00000040
> [    3.254897] NDCB2: 0x00000000
> [    3.254897] NDCB3: 0x00000000
> [    3.273547] nand: device found, Manufacturer ID: 0x20, Chip ID: 0xba
> [    3.279923] nand: ST Micro NAND 256MiB 1,8V 16-bit
> [    3.284893] nand: 256 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64
> [    3.292633] marvell-nfc pxa3xx-nand: No minimum ECC strength, using 1b/512B
> [    3.299666] Scanning device for bad blocks
> [    3.303978] nand: nand_do_read_oob: from = 0x00000000, len = 64
> [    3.310000] marvell-nfc pxa3xx-nand: 
> [    3.310000] NDCR:  0x9d079fff
> [    3.310000] NDCB0: 0x000d3000
> [    3.310000] NDCB1: 0x00000000
> [    3.310000] NDCB2: 0x00000000
> [    3.310000] NDCB3: 0x00000000
> [    3.329036] OOB from page 0:
> [    3.332122] 00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> [    3.342950] 01: 00 00 00 00 00 00 00 00 d4 eb 0b f5 fa 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> [    3.353817] Bad eraseblock 0 at 0x000000000000
> [    3.358338] nand: nand_do_read_oob: from = 0x00020000, len = 64
> [    3.364494] marvell-nfc pxa3xx-nand: 
> [    3.364494] NDCR:  0x9d079fff
> [    3.364494] NDCB0: 0x000d3000
> [    3.364494] NDCB1: 0x00400000
> [    3.364494] NDCB2: 0x00000000
> [    3.364494] NDCB3: 0x00000000
> [    3.383344] OOB from page 64:
> [    3.386353] 00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
> [    3.397213] 01: ff ff ff ff ff ff ff ff dc 1e ef 48 38 04 e6 95 40 86 da 0f b6 fd 95 6d 7f 05 2d cf fd 61 d9 05 
> [    3.408131] nand: nand_do_read_oob: from = 0x00040000, len = 64
> [    3.414298] marvell-nfc pxa3xx-nand: 
> [    3.414298] NDCR:  0x9d079fff
> [    3.414298] NDCB0: 0x000d3000
> [    3.414298] NDCB1: 0x00800000
> [    3.414298] NDCB2: 0x00000000
> [    3.414298] NDCB3: 0x00000000
> [    3.433140] OOB from page 128:
> [    3.436237] 00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> [    3.447080] 01: 00 00 00 00 00 00 00 00 48 5b 01 d2 56 00 a2 ec 23 82 51 02 ef af 9d ae 3e 02 34 82 6c d8 75 0e 

All bytes set to 0. Looks like someone explicitly wrote 0 in the OOB
area :-/. Do you know which component wrote this block (barebox or
Linux)?

> [    3.457961] Bad eraseblock 2 at 0x000000040000
> [    3.462604] nand: nand_do_read_oob: from = 0x00060000, len = 64
> [    3.468627] marvell-nfc pxa3xx-nand: 
> [    3.468627] NDCR:  0x9d079fff
> [    3.468627] NDCB0: 0x000d3000
> [    3.468627] NDCB1: 0x00c00000
> [    3.468627] NDCB2: 0x00000000
> [    3.468627] NDCB3: 0x00000000
> [    3.487466] OOB from page 192:
> [    3.490706] 00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> [    3.501537] 01: 00 00 00 00 00 00 00 00 a7 23 9c bc 5d 02 5e 55 3b fd 7f 04 ed 35 c0 d1 a7 0a c3 94 09 cf 9a 0d 
> [    3.512409] Bad eraseblock 3 at 0x000000060000




More information about the linux-mtd mailing list