comparison doc/Loadtool-flash-support @ 517:809829dbc58a

new flash support documented
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 01 Jun 2019 06:46:46 +0000
parents
children
comparison
equal deleted inserted replaced
516:8bdbae4c0e53 517:809829dbc58a
1 fc-loadtool is our tool for reading and writing the non-volatile flash memory
2 on all of our supported target devices, and the set of targets which it needs
3 to support keeps growing. Here are some of the challenges we have to deal with:
4
5 * Some Calypso board designs use AMD-style flash, others use Intel-style flash.
6 Initially we only supported AMD-style flash chips that were used in our first
7 targets (Openmoko GTA02 and Pirelli DP-L10), then we got other targets that
8 have Intel-style flash. So far we have not yet run into a case where both
9 kinds of flash can be encountered on the same target family, but our current
10 design supports this possibility.
11
12 * All Calypso devices which we currently support have flash chips with non-
13 uniform sector geometries, i.e., the area that would otherwise be the first
14 or the last sector is subdivided into smaller sectors (erase units). Both
15 "top boot" (small sectors at high addresses) and "bottom boot" (small sectors
16 at low addresses) geometries are found among our targets, as well as flashes
17 that have small sectors at both ends. The exact sector geometry needs to be
18 known to the flash manipulation tool in order to perform correct flash erase
19 and program operations.
20
21 * While most Calypso devices have a single flash chip providing a single bank
22 of flash (can be as small as 2 MiB or as big as 8 MiB), some of our targets
23 (our own FCDEV3B and the Pirelli DP-L10 phone from which the idea was copied)
24 provide two flash chip select banks of 8 MiB each. To make the matters even
25 more complicated, all of that flash is actually a single 16 MiB chip that has
26 two chip selects instead of one, specifically designed for processors like
27 our Calypso that can only address a maximum of 8 MiB per chip select.
28
29 * It is a fixed target property whether a given board is wired for only one
30 flash chip select or allows the possibility of dual-bank flash, and if a
31 second flash chip select is provided for, which Calypso chip select it is
32 wired to.
33
34 Given the existence of the CFI (Common Flash Interface) standard and the fact
35 that every flash chip we have encountered so far in a Calypso device does have
36 a readable CFI structure, one may naively think that the most sensible way to
37 support all of our possible flash configurations would be to read and parse the
38 CFI structure in a device-agnostic way (i.e., without special cases for specific
39 chip types) and thus support "everything". But here are the problems with this
40 simplistic approach:
41
42 * On boards that have 16 MiB of flash in a Spansion S71PL129J or S71PL129N chip,
43 it makes the most sense for us to treat this big flash as two separate banks
44 of 8 MiB each - but the CFI structure describes a single 16 MiB flash chip.
45
46 * AMD-style flashes with "top boot" geometries are among our repertoire of
47 devices to be supported, and they have their regions listed in the wrong order
48 in the CFI structure - one needs to look in the AMD-specific part outside of
49 the vendor-neutral geometry structure to see the true "top boot" geometry.
50
51 * Intel-style flashes with independent read/write partitions such that each
52 partition has its own status register and its own "read array" vs. "read SR"
53 state require special handling in our architecture, but autoconfiguring this
54 quirk agnostically from CFI seems too difficult to me, and I wouldn't trust
55 it.
56
57 Our previous architectural attempts
58 ===================================
59
60 Initially we only supported two flash chip types, Samsung K5A32xx_T (Openmoko
61 GTA02) and Spansion S71PL129N (Pirelli DP-L10) with strictly manual selection:
62 -h gta02 selected one and -h pirelli selected the other via hardware parameter
63 files. There was an ID check to prevent bogosity from wrong manual selection,
64 but no autodetection or autoconfiguration. Then we added Compal target support;
65 aside from Mot C155/156 which has partition quirks that were only discovered
66 much later, these phones have simple Intel-style flashes without any of the CFI
67 problems listed above, thus they were handled via CFI. Thus we had a hybrid
68 architecture: Openmoko, Pirelli and FCDEV3B targets were handled by way of
69 manual selection and ID checks to catch errors, whereas Compal targets were
70 handled by way of CFI-based autodetection and autoconfiguration.
71
72 Then it was discovered that the 8 MiB Intel-style flash on the D-Sample board
73 and on Mot C155/156 has partition quirks which our CFI-based autoconfiguration
74 (looking at vendor-agnostic geometry bits only) could not take care of, and the
75 solution was to move these targets from CFI-based autoconfiguration to the same
76 kind of fixed device selection and configuration as was used for AMD flashes.
77 At that point our flash handling architecture became a mess, and when I started
78 questioning how to extend it further as the need arises to support more
79 different flash chip types on a wide variety of Calypso targets, it became
80 clear that a redesign was needed.
81
82 Our current architecture
83 ========================
84
85 In our current architecture the only flash configuration that is indicated
86 statically in the hardware parameter files (selected with the -h option,
87 practically meaning predefined target configurations) is board wiring
88 information. There are 3 possibilities that can be configured:
89
90 flash single-4M base_addr -- wired for 1 bank of up to 4 MiB
91 flash single-8M base_addr -- wired for 1 bank of up to 8 MiB
92 flash dual-8M bank0_base bank1_base -- wired for 2 banks of up to 8 MiB each
93
94 Naturally the dual-8M configuration only makes sense for boards that are wired
95 with a provision for a second flash bank, in which case the second bank base
96 address will depend on the board wiring, i.e., which Calypso chip select it is.
97 (Bank 0 base address will normally be 0x03000000, i.e., the alternate nCS0
98 mapping that needs to be used when the boot ROM is mapped at 0.) The choice
99 between single-4M and single-8M needs to match whether or not the associated
100 init script includes a "w16 fffef006 0008" command to enable ADD22.
101
102 Beyond this board wiring configuration, the rest of flash support is based on a
103 hard-coded table of all supported devices (a table that can grow indefinitely)
104 plus autodetection amongst this supported set. In other words, fc-loadtool will
105 only operate on a given flash chip if it explicitly knows about that chip, but
106 the set of supported chips can be indefinitely extended without hitting
107 architectural barriers, and our autodetection logic will detect and handle any
108 supported chip on any board target.
109
110 Autodetection details
111 =====================
112
113 The flash chip autodetection operation proceeds as follows:
114
115 * A sequence of writes is done to put the chip into the Read ID mode,
116 equivalent to the following hypothetical C code with base_addr being an
117 integer:
118
119 *(volatile uint16_t *)(base_addr + 0xAAA) = 0xAA;
120 *(volatile uint16_t *)(base_addr + 0x554) = 0x55;
121 *(volatile uint16_t *)(base_addr + 0xAAA) = 0x90;
122
123 * 16-bit words at base_addr offsets of 0 and 2 (where the manufacturer and
124 device ID codes are expected to reside) are read, and this ID is looked up in
125 a table. If the ID code is not known, we give up and don't allow any flash
126 operations.
127
128 * For most ID codes, if we have found the code in our table, we know what device
129 we should expect. But before we go ahead and assume that the command set and
130 the geometry are as we think based on the ID code, we also do a CFI check.
131 Specifically, we put the flash chip into CFI query mode, read a defined set
132 of word locations (can be different for each chip type), and require these
133 words to match our compiled-in table. Thus we guard against the possibility
134 of some other flash chip having the same ID code (yes, there are known
135 instances of ID code reuse) but having a different geometry.
136
137 * Some ID codes receive more complex handling. Right now the only such case is
138 Spansion PL-J/PL-N flash. PL129J and PL129N flashes have different geometries
139 and thus must be distinguished, but they have exactly the same ID codes and
140 can only be distinguished by CFI. We have CFI match tables for PL129J and
141 for PL129N; we try to match the CFI bits provided by the chip against one
142 table first, and if it fails to match, we try the other. (As an optimization,
143 we try the PL129N table first, as the N flash is the one found in real-world
144 Pirelli DP-L10 specimen and used on our FCDEV3B.) If the CFI matches neither
145 table, we give up and don't allow any flash operations.
146
147 The end effect of this logic is that we err on the side of caution: we only
148 allow flash erase and program operations if we detect a flash chip which is
149 fully known to us and fully matches our expectations, with both the ID codes
150 and the CFI structure being as we expect.
151
152 Adding support for new flash chip types
153 =======================================
154
155 All supported flash devices are listed in the fldevs.c source module; new
156 devices that differ in geometry, command set or quirks need to be added there.
157 The description of each flash device in fldevs.c also includes the CFI table
158 that needs to matched to confirm the device in question. A different module
159 named flashid.c contains the autodetection function and the table of device ID
160 codes; the latter table always needs to be extended, sometimes adding an
161 entirely new device, othertimes adding a newly found ID code for some flash
162 chip that is fully equivalent to an already supported one in terms of geometry,
163 command set and relevant quirks.
164
165 What do you do if you are an end user (not a FreeCalypso developer) and you got
166 a Calypso device whose flash chip is not being recognized by fc-loadtool?
167 Answer: you send the output of the "flash id" command (contains ID codes) and a
168 dump of the CFI structure to Mother Mychaela for analysis. To make a dump of
169 the CFI structure, execute the following commands:
170
171 loadtool> w16 030000aa 98
172 loadtool> dump2bin 03000000 200 cfidump.bin
173
174 Handling of dual-bank 16 MiB flash chips
175 ========================================
176
177 The Calypso can only address a maximum of 8 MiB per chip select, thus 16 MiB or
178 larger flash chips with a single chip select cannot be used in Calypso board
179 designs. However, there are some special 16 MiB flash chips that present
180 themselves as two banks of 8 MiB each (even though the CFI structure describes
181 a single 16 MiB chip), and such flash chips are used on the Pirelli DP-L10 and
182 on our own FCDEV3B.
183
184 The flash handling architecture of fc-loadtool allows two banks to be configured
185 via a flash dual-8M setting in the hardware parameter file, and when that
186 configuration is used (-h fcfam and -h pirelli), the two banks are treated as
187 being entirely independent. All regular flash commands operate only on the main
188 bank, and a parallel set of flash2 commands operates on the secondary bank.
189 The autodetection logic and the resulting configuration are done independently
190 on each flash bank when it is first accessed, thus fc-loadtool would happily
191 handle two separate flash chips of different types, even though such arrangement
192 is not expected to occur in any Calypso device. But when a PL129J or PL129N
193 device is detected (the two dual-bank devices we currently support) on the
194 autodetection probe of either bank, the operating geometry is configured
195 appropriately based on which bank it is.
196
197 Primary flash bank mapping at 0x03000000
198 ========================================
199
200 When loadagent runs on the Calypso target controlled by fc-loadtool, the Calypso
201 boot ROM will usually be mapped at 0, thus the alternate nCS0 mapping at
202 0x03000000 needs to be used for flash access. However, the Calypso chip (all
203 versions we work with) has a little design bug in this part of the silicon:
204 this alternate nCS0 mapping at 0x03000000 works only when the debug visibility
205 bit in the API-RHEA control register (bit 6 in the FFFF:FB0E register) is set,
206 and does not work otherwise. This bit is initially set as the Calypso comes
207 out of reset, and on most platforms we gain loadtool access via the boot ROM,
208 hence the problem does not occur - but on Compal targets we gain loadtool
209 access either through Compal's bootloader or via tfc139, and in both cases
210 Compal's fw (either the full fw or the bootloader part) has already set the
211 register in question to the runtime operational value of 0x2A (unchanged from
212 TI's TCS211 reference fw), with the debug visibility bit cleared, hence the
213 0x03000000 flash mapping no longer works.
214
215 There are two possible solutions: we can write into the FFFF:FB10 register to
216 disable the boot ROM and use the "regular" flash mapping at 0, which is what we
217 used to do, or we can write into the FFFF:FB0E register and re-enable the debug
218 visibility mode. Right now we do the latter, allowing us to use the same
219 0x03000000 flash mapping on all targets for consistency.