1/*
2 * flash.h: Common definitions for flash access.
3 *
4 * Copyright (C) 2015, 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.
17 *
18 * $Id: flash.h 281527 2011-09-02 17:12:53Z $
19 */
20
21/* FILE-CSTYLED Cannot figure out how to make the initialization continuation lines acceptable */
22
23/* Types of flashes we know about */
24typedef enum _flash_type {OLD, BSC, SCS, AMD, SST, SFLASH} flash_type_t;
25
26/* Commands to write/erase the flases */
27typedef 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;
41
42#define	UNLOCK_CMD_WORDS	2	/* 2 words per command */
43
44typedef struct _unlock_cmd {
45	uint		addr[UNLOCK_CMD_WORDS];
46	uint16	cmd[UNLOCK_CMD_WORDS];
47} unlock_cmd_t;
48
49/* Flash descriptors */
50typedef 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;
64
65
66#ifdef	DECLARE_FLASHES
67flash_cmds_t sflash_cmd_t =
68	{ SFLASH, 0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
69
70#ifdef NFLASH_SUPPORT
71flash_cmds_t nflash_cmd_t =
72	{ NFLASH, 0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
73#endif /* NFLASH_SUPPORT */
74
75flash_cmds_t flash_cmds[] = {
76/*	  type	needu	preera	eraseb	erasech	write	wbuf	clcsr	rdcsr	rdid
77 *	  confrm	read
78 */
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 }
88};
89
90unlock_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}
101};
102
103unlock_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}
114};
115
116#define AMD_CMD	0xaaa
117#define SST_CMD 0xaaaa
118
119/* intel unlock block cmds */
120#define INTEL_UNLOCK1	0x60
121#define INTEL_UNLOCK2	0xD0
122
123/* Just eight blocks of 8KB byte each */
124
125uint blk8x8k[] = {
126	0x00000000,
127	0x00002000,
128	0x00004000,
129	0x00006000,
130	0x00008000,
131	0x0000a000,
132	0x0000c000,
133	0x0000e000,
134	0x00010000
135};
136
137/* Funky AMD arrangement for 29xx800's */
138uint 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
148};
149
150/* AMD arrangement for 29xx160's */
151uint amd4112[] = {
152	0x00000000,		/* 32KB */
153	0x00008000,		/* 8KB */
154	0x0000a000,		/* 8KB */
155	0x0000c000,		/* 16KB */
156	0x00010000
157};
158
159uint amd2114[] = {
160	0x00000000,		/* 16KB */
161	0x00004000,		/* 8KB */
162	0x00006000,		/* 8KB */
163	0x00008000,		/* 32KB */
164	0x00010000
165};
166
167
168flash_desc_t sflash_desc =
169	{ 0, 0, 0, 0, SFLASH, 0, 0, 0, 0, 0, NULL, "SFLASH" };
170
171#ifdef NFLASH_SUPPORT
172flash_desc_t nflash_desc =
173	{ 0, 0, 0, 0, NFLASH, 0, 0, 0, 0, 0, NULL, "NFLASH" };
174#endif /* NFLASH_SUPPORT */
175
176flash_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 },
291};
292
293#else	/* !DECLARE_FLASHES */
294
295extern flash_cmds_t flash_cmds[];
296extern unlock_cmd_t unlock_cmd;
297extern flash_desc_t flashes[];
298
299#endif	/* DECLARE_FLASHES */
300