psoc4: support for Cypress PSoC 41xx/42xx family
[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 static uint32_t cfi_command_val(struct flash_bank *bank, uint8_t cmd)
1107 {
1108 struct target *target = bank->target;
1109
1110 uint8_t buf[CFI_MAX_BUS_WIDTH];
1111 cfi_command(bank, cmd, buf);
1112 switch (bank->bus_width) {
1113 case 1:
1114 return buf[0];
1115 break;
1116 case 2:
1117 return target_buffer_get_u16(target, buf);
1118 break;
1119 case 4:
1120 return target_buffer_get_u32(target, buf);
1121 break;
1122 default:
1123 LOG_ERROR("Unsupported bank buswidth %d, can't do block memory writes",
1124 bank->bus_width);
1125 return 0;
1126 }
1127 }
1128
1129 static int cfi_intel_write_block(struct flash_bank *bank, const uint8_t *buffer,
1130 uint32_t address, uint32_t count)
1131 {
1132 struct target *target = bank->target;
1133 struct reg_param reg_params[7];
1134 struct arm_algorithm arm_algo;
1135 struct working_area *write_algorithm;
1136 struct working_area *source = NULL;
1137 uint32_t buffer_size = 32768;
1138 uint32_t write_command_val, busy_pattern_val, error_pattern_val;
1139
1140 /* algorithm register usage:
1141 * r0: source address (in RAM)
1142 * r1: target address (in Flash)
1143 * r2: count
1144 * r3: flash write command
1145 * r4: status byte (returned to host)
1146 * r5: busy test pattern
1147 * r6: error test pattern
1148 */
1149
1150 /* see contib/loaders/flash/armv4_5_cfi_intel_32.s for src */
1151 static const uint32_t word_32_code[] = {
1152 0xe4904004, /* loop: ldr r4, [r0], #4 */
1153 0xe5813000, /* str r3, [r1] */
1154 0xe5814000, /* str r4, [r1] */
1155 0xe5914000, /* busy: ldr r4, [r1] */
1156 0xe0047005, /* and r7, r4, r5 */
1157 0xe1570005, /* cmp r7, r5 */
1158 0x1afffffb, /* bne busy */
1159 0xe1140006, /* tst r4, r6 */
1160 0x1a000003, /* bne done */
1161 0xe2522001, /* subs r2, r2, #1 */
1162 0x0a000001, /* beq done */
1163 0xe2811004, /* add r1, r1 #4 */
1164 0xeafffff2, /* b loop */
1165 0xeafffffe /* done: b -2 */
1166 };
1167
1168 /* see contib/loaders/flash/armv4_5_cfi_intel_16.s for src */
1169 static const uint32_t word_16_code[] = {
1170 0xe0d040b2, /* loop: ldrh r4, [r0], #2 */
1171 0xe1c130b0, /* strh r3, [r1] */
1172 0xe1c140b0, /* strh r4, [r1] */
1173 0xe1d140b0, /* busy ldrh r4, [r1] */
1174 0xe0047005, /* and r7, r4, r5 */
1175 0xe1570005, /* cmp r7, r5 */
1176 0x1afffffb, /* bne busy */
1177 0xe1140006, /* tst r4, r6 */
1178 0x1a000003, /* bne done */
1179 0xe2522001, /* subs r2, r2, #1 */
1180 0x0a000001, /* beq done */
1181 0xe2811002, /* add r1, r1 #2 */
1182 0xeafffff2, /* b loop */
1183 0xeafffffe /* done: b -2 */
1184 };
1185
1186 /* see contib/loaders/flash/armv4_5_cfi_intel_8.s for src */
1187 static const uint32_t word_8_code[] = {
1188 0xe4d04001, /* loop: ldrb r4, [r0], #1 */
1189 0xe5c13000, /* strb r3, [r1] */
1190 0xe5c14000, /* strb r4, [r1] */
1191 0xe5d14000, /* busy ldrb r4, [r1] */
1192 0xe0047005, /* and r7, r4, r5 */
1193 0xe1570005, /* cmp r7, r5 */
1194 0x1afffffb, /* bne busy */
1195 0xe1140006, /* tst r4, r6 */
1196 0x1a000003, /* bne done */
1197 0xe2522001, /* subs r2, r2, #1 */
1198 0x0a000001, /* beq done */
1199 0xe2811001, /* add r1, r1 #1 */
1200 0xeafffff2, /* b loop */
1201 0xeafffffe /* done: b -2 */
1202 };
1203 uint8_t target_code[4*CFI_MAX_INTEL_CODESIZE];
1204 const uint32_t *target_code_src;
1205 uint32_t target_code_size;
1206 int retval = ERROR_OK;
1207
1208 /* check we have a supported arch */
1209 if (is_arm(target_to_arm(target))) {
1210 /* All other ARM CPUs have 32 bit instructions */
1211 arm_algo.common_magic = ARM_COMMON_MAGIC;
1212 arm_algo.core_mode = ARM_MODE_SVC;
1213 arm_algo.core_state = ARM_STATE_ARM;
1214 } else {
1215 LOG_ERROR("Unknown architecture");
1216 return ERROR_FAIL;
1217 }
1218
1219 cfi_intel_clear_status_register(bank);
1220
1221 /* If we are setting up the write_algorith, we need target_code_src
1222 * if not we only need target_code_size. */
1223
1224 /* However, we don't want to create multiple code paths, so we
1225 * do the unnecessary evaluation of target_code_src, which the
1226 * compiler will probably nicely optimize away if not needed */
1227
1228 /* prepare algorithm code for target endian */
1229 switch (bank->bus_width) {
1230 case 1:
1231 target_code_src = word_8_code;
1232 target_code_size = sizeof(word_8_code);
1233 break;
1234 case 2:
1235 target_code_src = word_16_code;
1236 target_code_size = sizeof(word_16_code);
1237 break;
1238 case 4:
1239 target_code_src = word_32_code;
1240 target_code_size = sizeof(word_32_code);
1241 break;
1242 default:
1243 LOG_ERROR("Unsupported bank buswidth %d, can't do block memory writes",
1244 bank->bus_width);
1245 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1246 }
1247
1248 /* flash write code */
1249 if (target_code_size > sizeof(target_code)) {
1250 LOG_WARNING("Internal error - target code buffer to small. "
1251 "Increase CFI_MAX_INTEL_CODESIZE and recompile.");
1252 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1253 }
1254
1255 target_buffer_set_u32_array(target, target_code, target_code_size / 4, target_code_src);
1256
1257 /* Get memory for block write handler */
1258 retval = target_alloc_working_area(target,
1259 target_code_size,
1260 &write_algorithm);
1261 if (retval != ERROR_OK) {
1262 LOG_WARNING("No working area available, can't do block memory writes");
1263 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1264 }
1265 ;
1266
1267 /* write algorithm code to working area */
1268 retval = target_write_buffer(target, write_algorithm->address,
1269 target_code_size, target_code);
1270 if (retval != ERROR_OK) {
1271 LOG_ERROR("Unable to write block write code to target");
1272 goto cleanup;
1273 }
1274
1275 /* Get a workspace buffer for the data to flash starting with 32k size.
1276 * Half size until buffer would be smaller 256 Bytes then fail back */
1277 /* FIXME Why 256 bytes, why not 32 bytes (smallest flash write page */
1278 while (target_alloc_working_area_try(target, buffer_size, &source) != ERROR_OK) {
1279 buffer_size /= 2;
1280 if (buffer_size <= 256) {
1281 LOG_WARNING(
1282 "no large enough working area available, can't do block memory writes");
1283 retval = ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1284 goto cleanup;
1285 }
1286 }
1287 ;
1288
1289 /* setup algo registers */
1290 init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);
1291 init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);
1292 init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);
1293 init_reg_param(&reg_params[3], "r3", 32, PARAM_OUT);
1294 init_reg_param(&reg_params[4], "r4", 32, PARAM_IN);
1295 init_reg_param(&reg_params[5], "r5", 32, PARAM_OUT);
1296 init_reg_param(&reg_params[6], "r6", 32, PARAM_OUT);
1297
1298 /* prepare command and status register patterns */
1299 write_command_val = cfi_command_val(bank, 0x40);
1300 busy_pattern_val = cfi_command_val(bank, 0x80);
1301 error_pattern_val = cfi_command_val(bank, 0x7e);
1302
1303 LOG_DEBUG("Using target buffer at 0x%08" PRIx32 " and of size 0x%04" PRIx32,
1304 source->address, buffer_size);
1305
1306 /* Programming main loop */
1307 while (count > 0) {
1308 uint32_t thisrun_count = (count > buffer_size) ? buffer_size : count;
1309 uint32_t wsm_error;
1310
1311 retval = target_write_buffer(target, source->address, thisrun_count, buffer);
1312 if (retval != ERROR_OK)
1313 goto cleanup;
1314
1315 buf_set_u32(reg_params[0].value, 0, 32, source->address);
1316 buf_set_u32(reg_params[1].value, 0, 32, address);
1317 buf_set_u32(reg_params[2].value, 0, 32, thisrun_count / bank->bus_width);
1318
1319 buf_set_u32(reg_params[3].value, 0, 32, write_command_val);
1320 buf_set_u32(reg_params[5].value, 0, 32, busy_pattern_val);
1321 buf_set_u32(reg_params[6].value, 0, 32, error_pattern_val);
1322
1323 LOG_DEBUG("Write 0x%04" PRIx32 " bytes to flash at 0x%08" PRIx32,
1324 thisrun_count, address);
1325
1326 /* Execute algorithm, assume breakpoint for last instruction */
1327 retval = target_run_algorithm(target, 0, NULL, 7, reg_params,
1328 write_algorithm->address,
1329 write_algorithm->address + target_code_size -
1330 sizeof(uint32_t),
1331 10000, /* 10s should be enough for max. 32k of data */
1332 &arm_algo);
1333
1334 /* On failure try a fall back to direct word writes */
1335 if (retval != ERROR_OK) {
1336 cfi_intel_clear_status_register(bank);
1337 LOG_ERROR(
1338 "Execution of flash algorythm failed. Can't fall back. Please report.");
1339 retval = ERROR_FLASH_OPERATION_FAILED;
1340 /* retval = ERROR_TARGET_RESOURCE_NOT_AVAILABLE; */
1341 /* FIXME To allow fall back or recovery, we must save the actual status
1342 * somewhere, so that a higher level code can start recovery. */
1343 goto cleanup;
1344 }
1345
1346 /* Check return value from algo code */
1347 wsm_error = buf_get_u32(reg_params[4].value, 0, 32) & error_pattern_val;
1348 if (wsm_error) {
1349 /* read status register (outputs debug information) */
1350 uint8_t status;
1351 cfi_intel_wait_status_busy(bank, 100, &status);
1352 cfi_intel_clear_status_register(bank);
1353 retval = ERROR_FLASH_OPERATION_FAILED;
1354 goto cleanup;
1355 }
1356
1357 buffer += thisrun_count;
1358 address += thisrun_count;
1359 count -= thisrun_count;
1360
1361 keep_alive();
1362 }
1363
1364 /* free up resources */
1365 cleanup:
1366 if (source)
1367 target_free_working_area(target, source);
1368
1369 target_free_working_area(target, write_algorithm);
1370
1371 destroy_reg_param(&reg_params[0]);
1372 destroy_reg_param(&reg_params[1]);
1373 destroy_reg_param(&reg_params[2]);
1374 destroy_reg_param(&reg_params[3]);
1375 destroy_reg_param(&reg_params[4]);
1376 destroy_reg_param(&reg_params[5]);
1377 destroy_reg_param(&reg_params[6]);
1378
1379 return retval;
1380 }
1381
1382 static int cfi_spansion_write_block_mips(struct flash_bank *bank, const uint8_t *buffer,
1383 uint32_t address, uint32_t count)
1384 {
1385 struct cfi_flash_bank *cfi_info = bank->driver_priv;
1386 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
1387 struct target *target = bank->target;
1388 struct reg_param reg_params[10];
1389 struct mips32_algorithm mips32_info;
1390 struct working_area *write_algorithm;
1391 struct working_area *source;
1392 uint32_t buffer_size = 32768;
1393 uint32_t status;
1394 int retval = ERROR_OK;
1395
1396 /* input parameters -
1397 * 4 A0 = source address
1398 * 5 A1 = destination address
1399 * 6 A2 = number of writes
1400 * 7 A3 = flash write command
1401 * 8 T0 = constant to mask DQ7 bits (also used for Dq5 with shift)
1402 * output parameters -
1403 * 9 T1 = 0x80 ok 0x00 bad
1404 * temp registers -
1405 * 10 T2 = value read from flash to test status
1406 * 11 T3 = holding register
1407 * unlock registers -
1408 * 12 T4 = unlock1_addr
1409 * 13 T5 = unlock1_cmd
1410 * 14 T6 = unlock2_addr
1411 * 15 T7 = unlock2_cmd */
1412
1413 static const uint32_t mips_word_16_code[] = {
1414 /* start: */
1415 MIPS32_LHU(9, 0, 4), /* lhu $t1, ($a0) ; out = &saddr */
1416 MIPS32_ADDI(4, 4, 2), /* addi $a0, $a0, 2 ; saddr += 2 */
1417 MIPS32_SH(13, 0, 12), /* sh $t5, ($t4) ; *fl_unl_addr1 = fl_unl_cmd1 */
1418 MIPS32_SH(15, 0, 14), /* sh $t7, ($t6) ; *fl_unl_addr2 = fl_unl_cmd2 */
1419 MIPS32_SH(7, 0, 12), /* sh $a3, ($t4) ; *fl_unl_addr1 = fl_write_cmd */
1420 MIPS32_SH(9, 0, 5), /* sh $t1, ($a1) ; *daddr = out */
1421 MIPS32_NOP, /* nop */
1422 /* busy: */
1423 MIPS32_LHU(10, 0, 5), /* lhu $t2, ($a1) ; temp1 = *daddr */
1424 MIPS32_XOR(11, 9, 10), /* xor $t3, $a0, $t2 ; temp2 = out ^ temp1; */
1425 MIPS32_AND(11, 8, 11), /* and $t3, $t0, $t3 ; temp2 = temp2 & DQ7mask */
1426 MIPS32_BNE(11, 8, 13), /* bne $t3, $t0, cont ; if (temp2 != DQ7mask) goto cont */
1427 MIPS32_NOP, /* nop */
1428
1429 MIPS32_SRL(10, 8, 2), /* srl $t2,$t0,2 ; temp1 = DQ7mask >> 2 */
1430 MIPS32_AND(11, 10, 11), /* and $t3, $t2, $t3 ; temp2 = temp2 & temp1 */
1431 MIPS32_BNE(11, 10, NEG16(8)), /* bne $t3, $t2, busy ; if (temp2 != temp1) goto busy */
1432 MIPS32_NOP, /* nop */
1433
1434 MIPS32_LHU(10, 0, 5), /* lhu $t2, ($a1) ; temp1 = *daddr */
1435 MIPS32_XOR(11, 9, 10), /* xor $t3, $a0, $t2 ; temp2 = out ^ temp1; */
1436 MIPS32_AND(11, 8, 11), /* and $t3, $t0, $t3 ; temp2 = temp2 & DQ7mask */
1437 MIPS32_BNE(11, 8, 4), /* bne $t3, $t0, cont ; if (temp2 != DQ7mask) goto cont */
1438 MIPS32_NOP, /* nop */
1439
1440 MIPS32_XOR(9, 9, 9), /* xor $t1, $t1, $t1 ; out = 0 */
1441 MIPS32_BEQ(9, 0, 11), /* beq $t1, $zero, done ; if (out == 0) goto done */
1442 MIPS32_NOP, /* nop */
1443 /* cont: */
1444 MIPS32_ADDI(6, 6, NEG16(1)), /* addi, $a2, $a2, -1 ; numwrites-- */
1445 MIPS32_BNE(6, 0, 5), /* bne $a2, $zero, cont2 ; if (numwrite != 0) goto cont2 */
1446 MIPS32_NOP, /* nop */
1447
1448 MIPS32_LUI(9, 0), /* lui $t1, 0 */
1449 MIPS32_ORI(9, 9, 0x80), /* ori $t1, $t1, 0x80 ; out = 0x80 */
1450
1451 MIPS32_B(4), /* b done ; goto done */
1452 MIPS32_NOP, /* nop */
1453 /* cont2: */
1454 MIPS32_ADDI(5, 5, 2), /* addi $a0, $a0, 2 ; daddr += 2 */
1455 MIPS32_B(NEG16(33)), /* b start ; goto start */
1456 MIPS32_NOP, /* nop */
1457 /* done: */
1458 MIPS32_SDBBP, /* sdbbp ; break(); */
1459 };
1460
1461 mips32_info.common_magic = MIPS32_COMMON_MAGIC;
1462 mips32_info.isa_mode = MIPS32_ISA_MIPS32;
1463
1464 int target_code_size = 0;
1465 const uint32_t *target_code_src = NULL;
1466
1467 switch (bank->bus_width) {
1468 case 2:
1469 /* Check for DQ5 support */
1470 if (cfi_info->status_poll_mask & (1 << 5)) {
1471 target_code_src = mips_word_16_code;
1472 target_code_size = sizeof(mips_word_16_code);
1473 } else {
1474 LOG_ERROR("Need DQ5 support");
1475 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1476 /* target_code_src = mips_word_16_code_dq7only; */
1477 /* target_code_size = sizeof(mips_word_16_code_dq7only); */
1478 }
1479 break;
1480 default:
1481 LOG_ERROR("Unsupported bank buswidth %d, can't do block memory writes",
1482 bank->bus_width);
1483 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1484 }
1485
1486 /* flash write code */
1487 uint8_t *target_code;
1488
1489 /* convert bus-width dependent algorithm code to correct endianness */
1490 target_code = malloc(target_code_size);
1491 if (target_code == NULL) {
1492 LOG_ERROR("Out of memory");
1493 return ERROR_FAIL;
1494 }
1495
1496 target_buffer_set_u32_array(target, target_code, target_code_size / 4, target_code_src);
1497
1498 /* allocate working area */
1499 retval = target_alloc_working_area(target, target_code_size,
1500 &write_algorithm);
1501 if (retval != ERROR_OK) {
1502 free(target_code);
1503 return retval;
1504 }
1505
1506 /* write algorithm code to working area */
1507 retval = target_write_buffer(target, write_algorithm->address,
1508 target_code_size, target_code);
1509 if (retval != ERROR_OK) {
1510 free(target_code);
1511 return retval;
1512 }
1513
1514 free(target_code);
1515
1516 /* the following code still assumes target code is fixed 24*4 bytes */
1517
1518 while (target_alloc_working_area_try(target, buffer_size, &source) != ERROR_OK) {
1519 buffer_size /= 2;
1520 if (buffer_size <= 256) {
1521 /* we already allocated the writing code, but failed to get a
1522 * buffer, free the algorithm */
1523 target_free_working_area(target, write_algorithm);
1524
1525 LOG_WARNING(
1526 "not enough working area available, can't do block memory writes");
1527 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1528 }
1529 }
1530 ;
1531
1532 init_reg_param(&reg_params[0], "a0", 32, PARAM_OUT);
1533 init_reg_param(&reg_params[1], "a1", 32, PARAM_OUT);
1534 init_reg_param(&reg_params[2], "a2", 32, PARAM_OUT);
1535 init_reg_param(&reg_params[3], "a3", 32, PARAM_OUT);
1536 init_reg_param(&reg_params[4], "t0", 32, PARAM_OUT);
1537 init_reg_param(&reg_params[5], "t1", 32, PARAM_IN);
1538 init_reg_param(&reg_params[6], "t4", 32, PARAM_OUT);
1539 init_reg_param(&reg_params[7], "t5", 32, PARAM_OUT);
1540 init_reg_param(&reg_params[8], "t6", 32, PARAM_OUT);
1541 init_reg_param(&reg_params[9], "t7", 32, PARAM_OUT);
1542
1543 while (count > 0) {
1544 uint32_t thisrun_count = (count > buffer_size) ? buffer_size : count;
1545
1546 retval = target_write_buffer(target, source->address, thisrun_count, buffer);
1547 if (retval != ERROR_OK)
1548 break;
1549
1550 buf_set_u32(reg_params[0].value, 0, 32, source->address);
1551 buf_set_u32(reg_params[1].value, 0, 32, address);
1552 buf_set_u32(reg_params[2].value, 0, 32, thisrun_count / bank->bus_width);
1553 buf_set_u32(reg_params[3].value, 0, 32, cfi_command_val(bank, 0xA0));
1554 buf_set_u32(reg_params[4].value, 0, 32, cfi_command_val(bank, 0x80));
1555 buf_set_u32(reg_params[6].value, 0, 32, flash_address(bank, 0, pri_ext->_unlock1));
1556 buf_set_u32(reg_params[7].value, 0, 32, 0xaaaaaaaa);
1557 buf_set_u32(reg_params[8].value, 0, 32, flash_address(bank, 0, pri_ext->_unlock2));
1558 buf_set_u32(reg_params[9].value, 0, 32, 0x55555555);
1559
1560 retval = target_run_algorithm(target, 0, NULL, 10, reg_params,
1561 write_algorithm->address,
1562 write_algorithm->address + ((target_code_size) - 4),
1563 10000, &mips32_info);
1564 if (retval != ERROR_OK)
1565 break;
1566
1567 status = buf_get_u32(reg_params[5].value, 0, 32);
1568 if (status != 0x80) {
1569 LOG_ERROR("flash write block failed status: 0x%" PRIx32, status);
1570 retval = ERROR_FLASH_OPERATION_FAILED;
1571 break;
1572 }
1573
1574 buffer += thisrun_count;
1575 address += thisrun_count;
1576 count -= thisrun_count;
1577 }
1578
1579 target_free_all_working_areas(target);
1580
1581 destroy_reg_param(&reg_params[0]);
1582 destroy_reg_param(&reg_params[1]);
1583 destroy_reg_param(&reg_params[2]);
1584 destroy_reg_param(&reg_params[3]);
1585 destroy_reg_param(&reg_params[4]);
1586 destroy_reg_param(&reg_params[5]);
1587 destroy_reg_param(&reg_params[6]);
1588 destroy_reg_param(&reg_params[7]);
1589 destroy_reg_param(&reg_params[8]);
1590 destroy_reg_param(&reg_params[9]);
1591
1592 return retval;
1593 }
1594
1595 static int cfi_spansion_write_block(struct flash_bank *bank, const uint8_t *buffer,
1596 uint32_t address, uint32_t count)
1597 {
1598 struct cfi_flash_bank *cfi_info = bank->driver_priv;
1599 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
1600 struct target *target = bank->target;
1601 struct reg_param reg_params[10];
1602 void *arm_algo;
1603 struct arm_algorithm armv4_5_algo;
1604 struct armv7m_algorithm armv7m_algo;
1605 struct working_area *write_algorithm;
1606 struct working_area *source;
1607 uint32_t buffer_size = 32768;
1608 uint32_t status;
1609 int retval = ERROR_OK;
1610
1611 /* input parameters -
1612 * R0 = source address
1613 * R1 = destination address
1614 * R2 = number of writes
1615 * R3 = flash write command
1616 * R4 = constant to mask DQ7 bits (also used for Dq5 with shift)
1617 * output parameters -
1618 * R5 = 0x80 ok 0x00 bad
1619 * temp registers -
1620 * R6 = value read from flash to test status
1621 * R7 = holding register
1622 * unlock registers -
1623 * R8 = unlock1_addr
1624 * R9 = unlock1_cmd
1625 * R10 = unlock2_addr
1626 * R11 = unlock2_cmd */
1627
1628 /* see contib/loaders/flash/armv4_5_cfi_span_32.s for src */
1629 static const uint32_t armv4_5_word_32_code[] = {
1630 /* 00008100 <sp_32_code>: */
1631 0xe4905004, /* ldr r5, [r0], #4 */
1632 0xe5889000, /* str r9, [r8] */
1633 0xe58ab000, /* str r11, [r10] */
1634 0xe5883000, /* str r3, [r8] */
1635 0xe5815000, /* str r5, [r1] */
1636 0xe1a00000, /* nop */
1637 /* 00008110 <sp_32_busy>: */
1638 0xe5916000, /* ldr r6, [r1] */
1639 0xe0257006, /* eor r7, r5, r6 */
1640 0xe0147007, /* ands r7, r4, r7 */
1641 0x0a000007, /* beq 8140 <sp_32_cont> ; b if DQ7 == Data7 */
1642 0xe0166124, /* ands r6, r6, r4, lsr #2 */
1643 0x0afffff9, /* beq 8110 <sp_32_busy> ; b if DQ5 low */
1644 0xe5916000, /* ldr r6, [r1] */
1645 0xe0257006, /* eor r7, r5, r6 */
1646 0xe0147007, /* ands r7, r4, r7 */
1647 0x0a000001, /* beq 8140 <sp_32_cont> ; b if DQ7 == Data7 */
1648 0xe3a05000, /* mov r5, #0 ; 0x0 - return 0x00, error */
1649 0x1a000004, /* bne 8154 <sp_32_done> */
1650 /* 00008140 <sp_32_cont>: */
1651 0xe2522001, /* subs r2, r2, #1 ; 0x1 */
1652 0x03a05080, /* moveq r5, #128 ; 0x80 */
1653 0x0a000001, /* beq 8154 <sp_32_done> */
1654 0xe2811004, /* add r1, r1, #4 ; 0x4 */
1655 0xeaffffe8, /* b 8100 <sp_32_code> */
1656 /* 00008154 <sp_32_done>: */
1657 0xeafffffe /* b 8154 <sp_32_done> */
1658 };
1659
1660 /* see contib/loaders/flash/armv4_5_cfi_span_16.s for src */
1661 static const uint32_t armv4_5_word_16_code[] = {
1662 /* 00008158 <sp_16_code>: */
1663 0xe0d050b2, /* ldrh r5, [r0], #2 */
1664 0xe1c890b0, /* strh r9, [r8] */
1665 0xe1cab0b0, /* strh r11, [r10] */
1666 0xe1c830b0, /* strh r3, [r8] */
1667 0xe1c150b0, /* strh r5, [r1] */
1668 0xe1a00000, /* nop (mov r0,r0) */
1669 /* 00008168 <sp_16_busy>: */
1670 0xe1d160b0, /* ldrh r6, [r1] */
1671 0xe0257006, /* eor r7, r5, r6 */
1672 0xe0147007, /* ands r7, r4, r7 */
1673 0x0a000007, /* beq 8198 <sp_16_cont> */
1674 0xe0166124, /* ands r6, r6, r4, lsr #2 */
1675 0x0afffff9, /* beq 8168 <sp_16_busy> */
1676 0xe1d160b0, /* ldrh r6, [r1] */
1677 0xe0257006, /* eor r7, r5, r6 */
1678 0xe0147007, /* ands r7, r4, r7 */
1679 0x0a000001, /* beq 8198 <sp_16_cont> */
1680 0xe3a05000, /* mov r5, #0 ; 0x0 */
1681 0x1a000004, /* bne 81ac <sp_16_done> */
1682 /* 00008198 <sp_16_cont>: */
1683 0xe2522001, /* subs r2, r2, #1 ; 0x1 */
1684 0x03a05080, /* moveq r5, #128 ; 0x80 */
1685 0x0a000001, /* beq 81ac <sp_16_done> */
1686 0xe2811002, /* add r1, r1, #2 ; 0x2 */
1687 0xeaffffe8, /* b 8158 <sp_16_code> */
1688 /* 000081ac <sp_16_done>: */
1689 0xeafffffe /* b 81ac <sp_16_done> */
1690 };
1691
1692 /* see contrib/loaders/flash/armv7m_cfi_span_16.s for src */
1693 static const uint32_t armv7m_word_16_code[] = {
1694 0x5B02F830,
1695 0x9000F8A8,
1696 0xB000F8AA,
1697 0x3000F8A8,
1698 0xBF00800D,
1699 0xEA85880E,
1700 0x40270706,
1701 0xEA16D00A,
1702 0xD0F70694,
1703 0xEA85880E,
1704 0x40270706,
1705 0xF04FD002,
1706 0xD1070500,
1707 0xD0023A01,
1708 0x0102F101,
1709 0xF04FE7E0,
1710 0xE7FF0580,
1711 0x0000BE00
1712 };
1713
1714 /* see contrib/loaders/flash/armv7m_cfi_span_16_dq7.s for src */
1715 static const uint32_t armv7m_word_16_code_dq7only[] = {
1716 /* 00000000 <code>: */
1717 0x5B02F830, /* ldrh.w r5, [r0], #2 */
1718 0x9000F8A8, /* strh.w r9, [r8] */
1719 0xB000F8AA, /* strh.w fp, [sl] */
1720 0x3000F8A8, /* strh.w r3, [r8] */
1721 0xBF00800D, /* strh r5, [r1, #0] */
1722 /* nop */
1723
1724 /* 00000014 <busy>: */
1725 0xEA85880E, /* ldrh r6, [r1, #0] */
1726 /* eor.w r7, r5, r6 */
1727 0x40270706, /* ands r7, r4 */
1728 0x3A01D1FA, /* bne.n 14 <busy> */
1729 /* subs r2, #1 */
1730 0xF101D002, /* beq.n 28 <success> */
1731 0xE7EB0102, /* add.w r1, r1, #2 */
1732 /* b.n 0 <code> */
1733
1734 /* 00000028 <success>: */
1735 0x0580F04F, /* mov.w r5, #128 */
1736 0xBF00E7FF, /* b.n 30 <done> */
1737 /* nop (for alignment purposes) */
1738
1739 /* 00000030 <done>: */
1740 0x0000BE00 /* bkpt 0x0000 */
1741 };
1742
1743 /* see contrib/loaders/flash/armv4_5_cfi_span_16_dq7.s for src */
1744 static const uint32_t armv4_5_word_16_code_dq7only[] = {
1745 /* <sp_16_code>: */
1746 0xe0d050b2, /* ldrh r5, [r0], #2 */
1747 0xe1c890b0, /* strh r9, [r8] */
1748 0xe1cab0b0, /* strh r11, [r10] */
1749 0xe1c830b0, /* strh r3, [r8] */
1750 0xe1c150b0, /* strh r5, [r1] */
1751 0xe1a00000, /* nop (mov r0,r0) */
1752 /* <sp_16_busy>: */
1753 0xe1d160b0, /* ldrh r6, [r1] */
1754 0xe0257006, /* eor r7, r5, r6 */
1755 0xe2177080, /* ands r7, #0x80 */
1756 0x1afffffb, /* bne 8168 <sp_16_busy> */
1757 /* */
1758 0xe2522001, /* subs r2, r2, #1 ; 0x1 */
1759 0x03a05080, /* moveq r5, #128 ; 0x80 */
1760 0x0a000001, /* beq 81ac <sp_16_done> */
1761 0xe2811002, /* add r1, r1, #2 ; 0x2 */
1762 0xeafffff0, /* b 8158 <sp_16_code> */
1763 /* 000081ac <sp_16_done>: */
1764 0xeafffffe /* b 81ac <sp_16_done> */
1765 };
1766
1767 /* see contrib/loaders/flash/armv4_5_cfi_span_8.s for src */
1768 static const uint32_t armv4_5_word_8_code[] = {
1769 /* 000081b0 <sp_16_code_end>: */
1770 0xe4d05001, /* ldrb r5, [r0], #1 */
1771 0xe5c89000, /* strb r9, [r8] */
1772 0xe5cab000, /* strb r11, [r10] */
1773 0xe5c83000, /* strb r3, [r8] */
1774 0xe5c15000, /* strb r5, [r1] */
1775 0xe1a00000, /* nop (mov r0,r0) */
1776 /* 000081c0 <sp_8_busy>: */
1777 0xe5d16000, /* ldrb r6, [r1] */
1778 0xe0257006, /* eor r7, r5, r6 */
1779 0xe0147007, /* ands r7, r4, r7 */
1780 0x0a000007, /* beq 81f0 <sp_8_cont> */
1781 0xe0166124, /* ands r6, r6, r4, lsr #2 */
1782 0x0afffff9, /* beq 81c0 <sp_8_busy> */
1783 0xe5d16000, /* ldrb r6, [r1] */
1784 0xe0257006, /* eor r7, r5, r6 */
1785 0xe0147007, /* ands r7, r4, r7 */
1786 0x0a000001, /* beq 81f0 <sp_8_cont> */
1787 0xe3a05000, /* mov r5, #0 ; 0x0 */
1788 0x1a000004, /* bne 8204 <sp_8_done> */
1789 /* 000081f0 <sp_8_cont>: */
1790 0xe2522001, /* subs r2, r2, #1 ; 0x1 */
1791 0x03a05080, /* moveq r5, #128 ; 0x80 */
1792 0x0a000001, /* beq 8204 <sp_8_done> */
1793 0xe2811001, /* add r1, r1, #1 ; 0x1 */
1794 0xeaffffe8, /* b 81b0 <sp_16_code_end> */
1795 /* 00008204 <sp_8_done>: */
1796 0xeafffffe /* b 8204 <sp_8_done> */
1797 };
1798
1799 if (strncmp(target_type_name(target), "mips_m4k", 8) == 0)
1800 return cfi_spansion_write_block_mips(bank, buffer, address, count);
1801
1802 if (is_armv7m(target_to_armv7m(target))) { /* armv7m target */
1803 armv7m_algo.common_magic = ARMV7M_COMMON_MAGIC;
1804 armv7m_algo.core_mode = ARM_MODE_THREAD;
1805 arm_algo = &armv7m_algo;
1806 } else if (is_arm(target_to_arm(target))) {
1807 /* All other ARM CPUs have 32 bit instructions */
1808 armv4_5_algo.common_magic = ARM_COMMON_MAGIC;
1809 armv4_5_algo.core_mode = ARM_MODE_SVC;
1810 armv4_5_algo.core_state = ARM_STATE_ARM;
1811 arm_algo = &armv4_5_algo;
1812 } else {
1813 LOG_ERROR("Unknown architecture");
1814 return ERROR_FAIL;
1815 }
1816
1817 int target_code_size = 0;
1818 const uint32_t *target_code_src = NULL;
1819
1820 switch (bank->bus_width) {
1821 case 1:
1822 if (is_armv7m(target_to_armv7m(target))) {
1823 LOG_ERROR("Unknown ARM architecture");
1824 return ERROR_FAIL;
1825 }
1826 target_code_src = armv4_5_word_8_code;
1827 target_code_size = sizeof(armv4_5_word_8_code);
1828 break;
1829 case 2:
1830 /* Check for DQ5 support */
1831 if (cfi_info->status_poll_mask & (1 << 5)) {
1832 if (is_armv7m(target_to_armv7m(target))) {
1833 /* armv7m target */
1834 target_code_src = armv7m_word_16_code;
1835 target_code_size = sizeof(armv7m_word_16_code);
1836 } else { /* armv4_5 target */
1837 target_code_src = armv4_5_word_16_code;
1838 target_code_size = sizeof(armv4_5_word_16_code);
1839 }
1840 } else {
1841 /* No DQ5 support. Use DQ7 DATA# polling only. */
1842 if (is_armv7m(target_to_armv7m(target))) {
1843 /* armv7m target */
1844 target_code_src = armv7m_word_16_code_dq7only;
1845 target_code_size = sizeof(armv7m_word_16_code_dq7only);
1846 } else { /* armv4_5 target */
1847 target_code_src = armv4_5_word_16_code_dq7only;
1848 target_code_size = sizeof(armv4_5_word_16_code_dq7only);
1849 }
1850 }
1851 break;
1852 case 4:
1853 if (is_armv7m(target_to_armv7m(target))) {
1854 LOG_ERROR("Unknown ARM architecture");
1855 return ERROR_FAIL;
1856 }
1857 target_code_src = armv4_5_word_32_code;
1858 target_code_size = sizeof(armv4_5_word_32_code);
1859 break;
1860 default:
1861 LOG_ERROR("Unsupported bank buswidth %d, can't do block memory writes",
1862 bank->bus_width);
1863 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1864 }
1865
1866 /* flash write code */
1867 uint8_t *target_code;
1868
1869 /* convert bus-width dependent algorithm code to correct endianness */
1870 target_code = malloc(target_code_size);
1871 if (target_code == NULL) {
1872 LOG_ERROR("Out of memory");
1873 return ERROR_FAIL;
1874 }
1875
1876 target_buffer_set_u32_array(target, target_code, target_code_size / 4, target_code_src);
1877
1878 /* allocate working area */
1879 retval = target_alloc_working_area(target, target_code_size,
1880 &write_algorithm);
1881 if (retval != ERROR_OK) {
1882 free(target_code);
1883 return retval;
1884 }
1885
1886 /* write algorithm code to working area */
1887 retval = target_write_buffer(target, write_algorithm->address,
1888 target_code_size, target_code);
1889 if (retval != ERROR_OK) {
1890 free(target_code);
1891 return retval;
1892 }
1893
1894 free(target_code);
1895
1896 /* the following code still assumes target code is fixed 24*4 bytes */
1897
1898 while (target_alloc_working_area_try(target, buffer_size, &source) != ERROR_OK) {
1899 buffer_size /= 2;
1900 if (buffer_size <= 256) {
1901 /* we already allocated the writing code, but failed to get a
1902 * buffer, free the algorithm */
1903 target_free_working_area(target, write_algorithm);
1904
1905 LOG_WARNING(
1906 "not enough working area available, can't do block memory writes");
1907 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1908 }
1909 }
1910 ;
1911
1912 init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);
1913 init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);
1914 init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);
1915 init_reg_param(&reg_params[3], "r3", 32, PARAM_OUT);
1916 init_reg_param(&reg_params[4], "r4", 32, PARAM_OUT);
1917 init_reg_param(&reg_params[5], "r5", 32, PARAM_IN);
1918 init_reg_param(&reg_params[6], "r8", 32, PARAM_OUT);
1919 init_reg_param(&reg_params[7], "r9", 32, PARAM_OUT);
1920 init_reg_param(&reg_params[8], "r10", 32, PARAM_OUT);
1921 init_reg_param(&reg_params[9], "r11", 32, PARAM_OUT);
1922
1923 while (count > 0) {
1924 uint32_t thisrun_count = (count > buffer_size) ? buffer_size : count;
1925
1926 retval = target_write_buffer(target, source->address, thisrun_count, buffer);
1927 if (retval != ERROR_OK)
1928 break;
1929
1930 buf_set_u32(reg_params[0].value, 0, 32, source->address);
1931 buf_set_u32(reg_params[1].value, 0, 32, address);
1932 buf_set_u32(reg_params[2].value, 0, 32, thisrun_count / bank->bus_width);
1933 buf_set_u32(reg_params[3].value, 0, 32, cfi_command_val(bank, 0xA0));
1934 buf_set_u32(reg_params[4].value, 0, 32, cfi_command_val(bank, 0x80));
1935 buf_set_u32(reg_params[6].value, 0, 32, flash_address(bank, 0, pri_ext->_unlock1));
1936 buf_set_u32(reg_params[7].value, 0, 32, 0xaaaaaaaa);
1937 buf_set_u32(reg_params[8].value, 0, 32, flash_address(bank, 0, pri_ext->_unlock2));
1938 buf_set_u32(reg_params[9].value, 0, 32, 0x55555555);
1939
1940 retval = target_run_algorithm(target, 0, NULL, 10, reg_params,
1941 write_algorithm->address,
1942 write_algorithm->address + ((target_code_size) - 4),
1943 10000, arm_algo);
1944 if (retval != ERROR_OK)
1945 break;
1946
1947 status = buf_get_u32(reg_params[5].value, 0, 32);
1948 if (status != 0x80) {
1949 LOG_ERROR("flash write block failed status: 0x%" PRIx32, status);
1950 retval = ERROR_FLASH_OPERATION_FAILED;
1951 break;
1952 }
1953
1954 buffer += thisrun_count;
1955 address += thisrun_count;
1956 count -= thisrun_count;
1957 }
1958
1959 target_free_all_working_areas(target);
1960
1961 destroy_reg_param(&reg_params[0]);
1962 destroy_reg_param(&reg_params[1]);
1963 destroy_reg_param(&reg_params[2]);
1964 destroy_reg_param(&reg_params[3]);
1965 destroy_reg_param(&reg_params[4]);
1966 destroy_reg_param(&reg_params[5]);
1967 destroy_reg_param(&reg_params[6]);
1968 destroy_reg_param(&reg_params[7]);
1969 destroy_reg_param(&reg_params[8]);
1970 destroy_reg_param(&reg_params[9]);
1971
1972 return retval;
1973 }
1974
1975 static int cfi_intel_write_word(struct flash_bank *bank, uint8_t *word, uint32_t address)
1976 {
1977 int retval;
1978 struct cfi_flash_bank *cfi_info = bank->driver_priv;
1979 struct target *target = bank->target;
1980
1981 cfi_intel_clear_status_register(bank);
1982 retval = cfi_send_command(bank, 0x40, address);
1983 if (retval != ERROR_OK)
1984 return retval;
1985
1986 retval = target_write_memory(target, address, bank->bus_width, 1, word);
1987 if (retval != ERROR_OK)
1988 return retval;
1989
1990 uint8_t status;
1991 retval = cfi_intel_wait_status_busy(bank, cfi_info->word_write_timeout, &status);
1992 if (retval != 0x80) {
1993 retval = cfi_send_command(bank, 0xff, flash_address(bank, 0, 0x0));
1994 if (retval != ERROR_OK)
1995 return retval;
1996
1997 LOG_ERROR("couldn't write word at base 0x%" PRIx32 ", address 0x%" PRIx32,
1998 bank->base, address);
1999 return ERROR_FLASH_OPERATION_FAILED;
2000 }
2001
2002 return ERROR_OK;
2003 }
2004
2005 static int cfi_intel_write_words(struct flash_bank *bank, const uint8_t *word,
2006 uint32_t wordcount, uint32_t address)
2007 {
2008 int retval;
2009 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2010 struct target *target = bank->target;
2011
2012 /* Calculate buffer size and boundary mask
2013 * buffersize is (buffer size per chip) * (number of chips)
2014 * bufferwsize is buffersize in words */
2015 uint32_t buffersize =
2016 (1UL << cfi_info->max_buf_write_size) * (bank->bus_width / bank->chip_width);
2017 uint32_t buffermask = buffersize-1;
2018 uint32_t bufferwsize = buffersize / bank->bus_width;
2019
2020 /* Check for valid range */
2021 if (address & buffermask) {
2022 LOG_ERROR("Write address at base 0x%" PRIx32 ", address 0x%" PRIx32
2023 " not aligned to 2^%d boundary",
2024 bank->base, address, cfi_info->max_buf_write_size);
2025 return ERROR_FLASH_OPERATION_FAILED;
2026 }
2027
2028 /* Check for valid size */
2029 if (wordcount > bufferwsize) {
2030 LOG_ERROR("Number of data words %" PRId32 " exceeds available buffersize %" PRId32,
2031 wordcount, buffersize);
2032 return ERROR_FLASH_OPERATION_FAILED;
2033 }
2034
2035 /* Write to flash buffer */
2036 cfi_intel_clear_status_register(bank);
2037
2038 /* Initiate buffer operation _*/
2039 retval = cfi_send_command(bank, 0xe8, address);
2040 if (retval != ERROR_OK)
2041 return retval;
2042 uint8_t status;
2043 retval = cfi_intel_wait_status_busy(bank, cfi_info->buf_write_timeout, &status);
2044 if (retval != ERROR_OK)
2045 return retval;
2046 if (status != 0x80) {
2047 retval = cfi_send_command(bank, 0xff, flash_address(bank, 0, 0x0));
2048 if (retval != ERROR_OK)
2049 return retval;
2050
2051 LOG_ERROR(
2052 "couldn't start buffer write operation at base 0x%" PRIx32 ", address 0x%" PRIx32,
2053 bank->base,
2054 address);
2055 return ERROR_FLASH_OPERATION_FAILED;
2056 }
2057
2058 /* Write buffer wordcount-1 and data words */
2059 retval = cfi_send_command(bank, bufferwsize-1, address);
2060 if (retval != ERROR_OK)
2061 return retval;
2062
2063 retval = target_write_memory(target, address, bank->bus_width, bufferwsize, word);
2064 if (retval != ERROR_OK)
2065 return retval;
2066
2067 /* Commit write operation */
2068 retval = cfi_send_command(bank, 0xd0, address);
2069 if (retval != ERROR_OK)
2070 return retval;
2071
2072 retval = cfi_intel_wait_status_busy(bank, cfi_info->buf_write_timeout, &status);
2073 if (retval != ERROR_OK)
2074 return retval;
2075
2076 if (status != 0x80) {
2077 retval = cfi_send_command(bank, 0xff, flash_address(bank, 0, 0x0));
2078 if (retval != ERROR_OK)
2079 return retval;
2080
2081 LOG_ERROR("Buffer write at base 0x%" PRIx32
2082 ", address 0x%" PRIx32 " failed.", bank->base, address);
2083 return ERROR_FLASH_OPERATION_FAILED;
2084 }
2085
2086 return ERROR_OK;
2087 }
2088
2089 static int cfi_spansion_write_word(struct flash_bank *bank, uint8_t *word, uint32_t address)
2090 {
2091 int retval;
2092 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2093 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
2094 struct target *target = bank->target;
2095
2096 retval = cfi_send_command(bank, 0xaa, flash_address(bank, 0, pri_ext->_unlock1));
2097 if (retval != ERROR_OK)
2098 return retval;
2099
2100 retval = cfi_send_command(bank, 0x55, flash_address(bank, 0, pri_ext->_unlock2));
2101 if (retval != ERROR_OK)
2102 return retval;
2103
2104 retval = cfi_send_command(bank, 0xa0, flash_address(bank, 0, pri_ext->_unlock1));
2105 if (retval != ERROR_OK)
2106 return retval;
2107
2108 retval = target_write_memory(target, address, bank->bus_width, 1, word);
2109 if (retval != ERROR_OK)
2110 return retval;
2111
2112 if (cfi_spansion_wait_status_busy(bank, cfi_info->word_write_timeout) != ERROR_OK) {
2113 retval = cfi_send_command(bank, 0xf0, flash_address(bank, 0, 0x0));
2114 if (retval != ERROR_OK)
2115 return retval;
2116
2117 LOG_ERROR("couldn't write word at base 0x%" PRIx32
2118 ", address 0x%" PRIx32, bank->base, address);
2119 return ERROR_FLASH_OPERATION_FAILED;
2120 }
2121
2122 return ERROR_OK;
2123 }
2124
2125 static int cfi_spansion_write_words(struct flash_bank *bank, const uint8_t *word,
2126 uint32_t wordcount, uint32_t address)
2127 {
2128 int retval;
2129 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2130 struct target *target = bank->target;
2131 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
2132
2133 /* Calculate buffer size and boundary mask
2134 * buffersize is (buffer size per chip) * (number of chips)
2135 * bufferwsize is buffersize in words */
2136 uint32_t buffersize =
2137 (1UL << cfi_info->max_buf_write_size) * (bank->bus_width / bank->chip_width);
2138 uint32_t buffermask = buffersize-1;
2139 uint32_t bufferwsize = buffersize / bank->bus_width;
2140
2141 /* Check for valid range */
2142 if (address & buffermask) {
2143 LOG_ERROR("Write address at base 0x%" PRIx32
2144 ", address 0x%" PRIx32 " not aligned to 2^%d boundary",
2145 bank->base, address, cfi_info->max_buf_write_size);
2146 return ERROR_FLASH_OPERATION_FAILED;
2147 }
2148
2149 /* Check for valid size */
2150 if (wordcount > bufferwsize) {
2151 LOG_ERROR("Number of data words %" PRId32 " exceeds available buffersize %"
2152 PRId32, wordcount, buffersize);
2153 return ERROR_FLASH_OPERATION_FAILED;
2154 }
2155
2156 /* Unlock */
2157 retval = cfi_send_command(bank, 0xaa, flash_address(bank, 0, pri_ext->_unlock1));
2158 if (retval != ERROR_OK)
2159 return retval;
2160
2161 retval = cfi_send_command(bank, 0x55, flash_address(bank, 0, pri_ext->_unlock2));
2162 if (retval != ERROR_OK)
2163 return retval;
2164
2165 /* Buffer load command */
2166 retval = cfi_send_command(bank, 0x25, address);
2167 if (retval != ERROR_OK)
2168 return retval;
2169
2170 /* Write buffer wordcount-1 and data words */
2171 retval = cfi_send_command(bank, bufferwsize-1, address);
2172 if (retval != ERROR_OK)
2173 return retval;
2174
2175 retval = target_write_memory(target, address, bank->bus_width, bufferwsize, word);
2176 if (retval != ERROR_OK)
2177 return retval;
2178
2179 /* Commit write operation */
2180 retval = cfi_send_command(bank, 0x29, address);
2181 if (retval != ERROR_OK)
2182 return retval;
2183
2184 if (cfi_spansion_wait_status_busy(bank, cfi_info->buf_write_timeout) != ERROR_OK) {
2185 retval = cfi_send_command(bank, 0xf0, flash_address(bank, 0, 0x0));
2186 if (retval != ERROR_OK)
2187 return retval;
2188
2189 LOG_ERROR("couldn't write block at base 0x%" PRIx32
2190 ", address 0x%" PRIx32 ", size 0x%" PRIx32, bank->base, address,
2191 bufferwsize);
2192 return ERROR_FLASH_OPERATION_FAILED;
2193 }
2194
2195 return ERROR_OK;
2196 }
2197
2198 static int cfi_write_word(struct flash_bank *bank, uint8_t *word, uint32_t address)
2199 {
2200 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2201
2202 switch (cfi_info->pri_id) {
2203 case 1:
2204 case 3:
2205 return cfi_intel_write_word(bank, word, address);
2206 break;
2207 case 2:
2208 return cfi_spansion_write_word(bank, word, address);
2209 break;
2210 default:
2211 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
2212 break;
2213 }
2214
2215 return ERROR_FLASH_OPERATION_FAILED;
2216 }
2217
2218 static int cfi_write_words(struct flash_bank *bank, const uint8_t *word,
2219 uint32_t wordcount, uint32_t address)
2220 {
2221 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2222
2223 if (cfi_info->buf_write_timeout_typ == 0) {
2224 /* buffer writes are not supported */
2225 LOG_DEBUG("Buffer Writes Not Supported");
2226 return ERROR_FLASH_OPER_UNSUPPORTED;
2227 }
2228
2229 switch (cfi_info->pri_id) {
2230 case 1:
2231 case 3:
2232 return cfi_intel_write_words(bank, word, wordcount, address);
2233 break;
2234 case 2:
2235 return cfi_spansion_write_words(bank, word, wordcount, address);
2236 break;
2237 default:
2238 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
2239 break;
2240 }
2241
2242 return ERROR_FLASH_OPERATION_FAILED;
2243 }
2244
2245 static int cfi_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
2246 {
2247 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2248 struct target *target = bank->target;
2249 uint32_t address = bank->base + offset;
2250 uint32_t read_p;
2251 int align; /* number of unaligned bytes */
2252 uint8_t current_word[CFI_MAX_BUS_WIDTH];
2253 int i;
2254 int retval;
2255
2256 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x",
2257 (int)count, (unsigned)offset);
2258
2259 if (bank->target->state != TARGET_HALTED) {
2260 LOG_ERROR("Target not halted");
2261 return ERROR_TARGET_NOT_HALTED;
2262 }
2263
2264 if (offset + count > bank->size)
2265 return ERROR_FLASH_DST_OUT_OF_BANK;
2266
2267 if (cfi_info->qry[0] != 'Q')
2268 return ERROR_FLASH_BANK_NOT_PROBED;
2269
2270 /* start at the first byte of the first word (bus_width size) */
2271 read_p = address & ~(bank->bus_width - 1);
2272 align = address - read_p;
2273 if (align != 0) {
2274 LOG_INFO("Fixup %d unaligned read head bytes", align);
2275
2276 /* read a complete word from flash */
2277 retval = target_read_memory(target, read_p, bank->bus_width, 1, current_word);
2278 if (retval != ERROR_OK)
2279 return retval;
2280
2281 /* take only bytes we need */
2282 for (i = align; (i < bank->bus_width) && (count > 0); i++, count--)
2283 *buffer++ = current_word[i];
2284
2285 read_p += bank->bus_width;
2286 }
2287
2288 align = count / bank->bus_width;
2289 if (align) {
2290 retval = target_read_memory(target, read_p, bank->bus_width, align, buffer);
2291 if (retval != ERROR_OK)
2292 return retval;
2293
2294 read_p += align * bank->bus_width;
2295 buffer += align * bank->bus_width;
2296 count -= align * bank->bus_width;
2297 }
2298
2299 if (count) {
2300 LOG_INFO("Fixup %" PRIu32 " unaligned read tail bytes", count);
2301
2302 /* read a complete word from flash */
2303 retval = target_read_memory(target, read_p, bank->bus_width, 1, current_word);
2304 if (retval != ERROR_OK)
2305 return retval;
2306
2307 /* take only bytes we need */
2308 for (i = 0; (i < bank->bus_width) && (count > 0); i++, count--)
2309 *buffer++ = current_word[i];
2310 }
2311
2312 return ERROR_OK;
2313 }
2314
2315 static int cfi_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
2316 {
2317 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2318 struct target *target = bank->target;
2319 uint32_t address = bank->base + offset; /* address of first byte to be programmed */
2320 uint32_t write_p;
2321 int align; /* number of unaligned bytes */
2322 int blk_count; /* number of bus_width bytes for block copy */
2323 uint8_t current_word[CFI_MAX_BUS_WIDTH * 4]; /* word (bus_width size) currently being
2324 *programmed */
2325 int i;
2326 int retval;
2327
2328 if (bank->target->state != TARGET_HALTED) {
2329 LOG_ERROR("Target not halted");
2330 return ERROR_TARGET_NOT_HALTED;
2331 }
2332
2333 if (offset + count > bank->size)
2334 return ERROR_FLASH_DST_OUT_OF_BANK;
2335
2336 if (cfi_info->qry[0] != 'Q')
2337 return ERROR_FLASH_BANK_NOT_PROBED;
2338
2339 /* start at the first byte of the first word (bus_width size) */
2340 write_p = address & ~(bank->bus_width - 1);
2341 align = address - write_p;
2342 if (align != 0) {
2343 LOG_INFO("Fixup %d unaligned head bytes", align);
2344
2345 /* read a complete word from flash */
2346 retval = target_read_memory(target, write_p, bank->bus_width, 1, current_word);
2347 if (retval != ERROR_OK)
2348 return retval;
2349
2350 /* replace only bytes that must be written */
2351 for (i = align; (i < bank->bus_width) && (count > 0); i++, count--)
2352 current_word[i] = *buffer++;
2353
2354 retval = cfi_write_word(bank, current_word, write_p);
2355 if (retval != ERROR_OK)
2356 return retval;
2357 write_p += bank->bus_width;
2358 }
2359
2360 /* handle blocks of bus_size aligned bytes */
2361 blk_count = count & ~(bank->bus_width - 1); /* round down, leave tail bytes */
2362 switch (cfi_info->pri_id) {
2363 /* try block writes (fails without working area) */
2364 case 1:
2365 case 3:
2366 retval = cfi_intel_write_block(bank, buffer, write_p, blk_count);
2367 break;
2368 case 2:
2369 retval = cfi_spansion_write_block(bank, buffer, write_p, blk_count);
2370 break;
2371 default:
2372 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
2373 retval = ERROR_FLASH_OPERATION_FAILED;
2374 break;
2375 }
2376 if (retval == ERROR_OK) {
2377 /* Increment pointers and decrease count on succesful block write */
2378 buffer += blk_count;
2379 write_p += blk_count;
2380 count -= blk_count;
2381 } else {
2382 if (retval == ERROR_TARGET_RESOURCE_NOT_AVAILABLE) {
2383 /* Calculate buffer size and boundary mask
2384 * buffersize is (buffer size per chip) * (number of chips)
2385 * bufferwsize is buffersize in words */
2386 uint32_t buffersize =
2387 (1UL <<
2388 cfi_info->max_buf_write_size) *
2389 (bank->bus_width / bank->chip_width);
2390 uint32_t buffermask = buffersize-1;
2391 uint32_t bufferwsize = buffersize / bank->bus_width;
2392
2393 /* fall back to memory writes */
2394 while (count >= (uint32_t)bank->bus_width) {
2395 int fallback;
2396 if ((write_p & 0xff) == 0) {
2397 LOG_INFO("Programming at 0x%08" PRIx32 ", count 0x%08"
2398 PRIx32 " bytes remaining", write_p, count);
2399 }
2400 fallback = 1;
2401 if ((bufferwsize > 0) && (count >= buffersize) &&
2402 !(write_p & buffermask)) {
2403 retval = cfi_write_words(bank, buffer, bufferwsize, write_p);
2404 if (retval == ERROR_OK) {
2405 buffer += buffersize;
2406 write_p += buffersize;
2407 count -= buffersize;
2408 fallback = 0;
2409 } else if (retval != ERROR_FLASH_OPER_UNSUPPORTED)
2410 return retval;
2411 }
2412 /* try the slow way? */
2413 if (fallback) {
2414 for (i = 0; i < bank->bus_width; i++)
2415 current_word[i] = *buffer++;
2416
2417 retval = cfi_write_word(bank, current_word, write_p);
2418 if (retval != ERROR_OK)
2419 return retval;
2420
2421 write_p += bank->bus_width;
2422 count -= bank->bus_width;
2423 }
2424 }
2425 } else
2426 return retval;
2427 }
2428
2429 /* return to read array mode, so we can read from flash again for padding */
2430 retval = cfi_reset(bank);
2431 if (retval != ERROR_OK)
2432 return retval;
2433
2434 /* handle unaligned tail bytes */
2435 if (count > 0) {
2436 LOG_INFO("Fixup %" PRId32 " unaligned tail bytes", count);
2437
2438 /* read a complete word from flash */
2439 retval = target_read_memory(target, write_p, bank->bus_width, 1, current_word);
2440 if (retval != ERROR_OK)
2441 return retval;
2442
2443 /* replace only bytes that must be written */
2444 for (i = 0; (i < bank->bus_width) && (count > 0); i++, count--)
2445 current_word[i] = *buffer++;
2446
2447 retval = cfi_write_word(bank, current_word, write_p);
2448 if (retval != ERROR_OK)
2449 return retval;
2450 }
2451
2452 /* return to read array mode */
2453 return cfi_reset(bank);
2454 }
2455
2456 static void cfi_fixup_reversed_erase_regions(struct flash_bank *bank, const void *param)
2457 {
2458 (void) param;
2459 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2460 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
2461
2462 pri_ext->_reversed_geometry = 1;
2463 }
2464
2465 static void cfi_fixup_0002_erase_regions(struct flash_bank *bank, const void *param)
2466 {
2467 int i;
2468 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2469 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
2470 (void) param;
2471
2472 if ((pri_ext->_reversed_geometry) || (pri_ext->TopBottom == 3)) {
2473 LOG_DEBUG("swapping reversed erase region information on cmdset 0002 device");
2474
2475 for (i = 0; i < cfi_info->num_erase_regions / 2; i++) {
2476 int j = (cfi_info->num_erase_regions - 1) - i;
2477 uint32_t swap;
2478
2479 swap = cfi_info->erase_region_info[i];
2480 cfi_info->erase_region_info[i] = cfi_info->erase_region_info[j];
2481 cfi_info->erase_region_info[j] = swap;
2482 }
2483 }
2484 }
2485
2486 static void cfi_fixup_0002_unlock_addresses(struct flash_bank *bank, const void *param)
2487 {
2488 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2489 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
2490 const struct cfi_unlock_addresses *unlock_addresses = param;
2491
2492 pri_ext->_unlock1 = unlock_addresses->unlock1;
2493 pri_ext->_unlock2 = unlock_addresses->unlock2;
2494 }
2495
2496 static void cfi_fixup_0002_polling_bits(struct flash_bank *bank, const void *param)
2497 {
2498 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2499 const int *status_poll_mask = param;
2500
2501 cfi_info->status_poll_mask = *status_poll_mask;
2502 }
2503
2504
2505 static int cfi_query_string(struct flash_bank *bank, int address)
2506 {
2507 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2508 int retval;
2509
2510 retval = cfi_send_command(bank, 0x98, flash_address(bank, 0, address));
2511 if (retval != ERROR_OK)
2512 return retval;
2513
2514 retval = cfi_query_u8(bank, 0, 0x10, &cfi_info->qry[0]);
2515 if (retval != ERROR_OK)
2516 return retval;
2517 retval = cfi_query_u8(bank, 0, 0x11, &cfi_info->qry[1]);
2518 if (retval != ERROR_OK)
2519 return retval;
2520 retval = cfi_query_u8(bank, 0, 0x12, &cfi_info->qry[2]);
2521 if (retval != ERROR_OK)
2522 return retval;
2523
2524 LOG_DEBUG("CFI qry returned: 0x%2.2x 0x%2.2x 0x%2.2x",
2525 cfi_info->qry[0], cfi_info->qry[1], cfi_info->qry[2]);
2526
2527 if ((cfi_info->qry[0] != 'Q') || (cfi_info->qry[1] != 'R') || (cfi_info->qry[2] != 'Y')) {
2528 retval = cfi_reset(bank);
2529 if (retval != ERROR_OK)
2530 return retval;
2531 LOG_ERROR("Could not probe bank: no QRY");
2532 return ERROR_FLASH_BANK_INVALID;
2533 }
2534
2535 return ERROR_OK;
2536 }
2537
2538 static int cfi_probe(struct flash_bank *bank)
2539 {
2540 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2541 struct target *target = bank->target;
2542 int num_sectors = 0;
2543 int i;
2544 int sector = 0;
2545 uint32_t unlock1 = 0x555;
2546 uint32_t unlock2 = 0x2aa;
2547 int retval;
2548 uint8_t value_buf0[CFI_MAX_BUS_WIDTH], value_buf1[CFI_MAX_BUS_WIDTH];
2549
2550 if (bank->target->state != TARGET_HALTED) {
2551 LOG_ERROR("Target not halted");
2552 return ERROR_TARGET_NOT_HALTED;
2553 }
2554
2555 cfi_info->probed = 0;
2556 cfi_info->num_erase_regions = 0;
2557 if (bank->sectors) {
2558 free(bank->sectors);
2559 bank->sectors = NULL;
2560 }
2561 if (cfi_info->erase_region_info) {
2562 free(cfi_info->erase_region_info);
2563 cfi_info->erase_region_info = NULL;
2564 }
2565
2566 /* JEDEC standard JESD21C uses 0x5555 and 0x2aaa as unlock addresses,
2567 * while CFI compatible AMD/Spansion flashes use 0x555 and 0x2aa
2568 */
2569 if (cfi_info->jedec_probe) {
2570 unlock1 = 0x5555;
2571 unlock2 = 0x2aaa;
2572 }
2573
2574 /* switch to read identifier codes mode ("AUTOSELECT") */
2575 retval = cfi_send_command(bank, 0xaa, flash_address(bank, 0, unlock1));
2576 if (retval != ERROR_OK)
2577 return retval;
2578 retval = cfi_send_command(bank, 0x55, flash_address(bank, 0, unlock2));
2579 if (retval != ERROR_OK)
2580 return retval;
2581 retval = cfi_send_command(bank, 0x90, flash_address(bank, 0, unlock1));
2582 if (retval != ERROR_OK)
2583 return retval;
2584
2585 retval = target_read_memory(target, flash_address(bank, 0, 0x00),
2586 bank->bus_width, 1, value_buf0);
2587 if (retval != ERROR_OK)
2588 return retval;
2589 retval = target_read_memory(target, flash_address(bank, 0, 0x01),
2590 bank->bus_width, 1, value_buf1);
2591 if (retval != ERROR_OK)
2592 return retval;
2593 switch (bank->chip_width) {
2594 case 1:
2595 cfi_info->manufacturer = *value_buf0;
2596 cfi_info->device_id = *value_buf1;
2597 break;
2598 case 2:
2599 cfi_info->manufacturer = target_buffer_get_u16(target, value_buf0);
2600 cfi_info->device_id = target_buffer_get_u16(target, value_buf1);
2601 break;
2602 case 4:
2603 cfi_info->manufacturer = target_buffer_get_u32(target, value_buf0);
2604 cfi_info->device_id = target_buffer_get_u32(target, value_buf1);
2605 break;
2606 default:
2607 LOG_ERROR("Unsupported bank chipwidth %d, can't probe memory",
2608 bank->chip_width);
2609 return ERROR_FLASH_OPERATION_FAILED;
2610 }
2611
2612 LOG_INFO("Flash Manufacturer/Device: 0x%04x 0x%04x",
2613 cfi_info->manufacturer, cfi_info->device_id);
2614 /* switch back to read array mode */
2615 retval = cfi_reset(bank);
2616 if (retval != ERROR_OK)
2617 return retval;
2618
2619 /* check device/manufacturer ID for known non-CFI flashes. */
2620 cfi_fixup_non_cfi(bank);
2621
2622 /* query only if this is a CFI compatible flash,
2623 * otherwise the relevant info has already been filled in
2624 */
2625 if (cfi_info->not_cfi == 0) {
2626 /* enter CFI query mode
2627 * according to JEDEC Standard No. 68.01,
2628 * a single bus sequence with address = 0x55, data = 0x98 should put
2629 * the device into CFI query mode.
2630 *
2631 * SST flashes clearly violate this, and we will consider them incompatible for now
2632 */
2633
2634 retval = cfi_query_string(bank, 0x55);
2635 if (retval != ERROR_OK) {
2636 /*
2637 * Spansion S29WS-N CFI query fix is to try 0x555 if 0x55 fails. Should
2638 * be harmless enough:
2639 *
2640 * http://www.infradead.org/pipermail/linux-mtd/2005-September/013618.html
2641 */
2642 LOG_USER("Try workaround w/0x555 instead of 0x55 to get QRY.");
2643 retval = cfi_query_string(bank, 0x555);
2644 }
2645 if (retval != ERROR_OK)
2646 return retval;
2647
2648 retval = cfi_query_u16(bank, 0, 0x13, &cfi_info->pri_id);
2649 if (retval != ERROR_OK)
2650 return retval;
2651 retval = cfi_query_u16(bank, 0, 0x15, &cfi_info->pri_addr);
2652 if (retval != ERROR_OK)
2653 return retval;
2654 retval = cfi_query_u16(bank, 0, 0x17, &cfi_info->alt_id);
2655 if (retval != ERROR_OK)
2656 return retval;
2657 retval = cfi_query_u16(bank, 0, 0x19, &cfi_info->alt_addr);
2658 if (retval != ERROR_OK)
2659 return retval;
2660
2661 LOG_DEBUG("qry: '%c%c%c', pri_id: 0x%4.4x, pri_addr: 0x%4.4x, alt_id: "
2662 "0x%4.4x, alt_addr: 0x%4.4x", cfi_info->qry[0], cfi_info->qry[1],
2663 cfi_info->qry[2], cfi_info->pri_id, cfi_info->pri_addr,
2664 cfi_info->alt_id, cfi_info->alt_addr);
2665
2666 retval = cfi_query_u8(bank, 0, 0x1b, &cfi_info->vcc_min);
2667 if (retval != ERROR_OK)
2668 return retval;
2669 retval = cfi_query_u8(bank, 0, 0x1c, &cfi_info->vcc_max);
2670 if (retval != ERROR_OK)
2671 return retval;
2672 retval = cfi_query_u8(bank, 0, 0x1d, &cfi_info->vpp_min);
2673 if (retval != ERROR_OK)
2674 return retval;
2675 retval = cfi_query_u8(bank, 0, 0x1e, &cfi_info->vpp_max);
2676 if (retval != ERROR_OK)
2677 return retval;
2678
2679 retval = cfi_query_u8(bank, 0, 0x1f, &cfi_info->word_write_timeout_typ);
2680 if (retval != ERROR_OK)
2681 return retval;
2682 retval = cfi_query_u8(bank, 0, 0x20, &cfi_info->buf_write_timeout_typ);
2683 if (retval != ERROR_OK)
2684 return retval;
2685 retval = cfi_query_u8(bank, 0, 0x21, &cfi_info->block_erase_timeout_typ);
2686 if (retval != ERROR_OK)
2687 return retval;
2688 retval = cfi_query_u8(bank, 0, 0x22, &cfi_info->chip_erase_timeout_typ);
2689 if (retval != ERROR_OK)
2690 return retval;
2691 retval = cfi_query_u8(bank, 0, 0x23, &cfi_info->word_write_timeout_max);
2692 if (retval != ERROR_OK)
2693 return retval;
2694 retval = cfi_query_u8(bank, 0, 0x24, &cfi_info->buf_write_timeout_max);
2695 if (retval != ERROR_OK)
2696 return retval;
2697 retval = cfi_query_u8(bank, 0, 0x25, &cfi_info->block_erase_timeout_max);
2698 if (retval != ERROR_OK)
2699 return retval;
2700 retval = cfi_query_u8(bank, 0, 0x26, &cfi_info->chip_erase_timeout_max);
2701 if (retval != ERROR_OK)
2702 return retval;
2703
2704 uint8_t data;
2705 retval = cfi_query_u8(bank, 0, 0x27, &data);
2706 if (retval != ERROR_OK)
2707 return retval;
2708 cfi_info->dev_size = 1 << data;
2709
2710 retval = cfi_query_u16(bank, 0, 0x28, &cfi_info->interface_desc);
2711 if (retval != ERROR_OK)
2712 return retval;
2713 retval = cfi_query_u16(bank, 0, 0x2a, &cfi_info->max_buf_write_size);
2714 if (retval != ERROR_OK)
2715 return retval;
2716 retval = cfi_query_u8(bank, 0, 0x2c, &cfi_info->num_erase_regions);
2717 if (retval != ERROR_OK)
2718 return retval;
2719
2720 LOG_DEBUG("size: 0x%" PRIx32 ", interface desc: %i, max buffer write size: 0x%x",
2721 cfi_info->dev_size, cfi_info->interface_desc,
2722 (1 << cfi_info->max_buf_write_size));
2723
2724 if (cfi_info->num_erase_regions) {
2725 cfi_info->erase_region_info = malloc(sizeof(*cfi_info->erase_region_info)
2726 * cfi_info->num_erase_regions);
2727 for (i = 0; i < cfi_info->num_erase_regions; i++) {
2728 retval = cfi_query_u32(bank,
2729 0,
2730 0x2d + (4 * i),
2731 &cfi_info->erase_region_info[i]);
2732 if (retval != ERROR_OK)
2733 return retval;
2734 LOG_DEBUG(
2735 "erase region[%i]: %" PRIu32 " blocks of size 0x%" PRIx32 "",
2736 i,
2737 (cfi_info->erase_region_info[i] & 0xffff) + 1,
2738 (cfi_info->erase_region_info[i] >> 16) * 256);
2739 }
2740 } else
2741 cfi_info->erase_region_info = NULL;
2742
2743 /* We need to read the primary algorithm extended query table before calculating
2744 * the sector layout to be able to apply fixups
2745 */
2746 switch (cfi_info->pri_id) {
2747 /* Intel command set (standard and extended) */
2748 case 0x0001:
2749 case 0x0003:
2750 cfi_read_intel_pri_ext(bank);
2751 break;
2752 /* AMD/Spansion, Atmel, ... command set */
2753 case 0x0002:
2754 cfi_info->status_poll_mask = CFI_STATUS_POLL_MASK_DQ5_DQ6_DQ7; /*
2755 *default
2756 *for
2757 *all
2758 *CFI
2759 *flashs
2760 **/
2761 cfi_read_0002_pri_ext(bank);
2762 break;
2763 default:
2764 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
2765 break;
2766 }
2767
2768 /* return to read array mode
2769 * we use both reset commands, as some Intel flashes fail to recognize the 0xF0 command
2770 */
2771 retval = cfi_reset(bank);
2772 if (retval != ERROR_OK)
2773 return retval;
2774 } /* end CFI case */
2775
2776 LOG_DEBUG("Vcc min: %x.%x, Vcc max: %x.%x, Vpp min: %u.%x, Vpp max: %u.%x",
2777 (cfi_info->vcc_min & 0xf0) >> 4, cfi_info->vcc_min & 0x0f,
2778 (cfi_info->vcc_max & 0xf0) >> 4, cfi_info->vcc_max & 0x0f,
2779 (cfi_info->vpp_min & 0xf0) >> 4, cfi_info->vpp_min & 0x0f,
2780 (cfi_info->vpp_max & 0xf0) >> 4, cfi_info->vpp_max & 0x0f);
2781
2782 LOG_DEBUG("typ. word write timeout: %u us, typ. buf write timeout: %u us, "
2783 "typ. block erase timeout: %u ms, typ. chip erase timeout: %u ms",
2784 1 << cfi_info->word_write_timeout_typ, 1 << cfi_info->buf_write_timeout_typ,
2785 1 << cfi_info->block_erase_timeout_typ, 1 << cfi_info->chip_erase_timeout_typ);
2786
2787 LOG_DEBUG("max. word write timeout: %u us, max. buf write timeout: %u us, "
2788 "max. block erase timeout: %u ms, max. chip erase timeout: %u ms",
2789 (1 << cfi_info->word_write_timeout_max) * (1 << cfi_info->word_write_timeout_typ),
2790 (1 << cfi_info->buf_write_timeout_max) * (1 << cfi_info->buf_write_timeout_typ),
2791 (1 << cfi_info->block_erase_timeout_max) * (1 << cfi_info->block_erase_timeout_typ),
2792 (1 << cfi_info->chip_erase_timeout_max) * (1 << cfi_info->chip_erase_timeout_typ));
2793
2794 /* convert timeouts to real values in ms */
2795 cfi_info->word_write_timeout = DIV_ROUND_UP((1L << cfi_info->word_write_timeout_typ) *
2796 (1L << cfi_info->word_write_timeout_max), 1000);
2797 cfi_info->buf_write_timeout = DIV_ROUND_UP((1L << cfi_info->buf_write_timeout_typ) *
2798 (1L << cfi_info->buf_write_timeout_max), 1000);
2799 cfi_info->block_erase_timeout = (1L << cfi_info->block_erase_timeout_typ) *
2800 (1L << cfi_info->block_erase_timeout_max);
2801 cfi_info->chip_erase_timeout = (1L << cfi_info->chip_erase_timeout_typ) *
2802 (1L << cfi_info->chip_erase_timeout_max);
2803
2804 LOG_DEBUG("calculated word write timeout: %u ms, buf write timeout: %u ms, "
2805 "block erase timeout: %u ms, chip erase timeout: %u ms",
2806 cfi_info->word_write_timeout, cfi_info->buf_write_timeout,
2807 cfi_info->block_erase_timeout, cfi_info->chip_erase_timeout);
2808
2809 /* apply fixups depending on the primary command set */
2810 switch (cfi_info->pri_id) {
2811 /* Intel command set (standard and extended) */
2812 case 0x0001:
2813 case 0x0003:
2814 cfi_fixup(bank, cfi_0001_fixups);
2815 break;
2816 /* AMD/Spansion, Atmel, ... command set */
2817 case 0x0002:
2818 cfi_fixup(bank, cfi_0002_fixups);
2819 break;
2820 default:
2821 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
2822 break;
2823 }
2824
2825 if ((cfi_info->dev_size * bank->bus_width / bank->chip_width) != bank->size) {
2826 LOG_WARNING("configuration specifies 0x%" PRIx32 " size, but a 0x%" PRIx32
2827 " size flash was found", bank->size, cfi_info->dev_size);
2828 }
2829
2830 if (cfi_info->num_erase_regions == 0) {
2831 /* a device might have only one erase block, spanning the whole device */
2832 bank->num_sectors = 1;
2833 bank->sectors = malloc(sizeof(struct flash_sector));
2834
2835 bank->sectors[sector].offset = 0x0;
2836 bank->sectors[sector].size = bank->size;
2837 bank->sectors[sector].is_erased = -1;
2838 bank->sectors[sector].is_protected = -1;
2839 } else {
2840 uint32_t offset = 0;
2841
2842 for (i = 0; i < cfi_info->num_erase_regions; i++)
2843 num_sectors += (cfi_info->erase_region_info[i] & 0xffff) + 1;
2844
2845 bank->num_sectors = num_sectors;
2846 bank->sectors = malloc(sizeof(struct flash_sector) * num_sectors);
2847
2848 for (i = 0; i < cfi_info->num_erase_regions; i++) {
2849 uint32_t j;
2850 for (j = 0; j < (cfi_info->erase_region_info[i] & 0xffff) + 1; j++) {
2851 bank->sectors[sector].offset = offset;
2852 bank->sectors[sector].size =
2853 ((cfi_info->erase_region_info[i] >> 16) * 256)
2854 * bank->bus_width / bank->chip_width;
2855 offset += bank->sectors[sector].size;
2856 bank->sectors[sector].is_erased = -1;
2857 bank->sectors[sector].is_protected = -1;
2858 sector++;
2859 }
2860 }
2861 if (offset != (cfi_info->dev_size * bank->bus_width / bank->chip_width)) {
2862 LOG_WARNING(
2863 "CFI size is 0x%" PRIx32 ", but total sector size is 0x%" PRIx32 "", \
2864 (cfi_info->dev_size * bank->bus_width / bank->chip_width),
2865 offset);
2866 }
2867 }
2868
2869 cfi_info->probed = 1;
2870
2871 return ERROR_OK;
2872 }
2873
2874 static int cfi_auto_probe(struct flash_bank *bank)
2875 {
2876 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2877 if (cfi_info->probed)
2878 return ERROR_OK;
2879 return cfi_probe(bank);
2880 }
2881
2882 static int cfi_intel_protect_check(struct flash_bank *bank)
2883 {
2884 int retval;
2885 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2886 struct cfi_intel_pri_ext *pri_ext = cfi_info->pri_ext;
2887 int i;
2888
2889 /* check if block lock bits are supported on this device */
2890 if (!(pri_ext->blk_status_reg_mask & 0x1))
2891 return ERROR_FLASH_OPERATION_FAILED;
2892
2893 retval = cfi_send_command(bank, 0x90, flash_address(bank, 0, 0x55));
2894 if (retval != ERROR_OK)
2895 return retval;
2896
2897 for (i = 0; i < bank->num_sectors; i++) {
2898 uint8_t block_status;
2899 retval = cfi_get_u8(bank, i, 0x2, &block_status);
2900 if (retval != ERROR_OK)
2901 return retval;
2902
2903 if (block_status & 1)
2904 bank->sectors[i].is_protected = 1;
2905 else
2906 bank->sectors[i].is_protected = 0;
2907 }
2908
2909 return cfi_send_command(bank, 0xff, flash_address(bank, 0, 0x0));
2910 }
2911
2912 static int cfi_spansion_protect_check(struct flash_bank *bank)
2913 {
2914 int retval;
2915 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2916 struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
2917 int i;
2918
2919 retval = cfi_send_command(bank, 0xaa, flash_address(bank, 0, pri_ext->_unlock1));
2920 if (retval != ERROR_OK)
2921 return retval;
2922
2923 retval = cfi_send_command(bank, 0x55, flash_address(bank, 0, pri_ext->_unlock2));
2924 if (retval != ERROR_OK)
2925 return retval;
2926
2927 retval = cfi_send_command(bank, 0x90, flash_address(bank, 0, pri_ext->_unlock1));
2928 if (retval != ERROR_OK)
2929 return retval;
2930
2931 for (i = 0; i < bank->num_sectors; i++) {
2932 uint8_t block_status;
2933 retval = cfi_get_u8(bank, i, 0x2, &block_status);
2934 if (retval != ERROR_OK)
2935 return retval;
2936
2937 if (block_status & 1)
2938 bank->sectors[i].is_protected = 1;
2939 else
2940 bank->sectors[i].is_protected = 0;
2941 }
2942
2943 return cfi_send_command(bank, 0xf0, flash_address(bank, 0, 0x0));
2944 }
2945
2946 static int cfi_protect_check(struct flash_bank *bank)
2947 {
2948 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2949
2950 if (bank->target->state != TARGET_HALTED) {
2951 LOG_ERROR("Target not halted");
2952 return ERROR_TARGET_NOT_HALTED;
2953 }
2954
2955 if (cfi_info->qry[0] != 'Q')
2956 return ERROR_FLASH_BANK_NOT_PROBED;
2957
2958 switch (cfi_info->pri_id) {
2959 case 1:
2960 case 3:
2961 return cfi_intel_protect_check(bank);
2962 break;
2963 case 2:
2964 return cfi_spansion_protect_check(bank);
2965 break;
2966 default:
2967 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
2968 break;
2969 }
2970
2971 return ERROR_OK;
2972 }
2973
2974 static int get_cfi_info(struct flash_bank *bank, char *buf, int buf_size)
2975 {
2976 int printed;
2977 struct cfi_flash_bank *cfi_info = bank->driver_priv;
2978
2979 if (cfi_info->qry[0] == 0xff) {
2980 snprintf(buf, buf_size, "\ncfi flash bank not probed yet\n");
2981 return ERROR_OK;
2982 }
2983
2984 if (cfi_info->not_cfi == 0)
2985 printed = snprintf(buf, buf_size, "\nCFI flash: ");
2986 else
2987 printed = snprintf(buf, buf_size, "\nnon-CFI flash: ");
2988 buf += printed;
2989 buf_size -= printed;
2990
2991 printed = snprintf(buf, buf_size, "mfr: 0x%4.4x, id:0x%4.4x\n\n",
2992 cfi_info->manufacturer, cfi_info->device_id);
2993 buf += printed;
2994 buf_size -= printed;
2995
2996 printed = snprintf(buf, buf_size, "qry: '%c%c%c', pri_id: 0x%4.4x, pri_addr: "
2997 "0x%4.4x, alt_id: 0x%4.4x, alt_addr: 0x%4.4x\n",
2998 cfi_info->qry[0], cfi_info->qry[1], cfi_info->qry[2],
2999 cfi_info->pri_id, cfi_info->pri_addr, cfi_info->alt_id, cfi_info->alt_addr);
3000 buf += printed;
3001 buf_size -= printed;
3002
3003 printed = snprintf(buf, buf_size, "Vcc min: %x.%x, Vcc max: %x.%x, "
3004 "Vpp min: %u.%x, Vpp max: %u.%x\n",
3005 (cfi_info->vcc_min & 0xf0) >> 4, cfi_info->vcc_min & 0x0f,
3006 (cfi_info->vcc_max & 0xf0) >> 4, cfi_info->vcc_max & 0x0f,
3007 (cfi_info->vpp_min & 0xf0) >> 4, cfi_info->vpp_min & 0x0f,
3008 (cfi_info->vpp_max & 0xf0) >> 4, cfi_info->vpp_max & 0x0f);
3009 buf += printed;
3010 buf_size -= printed;
3011
3012 printed = snprintf(buf, buf_size, "typ. word write timeout: %u us, "
3013 "typ. buf write timeout: %u us, "
3014 "typ. block erase timeout: %u ms, "
3015 "typ. chip erase timeout: %u ms\n",
3016 1 << cfi_info->word_write_timeout_typ,
3017 1 << cfi_info->buf_write_timeout_typ,
3018 1 << cfi_info->block_erase_timeout_typ,
3019 1 << cfi_info->chip_erase_timeout_typ);
3020 buf += printed;
3021 buf_size -= printed;
3022
3023 printed = snprintf(buf,
3024 buf_size,
3025 "max. word write timeout: %u us, "
3026 "max. buf write timeout: %u us, max. "
3027 "block erase timeout: %u ms, max. chip erase timeout: %u ms\n",
3028 (1 <<
3029 cfi_info->word_write_timeout_max) * (1 << cfi_info->word_write_timeout_typ),
3030 (1 <<
3031 cfi_info->buf_write_timeout_max) * (1 << cfi_info->buf_write_timeout_typ),
3032 (1 <<
3033 cfi_info->block_erase_timeout_max) *
3034 (1 << cfi_info->block_erase_timeout_typ),
3035 (1 <<
3036 cfi_info->chip_erase_timeout_max) *
3037 (1 << cfi_info->chip_erase_timeout_typ));
3038 buf += printed;
3039 buf_size -= printed;
3040
3041 printed = snprintf(buf, buf_size, "size: 0x%" PRIx32 ", interface desc: %i, "
3042 "max buffer write size: 0x%x\n",
3043 cfi_info->dev_size,
3044 cfi_info->interface_desc,
3045 1 << cfi_info->max_buf_write_size);
3046 buf += printed;
3047 buf_size -= printed;
3048
3049 switch (cfi_info->pri_id) {
3050 case 1:
3051 case 3:
3052 cfi_intel_info(bank, buf, buf_size);
3053 break;
3054 case 2:
3055 cfi_spansion_info(bank, buf, buf_size);
3056 break;
3057 default:
3058 LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
3059 break;
3060 }
3061
3062 return ERROR_OK;
3063 }
3064
3065 static void cfi_fixup_0002_write_buffer(struct flash_bank *bank, const void *param)
3066 {
3067 struct cfi_flash_bank *cfi_info = bank->driver_priv;
3068
3069 /* disable write buffer for M29W128G */
3070 cfi_info->buf_write_timeout_typ = 0;
3071 }
3072
3073 struct flash_driver cfi_flash = {
3074 .name = "cfi",
3075 .flash_bank_command = cfi_flash_bank_command,
3076 .erase = cfi_erase,
3077 .protect = cfi_protect,
3078 .write = cfi_write,
3079 .read = cfi_read,
3080 .probe = cfi_probe,
3081 .auto_probe = cfi_auto_probe,
3082 /* FIXME: access flash at bus_width size */
3083 .erase_check = default_flash_blank_check,
3084 .protect_check = cfi_protect_check,
3085 .info = get_cfi_info,
3086 };

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)