xref: /linux/Documentation/driver-api/mtd/spi-nor.rst (revision a23e1966932464e1c5226cb9ac4ce1d5fc10ba22)
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