flash/nor/cfi: fix TopBottom for atmel chips
[openocd.git] / src / flash / nor / cfi.c
1 /***************************************************************************
2 * Copyright (C) 2005, 2007 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
4 * Copyright (C) 2009 Michael Schwingen *
5 * michael@schwingen.org *
6 * Copyright (C) 2010 Øyvind Harboe <oyvind.harboe@zylin.com> *
7 * Copyright (C) 2010 by Antonio Borneo <borneo.antonio@gmail.com> *
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 * This program is distributed in the hope that it will be useful, *
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
17 * GNU General Public License for more details. *
18 * *
19 * You should have received a copy of the GNU General Public License *
20 * along with this program; if not, write to the *
21 * Free Software Foundation, Inc., *
22 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
23 ***************************************************************************/
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27
28 #include "imp.h"
29 #include "cfi.h"
30 #include "non_cfi.h"
31 #include <target/arm.h>
32 #include <target/arm7_9_common.h>
33 #include <target/armv7m.h>
34 #include <target/mips32.h>
35 #include <helper/binarybuffer.h>
36 #include <target/algorithm.h>
37
38
39 #define CFI_MAX_BUS_WIDTH 4
40 #define CFI_MAX_CHIP_WIDTH 4
41
42 /* defines internal maximum size for code fragment in cfi_intel_write_block() */
43 #define CFI_MAX_INTEL_CODESIZE 256
44
45 /* some id-types with specific handling */
46 #define AT49BV6416 0x00d6
47 #define AT49BV6416T 0x00d2
48
49 static struct cfi_unlock_addresses cfi_unlock_addresses[] =
50 {
51 [CFI_UNLOCK_555_2AA] = { .unlock1 = 0x555, .unlock2 = 0x2aa },
52 [CFI_UNLOCK_5555_2AAA] = { .unlock1 = 0x5555, .unlock2 = 0x2aaa },
53 };
54
55 /* CFI fixups foward declarations */
56 static void cfi_fixup_0002_erase_regions(struct flash_bank *bank, void *param);
57 static void cfi_fixup_0002_unlock_addresses(struct flash_bank *bank, void *param);
58 static void cfi_fixup_reversed_erase_regions(struct flash_bank *bank, void *param);
59 static void cfi_fixup_0002_write_buffer(struct flash_bank *bank, void *param);
60
61 /* fixup after reading cmdset 0002 primary query table */
62 static const struct cfi_fixup cfi_0002_fixups[] = {
63 {CFI_MFR_SST, 0x00D4, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_5555_2AAA]},
64 {CFI_MFR_SST, 0x00D5, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_5555_2AAA]},
65 {CFI_MFR_SST, 0x00D6, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_5555_2AAA]},
66 {CFI_MFR_SST, 0x00D7, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_5555_2AAA]},
67 {CFI_MFR_SST, 0x2780, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_5555_2AAA]},
68 {CFI_MFR_SST, 0x236d, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_555_2AA]},
69 {CFI_MFR_ATMEL, 0x00C8, cfi_fixup_reversed_erase_regions, NULL},
70 {CFI_MFR_ST, 0x22C4, cfi_fixup_reversed_erase_regions, NULL}, /* M29W160ET */
71 {CFI_MFR_FUJITSU, 0x22ea, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_555_2AA]},
72 {CFI_MFR_FUJITSU, 0x226b, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_5555_2AAA]},
73 {CFI_MFR_AMIC, 0xb31a, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_555_2AA]},
74 {CFI_MFR_MX, 0x225b, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_555_2AA]},
75 {CFI_MFR_AMD, 0x225b, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_555_2AA]},
76 {CFI_MFR_ANY, CFI_ID_ANY, cfi_fixup_0002_erase_regions, NULL},
77 {CFI_MFR_ST, 0x227E, cfi_fixup_0002_write_buffer, NULL}, /* M29W128G */
78 {0, 0, NULL, NULL}
79 };
80
81 /* fixup after reading cmdset 0001 primary query table */
82 static const struct cfi_fixup cfi_0001_fixups[] = {
83 {0, 0, NULL, NULL}
84 };
85
86 static void cfi_fixup(struct flash_bank *bank, const struct cfi_fixup *fixups)
87 {
88 struct cfi_flash_bank *cfi_info = bank->driver_priv;
89 const struct cfi_fixup *f;
90
91 for (f = fixups; f->fixup; f++)
92 {
93 if (((f->mfr == CFI_MFR_ANY) || (f->mfr == cfi_info->manufacturer)) &&
94 ((f->id == CFI_ID_ANY) || (f->id == cfi_info->device_id)))
95 {
96 f->fixup(bank, f->param);
97 }
98 }
99 }
100
101 /* inline uint32_t flash_address(struct flash_bank *bank, int sector, uint32_t offset) */
102 static __inline__ uint32_t flash_address(struct flash_bank *bank, int sector, uint32_t offset)
103 {
104 struct cfi_flash_bank *cfi_info = bank->driver_priv;
105
106 if (cfi_info->x16_as_x8) offset *= 2;
107
108 /* while the sector list isn't built, only accesses to sector 0 work */
109 if (sector == 0)
110 return bank->base + offset * bank->bus_width;
111 else
112 {
113 if (!bank->sectors)
114 {
115 LOG_ERROR("BUG: sector list not yet built");
116 exit(-1);
117 }
118 return bank->base + bank->sectors[sector].offset + offset * bank->bus_width;
119 }
120 }
121
122 static void cfi_command(struct flash_bank *bank, uint8_t cmd, uint8_t *cmd_buf)
123 {
124 int i;
125
126 /* clear whole buffer, to ensure bits that exceed the bus_width
127 * are set to zero
128 */
129 for (i = 0; i < CFI_MAX_BUS_WIDTH; i++)
130 cmd_buf[i] = 0;
131
132 if (bank->target->endianness == TARGET_LITTLE_ENDIAN)
133 {
134 for (i = bank->bus_width; i > 0; i--)
135 {
136 *cmd_buf++ = (i & (bank->chip_width - 1)) ? 0x0 : cmd;
137 }
138 }
139 else
140 {
141 for (i = 1; i <= bank->bus_width; i++)
142 {
143 *cmd_buf++ = (i & (bank->chip_width - 1)) ? 0x0 : cmd;
144 }
145 }
146 }
147
148 static int cfi_send_command(struct flash_bank *bank, uint8_t cmd, uint32_t address)
149 {
150 uint8_t command[CFI_MAX_BUS_WIDTH];
151
152 cfi_command(bank, cmd, command);
153 return target_write_memory(bank->target, address, bank->bus_width, 1, command);
154 }
155
156 /* read unsigned 8-bit value from the bank
157 * flash banks are expected to be made of similar chips
158 * the query result should be the same for all
159 */
160 static int cfi_query_u8(struct flash_bank *bank, int sector, uint32_t offset, uint8_t *val)
161 {
162 struct target *target = bank->target;
163 uint8_t data[CFI_MAX_BUS_WIDTH];
164
165 int retval;
166 retval = target_read_memory(target, flash_address(bank, sector, offset),
167 bank->bus_width, 1, data);
168 if (retval != ERROR_OK)
169 return retval;
170
171 if (bank->target->endianness == TARGET_LITTLE_ENDIAN)
172 *val = data[0];
173 else
174 *val = data[bank->bus_width - 1];
175
176 return ERROR_OK;
177 }
178
179 /* read unsigned 8-bit value from the bank
180 * in case of a bank made of multiple chips,
181 * the individual values are ORed
182 */
183 static int cfi_get_u8(struct flash_bank *bank, int sector, uint32_t offset, uint8_t *val)
184 {
185 struct target *target = bank->target;
186 uint8_t data[CFI_MAX_BUS_WIDTH];
187 int i;
188
189 int retval;
190 retval = target_read_memory(target, flash_address(bank, sector, offset),
191 bank->bus_width, 1, data);
192 if (retval != ERROR_OK)
193 return retval;
194
195 if (bank->target->endianness == TARGET_LITTLE_ENDIAN)
196 {
197 for (i = 0; i < bank->bus_width / bank->chip_width; i++)
198 data[0] |= data[i];
199
200 *val = data[0];
201 }
202 else
203 {
204 uint8_t value = 0;
205 for (i = 0; i < bank->bus_width / bank->chip_width; i++)
206 value |= data[bank->bus_width - 1 - i];
207
208 *val = value;
209 }
210 return ERROR_OK;
211 }
212
213 static int cfi_query_u16(struct flash_bank *bank, int sector, uint32_t offset, uint16_t *val)
214 {
215 struct target *target = bank->target;
216 struct cfi_flash_bank *cfi_info = bank->driver_priv;
217 uint8_t data[CFI_MAX_BUS_WIDTH * 2];
218 int retval;
219
220 if (cfi_info->x16_as_x8)
221 {
222 uint8_t i;
223 for (i = 0;i < 2;i++)
224 {
225 retval = target_read_memory(target, flash_address(bank, sector, offset + i),
226 bank->bus_width, 1, &data[i * bank->bus_width]);
227 if (retval != ERROR_OK)
228 return retval;
229 }
230 } else
231 {
232 retval = target_read_memory(target, flash_address(bank, sector, offset),
233 bank->bus_width, 2, data);
234 if (retval != ERROR_OK)
235 return retval;
236 }
237
238 if (bank->target->endianness == TARGET_LITTLE_ENDIAN)
239 *val = data[0] | data[bank->bus_width] << 8;
240 else
241 *val = data[bank->bus_width - 1] | data[(2 * bank->bus_width) - 1] << 8;
242
243 return ERROR_OK;
244 }
245
246 static int cfi_query_u32(struct flash_bank *bank, int sector, uint32_t offset, uint32_t *val)
247 {
248 struct target *target = bank->target;
249 struct cfi_flash_bank *cfi_info = bank->driver_priv;
250 uint8_t data[CFI_MAX_BUS_WIDTH * 4];
251 int retval;
252
253 if (cfi_info->x16_as_x8)
254 {
255 uint8_t i;
256 for (i = 0;i < 4;i++)
257 {
258 retval = target_read_memory(target, flash_address(bank, sector, offset + i),
259 bank->bus_width, 1, &data[i * bank->bus_width]);
260 if (retval != ERROR_OK)
261 return retval;
262 }
263 }
264 else
265 {
266 retval = target_read_memory(target, flash_address(bank, sector, offset),
267 bank->bus_width, 4, data);
268 if (retval != ERROR_OK)
269 return retval;
270 }
271
272 if (bank->target->endianness == TARGET_LITTLE_ENDIAN)
273 *val = data[0] | data[bank->bus_width] << 8 |
274 data[bank->bus_width * 2] << 16 | data[bank->bus_width * 3] << 24;
275 else
276 *val = data[bank->bus_width - 1] | data[(2* bank->bus_width) - 1] << 8 |
277 data[(3 * bank->bus_width) - 1] << 16 | data[(4 * bank->bus_width) - 1] << 24;
278
279 return ERROR_OK;
280 }
281
282 static int cfi_reset(struct flash_bank *bank)
283 {
284 struct cfi_flash_bank *cfi_info = bank->driver_priv;
285 int retval = ERROR_OK;
286
287 if ((retval = cfi_send_command(bank, 0xf0, flash_address(bank, 0, 0x0))) != ERROR_OK)
288 {
289 return retval;
290 }
291
292 if ((retval = cfi_send_command(bank, 0xff, flash_address(bank, 0, 0x0))) != ERROR_OK)
293 {
294 return retval;
295 }
296
297 if (cfi_info->manufacturer == 0x20 &&
298 (cfi_info->device_id == 0x227E || cfi_info->device_id == 0x7E))
299 {
300 /* Numonix M29W128G is cmd 0xFF intolerant - causes internal undefined state
301 * so we send an extra 0xF0 reset to fix the bug */
302 if ((retval = cfi_send_command(bank, 0xf0, flash_address(bank, 0, 0x00))) != ERROR_OK)
303 {
304 return retval;
305 }
306 }
307
308 return retval;
309 }
310
311 static void cfi_intel_clear_status_register(struct flash_bank *bank)
312 {
313 cfi_send_command(bank, 0x50, flash_address(bank, 0, 0x0));
314 }
315
316 static int cfi_intel_wait_status_busy(struct flash_bank *bank, int timeout, uint8_t *val)
317 {
318 uint8_t status;
319
320 int retval = ERROR_OK;
321
322 for (;;)
323 {
324 if (timeout-- < 0)
325 {
326 LOG_ERROR("timeout while waiting for WSM to become ready");
327 return ERROR_FAIL;
328 }
329
330 retval = cfi_get_u8(bank, 0, 0x0, &status);
331 if (retval != ERROR_OK)
332 return retval;
333
334 if (status & 0x80)
335 break;
336
337 alive_sleep(1);
338 }
339
340 /* mask out bit 0 (reserved) */
341 status = status & 0xfe;
342
343 LOG_DEBUG("status: 0x%x", status);
344
345 if (status != 0x80)
346 {
347 LOG_ERROR("status register: 0x%x", status);
348 if (status & 0x2)
349 LOG_ERROR("Block Lock-Bit Detected, Operation Abort");
350 if (status & 0x4)
351 LOG_ERROR("Program suspended");
352 if (status & 0x8)
353 LOG_ERROR("Low Programming Voltage Detected, Operation Aborted");
354 if (status & 0x10)
355 LOG_ERROR("Program Error / Error in Setting Lock-Bit");
356 if (status & 0x20)
357 LOG_ERROR("Error in Block Erasure or Clear Lock-Bits");
358 if (status & 0x40)
359 LOG_ERROR("Block Erase Suspended");
360
361 cfi_intel_clear_status_register(bank);
362
363 retval = ERROR_FAIL;
364 }
365
366 *val = status;
367 return retval;
368 }
369
370 static int cfi_spansion_wait_status_busy(struct flash_bank *bank, int timeout)
371 {
372 uint8_t status, oldstatus;
373 struct cfi_flash_bank *cfi_info = bank->driver_priv;
374 int retval;
375
376 retval = cfi_get_u8(bank, 0, 0x0, &oldstatus);
377 if (retval != ERROR_OK)
378 return retval;
379
380 do {
381 retval = cfi_get_u8(bank, 0, 0x0, &status);
382
383 if (retval != ERROR_OK)
384 return retval;
385
386 if ((status ^ oldstatus) & 0x40) {
387 if (status & cfi_info->status_poll_mask & 0x20) {
388 retval = cfi_get_u8(bank, 0, 0x0, &oldstatus);
389 if (retval != ERROR_OK)
390 return retval;
391 retval = cfi_get_u8(bank, 0, 0x0, &status);
392 if (retval != ERROR_OK)
393 return retval;
394 if ((status ^ oldstatus) & 0x40) {
395 LOG_ERROR("dq5 timeout, status: 0x%x", status);
396 return(ERROR_FLASH_OPERATION_FAILED);
397 } else {
398 LOG_DEBUG("status: 0x%x", status);
399 return(ERROR_OK);
400 }
401 }
402 } else { /* no toggle: finished, OK */
403 LOG_DEBUG("status: 0x%x", status);
404 return(ERROR_OK);
405 }
406
407 oldstatus = status;
408 alive_sleep(1);
409 } while (timeout-- > 0);
410
411 LOG_ERROR("timeout, status: 0x%x", status);
412
413 return(ERROR_FLASH_BUSY);
414 }
415
416 static int cfi_read_intel_pri_ext(struct flash_bank *bank)
417 {
418 int retval;
419 struct cfi_flash_bank *cfi_info = bank->driver_priv;
420 struct cfi_intel_pri_ext *pri_ext;
421
422 if (cfi_info->pri_ext)
423 free(cfi_info->pri_ext);
424
425 pri_ext = malloc(sizeof(struct cfi_intel_pri_ext));
426 if (pri_ext == NULL)
427 {
428 LOG_ERROR("Out of memory");
429 return ERROR_FAIL;
430 }
431 cfi_info->pri_ext = pri_ext;
432
433 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0, &pri_ext->pri[0]);
434 if (retval != ERROR_OK)
435 return retval;
436 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 1, &pri_ext->pri[1]);
437 if (retval != ERROR_OK)
438 return retval;
439 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 2, &pri_ext->pri[2]);
440 if (retval != ERROR_OK)
441 return retval;
442
443 if ((pri_ext->pri[0] != 'P') || (pri_ext->pri[1] != 'R') || (pri_ext->pri[2] != 'I'))
444 {
445 if ((retval = cfi_reset(bank)) != ERROR_OK)
446 {
447 return retval;
448 }
449 LOG_ERROR("Could not read bank flash bank information");
450 return ERROR_FLASH_BANK_INVALID;
451 }
452
453 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 3, &pri_ext->major_version);
454 if (retval != ERROR_OK)
455 return retval;
456 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 4, &pri_ext->minor_version);
457 if (retval != ERROR_OK)
458 return retval;
459
460 LOG_DEBUG("pri: '%c%c%c', version: %c.%c", pri_ext->pri[0], pri_ext->pri[1],
461 pri_ext->pri[2], pri_ext->major_version, pri_ext->minor_version);
462
463 retval = cfi_query_u32(bank, 0, cfi_info->pri_addr + 5, &pri_ext->feature_support);
464 if (retval != ERROR_OK)
465 return retval;
466 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 9, &pri_ext->suspend_cmd_support);
467 if (retval != ERROR_OK)
468 return retval;
469 retval = cfi_query_u16(bank, 0, cfi_info->pri_addr + 0xa, &pri_ext->blk_status_reg_mask);
470 if (retval != ERROR_OK)
471 return retval;
472
473 LOG_DEBUG("feature_support: 0x%" PRIx32 ", suspend_cmd_support: "
474 "0x%x, blk_status_reg_mask: 0x%x",
475 pri_ext->feature_support,
476 pri_ext->suspend_cmd_support,
477 pri_ext->blk_status_reg_mask);
478
479 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0xc, &pri_ext->vcc_optimal);
480 if (retval != ERROR_OK)
481 return retval;
482 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0xd, &pri_ext->vpp_optimal);
483 if (retval != ERROR_OK)
484 return retval;
485
486 LOG_DEBUG("Vcc opt: %x.%x, Vpp opt: %u.%x",
487 (pri_ext->vcc_optimal & 0xf0) >> 4, pri_ext->vcc_optimal & 0x0f,
488 (pri_ext->vpp_optimal & 0xf0) >> 4, pri_ext->vpp_optimal & 0x0f);
489
490 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0xe, &pri_ext->num_protection_fields);
491 if (retval != ERROR_OK)
492 return retval;
493 if (pri_ext->num_protection_fields != 1)
494 {
495 LOG_WARNING("expected one protection register field, but found %i",
496 pri_ext->num_protection_fields);
497 }
498
499 retval = cfi_query_u16(bank, 0, cfi_info->pri_addr + 0xf, &pri_ext->prot_reg_addr);
500 if (retval != ERROR_OK)
501 return retval;
502 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0x11, &pri_ext->fact_prot_reg_size);
503 if (retval != ERROR_OK)
504 return retval;
505 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0x12, &pri_ext->user_prot_reg_size);
506 if (retval != ERROR_OK)
507 return retval;
508
509 LOG_DEBUG("protection_fields: %i, prot_reg_addr: 0x%x, "
510 "factory pre-programmed: %i, user programmable: %i",
511 pri_ext->num_protection_fields, pri_ext->prot_reg_addr,
512 1 << pri_ext->fact_prot_reg_size, 1 << pri_ext->user_prot_reg_size);
513
514 return ERROR_OK;
515 }
516
517 static int cfi_read_spansion_pri_ext(struct flash_bank *bank)
518 {
519 int retval;
520 struct cfi_flash_bank *cfi_info = bank->driver_priv;
521 struct cfi_spansion_pri_ext *pri_ext;
522
523 if (cfi_info->pri_ext)
524 free(cfi_info->pri_ext);
525
526 pri_ext = malloc(sizeof(struct cfi_spansion_pri_ext));
527 if (pri_ext == NULL)
528 {
529 LOG_ERROR("Out of memory");
530 return ERROR_FAIL;
531 }
532 cfi_info->pri_ext = pri_ext;
533
534 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0, &pri_ext->pri[0]);
535 if (retval != ERROR_OK)
536 return retval;
537 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 1, &pri_ext->pri[1]);
538 if (retval != ERROR_OK)
539 return retval;
540 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 2, &pri_ext->pri[2]);
541 if (retval != ERROR_OK)
542 return retval;
543
544 if ((pri_ext->pri[0] != 'P') || (pri_ext->pri[1] != 'R') || (pri_ext->pri[2] != 'I'))
545 {
546 if ((retval = cfi_send_command(bank, 0xf0, flash_address(bank, 0, 0x0))) != ERROR_OK)
547 {
548 return retval;
549 }
550 LOG_ERROR("Could not read spansion bank information");
551 return ERROR_FLASH_BANK_INVALID;
552 }
553
554 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 3, &pri_ext->major_version);
555 if (retval != ERROR_OK)
556 return retval;
557 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 4, &pri_ext->minor_version);
558 if (retval != ERROR_OK)
559 return retval;
560
561 LOG_DEBUG("pri: '%c%c%c', version: %c.%c", pri_ext->pri[0], pri_ext->pri[1],
562 pri_ext->pri[2], pri_ext->major_version, pri_ext->minor_version);
563
564 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 5, &pri_ext->SiliconRevision);
565 if (retval != ERROR_OK)
566 return retval;
567 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 6, &pri_ext->EraseSuspend);
568 if (retval != ERROR_OK)
569 return retval;
570 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 7, &pri_ext->BlkProt);
571 if (retval != ERROR_OK)
572 return retval;
573 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 8, &pri_ext->TmpBlkUnprotect);
574 if (retval != ERROR_OK)
575 return retval;
576 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 9, &pri_ext->BlkProtUnprot);
577 if (retval != ERROR_OK)
578 return retval;
579 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 10, &pri_ext->SimultaneousOps);
580 if (retval != ERROR_OK)
581 return retval;
582 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 11, &pri_ext->BurstMode);
583 if (retval != ERROR_OK)
584 return retval;
585 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 12, &pri_ext->PageMode);
586 if (retval != ERROR_OK)
587 return retval;
588 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 13, &pri_ext->VppMin);
589 if (retval != ERROR_OK)
590 return retval;
591 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 14, &pri_ext->VppMax);
592 if (retval != ERROR_OK)
593 return retval;
594 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 15, &pri_ext->TopBottom);
595 if (retval != ERROR_OK)
596 return retval;
597
598 LOG_DEBUG("Silicon Revision: 0x%x, Erase Suspend: 0x%x, Block protect: 0x%x",
599 pri_ext->SiliconRevision, pri_ext->EraseSuspend, pri_ext->BlkProt);
600
601 LOG_DEBUG("Temporary Unprotect: 0x%x, Block Protect Scheme: 0x%x, "
602 "Simultaneous Ops: 0x%x", pri_ext->TmpBlkUnprotect,
603 pri_ext->BlkProtUnprot, pri_ext->SimultaneousOps);
604
605 LOG_DEBUG("Burst Mode: 0x%x, Page Mode: 0x%x, ", pri_ext->BurstMode, pri_ext->PageMode);
606
607
608 LOG_DEBUG("Vpp min: %u.%x, Vpp max: %u.%x",
609 (pri_ext->VppMin & 0xf0) >> 4, pri_ext->VppMin & 0x0f,
610 (pri_ext->VppMax & 0xf0) >> 4, pri_ext->VppMax & 0x0f);
611
612 LOG_DEBUG("WP# protection 0x%x", pri_ext->TopBottom);
613
614 /* default values for implementation specific workarounds */
615 pri_ext->_unlock1 = cfi_unlock_addresses[CFI_UNLOCK_555_2AA].unlock1;
616 pri_ext->_unlock2 = cfi_unlock_addresses[CFI_UNLOCK_555_2AA].unlock2;
617 pri_ext->_reversed_geometry = 0;
618
619 return ERROR_OK;
620 }
621
622 static int cfi_read_atmel_pri_ext(struct flash_bank *bank)
623 {
624 int retval;
625 struct cfi_atmel_pri_ext atmel_pri_ext;
626 struct cfi_flash_bank *cfi_info = bank->driver_priv;
627 struct cfi_spansion_pri_ext *pri_ext;
628
629 if (cfi_info->pri_ext)
630 free(cfi_info->pri_ext);
631
632 pri_ext = malloc(sizeof(struct cfi_spansion_pri_ext));
633 if (pri_ext == NULL)
634 {
635 LOG_ERROR("Out of memory");
636 return ERROR_FAIL;
637 }
638
639 /* ATMEL devices use the same CFI primary command set (0x2) as AMD/Spansion,
640 * but a different primary extended query table.
641 * We read the atmel table, and prepare a valid AMD/Spansion query table.
642 */
643
644 memset(pri_ext, 0, sizeof(struct cfi_spansion_pri_ext));
645
646 cfi_info->pri_ext = pri_ext;
647
648 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0, &atmel_pri_ext.pri[0]);
649 if (retval != ERROR_OK)
650 return retval;
651 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 1, &atmel_pri_ext.pri[1]);
652 if (retval != ERROR_OK)
653 return retval;
654 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 2, &atmel_pri_ext.pri[2]);
655 if (retval != ERROR_OK)
656 return retval;
657
658 if ((atmel_pri_ext.pri[0] != 'P') || (atmel_pri_ext.pri[1] != 'R')
659 || (atmel_pri_ext.pri[2] != 'I'))
660 {
661 if ((retval = cfi_send_command(bank, 0xf0, flash_address(bank, 0, 0x0))) != ERROR_OK)
662 {
663 return retval;
664 }
665 LOG_ERROR("Could not read atmel bank information");
666 return ERROR_FLASH_BANK_INVALID;
667 }
668
669 pri_ext->pri[0] = atmel_pri_ext.pri[0];
670 pri_ext->pri[1] = atmel_pri_ext.pri[1];
671 pri_ext->pri[2] = atmel_pri_ext.pri[2];
672
673 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 3, &atmel_pri_ext.major_version);
674 if (retval != ERROR_OK)
675 return retval;
676 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 4, &atmel_pri_ext.minor_version);
677 if (retval != ERROR_OK)
678 return retval;
679
680 LOG_DEBUG("pri: '%c%c%c', version: %c.%c", atmel_pri_ext.pri[0],
681 atmel_pri_ext.pri[1], atmel_pri_ext.pri[2],
682 atmel_pri_ext.major_version, atmel_pri_ext.minor_version);
683
684 pri_ext->major_version = atmel_pri_ext.major_version;
685 pri_ext->minor_version = atmel_pri_ext.minor_version;
686
687 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 5, &atmel_pri_ext.features);
688 if (retval != ERROR_OK)
689 return retval;
690 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 6, &atmel_pri_ext.bottom_boot);
691 if (retval != ERROR_OK)
692 return retval;
693 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 7, &atmel_pri_ext.burst_mode);
694 if (retval != ERROR_OK)
695 return retval;
696 retval = cfi_query_u8(bank, 0, cfi_info->pri_addr + 8, &atmel_pri_ext.page_mode);
697 if (retval != ERROR_OK)
698 return retval;
699
700 LOG_DEBUG("features: 0x%2.2x, bottom_boot: 0x%2.2x, burst_mode: 0x%2.2x, page_mode: 0x%2.2x",
701 atmel_pri_ext.features, atmel_pri_ext.bottom_boot,
702 atmel_pri_ext.burst_mode, atmel_pri_ext.page_mode);
703
704 if (atmel_pri_ext.features & 0x02)
705 pri_ext->EraseSuspend = 2;
706
707 /* some chips got it backwards... */
708 if (cfi_info->device_id == AT49BV6416 ||
709 cfi_info->device_id == AT49BV6416T) {
710 if (atmel_pri_ext.bottom_boot)
711 pri_ext->TopBottom = 3;
712 else
713 pri_ext->TopBottom = 2;
714 } else {
715 if (atmel_pri_ext.bottom_boot)
716 pri_ext->TopBottom = 2;
717 else
718 pri_ext->TopBottom = 3;
719 }
720
721 pri_ext->_unlock1 = cfi_unlock_addresses[CFI_UNLOCK_555_2AA].unlock1;
722 pri_ext->_unlock2 = cfi_unlock_addresses[CFI_UNLOCK_555_2AA].unlock2;
723
724 return ERROR_OK;
725 }
726
727 static int cfi_read_0002_pri_ext(struct flash_bank *bank)
728 {
729 struct cfi_flash_bank *cfi_info = bank->driver_priv;
730
731 if (cfi_info->manufacturer == CFI_MFR_ATMEL)
732 {
733 return cfi_read_atmel_pri_ext(bank);
734 }
735 else
736 {
737 return cfi_read_spansion_pri_ext(bank);
738 }
739 }
740
741 static int cfi_spansion_info(struct flash_bank *bank, char *buf, int buf_size)
742 {
743 int printed;
744 struct cfi_flash_bank *cfi_info = bank->driver_priv;
745 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
746
747 printed = snprintf(buf, buf_size, "\nSpansion primary algorithm extend information:\n");
748 buf += printed;
749 buf_size -= printed;
750
751 printed = snprintf(buf, buf_size, "pri: '%c%c%c', version: %c.%c\n", pri_ext->pri[0],
752 pri_ext->pri[1], pri_ext->pri[2],
753 pri_ext->major_version, pri_ext->minor_version);
754 buf += printed;
755 buf_size -= printed;
756
757 printed = snprintf(buf, buf_size, "Silicon Rev.: 0x%x, Address Sensitive unlock: 0x%x\n",
758 (pri_ext->SiliconRevision) >> 2,
759 (pri_ext->SiliconRevision) & 0x03);
760 buf += printed;
761 buf_size -= printed;
762
763 printed = snprintf(buf, buf_size, "Erase Suspend: 0x%x, Sector Protect: 0x%x\n",
764 pri_ext->EraseSuspend,
765 pri_ext->BlkProt);
766 buf += printed;
767 buf_size -= printed;
768
769 printed = snprintf(buf, buf_size, "VppMin: %u.%x, VppMax: %u.%x\n",
770 (pri_ext->VppMin & 0xf0) >> 4, pri_ext->VppMin & 0x0f,
771 (pri_ext->VppMax & 0xf0) >> 4, pri_ext->VppMax & 0x0f);
772
773 return ERROR_OK;
774 }
775
776 static int cfi_intel_info(struct flash_bank *bank, char *buf, int buf_size)
777 {
778 int printed;
779 struct cfi_flash_bank *cfi_info = bank->driver_priv;
780 struct cfi_intel_pri_ext *pri_ext = cfi_info->pri_ext;
781
782 printed = snprintf(buf, buf_size, "\nintel primary algorithm extend information:\n");
783 buf += printed;
784 buf_size -= printed;
785
786 printed = snprintf(buf, buf_size, "pri: '%c%c%c', version: %c.%c\n", pri_ext->pri[0],
787 pri_ext->pri[1], pri_ext->pri[2], pri_ext->major_version, pri_ext->minor_version);
788 buf += printed;
789 buf_size -= printed;
790
791 printed = snprintf(buf, buf_size, "feature_support: 0x%" PRIx32 ", "
792 "suspend_cmd_support: 0x%x, blk_status_reg_mask: 0x%x\n",
793 pri_ext->feature_support, pri_ext->suspend_cmd_support, pri_ext->blk_status_reg_mask);
794 buf += printed;
795 buf_size -= printed;
796
797 printed = snprintf(buf, buf_size, "Vcc opt: %x.%x, Vpp opt: %u.%x\n",
798 (pri_ext->vcc_optimal & 0xf0) >> 4, pri_ext->vcc_optimal & 0x0f,
799 (pri_ext->vpp_optimal & 0xf0) >> 4, pri_ext->vpp_optimal & 0x0f);
800 buf += printed;
801 buf_size -= printed;
802
803 printed = snprintf(buf, buf_size, "protection_fields: %i, prot_reg_addr: 0x%x, "
804 "factory pre-programmed: %i, user programmable: %i\n",
805 pri_ext->num_protection_fields, pri_ext->prot_reg_addr,
806 1 << pri_ext->fact_prot_reg_size, 1 << pri_ext->user_prot_reg_size);
807
808 return ERROR_OK;
809 }
810
811 /* flash_bank cfi <base> <size> <chip_width> <bus_width> <target#> [options]
812 */
813 FLASH_BANK_COMMAND_HANDLER(cfi_flash_bank_command)
814 {
815 struct cfi_flash_bank *cfi_info;
816
817 if (CMD_ARGC < 6)
818 {
819 LOG_WARNING("incomplete flash_bank cfi configuration");
820 return ERROR_FLASH_BANK_INVALID;
821 }
822
823 /* both widths must:
824 * - not exceed max value;
825 * - not be null;
826 * - be equal to a power of 2.
827 * bus must be wide enought to hold one chip */
828 if ((bank->chip_width > CFI_MAX_CHIP_WIDTH)
829 || (bank->bus_width > CFI_MAX_BUS_WIDTH)
830 || (bank->chip_width == 0)
831 || (bank->bus_width == 0)
832 || (bank->chip_width & (bank->chip_width - 1))
833 || (bank->bus_width & (bank->bus_width - 1))
834 || (bank->chip_width > bank->bus_width))
835 {
836 LOG_ERROR("chip and bus width have to specified in bytes");
837 return ERROR_FLASH_BANK_INVALID;
838 }
839
840 cfi_info = malloc(sizeof(struct cfi_flash_bank));
841 cfi_info->probed = 0;
842 cfi_info->erase_region_info = NULL;
843 cfi_info->pri_ext = NULL;
844 bank->driver_priv = cfi_info;
845
846 cfi_info->write_algorithm = NULL;
847
848 cfi_info->x16_as_x8 = 0;
849 cfi_info->jedec_probe = 0;
850 cfi_info->not_cfi = 0;
851
852 for (unsigned i = 6; i < CMD_ARGC; i++)
853 {
854 if (strcmp(CMD_ARGV[i], "x16_as_x8") == 0)
855 {
856 cfi_info->x16_as_x8 = 1;
857 }
858 else if (strcmp(CMD_ARGV[i], "jedec_probe") == 0)
859 {
860 cfi_info->jedec_probe = 1;
861 }
862 }
863
864 cfi_info->write_algorithm = NULL;
865
866 /* bank wasn't probed yet */
867 cfi_info->qry[0] = 0xff;
868
869 return ERROR_OK;
870 }
871
872 static int cfi_intel_erase(struct flash_bank *bank, int first, int last)
873 {
874 int retval;
875 struct cfi_flash_bank *cfi_info = bank->driver_priv;
876 int i;
877
878 cfi_intel_clear_status_register(bank);
879
880 for (i = first; i <= last; i++)
881 {
882 if ((retval = cfi_send_command(bank, 0x20, flash_address(bank, i, 0x0))) != ERROR_OK)
883 {
884 return retval;
885 }
886
887 if ((retval = cfi_send_command(bank, 0xd0, flash_address(bank, i, 0x0))) != ERROR_OK)
888 {
889 return retval;
890 }
891
892 uint8_t status;
893 retval = cfi_intel_wait_status_busy(bank, cfi_info->block_erase_timeout, &status);
894 if (retval != ERROR_OK)
895 return retval;
896
897 if (status == 0x80)
898 bank->sectors[i].is_erased = 1;
899 else
900 {
901 if ((retval = cfi_send_command(bank, 0xff, flash_address(bank, 0, 0x0))) != ERROR_OK)
902 {
903 return retval;
904 }
905
906 LOG_ERROR("couldn't erase block %i of flash bank at base 0x%" PRIx32 , i, bank->base);
907 return ERROR_FLASH_OPERATION_FAILED;
908 }
909 }
910
911 return cfi_send_command(bank, 0xff, flash_address(bank, 0, 0x0));
912 }
913
914 static int cfi_spansion_erase(struct flash_bank *bank, int first, int last)
915 {
916 int retval;
917 struct cfi_flash_bank *cfi_info = bank->driver_priv;
918 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
919 int i;
920
921 for (i = first; i <= last; i++)
922 {
923 if ((retval = cfi_send_command(bank, 0xaa,
924 flash_address(bank, 0, pri_ext->_unlock1))) != ERROR_OK)
925 {
926 return retval;
927 }
928
929 if ((retval = cfi_send_command(bank, 0x55,
930 flash_address(bank, 0, pri_ext->_unlock2))) != ERROR_OK)
931 {
932 return retval;
933 }
934
935 if ((retval = cfi_send_command(bank, 0x80,
936 flash_address(bank, 0, pri_ext->_unlock1))) != ERROR_OK)
937 {
938 return retval;
939 }
940
941 if ((retval = cfi_send_command(bank, 0xaa,
942 flash_address(bank, 0, pri_ext->_unlock1))) != ERROR_OK)
943 {
944 return retval;
945 }
946
947 if ((retval = cfi_send_command(bank, 0x55,
948 flash_address(bank, 0, pri_ext->_unlock2))) != ERROR_OK)
949 {
950 return retval;
951 }
952
953 if ((retval = cfi_send_command(bank, 0x30,
954 flash_address(bank, i, 0x0))) != ERROR_OK)
955 {
956 return retval;
957 }
958
959 if (cfi_spansion_wait_status_busy(bank, cfi_info->block_erase_timeout) == ERROR_OK)
960 {
961 bank->sectors[i].is_erased = 1;
962 }
963 else
964 {
965 if ((retval = cfi_send_command(bank, 0xf0,
966 flash_address(bank, 0, 0x0))) != ERROR_OK)
967 {
968 return retval;
969 }
970
971 LOG_ERROR("couldn't erase block %i of flash bank at base 0x%"
972 PRIx32, i, bank->base);
973 return ERROR_FLASH_OPERATION_FAILED;
974 }
975 }
976
977 return cfi_send_command(bank, 0xf0, flash_address(bank, 0, 0x0));
978 }
979
980 static int cfi_erase(struct flash_bank *bank, int first, int last)
981 {
982 struct cfi_flash_bank *cfi_info = bank->driver_priv;
983
984 if (bank->target->state != TARGET_HALTED)
985 {
986 LOG_ERROR("Target not halted");
987 return ERROR_TARGET_NOT_HALTED;
988 }
989
990 if ((first < 0) || (last < first) || (last >= bank->num_sectors))
991 {
992 return ERROR_FLASH_SECTOR_INVALID;
993 }
994
995 if (cfi_info->qry[0] != 'Q')
996 return ERROR_FLASH_BANK_NOT_PROBED;
997
998 switch (cfi_info->pri_id)
999 {
1000 case 1:
1001 case 3:
1002 return cfi_intel_erase(bank, first, last);
1003 break;
1004 case 2:
1005 return cfi_spansion_erase(bank, first, last);
1006 break;
1007 default:
1008 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
1009 break;
1010 }
1011
1012 return ERROR_OK;
1013 }
1014
1015 static int cfi_intel_protect(struct flash_bank *bank, int set, int first, int last)
1016 {
1017 int retval;
1018 struct cfi_flash_bank *cfi_info = bank->driver_priv;
1019 struct cfi_intel_pri_ext *pri_ext = cfi_info->pri_ext;
1020 int retry = 0;
1021 int i;
1022
1023 /* if the device supports neither legacy lock/unlock (bit 3) nor
1024 * instant individual block locking (bit 5).
1025 */
1026 if (!(pri_ext->feature_support & 0x28))
1027 {
1028 LOG_ERROR("lock/unlock not supported on flash");
1029 return ERROR_FLASH_OPERATION_FAILED;
1030 }
1031
1032 cfi_intel_clear_status_register(bank);
1033
1034 for (i = first; i <= last; i++)
1035 {
1036 if ((retval = cfi_send_command(bank, 0x60, flash_address(bank, i, 0x0))) != ERROR_OK)
1037 {
1038 return retval;
1039 }
1040 if (set)
1041 {
1042 if ((retval = cfi_send_command(bank, 0x01, flash_address(bank, i, 0x0))) != ERROR_OK)
1043 {
1044 return retval;
1045 }
1046 bank->sectors[i].is_protected = 1;
1047 }
1048 else
1049 {
1050 if ((retval = cfi_send_command(bank, 0xd0, flash_address(bank, i, 0x0))) != ERROR_OK)
1051 {
1052 return retval;
1053 }
1054 bank->sectors[i].is_protected = 0;
1055 }
1056
1057 /* instant individual block locking doesn't require reading of the status register */
1058 if (!(pri_ext->feature_support & 0x20))
1059 {
1060 /* Clear lock bits operation may take up to 1.4s */
1061 uint8_t status;
1062 retval = cfi_intel_wait_status_busy(bank, 1400, &status);
1063 if (retval != ERROR_OK)
1064 return retval;
1065 }
1066 else
1067 {
1068 uint8_t block_status;
1069 /* read block lock bit, to verify status */
1070 if ((retval = cfi_send_command(bank, 0x90, flash_address(bank, 0, 0x55))) != ERROR_OK)
1071 {
1072 return retval;
1073 }
1074 retval = cfi_get_u8(bank, i, 0x2, &block_status);
1075 if (retval != ERROR_OK)
1076 return retval;
1077
1078 if ((block_status & 0x1) != set)
1079 {
1080 LOG_ERROR("couldn't change block lock status (set = %i, block_status = 0x%2.2x)",
1081 set, block_status);
1082 if ((retval = cfi_send_command(bank, 0x70,
1083 flash_address(bank, 0, 0x55))) != ERROR_OK)
1084 {
1085 return retval;
1086 }
1087 uint8_t status;
1088 retval = cfi_intel_wait_status_busy(bank, 10, &status);
1089 if (retval != ERROR_OK)
1090 return retval;
1091
1092 if (retry > 10)
1093 return ERROR_FLASH_OPERATION_FAILED;
1094 else
1095 {
1096 i--;
1097 retry++;
1098 }
1099 }
1100 }
1101 }
1102
1103 /* if the device doesn't support individual block lock bits set/clear,
1104 * all blocks have been unlocked in parallel, so we set those that should be protected
1105 */
1106 if ((!set) && (!(pri_ext->feature_support & 0x20)))
1107 {
1108 /* FIX!!! this code path is broken!!!
1109 *
1110 * The correct approach is:
1111 *
1112 * 1. read out current protection status
1113 *
1114 * 2. override read out protection status w/unprotected.
1115 *
1116 * 3. re-protect what should be protected.
1117 *
1118 */
1119 for (i = 0; i < bank->num_sectors; i++)
1120 {
1121 if (bank->sectors[i].is_protected == 1)
1122 {
1123 cfi_intel_clear_status_register(bank);
1124
1125 if ((retval = cfi_send_command(bank, 0x60,
1126 flash_address(bank, i, 0x0))) != ERROR_OK)
1127 {
1128 return retval;
1129 }
1130
1131 if ((retval = cfi_send_command(bank, 0x01,
1132 flash_address(bank, i, 0x0))) != ERROR_OK)
1133 {
1134 return retval;
1135 }
1136
1137 uint8_t status;
1138 retval = cfi_intel_wait_status_busy(bank, 100, &status);
1139 if (retval != ERROR_OK)
1140 return retval;
1141 }
1142 }
1143 }
1144
1145 return cfi_send_command(bank, 0xff, flash_address(bank, 0, 0x0));
1146 }
1147
1148 static int cfi_protect(struct flash_bank *bank, int set, int first, int last)
1149 {
1150 struct cfi_flash_bank *cfi_info = bank->driver_priv;
1151
1152 if (bank->target->state != TARGET_HALTED)
1153 {
1154 LOG_ERROR("Target not halted");
1155 return ERROR_TARGET_NOT_HALTED;
1156 }
1157
1158 if ((first < 0) || (last < first) || (last >= bank->num_sectors))
1159 {
1160 LOG_ERROR("Invalid sector range");
1161 return ERROR_FLASH_SECTOR_INVALID;
1162 }
1163
1164 if (cfi_info->qry[0] != 'Q')
1165 return ERROR_FLASH_BANK_NOT_PROBED;
1166
1167 switch (cfi_info->pri_id)
1168 {
1169 case 1:
1170 case 3:
1171 return cfi_intel_protect(bank, set, first, last);
1172 break;
1173 default:
1174 LOG_WARNING("protect: cfi primary command set %i unsupported", cfi_info->pri_id);
1175 return ERROR_OK;
1176 }
1177 }
1178
1179 /* Convert code image to target endian */
1180 /* FIXME create general block conversion fcts in target.c?) */
1181 static void cfi_fix_code_endian(struct target *target, uint8_t *dest,
1182 const uint32_t *src, uint32_t count)
1183 {
1184 uint32_t i;
1185 for (i = 0; i< count; i++)
1186 {
1187 target_buffer_set_u32(target, dest, *src);
1188 dest += 4;
1189 src++;
1190 }
1191 }
1192
1193 static uint32_t cfi_command_val(struct flash_bank *bank, uint8_t cmd)
1194 {
1195 struct target *target = bank->target;
1196
1197 uint8_t buf[CFI_MAX_BUS_WIDTH];
1198 cfi_command(bank, cmd, buf);
1199 switch (bank->bus_width)
1200 {
1201 case 1 :
1202 return buf[0];
1203 break;
1204 case 2 :
1205 return target_buffer_get_u16(target, buf);
1206 break;
1207 case 4 :
1208 return target_buffer_get_u32(target, buf);
1209 break;
1210 default :
1211 LOG_ERROR("Unsupported bank buswidth %d, can't do block memory writes", bank->bus_width);
1212 return 0;
1213 }
1214 }
1215
1216 static int cfi_intel_write_block(struct flash_bank *bank, uint8_t *buffer,
1217 uint32_t address, uint32_t count)
1218 {
1219 struct cfi_flash_bank *cfi_info = bank->driver_priv;
1220 struct target *target = bank->target;
1221 struct reg_param reg_params[7];
1222 struct arm_algorithm armv4_5_info;
1223 struct working_area *source;
1224 uint32_t buffer_size = 32768;
1225 uint32_t write_command_val, busy_pattern_val, error_pattern_val;
1226
1227 /* algorithm register usage:
1228 * r0: source address (in RAM)
1229 * r1: target address (in Flash)
1230 * r2: count
1231 * r3: flash write command
1232 * r4: status byte (returned to host)
1233 * r5: busy test pattern
1234 * r6: error test pattern
1235 */
1236
1237 /* see contib/loaders/flash/armv4_5_cfi_intel_32.s for src */
1238 static const uint32_t word_32_code[] = {
1239 0xe4904004, /* loop: ldr r4, [r0], #4 */
1240 0xe5813000, /* str r3, [r1] */
1241 0xe5814000, /* str r4, [r1] */
1242 0xe5914000, /* busy: ldr r4, [r1] */
1243 0xe0047005, /* and r7, r4, r5 */
1244 0xe1570005, /* cmp r7, r5 */
1245 0x1afffffb, /* bne busy */
1246 0xe1140006, /* tst r4, r6 */
1247 0x1a000003, /* bne done */
1248 0xe2522001, /* subs r2, r2, #1 */
1249 0x0a000001, /* beq done */
1250 0xe2811004, /* add r1, r1 #4 */
1251 0xeafffff2, /* b loop */
1252 0xeafffffe /* done: b -2 */
1253 };
1254
1255 /* see contib/loaders/flash/armv4_5_cfi_intel_16.s for src */
1256 static const uint32_t word_16_code[] = {
1257 0xe0d040b2, /* loop: ldrh r4, [r0], #2 */
1258 0xe1c130b0, /* strh r3, [r1] */
1259 0xe1c140b0, /* strh r4, [r1] */
1260 0xe1d140b0, /* busy ldrh r4, [r1] */
1261 0xe0047005, /* and r7, r4, r5 */
1262 0xe1570005, /* cmp r7, r5 */
1263 0x1afffffb, /* bne busy */
1264 0xe1140006, /* tst r4, r6 */
1265 0x1a000003, /* bne done */
1266 0xe2522001, /* subs r2, r2, #1 */
1267 0x0a000001, /* beq done */
1268 0xe2811002, /* add r1, r1 #2 */
1269 0xeafffff2, /* b loop */
1270 0xeafffffe /* done: b -2 */
1271 };
1272
1273 /* see contib/loaders/flash/armv4_5_cfi_intel_8.s for src */
1274 static const uint32_t word_8_code[] = {
1275 0xe4d04001, /* loop: ldrb r4, [r0], #1 */
1276 0xe5c13000, /* strb r3, [r1] */
1277 0xe5c14000, /* strb r4, [r1] */
1278 0xe5d14000, /* busy ldrb r4, [r1] */
1279 0xe0047005, /* and r7, r4, r5 */
1280 0xe1570005, /* cmp r7, r5 */
1281 0x1afffffb, /* bne busy */
1282 0xe1140006, /* tst r4, r6 */
1283 0x1a000003, /* bne done */
1284 0xe2522001, /* subs r2, r2, #1 */
1285 0x0a000001, /* beq done */
1286 0xe2811001, /* add r1, r1 #1 */
1287 0xeafffff2, /* b loop */
1288 0xeafffffe /* done: b -2 */
1289 };
1290 uint8_t target_code[4*CFI_MAX_INTEL_CODESIZE];
1291 const uint32_t *target_code_src;
1292 uint32_t target_code_size;
1293 int retval = ERROR_OK;
1294
1295 /* todo: if ( (!is_armv7m(target_to_armv7m(target)) && (!is_arm(target_to_arm(target)) ) */
1296 if (strncmp(target_type_name(target),"mips_m4k",8) == 0)
1297 {
1298 LOG_ERROR("Your target has no flash block write support yet.");
1299 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1300 }
1301
1302 cfi_intel_clear_status_register(bank);
1303
1304 armv4_5_info.common_magic = ARM_COMMON_MAGIC;
1305 armv4_5_info.core_mode = ARM_MODE_SVC;
1306 armv4_5_info.core_state = ARM_STATE_ARM;
1307
1308 /* If we are setting up the write_algorith, we need target_code_src */
1309 /* if not we only need target_code_size. */
1310
1311 /* However, we don't want to create multiple code paths, so we */
1312 /* do the unecessary evaluation of target_code_src, which the */
1313 /* compiler will probably nicely optimize away if not needed */
1314
1315 /* prepare algorithm code for target endian */
1316 switch (bank->bus_width)
1317 {
1318 case 1 :
1319 target_code_src = word_8_code;
1320 target_code_size = sizeof(word_8_code);
1321 break;
1322 case 2 :
1323 target_code_src = word_16_code;
1324 target_code_size = sizeof(word_16_code);
1325 break;
1326 case 4 :
1327 target_code_src = word_32_code;
1328 target_code_size = sizeof(word_32_code);
1329 break;
1330 default:
1331 LOG_ERROR("Unsupported bank buswidth %d, can't do block memory writes", bank->bus_width);
1332 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1333 }
1334
1335 /* flash write code */
1336 if (!cfi_info->write_algorithm)
1337 {
1338 if (target_code_size > sizeof(target_code))
1339 {
1340 LOG_WARNING("Internal error - target code buffer to small. "
1341 "Increase CFI_MAX_INTEL_CODESIZE and recompile.");
1342 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1343 }
1344 cfi_fix_code_endian(target, target_code, target_code_src, target_code_size / 4);
1345
1346 /* Get memory for block write handler */
1347 retval = target_alloc_working_area(target, target_code_size, &cfi_info->write_algorithm);
1348 if (retval != ERROR_OK)
1349 {
1350 LOG_WARNING("No working area available, can't do block memory writes");
1351 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1352 };
1353
1354 /* write algorithm code to working area */
1355 retval = target_write_buffer(target, cfi_info->write_algorithm->address,
1356 target_code_size, target_code);
1357 if (retval != ERROR_OK)
1358 {
1359 LOG_ERROR("Unable to write block write code to target");
1360 goto cleanup;
1361 }
1362 }
1363
1364 /* Get a workspace buffer for the data to flash starting with 32k size.
1365 Half size until buffer would be smaller 256 Bytem then fail back */
1366 /* FIXME Why 256 bytes, why not 32 bytes (smallest flash write page */
1367 while (target_alloc_working_area_try(target, buffer_size, &source) != ERROR_OK)
1368 {
1369 buffer_size /= 2;
1370 if (buffer_size <= 256)
1371 {
1372 LOG_WARNING("no large enough working area available, can't do block memory writes");
1373 retval = ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1374 goto cleanup;
1375 }
1376 };
1377
1378 /* setup algo registers */
1379 init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);
1380 init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);
1381 init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);
1382 init_reg_param(&reg_params[3], "r3", 32, PARAM_OUT);
1383 init_reg_param(&reg_params[4], "r4", 32, PARAM_IN);
1384 init_reg_param(&reg_params[5], "r5", 32, PARAM_OUT);
1385 init_reg_param(&reg_params[6], "r6", 32, PARAM_OUT);
1386
1387 /* prepare command and status register patterns */
1388 write_command_val = cfi_command_val(bank, 0x40);
1389 busy_pattern_val = cfi_command_val(bank, 0x80);
1390 error_pattern_val = cfi_command_val(bank, 0x7e);
1391
1392 LOG_DEBUG("Using target buffer at 0x%08" PRIx32 " and of size 0x%04" PRIx32,
1393 source->address, buffer_size);
1394
1395 /* Programming main loop */
1396 while (count > 0)
1397 {
1398 uint32_t thisrun_count = (count > buffer_size) ? buffer_size : count;
1399 uint32_t wsm_error;
1400
1401 if ((retval = target_write_buffer(target, source->address,
1402 thisrun_count, buffer)) != ERROR_OK)
1403 {
1404 goto cleanup;
1405 }
1406
1407 buf_set_u32(reg_params[0].value, 0, 32, source->address);
1408 buf_set_u32(reg_params[1].value, 0, 32, address);
1409 buf_set_u32(reg_params[2].value, 0, 32, thisrun_count / bank->bus_width);
1410
1411 buf_set_u32(reg_params[3].value, 0, 32, write_command_val);
1412 buf_set_u32(reg_params[5].value, 0, 32, busy_pattern_val);
1413 buf_set_u32(reg_params[6].value, 0, 32, error_pattern_val);
1414
1415 LOG_DEBUG("Write 0x%04" PRIx32 " bytes to flash at 0x%08" PRIx32 , thisrun_count, address);
1416
1417 /* Execute algorithm, assume breakpoint for last instruction */
1418 retval = target_run_algorithm(target, 0, NULL, 7, reg_params,
1419 cfi_info->write_algorithm->address,
1420 cfi_info->write_algorithm->address + target_code_size - sizeof(uint32_t),
1421 10000, /* 10s should be enough for max. 32k of data */
1422 &armv4_5_info);
1423
1424 /* On failure try a fall back to direct word writes */
1425 if (retval != ERROR_OK)
1426 {
1427 cfi_intel_clear_status_register(bank);
1428 LOG_ERROR("Execution of flash algorythm failed. Can't fall back. Please report.");
1429 retval = ERROR_FLASH_OPERATION_FAILED;
1430 /* retval = ERROR_TARGET_RESOURCE_NOT_AVAILABLE; */
1431 /* FIXME To allow fall back or recovery, we must save the actual status
1432 * somewhere, so that a higher level code can start recovery. */
1433 goto cleanup;
1434 }
1435
1436 /* Check return value from algo code */
1437 wsm_error = buf_get_u32(reg_params[4].value, 0, 32) & error_pattern_val;
1438 if (wsm_error)
1439 {
1440 /* read status register (outputs debug inforation) */
1441 uint8_t status;
1442 cfi_intel_wait_status_busy(bank, 100, &status);
1443 cfi_intel_clear_status_register(bank);
1444 retval = ERROR_FLASH_OPERATION_FAILED;
1445 goto cleanup;
1446 }
1447
1448 buffer += thisrun_count;
1449 address += thisrun_count;
1450 count -= thisrun_count;
1451
1452 keep_alive();
1453 }
1454
1455 /* free up resources */
1456 cleanup:
1457 if (source)
1458 target_free_working_area(target, source);
1459
1460 if (cfi_info->write_algorithm)
1461 {
1462 target_free_working_area(target, cfi_info->write_algorithm);
1463 cfi_info->write_algorithm = NULL;
1464 }
1465
1466 destroy_reg_param(&reg_params[0]);
1467 destroy_reg_param(&reg_params[1]);
1468 destroy_reg_param(&reg_params[2]);
1469 destroy_reg_param(&reg_params[3]);
1470 destroy_reg_param(&reg_params[4]);
1471 destroy_reg_param(&reg_params[5]);
1472 destroy_reg_param(&reg_params[6]);
1473
1474 return retval;
1475 }
1476
1477 static int cfi_spansion_write_block_mips(struct flash_bank *bank, uint8_t *buffer,
1478 uint32_t address, uint32_t count)
1479 {
1480 struct cfi_flash_bank *cfi_info = bank->driver_priv;
1481 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
1482 struct target *target = bank->target;
1483 struct reg_param reg_params[10];
1484 struct mips32_algorithm mips32_info;
1485 struct working_area *source;
1486 uint32_t buffer_size = 32768;
1487 uint32_t status;
1488 int retval = ERROR_OK;
1489
1490 /* input parameters - */
1491 /* 4 A0 = source address */
1492 /* 5 A1 = destination address */
1493 /* 6 A2 = number of writes */
1494 /* 7 A3 = flash write command */
1495 /* 8 T0 = constant to mask DQ7 bits (also used for Dq5 with shift) */
1496 /* output parameters - */
1497 /* 9 T1 = 0x80 ok 0x00 bad */
1498 /* temp registers - */
1499 /* 10 T2 = value read from flash to test status */
1500 /* 11 T3 = holding register */
1501 /* unlock registers - */
1502 /* 12 T4 = unlock1_addr */
1503 /* 13 T5 = unlock1_cmd */
1504 /* 14 T6 = unlock2_addr */
1505 /* 15 T7 = unlock2_cmd */
1506
1507 static const uint32_t mips_word_16_code[] = {
1508 /* start: */
1509 MIPS32_LHU(9,0,4), /* lhu $t1, ($a0) ; out = &saddr */
1510 MIPS32_ADDI(4,4,2), /* addi $a0, $a0, 2 ; saddr += 2 */
1511 MIPS32_SH(13,0,12), /* sh $t5, ($t4) ; *fl_unl_addr1 = fl_unl_cmd1 */
1512 MIPS32_SH(15,0,14), /* sh $t7, ($t6) ; *fl_unl_addr2 = fl_unl_cmd2 */
1513 MIPS32_SH(7,0,12), /* sh $a3, ($t4) ; *fl_unl_addr1 = fl_write_cmd */
1514 MIPS32_SH(9,0,5), /* sh $t1, ($a1) ; *daddr = out */
1515 MIPS32_NOP, /* nop */
1516 /* busy: */
1517 MIPS32_LHU(10,0,5), /* lhu $t2, ($a1) ; temp1 = *daddr */
1518 MIPS32_XOR(11,9,10), /* xor $t3, $a0, $t2 ; temp2 = out ^ temp1; */
1519 MIPS32_AND(11,8,11), /* and $t3, $t0, $t3 ; temp2 = temp2 & DQ7mask */
1520 MIPS32_BNE(11,8, 13), /* bne $t3, $t0, cont ; if (temp2 != DQ7mask) goto cont */
1521 MIPS32_NOP, /* nop */
1522
1523 MIPS32_SRL(10,8,2), /* srl $t2,$t0,2 ; temp1 = DQ7mask >> 2 */
1524 MIPS32_AND(11,10,11), /* and $t3, $t2, $t3 ; temp2 = temp2 & temp1 */
1525 MIPS32_BNE(11,10, NEG16(8)), /* bne $t3, $t2, busy ; if (temp2 != temp1) goto busy */
1526 MIPS32_NOP, /* nop */
1527
1528 MIPS32_LHU(10,0,5), /* lhu $t2, ($a1) ; temp1 = *daddr */
1529 MIPS32_XOR(11,9,10), /* xor $t3, $a0, $t2 ; temp2 = out ^ temp1; */
1530 MIPS32_AND(11,8,11), /* and $t3, $t0, $t3 ; temp2 = temp2 & DQ7mask */
1531 MIPS32_BNE(11,8, 4), /* bne $t3, $t0, cont ; if (temp2 != DQ7mask) goto cont */
1532 MIPS32_NOP, /* nop */
1533
1534 MIPS32_XOR(9,9,9), /* xor $t1, $t1, $t1 ; out = 0 */
1535 MIPS32_BEQ(9,0, 11), /* beq $t1, $zero, done ; if (out == 0) goto done */
1536 MIPS32_NOP, /* nop */
1537 /* cont: */
1538 MIPS32_ADDI(6,6,NEG16(1)), /* addi, $a2, $a2, -1 ; numwrites-- */
1539 MIPS32_BNE(6,0, 5), /* bne $a2, $zero, cont2 ; if (numwrite != 0) goto cont2 */
1540 MIPS32_NOP, /* nop */
1541
1542 MIPS32_LUI(9,0), /* lui $t1, 0 */
1543 MIPS32_ORI(9,9,0x80), /* ori $t1, $t1, 0x80 ; out = 0x80 */
1544
1545 MIPS32_B(4), /* b done ; goto done */
1546 MIPS32_NOP, /* nop */
1547 /* cont2: */
1548 MIPS32_ADDI(5,5,2), /* addi $a0, $a0, 2 ; daddr += 2 */
1549 MIPS32_B(NEG16(33)), /* b start ; goto start */
1550 MIPS32_NOP, /* nop */
1551 /* done: */
1552 /*MIPS32_B(NEG16(1)), */ /* b done ; goto done */
1553 MIPS32_SDBBP, /* sdbbp ; break(); */
1554 /*MIPS32_B(NEG16(33)), */ /* b start ; goto start */
1555 /* MIPS32_NOP, */
1556 };
1557
1558 mips32_info.common_magic = MIPS32_COMMON_MAGIC;
1559 mips32_info.isa_mode = MIPS32_ISA_MIPS32;
1560
1561 int target_code_size = 0;
1562 const uint32_t *target_code_src = NULL;
1563
1564 switch (bank->bus_width)
1565 {
1566 case 2 :
1567 /* Check for DQ5 support */
1568 if( cfi_info->status_poll_mask & (1 << 5) )
1569 {
1570 target_code_src = mips_word_16_code;
1571 target_code_size = sizeof(mips_word_16_code);
1572 }
1573 else
1574 {
1575 LOG_ERROR("Need DQ5 support");
1576 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1577 //target_code_src = mips_word_16_code_dq7only;
1578 //target_code_size = sizeof(mips_word_16_code_dq7only);
1579 }
1580 break;
1581 default:
1582 LOG_ERROR("Unsupported bank buswidth %d, can't do block memory writes", bank->bus_width);
1583 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1584 }
1585
1586 /* flash write code */
1587 if (!cfi_info->write_algorithm)
1588 {
1589 uint8_t *target_code;
1590
1591 /* convert bus-width dependent algorithm code to correct endiannes */
1592 target_code = malloc(target_code_size);
1593 if (target_code == NULL)
1594 {
1595 LOG_ERROR("Out of memory");
1596 return ERROR_FAIL;
1597 }
1598 cfi_fix_code_endian(target, target_code, target_code_src, target_code_size / 4);
1599
1600 /* allocate working area */
1601 retval = target_alloc_working_area(target, target_code_size,
1602 &cfi_info->write_algorithm);
1603 if (retval != ERROR_OK)
1604 {
1605 free(target_code);
1606 return retval;
1607 }
1608
1609 /* write algorithm code to working area */
1610 if ((retval = target_write_buffer(target, cfi_info->write_algorithm->address,
1611 target_code_size, target_code)) != ERROR_OK)
1612 {
1613 free(target_code);
1614 return retval;
1615 }
1616
1617 free(target_code);
1618 }
1619 /* the following code still assumes target code is fixed 24*4 bytes */
1620
1621 while (target_alloc_working_area_try(target, buffer_size, &source) != ERROR_OK)
1622 {
1623 buffer_size /= 2;
1624 if (buffer_size <= 256)
1625 {
1626 /* if we already allocated the writing code, but failed to get a
1627 * buffer, free the algorithm */
1628 if (cfi_info->write_algorithm)
1629 target_free_working_area(target, cfi_info->write_algorithm);
1630
1631 LOG_WARNING("not enough working area available, can't do block memory writes");
1632 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1633 }
1634 };
1635
1636 init_reg_param(&reg_params[0], "a0", 32, PARAM_OUT);
1637 init_reg_param(&reg_params[1], "a1", 32, PARAM_OUT);
1638 init_reg_param(&reg_params[2], "a2", 32, PARAM_OUT);
1639 init_reg_param(&reg_params[3], "a3", 32, PARAM_OUT);
1640 init_reg_param(&reg_params[4], "t0", 32, PARAM_OUT);
1641 init_reg_param(&reg_params[5], "t1", 32, PARAM_IN);
1642 init_reg_param(&reg_params[6], "t4", 32, PARAM_OUT);
1643 init_reg_param(&reg_params[7], "t5", 32, PARAM_OUT);
1644 init_reg_param(&reg_params[8], "t6", 32, PARAM_OUT);
1645 init_reg_param(&reg_params[9], "t7", 32, PARAM_OUT);
1646
1647 while (count > 0)
1648 {
1649 uint32_t thisrun_count = (count > buffer_size) ? buffer_size : count;
1650
1651 retval = target_write_buffer(target, source->address, thisrun_count, buffer);
1652 if (retval != ERROR_OK)
1653 {
1654 break;
1655 }
1656
1657 buf_set_u32(reg_params[0].value, 0, 32, source->address);
1658 buf_set_u32(reg_params[1].value, 0, 32, address);
1659 buf_set_u32(reg_params[2].value, 0, 32, thisrun_count / bank->bus_width);
1660 buf_set_u32(reg_params[3].value, 0, 32, cfi_command_val(bank, 0xA0));
1661 buf_set_u32(reg_params[4].value, 0, 32, cfi_command_val(bank, 0x80));
1662 buf_set_u32(reg_params[6].value, 0, 32, flash_address(bank, 0, pri_ext->_unlock1));
1663 buf_set_u32(reg_params[7].value, 0, 32, 0xaaaaaaaa);
1664 buf_set_u32(reg_params[8].value, 0, 32, flash_address(bank, 0, pri_ext->_unlock2));
1665 buf_set_u32(reg_params[9].value, 0, 32, 0x55555555);
1666
1667 retval = target_run_algorithm(target, 0, NULL, 10, reg_params,
1668 cfi_info->write_algorithm->address,
1669 cfi_info->write_algorithm->address + ((target_code_size) - 4),
1670 10000, &mips32_info);
1671 if (retval != ERROR_OK)
1672 {
1673 break;
1674 }
1675
1676 status = buf_get_u32(reg_params[5].value, 0, 32);
1677 if (status != 0x80)
1678 {
1679 LOG_ERROR("flash write block failed status: 0x%" PRIx32 , status);
1680 retval = ERROR_FLASH_OPERATION_FAILED;
1681 break;
1682 }
1683
1684 buffer += thisrun_count;
1685 address += thisrun_count;
1686 count -= thisrun_count;
1687 }
1688
1689 target_free_all_working_areas(target);
1690
1691 destroy_reg_param(&reg_params[0]);
1692 destroy_reg_param(&reg_params[1]);
1693 destroy_reg_param(&reg_params[2]);
1694 destroy_reg_param(&reg_params[3]);
1695 destroy_reg_param(&reg_params[4]);
1696 destroy_reg_param(&reg_params[5]);
1697 destroy_reg_param(&reg_params[6]);
1698 destroy_reg_param(&reg_params[7]);
1699 destroy_reg_param(&reg_params[8]);
1700 destroy_reg_param(&reg_params[9]);
1701
1702 return retval;
1703 }
1704
1705 static int cfi_spansion_write_block(struct flash_bank *bank, uint8_t *buffer,
1706 uint32_t address, uint32_t count)
1707 {
1708 struct cfi_flash_bank *cfi_info = bank->driver_priv;
1709 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
1710 struct target *target = bank->target;
1711 struct reg_param reg_params[10];
1712 struct arm_algorithm armv4_5_info;
1713 struct working_area *source;
1714 uint32_t buffer_size = 32768;
1715 uint32_t status;
1716 int retval = ERROR_OK;
1717
1718 /* input parameters - */
1719 /* R0 = source address */
1720 /* R1 = destination address */
1721 /* R2 = number of writes */
1722 /* R3 = flash write command */
1723 /* R4 = constant to mask DQ7 bits (also used for Dq5 with shift) */
1724 /* output parameters - */
1725 /* R5 = 0x80 ok 0x00 bad */
1726 /* temp registers - */
1727 /* R6 = value read from flash to test status */
1728 /* R7 = holding register */
1729 /* unlock registers - */
1730 /* R8 = unlock1_addr */
1731 /* R9 = unlock1_cmd */
1732 /* R10 = unlock2_addr */
1733 /* R11 = unlock2_cmd */
1734
1735 /* see contib/loaders/flash/armv4_5_cfi_span_32.s for src */
1736 static const uint32_t armv4_5_word_32_code[] = {
1737 /* 00008100 <sp_32_code>: */
1738 0xe4905004, /* ldr r5, [r0], #4 */
1739 0xe5889000, /* str r9, [r8] */
1740 0xe58ab000, /* str r11, [r10] */
1741 0xe5883000, /* str r3, [r8] */
1742 0xe5815000, /* str r5, [r1] */
1743 0xe1a00000, /* nop */
1744 /* */
1745 /* 00008110 <sp_32_busy>: */
1746 0xe5916000, /* ldr r6, [r1] */
1747 0xe0257006, /* eor r7, r5, r6 */
1748 0xe0147007, /* ands r7, r4, r7 */
1749 0x0a000007, /* beq 8140 <sp_32_cont> ; b if DQ7 == Data7 */
1750 0xe0166124, /* ands r6, r6, r4, lsr #2 */
1751 0x0afffff9, /* beq 8110 <sp_32_busy> ; b if DQ5 low */
1752 0xe5916000, /* ldr r6, [r1] */
1753 0xe0257006, /* eor r7, r5, r6 */
1754 0xe0147007, /* ands r7, r4, r7 */
1755 0x0a000001, /* beq 8140 <sp_32_cont> ; b if DQ7 == Data7 */
1756 0xe3a05000, /* mov r5, #0 ; 0x0 - return 0x00, error */
1757 0x1a000004, /* bne 8154 <sp_32_done> */
1758 /* */
1759 /* 00008140 <sp_32_cont>: */
1760 0xe2522001, /* subs r2, r2, #1 ; 0x1 */
1761 0x03a05080, /* moveq r5, #128 ; 0x80 */
1762 0x0a000001, /* beq 8154 <sp_32_done> */
1763 0xe2811004, /* add r1, r1, #4 ; 0x4 */
1764 0xeaffffe8, /* b 8100 <sp_32_code> */
1765 /* */
1766 /* 00008154 <sp_32_done>: */
1767 0xeafffffe /* b 8154 <sp_32_done> */
1768 };
1769
1770 /* see contib/loaders/flash/armv4_5_cfi_span_16.s for src */
1771 static const uint32_t armv4_5_word_16_code[] = {
1772 /* 00008158 <sp_16_code>: */
1773 0xe0d050b2, /* ldrh r5, [r0], #2 */
1774 0xe1c890b0, /* strh r9, [r8] */
1775 0xe1cab0b0, /* strh r11, [r10] */
1776 0xe1c830b0, /* strh r3, [r8] */
1777 0xe1c150b0, /* strh r5, [r1] */
1778 0xe1a00000, /* nop (mov r0,r0) */
1779 /* */
1780 /* 00008168 <sp_16_busy>: */
1781 0xe1d160b0, /* ldrh r6, [r1] */
1782 0xe0257006, /* eor r7, r5, r6 */
1783 0xe0147007, /* ands r7, r4, r7 */
1784 0x0a000007, /* beq 8198 <sp_16_cont> */
1785 0xe0166124, /* ands r6, r6, r4, lsr #2 */
1786 0x0afffff9, /* beq 8168 <sp_16_busy> */
1787 0xe1d160b0, /* ldrh r6, [r1] */
1788 0xe0257006, /* eor r7, r5, r6 */
1789 0xe0147007, /* ands r7, r4, r7 */
1790 0x0a000001, /* beq 8198 <sp_16_cont> */
1791 0xe3a05000, /* mov r5, #0 ; 0x0 */
1792 0x1a000004, /* bne 81ac <sp_16_done> */
1793 /* */
1794 /* 00008198 <sp_16_cont>: */
1795 0xe2522001, /* subs r2, r2, #1 ; 0x1 */
1796 0x03a05080, /* moveq r5, #128 ; 0x80 */
1797 0x0a000001, /* beq 81ac <sp_16_done> */
1798 0xe2811002, /* add r1, r1, #2 ; 0x2 */
1799 0xeaffffe8, /* b 8158 <sp_16_code> */
1800 /* */
1801 /* 000081ac <sp_16_done>: */
1802 0xeafffffe /* b 81ac <sp_16_done> */
1803 };
1804
1805 /* see contib/loaders/flash/armv7m_cfi_span_16.s for src */
1806 static const uint32_t armv7m_word_16_code[] = {
1807 0x5B02F830,
1808 0x9000F8A8,
1809 0xB000F8AA,
1810 0x3000F8A8,
1811 0xBF00800D,
1812 0xEA85880E,
1813 0x40270706,
1814 0xEA16D00A,
1815 0xD0F70694,
1816 0xEA85880E,
1817 0x40270706,
1818 0xF04FD002,
1819 0xD1070500,
1820 0xD0023A01,
1821 0x0102F101,
1822 0xF04FE7E0,
1823 0xE7FF0580,
1824 0x0000BE00
1825 };
1826
1827 /* see contib/loaders/flash/armv4_5_cfi_span_16_dq7.s for src */
1828 static const uint32_t armv4_5_word_16_code_dq7only[] = {
1829 /* <sp_16_code>: */
1830 0xe0d050b2, /* ldrh r5, [r0], #2 */
1831 0xe1c890b0, /* strh r9, [r8] */
1832 0xe1cab0b0, /* strh r11, [r10] */
1833 0xe1c830b0, /* strh r3, [r8] */
1834 0xe1c150b0, /* strh r5, [r1] */
1835 0xe1a00000, /* nop (mov r0,r0) */
1836 /* */
1837 /* <sp_16_busy>: */
1838 0xe1d160b0, /* ldrh r6, [r1] */
1839 0xe0257006, /* eor r7, r5, r6 */
1840 0xe2177080, /* ands r7, #0x80 */
1841 0x1afffffb, /* bne 8168 <sp_16_busy> */
1842 /* */
1843 0xe2522001, /* subs r2, r2, #1 ; 0x1 */
1844 0x03a05080, /* moveq r5, #128 ; 0x80 */
1845 0x0a000001, /* beq 81ac <sp_16_done> */
1846 0xe2811002, /* add r1, r1, #2 ; 0x2 */
1847 0xeafffff0, /* b 8158 <sp_16_code> */
1848 /* */
1849 /* 000081ac <sp_16_done>: */
1850 0xeafffffe /* b 81ac <sp_16_done> */
1851 };
1852
1853 /* see contib/loaders/flash/armv4_5_cfi_span_8.s for src */
1854 static const uint32_t armv4_5_word_8_code[] = {
1855 /* 000081b0 <sp_16_code_end>: */
1856 0xe4d05001, /* ldrb r5, [r0], #1 */
1857 0xe5c89000, /* strb r9, [r8] */
1858 0xe5cab000, /* strb r11, [r10] */
1859 0xe5c83000, /* strb r3, [r8] */
1860 0xe5c15000, /* strb r5, [r1] */
1861 0xe1a00000, /* nop (mov r0,r0) */
1862 /* */
1863 /* 000081c0 <sp_8_busy>: */
1864 0xe5d16000, /* ldrb r6, [r1] */
1865 0xe0257006, /* eor r7, r5, r6 */
1866 0xe0147007, /* ands r7, r4, r7 */
1867 0x0a000007, /* beq 81f0 <sp_8_cont> */
1868 0xe0166124, /* ands r6, r6, r4, lsr #2 */
1869 0x0afffff9, /* beq 81c0 <sp_8_busy> */
1870 0xe5d16000, /* ldrb r6, [r1] */
1871 0xe0257006, /* eor r7, r5, r6 */
1872 0xe0147007, /* ands r7, r4, r7 */
1873 0x0a000001, /* beq 81f0 <sp_8_cont> */
1874 0xe3a05000, /* mov r5, #0 ; 0x0 */
1875 0x1a000004, /* bne 8204 <sp_8_done> */
1876 /* */
1877 /* 000081f0 <sp_8_cont>: */
1878 0xe2522001, /* subs r2, r2, #1 ; 0x1 */
1879 0x03a05080, /* moveq r5, #128 ; 0x80 */
1880 0x0a000001, /* beq 8204 <sp_8_done> */
1881 0xe2811001, /* add r1, r1, #1 ; 0x1 */
1882 0xeaffffe8, /* b 81b0 <sp_16_code_end> */
1883 /* */
1884 /* 00008204 <sp_8_done>: */
1885 0xeafffffe /* b 8204 <sp_8_done> */
1886 };
1887
1888 if (strncmp(target_type_name(target),"mips_m4k",8) == 0)
1889 {
1890 return cfi_spansion_write_block_mips(bank,buffer,address,count);
1891 }
1892
1893 if (is_armv7m(target_to_armv7m(target))) /* Cortex-M3 target */
1894 {
1895 armv4_5_info.common_magic = ARMV7M_COMMON_MAGIC;
1896 armv4_5_info.core_mode = ARMV7M_MODE_HANDLER;
1897 armv4_5_info.core_state = ARM_STATE_ARM;
1898 }
1899 else
1900 {
1901 /* All other ARM CPUs have 32 bit instructions */
1902 armv4_5_info.common_magic = ARM_COMMON_MAGIC;
1903 armv4_5_info.core_mode = ARM_MODE_SVC;
1904 armv4_5_info.core_state = ARM_STATE_ARM;
1905 }
1906
1907 int target_code_size = 0;
1908 const uint32_t *target_code_src = NULL;
1909
1910 switch (bank->bus_width)
1911 {
1912 case 1 :
1913 if(armv4_5_info.common_magic == ARM_COMMON_MAGIC) /* armv4_5 target */
1914 {
1915 target_code_src = armv4_5_word_8_code;
1916 target_code_size = sizeof(armv4_5_word_8_code);
1917 }
1918 break;
1919 case 2 :
1920 /* Check for DQ5 support */
1921 if( cfi_info->status_poll_mask & (1 << 5) )
1922 {
1923 if(armv4_5_info.common_magic == ARM_COMMON_MAGIC) /* armv4_5 target */
1924 {
1925 target_code_src = armv4_5_word_16_code;
1926 target_code_size = sizeof(armv4_5_word_16_code);
1927 }
1928 else if (armv4_5_info.common_magic == ARMV7M_COMMON_MAGIC) /* cortex-m3 target */
1929 {
1930 target_code_src = armv7m_word_16_code;
1931 target_code_size = sizeof(armv7m_word_16_code);
1932 }
1933 }
1934 else
1935 {
1936 /* No DQ5 support. Use DQ7 DATA# polling only. */
1937 if(armv4_5_info.common_magic == ARM_COMMON_MAGIC) // armv4_5 target
1938 {
1939 target_code_src = armv4_5_word_16_code_dq7only;
1940 target_code_size = sizeof(armv4_5_word_16_code_dq7only);
1941 }
1942 }
1943 break;
1944 case 4 :
1945 if(armv4_5_info.common_magic == ARM_COMMON_MAGIC) // armv4_5 target
1946 {
1947 target_code_src = armv4_5_word_32_code;
1948 target_code_size = sizeof(armv4_5_word_32_code);
1949 }
1950 break;
1951 default:
1952 LOG_ERROR("Unsupported bank buswidth %d, can't do block memory writes", bank->bus_width);
1953 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1954 }
1955
1956 /* flash write code */
1957 if (!cfi_info->write_algorithm)
1958 {
1959 uint8_t *target_code;
1960
1961 /* convert bus-width dependent algorithm code to correct endiannes */
1962 target_code = malloc(target_code_size);
1963 if (target_code == NULL)
1964 {
1965 LOG_ERROR("Out of memory");
1966 return ERROR_FAIL;
1967 }
1968 cfi_fix_code_endian(target, target_code, target_code_src, target_code_size / 4);
1969
1970 /* allocate working area */
1971 retval = target_alloc_working_area(target, target_code_size,
1972 &cfi_info->write_algorithm);
1973 if (retval != ERROR_OK)
1974 {
1975 free(target_code);
1976 return retval;
1977 }
1978
1979 /* write algorithm code to working area */
1980 if ((retval = target_write_buffer(target, cfi_info->write_algorithm->address,
1981 target_code_size, target_code)) != ERROR_OK)
1982 {
1983 free(target_code);
1984 return retval;
1985 }
1986
1987 free(target_code);
1988 }
1989 /* the following code still assumes target code is fixed 24*4 bytes */
1990
1991 while (target_alloc_working_area_try(target, buffer_size, &source) != ERROR_OK)
1992 {
1993 buffer_size /= 2;
1994 if (buffer_size <= 256)
1995 {
1996 /* if we already allocated the writing code, but failed to get a
1997 * buffer, free the algorithm */
1998 if (cfi_info->write_algorithm)
1999 target_free_working_area(target, cfi_info->write_algorithm);
2000
2001 LOG_WARNING("not enough working area available, can't do block memory writes");
2002 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
2003 }
2004 };
2005
2006 init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);
2007 init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);
2008 init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);
2009 init_reg_param(&reg_params[3], "r3", 32, PARAM_OUT);
2010 init_reg_param(&reg_params[4], "r4", 32, PARAM_OUT);
2011 init_reg_param(&reg_params[5], "r5", 32, PARAM_IN);
2012 init_reg_param(&reg_params[6], "r8", 32, PARAM_OUT);
2013 init_reg_param(&reg_params[7], "r9", 32, PARAM_OUT);
2014 init_reg_param(&reg_params[8], "r10", 32, PARAM_OUT);
2015 init_reg_param(&reg_params[9], "r11", 32, PARAM_OUT);
2016
2017 while (count > 0)
2018 {
2019 uint32_t thisrun_count = (count > buffer_size) ? buffer_size : count;
2020
2021 retval = target_write_buffer(target, source->address, thisrun_count, buffer);
2022 if (retval != ERROR_OK)
2023 {
2024 break;
2025 }
2026
2027 buf_set_u32(reg_params[0].value, 0, 32, source->address);
2028 buf_set_u32(reg_params[1].value, 0, 32, address);
2029 buf_set_u32(reg_params[2].value, 0, 32, thisrun_count / bank->bus_width);
2030 buf_set_u32(reg_params[3].value, 0, 32, cfi_command_val(bank, 0xA0));
2031 buf_set_u32(reg_params[4].value, 0, 32, cfi_command_val(bank, 0x80));
2032 buf_set_u32(reg_params[6].value, 0, 32, flash_address(bank, 0, pri_ext->_unlock1));
2033 buf_set_u32(reg_params[7].value, 0, 32, 0xaaaaaaaa);
2034 buf_set_u32(reg_params[8].value, 0, 32, flash_address(bank, 0, pri_ext->_unlock2));
2035 buf_set_u32(reg_params[9].value, 0, 32, 0x55555555);
2036
2037 retval = target_run_algorithm(target, 0, NULL, 10, reg_params,
2038 cfi_info->write_algorithm->address,
2039 cfi_info->write_algorithm->address + ((target_code_size) - 4),
2040 10000, &armv4_5_info);
2041 if (retval != ERROR_OK)
2042 {
2043 break;
2044 }
2045
2046 status = buf_get_u32(reg_params[5].value, 0, 32);
2047 if (status != 0x80)
2048 {
2049 LOG_ERROR("flash write block failed status: 0x%" PRIx32 , status);
2050 retval = ERROR_FLASH_OPERATION_FAILED;
2051 break;
2052 }
2053
2054 buffer += thisrun_count;
2055 address += thisrun_count;
2056 count -= thisrun_count;
2057 }
2058
2059 target_free_all_working_areas(target);
2060
2061 destroy_reg_param(&reg_params[0]);
2062 destroy_reg_param(&reg_params[1]);
2063 destroy_reg_param(&reg_params[2]);
2064 destroy_reg_param(&reg_params[3]);
2065 destroy_reg_param(&reg_params[4]);
2066 destroy_reg_param(&reg_params[5]);
2067 destroy_reg_param(&reg_params[6]);
2068 destroy_reg_param(&reg_params[7]);
2069 destroy_reg_param(&reg_params[8]);
2070 destroy_reg_param(&reg_params[9]);
2071
2072 return retval;
2073 }
2074
2075 static int cfi_intel_write_word(struct flash_bank *bank, uint8_t *word, uint32_t address)
2076 {
2077 int retval;
2078 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2079 struct target *target = bank->target;
2080
2081 cfi_intel_clear_status_register(bank);
2082 if ((retval = cfi_send_command(bank, 0x40, address)) != ERROR_OK)
2083 {
2084 return retval;
2085 }
2086
2087 if ((retval = target_write_memory(target, address, bank->bus_width, 1, word)) != ERROR_OK)
2088 {
2089 return retval;
2090 }
2091
2092 uint8_t status;
2093 retval = cfi_intel_wait_status_busy(bank, cfi_info->word_write_timeout, &status);
2094 if (retval != 0x80)
2095 {
2096 if ((retval = cfi_send_command(bank, 0xff, flash_address(bank, 0, 0x0))) != ERROR_OK)
2097 {
2098 return retval;
2099 }
2100
2101 LOG_ERROR("couldn't write word at base 0x%" PRIx32 ", address 0x%" PRIx32,
2102 bank->base, address);
2103 return ERROR_FLASH_OPERATION_FAILED;
2104 }
2105
2106 return ERROR_OK;
2107 }
2108
2109 static int cfi_intel_write_words(struct flash_bank *bank, uint8_t *word,
2110 uint32_t wordcount, uint32_t address)
2111 {
2112 int retval;
2113 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2114 struct target *target = bank->target;
2115
2116 /* Calculate buffer size and boundary mask */
2117 /* buffersize is (buffer size per chip) * (number of chips) */
2118 /* bufferwsize is buffersize in words */
2119 uint32_t buffersize = (1UL << cfi_info->max_buf_write_size) * (bank->bus_width / bank->chip_width);
2120 uint32_t buffermask = buffersize-1;
2121 uint32_t bufferwsize = buffersize / bank->bus_width;
2122
2123 /* Check for valid range */
2124 if (address & buffermask)
2125 {
2126 LOG_ERROR("Write address at base 0x%" PRIx32 ", address 0x%" PRIx32
2127 " not aligned to 2^%d boundary",
2128 bank->base, address, cfi_info->max_buf_write_size);
2129 return ERROR_FLASH_OPERATION_FAILED;
2130 }
2131
2132 /* Check for valid size */
2133 if (wordcount > bufferwsize)
2134 {
2135 LOG_ERROR("Number of data words %" PRId32 " exceeds available buffersize %" PRId32,
2136 wordcount, buffersize);
2137 return ERROR_FLASH_OPERATION_FAILED;
2138 }
2139
2140 /* Write to flash buffer */
2141 cfi_intel_clear_status_register(bank);
2142
2143 /* Initiate buffer operation _*/
2144 if ((retval = cfi_send_command(bank, 0xe8, address)) != ERROR_OK)
2145 {
2146 return retval;
2147 }
2148 uint8_t status;
2149 retval = cfi_intel_wait_status_busy(bank, cfi_info->buf_write_timeout, &status);
2150 if (retval != ERROR_OK)
2151 return retval;
2152 if (status != 0x80)
2153 {
2154 if ((retval = cfi_send_command(bank, 0xff, flash_address(bank, 0, 0x0))) != ERROR_OK)
2155 {
2156 return retval;
2157 }
2158
2159 LOG_ERROR("couldn't start buffer write operation at base 0x%" PRIx32 ", address 0x%" PRIx32,
2160 bank->base, address);
2161 return ERROR_FLASH_OPERATION_FAILED;
2162 }
2163
2164 /* Write buffer wordcount-1 and data words */
2165 if ((retval = cfi_send_command(bank, bufferwsize-1, address)) != ERROR_OK)
2166 {
2167 return retval;
2168 }
2169
2170 if ((retval = target_write_memory(target,
2171 address, bank->bus_width, bufferwsize, word)) != ERROR_OK)
2172 {
2173 return retval;
2174 }
2175
2176 /* Commit write operation */
2177 if ((retval = cfi_send_command(bank, 0xd0, address)) != ERROR_OK)
2178 {
2179 return retval;
2180 }
2181
2182 retval = cfi_intel_wait_status_busy(bank, cfi_info->buf_write_timeout, &status);
2183 if (retval != ERROR_OK)
2184 return retval;
2185
2186 if (status != 0x80)
2187 {
2188 if ((retval = cfi_send_command(bank, 0xff,
2189 flash_address(bank, 0, 0x0))) != ERROR_OK)
2190 {
2191 return retval;
2192 }
2193
2194 LOG_ERROR("Buffer write at base 0x%" PRIx32
2195 ", address 0x%" PRIx32 " failed.", bank->base, address);
2196 return ERROR_FLASH_OPERATION_FAILED;
2197 }
2198
2199 return ERROR_OK;
2200 }
2201
2202 static int cfi_spansion_write_word(struct flash_bank *bank, uint8_t *word, uint32_t address)
2203 {
2204 int retval;
2205 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2206 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
2207 struct target *target = bank->target;
2208
2209 if ((retval = cfi_send_command(bank, 0xaa,
2210 flash_address(bank, 0, pri_ext->_unlock1))) != ERROR_OK)
2211 {
2212 return retval;
2213 }
2214
2215 if ((retval = cfi_send_command(bank, 0x55,
2216 flash_address(bank, 0, pri_ext->_unlock2))) != ERROR_OK)
2217 {
2218 return retval;
2219 }
2220
2221 if ((retval = cfi_send_command(bank, 0xa0,
2222 flash_address(bank, 0, pri_ext->_unlock1))) != ERROR_OK)
2223 {
2224 return retval;
2225 }
2226
2227 if ((retval = target_write_memory(target,
2228 address, bank->bus_width, 1, word)) != ERROR_OK)
2229 {
2230 return retval;
2231 }
2232
2233 if (cfi_spansion_wait_status_busy(bank, cfi_info->word_write_timeout) != ERROR_OK)
2234 {
2235 if ((retval = cfi_send_command(bank, 0xf0, flash_address(bank, 0, 0x0))) != ERROR_OK)
2236 {
2237 return retval;
2238 }
2239
2240 LOG_ERROR("couldn't write word at base 0x%" PRIx32
2241 ", address 0x%" PRIx32 , bank->base, address);
2242 return ERROR_FLASH_OPERATION_FAILED;
2243 }
2244
2245 return ERROR_OK;
2246 }
2247
2248 static int cfi_spansion_write_words(struct flash_bank *bank, uint8_t *word,
2249 uint32_t wordcount, uint32_t address)
2250 {
2251 int retval;
2252 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2253 struct target *target = bank->target;
2254 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
2255
2256 /* Calculate buffer size and boundary mask */
2257 /* buffersize is (buffer size per chip) * (number of chips) */
2258 /* bufferwsize is buffersize in words */
2259 uint32_t buffersize = (1UL << cfi_info->max_buf_write_size) * (bank->bus_width / bank->chip_width);
2260 uint32_t buffermask = buffersize-1;
2261 uint32_t bufferwsize = buffersize / bank->bus_width;
2262
2263 /* Check for valid range */
2264 if (address & buffermask)
2265 {
2266 LOG_ERROR("Write address at base 0x%" PRIx32
2267 ", address 0x%" PRIx32 " not aligned to 2^%d boundary",
2268 bank->base, address, cfi_info->max_buf_write_size);
2269 return ERROR_FLASH_OPERATION_FAILED;
2270 }
2271
2272 /* Check for valid size */
2273 if (wordcount > bufferwsize)
2274 {
2275 LOG_ERROR("Number of data words %" PRId32 " exceeds available buffersize %"
2276 PRId32, wordcount, buffersize);
2277 return ERROR_FLASH_OPERATION_FAILED;
2278 }
2279
2280 /* Unlock */
2281 if ((retval = cfi_send_command(bank, 0xaa,
2282 flash_address(bank, 0, pri_ext->_unlock1))) != ERROR_OK)
2283 {
2284 return retval;
2285 }
2286
2287 if ((retval = cfi_send_command(bank, 0x55,
2288 flash_address(bank, 0, pri_ext->_unlock2))) != ERROR_OK)
2289 {
2290 return retval;
2291 }
2292
2293 /* Buffer load command */
2294 if ((retval = cfi_send_command(bank, 0x25, address)) != ERROR_OK)
2295 {
2296 return retval;
2297 }
2298
2299 /* Write buffer wordcount-1 and data words */
2300 if ((retval = cfi_send_command(bank, bufferwsize-1, address)) != ERROR_OK)
2301 {
2302 return retval;
2303 }
2304
2305 if ((retval = target_write_memory(target,
2306 address, bank->bus_width, bufferwsize, word)) != ERROR_OK)
2307 {
2308 return retval;
2309 }
2310
2311 /* Commit write operation */
2312 if ((retval = cfi_send_command(bank, 0x29, address)) != ERROR_OK)
2313 {
2314 return retval;
2315 }
2316
2317 if (cfi_spansion_wait_status_busy(bank, cfi_info->buf_write_timeout) != ERROR_OK)
2318 {
2319 if ((retval = cfi_send_command(bank, 0xf0,
2320 flash_address(bank, 0, 0x0))) != ERROR_OK)
2321 {
2322 return retval;
2323 }
2324
2325 LOG_ERROR("couldn't write block at base 0x%" PRIx32
2326 ", address 0x%" PRIx32 ", size 0x%" PRIx32, bank->base, address, bufferwsize);
2327 return ERROR_FLASH_OPERATION_FAILED;
2328 }
2329
2330 return ERROR_OK;
2331 }
2332
2333 static int cfi_write_word(struct flash_bank *bank, uint8_t *word, uint32_t address)
2334 {
2335 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2336
2337 switch (cfi_info->pri_id)
2338 {
2339 case 1:
2340 case 3:
2341 return cfi_intel_write_word(bank, word, address);
2342 break;
2343 case 2:
2344 return cfi_spansion_write_word(bank, word, address);
2345 break;
2346 default:
2347 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
2348 break;
2349 }
2350
2351 return ERROR_FLASH_OPERATION_FAILED;
2352 }
2353
2354 static int cfi_write_words(struct flash_bank *bank, uint8_t *word,
2355 uint32_t wordcount, uint32_t address)
2356 {
2357 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2358
2359 if (cfi_info->buf_write_timeout_typ == 0)
2360 {
2361 /* buffer writes are not supported */
2362 LOG_DEBUG("Buffer Writes Not Supported");
2363 return ERROR_FLASH_OPER_UNSUPPORTED;
2364 }
2365
2366 switch (cfi_info->pri_id)
2367 {
2368 case 1:
2369 case 3:
2370 return cfi_intel_write_words(bank, word, wordcount, address);
2371 break;
2372 case 2:
2373 return cfi_spansion_write_words(bank, word, wordcount, address);
2374 break;
2375 default:
2376 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
2377 break;
2378 }
2379
2380 return ERROR_FLASH_OPERATION_FAILED;
2381 }
2382
2383 static int cfi_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
2384 {
2385 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2386 struct target *target = bank->target;
2387 uint32_t address = bank->base + offset;
2388 uint32_t read_p;
2389 int align; /* number of unaligned bytes */
2390 uint8_t current_word[CFI_MAX_BUS_WIDTH];
2391 int i;
2392 int retval;
2393
2394 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x",
2395 (int)count, (unsigned)offset);
2396
2397 if (bank->target->state != TARGET_HALTED)
2398 {
2399 LOG_ERROR("Target not halted");
2400 return ERROR_TARGET_NOT_HALTED;
2401 }
2402
2403 if (offset + count > bank->size)
2404 return ERROR_FLASH_DST_OUT_OF_BANK;
2405
2406 if (cfi_info->qry[0] != 'Q')
2407 return ERROR_FLASH_BANK_NOT_PROBED;
2408
2409 /* start at the first byte of the first word (bus_width size) */
2410 read_p = address & ~(bank->bus_width - 1);
2411 if ((align = address - read_p) != 0)
2412 {
2413 LOG_INFO("Fixup %d unaligned read head bytes", align);
2414
2415 /* read a complete word from flash */
2416 if ((retval = target_read_memory(target, read_p,
2417 bank->bus_width, 1, current_word)) != ERROR_OK)
2418 return retval;
2419
2420 /* take only bytes we need */
2421 for (i = align; (i < bank->bus_width) && (count > 0); i++, count--)
2422 *buffer++ = current_word[i];
2423
2424 read_p += bank->bus_width;
2425 }
2426
2427 align = count / bank->bus_width;
2428 if (align)
2429 {
2430 if ((retval = target_read_memory(target, read_p,
2431 bank->bus_width, align, buffer)) != ERROR_OK)
2432 return retval;
2433
2434 read_p += align * bank->bus_width;
2435 buffer += align * bank->bus_width;
2436 count -= align * bank->bus_width;
2437 }
2438
2439 if (count)
2440 {
2441 LOG_INFO("Fixup %d unaligned read tail bytes", count);
2442
2443 /* read a complete word from flash */
2444 if ((retval = target_read_memory(target, read_p,
2445 bank->bus_width, 1, current_word)) != ERROR_OK)
2446 return retval;
2447
2448 /* take only bytes we need */
2449 for (i = 0; (i < bank->bus_width) && (count > 0); i++, count--)
2450 *buffer++ = current_word[i];
2451 }
2452
2453 return ERROR_OK;
2454 }
2455
2456 static int cfi_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
2457 {
2458 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2459 struct target *target = bank->target;
2460 uint32_t address = bank->base + offset; /* address of first byte to be programmed */
2461 uint32_t write_p;
2462 int align; /* number of unaligned bytes */
2463 int blk_count; /* number of bus_width bytes for block copy */
2464 uint8_t current_word[CFI_MAX_BUS_WIDTH * 4]; /* word (bus_width size) currently being programmed */
2465 int i;
2466 int retval;
2467
2468 if (bank->target->state != TARGET_HALTED)
2469 {
2470 LOG_ERROR("Target not halted");
2471 return ERROR_TARGET_NOT_HALTED;
2472 }
2473
2474 if (offset + count > bank->size)
2475 return ERROR_FLASH_DST_OUT_OF_BANK;
2476
2477 if (cfi_info->qry[0] != 'Q')
2478 return ERROR_FLASH_BANK_NOT_PROBED;
2479
2480 /* start at the first byte of the first word (bus_width size) */
2481 write_p = address & ~(bank->bus_width - 1);
2482 if ((align = address - write_p) != 0)
2483 {
2484 LOG_INFO("Fixup %d unaligned head bytes", align);
2485
2486 /* read a complete word from flash */
2487 if ((retval = target_read_memory(target, write_p,
2488 bank->bus_width, 1, current_word)) != ERROR_OK)
2489 return retval;
2490
2491 /* replace only bytes that must be written */
2492 for (i = align; (i < bank->bus_width) && (count > 0); i++, count--)
2493 current_word[i] = *buffer++;
2494
2495 retval = cfi_write_word(bank, current_word, write_p);
2496 if (retval != ERROR_OK)
2497 return retval;
2498 write_p += bank->bus_width;
2499 }
2500
2501 /* handle blocks of bus_size aligned bytes */
2502 blk_count = count & ~(bank->bus_width - 1); /* round down, leave tail bytes */
2503 switch (cfi_info->pri_id)
2504 {
2505 /* try block writes (fails without working area) */
2506 case 1:
2507 case 3:
2508 retval = cfi_intel_write_block(bank, buffer, write_p, blk_count);
2509 break;
2510 case 2:
2511 retval = cfi_spansion_write_block(bank, buffer, write_p, blk_count);
2512 break;
2513 default:
2514 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
2515 retval = ERROR_FLASH_OPERATION_FAILED;
2516 break;
2517 }
2518 if (retval == ERROR_OK)
2519 {
2520 /* Increment pointers and decrease count on succesful block write */
2521 buffer += blk_count;
2522 write_p += blk_count;
2523 count -= blk_count;
2524 }
2525 else
2526 {
2527 if (retval == ERROR_TARGET_RESOURCE_NOT_AVAILABLE)
2528 {
2529 /* Calculate buffer size and boundary mask */
2530 /* buffersize is (buffer size per chip) * (number of chips) */
2531 /* bufferwsize is buffersize in words */
2532 uint32_t buffersize = (1UL << cfi_info->max_buf_write_size) * (bank->bus_width / bank->chip_width);
2533 uint32_t buffermask = buffersize-1;
2534 uint32_t bufferwsize = buffersize / bank->bus_width;
2535
2536 /* fall back to memory writes */
2537 while (count >= (uint32_t)bank->bus_width)
2538 {
2539 int fallback;
2540 if ((write_p & 0xff) == 0)
2541 {
2542 LOG_INFO("Programming at 0x%08" PRIx32 ", count 0x%08"
2543 PRIx32 " bytes remaining", write_p, count);
2544 }
2545 fallback = 1;
2546 if ((bufferwsize > 0) && (count >= buffersize) && !(write_p & buffermask))
2547 {
2548 retval = cfi_write_words(bank, buffer, bufferwsize, write_p);
2549 if (retval == ERROR_OK)
2550 {
2551 buffer += buffersize;
2552 write_p += buffersize;
2553 count -= buffersize;
2554 fallback = 0;
2555 }
2556 else if (retval != ERROR_FLASH_OPER_UNSUPPORTED)
2557 return retval;
2558 }
2559 /* try the slow way? */
2560 if (fallback)
2561 {
2562 for (i = 0; i < bank->bus_width; i++)
2563 current_word[i] = *buffer++;
2564
2565 retval = cfi_write_word(bank, current_word, write_p);
2566 if (retval != ERROR_OK)
2567 return retval;
2568
2569 write_p += bank->bus_width;
2570 count -= bank->bus_width;
2571 }
2572 }
2573 }
2574 else
2575 return retval;
2576 }
2577
2578 /* return to read array mode, so we can read from flash again for padding */
2579 if ((retval = cfi_reset(bank)) != ERROR_OK)
2580 {
2581 return retval;
2582 }
2583
2584 /* handle unaligned tail bytes */
2585 if (count > 0)
2586 {
2587 LOG_INFO("Fixup %" PRId32 " unaligned tail bytes", count);
2588
2589 /* read a complete word from flash */
2590 if ((retval = target_read_memory(target, write_p,
2591 bank->bus_width, 1, current_word)) != ERROR_OK)
2592 return retval;
2593
2594 /* replace only bytes that must be written */
2595 for (i = 0; (i < bank->bus_width) && (count > 0); i++, count--)
2596 current_word[i] = *buffer++;
2597
2598 retval = cfi_write_word(bank, current_word, write_p);
2599 if (retval != ERROR_OK)
2600 return retval;
2601 }
2602
2603 /* return to read array mode */
2604 return cfi_reset(bank);
2605 }
2606
2607 static void cfi_fixup_reversed_erase_regions(struct flash_bank *bank, void *param)
2608 {
2609 (void) param;
2610 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2611 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
2612
2613 pri_ext->_reversed_geometry = 1;
2614 }
2615
2616 static void cfi_fixup_0002_erase_regions(struct flash_bank *bank, void *param)
2617 {
2618 int i;
2619 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2620 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
2621 (void) param;
2622
2623 if ((pri_ext->_reversed_geometry) || (pri_ext->TopBottom == 3))
2624 {
2625 LOG_DEBUG("swapping reversed erase region information on cmdset 0002 device");
2626
2627 for (i = 0; i < cfi_info->num_erase_regions / 2; i++)
2628 {
2629 int j = (cfi_info->num_erase_regions - 1) - i;
2630 uint32_t swap;
2631
2632 swap = cfi_info->erase_region_info[i];
2633 cfi_info->erase_region_info[i] = cfi_info->erase_region_info[j];
2634 cfi_info->erase_region_info[j] = swap;
2635 }
2636 }
2637 }
2638
2639 static void cfi_fixup_0002_unlock_addresses(struct flash_bank *bank, void *param)
2640 {
2641 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2642 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
2643 struct cfi_unlock_addresses *unlock_addresses = param;
2644
2645 pri_ext->_unlock1 = unlock_addresses->unlock1;
2646 pri_ext->_unlock2 = unlock_addresses->unlock2;
2647 }
2648
2649
2650 static int cfi_query_string(struct flash_bank *bank, int address)
2651 {
2652 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2653 int retval;
2654
2655 if ((retval = cfi_send_command(bank, 0x98, flash_address(bank, 0, address))) != ERROR_OK)
2656 {
2657 return retval;
2658 }
2659
2660 retval = cfi_query_u8(bank, 0, 0x10, &cfi_info->qry[0]);
2661 if (retval != ERROR_OK)
2662 return retval;
2663 retval = cfi_query_u8(bank, 0, 0x11, &cfi_info->qry[1]);
2664 if (retval != ERROR_OK)
2665 return retval;
2666 retval = cfi_query_u8(bank, 0, 0x12, &cfi_info->qry[2]);
2667 if (retval != ERROR_OK)
2668 return retval;
2669
2670 LOG_DEBUG("CFI qry returned: 0x%2.2x 0x%2.2x 0x%2.2x",
2671 cfi_info->qry[0], cfi_info->qry[1], cfi_info->qry[2]);
2672
2673 if ((cfi_info->qry[0] != 'Q') || (cfi_info->qry[1] != 'R') || (cfi_info->qry[2] != 'Y'))
2674 {
2675 if ((retval = cfi_reset(bank)) != ERROR_OK)
2676 {
2677 return retval;
2678 }
2679 LOG_ERROR("Could not probe bank: no QRY");
2680 return ERROR_FLASH_BANK_INVALID;
2681 }
2682
2683 return ERROR_OK;
2684 }
2685
2686 static int cfi_probe(struct flash_bank *bank)
2687 {
2688 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2689 struct target *target = bank->target;
2690 int num_sectors = 0;
2691 int i;
2692 int sector = 0;
2693 uint32_t unlock1 = 0x555;
2694 uint32_t unlock2 = 0x2aa;
2695 int retval;
2696 uint8_t value_buf0[CFI_MAX_BUS_WIDTH], value_buf1[CFI_MAX_BUS_WIDTH];
2697
2698 if (bank->target->state != TARGET_HALTED)
2699 {
2700 LOG_ERROR("Target not halted");
2701 return ERROR_TARGET_NOT_HALTED;
2702 }
2703
2704 cfi_info->probed = 0;
2705 if (bank->sectors)
2706 {
2707 free(bank->sectors);
2708 bank->sectors = NULL;
2709 }
2710 if(cfi_info->erase_region_info)
2711 {
2712 free(cfi_info->erase_region_info);
2713 cfi_info->erase_region_info = NULL;
2714 }
2715
2716 /* JEDEC standard JESD21C uses 0x5555 and 0x2aaa as unlock addresses,
2717 * while CFI compatible AMD/Spansion flashes use 0x555 and 0x2aa
2718 */
2719 if (cfi_info->jedec_probe)
2720 {
2721 unlock1 = 0x5555;
2722 unlock2 = 0x2aaa;
2723 }
2724
2725 /* switch to read identifier codes mode ("AUTOSELECT") */
2726 if ((retval = cfi_send_command(bank, 0xaa, flash_address(bank, 0, unlock1))) != ERROR_OK)
2727 {
2728 return retval;
2729 }
2730 if ((retval = cfi_send_command(bank, 0x55, flash_address(bank, 0, unlock2))) != ERROR_OK)
2731 {
2732 return retval;
2733 }
2734 if ((retval = cfi_send_command(bank, 0x90, flash_address(bank, 0, unlock1))) != ERROR_OK)
2735 {
2736 return retval;
2737 }
2738
2739 if ((retval = target_read_memory(target, flash_address(bank, 0, 0x00),
2740 bank->bus_width, 1, value_buf0)) != ERROR_OK)
2741 {
2742 return retval;
2743 }
2744 if ((retval = target_read_memory(target, flash_address(bank, 0, 0x01),
2745 bank->bus_width, 1, value_buf1)) != ERROR_OK)
2746 {
2747 return retval;
2748 }
2749 switch (bank->chip_width) {
2750 case 1:
2751 cfi_info->manufacturer = *value_buf0;
2752 cfi_info->device_id = *value_buf1;
2753 break;
2754 case 2:
2755 cfi_info->manufacturer = target_buffer_get_u16(target, value_buf0);
2756 cfi_info->device_id = target_buffer_get_u16(target, value_buf1);
2757 break;
2758 case 4:
2759 cfi_info->manufacturer = target_buffer_get_u32(target, value_buf0);
2760 cfi_info->device_id = target_buffer_get_u32(target, value_buf1);
2761 break;
2762 default:
2763 LOG_ERROR("Unsupported bank chipwidth %d, can't probe memory", bank->chip_width);
2764 return ERROR_FLASH_OPERATION_FAILED;
2765 }
2766
2767 LOG_INFO("Flash Manufacturer/Device: 0x%04x 0x%04x",
2768 cfi_info->manufacturer, cfi_info->device_id);
2769 /* switch back to read array mode */
2770 if ((retval = cfi_reset(bank)) != ERROR_OK)
2771 {
2772 return retval;
2773 }
2774
2775 /* check device/manufacturer ID for known non-CFI flashes. */
2776 cfi_fixup_non_cfi(bank);
2777
2778 /* query only if this is a CFI compatible flash,
2779 * otherwise the relevant info has already been filled in
2780 */
2781 if (cfi_info->not_cfi == 0)
2782 {
2783 /* enter CFI query mode
2784 * according to JEDEC Standard No. 68.01,
2785 * a single bus sequence with address = 0x55, data = 0x98 should put
2786 * the device into CFI query mode.
2787 *
2788 * SST flashes clearly violate this, and we will consider them incompatbile for now
2789 */
2790
2791 retval = cfi_query_string(bank, 0x55);
2792 if (retval != ERROR_OK)
2793 {
2794 /*
2795 * Spansion S29WS-N CFI query fix is to try 0x555 if 0x55 fails. Should
2796 * be harmless enough:
2797 *
2798 * http://www.infradead.org/pipermail/linux-mtd/2005-September/013618.html
2799 */
2800 LOG_USER("Try workaround w/0x555 instead of 0x55 to get QRY.");
2801 retval = cfi_query_string(bank, 0x555);
2802 }
2803 if (retval != ERROR_OK)
2804 return retval;
2805
2806 retval = cfi_query_u16(bank, 0, 0x13, &cfi_info->pri_id);
2807 if (retval != ERROR_OK)
2808 return retval;
2809 retval = cfi_query_u16(bank, 0, 0x15, &cfi_info->pri_addr);
2810 if (retval != ERROR_OK)
2811 return retval;
2812 retval = cfi_query_u16(bank, 0, 0x17, &cfi_info->alt_id);
2813 if (retval != ERROR_OK)
2814 return retval;
2815 retval = cfi_query_u16(bank, 0, 0x19, &cfi_info->alt_addr);
2816 if (retval != ERROR_OK)
2817 return retval;
2818
2819 LOG_DEBUG("qry: '%c%c%c', pri_id: 0x%4.4x, pri_addr: 0x%4.4x, alt_id: "
2820 "0x%4.4x, alt_addr: 0x%4.4x", cfi_info->qry[0], cfi_info->qry[1],
2821 cfi_info->qry[2], cfi_info->pri_id, cfi_info->pri_addr,
2822 cfi_info->alt_id, cfi_info->alt_addr);
2823
2824 retval = cfi_query_u8(bank, 0, 0x1b, &cfi_info->vcc_min);
2825 if (retval != ERROR_OK)
2826 return retval;
2827 retval = cfi_query_u8(bank, 0, 0x1c, &cfi_info->vcc_max);
2828 if (retval != ERROR_OK)
2829 return retval;
2830 retval = cfi_query_u8(bank, 0, 0x1d, &cfi_info->vpp_min);
2831 if (retval != ERROR_OK)
2832 return retval;
2833 retval = cfi_query_u8(bank, 0, 0x1e, &cfi_info->vpp_max);
2834 if (retval != ERROR_OK)
2835 return retval;
2836
2837 retval = cfi_query_u8(bank, 0, 0x1f, &cfi_info->word_write_timeout_typ);
2838 if (retval != ERROR_OK)
2839 return retval;
2840 retval = cfi_query_u8(bank, 0, 0x20, &cfi_info->buf_write_timeout_typ);
2841 if (retval != ERROR_OK)
2842 return retval;
2843 retval = cfi_query_u8(bank, 0, 0x21, &cfi_info->block_erase_timeout_typ);
2844 if (retval != ERROR_OK)
2845 return retval;
2846 retval = cfi_query_u8(bank, 0, 0x22, &cfi_info->chip_erase_timeout_typ);
2847 if (retval != ERROR_OK)
2848 return retval;
2849 retval = cfi_query_u8(bank, 0, 0x23, &cfi_info->word_write_timeout_max);
2850 if (retval != ERROR_OK)
2851 return retval;
2852 retval = cfi_query_u8(bank, 0, 0x24, &cfi_info->buf_write_timeout_max);
2853 if (retval != ERROR_OK)
2854 return retval;
2855 retval = cfi_query_u8(bank, 0, 0x25, &cfi_info->block_erase_timeout_max);
2856 if (retval != ERROR_OK)
2857 return retval;
2858 retval = cfi_query_u8(bank, 0, 0x26, &cfi_info->chip_erase_timeout_max);
2859 if (retval != ERROR_OK)
2860 return retval;
2861
2862 uint8_t data;
2863 retval = cfi_query_u8(bank, 0, 0x27, &data);
2864 if (retval != ERROR_OK)
2865 return retval;
2866 cfi_info->dev_size = 1 << data;
2867
2868 retval = cfi_query_u16(bank, 0, 0x28, &cfi_info->interface_desc);
2869 if (retval != ERROR_OK)
2870 return retval;
2871 retval = cfi_query_u16(bank, 0, 0x2a, &cfi_info->max_buf_write_size);
2872 if (retval != ERROR_OK)
2873 return retval;
2874 retval = cfi_query_u8(bank, 0, 0x2c, &cfi_info->num_erase_regions);
2875 if (retval != ERROR_OK)
2876 return retval;
2877
2878 LOG_DEBUG("size: 0x%" PRIx32 ", interface desc: %i, max buffer write size: 0x%x",
2879 cfi_info->dev_size, cfi_info->interface_desc, (1 << cfi_info->max_buf_write_size));
2880
2881 if (cfi_info->num_erase_regions)
2882 {
2883 cfi_info->erase_region_info = malloc(sizeof(*cfi_info->erase_region_info)
2884 * cfi_info->num_erase_regions);
2885 for (i = 0; i < cfi_info->num_erase_regions; i++)
2886 {
2887 retval = cfi_query_u32(bank, 0, 0x2d + (4 * i), &cfi_info->erase_region_info[i]);
2888 if (retval != ERROR_OK)
2889 return retval;
2890 LOG_DEBUG("erase region[%i]: %" PRIu32 " blocks of size 0x%" PRIx32 "", i,
2891 (cfi_info->erase_region_info[i] & 0xffff) + 1,
2892 (cfi_info->erase_region_info[i] >> 16) * 256);
2893 }
2894 }
2895 else
2896 {
2897 cfi_info->erase_region_info = NULL;
2898 }
2899
2900 /* We need to read the primary algorithm extended query table before calculating
2901 * the sector layout to be able to apply fixups
2902 */
2903 switch (cfi_info->pri_id)
2904 {
2905 /* Intel command set (standard and extended) */
2906 case 0x0001:
2907 case 0x0003:
2908 cfi_read_intel_pri_ext(bank);
2909 break;
2910 /* AMD/Spansion, Atmel, ... command set */
2911 case 0x0002:
2912 cfi_info->status_poll_mask = CFI_STATUS_POLL_MASK_DQ5_DQ6_DQ7; /* default for all CFI flashs */
2913 cfi_read_0002_pri_ext(bank);
2914 break;
2915 default:
2916 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
2917 break;
2918 }
2919
2920 /* return to read array mode
2921 * we use both reset commands, as some Intel flashes fail to recognize the 0xF0 command
2922 */
2923 if ((retval = cfi_reset(bank)) != ERROR_OK)
2924 {
2925 return retval;
2926 }
2927 } /* end CFI case */
2928
2929 LOG_DEBUG("Vcc min: %x.%x, Vcc max: %x.%x, Vpp min: %u.%x, Vpp max: %u.%x",
2930 (cfi_info->vcc_min & 0xf0) >> 4, cfi_info->vcc_min & 0x0f,
2931 (cfi_info->vcc_max & 0xf0) >> 4, cfi_info->vcc_max & 0x0f,
2932 (cfi_info->vpp_min & 0xf0) >> 4, cfi_info->vpp_min & 0x0f,
2933 (cfi_info->vpp_max & 0xf0) >> 4, cfi_info->vpp_max & 0x0f);
2934
2935 LOG_DEBUG("typ. word write timeout: %u us, typ. buf write timeout: %u us, "
2936 "typ. block erase timeout: %u ms, typ. chip erase timeout: %u ms",
2937 1 << cfi_info->word_write_timeout_typ, 1 << cfi_info->buf_write_timeout_typ,
2938 1 << cfi_info->block_erase_timeout_typ, 1 << cfi_info->chip_erase_timeout_typ);
2939
2940 LOG_DEBUG("max. word write timeout: %u us, max. buf write timeout: %u us, "
2941 "max. block erase timeout: %u ms, max. chip erase timeout: %u ms",
2942 (1 << cfi_info->word_write_timeout_max) * (1 << cfi_info->word_write_timeout_typ),
2943 (1 << cfi_info->buf_write_timeout_max) * (1 << cfi_info->buf_write_timeout_typ),
2944 (1 << cfi_info->block_erase_timeout_max) * (1 << cfi_info->block_erase_timeout_typ),
2945 (1 << cfi_info->chip_erase_timeout_max) * (1 << cfi_info->chip_erase_timeout_typ));
2946
2947 /* convert timeouts to real values in ms */
2948 cfi_info->word_write_timeout = DIV_ROUND_UP((1L << cfi_info->word_write_timeout_typ) *
2949 (1L << cfi_info->word_write_timeout_max), 1000);
2950 cfi_info->buf_write_timeout = DIV_ROUND_UP((1L << cfi_info->buf_write_timeout_typ) *
2951 (1L << cfi_info->buf_write_timeout_max), 1000);
2952 cfi_info->block_erase_timeout = (1L << cfi_info->block_erase_timeout_typ) *
2953 (1L << cfi_info->block_erase_timeout_max);
2954 cfi_info->chip_erase_timeout = (1L << cfi_info->chip_erase_timeout_typ) *
2955 (1L << cfi_info->chip_erase_timeout_max);
2956
2957 LOG_DEBUG("calculated word write timeout: %u ms, buf write timeout: %u ms, "
2958 "block erase timeout: %u ms, chip erase timeout: %u ms",
2959 cfi_info->word_write_timeout, cfi_info->buf_write_timeout,
2960 cfi_info->block_erase_timeout, cfi_info->chip_erase_timeout);
2961
2962 /* apply fixups depending on the primary command set */
2963 switch (cfi_info->pri_id)
2964 {
2965 /* Intel command set (standard and extended) */
2966 case 0x0001:
2967 case 0x0003:
2968 cfi_fixup(bank, cfi_0001_fixups);
2969 break;
2970 /* AMD/Spansion, Atmel, ... command set */
2971 case 0x0002:
2972 cfi_fixup(bank, cfi_0002_fixups);
2973 break;
2974 default:
2975 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
2976 break;
2977 }
2978
2979 if ((cfi_info->dev_size * bank->bus_width / bank->chip_width) != bank->size)
2980 {
2981 LOG_WARNING("configuration specifies 0x%" PRIx32 " size, but a 0x%" PRIx32
2982 " size flash was found", bank->size, cfi_info->dev_size);
2983 }
2984
2985 if (cfi_info->num_erase_regions == 0)
2986 {
2987 /* a device might have only one erase block, spanning the whole device */
2988 bank->num_sectors = 1;
2989 bank->sectors = malloc(sizeof(struct flash_sector));
2990
2991 bank->sectors[sector].offset = 0x0;
2992 bank->sectors[sector].size = bank->size;
2993 bank->sectors[sector].is_erased = -1;
2994 bank->sectors[sector].is_protected = -1;
2995 }
2996 else
2997 {
2998 uint32_t offset = 0;
2999
3000 for (i = 0; i < cfi_info->num_erase_regions; i++)
3001 {
3002 num_sectors += (cfi_info->erase_region_info[i] & 0xffff) + 1;
3003 }
3004
3005 bank->num_sectors = num_sectors;
3006 bank->sectors = malloc(sizeof(struct flash_sector) * num_sectors);
3007
3008 for (i = 0; i < cfi_info->num_erase_regions; i++)
3009 {
3010 uint32_t j;
3011 for (j = 0; j < (cfi_info->erase_region_info[i] & 0xffff) + 1; j++)
3012 {
3013 bank->sectors[sector].offset = offset;
3014 bank->sectors[sector].size = ((cfi_info->erase_region_info[i] >> 16) * 256)
3015 * bank->bus_width / bank->chip_width;
3016 offset += bank->sectors[sector].size;
3017 bank->sectors[sector].is_erased = -1;
3018 bank->sectors[sector].is_protected = -1;
3019 sector++;
3020 }
3021 }
3022 if (offset != (cfi_info->dev_size * bank->bus_width / bank->chip_width))
3023 {
3024 LOG_WARNING("CFI size is 0x%" PRIx32 ", but total sector size is 0x%" PRIx32 "", \
3025 (cfi_info->dev_size * bank->bus_width / bank->chip_width), offset);
3026 }
3027 }
3028
3029 cfi_info->probed = 1;
3030
3031 return ERROR_OK;
3032 }
3033
3034 static int cfi_auto_probe(struct flash_bank *bank)
3035 {
3036 struct cfi_flash_bank *cfi_info = bank->driver_priv;
3037 if (cfi_info->probed)
3038 return ERROR_OK;
3039 return cfi_probe(bank);
3040 }
3041
3042 static int cfi_intel_protect_check(struct flash_bank *bank)
3043 {
3044 int retval;
3045 struct cfi_flash_bank *cfi_info = bank->driver_priv;
3046 struct cfi_intel_pri_ext *pri_ext = cfi_info->pri_ext;
3047 int i;
3048
3049 /* check if block lock bits are supported on this device */
3050 if (!(pri_ext->blk_status_reg_mask & 0x1))
3051 return ERROR_FLASH_OPERATION_FAILED;
3052
3053 if ((retval = cfi_send_command(bank, 0x90, flash_address(bank, 0, 0x55))) != ERROR_OK)
3054 {
3055 return retval;
3056 }
3057
3058 for (i = 0; i < bank->num_sectors; i++)
3059 {
3060 uint8_t block_status;
3061 retval = cfi_get_u8(bank, i, 0x2, &block_status);
3062 if (retval != ERROR_OK)
3063 return retval;
3064
3065 if (block_status & 1)
3066 bank->sectors[i].is_protected = 1;
3067 else
3068 bank->sectors[i].is_protected = 0;
3069 }
3070
3071 return cfi_send_command(bank, 0xff, flash_address(bank, 0, 0x0));
3072 }
3073
3074 static int cfi_spansion_protect_check(struct flash_bank *bank)
3075 {
3076 int retval;
3077 struct cfi_flash_bank *cfi_info = bank->driver_priv;
3078 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
3079 int i;
3080
3081 if ((retval = cfi_send_command(bank, 0xaa,
3082 flash_address(bank, 0, pri_ext->_unlock1))) != ERROR_OK)
3083 {
3084 return retval;
3085 }
3086
3087 if ((retval = cfi_send_command(bank, 0x55,
3088 flash_address(bank, 0, pri_ext->_unlock2))) != ERROR_OK)
3089 {
3090 return retval;
3091 }
3092
3093 if ((retval = cfi_send_command(bank, 0x90,
3094 flash_address(bank, 0, pri_ext->_unlock1))) != ERROR_OK)
3095 {
3096 return retval;
3097 }
3098
3099 for (i = 0; i < bank->num_sectors; i++)
3100 {
3101 uint8_t block_status;
3102 retval = cfi_get_u8(bank, i, 0x2, &block_status);
3103 if (retval != ERROR_OK)
3104 return retval;
3105
3106 if (block_status & 1)
3107 bank->sectors[i].is_protected = 1;
3108 else
3109 bank->sectors[i].is_protected = 0;
3110 }
3111
3112 return cfi_send_command(bank, 0xf0, flash_address(bank, 0, 0x0));
3113 }
3114
3115 static int cfi_protect_check(struct flash_bank *bank)
3116 {
3117 struct cfi_flash_bank *cfi_info = bank->driver_priv;
3118
3119 if (bank->target->state != TARGET_HALTED)
3120 {
3121 LOG_ERROR("Target not halted");
3122 return ERROR_TARGET_NOT_HALTED;
3123 }
3124
3125 if (cfi_info->qry[0] != 'Q')
3126 return ERROR_FLASH_BANK_NOT_PROBED;
3127
3128 switch (cfi_info->pri_id)
3129 {
3130 case 1:
3131 case 3:
3132 return cfi_intel_protect_check(bank);
3133 break;
3134 case 2:
3135 return cfi_spansion_protect_check(bank);
3136 break;
3137 default:
3138 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
3139 break;
3140 }
3141
3142 return ERROR_OK;
3143 }
3144
3145 static int get_cfi_info(struct flash_bank *bank, char *buf, int buf_size)
3146 {
3147 int printed;
3148 struct cfi_flash_bank *cfi_info = bank->driver_priv;
3149
3150 if (cfi_info->qry[0] == 0xff)
3151 {
3152 printed = snprintf(buf, buf_size, "\ncfi flash bank not probed yet\n");
3153 return ERROR_OK;
3154 }
3155
3156 if (cfi_info->not_cfi == 0)
3157 printed = snprintf(buf, buf_size, "\nCFI flash: ");
3158 else
3159 printed = snprintf(buf, buf_size, "\nnon-CFI flash: ");
3160 buf += printed;
3161 buf_size -= printed;
3162
3163 printed = snprintf(buf, buf_size, "mfr: 0x%4.4x, id:0x%4.4x\n\n",
3164 cfi_info->manufacturer, cfi_info->device_id);
3165 buf += printed;
3166 buf_size -= printed;
3167
3168 printed = snprintf(buf, buf_size, "qry: '%c%c%c', pri_id: 0x%4.4x, pri_addr: "
3169 "0x%4.4x, alt_id: 0x%4.4x, alt_addr: 0x%4.4x\n",
3170 cfi_info->qry[0], cfi_info->qry[1], cfi_info->qry[2],
3171 cfi_info->pri_id, cfi_info->pri_addr, cfi_info->alt_id, cfi_info->alt_addr);
3172 buf += printed;
3173 buf_size -= printed;
3174
3175 printed = snprintf(buf, buf_size, "Vcc min: %x.%x, Vcc max: %x.%x, "
3176 "Vpp min: %u.%x, Vpp max: %u.%x\n",
3177 (cfi_info->vcc_min & 0xf0) >> 4, cfi_info->vcc_min & 0x0f,
3178 (cfi_info->vcc_max & 0xf0) >> 4, cfi_info->vcc_max & 0x0f,
3179 (cfi_info->vpp_min & 0xf0) >> 4, cfi_info->vpp_min & 0x0f,
3180 (cfi_info->vpp_max & 0xf0) >> 4, cfi_info->vpp_max & 0x0f);
3181 buf += printed;
3182 buf_size -= printed;
3183
3184 printed = snprintf(buf, buf_size, "typ. word write timeout: %u us, "
3185 "typ. buf write timeout: %u us, "
3186 "typ. block erase timeout: %u ms, "
3187 "typ. chip erase timeout: %u ms\n",
3188 1 << cfi_info->word_write_timeout_typ,
3189 1 << cfi_info->buf_write_timeout_typ,
3190 1 << cfi_info->block_erase_timeout_typ,
3191 1 << cfi_info->chip_erase_timeout_typ);
3192 buf += printed;
3193 buf_size -= printed;
3194
3195 printed = snprintf(buf, buf_size, "max. word write timeout: %u us, "
3196 "max. buf write timeout: %u us, max. "
3197 "block erase timeout: %u ms, max. chip erase timeout: %u ms\n",
3198 (1 << cfi_info->word_write_timeout_max) * (1 << cfi_info->word_write_timeout_typ),
3199 (1 << cfi_info->buf_write_timeout_max) * (1 << cfi_info->buf_write_timeout_typ),
3200 (1 << cfi_info->block_erase_timeout_max) * (1 << cfi_info->block_erase_timeout_typ),
3201 (1 << cfi_info->chip_erase_timeout_max) * (1 << cfi_info->chip_erase_timeout_typ));
3202 buf += printed;
3203 buf_size -= printed;
3204
3205 printed = snprintf(buf, buf_size, "size: 0x%" PRIx32 ", interface desc: %i, "
3206 "max buffer write size: 0x%x\n",
3207 cfi_info->dev_size,
3208 cfi_info->interface_desc,
3209 1 << cfi_info->max_buf_write_size);
3210 buf += printed;
3211 buf_size -= printed;
3212
3213 switch (cfi_info->pri_id)
3214 {
3215 case 1:
3216 case 3:
3217 cfi_intel_info(bank, buf, buf_size);
3218 break;
3219 case 2:
3220 cfi_spansion_info(bank, buf, buf_size);
3221 break;
3222 default:
3223 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
3224 break;
3225 }
3226
3227 return ERROR_OK;
3228 }
3229
3230 static void cfi_fixup_0002_write_buffer(struct flash_bank *bank, void *param)
3231 {
3232 struct cfi_flash_bank *cfi_info = bank->driver_priv;
3233
3234 /* disable write buffer for M29W128G */
3235 cfi_info->buf_write_timeout_typ = 0;
3236 }
3237
3238 struct flash_driver cfi_flash = {
3239 .name = "cfi",
3240 .flash_bank_command = cfi_flash_bank_command,
3241 .erase = cfi_erase,
3242 .protect = cfi_protect,
3243 .write = cfi_write,
3244 .read = cfi_read,
3245 .probe = cfi_probe,
3246 .auto_probe = cfi_auto_probe,
3247 /* FIXME: access flash at bus_width size */
3248 .erase_check = default_flash_blank_check,
3249 .protect_check = cfi_protect_check,
3250 .info = get_cfi_info,
3251 };

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)