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

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)