Resync with broadcom drivers 5.100.138.20 and utilities.
[tomato.git] / release / src-rt / include / flash.h
blobd42fa9e1e8044a79188999c4cadeff208cff2e96
1 /*
2 * flash.h: Common definitions for flash access.
4 * Copyright (C) 2010, Broadcom Corporation. All Rights Reserved.
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
13 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
15 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
16 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 * $Id: flash.h,v 13.25.110.1 2010-10-13 04:00:31 Exp $
21 /* FILE-CSTYLED Cannot figure out how to make the initialization continuation lines acceptable */
23 /* Types of flashes we know about */
24 typedef enum _flash_type {OLD, BSC, SCS, AMD, SST, SFLASH} flash_type_t;
26 /* Commands to write/erase the flases */
27 typedef struct _flash_cmds{
28 flash_type_t type;
29 bool need_unlock;
30 uint16 pre_erase;
31 uint16 erase_block;
32 uint16 erase_chip;
33 uint16 write_word;
34 uint16 write_buf;
35 uint16 clear_csr;
36 uint16 read_csr;
37 uint16 read_id;
38 uint16 confirm;
39 uint16 read_array;
40 } flash_cmds_t;
42 #define UNLOCK_CMD_WORDS 2 /* 2 words per command */
44 typedef struct _unlock_cmd {
45 uint addr[UNLOCK_CMD_WORDS];
46 uint16 cmd[UNLOCK_CMD_WORDS];
47 } unlock_cmd_t;
49 /* Flash descriptors */
50 typedef struct _flash_desc {
51 uint16 mfgid; /* Manufacturer Id */
52 uint16 devid; /* Device Id */
53 uint size; /* Total size in bytes */
54 uint width; /* Device width in bytes */
55 flash_type_t type; /* Device type old, S, J */
56 uint bsize; /* Block size */
57 uint nb; /* Number of blocks */
58 uint ff; /* First full block */
59 uint lf; /* Last full block */
60 uint nsub; /* Number of subblocks */
61 uint *subblocks; /* Offsets for subblocks */
62 char *desc; /* Description */
63 } flash_desc_t;
66 #ifdef DECLARE_FLASHES
67 flash_cmds_t sflash_cmd_t =
68 { SFLASH, 0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
70 #ifdef NFLASH_SUPPORT
71 flash_cmds_t nflash_cmd_t =
72 { NFLASH, 0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
73 #endif /* NFLASH_SUPPORT */
75 flash_cmds_t flash_cmds[] = {
76 /* type needu preera eraseb erasech write wbuf clcsr rdcsr rdid
77 * confrm read
79 { BSC, 0, 0x00, 0x20, 0x00, 0x40, 0x00, 0x50, 0x70, 0x90,
80 0xd0, 0xff },
81 { SCS, 0, 0x00, 0x20, 0x00, 0x40, 0xe8, 0x50, 0x70, 0x90,
82 0xd0, 0xff },
83 { AMD, 1, 0x80, 0x30, 0x10, 0xa0, 0x00, 0x00, 0x00, 0x90,
84 0x00, 0xf0 },
85 { SST, 1, 0x80, 0x50, 0x10, 0xa0, 0x00, 0x00, 0x00, 0x90,
86 0x00, 0xf0 },
87 { 0 }
90 unlock_cmd_t unlock_cmd_amd = {
91 #ifdef MIPSEB
92 #ifdef BCMHND74K
93 /* addr: */ { 0x0aac, 0x0552},
94 #else /* !74K, bcm33xx */
95 /* addr: */ { 0x0aa8, 0x0556},
96 #endif /* BCMHND74K */
97 #else
98 /* addr: */ { 0x0aaa, 0x0554},
99 #endif
100 /* data: */ { 0xaa, 0x55}
103 unlock_cmd_t unlock_cmd_sst = {
104 #ifdef MIPSEB
105 #ifdef BCMHND74K
106 /* addr: */ { 0xaaac, 0x5552},
107 #else /* !74K, bcm33xx */
108 /* addr: */ { 0xaaa8, 0x5556},
109 #endif /* BCMHND74K */
110 #else
111 /* addr: */ { 0xaaaa, 0x5554},
112 #endif
113 /* data: */ { 0xaa, 0x55}
116 #define AMD_CMD 0xaaa
117 #define SST_CMD 0xaaaa
119 /* intel unlock block cmds */
120 #define INTEL_UNLOCK1 0x60
121 #define INTEL_UNLOCK2 0xD0
123 /* Just eight blocks of 8KB byte each */
125 uint blk8x8k[] = {
126 0x00000000,
127 0x00002000,
128 0x00004000,
129 0x00006000,
130 0x00008000,
131 0x0000a000,
132 0x0000c000,
133 0x0000e000,
134 0x00010000
137 /* Funky AMD arrangement for 29xx800's */
138 uint amd800[] = {
139 0x00000000, /* 16KB */
140 0x00004000, /* 32KB */
141 0x0000c000, /* 8KB */
142 0x0000e000, /* 8KB */
143 0x00010000, /* 8KB */
144 0x00012000, /* 8KB */
145 0x00014000, /* 32KB */
146 0x0001c000, /* 16KB */
147 0x00020000
150 /* AMD arrangement for 29xx160's */
151 uint amd4112[] = {
152 0x00000000, /* 32KB */
153 0x00008000, /* 8KB */
154 0x0000a000, /* 8KB */
155 0x0000c000, /* 16KB */
156 0x00010000
159 uint amd2114[] = {
160 0x00000000, /* 16KB */
161 0x00004000, /* 8KB */
162 0x00006000, /* 8KB */
163 0x00008000, /* 32KB */
164 0x00010000
168 flash_desc_t sflash_desc =
169 { 0, 0, 0, 0, SFLASH, 0, 0, 0, 0, 0, NULL, "SFLASH" };
171 #ifdef NFLASH_SUPPORT
172 flash_desc_t nflash_desc =
173 { 0, 0, 0, 0, NFLASH, 0, 0, 0, 0, 0, NULL, "NFLASH" };
174 #endif /* NFLASH_SUPPORT */
176 flash_desc_t flashes[] = {
177 { 0x00b0, 0x00d0, 0x0200000, 2, SCS, 0x10000, 32, 0, 31, 0, NULL,
178 "Intel 28F160S3/5 1Mx16" },
179 { 0x00b0, 0x00d4, 0x0400000, 2, SCS, 0x10000, 64, 0, 63, 0, NULL,
180 "Intel 28F320S3/5 2Mx16" },
181 { 0x0089, 0x8890, 0x0200000, 2, BSC, 0x10000, 32, 0, 30, 8, blk8x8k,
182 "Intel 28F160B3 1Mx16 TopB" },
183 { 0x0089, 0x8891, 0x0200000, 2, BSC, 0x10000, 32, 1, 31, 8, blk8x8k,
184 "Intel 28F160B3 1Mx16 BotB" },
185 { 0x0089, 0x8896, 0x0400000, 2, BSC, 0x10000, 64, 0, 62, 8, blk8x8k,
186 "Intel 28F320B3 2Mx16 TopB" },
187 { 0x0089, 0x8897, 0x0400000, 2, BSC, 0x10000, 64, 1, 63, 8, blk8x8k,
188 "Intel 28F320B3 2Mx16 BotB" },
189 { 0x0089, 0x8898, 0x0800000, 2, BSC, 0x10000, 128, 0, 126, 8, blk8x8k,
190 "Intel 28F640B3 4Mx16 TopB" },
191 { 0x0089, 0x8899, 0x0800000, 2, BSC, 0x10000, 128, 1, 127, 8, blk8x8k,
192 "Intel 28F640B3 4Mx16 BotB" },
193 { 0x0089, 0x88C2, 0x0200000, 2, BSC, 0x10000, 32, 0, 30, 8, blk8x8k,
194 "Intel 28F160C3 1Mx16 TopB" },
195 { 0x0089, 0x88C3, 0x0200000, 2, BSC, 0x10000, 32, 1, 31, 8, blk8x8k,
196 "Intel 28F160C3 1Mx16 BotB" },
197 { 0x0089, 0x88C4, 0x0400000, 2, BSC, 0x10000, 64, 0, 62, 8, blk8x8k,
198 "Intel 28F320C3 2Mx16 TopB" },
199 { 0x0089, 0x88C5, 0x0400000, 2, BSC, 0x10000, 64, 1, 63, 8, blk8x8k,
200 "Intel 28F320C3 2Mx16 BotB" },
201 { 0x0089, 0x88CC, 0x0800000, 2, BSC, 0x10000, 128, 0, 126, 8, blk8x8k,
202 "Intel 28F640C3 4Mx16 TopB" },
203 { 0x0089, 0x88CD, 0x0800000, 2, BSC, 0x10000, 128, 1, 127, 8, blk8x8k,
204 "Intel 28F640C3 4Mx16 BotB" },
205 { 0x0089, 0x0014, 0x0400000, 2, SCS, 0x20000, 32, 0, 31, 0, NULL,
206 "Intel 28F320J5 2Mx16" },
207 { 0x0089, 0x0015, 0x0800000, 2, SCS, 0x20000, 64, 0, 63, 0, NULL,
208 "Intel 28F640J5 4Mx16" },
209 { 0x0089, 0x0016, 0x0400000, 2, SCS, 0x20000, 32, 0, 31, 0, NULL,
210 "Intel 28F320J3 2Mx16" },
211 { 0x0089, 0x0017, 0x0800000, 2, SCS, 0x20000, 64, 0, 63, 0, NULL,
212 "Intel 28F640J3 4Mx16" },
213 { 0x0089, 0x0018, 0x1000000, 2, SCS, 0x20000, 128, 0, 127, 0, NULL,
214 "Intel 28F128J3 8Mx16" },
215 { 0x00b0, 0x00e3, 0x0400000, 2, BSC, 0x10000, 64, 1, 63, 8, blk8x8k,
216 "Sharp 28F320BJE 2Mx16 BotB" },
217 { 0x0001, 0x224a, 0x0100000, 2, AMD, 0x10000, 16, 0, 13, 8, amd800,
218 "AMD 29DL800BT 512Kx16 TopB" },
219 { 0x0001, 0x22cb, 0x0100000, 2, AMD, 0x10000, 16, 2, 15, 8, amd800,
220 "AMD 29DL800BB 512Kx16 BotB" },
221 { 0x0001, 0x22c4, 0x0200000, 2, AMD, 0x10000, 32, 0, 30, 4, amd4112,
222 "AMD 29W160ET 1Mx16 TopB" },
223 { 0x0001, 0x2249, 0x0200000, 2, AMD, 0x10000, 32, 1, 31, 4, amd2114,
224 "AMD 29lv160DB 1Mx16 BotB" },
225 { 0x0001, 0x22f6, 0x0400000, 2, AMD, 0x10000, 64, 0, 62, 8, blk8x8k,
226 "AMD 29LV320DT 2Mx16 TopB" },
227 { 0x0001, 0x22f9, 0x0400000, 2, AMD, 0x10000, 64, 1, 63, 8, blk8x8k,
228 "AMD 29lv320DB 2Mx16 BotB" },
229 { 0x0001, 0x00f9, 0x0400000, 2, AMD, 0x10000, 64, 1, 63, 8, blk8x8k,
230 "AMD 29lv320DB 2Mx16 BotB in BYTE mode" },
231 { 0x0001, 0x0201, 0x0800000, 2, AMD, 0x10000, 128, 1, 126, 8, blk8x8k,
232 "AMD 29DL640D 4Mx16" },
233 { 0x0001, 0x1200, 0x01000000, 2, AMD, 0x10000, 256, 0, 255, 0, NULL,
234 "AMD 29LV128MH/L 8Mx16" },
235 { 0x0001, 0x1301, 0x0800000, 2, AMD, 0x10000, 128, 0, 127, 0, NULL,
236 "AMD 29LV641MT 4Mx16" },
237 { 0x0001, 0x1a01, 0x0400000, 2, AMD, 0x10000, 64, 0, 62, 8, blk8x8k,
238 "AMD 29lv320MT 2Mx16 TopB" },
239 { 0x0001, 0x1a00, 0x0400000, 2, AMD, 0x10000, 64, 1, 63, 8, blk8x8k,
240 "AMD 29lv320MB 2Mx16 BotB" },
241 { 0x0001, 0x1001, 0x0800000, 2, AMD, 0x10000, 128, 0, 126, 8, blk8x8k,
242 "Spansion S29GL064A-R3 4Mx16 TopB" },
243 { 0x0001, 0x1000, 0x0800000, 2, AMD, 0x10000, 128, 1, 127, 8, blk8x8k,
244 "Spansion S29GL064A-R4 4Mx16 BotB" },
245 { 0x0001, 0x0c01, 0x0800000, 2, AMD, 0x10000, 128, 0, 127, 0, NULL,
246 "Spansion S29GL640A 8Mx16" },
247 { 0x0001, 0x2201, 0x2000000, 2, AMD, 0x20000, 256, 0, 255, 0, NULL,
248 "Spansion S29GL256P 16Mx16" },
249 { 0x0020, 0x22CA, 0x0400000, 2, AMD, 0x10000, 64, 0, 62, 4, amd4112,
250 "ST 29w320DT 2Mx16 TopB" },
251 { 0x0020, 0x22CB, 0x0400000, 2, AMD, 0x10000, 64, 1, 63, 4, amd2114,
252 "ST 29w320DB 2Mx16 BotB" },
253 { 0x0020, 0x22c4, 0x0200000, 2, AMD, 0x10000, 32, 0, 30, 4, amd4112,
254 "ST 29w160ET 1Mx16 TopB" },
255 { 0x0020, 0x2249, 0x0200000, 2, AMD, 0x10000, 32, 1, 31, 4, amd2114,
256 "ST 29w160ET 1Mx16 BotB" },
257 { 0x0020, 0x225d, 0x0400000, 2, AMD, 0x10000, 64, 1, 63, 8, blk8x8k,
258 "ST M29DW324DB 2Mx16 TopB" },
259 { 0x007f, 0x22f9, 0x0400000, 2, AMD, 0x10000, 64, 1, 63, 8, blk8x8k,
260 "EON 29LV320CB 2Mx16 BotB" },
261 { 0x00C2, 0x22c4, 0x0200000, 2, AMD, 0x10000, 32, 0, 30, 4, amd4112,
262 "MX 29LV160CT 1Mx16 TopB" },
263 { 0x00C2, 0x2249, 0x0200000, 2, AMD, 0x10000, 32, 1, 31, 4, amd2114,
264 "MX 29LV160CB 1Mx16 BotB" },
265 { 0x00C2, 0x22a8, 0x0400000, 2, AMD, 0x10000, 64, 1, 63, 8, blk8x8k,
266 "MX 29LV320CB 2Mx16 BotB" },
267 { 0x00C2, 0x00A7, 0x0400000, 2, AMD, 0x10000, 64, 0, 62, 4, amd4112,
268 "MX29LV320T 2Mx16 TopB" },
269 { 0x00C2, 0x00A8, 0x0400000, 2, AMD, 0x10000, 64, 1, 63, 4, amd2114,
270 "MX29LV320B 2Mx16 BotB" },
271 { 0x0004, 0x22F6, 0x0400000, 2, AMD, 0x10000, 64, 0, 62, 4, amd4112,
272 "MBM29LV320TE 2Mx16 TopB" },
273 { 0x0004, 0x22F9, 0x0400000, 2, AMD, 0x10000, 64, 1, 63, 4, amd2114,
274 "MBM29LV320BE 2Mx16 BotB" },
275 { 0x0098, 0x009A, 0x0400000, 2, AMD, 0x10000, 64, 0, 62, 4, amd4112,
276 "TC58FVT321 2Mx16 TopB" },
277 { 0x0098, 0x009C, 0x0400000, 2, AMD, 0x10000, 64, 1, 63, 4, amd2114,
278 "TC58FVB321 2Mx16 BotB" },
279 { 0x00C2, 0x22A7, 0x0400000, 2, AMD, 0x10000, 64, 0, 62, 4, amd4112,
280 "MX29LV320T 2Mx16 TopB" },
281 { 0x00C2, 0x22A8, 0x0400000, 2, AMD, 0x10000, 64, 1, 63, 4, amd2114,
282 "MX29LV320B 2Mx16 BotB" },
283 { 0x00BF, 0x2783, 0x0400000, 2, SST, 0x10000, 64, 0, 63, 0, NULL,
284 "SST39VF320 2Mx16" },
285 { 0x00ec, 0x22e2, 0x0800000, 2, AMD, 0x10000, 128, 1, 127, 8, blk8x8k,
286 "Samsung K8D631UB 4Mx16 BotB" },
287 { 0xddda, 0x0a00, 0x0400000, 2, AMD, 0x10000, 64, 1, 63, 8, blk8x8k,
288 "Samsung K8D631UB 4Mx16 BotB" },
289 { 0, 0, 0, 0, OLD, 0, 0, 0, 0, 0, NULL,
290 NULL },
293 #else /* !DECLARE_FLASHES */
295 extern flash_cmds_t flash_cmds[];
296 extern unlock_cmd_t unlock_cmd;
297 extern flash_desc_t flashes[];
299 #endif /* DECLARE_FLASHES */