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