[PATCH v2 2/2] spi: spi-qpic-snand: add support for 8 bits ECC strength
Gabor Juhos
j4g8y7 at gmail.com
Wed Jul 2 05:35:24 PDT 2025
Even though the hardware supports 8 bits ECC strength, but that is not
handled in the driver yet. This change adds the missing bits in order
to allow using the driver with chips which require 8 bits ECC strength.
No functional changes intended with regard to the existing 4 bits ECC
strength support.
Tested on an IPQ9574 platform using a GigaDevice GD5F2GM7REYIG chip.
Signed-off-by: Gabor Juhos <j4g8y7 at gmail.com>
---
Changes in v2:
- rebase on tip of spi/for-6.17
- rerun the tests and update the results
MTD layout:
# cat /proc/mtd
dev: size erasesize name
mtd0: 00080000 00020000 "0:training"
mtd1: 00040000 00020000 "0:license"
mtd2: 03c00000 00020000 "rootfs"
mtd3: 03c00000 00020000 "rootfs_1"
mtd4: 00740000 00020000 "spare"
Test results with 8 bits ECC strength:
# dmesg | grep nand
[ 0.576213] spi-nand spi0.0: GigaDevice SPI NAND was found.
[ 0.583974] spi-nand spi0.0: 256 MiB, block size: 128 KiB, page size: 2048, OOB size: 128
# insmod mtd_test
# insmod mtd_nandbiterrs dev=4
[ 36.455886]
[ 36.455916] ==================================================
[ 36.456443] mtd_nandbiterrs: MTD device: 4
[ 36.462086] mtd_nandbiterrs: MTD device size 7602176, eraseblock=131072, page=2048, oob=128
[ 36.466210] mtd_nandbiterrs: Device uses 1 subpages of 2048 bytes
[ 36.474436] mtd_nandbiterrs: Using page=0, offset=0, eraseblock=0
[ 36.484205] mtd_nandbiterrs: incremental biterrors test
[ 36.486784] mtd_nandbiterrs: write_page
[ 36.492664] mtd_nandbiterrs: rewrite page
[ 36.496416] mtd_nandbiterrs: read_page
[ 36.500284] mtd_nandbiterrs: verify_page
[ 36.503503] mtd_nandbiterrs: Successfully corrected 0 bit errors per subpage
[ 36.507485] mtd_nandbiterrs: Inserted biterror @ 0/5
[ 36.514623] mtd_nandbiterrs: rewrite page
[ 36.520228] mtd_nandbiterrs: read_page
[ 36.523950] qcom_snand 79b0000.spi: Warning: due to hw limitation, the reported number of the corrected bits may be inaccurate
[ 36.527025] mtd_nandbiterrs: Read reported 1 corrected bit errors
[ 36.538412] mtd_nandbiterrs: verify_page
[ 36.544636] mtd_nandbiterrs: Successfully corrected 1 bit errors per subpage
[ 36.548544] mtd_nandbiterrs: Inserted biterror @ 0/2
[ 36.555622] mtd_nandbiterrs: rewrite page
[ 36.561285] mtd_nandbiterrs: read_page
[ 36.564987] mtd_nandbiterrs: Read reported 1 corrected bit errors
[ 36.568075] mtd_nandbiterrs: verify_page
[ 36.574331] mtd_nandbiterrs: Successfully corrected 2 bit errors per subpage
[ 36.578232] mtd_nandbiterrs: Inserted biterror @ 0/0
[ 36.585276] mtd_nandbiterrs: rewrite page
[ 36.591013] mtd_nandbiterrs: read_page
[ 36.594691] mtd_nandbiterrs: Read reported 1 corrected bit errors
[ 36.597763] mtd_nandbiterrs: verify_page
[ 36.604006] mtd_nandbiterrs: Successfully corrected 3 bit errors per subpage
[ 36.607919] mtd_nandbiterrs: Inserted biterror @ 1/7
[ 36.614985] mtd_nandbiterrs: rewrite page
[ 36.620661] mtd_nandbiterrs: read_page
[ 36.624361] mtd_nandbiterrs: Read reported 2 corrected bit errors
[ 36.627449] mtd_nandbiterrs: verify_page
[ 36.633714] mtd_nandbiterrs: Successfully corrected 4 bit errors per subpage
[ 36.637607] mtd_nandbiterrs: Inserted biterror @ 1/5
[ 36.644657] mtd_nandbiterrs: rewrite page
[ 36.650401] mtd_nandbiterrs: read_page
[ 36.654044] mtd_nandbiterrs: Read reported 2 corrected bit errors
[ 36.657137] mtd_nandbiterrs: verify_page
[ 36.663351] mtd_nandbiterrs: Successfully corrected 5 bit errors per subpage
[ 36.667320] mtd_nandbiterrs: Inserted biterror @ 1/2
[ 36.674338] mtd_nandbiterrs: rewrite page
[ 36.680030] mtd_nandbiterrs: read_page
[ 36.683710] mtd_nandbiterrs: Read reported 2 corrected bit errors
[ 36.686825] mtd_nandbiterrs: verify_page
[ 36.693038] mtd_nandbiterrs: Successfully corrected 6 bit errors per subpage
[ 36.697001] mtd_nandbiterrs: Inserted biterror @ 1/0
[ 36.704031] mtd_nandbiterrs: rewrite page
[ 36.709722] mtd_nandbiterrs: read_page
[ 36.713418] mtd_nandbiterrs: Read reported 2 corrected bit errors
[ 36.716513] mtd_nandbiterrs: verify_page
[ 36.722726] mtd_nandbiterrs: Successfully corrected 7 bit errors per subpage
[ 36.726686] mtd_nandbiterrs: Inserted biterror @ 2/6
[ 36.733713] mtd_nandbiterrs: rewrite page
[ 36.739452] mtd_nandbiterrs: read_page
[ 36.743080] mtd_nandbiterrs: Read reported 3 corrected bit errors
[ 36.746224] mtd_nandbiterrs: verify_page
[ 36.752415] mtd_nandbiterrs: Successfully corrected 8 bit errors per subpage
[ 36.756371] mtd_nandbiterrs: Inserted biterror @ 2/5
[ 36.763399] mtd_nandbiterrs: rewrite page
[ 36.769140] mtd_nandbiterrs: read_page
[ 36.772765] mtd_nandbiterrs: error: read failed at 0x0
[ 36.775909] mtd_nandbiterrs: After 9 biterrors per subpage, read reported error -74
[ 36.784522] mtd_nandbiterrs: finished successfully.
[ 36.788559] ==================================================
failed to insert /lib/modules/6.16.0-rc3+/mtd_nandbiterrs.ko
# insmod mtd_speedtest dev=4
[ 40.402192]
[ 40.402222] =================================================
[ 40.402758] mtd_speedtest: MTD device: 4
[ 40.408436] mtd_speedtest: MTD device size 7602176, eraseblock size 131072, page size 2048, count of eraseblocks 58, pages per eraseblock 64, OOB size 128
[ 40.413978] mtd_test: scanning for bad eraseblocks
[ 40.426071] mtd_test: scanned 58 eraseblocks, 0 are bad
[ 40.634251] mtd_speedtest: testing eraseblock write speed
[ 43.925499] mtd_speedtest: eraseblock write speed is 2255 KiB/s
[ 43.925538] mtd_speedtest: testing eraseblock read speed
[ 45.902933] mtd_speedtest: eraseblock read speed is 3763 KiB/s
[ 46.105615] mtd_speedtest: testing page write speed
[ 49.405379] mtd_speedtest: page write speed is 2249 KiB/s
[ 49.405416] mtd_speedtest: testing page read speed
[ 51.395199] mtd_speedtest: page read speed is 3739 KiB/s
[ 51.598001] mtd_speedtest: testing 2 page write speed
[ 54.895222] mtd_speedtest: 2 page write speed is 2251 KiB/s
[ 54.895259] mtd_speedtest: testing 2 page read speed
[ 56.878989] mtd_speedtest: 2 page read speed is 3750 KiB/s
[ 56.879025] mtd_speedtest: Testing erase speed
[ 57.086146] mtd_speedtest: erase speed is 36616 KiB/s
[ 57.086169] mtd_speedtest: Testing 2x multi-block erase speed
[ 57.292758] mtd_speedtest: 2x multi-block erase speed is 36645 KiB/s
[ 57.292784] mtd_speedtest: Testing 4x multi-block erase speed
[ 57.500906] mtd_speedtest: 4x multi-block erase speed is 36624 KiB/s
[ 57.500931] mtd_speedtest: Testing 8x multi-block erase speed
[ 57.709020] mtd_speedtest: 8x multi-block erase speed is 36629 KiB/s
[ 57.709045] mtd_speedtest: Testing 16x multi-block erase speed
[ 57.917105] mtd_speedtest: 16x multi-block erase speed is 36635 KiB/s
[ 57.917130] mtd_speedtest: Testing 32x multi-block erase speed
[ 58.125223] mtd_speedtest: 32x multi-block erase speed is 36624 KiB/s
[ 58.125247] mtd_speedtest: Testing 64x multi-block erase speed
[ 58.333337] mtd_speedtest: 64x multi-block erase speed is 36624 KiB/s
[ 58.333362] mtd_speedtest: finished
[ 58.338756] =================================================
# insmod mtd_readtest dev=4
[ 61.350706]
[ 61.350736] =================================================
[ 61.351262] mtd_readtest: MTD device: 4
[ 61.356945] mtd_readtest: MTD device size 7602176, eraseblock size 131072, page size 2048, count of eraseblocks 58, pages per eraseblock 64, OOB size 128
[ 61.360573] mtd_test: scanning for bad eraseblocks
[ 61.374497] mtd_test: scanned 58 eraseblocks, 0 are bad
[ 61.379127] mtd_readtest: testing page read
[ 65.572558] mtd_readtest: finished
[ 65.572606] =================================================
# insmod mtd_pagetest dev=4
[ 68.583872]
[ 68.583902] =================================================
[ 68.584427] mtd_pagetest: MTD device: 4
[ 68.590071] mtd_pagetest: MTD device size 7602176, eraseblock size 131072, page size 2048, count of eraseblocks 58, pages per eraseblock 64, OOB size 128
[ 68.593769] mtd_test: scanning for bad eraseblocks
[ 68.607647] mtd_test: scanned 58 eraseblocks, 0 are bad
[ 68.612292] mtd_pagetest: erasing whole device
[ 68.820101] mtd_pagetest: erased 58 eraseblocks
[ 68.820124] mtd_pagetest: writing whole device
[ 68.880688] mtd_pagetest: written up to eraseblock 0
[ 72.153005] mtd_pagetest: written 58 eraseblocks
[ 72.153044] mtd_pagetest: verifying all eraseblocks
[ 72.365561] mtd_pagetest: verified up to eraseblock 0
[ 84.249615] mtd_pagetest: verified 58 eraseblocks
[ 84.249651] mtd_pagetest: crosstest
[ 84.254435] mtd_pagetest: reading page at 0x0
[ 84.257127] mtd_pagetest: reading page at 0x73f800
[ 84.261639] mtd_pagetest: reading page at 0x0
[ 84.266354] mtd_pagetest: verifying pages read at 0x0 match
[ 84.270227] mtd_pagetest: crosstest ok
[ 84.275632] mtd_pagetest: erasecrosstest
[ 84.279426] mtd_pagetest: erasing block 0
[ 84.287018] mtd_pagetest: writing 1st page of block 0
[ 84.288303] mtd_pagetest: reading 1st page of block 0
[ 84.292970] mtd_pagetest: verifying 1st page of block 0
[ 84.297531] mtd_pagetest: erasing block 0
[ 84.306028] mtd_pagetest: writing 1st page of block 0
[ 84.307572] mtd_pagetest: erasing block 57
[ 84.315224] mtd_pagetest: reading 1st page of block 0
[ 84.316237] mtd_pagetest: verifying 1st page of block 0
[ 84.320834] mtd_pagetest: erasecrosstest ok
[ 84.325894] mtd_pagetest: erasetest
[ 84.330032] mtd_pagetest: erasing block 0
[ 84.337009] mtd_pagetest: writing 1st page of block 0
[ 84.338558] mtd_pagetest: erasing block 0
[ 84.346214] mtd_pagetest: reading 1st page of block 0
[ 84.347252] mtd_pagetest: verifying 1st page of block 0 is all 0xff
[ 84.351745] mtd_pagetest: erasetest ok
[ 84.357832] mtd_pagetest: finished with 0 errors
[ 84.361646] =================================================
# insmod mtd_subpagetest dev=4
[ 87.432044]
[ 87.432074] =================================================
[ 87.432608] mtd_subpagetest: MTD device: 4
[ 87.438308] mtd_subpagetest: MTD device size 7602176, eraseblock size 131072, page size 2048, subpage size 2048, count of erase blocks 58, pages per eraseblock 64, OOB size 128
[ 87.442259] mtd_test: scanning for bad eraseblocks
[ 87.457859] mtd_test: scanned 58 eraseblocks, 0 are bad
[ 87.665105] mtd_subpagetest: writing whole device
[ 87.666902] mtd_subpagetest: written up to eraseblock 0
[ 87.770830] mtd_subpagetest: written 58 eraseblocks
[ 87.770852] mtd_subpagetest: verifying all eraseblocks
[ 87.775608] mtd_subpagetest: verified up to eraseblock 0
[ 87.842382] mtd_subpagetest: verified 58 eraseblocks
[ 88.044974] mtd_subpagetest: verifying all eraseblocks for 0xff
[ 88.080955] mtd_subpagetest: verified up to eraseblock 0
[ 90.150157] mtd_subpagetest: verified 58 eraseblocks
[ 90.150182] mtd_subpagetest: writing whole device
[ 90.203341] mtd_subpagetest: written up to eraseblock 0
[ 93.007260] mtd_subpagetest: written 58 eraseblocks
[ 93.007295] mtd_subpagetest: verifying all eraseblocks
[ 93.041172] mtd_subpagetest: verified up to eraseblock 0
[ 94.758938] mtd_subpagetest: verified 58 eraseblocks
[ 94.961677] mtd_subpagetest: verifying all eraseblocks for 0xff
[ 94.998014] mtd_subpagetest: verified up to eraseblock 0
[ 97.063712] mtd_subpagetest: verified 58 eraseblocks
[ 97.063736] mtd_subpagetest: finished with 0 errors
[ 97.067746] =================================================
# insmod mtd_oobtest dev=4
[ 100.081282]
[ 100.081312] =================================================
[ 100.081837] mtd_oobtest: MTD device: 4
[ 100.087544] mtd_oobtest: MTD device size 7602176, eraseblock size 131072, page size 2048, count of eraseblocks 58, pages per eraseblock 64, OOB size 128
[ 100.091149] mtd_test: scanning for bad eraseblocks
[ 100.105000] mtd_test: scanned 58 eraseblocks, 0 are bad
[ 100.109528] mtd_oobtest: test 1 of 5
[ 100.317382] mtd_oobtest: writing OOBs of whole device
[ 100.317433] mtd_oobtest: written up to eraseblock 0
[ 100.322885] mtd_oobtest: written 58 eraseblocks
[ 100.326114] mtd_oobtest: verifying all eraseblocks
[ 100.330633] mtd_oobtest: verified up to eraseblock 0
[ 100.337219] mtd_oobtest: verified 58 eraseblocks
[ 100.340584] mtd_oobtest: test 2 of 5
[ 100.547912] mtd_oobtest: writing OOBs of whole device
[ 100.547960] mtd_oobtest: written up to eraseblock 0
[ 100.553439] mtd_oobtest: written 58 eraseblocks
[ 100.556617] mtd_oobtest: verifying all eraseblocks
[ 100.561133] mtd_oobtest: verified up to eraseblock 0
[ 100.566127] mtd_oobtest: verified 58 eraseblocks
[ 100.571113] mtd_oobtest: test 3 of 5
[ 100.778322] mtd_oobtest: writing OOBs of whole device
[ 100.778371] mtd_oobtest: written up to eraseblock 0
[ 100.783871] mtd_oobtest: written 58 eraseblocks
[ 100.787027] mtd_oobtest: verifying all eraseblocks
[ 100.791573] mtd_oobtest: verified up to eraseblock 0
[ 100.798192] mtd_oobtest: verified 58 eraseblocks
[ 100.801523] mtd_oobtest: test 4 of 5
[ 101.008806] mtd_oobtest: attempting to start write past end of OOB
[ 101.008829] mtd_oobtest: an error is expected...
[ 101.013894] mtd_oobtest: error occurred as expected
[ 101.018639] mtd_oobtest: attempting to start read past end of OOB
[ 101.023242] mtd_oobtest: an error is expected...
[ 101.029506] mtd_oobtest: error occurred as expected
[ 101.034208] mtd_oobtest: attempting to write past end of device
[ 101.038779] mtd_oobtest: an error is expected...
[ 101.044698] mtd_oobtest: error occurred as expected
[ 101.049543] mtd_oobtest: attempting to read past end of device
[ 101.054158] mtd_oobtest: an error is expected...
[ 101.060046] mtd_oobtest: error occurred as expected
[ 101.068326] mtd_oobtest: attempting to write past end of device
[ 101.069422] mtd_oobtest: an error is expected...
[ 101.075348] mtd_oobtest: error: wrote past end of device
[ 101.080186] mtd_oobtest: attempting to read past end of device
[ 101.085496] mtd_oobtest: an error is expected...
[ 101.091123] mtd_oobtest: error: read past end of device
[ 101.095912] mtd_oobtest: test 5 of 5
[ 101.303479] mtd_oobtest: writing OOBs of whole device
[ 101.303501] mtd_oobtest: written up to eraseblock 0
[ 101.307497] mtd_oobtest: written up to eraseblock 0
[ 101.312239] mtd_oobtest: written 57 eraseblocks
[ 101.317070] mtd_oobtest: verifying all eraseblocks
[ 101.321559] mtd_oobtest: verified up to eraseblock 0
[ 101.326471] mtd_oobtest: verified 57 eraseblocks
[ 101.331541] mtd_oobtest: finished with 2 errors
[ 101.336170] =================================================
# insmod mtd_stresstest dev=4
[ 104.349064]
[ 104.349094] =================================================
[ 104.349621] mtd_stresstest: MTD device: 4
[ 104.355315] mtd_stresstest: MTD device size 7602176, eraseblock size 131072, page size 2048, count of eraseblocks 58, pages per eraseblock 64, OOB size 128
[ 104.362441] mtd_test: scanning for bad eraseblocks
[ 104.373017] mtd_test: scanned 58 eraseblocks, 0 are bad
[ 104.377844] mtd_stresstest: doing operations
[ 104.382952] mtd_stresstest: 0 operations done
[ 140.165792] mtd_stresstest: 1024 operations done
[ 174.351494] mtd_stresstest: 2048 operations done
[ 208.867342] mtd_stresstest: 3072 operations done
[ 244.002676] mtd_stresstest: 4096 operations done
[ 279.224074] mtd_stresstest: 5120 operations done
[ 314.134514] mtd_stresstest: 6144 operations done
[ 348.648720] mtd_stresstest: 7168 operations done
[ 384.218071] mtd_stresstest: 8192 operations done
[ 418.225256] mtd_stresstest: 9216 operations done
[ 446.919838] mtd_stresstest: finished, 10000 operations done
[ 446.919977] =================================================
Test results with forced 4 bits ECC strength:
# dmesg | grep nand
[ 1.368711] spi-nand spi0.0: GigaDevice SPI NAND was found.
[ 1.376142] spi-nand spi0.0: 256 MiB, block size: 128 KiB, page size: 2048, OOB size: 128
[ 1.396422] nand: WARNING: (null): the ECC used on your system is too weak compared to the one required by the NAND chip
# insmod mtd_test
# insmod mtd_nandbiterrs dev=4
[ 63.585216]
[ 63.585245] ==================================================
[ 63.585771] mtd_nandbiterrs: MTD device: 4
[ 63.591415] mtd_nandbiterrs: MTD device size 7602176, eraseblock=131072, page=2048, oob=128
[ 63.595531] mtd_nandbiterrs: Device uses 1 subpages of 2048 bytes
[ 63.603756] mtd_nandbiterrs: Using page=0, offset=0, eraseblock=0
[ 63.613607] mtd_nandbiterrs: incremental biterrors test
[ 63.616112] mtd_nandbiterrs: write_page
[ 63.622021] mtd_nandbiterrs: rewrite page
[ 63.625869] mtd_nandbiterrs: read_page
[ 63.629651] mtd_nandbiterrs: verify_page
[ 63.632786] mtd_nandbiterrs: Successfully corrected 0 bit errors per subpage
[ 63.636851] mtd_nandbiterrs: Inserted biterror @ 0/5
[ 63.643881] mtd_nandbiterrs: rewrite page
[ 63.649581] mtd_nandbiterrs: read_page
[ 63.653259] qcom_snand 79b0000.spi: Warning: due to hw limitation, the reported number of the corrected bits may be inaccurate
[ 63.656383] mtd_nandbiterrs: Read reported 1 corrected bit errors
[ 63.667739] mtd_nandbiterrs: verify_page
[ 63.673949] mtd_nandbiterrs: Successfully corrected 1 bit errors per subpage
[ 63.677874] mtd_nandbiterrs: Inserted biterror @ 0/2
[ 63.684916] mtd_nandbiterrs: rewrite page
[ 63.690642] mtd_nandbiterrs: read_page
[ 63.694357] mtd_nandbiterrs: Read reported 1 corrected bit errors
[ 63.697405] mtd_nandbiterrs: verify_page
[ 63.703648] mtd_nandbiterrs: Successfully corrected 2 bit errors per subpage
[ 63.707562] mtd_nandbiterrs: Inserted biterror @ 0/0
[ 63.714606] mtd_nandbiterrs: rewrite page
[ 63.720373] mtd_nandbiterrs: read_page
[ 63.724045] mtd_nandbiterrs: Read reported 1 corrected bit errors
[ 63.727091] mtd_nandbiterrs: verify_page
[ 63.733305] mtd_nandbiterrs: Successfully corrected 3 bit errors per subpage
[ 63.737287] mtd_nandbiterrs: Inserted biterror @ 1/7
[ 63.744295] mtd_nandbiterrs: rewrite page
[ 63.750016] mtd_nandbiterrs: read_page
[ 63.753696] mtd_nandbiterrs: Read reported 2 corrected bit errors
[ 63.756779] mtd_nandbiterrs: verify_page
[ 63.762994] mtd_nandbiterrs: Successfully corrected 4 bit errors per subpage
[ 63.766961] mtd_nandbiterrs: Inserted biterror @ 1/5
[ 63.773980] mtd_nandbiterrs: rewrite page
[ 63.779758] mtd_nandbiterrs: read_page
[ 63.783379] mtd_nandbiterrs: error: read failed at 0x0
[ 63.786490] mtd_nandbiterrs: After 5 biterrors per subpage, read reported error -74
[ 63.795122] mtd_nandbiterrs: finished successfully.
[ 63.799139] ==================================================
failed to insert /lib/modules/6.16.0-rc3+/mtd_nandbiterrs.ko
# insmod mtd_speedtest dev=4
[ 67.395337]
[ 67.395368] =================================================
[ 67.395893] mtd_speedtest: MTD device: 4
[ 67.401537] mtd_speedtest: MTD device size 7602176, eraseblock size 131072, page size 2048, count of eraseblocks 58, pages per eraseblock 64, OOB size 128
[ 67.407131] mtd_test: scanning for bad eraseblocks
[ 67.419202] mtd_test: scanned 58 eraseblocks, 0 are bad
[ 67.626449] mtd_speedtest: testing eraseblock write speed
[ 70.901599] mtd_speedtest: eraseblock write speed is 2266 KiB/s
[ 70.901636] mtd_speedtest: testing eraseblock read speed
[ 72.868984] mtd_speedtest: eraseblock read speed is 3782 KiB/s
[ 73.071622] mtd_speedtest: testing page write speed
[ 76.348387] mtd_speedtest: page write speed is 2265 KiB/s
[ 76.348423] mtd_speedtest: testing page read speed
[ 78.320583] mtd_speedtest: page read speed is 3772 KiB/s
[ 78.523255] mtd_speedtest: testing 2 page write speed
[ 81.797263] mtd_speedtest: 2 page write speed is 2267 KiB/s
[ 81.797298] mtd_speedtest: testing 2 page read speed
[ 83.763908] mtd_speedtest: 2 page read speed is 3783 KiB/s
[ 83.763938] mtd_speedtest: Testing erase speed
[ 83.970948] mtd_speedtest: erase speed is 36631 KiB/s
[ 83.970971] mtd_speedtest: Testing 2x multi-block erase speed
[ 84.177486] mtd_speedtest: 2x multi-block erase speed is 36662 KiB/s
[ 84.177511] mtd_speedtest: Testing 4x multi-block erase speed
[ 84.385501] mtd_speedtest: 4x multi-block erase speed is 36642 KiB/s
[ 84.385526] mtd_speedtest: Testing 8x multi-block erase speed
[ 84.593435] mtd_speedtest: 8x multi-block erase speed is 36657 KiB/s
[ 84.593459] mtd_speedtest: Testing 16x multi-block erase speed
[ 84.801368] mtd_speedtest: 16x multi-block erase speed is 36662 KiB/s
[ 84.801392] mtd_speedtest: Testing 32x multi-block erase speed
[ 85.009252] mtd_speedtest: 32x multi-block erase speed is 36671 KiB/s
[ 85.009277] mtd_speedtest: Testing 64x multi-block erase speed
[ 85.217163] mtd_speedtest: 64x multi-block erase speed is 36666 KiB/s
[ 85.217187] mtd_speedtest: finished
[ 85.222580] =================================================
# insmod mtd_readtest dev=4
[ 88.234681]
[ 88.234711] =================================================
[ 88.235237] mtd_readtest: MTD device: 4
[ 88.240881] mtd_readtest: MTD device size 7602176, eraseblock size 131072, page size 2048, count of eraseblocks 58, pages per eraseblock 64, OOB size 128
[ 88.244581] mtd_test: scanning for bad eraseblocks
[ 88.258457] mtd_test: scanned 58 eraseblocks, 0 are bad
[ 88.263101] mtd_readtest: testing page read
[ 92.383090] mtd_readtest: finished
[ 92.383133] =================================================
# insmod mtd_pagetest dev=4
[ 95.394282]
[ 95.394312] =================================================
[ 95.394838] mtd_pagetest: MTD device: 4
[ 95.400480] mtd_pagetest: MTD device size 7602176, eraseblock size 131072, page size 2048, count of eraseblocks 58, pages per eraseblock 64, OOB size 128
[ 95.404180] mtd_test: scanning for bad eraseblocks
[ 95.418057] mtd_test: scanned 58 eraseblocks, 0 are bad
[ 95.422702] mtd_pagetest: erasing whole device
[ 95.631891] mtd_pagetest: erased 58 eraseblocks
[ 95.631913] mtd_pagetest: writing whole device
[ 95.693660] mtd_pagetest: written up to eraseblock 0
[ 98.950586] mtd_pagetest: written 58 eraseblocks
[ 98.950613] mtd_pagetest: verifying all eraseblocks
[ 99.160485] mtd_pagetest: verified up to eraseblock 0
[ 110.990791] mtd_pagetest: verified 58 eraseblocks
[ 110.990827] mtd_pagetest: crosstest
[ 110.995550] mtd_pagetest: reading page at 0x0
[ 110.998293] mtd_pagetest: reading page at 0x73f800
[ 111.002807] mtd_pagetest: reading page at 0x0
[ 111.007522] mtd_pagetest: verifying pages read at 0x0 match
[ 111.011403] mtd_pagetest: crosstest ok
[ 111.016808] mtd_pagetest: erasecrosstest
[ 111.020602] mtd_pagetest: erasing block 0
[ 111.028184] mtd_pagetest: writing 1st page of block 0
[ 111.029475] mtd_pagetest: reading 1st page of block 0
[ 111.034192] mtd_pagetest: verifying 1st page of block 0
[ 111.038660] mtd_pagetest: erasing block 0
[ 111.047202] mtd_pagetest: writing 1st page of block 0
[ 111.048745] mtd_pagetest: erasing block 57
[ 111.056403] mtd_pagetest: reading 1st page of block 0
[ 111.057411] mtd_pagetest: verifying 1st page of block 0
[ 111.062010] mtd_pagetest: erasecrosstest ok
[ 111.067069] mtd_pagetest: erasetest
[ 111.071208] mtd_pagetest: erasing block 0
[ 111.078182] mtd_pagetest: writing 1st page of block 0
[ 111.079731] mtd_pagetest: erasing block 0
[ 111.087390] mtd_pagetest: reading 1st page of block 0
[ 111.088420] mtd_pagetest: verifying 1st page of block 0 is all 0xff
[ 111.092920] mtd_pagetest: erasetest ok
[ 111.099010] mtd_pagetest: finished with 0 errors
[ 111.102823] =================================================
# insmod mtd_subpagetest dev=4
[ 114.153409]
[ 114.153439] =================================================
[ 114.154040] mtd_subpagetest: MTD device: 4
[ 114.159609] mtd_subpagetest: MTD device size 7602176, eraseblock size 131072, page size 2048, subpage size 2048, count of erase blocks 58, pages per eraseblock 64, OOB size 128
[ 114.163640] mtd_test: scanning for bad eraseblocks
[ 114.179227] mtd_test: scanned 58 eraseblocks, 0 are bad
[ 114.386310] mtd_subpagetest: writing whole device
[ 114.388103] mtd_subpagetest: written up to eraseblock 0
[ 114.491652] mtd_subpagetest: written 58 eraseblocks
[ 114.491674] mtd_subpagetest: verifying all eraseblocks
[ 114.496440] mtd_subpagetest: verified up to eraseblock 0
[ 114.562429] mtd_subpagetest: verified 58 eraseblocks
[ 114.765104] mtd_subpagetest: verifying all eraseblocks for 0xff
[ 114.800709] mtd_subpagetest: verified up to eraseblock 0
[ 116.847270] mtd_subpagetest: verified 58 eraseblocks
[ 116.847297] mtd_subpagetest: writing whole device
[ 116.900498] mtd_subpagetest: written up to eraseblock 0
[ 119.700656] mtd_subpagetest: written 58 eraseblocks
[ 119.700691] mtd_subpagetest: verifying all eraseblocks
[ 119.734145] mtd_subpagetest: verified up to eraseblock 0
[ 121.450922] mtd_subpagetest: verified 58 eraseblocks
[ 121.653763] mtd_subpagetest: verifying all eraseblocks for 0xff
[ 121.689374] mtd_subpagetest: verified up to eraseblock 0
[ 123.731984] mtd_subpagetest: verified 58 eraseblocks
[ 123.732019] mtd_subpagetest: finished with 0 errors
[ 123.736055] =================================================
# insmod mtd_oobtest dev=4
[ 126.749516]
[ 126.749545] =================================================
[ 126.750071] mtd_oobtest: MTD device: 4
[ 126.755780] mtd_oobtest: MTD device size 7602176, eraseblock size 131072, page size 2048, count of eraseblocks 58, pages per eraseblock 64, OOB size 128
[ 126.759382] mtd_test: scanning for bad eraseblocks
[ 126.773237] mtd_test: scanned 58 eraseblocks, 0 are bad
[ 126.777783] mtd_oobtest: test 1 of 5
[ 126.985466] mtd_oobtest: writing OOBs of whole device
[ 126.985516] mtd_oobtest: written up to eraseblock 0
[ 126.990968] mtd_oobtest: written 58 eraseblocks
[ 126.994196] mtd_oobtest: verifying all eraseblocks
[ 126.998718] mtd_oobtest: verified up to eraseblock 0
[ 127.005311] mtd_oobtest: verified 58 eraseblocks
[ 127.008669] mtd_oobtest: test 2 of 5
[ 127.216023] mtd_oobtest: writing OOBs of whole device
[ 127.216071] mtd_oobtest: written up to eraseblock 0
[ 127.221523] mtd_oobtest: written 58 eraseblocks
[ 127.224754] mtd_oobtest: verifying all eraseblocks
[ 127.229245] mtd_oobtest: verified up to eraseblock 0
[ 127.234235] mtd_oobtest: verified 58 eraseblocks
[ 127.239225] mtd_oobtest: test 3 of 5
[ 127.446528] mtd_oobtest: writing OOBs of whole device
[ 127.446576] mtd_oobtest: written up to eraseblock 0
[ 127.452046] mtd_oobtest: written 58 eraseblocks
[ 127.455258] mtd_oobtest: verifying all eraseblocks
[ 127.459779] mtd_oobtest: verified up to eraseblock 0
[ 127.466398] mtd_oobtest: verified 58 eraseblocks
[ 127.469729] mtd_oobtest: test 4 of 5
[ 127.677052] mtd_oobtest: attempting to start write past end of OOB
[ 127.677076] mtd_oobtest: an error is expected...
[ 127.682112] mtd_oobtest: error occurred as expected
[ 127.686911] mtd_oobtest: attempting to start read past end of OOB
[ 127.691489] mtd_oobtest: an error is expected...
[ 127.697753] mtd_oobtest: error occurred as expected
[ 127.702424] mtd_oobtest: attempting to write past end of device
[ 127.707038] mtd_oobtest: an error is expected...
[ 127.712928] mtd_oobtest: error occurred as expected
[ 127.717803] mtd_oobtest: attempting to read past end of device
[ 127.722391] mtd_oobtest: an error is expected...
[ 127.728304] mtd_oobtest: error occurred as expected
[ 127.736579] mtd_oobtest: attempting to write past end of device
[ 127.737669] mtd_oobtest: an error is expected...
[ 127.743593] mtd_oobtest: error: wrote past end of device
[ 127.748433] mtd_oobtest: attempting to read past end of device
[ 127.753750] mtd_oobtest: an error is expected...
[ 127.759371] mtd_oobtest: error: read past end of device
[ 127.764178] mtd_oobtest: test 5 of 5
[ 127.971793] mtd_oobtest: writing OOBs of whole device
[ 127.971818] mtd_oobtest: written up to eraseblock 0
[ 127.975844] mtd_oobtest: written up to eraseblock 0
[ 127.980557] mtd_oobtest: written 57 eraseblocks
[ 127.985376] mtd_oobtest: verifying all eraseblocks
[ 127.989876] mtd_oobtest: verified up to eraseblock 0
[ 127.994787] mtd_oobtest: verified 57 eraseblocks
[ 127.999857] mtd_oobtest: finished with 2 errors
[ 128.004487] =================================================
# insmod mtd_stresstest dev=4
[ 131.019042]
[ 131.019073] =================================================
[ 131.019598] mtd_stresstest: MTD device: 4
[ 131.025297] mtd_stresstest: MTD device size 7602176, eraseblock size 131072, page size 2048, count of eraseblocks 58, pages per eraseblock 64, OOB size 128
[ 131.032408] mtd_test: scanning for bad eraseblocks
[ 131.043029] mtd_test: scanned 58 eraseblocks, 0 are bad
[ 131.047827] mtd_stresstest: doing operations
[ 131.052930] mtd_stresstest: 0 operations done
[ 165.463575] mtd_stresstest: 1024 operations done
[ 199.990286] mtd_stresstest: 2048 operations done
[ 234.143126] mtd_stresstest: 3072 operations done
[ 268.463135] mtd_stresstest: 4096 operations done
[ 303.656634] mtd_stresstest: 5120 operations done
[ 339.128887] mtd_stresstest: 6144 operations done
[ 372.348801] mtd_stresstest: 7168 operations done
[ 407.928145] mtd_stresstest: 8192 operations done
[ 442.519136] mtd_stresstest: 9216 operations done
[ 469.876283] mtd_stresstest: finished, 10000 operations done
[ 469.876423] =================================================
---
drivers/spi/spi-qpic-snand.c | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/drivers/spi/spi-qpic-snand.c b/drivers/spi/spi-qpic-snand.c
index 7219bcaf4055aaa46ee1016ca9bc77aaeef191e4..b711c8be42c1f76029497b0c17d00cd8e52f5aa2 100644
--- a/drivers/spi/spi-qpic-snand.c
+++ b/drivers/spi/spi-qpic-snand.c
@@ -277,9 +277,22 @@ static int qcom_spi_ecc_init_ctx_pipelined(struct nand_device *nand)
goto err_free_ecc_cfg;
}
- if (ecc_cfg->strength != 4) {
+ switch (ecc_cfg->strength) {
+ case 4:
+ ecc_cfg->ecc_mode = ECC_MODE_4BIT;
+ ecc_cfg->ecc_bytes_hw = 7;
+ ecc_cfg->spare_bytes = 4;
+ break;
+
+ case 8:
+ ecc_cfg->ecc_mode = ECC_MODE_8BIT;
+ ecc_cfg->ecc_bytes_hw = 13;
+ ecc_cfg->spare_bytes = 2;
+ break;
+
+ default:
dev_err(snandc->dev,
- "only 4 bits ECC strength is supported\n");
+ "only 4 or 8 bits ECC strength is supported\n");
ret = -EOPNOTSUPP;
goto err_free_ecc_cfg;
}
@@ -296,8 +309,6 @@ static int qcom_spi_ecc_init_ctx_pipelined(struct nand_device *nand)
nand->ecc.ctx.priv = ecc_cfg;
snandc->qspi->mtd = mtd;
- ecc_cfg->ecc_bytes_hw = 7;
- ecc_cfg->spare_bytes = 4;
ecc_cfg->bbm_size = 1;
ecc_cfg->bch_enabled = true;
ecc_cfg->bytes = ecc_cfg->ecc_bytes_hw + ecc_cfg->spare_bytes + ecc_cfg->bbm_size;
@@ -343,7 +354,7 @@ static int qcom_spi_ecc_init_ctx_pipelined(struct nand_device *nand)
FIELD_PREP(ECC_SW_RESET, 0) |
FIELD_PREP(ECC_NUM_DATA_BYTES_MASK, ecc_cfg->cw_data) |
FIELD_PREP(ECC_FORCE_CLK_OPEN, 1) |
- FIELD_PREP(ECC_MODE_MASK, ECC_MODE_4BIT) |
+ FIELD_PREP(ECC_MODE_MASK, ecc_cfg->ecc_mode) |
FIELD_PREP(ECC_PARITY_SIZE_BYTES_BCH_MASK, ecc_cfg->ecc_bytes_hw);
ecc_cfg->ecc_buf_cfg = FIELD_PREP(NUM_STEPS_MASK, 0x203);
--
2.50.0
More information about the linux-mtd
mailing list