cadence_qspi_apb.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898
  1. /*
  2. * Copyright (C) 2012 Altera Corporation <www.altera.com>
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. * - Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * - Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. * - Neither the name of the Altera Corporation nor the
  13. * names of its contributors may be used to endorse or promote products
  14. * derived from this software without specific prior written permission.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  17. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  19. * ARE DISCLAIMED. IN NO EVENT SHALL ALTERA CORPORATION BE LIABLE FOR ANY
  20. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  21. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  22. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  23. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  25. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. #include <common.h>
  28. #include <asm/io.h>
  29. #include <asm/errno.h>
  30. #include "cadence_qspi.h"
  31. #define CQSPI_REG_POLL_US (1) /* 1us */
  32. #define CQSPI_REG_RETRY (10000)
  33. #define CQSPI_POLL_IDLE_RETRY (3)
  34. #define CQSPI_FIFO_WIDTH (4)
  35. /* Controller sram size in word */
  36. #define CQSPI_REG_SRAM_SIZE_WORD (128)
  37. #define CQSPI_REG_SRAM_RESV_WORDS (2)
  38. #define CQSPI_REG_SRAM_PARTITION_WR (1)
  39. #define CQSPI_REG_SRAM_PARTITION_RD \
  40. (CQSPI_REG_SRAM_SIZE_WORD - CQSPI_REG_SRAM_RESV_WORDS)
  41. #define CQSPI_REG_SRAM_THRESHOLD_WORDS (50)
  42. /* Transfer mode */
  43. #define CQSPI_INST_TYPE_SINGLE (0)
  44. #define CQSPI_INST_TYPE_DUAL (1)
  45. #define CQSPI_INST_TYPE_QUAD (2)
  46. #define CQSPI_STIG_DATA_LEN_MAX (8)
  47. #define CQSPI_INDIRECTTRIGGER_ADDR_MASK (0xFFFFF)
  48. #define CQSPI_DUMMY_CLKS_PER_BYTE (8)
  49. #define CQSPI_DUMMY_BYTES_MAX (4)
  50. #define CQSPI_REG_SRAM_FILL_THRESHOLD \
  51. ((CQSPI_REG_SRAM_SIZE_WORD / 2) * CQSPI_FIFO_WIDTH)
  52. /****************************************************************************
  53. * Controller's configuration and status register (offset from QSPI_BASE)
  54. ****************************************************************************/
  55. #define CQSPI_REG_CONFIG 0x00
  56. #define CQSPI_REG_CONFIG_CLK_POL_LSB 1
  57. #define CQSPI_REG_CONFIG_CLK_PHA_LSB 2
  58. #define CQSPI_REG_CONFIG_ENABLE_MASK (1 << 0)
  59. #define CQSPI_REG_CONFIG_DIRECT_MASK (1 << 7)
  60. #define CQSPI_REG_CONFIG_DECODE_MASK (1 << 9)
  61. #define CQSPI_REG_CONFIG_XIP_IMM_MASK (1 << 18)
  62. #define CQSPI_REG_CONFIG_CHIPSELECT_LSB 10
  63. #define CQSPI_REG_CONFIG_BAUD_LSB 19
  64. #define CQSPI_REG_CONFIG_IDLE_LSB 31
  65. #define CQSPI_REG_CONFIG_CHIPSELECT_MASK 0xF
  66. #define CQSPI_REG_CONFIG_BAUD_MASK 0xF
  67. #define CQSPI_REG_RD_INSTR 0x04
  68. #define CQSPI_REG_RD_INSTR_OPCODE_LSB 0
  69. #define CQSPI_REG_RD_INSTR_TYPE_INSTR_LSB 8
  70. #define CQSPI_REG_RD_INSTR_TYPE_ADDR_LSB 12
  71. #define CQSPI_REG_RD_INSTR_TYPE_DATA_LSB 16
  72. #define CQSPI_REG_RD_INSTR_MODE_EN_LSB 20
  73. #define CQSPI_REG_RD_INSTR_DUMMY_LSB 24
  74. #define CQSPI_REG_RD_INSTR_TYPE_INSTR_MASK 0x3
  75. #define CQSPI_REG_RD_INSTR_TYPE_ADDR_MASK 0x3
  76. #define CQSPI_REG_RD_INSTR_TYPE_DATA_MASK 0x3
  77. #define CQSPI_REG_RD_INSTR_DUMMY_MASK 0x1F
  78. #define CQSPI_REG_WR_INSTR 0x08
  79. #define CQSPI_REG_WR_INSTR_OPCODE_LSB 0
  80. #define CQSPI_REG_DELAY 0x0C
  81. #define CQSPI_REG_DELAY_TSLCH_LSB 0
  82. #define CQSPI_REG_DELAY_TCHSH_LSB 8
  83. #define CQSPI_REG_DELAY_TSD2D_LSB 16
  84. #define CQSPI_REG_DELAY_TSHSL_LSB 24
  85. #define CQSPI_REG_DELAY_TSLCH_MASK 0xFF
  86. #define CQSPI_REG_DELAY_TCHSH_MASK 0xFF
  87. #define CQSPI_REG_DELAY_TSD2D_MASK 0xFF
  88. #define CQSPI_REG_DELAY_TSHSL_MASK 0xFF
  89. #define CQSPI_READLCAPTURE 0x10
  90. #define CQSPI_READLCAPTURE_BYPASS_LSB 0
  91. #define CQSPI_READLCAPTURE_DELAY_LSB 1
  92. #define CQSPI_READLCAPTURE_DELAY_MASK 0xF
  93. #define CQSPI_REG_SIZE 0x14
  94. #define CQSPI_REG_SIZE_ADDRESS_LSB 0
  95. #define CQSPI_REG_SIZE_PAGE_LSB 4
  96. #define CQSPI_REG_SIZE_BLOCK_LSB 16
  97. #define CQSPI_REG_SIZE_ADDRESS_MASK 0xF
  98. #define CQSPI_REG_SIZE_PAGE_MASK 0xFFF
  99. #define CQSPI_REG_SIZE_BLOCK_MASK 0x3F
  100. #define CQSPI_REG_SRAMPARTITION 0x18
  101. #define CQSPI_REG_INDIRECTTRIGGER 0x1C
  102. #define CQSPI_REG_REMAP 0x24
  103. #define CQSPI_REG_MODE_BIT 0x28
  104. #define CQSPI_REG_SDRAMLEVEL 0x2C
  105. #define CQSPI_REG_SDRAMLEVEL_RD_LSB 0
  106. #define CQSPI_REG_SDRAMLEVEL_WR_LSB 16
  107. #define CQSPI_REG_SDRAMLEVEL_RD_MASK 0xFFFF
  108. #define CQSPI_REG_SDRAMLEVEL_WR_MASK 0xFFFF
  109. #define CQSPI_REG_IRQSTATUS 0x40
  110. #define CQSPI_REG_IRQMASK 0x44
  111. #define CQSPI_REG_INDIRECTRD 0x60
  112. #define CQSPI_REG_INDIRECTRD_START_MASK (1 << 0)
  113. #define CQSPI_REG_INDIRECTRD_CANCEL_MASK (1 << 1)
  114. #define CQSPI_REG_INDIRECTRD_INPROGRESS_MASK (1 << 2)
  115. #define CQSPI_REG_INDIRECTRD_DONE_MASK (1 << 5)
  116. #define CQSPI_REG_INDIRECTRDWATERMARK 0x64
  117. #define CQSPI_REG_INDIRECTRDSTARTADDR 0x68
  118. #define CQSPI_REG_INDIRECTRDBYTES 0x6C
  119. #define CQSPI_REG_CMDCTRL 0x90
  120. #define CQSPI_REG_CMDCTRL_EXECUTE_MASK (1 << 0)
  121. #define CQSPI_REG_CMDCTRL_INPROGRESS_MASK (1 << 1)
  122. #define CQSPI_REG_CMDCTRL_DUMMY_LSB 7
  123. #define CQSPI_REG_CMDCTRL_WR_BYTES_LSB 12
  124. #define CQSPI_REG_CMDCTRL_WR_EN_LSB 15
  125. #define CQSPI_REG_CMDCTRL_ADD_BYTES_LSB 16
  126. #define CQSPI_REG_CMDCTRL_ADDR_EN_LSB 19
  127. #define CQSPI_REG_CMDCTRL_RD_BYTES_LSB 20
  128. #define CQSPI_REG_CMDCTRL_RD_EN_LSB 23
  129. #define CQSPI_REG_CMDCTRL_OPCODE_LSB 24
  130. #define CQSPI_REG_CMDCTRL_DUMMY_MASK 0x1F
  131. #define CQSPI_REG_CMDCTRL_WR_BYTES_MASK 0x7
  132. #define CQSPI_REG_CMDCTRL_ADD_BYTES_MASK 0x3
  133. #define CQSPI_REG_CMDCTRL_RD_BYTES_MASK 0x7
  134. #define CQSPI_REG_CMDCTRL_OPCODE_MASK 0xFF
  135. #define CQSPI_REG_INDIRECTWR 0x70
  136. #define CQSPI_REG_INDIRECTWR_START_MASK (1 << 0)
  137. #define CQSPI_REG_INDIRECTWR_CANCEL_MASK (1 << 1)
  138. #define CQSPI_REG_INDIRECTWR_INPROGRESS_MASK (1 << 2)
  139. #define CQSPI_REG_INDIRECTWR_DONE_MASK (1 << 5)
  140. #define CQSPI_REG_INDIRECTWRWATERMARK 0x74
  141. #define CQSPI_REG_INDIRECTWRSTARTADDR 0x78
  142. #define CQSPI_REG_INDIRECTWRBYTES 0x7C
  143. #define CQSPI_REG_CMDADDRESS 0x94
  144. #define CQSPI_REG_CMDREADDATALOWER 0xA0
  145. #define CQSPI_REG_CMDREADDATAUPPER 0xA4
  146. #define CQSPI_REG_CMDWRITEDATALOWER 0xA8
  147. #define CQSPI_REG_CMDWRITEDATAUPPER 0xAC
  148. #define CQSPI_REG_IS_IDLE(base) \
  149. ((readl(base + CQSPI_REG_CONFIG) >> \
  150. CQSPI_REG_CONFIG_IDLE_LSB) & 0x1)
  151. #define CQSPI_CAL_DELAY(tdelay_ns, tref_ns, tsclk_ns) \
  152. ((((tdelay_ns) - (tsclk_ns)) / (tref_ns)))
  153. #define CQSPI_GET_RD_SRAM_LEVEL(reg_base) \
  154. (((readl(reg_base + CQSPI_REG_SDRAMLEVEL)) >> \
  155. CQSPI_REG_SDRAMLEVEL_RD_LSB) & CQSPI_REG_SDRAMLEVEL_RD_MASK)
  156. #define CQSPI_GET_WR_SRAM_LEVEL(reg_base) \
  157. (((readl(reg_base + CQSPI_REG_SDRAMLEVEL)) >> \
  158. CQSPI_REG_SDRAMLEVEL_WR_LSB) & CQSPI_REG_SDRAMLEVEL_WR_MASK)
  159. static unsigned int cadence_qspi_apb_cmd2addr(const unsigned char *addr_buf,
  160. unsigned int addr_width)
  161. {
  162. unsigned int addr;
  163. addr = (addr_buf[0] << 16) | (addr_buf[1] << 8) | addr_buf[2];
  164. if (addr_width == 4)
  165. addr = (addr << 8) | addr_buf[3];
  166. return addr;
  167. }
  168. static void cadence_qspi_apb_read_fifo_data(void *dest,
  169. const void *src_ahb_addr, unsigned int bytes)
  170. {
  171. unsigned int temp;
  172. int remaining = bytes;
  173. unsigned int *dest_ptr = (unsigned int *)dest;
  174. unsigned int *src_ptr = (unsigned int *)src_ahb_addr;
  175. while (remaining > 0) {
  176. if (remaining >= CQSPI_FIFO_WIDTH) {
  177. *dest_ptr = readl(src_ptr);
  178. remaining -= CQSPI_FIFO_WIDTH;
  179. } else {
  180. /* dangling bytes */
  181. temp = readl(src_ptr);
  182. memcpy(dest_ptr, &temp, remaining);
  183. break;
  184. }
  185. dest_ptr++;
  186. }
  187. return;
  188. }
  189. static void cadence_qspi_apb_write_fifo_data(const void *dest_ahb_addr,
  190. const void *src, unsigned int bytes)
  191. {
  192. unsigned int temp;
  193. int remaining = bytes;
  194. unsigned int *dest_ptr = (unsigned int *)dest_ahb_addr;
  195. unsigned int *src_ptr = (unsigned int *)src;
  196. while (remaining > 0) {
  197. if (remaining >= CQSPI_FIFO_WIDTH) {
  198. writel(*src_ptr, dest_ptr);
  199. remaining -= sizeof(unsigned int);
  200. } else {
  201. /* dangling bytes */
  202. memcpy(&temp, src_ptr, remaining);
  203. writel(temp, dest_ptr);
  204. break;
  205. }
  206. src_ptr++;
  207. }
  208. return;
  209. }
  210. /* Read from SRAM FIFO with polling SRAM fill level. */
  211. static int qspi_read_sram_fifo_poll(const void *reg_base, void *dest_addr,
  212. const void *src_addr, unsigned int num_bytes)
  213. {
  214. unsigned int remaining = num_bytes;
  215. unsigned int retry;
  216. unsigned int sram_level = 0;
  217. unsigned char *dest = (unsigned char *)dest_addr;
  218. while (remaining > 0) {
  219. retry = CQSPI_REG_RETRY;
  220. while (retry--) {
  221. sram_level = CQSPI_GET_RD_SRAM_LEVEL(reg_base);
  222. if (sram_level)
  223. break;
  224. udelay(1);
  225. }
  226. if (!retry) {
  227. printf("QSPI: No receive data after polling for %d times\n",
  228. CQSPI_REG_RETRY);
  229. return -1;
  230. }
  231. sram_level *= CQSPI_FIFO_WIDTH;
  232. sram_level = sram_level > remaining ? remaining : sram_level;
  233. /* Read data from FIFO. */
  234. cadence_qspi_apb_read_fifo_data(dest, src_addr, sram_level);
  235. dest += sram_level;
  236. remaining -= sram_level;
  237. udelay(1);
  238. }
  239. return 0;
  240. }
  241. /* Write to SRAM FIFO with polling SRAM fill level. */
  242. static int qpsi_write_sram_fifo_push(struct cadence_spi_platdata *plat,
  243. const void *src_addr, unsigned int num_bytes)
  244. {
  245. const void *reg_base = plat->regbase;
  246. void *dest_addr = plat->ahbbase;
  247. unsigned int retry = CQSPI_REG_RETRY;
  248. unsigned int sram_level;
  249. unsigned int wr_bytes;
  250. unsigned char *src = (unsigned char *)src_addr;
  251. int remaining = num_bytes;
  252. unsigned int page_size = plat->page_size;
  253. unsigned int sram_threshold_words = CQSPI_REG_SRAM_THRESHOLD_WORDS;
  254. while (remaining > 0) {
  255. retry = CQSPI_REG_RETRY;
  256. while (retry--) {
  257. sram_level = CQSPI_GET_WR_SRAM_LEVEL(reg_base);
  258. if (sram_level <= sram_threshold_words)
  259. break;
  260. }
  261. if (!retry) {
  262. printf("QSPI: SRAM fill level (0x%08x) not hit lower expected level (0x%08x)",
  263. sram_level, sram_threshold_words);
  264. return -1;
  265. }
  266. /* Write a page or remaining bytes. */
  267. wr_bytes = (remaining > page_size) ?
  268. page_size : remaining;
  269. cadence_qspi_apb_write_fifo_data(dest_addr, src, wr_bytes);
  270. src += wr_bytes;
  271. remaining -= wr_bytes;
  272. }
  273. return 0;
  274. }
  275. void cadence_qspi_apb_controller_enable(void *reg_base)
  276. {
  277. unsigned int reg;
  278. reg = readl(reg_base + CQSPI_REG_CONFIG);
  279. reg |= CQSPI_REG_CONFIG_ENABLE_MASK;
  280. writel(reg, reg_base + CQSPI_REG_CONFIG);
  281. return;
  282. }
  283. void cadence_qspi_apb_controller_disable(void *reg_base)
  284. {
  285. unsigned int reg;
  286. reg = readl(reg_base + CQSPI_REG_CONFIG);
  287. reg &= ~CQSPI_REG_CONFIG_ENABLE_MASK;
  288. writel(reg, reg_base + CQSPI_REG_CONFIG);
  289. return;
  290. }
  291. /* Return 1 if idle, otherwise return 0 (busy). */
  292. static unsigned int cadence_qspi_wait_idle(void *reg_base)
  293. {
  294. unsigned int start, count = 0;
  295. /* timeout in unit of ms */
  296. unsigned int timeout = 5000;
  297. start = get_timer(0);
  298. for ( ; get_timer(start) < timeout ; ) {
  299. if (CQSPI_REG_IS_IDLE(reg_base))
  300. count++;
  301. else
  302. count = 0;
  303. /*
  304. * Ensure the QSPI controller is in true idle state after
  305. * reading back the same idle status consecutively
  306. */
  307. if (count >= CQSPI_POLL_IDLE_RETRY)
  308. return 1;
  309. }
  310. /* Timeout, still in busy mode. */
  311. printf("QSPI: QSPI is still busy after poll for %d times.\n",
  312. CQSPI_REG_RETRY);
  313. return 0;
  314. }
  315. void cadence_qspi_apb_readdata_capture(void *reg_base,
  316. unsigned int bypass, unsigned int delay)
  317. {
  318. unsigned int reg;
  319. cadence_qspi_apb_controller_disable(reg_base);
  320. reg = readl(reg_base + CQSPI_READLCAPTURE);
  321. if (bypass)
  322. reg |= (1 << CQSPI_READLCAPTURE_BYPASS_LSB);
  323. else
  324. reg &= ~(1 << CQSPI_READLCAPTURE_BYPASS_LSB);
  325. reg &= ~(CQSPI_READLCAPTURE_DELAY_MASK
  326. << CQSPI_READLCAPTURE_DELAY_LSB);
  327. reg |= ((delay & CQSPI_READLCAPTURE_DELAY_MASK)
  328. << CQSPI_READLCAPTURE_DELAY_LSB);
  329. writel(reg, reg_base + CQSPI_READLCAPTURE);
  330. cadence_qspi_apb_controller_enable(reg_base);
  331. return;
  332. }
  333. void cadence_qspi_apb_config_baudrate_div(void *reg_base,
  334. unsigned int ref_clk_hz, unsigned int sclk_hz)
  335. {
  336. unsigned int reg;
  337. unsigned int div;
  338. cadence_qspi_apb_controller_disable(reg_base);
  339. reg = readl(reg_base + CQSPI_REG_CONFIG);
  340. reg &= ~(CQSPI_REG_CONFIG_BAUD_MASK << CQSPI_REG_CONFIG_BAUD_LSB);
  341. div = ref_clk_hz / sclk_hz;
  342. if (div > 32)
  343. div = 32;
  344. /* Check if even number. */
  345. if ((div & 1)) {
  346. div = (div / 2);
  347. } else {
  348. if (ref_clk_hz % sclk_hz)
  349. /* ensure generated SCLK doesn't exceed user
  350. specified sclk_hz */
  351. div = (div / 2);
  352. else
  353. div = (div / 2) - 1;
  354. }
  355. debug("%s: ref_clk %dHz sclk %dHz Div 0x%x\n", __func__,
  356. ref_clk_hz, sclk_hz, div);
  357. div = (div & CQSPI_REG_CONFIG_BAUD_MASK) << CQSPI_REG_CONFIG_BAUD_LSB;
  358. reg |= div;
  359. writel(reg, reg_base + CQSPI_REG_CONFIG);
  360. cadence_qspi_apb_controller_enable(reg_base);
  361. return;
  362. }
  363. void cadence_qspi_apb_set_clk_mode(void *reg_base,
  364. unsigned int clk_pol, unsigned int clk_pha)
  365. {
  366. unsigned int reg;
  367. cadence_qspi_apb_controller_disable(reg_base);
  368. reg = readl(reg_base + CQSPI_REG_CONFIG);
  369. reg &= ~(1 <<
  370. (CQSPI_REG_CONFIG_CLK_POL_LSB | CQSPI_REG_CONFIG_CLK_PHA_LSB));
  371. reg |= ((clk_pol & 0x1) << CQSPI_REG_CONFIG_CLK_POL_LSB);
  372. reg |= ((clk_pha & 0x1) << CQSPI_REG_CONFIG_CLK_PHA_LSB);
  373. writel(reg, reg_base + CQSPI_REG_CONFIG);
  374. cadence_qspi_apb_controller_enable(reg_base);
  375. return;
  376. }
  377. void cadence_qspi_apb_chipselect(void *reg_base,
  378. unsigned int chip_select, unsigned int decoder_enable)
  379. {
  380. unsigned int reg;
  381. cadence_qspi_apb_controller_disable(reg_base);
  382. debug("%s : chipselect %d decode %d\n", __func__, chip_select,
  383. decoder_enable);
  384. reg = readl(reg_base + CQSPI_REG_CONFIG);
  385. /* docoder */
  386. if (decoder_enable) {
  387. reg |= CQSPI_REG_CONFIG_DECODE_MASK;
  388. } else {
  389. reg &= ~CQSPI_REG_CONFIG_DECODE_MASK;
  390. /* Convert CS if without decoder.
  391. * CS0 to 4b'1110
  392. * CS1 to 4b'1101
  393. * CS2 to 4b'1011
  394. * CS3 to 4b'0111
  395. */
  396. chip_select = 0xF & ~(1 << chip_select);
  397. }
  398. reg &= ~(CQSPI_REG_CONFIG_CHIPSELECT_MASK
  399. << CQSPI_REG_CONFIG_CHIPSELECT_LSB);
  400. reg |= (chip_select & CQSPI_REG_CONFIG_CHIPSELECT_MASK)
  401. << CQSPI_REG_CONFIG_CHIPSELECT_LSB;
  402. writel(reg, reg_base + CQSPI_REG_CONFIG);
  403. cadence_qspi_apb_controller_enable(reg_base);
  404. return;
  405. }
  406. void cadence_qspi_apb_delay(void *reg_base,
  407. unsigned int ref_clk, unsigned int sclk_hz,
  408. unsigned int tshsl_ns, unsigned int tsd2d_ns,
  409. unsigned int tchsh_ns, unsigned int tslch_ns)
  410. {
  411. unsigned int ref_clk_ns;
  412. unsigned int sclk_ns;
  413. unsigned int tshsl, tchsh, tslch, tsd2d;
  414. unsigned int reg;
  415. cadence_qspi_apb_controller_disable(reg_base);
  416. /* Convert to ns. */
  417. ref_clk_ns = (1000000000) / ref_clk;
  418. /* Convert to ns. */
  419. sclk_ns = (1000000000) / sclk_hz;
  420. /* Plus 1 to round up 1 clock cycle. */
  421. tshsl = CQSPI_CAL_DELAY(tshsl_ns, ref_clk_ns, sclk_ns) + 1;
  422. tchsh = CQSPI_CAL_DELAY(tchsh_ns, ref_clk_ns, sclk_ns) + 1;
  423. tslch = CQSPI_CAL_DELAY(tslch_ns, ref_clk_ns, sclk_ns) + 1;
  424. tsd2d = CQSPI_CAL_DELAY(tsd2d_ns, ref_clk_ns, sclk_ns) + 1;
  425. reg = ((tshsl & CQSPI_REG_DELAY_TSHSL_MASK)
  426. << CQSPI_REG_DELAY_TSHSL_LSB);
  427. reg |= ((tchsh & CQSPI_REG_DELAY_TCHSH_MASK)
  428. << CQSPI_REG_DELAY_TCHSH_LSB);
  429. reg |= ((tslch & CQSPI_REG_DELAY_TSLCH_MASK)
  430. << CQSPI_REG_DELAY_TSLCH_LSB);
  431. reg |= ((tsd2d & CQSPI_REG_DELAY_TSD2D_MASK)
  432. << CQSPI_REG_DELAY_TSD2D_LSB);
  433. writel(reg, reg_base + CQSPI_REG_DELAY);
  434. cadence_qspi_apb_controller_enable(reg_base);
  435. return;
  436. }
  437. void cadence_qspi_apb_controller_init(struct cadence_spi_platdata *plat)
  438. {
  439. unsigned reg;
  440. cadence_qspi_apb_controller_disable(plat->regbase);
  441. /* Configure the device size and address bytes */
  442. reg = readl(plat->regbase + CQSPI_REG_SIZE);
  443. /* Clear the previous value */
  444. reg &= ~(CQSPI_REG_SIZE_PAGE_MASK << CQSPI_REG_SIZE_PAGE_LSB);
  445. reg &= ~(CQSPI_REG_SIZE_BLOCK_MASK << CQSPI_REG_SIZE_BLOCK_LSB);
  446. reg |= (plat->page_size << CQSPI_REG_SIZE_PAGE_LSB);
  447. reg |= (plat->block_size << CQSPI_REG_SIZE_BLOCK_LSB);
  448. writel(reg, plat->regbase + CQSPI_REG_SIZE);
  449. /* Configure the remap address register, no remap */
  450. writel(0, plat->regbase + CQSPI_REG_REMAP);
  451. /* Disable all interrupts */
  452. writel(0, plat->regbase + CQSPI_REG_IRQMASK);
  453. cadence_qspi_apb_controller_enable(plat->regbase);
  454. return;
  455. }
  456. static int cadence_qspi_apb_exec_flash_cmd(void *reg_base,
  457. unsigned int reg)
  458. {
  459. unsigned int retry = CQSPI_REG_RETRY;
  460. /* Write the CMDCTRL without start execution. */
  461. writel(reg, reg_base + CQSPI_REG_CMDCTRL);
  462. /* Start execute */
  463. reg |= CQSPI_REG_CMDCTRL_EXECUTE_MASK;
  464. writel(reg, reg_base + CQSPI_REG_CMDCTRL);
  465. while (retry--) {
  466. reg = readl(reg_base + CQSPI_REG_CMDCTRL);
  467. if ((reg & CQSPI_REG_CMDCTRL_INPROGRESS_MASK) == 0)
  468. break;
  469. udelay(1);
  470. }
  471. if (!retry) {
  472. printf("QSPI: flash command execution timeout\n");
  473. return -EIO;
  474. }
  475. /* Polling QSPI idle status. */
  476. if (!cadence_qspi_wait_idle(reg_base))
  477. return -EIO;
  478. return 0;
  479. }
  480. /* For command RDID, RDSR. */
  481. int cadence_qspi_apb_command_read(void *reg_base,
  482. unsigned int cmdlen, const u8 *cmdbuf, unsigned int rxlen,
  483. u8 *rxbuf)
  484. {
  485. unsigned int reg;
  486. unsigned int read_len;
  487. int status;
  488. if (!cmdlen || rxlen > CQSPI_STIG_DATA_LEN_MAX || rxbuf == NULL) {
  489. printf("QSPI: Invalid input arguments cmdlen %d rxlen %d\n",
  490. cmdlen, rxlen);
  491. return -EINVAL;
  492. }
  493. reg = cmdbuf[0] << CQSPI_REG_CMDCTRL_OPCODE_LSB;
  494. reg |= (0x1 << CQSPI_REG_CMDCTRL_RD_EN_LSB);
  495. /* 0 means 1 byte. */
  496. reg |= (((rxlen - 1) & CQSPI_REG_CMDCTRL_RD_BYTES_MASK)
  497. << CQSPI_REG_CMDCTRL_RD_BYTES_LSB);
  498. status = cadence_qspi_apb_exec_flash_cmd(reg_base, reg);
  499. if (status != 0)
  500. return status;
  501. reg = readl(reg_base + CQSPI_REG_CMDREADDATALOWER);
  502. /* Put the read value into rx_buf */
  503. read_len = (rxlen > 4) ? 4 : rxlen;
  504. memcpy(rxbuf, &reg, read_len);
  505. rxbuf += read_len;
  506. if (rxlen > 4) {
  507. reg = readl(reg_base + CQSPI_REG_CMDREADDATAUPPER);
  508. read_len = rxlen - read_len;
  509. memcpy(rxbuf, &reg, read_len);
  510. }
  511. return 0;
  512. }
  513. /* For commands: WRSR, WREN, WRDI, CHIP_ERASE, BE, etc. */
  514. int cadence_qspi_apb_command_write(void *reg_base, unsigned int cmdlen,
  515. const u8 *cmdbuf, unsigned int txlen, const u8 *txbuf)
  516. {
  517. unsigned int reg = 0;
  518. unsigned int addr_value;
  519. unsigned int wr_data;
  520. unsigned int wr_len;
  521. if (!cmdlen || cmdlen > 5 || txlen > 8 || cmdbuf == NULL) {
  522. printf("QSPI: Invalid input arguments cmdlen %d txlen %d\n",
  523. cmdlen, txlen);
  524. return -EINVAL;
  525. }
  526. reg |= cmdbuf[0] << CQSPI_REG_CMDCTRL_OPCODE_LSB;
  527. if (cmdlen == 4 || cmdlen == 5) {
  528. /* Command with address */
  529. reg |= (0x1 << CQSPI_REG_CMDCTRL_ADDR_EN_LSB);
  530. /* Number of bytes to write. */
  531. reg |= ((cmdlen - 2) & CQSPI_REG_CMDCTRL_ADD_BYTES_MASK)
  532. << CQSPI_REG_CMDCTRL_ADD_BYTES_LSB;
  533. /* Get address */
  534. addr_value = cadence_qspi_apb_cmd2addr(&cmdbuf[1],
  535. cmdlen >= 5 ? 4 : 3);
  536. writel(addr_value, reg_base + CQSPI_REG_CMDADDRESS);
  537. }
  538. if (txlen) {
  539. /* writing data = yes */
  540. reg |= (0x1 << CQSPI_REG_CMDCTRL_WR_EN_LSB);
  541. reg |= ((txlen - 1) & CQSPI_REG_CMDCTRL_WR_BYTES_MASK)
  542. << CQSPI_REG_CMDCTRL_WR_BYTES_LSB;
  543. wr_len = txlen > 4 ? 4 : txlen;
  544. memcpy(&wr_data, txbuf, wr_len);
  545. writel(wr_data, reg_base +
  546. CQSPI_REG_CMDWRITEDATALOWER);
  547. if (txlen > 4) {
  548. txbuf += wr_len;
  549. wr_len = txlen - wr_len;
  550. memcpy(&wr_data, txbuf, wr_len);
  551. writel(wr_data, reg_base +
  552. CQSPI_REG_CMDWRITEDATAUPPER);
  553. }
  554. }
  555. /* Execute the command */
  556. return cadence_qspi_apb_exec_flash_cmd(reg_base, reg);
  557. }
  558. /* Opcode + Address (3/4 bytes) + dummy bytes (0-4 bytes) */
  559. int cadence_qspi_apb_indirect_read_setup(struct cadence_spi_platdata *plat,
  560. unsigned int cmdlen, const u8 *cmdbuf)
  561. {
  562. unsigned int reg;
  563. unsigned int rd_reg;
  564. unsigned int addr_value;
  565. unsigned int dummy_clk;
  566. unsigned int dummy_bytes;
  567. unsigned int addr_bytes;
  568. /*
  569. * Identify addr_byte. All NOR flash device drivers are using fast read
  570. * which always expecting 1 dummy byte, 1 cmd byte and 3/4 addr byte.
  571. * With that, the length is in value of 5 or 6. Only FRAM chip from
  572. * ramtron using normal read (which won't need dummy byte).
  573. * Unlikely NOR flash using normal read due to performance issue.
  574. */
  575. if (cmdlen >= 5)
  576. /* to cater fast read where cmd + addr + dummy */
  577. addr_bytes = cmdlen - 2;
  578. else
  579. /* for normal read (only ramtron as of now) */
  580. addr_bytes = cmdlen - 1;
  581. /* Setup the indirect trigger address */
  582. writel(((u32)plat->ahbbase & CQSPI_INDIRECTTRIGGER_ADDR_MASK),
  583. plat->regbase + CQSPI_REG_INDIRECTTRIGGER);
  584. /* Configure SRAM partition for read. */
  585. writel(CQSPI_REG_SRAM_PARTITION_RD, plat->regbase +
  586. CQSPI_REG_SRAMPARTITION);
  587. /* Configure the opcode */
  588. rd_reg = cmdbuf[0] << CQSPI_REG_RD_INSTR_OPCODE_LSB;
  589. #if (CONFIG_SPI_FLASH_QUAD == 1)
  590. /* Instruction and address at DQ0, data at DQ0-3. */
  591. rd_reg |= CQSPI_INST_TYPE_QUAD << CQSPI_REG_RD_INSTR_TYPE_DATA_LSB;
  592. #endif
  593. /* Get address */
  594. addr_value = cadence_qspi_apb_cmd2addr(&cmdbuf[1], addr_bytes);
  595. writel(addr_value, plat->regbase + CQSPI_REG_INDIRECTRDSTARTADDR);
  596. /* The remaining lenght is dummy bytes. */
  597. dummy_bytes = cmdlen - addr_bytes - 1;
  598. if (dummy_bytes) {
  599. if (dummy_bytes > CQSPI_DUMMY_BYTES_MAX)
  600. dummy_bytes = CQSPI_DUMMY_BYTES_MAX;
  601. rd_reg |= (1 << CQSPI_REG_RD_INSTR_MODE_EN_LSB);
  602. #if defined(CONFIG_SPL_SPI_XIP) && defined(CONFIG_SPL_BUILD)
  603. writel(0x0, plat->regbase + CQSPI_REG_MODE_BIT);
  604. #else
  605. writel(0xFF, plat->regbase + CQSPI_REG_MODE_BIT);
  606. #endif
  607. /* Convert to clock cycles. */
  608. dummy_clk = dummy_bytes * CQSPI_DUMMY_CLKS_PER_BYTE;
  609. /* Need to minus the mode byte (8 clocks). */
  610. dummy_clk -= CQSPI_DUMMY_CLKS_PER_BYTE;
  611. if (dummy_clk)
  612. rd_reg |= (dummy_clk & CQSPI_REG_RD_INSTR_DUMMY_MASK)
  613. << CQSPI_REG_RD_INSTR_DUMMY_LSB;
  614. }
  615. writel(rd_reg, plat->regbase + CQSPI_REG_RD_INSTR);
  616. /* set device size */
  617. reg = readl(plat->regbase + CQSPI_REG_SIZE);
  618. reg &= ~CQSPI_REG_SIZE_ADDRESS_MASK;
  619. reg |= (addr_bytes - 1);
  620. writel(reg, plat->regbase + CQSPI_REG_SIZE);
  621. return 0;
  622. }
  623. int cadence_qspi_apb_indirect_read_execute(struct cadence_spi_platdata *plat,
  624. unsigned int rxlen, u8 *rxbuf)
  625. {
  626. unsigned int reg;
  627. writel(rxlen, plat->regbase + CQSPI_REG_INDIRECTRDBYTES);
  628. /* Start the indirect read transfer */
  629. writel(CQSPI_REG_INDIRECTRD_START_MASK,
  630. plat->regbase + CQSPI_REG_INDIRECTRD);
  631. if (qspi_read_sram_fifo_poll(plat->regbase, (void *)rxbuf,
  632. (const void *)plat->ahbbase, rxlen))
  633. goto failrd;
  634. /* Check flash indirect controller */
  635. reg = readl(plat->regbase + CQSPI_REG_INDIRECTRD);
  636. if (!(reg & CQSPI_REG_INDIRECTRD_DONE_MASK)) {
  637. reg = readl(plat->regbase + CQSPI_REG_INDIRECTRD);
  638. printf("QSPI: indirect completion status error with reg 0x%08x\n",
  639. reg);
  640. goto failrd;
  641. }
  642. /* Clear indirect completion status */
  643. writel(CQSPI_REG_INDIRECTRD_DONE_MASK,
  644. plat->regbase + CQSPI_REG_INDIRECTRD);
  645. return 0;
  646. failrd:
  647. /* Cancel the indirect read */
  648. writel(CQSPI_REG_INDIRECTRD_CANCEL_MASK,
  649. plat->regbase + CQSPI_REG_INDIRECTRD);
  650. return -1;
  651. }
  652. /* Opcode + Address (3/4 bytes) */
  653. int cadence_qspi_apb_indirect_write_setup(struct cadence_spi_platdata *plat,
  654. unsigned int cmdlen, const u8 *cmdbuf)
  655. {
  656. unsigned int reg;
  657. unsigned int addr_bytes = cmdlen > 4 ? 4 : 3;
  658. if (cmdlen < 4 || cmdbuf == NULL) {
  659. printf("QSPI: iInvalid input argument, len %d cmdbuf 0x%08x\n",
  660. cmdlen, (unsigned int)cmdbuf);
  661. return -EINVAL;
  662. }
  663. /* Setup the indirect trigger address */
  664. writel(((u32)plat->ahbbase & CQSPI_INDIRECTTRIGGER_ADDR_MASK),
  665. plat->regbase + CQSPI_REG_INDIRECTTRIGGER);
  666. writel(CQSPI_REG_SRAM_PARTITION_WR,
  667. plat->regbase + CQSPI_REG_SRAMPARTITION);
  668. /* Configure the opcode */
  669. reg = cmdbuf[0] << CQSPI_REG_WR_INSTR_OPCODE_LSB;
  670. writel(reg, plat->regbase + CQSPI_REG_WR_INSTR);
  671. /* Setup write address. */
  672. reg = cadence_qspi_apb_cmd2addr(&cmdbuf[1], addr_bytes);
  673. writel(reg, plat->regbase + CQSPI_REG_INDIRECTWRSTARTADDR);
  674. reg = readl(plat->regbase + CQSPI_REG_SIZE);
  675. reg &= ~CQSPI_REG_SIZE_ADDRESS_MASK;
  676. reg |= (addr_bytes - 1);
  677. writel(reg, plat->regbase + CQSPI_REG_SIZE);
  678. return 0;
  679. }
  680. int cadence_qspi_apb_indirect_write_execute(struct cadence_spi_platdata *plat,
  681. unsigned int txlen, const u8 *txbuf)
  682. {
  683. unsigned int reg = 0;
  684. unsigned int retry;
  685. /* Configure the indirect read transfer bytes */
  686. writel(txlen, plat->regbase + CQSPI_REG_INDIRECTWRBYTES);
  687. /* Start the indirect write transfer */
  688. writel(CQSPI_REG_INDIRECTWR_START_MASK,
  689. plat->regbase + CQSPI_REG_INDIRECTWR);
  690. if (qpsi_write_sram_fifo_push(plat, (const void *)txbuf, txlen))
  691. goto failwr;
  692. /* Wait until last write is completed (FIFO empty) */
  693. retry = CQSPI_REG_RETRY;
  694. while (retry--) {
  695. reg = CQSPI_GET_WR_SRAM_LEVEL(plat->regbase);
  696. if (reg == 0)
  697. break;
  698. udelay(1);
  699. }
  700. if (reg != 0) {
  701. printf("QSPI: timeout for indirect write\n");
  702. goto failwr;
  703. }
  704. /* Check flash indirect controller status */
  705. retry = CQSPI_REG_RETRY;
  706. while (retry--) {
  707. reg = readl(plat->regbase + CQSPI_REG_INDIRECTWR);
  708. if (reg & CQSPI_REG_INDIRECTWR_DONE_MASK)
  709. break;
  710. udelay(1);
  711. }
  712. if (!(reg & CQSPI_REG_INDIRECTWR_DONE_MASK)) {
  713. printf("QSPI: indirect completion status error with reg 0x%08x\n",
  714. reg);
  715. goto failwr;
  716. }
  717. /* Clear indirect completion status */
  718. writel(CQSPI_REG_INDIRECTWR_DONE_MASK,
  719. plat->regbase + CQSPI_REG_INDIRECTWR);
  720. return 0;
  721. failwr:
  722. /* Cancel the indirect write */
  723. writel(CQSPI_REG_INDIRECTWR_CANCEL_MASK,
  724. plat->regbase + CQSPI_REG_INDIRECTWR);
  725. return -1;
  726. }
  727. void cadence_qspi_apb_enter_xip(void *reg_base, char xip_dummy)
  728. {
  729. unsigned int reg;
  730. /* enter XiP mode immediately and enable direct mode */
  731. reg = readl(reg_base + CQSPI_REG_CONFIG);
  732. reg |= CQSPI_REG_CONFIG_ENABLE_MASK;
  733. reg |= CQSPI_REG_CONFIG_DIRECT_MASK;
  734. reg |= CQSPI_REG_CONFIG_XIP_IMM_MASK;
  735. writel(reg, reg_base + CQSPI_REG_CONFIG);
  736. /* keep the XiP mode */
  737. writel(xip_dummy, reg_base + CQSPI_REG_MODE_BIT);
  738. /* Enable mode bit at devrd */
  739. reg = readl(reg_base + CQSPI_REG_RD_INSTR);
  740. reg |= (1 << CQSPI_REG_RD_INSTR_MODE_EN_LSB);
  741. writel(reg, reg_base + CQSPI_REG_RD_INSTR);
  742. }