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