16e58e2d8SMauro Carvalho Chehab================= 21ef39108SHuang ShijieSPI NOR framework 36e58e2d8SMauro Carvalho Chehab================= 41ef39108SHuang Shijie 5bb1f9e39STudor AmbarusHow to propose a new flash addition 6bb1f9e39STudor Ambarus----------------------------------- 7bb1f9e39STudor Ambarus 8bb1f9e39STudor AmbarusMost SPI NOR flashes comply with the JEDEC JESD216 9bb1f9e39STudor AmbarusSerial Flash Discoverable Parameter (SFDP) standard. SFDP describes 10bb1f9e39STudor Ambarusthe functional and feature capabilities of serial flash devices in a 11bb1f9e39STudor Ambarusstandard set of internal read-only parameter tables. 12bb1f9e39STudor Ambarus 13bb1f9e39STudor AmbarusThe SPI NOR driver queries the SFDP tables in order to determine the 14bb1f9e39STudor Ambarusflash's parameters and settings. If the flash defines the SFDP tables 15bb1f9e39STudor Ambarusit's likely that you won't need a flash entry at all, and instead 16bb1f9e39STudor Ambarusrely on the generic flash driver which probes the flash solely based 17bb1f9e39STudor Ambaruson its SFDP data. All one has to do is to specify the "jedec,spi-nor" 18bb1f9e39STudor Ambaruscompatible in the device tree. 19bb1f9e39STudor Ambarus 20bb1f9e39STudor AmbarusThere are cases however where you need to define an explicit flash 21bb1f9e39STudor Ambarusentry. This typically happens when the flash has settings or support 22bb1f9e39STudor Ambarusthat is not covered by the SFDP tables (e.g. Block Protection), or 23bb1f9e39STudor Ambaruswhen the flash contains mangled SFDP data. If the later, one needs 24bb1f9e39STudor Ambarusto implement the ``spi_nor_fixups`` hooks in order to amend the SFDP 25bb1f9e39STudor Ambarusparameters with the correct values. 26bb1f9e39STudor Ambarus 27bb1f9e39STudor AmbarusMinimum testing requirements 28bb1f9e39STudor Ambarus----------------------------- 29bb1f9e39STudor Ambarus 30bb1f9e39STudor AmbarusDo all the tests from below and paste them in the commit's comments 31bb1f9e39STudor Ambarussection, after the ``---`` marker. 32bb1f9e39STudor Ambarus 33bb1f9e39STudor Ambarus1) Specify the controller that you used to test the flash and specify 34bb1f9e39STudor Ambarus the frequency at which the flash was operated, e.g.:: 35bb1f9e39STudor Ambarus 36bb1f9e39STudor Ambarus This flash is populated on the X board and was tested at Y 37bb1f9e39STudor Ambarus frequency using the Z (put compatible) SPI controller. 38bb1f9e39STudor Ambarus 39bb1f9e39STudor Ambarus2) Dump the sysfs entries and print the md5/sha1/sha256 SFDP checksum:: 40bb1f9e39STudor Ambarus 41bb1f9e39STudor Ambarus root@1:~# cat /sys/bus/spi/devices/spi0.0/spi-nor/partname 42bb1f9e39STudor Ambarus sst26vf064b 43bb1f9e39STudor Ambarus root@1:~# cat /sys/bus/spi/devices/spi0.0/spi-nor/jedec_id 44bb1f9e39STudor Ambarus bf2643 45bb1f9e39STudor Ambarus root@1:~# cat /sys/bus/spi/devices/spi0.0/spi-nor/manufacturer 46bb1f9e39STudor Ambarus sst 47bb1f9e39STudor Ambarus root@1:~# xxd -p /sys/bus/spi/devices/spi0.0/spi-nor/sfdp 48bb1f9e39STudor Ambarus 53464450060102ff00060110300000ff81000106000100ffbf0001180002 49bb1f9e39STudor Ambarus 0001fffffffffffffffffffffffffffffffffd20f1ffffffff0344eb086b 50bb1f9e39STudor Ambarus 083b80bbfeffffffffff00ffffff440b0c200dd80fd810d820914824806f 51bb1f9e39STudor Ambarus 1d81ed0f773830b030b0f7ffffff29c25cfff030c080ffffffffffffffff 52bb1f9e39STudor Ambarus ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 53bb1f9e39STudor Ambarus ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 54bb1f9e39STudor Ambarus ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 55bb1f9e39STudor Ambarus ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 56bb1f9e39STudor Ambarus ffffffffffffffffffffffffffffffffff0004fff37f0000f57f0000f9ff 57bb1f9e39STudor Ambarus 7d00f57f0000f37f0000ffffffffffffffffffffffffffffffffffffffff 58bb1f9e39STudor Ambarus ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 59bb1f9e39STudor Ambarus ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 60bb1f9e39STudor Ambarus ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 61bb1f9e39STudor Ambarus ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 62bb1f9e39STudor Ambarus ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 63bb1f9e39STudor Ambarus ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 64bb1f9e39STudor Ambarus ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 65bb1f9e39STudor Ambarus ffffbf2643ffb95ffdff30f260f332ff0a122346ff0f19320f1919ffffff 66bb1f9e39STudor Ambarus ffffffff00669938ff05013506040232b03072428de89888a585c09faf5a 67bb1f9e39STudor Ambarus ffff06ec060c0003080bffffffffff07ffff0202ff060300fdfd040700fc 68bb1f9e39STudor Ambarus 0300fefe0202070e 69bb1f9e39STudor Ambarus root@1:~# sha256sum /sys/bus/spi/devices/spi0.0/spi-nor/sfdp 70bb1f9e39STudor Ambarus 428f34d0461876f189ac97f93e68a05fa6428c6650b3b7baf736a921e5898ed1 /sys/bus/spi/devices/spi0.0/spi-nor/sfdp 71bb1f9e39STudor Ambarus 72bb1f9e39STudor Ambarus Please dump the SFDP tables using ``xxd -p``. It enables us to do 73bb1f9e39STudor Ambarus the reverse operation and convert the hexdump to binary with 74bb1f9e39STudor Ambarus ``xxd -rp``. Dumping the SFDP data with ``hexdump -Cv`` is accepted, 75bb1f9e39STudor Ambarus but less desirable. 76bb1f9e39STudor Ambarus 77bb1f9e39STudor Ambarus3) Dump debugfs data:: 78bb1f9e39STudor Ambarus 79bb1f9e39STudor Ambarus root@1:~# cat /sys/kernel/debug/spi-nor/spi0.0/capabilities 80bb1f9e39STudor Ambarus Supported read modes by the flash 81bb1f9e39STudor Ambarus 1S-1S-1S 82bb1f9e39STudor Ambarus opcode 0x03 83bb1f9e39STudor Ambarus mode cycles 0 84bb1f9e39STudor Ambarus dummy cycles 0 85bb1f9e39STudor Ambarus 1S-1S-1S (fast read) 86bb1f9e39STudor Ambarus opcode 0x0b 87bb1f9e39STudor Ambarus mode cycles 0 88bb1f9e39STudor Ambarus dummy cycles 8 89bb1f9e39STudor Ambarus 1S-1S-2S 90bb1f9e39STudor Ambarus opcode 0x3b 91bb1f9e39STudor Ambarus mode cycles 0 92bb1f9e39STudor Ambarus dummy cycles 8 93bb1f9e39STudor Ambarus 1S-2S-2S 94bb1f9e39STudor Ambarus opcode 0xbb 95bb1f9e39STudor Ambarus mode cycles 4 96bb1f9e39STudor Ambarus dummy cycles 0 97bb1f9e39STudor Ambarus 1S-1S-4S 98bb1f9e39STudor Ambarus opcode 0x6b 99bb1f9e39STudor Ambarus mode cycles 0 100bb1f9e39STudor Ambarus dummy cycles 8 101bb1f9e39STudor Ambarus 1S-4S-4S 102bb1f9e39STudor Ambarus opcode 0xeb 103bb1f9e39STudor Ambarus mode cycles 2 104bb1f9e39STudor Ambarus dummy cycles 4 105bb1f9e39STudor Ambarus 4S-4S-4S 106bb1f9e39STudor Ambarus opcode 0x0b 107bb1f9e39STudor Ambarus mode cycles 2 108bb1f9e39STudor Ambarus dummy cycles 4 109bb1f9e39STudor Ambarus 110bb1f9e39STudor Ambarus Supported page program modes by the flash 111bb1f9e39STudor Ambarus 1S-1S-1S 112bb1f9e39STudor Ambarus opcode 0x02 113bb1f9e39STudor Ambarus 114bb1f9e39STudor Ambarus root@1:~# cat /sys/kernel/debug/spi-nor/spi0.0/params 115bb1f9e39STudor Ambarus name sst26vf064b 116bb1f9e39STudor Ambarus id bf 26 43 bf 26 43 117bb1f9e39STudor Ambarus size 8.00 MiB 118bb1f9e39STudor Ambarus write size 1 119bb1f9e39STudor Ambarus page size 256 120bb1f9e39STudor Ambarus address nbytes 3 121bb1f9e39STudor Ambarus flags HAS_LOCK | HAS_16BIT_SR | SOFT_RESET | SWP_IS_VOLATILE 122bb1f9e39STudor Ambarus 123bb1f9e39STudor Ambarus opcodes 124bb1f9e39STudor Ambarus read 0xeb 125bb1f9e39STudor Ambarus dummy cycles 6 126bb1f9e39STudor Ambarus erase 0x20 127bb1f9e39STudor Ambarus program 0x02 128bb1f9e39STudor Ambarus 8D extension none 129bb1f9e39STudor Ambarus 130bb1f9e39STudor Ambarus protocols 131bb1f9e39STudor Ambarus read 1S-4S-4S 132bb1f9e39STudor Ambarus write 1S-1S-1S 133bb1f9e39STudor Ambarus register 1S-1S-1S 134bb1f9e39STudor Ambarus 135bb1f9e39STudor Ambarus erase commands 136bb1f9e39STudor Ambarus 20 (4.00 KiB) [0] 137bb1f9e39STudor Ambarus d8 (8.00 KiB) [1] 138bb1f9e39STudor Ambarus d8 (32.0 KiB) [2] 139bb1f9e39STudor Ambarus d8 (64.0 KiB) [3] 140bb1f9e39STudor Ambarus c7 (8.00 MiB) 141bb1f9e39STudor Ambarus 142bb1f9e39STudor Ambarus sector map 143bb1f9e39STudor Ambarus region (in hex) | erase mask | flags 144bb1f9e39STudor Ambarus ------------------+------------+---------- 145bb1f9e39STudor Ambarus 00000000-00007fff | [01 ] | 146bb1f9e39STudor Ambarus 00008000-0000ffff | [0 2 ] | 147bb1f9e39STudor Ambarus 00010000-007effff | [0 3] | 148bb1f9e39STudor Ambarus 007f0000-007f7fff | [0 2 ] | 149bb1f9e39STudor Ambarus 007f8000-007fffff | [01 ] | 150bb1f9e39STudor Ambarus 151bb1f9e39STudor Ambarus4) Use `mtd-utils <https://git.infradead.org/mtd-utils.git>`__ 152bb1f9e39STudor Ambarus and verify that erase, read and page program operations work fine:: 153bb1f9e39STudor Ambarus 154bb1f9e39STudor Ambarus root@1:~# dd if=/dev/urandom of=./spi_test bs=1M count=2 155bb1f9e39STudor Ambarus 2+0 records in 156bb1f9e39STudor Ambarus 2+0 records out 157bb1f9e39STudor Ambarus 2097152 bytes (2.1 MB, 2.0 MiB) copied, 0.848566 s, 2.5 MB/s 158bb1f9e39STudor Ambarus 159bb1f9e39STudor Ambarus root@1:~# mtd_debug erase /dev/mtd0 0 2097152 160bb1f9e39STudor Ambarus Erased 2097152 bytes from address 0x00000000 in flash 161bb1f9e39STudor Ambarus 162bb1f9e39STudor Ambarus root@1:~# mtd_debug read /dev/mtd0 0 2097152 spi_read 163bb1f9e39STudor Ambarus Copied 2097152 bytes from address 0x00000000 in flash to spi_read 164bb1f9e39STudor Ambarus 165bb1f9e39STudor Ambarus root@1:~# hexdump spi_read 166bb1f9e39STudor Ambarus 0000000 ffff ffff ffff ffff ffff ffff ffff ffff 167bb1f9e39STudor Ambarus * 168bb1f9e39STudor Ambarus 0200000 169bb1f9e39STudor Ambarus 170bb1f9e39STudor Ambarus root@1:~# sha256sum spi_read 171bb1f9e39STudor Ambarus 4bda3a28f4ffe603c0ec1258c0034d65a1a0d35ab7bd523a834608adabf03cc5 spi_read 172bb1f9e39STudor Ambarus 173bb1f9e39STudor Ambarus root@1:~# mtd_debug write /dev/mtd0 0 2097152 spi_test 174bb1f9e39STudor Ambarus Copied 2097152 bytes from spi_test to address 0x00000000 in flash 175bb1f9e39STudor Ambarus 176bb1f9e39STudor Ambarus root@1:~# mtd_debug read /dev/mtd0 0 2097152 spi_read 177bb1f9e39STudor Ambarus Copied 2097152 bytes from address 0x00000000 in flash to spi_read 178bb1f9e39STudor Ambarus 179bb1f9e39STudor Ambarus root@1:~# sha256sum spi* 180bb1f9e39STudor Ambarus c444216a6ba2a4a66cccd60a0dd062bce4b865dd52b200ef5e21838c4b899ac8 spi_read 181bb1f9e39STudor Ambarus c444216a6ba2a4a66cccd60a0dd062bce4b865dd52b200ef5e21838c4b899ac8 spi_test 182bb1f9e39STudor Ambarus 183bb1f9e39STudor Ambarus If the flash comes erased by default and the previous erase was ignored, 184bb1f9e39STudor Ambarus we won't catch it, thus test the erase again:: 185bb1f9e39STudor Ambarus 186bb1f9e39STudor Ambarus root@1:~# mtd_debug erase /dev/mtd0 0 2097152 187bb1f9e39STudor Ambarus Erased 2097152 bytes from address 0x00000000 in flash 188bb1f9e39STudor Ambarus 189bb1f9e39STudor Ambarus root@1:~# mtd_debug read /dev/mtd0 0 2097152 spi_read 190bb1f9e39STudor Ambarus Copied 2097152 bytes from address 0x00000000 in flash to spi_read 191bb1f9e39STudor Ambarus 192bb1f9e39STudor Ambarus root@1:~# sha256sum spi* 193bb1f9e39STudor Ambarus 4bda3a28f4ffe603c0ec1258c0034d65a1a0d35ab7bd523a834608adabf03cc5 spi_read 194bb1f9e39STudor Ambarus c444216a6ba2a4a66cccd60a0dd062bce4b865dd52b200ef5e21838c4b899ac8 spi_test 195bb1f9e39STudor Ambarus 196bb1f9e39STudor Ambarus Dump some other relevant data:: 197bb1f9e39STudor Ambarus 198bb1f9e39STudor Ambarus root@1:~# mtd_debug info /dev/mtd0 199bb1f9e39STudor Ambarus mtd.type = MTD_NORFLASH 200bb1f9e39STudor Ambarus mtd.flags = MTD_CAP_NORFLASH 201bb1f9e39STudor Ambarus mtd.size = 8388608 (8M) 202bb1f9e39STudor Ambarus mtd.erasesize = 4096 (4K) 203bb1f9e39STudor Ambarus mtd.writesize = 1 204bb1f9e39STudor Ambarus mtd.oobsize = 0 205bb1f9e39STudor Ambarus regions = 0 206