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

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)