You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

3096 lines
95 KiB

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