sf_ops.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. /*
  2. * SPI flash operations
  3. *
  4. * Copyright (C) 2008 Atmel Corporation
  5. * Copyright (C) 2010 Reinhard Meyer, EMK Elektronik
  6. * Copyright (C) 2013 Jagannadha Sutradharudu Teki, Xilinx Inc.
  7. *
  8. * SPDX-License-Identifier: GPL-2.0+
  9. */
  10. #include <common.h>
  11. #include <errno.h>
  12. #include <malloc.h>
  13. #include <spi.h>
  14. #include <spi_flash.h>
  15. #include <watchdog.h>
  16. #include <linux/compiler.h>
  17. #include "sf_internal.h"
  18. static void spi_flash_addr(u32 addr, u8 *cmd)
  19. {
  20. /* cmd[0] is actual command */
  21. cmd[1] = addr >> 16;
  22. cmd[2] = addr >> 8;
  23. cmd[3] = addr >> 0;
  24. }
  25. int spi_flash_cmd_read_status(struct spi_flash *flash, u8 *rs)
  26. {
  27. int ret;
  28. u8 cmd;
  29. cmd = CMD_READ_STATUS;
  30. ret = spi_flash_read_common(flash, &cmd, 1, rs, 1);
  31. if (ret < 0) {
  32. debug("SF: fail to read status register\n");
  33. return ret;
  34. }
  35. return 0;
  36. }
  37. int spi_flash_cmd_write_status(struct spi_flash *flash, u8 ws)
  38. {
  39. u8 cmd;
  40. int ret;
  41. cmd = CMD_WRITE_STATUS;
  42. ret = spi_flash_write_common(flash, &cmd, 1, &ws, 1);
  43. if (ret < 0) {
  44. debug("SF: fail to write status register\n");
  45. return ret;
  46. }
  47. return 0;
  48. }
  49. #if defined(CONFIG_SPI_FLASH_SPANSION) || defined(CONFIG_SPI_FLASH_WINBOND)
  50. int spi_flash_cmd_read_config(struct spi_flash *flash, u8 *rc)
  51. {
  52. int ret;
  53. u8 cmd;
  54. cmd = CMD_READ_CONFIG;
  55. ret = spi_flash_read_common(flash, &cmd, 1, rc, 1);
  56. if (ret < 0) {
  57. debug("SF: fail to read config register\n");
  58. return ret;
  59. }
  60. return 0;
  61. }
  62. int spi_flash_cmd_write_config(struct spi_flash *flash, u8 wc)
  63. {
  64. u8 data[2];
  65. u8 cmd;
  66. int ret;
  67. ret = spi_flash_cmd_read_status(flash, &data[0]);
  68. if (ret < 0)
  69. return ret;
  70. cmd = CMD_WRITE_STATUS;
  71. data[1] = wc;
  72. ret = spi_flash_write_common(flash, &cmd, 1, &data, 2);
  73. if (ret) {
  74. debug("SF: fail to write config register\n");
  75. return ret;
  76. }
  77. return 0;
  78. }
  79. #endif
  80. #ifdef CONFIG_SPI_FLASH_BAR
  81. static int spi_flash_cmd_bankaddr_write(struct spi_flash *flash, u8 bank_sel)
  82. {
  83. u8 cmd;
  84. int ret;
  85. if (flash->bank_curr == bank_sel) {
  86. debug("SF: not require to enable bank%d\n", bank_sel);
  87. return bank_sel;
  88. }
  89. cmd = flash->bank_write_cmd;
  90. ret = spi_flash_write_common(flash, &cmd, 1, &bank_sel, 1);
  91. if (ret < 0) {
  92. debug("SF: fail to write bank register\n");
  93. return ret;
  94. }
  95. flash->bank_curr = bank_sel;
  96. return 0;
  97. }
  98. static int spi_flash_bank(struct spi_flash *flash, u32 offset)
  99. {
  100. u8 bank_sel;
  101. int ret;
  102. bank_sel = offset / (SPI_FLASH_16MB_BOUN << flash->shift);
  103. ret = spi_flash_cmd_bankaddr_write(flash, bank_sel);
  104. if (ret) {
  105. debug("SF: fail to set bank%d\n", bank_sel);
  106. return ret;
  107. }
  108. return bank_sel;
  109. }
  110. #endif
  111. #ifdef CONFIG_SF_DUAL_FLASH
  112. static void spi_flash_dual_flash(struct spi_flash *flash, u32 *addr)
  113. {
  114. switch (flash->dual_flash) {
  115. case SF_DUAL_STACKED_FLASH:
  116. if (*addr >= (flash->size >> 1)) {
  117. *addr -= flash->size >> 1;
  118. flash->spi->flags |= SPI_XFER_U_PAGE;
  119. } else {
  120. flash->spi->flags &= ~SPI_XFER_U_PAGE;
  121. }
  122. break;
  123. case SF_DUAL_PARALLEL_FLASH:
  124. *addr >>= flash->shift;
  125. break;
  126. default:
  127. debug("SF: Unsupported dual_flash=%d\n", flash->dual_flash);
  128. break;
  129. }
  130. }
  131. #endif
  132. static int spi_flash_poll_status(struct spi_slave *spi, unsigned long timeout,
  133. u8 cmd, u8 poll_bit)
  134. {
  135. unsigned long timebase;
  136. unsigned long flags = SPI_XFER_BEGIN;
  137. int ret;
  138. u8 status;
  139. u8 check_status = 0x0;
  140. if (cmd == CMD_FLAG_STATUS)
  141. check_status = poll_bit;
  142. #ifdef CONFIG_SF_DUAL_FLASH
  143. if (spi->flags & SPI_XFER_U_PAGE)
  144. flags |= SPI_XFER_U_PAGE;
  145. #endif
  146. ret = spi_xfer(spi, 8, &cmd, NULL, flags);
  147. if (ret) {
  148. debug("SF: fail to read %s status register\n",
  149. cmd == CMD_READ_STATUS ? "read" : "flag");
  150. return ret;
  151. }
  152. timebase = get_timer(0);
  153. do {
  154. WATCHDOG_RESET();
  155. ret = spi_xfer(spi, 8, NULL, &status, 0);
  156. if (ret)
  157. return -1;
  158. if ((status & poll_bit) == check_status)
  159. break;
  160. } while (get_timer(timebase) < timeout);
  161. spi_xfer(spi, 0, NULL, NULL, SPI_XFER_END);
  162. if ((status & poll_bit) == check_status)
  163. return 0;
  164. /* Timed out */
  165. debug("SF: time out!\n");
  166. return -1;
  167. }
  168. int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
  169. {
  170. struct spi_slave *spi = flash->spi;
  171. int ret;
  172. u8 poll_bit = STATUS_WIP;
  173. u8 cmd = CMD_READ_STATUS;
  174. ret = spi_flash_poll_status(spi, timeout, cmd, poll_bit);
  175. if (ret < 0)
  176. return ret;
  177. if (flash->poll_cmd == CMD_FLAG_STATUS) {
  178. poll_bit = STATUS_PEC;
  179. cmd = CMD_FLAG_STATUS;
  180. ret = spi_flash_poll_status(spi, timeout, cmd, poll_bit);
  181. if (ret < 0)
  182. return ret;
  183. }
  184. return 0;
  185. }
  186. int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd,
  187. size_t cmd_len, const void *buf, size_t buf_len)
  188. {
  189. struct spi_slave *spi = flash->spi;
  190. unsigned long timeout = SPI_FLASH_PROG_TIMEOUT;
  191. int ret;
  192. if (buf == NULL)
  193. timeout = SPI_FLASH_PAGE_ERASE_TIMEOUT;
  194. ret = spi_claim_bus(flash->spi);
  195. if (ret) {
  196. debug("SF: unable to claim SPI bus\n");
  197. return ret;
  198. }
  199. ret = spi_flash_cmd_write_enable(flash);
  200. if (ret < 0) {
  201. debug("SF: enabling write failed\n");
  202. return ret;
  203. }
  204. ret = spi_flash_cmd_write(spi, cmd, cmd_len, buf, buf_len);
  205. if (ret < 0) {
  206. debug("SF: write cmd failed\n");
  207. return ret;
  208. }
  209. ret = spi_flash_cmd_wait_ready(flash, timeout);
  210. if (ret < 0) {
  211. debug("SF: write %s timed out\n",
  212. timeout == SPI_FLASH_PROG_TIMEOUT ?
  213. "program" : "page erase");
  214. return ret;
  215. }
  216. spi_release_bus(spi);
  217. return ret;
  218. }
  219. int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len)
  220. {
  221. u32 erase_size, erase_addr;
  222. u8 cmd[SPI_FLASH_CMD_LEN];
  223. int ret = -1;
  224. erase_size = flash->erase_size;
  225. if (offset % erase_size || len % erase_size) {
  226. debug("SF: Erase offset/length not multiple of erase size\n");
  227. return -1;
  228. }
  229. cmd[0] = flash->erase_cmd;
  230. while (len) {
  231. erase_addr = offset;
  232. #ifdef CONFIG_SF_DUAL_FLASH
  233. if (flash->dual_flash > SF_SINGLE_FLASH)
  234. spi_flash_dual_flash(flash, &erase_addr);
  235. #endif
  236. #ifdef CONFIG_SPI_FLASH_BAR
  237. ret = spi_flash_bank(flash, erase_addr);
  238. if (ret < 0)
  239. return ret;
  240. #endif
  241. spi_flash_addr(erase_addr, cmd);
  242. debug("SF: erase %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1],
  243. cmd[2], cmd[3], erase_addr);
  244. ret = spi_flash_write_common(flash, cmd, sizeof(cmd), NULL, 0);
  245. if (ret < 0) {
  246. debug("SF: erase failed\n");
  247. break;
  248. }
  249. offset += erase_size;
  250. len -= erase_size;
  251. }
  252. return ret;
  253. }
  254. int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset,
  255. size_t len, const void *buf)
  256. {
  257. unsigned long byte_addr, page_size;
  258. u32 write_addr;
  259. size_t chunk_len, actual;
  260. u8 cmd[SPI_FLASH_CMD_LEN];
  261. int ret = -1;
  262. page_size = flash->page_size;
  263. cmd[0] = flash->write_cmd;
  264. for (actual = 0; actual < len; actual += chunk_len) {
  265. write_addr = offset;
  266. #ifdef CONFIG_SF_DUAL_FLASH
  267. if (flash->dual_flash > SF_SINGLE_FLASH)
  268. spi_flash_dual_flash(flash, &write_addr);
  269. #endif
  270. #ifdef CONFIG_SPI_FLASH_BAR
  271. ret = spi_flash_bank(flash, write_addr);
  272. if (ret < 0)
  273. return ret;
  274. #endif
  275. byte_addr = offset % page_size;
  276. chunk_len = min(len - actual, (size_t)(page_size - byte_addr));
  277. if (flash->spi->max_write_size)
  278. chunk_len = min(chunk_len,
  279. (size_t)flash->spi->max_write_size);
  280. spi_flash_addr(write_addr, cmd);
  281. debug("SF: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x } chunk_len = %zu\n",
  282. buf + actual, cmd[0], cmd[1], cmd[2], cmd[3], chunk_len);
  283. ret = spi_flash_write_common(flash, cmd, sizeof(cmd),
  284. buf + actual, chunk_len);
  285. if (ret < 0) {
  286. debug("SF: write failed\n");
  287. break;
  288. }
  289. offset += chunk_len;
  290. }
  291. return ret;
  292. }
  293. int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,
  294. size_t cmd_len, void *data, size_t data_len)
  295. {
  296. struct spi_slave *spi = flash->spi;
  297. int ret;
  298. ret = spi_claim_bus(flash->spi);
  299. if (ret) {
  300. debug("SF: unable to claim SPI bus\n");
  301. return ret;
  302. }
  303. ret = spi_flash_cmd_read(spi, cmd, cmd_len, data, data_len);
  304. if (ret < 0) {
  305. debug("SF: read cmd failed\n");
  306. return ret;
  307. }
  308. spi_release_bus(spi);
  309. return ret;
  310. }
  311. void __weak spi_flash_copy_mmap(void *data, void *offset, size_t len)
  312. {
  313. memcpy(data, offset, len);
  314. }
  315. int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset,
  316. size_t len, void *data)
  317. {
  318. u8 *cmd, cmdsz;
  319. u32 remain_len, read_len, read_addr;
  320. int bank_sel = 0;
  321. int ret = -1;
  322. /* Handle memory-mapped SPI */
  323. if (flash->memory_map) {
  324. ret = spi_claim_bus(flash->spi);
  325. if (ret) {
  326. debug("SF: unable to claim SPI bus\n");
  327. return ret;
  328. }
  329. spi_xfer(flash->spi, 0, NULL, NULL, SPI_XFER_MMAP);
  330. spi_flash_copy_mmap(data, flash->memory_map + offset, len);
  331. spi_xfer(flash->spi, 0, NULL, NULL, SPI_XFER_MMAP_END);
  332. spi_release_bus(flash->spi);
  333. return 0;
  334. }
  335. cmdsz = SPI_FLASH_CMD_LEN + flash->dummy_byte;
  336. cmd = calloc(1, cmdsz);
  337. if (!cmd) {
  338. debug("SF: Failed to allocate cmd\n");
  339. return -ENOMEM;
  340. }
  341. cmd[0] = flash->read_cmd;
  342. while (len) {
  343. read_addr = offset;
  344. #ifdef CONFIG_SF_DUAL_FLASH
  345. if (flash->dual_flash > SF_SINGLE_FLASH)
  346. spi_flash_dual_flash(flash, &read_addr);
  347. #endif
  348. #ifdef CONFIG_SPI_FLASH_BAR
  349. bank_sel = spi_flash_bank(flash, read_addr);
  350. if (bank_sel < 0)
  351. return ret;
  352. #endif
  353. remain_len = ((SPI_FLASH_16MB_BOUN << flash->shift) *
  354. (bank_sel + 1)) - offset;
  355. if (len < remain_len)
  356. read_len = len;
  357. else
  358. read_len = remain_len;
  359. spi_flash_addr(read_addr, cmd);
  360. ret = spi_flash_read_common(flash, cmd, cmdsz, data, read_len);
  361. if (ret < 0) {
  362. debug("SF: read failed\n");
  363. break;
  364. }
  365. offset += read_len;
  366. len -= read_len;
  367. data += read_len;
  368. }
  369. free(cmd);
  370. return ret;
  371. }
  372. #ifdef CONFIG_SPI_FLASH_SST
  373. static int sst_byte_write(struct spi_flash *flash, u32 offset, const void *buf)
  374. {
  375. int ret;
  376. u8 cmd[4] = {
  377. CMD_SST_BP,
  378. offset >> 16,
  379. offset >> 8,
  380. offset,
  381. };
  382. debug("BP[%02x]: 0x%p => cmd = { 0x%02x 0x%06x }\n",
  383. spi_w8r8(flash->spi, CMD_READ_STATUS), buf, cmd[0], offset);
  384. ret = spi_flash_cmd_write_enable(flash);
  385. if (ret)
  386. return ret;
  387. ret = spi_flash_cmd_write(flash->spi, cmd, sizeof(cmd), buf, 1);
  388. if (ret)
  389. return ret;
  390. return spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);
  391. }
  392. int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,
  393. const void *buf)
  394. {
  395. size_t actual, cmd_len;
  396. int ret;
  397. u8 cmd[4];
  398. ret = spi_claim_bus(flash->spi);
  399. if (ret) {
  400. debug("SF: Unable to claim SPI bus\n");
  401. return ret;
  402. }
  403. /* If the data is not word aligned, write out leading single byte */
  404. actual = offset % 2;
  405. if (actual) {
  406. ret = sst_byte_write(flash, offset, buf);
  407. if (ret)
  408. goto done;
  409. }
  410. offset += actual;
  411. ret = spi_flash_cmd_write_enable(flash);
  412. if (ret)
  413. goto done;
  414. cmd_len = 4;
  415. cmd[0] = CMD_SST_AAI_WP;
  416. cmd[1] = offset >> 16;
  417. cmd[2] = offset >> 8;
  418. cmd[3] = offset;
  419. for (; actual < len - 1; actual += 2) {
  420. debug("WP[%02x]: 0x%p => cmd = { 0x%02x 0x%06x }\n",
  421. spi_w8r8(flash->spi, CMD_READ_STATUS), buf + actual,
  422. cmd[0], offset);
  423. ret = spi_flash_cmd_write(flash->spi, cmd, cmd_len,
  424. buf + actual, 2);
  425. if (ret) {
  426. debug("SF: sst word program failed\n");
  427. break;
  428. }
  429. ret = spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);
  430. if (ret)
  431. break;
  432. cmd_len = 1;
  433. offset += 2;
  434. }
  435. if (!ret)
  436. ret = spi_flash_cmd_write_disable(flash);
  437. /* If there is a single trailing byte, write it out */
  438. if (!ret && actual != len)
  439. ret = sst_byte_write(flash, offset, buf + actual);
  440. done:
  441. debug("SF: sst: program %s %zu bytes @ 0x%zx\n",
  442. ret ? "failure" : "success", len, offset - actual);
  443. spi_release_bus(flash->spi);
  444. return ret;
  445. }
  446. int sst_write_bp(struct spi_flash *flash, u32 offset, size_t len,
  447. const void *buf)
  448. {
  449. size_t actual;
  450. int ret;
  451. ret = spi_claim_bus(flash->spi);
  452. if (ret) {
  453. debug("SF: Unable to claim SPI bus\n");
  454. return ret;
  455. }
  456. for (actual = 0; actual < len; actual++) {
  457. ret = sst_byte_write(flash, offset, buf + actual);
  458. if (ret) {
  459. debug("SF: sst byte program failed\n");
  460. break;
  461. }
  462. offset++;
  463. }
  464. if (!ret)
  465. ret = spi_flash_cmd_write_disable(flash);
  466. debug("SF: sst: program %s %zu bytes @ 0x%zx\n",
  467. ret ? "failure" : "success", len, offset - actual);
  468. spi_release_bus(flash->spi);
  469. return ret;
  470. }
  471. #endif