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

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)