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

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)