qpic_common.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2016, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved
  5. */
  6. #include <linux/clk.h>
  7. #include <linux/delay.h>
  8. #include <linux/dmaengine.h>
  9. #include <linux/dma-mapping.h>
  10. #include <linux/dma/qcom_adm.h>
  11. #include <linux/dma/qcom_bam_dma.h>
  12. #include <linux/module.h>
  13. #include <linux/of.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/slab.h>
  16. #include <linux/mtd/nand-qpic-common.h>
  17. /**
  18. * qcom_free_bam_transaction() - Frees the BAM transaction memory
  19. * @nandc: qpic nand controller
  20. *
  21. * This function frees the bam transaction memory
  22. */
  23. void qcom_free_bam_transaction(struct qcom_nand_controller *nandc)
  24. {
  25. struct bam_transaction *bam_txn = nandc->bam_txn;
  26. kfree(bam_txn);
  27. }
  28. EXPORT_SYMBOL(qcom_free_bam_transaction);
  29. /**
  30. * qcom_alloc_bam_transaction() - allocate BAM transaction
  31. * @nandc: qpic nand controller
  32. *
  33. * This function will allocate and initialize the BAM transaction structure
  34. */
  35. struct bam_transaction *
  36. qcom_alloc_bam_transaction(struct qcom_nand_controller *nandc)
  37. {
  38. struct bam_transaction *bam_txn;
  39. size_t bam_txn_size;
  40. unsigned int num_cw = nandc->max_cwperpage;
  41. void *bam_txn_buf;
  42. bam_txn_size =
  43. sizeof(*bam_txn) + num_cw *
  44. ((sizeof(*bam_txn->bam_ce) * QPIC_PER_CW_CMD_ELEMENTS) +
  45. (sizeof(*bam_txn->cmd_sgl) * QPIC_PER_CW_CMD_SGL) +
  46. (sizeof(*bam_txn->data_sgl) * QPIC_PER_CW_DATA_SGL));
  47. bam_txn_buf = kzalloc(bam_txn_size, GFP_KERNEL);
  48. if (!bam_txn_buf)
  49. return NULL;
  50. bam_txn = bam_txn_buf;
  51. bam_txn_buf += sizeof(*bam_txn);
  52. bam_txn->bam_ce = bam_txn_buf;
  53. bam_txn->bam_ce_nitems = QPIC_PER_CW_CMD_ELEMENTS * num_cw;
  54. bam_txn_buf += sizeof(*bam_txn->bam_ce) * bam_txn->bam_ce_nitems;
  55. bam_txn->cmd_sgl = bam_txn_buf;
  56. bam_txn->cmd_sgl_nitems = QPIC_PER_CW_CMD_SGL * num_cw;
  57. bam_txn_buf += sizeof(*bam_txn->cmd_sgl) * bam_txn->cmd_sgl_nitems;
  58. bam_txn->data_sgl = bam_txn_buf;
  59. bam_txn->data_sgl_nitems = QPIC_PER_CW_DATA_SGL * num_cw;
  60. init_completion(&bam_txn->txn_done);
  61. return bam_txn;
  62. }
  63. EXPORT_SYMBOL(qcom_alloc_bam_transaction);
  64. /**
  65. * qcom_clear_bam_transaction() - Clears the BAM transaction
  66. * @nandc: qpic nand controller
  67. *
  68. * This function will clear the BAM transaction indexes.
  69. */
  70. void qcom_clear_bam_transaction(struct qcom_nand_controller *nandc)
  71. {
  72. struct bam_transaction *bam_txn = nandc->bam_txn;
  73. if (!nandc->props->supports_bam)
  74. return;
  75. memset(&bam_txn->bam_positions, 0, sizeof(bam_txn->bam_positions));
  76. bam_txn->last_data_desc = NULL;
  77. sg_init_table(bam_txn->cmd_sgl, bam_txn->cmd_sgl_nitems);
  78. sg_init_table(bam_txn->data_sgl, bam_txn->data_sgl_nitems);
  79. reinit_completion(&bam_txn->txn_done);
  80. }
  81. EXPORT_SYMBOL(qcom_clear_bam_transaction);
  82. /**
  83. * qcom_qpic_bam_dma_done() - Callback for DMA descriptor completion
  84. * @data: data pointer
  85. *
  86. * This function is a callback for DMA descriptor completion
  87. */
  88. void qcom_qpic_bam_dma_done(void *data)
  89. {
  90. struct bam_transaction *bam_txn = data;
  91. complete(&bam_txn->txn_done);
  92. }
  93. EXPORT_SYMBOL(qcom_qpic_bam_dma_done);
  94. /**
  95. * qcom_nandc_dev_to_mem() - Check for dma sync for cpu or device
  96. * @nandc: qpic nand controller
  97. * @is_cpu: cpu or Device
  98. *
  99. * This function will check for dma sync for cpu or device
  100. */
  101. inline void qcom_nandc_dev_to_mem(struct qcom_nand_controller *nandc, bool is_cpu)
  102. {
  103. if (!nandc->props->supports_bam)
  104. return;
  105. if (is_cpu)
  106. dma_sync_single_for_cpu(nandc->dev, nandc->reg_read_dma,
  107. MAX_REG_RD *
  108. sizeof(*nandc->reg_read_buf),
  109. DMA_FROM_DEVICE);
  110. else
  111. dma_sync_single_for_device(nandc->dev, nandc->reg_read_dma,
  112. MAX_REG_RD *
  113. sizeof(*nandc->reg_read_buf),
  114. DMA_FROM_DEVICE);
  115. }
  116. EXPORT_SYMBOL(qcom_nandc_dev_to_mem);
  117. /**
  118. * qcom_prepare_bam_async_desc() - Prepare DMA descriptor
  119. * @nandc: qpic nand controller
  120. * @chan: dma channel
  121. * @flags: flags to control DMA descriptor preparation
  122. *
  123. * This function maps the scatter gather list for DMA transfer and forms the
  124. * DMA descriptor for BAM.This descriptor will be added in the NAND DMA
  125. * descriptor queue which will be submitted to DMA engine.
  126. */
  127. int qcom_prepare_bam_async_desc(struct qcom_nand_controller *nandc,
  128. struct dma_chan *chan, unsigned long flags)
  129. {
  130. struct desc_info *desc;
  131. struct scatterlist *sgl;
  132. unsigned int sgl_cnt;
  133. int ret;
  134. struct bam_transaction *bam_txn = nandc->bam_txn;
  135. enum dma_transfer_direction dir_eng;
  136. struct dma_async_tx_descriptor *dma_desc;
  137. desc = kzalloc_obj(*desc);
  138. if (!desc)
  139. return -ENOMEM;
  140. if (chan == nandc->cmd_chan) {
  141. sgl = &bam_txn->cmd_sgl[bam_txn->cmd_sgl_start];
  142. sgl_cnt = bam_txn->cmd_sgl_pos - bam_txn->cmd_sgl_start;
  143. bam_txn->cmd_sgl_start = bam_txn->cmd_sgl_pos;
  144. dir_eng = DMA_MEM_TO_DEV;
  145. desc->dir = DMA_TO_DEVICE;
  146. } else if (chan == nandc->tx_chan) {
  147. sgl = &bam_txn->data_sgl[bam_txn->tx_sgl_start];
  148. sgl_cnt = bam_txn->tx_sgl_pos - bam_txn->tx_sgl_start;
  149. bam_txn->tx_sgl_start = bam_txn->tx_sgl_pos;
  150. dir_eng = DMA_MEM_TO_DEV;
  151. desc->dir = DMA_TO_DEVICE;
  152. } else {
  153. sgl = &bam_txn->data_sgl[bam_txn->rx_sgl_start];
  154. sgl_cnt = bam_txn->rx_sgl_pos - bam_txn->rx_sgl_start;
  155. bam_txn->rx_sgl_start = bam_txn->rx_sgl_pos;
  156. dir_eng = DMA_DEV_TO_MEM;
  157. desc->dir = DMA_FROM_DEVICE;
  158. }
  159. sg_mark_end(sgl + sgl_cnt - 1);
  160. ret = dma_map_sg(nandc->dev, sgl, sgl_cnt, desc->dir);
  161. if (ret == 0) {
  162. dev_err(nandc->dev, "failure in mapping desc\n");
  163. kfree(desc);
  164. return -ENOMEM;
  165. }
  166. desc->sgl_cnt = sgl_cnt;
  167. desc->bam_sgl = sgl;
  168. dma_desc = dmaengine_prep_slave_sg(chan, sgl, sgl_cnt, dir_eng,
  169. flags);
  170. if (!dma_desc) {
  171. dev_err(nandc->dev, "failure in prep desc\n");
  172. dma_unmap_sg(nandc->dev, sgl, sgl_cnt, desc->dir);
  173. kfree(desc);
  174. return -EINVAL;
  175. }
  176. desc->dma_desc = dma_desc;
  177. /* update last data/command descriptor */
  178. if (chan == nandc->cmd_chan)
  179. bam_txn->last_cmd_desc = dma_desc;
  180. else
  181. bam_txn->last_data_desc = dma_desc;
  182. list_add_tail(&desc->node, &nandc->desc_list);
  183. return 0;
  184. }
  185. EXPORT_SYMBOL(qcom_prepare_bam_async_desc);
  186. /**
  187. * qcom_prep_bam_dma_desc_cmd() - Prepares the command descriptor for BAM DMA
  188. * @nandc: qpic nand controller
  189. * @read: read or write type
  190. * @reg_off: offset within the controller's data buffer
  191. * @vaddr: virtual address of the buffer we want to write to
  192. * @size: DMA transaction size in bytes
  193. * @flags: flags to control DMA descriptor preparation
  194. *
  195. * This function will prepares the command descriptor for BAM DMA
  196. * which will be used for NAND register reads and writes.
  197. */
  198. int qcom_prep_bam_dma_desc_cmd(struct qcom_nand_controller *nandc, bool read,
  199. int reg_off, const void *vaddr,
  200. int size, unsigned int flags)
  201. {
  202. int bam_ce_size;
  203. int i, ret;
  204. struct bam_cmd_element *bam_ce_buffer;
  205. struct bam_transaction *bam_txn = nandc->bam_txn;
  206. u32 offset;
  207. if (bam_txn->bam_ce_pos + size > bam_txn->bam_ce_nitems) {
  208. dev_err(nandc->dev, "BAM %s array is full\n", "CE");
  209. return -EINVAL;
  210. }
  211. bam_ce_buffer = &bam_txn->bam_ce[bam_txn->bam_ce_pos];
  212. /* fill the command desc */
  213. for (i = 0; i < size; i++) {
  214. offset = nandc->props->bam_offset + reg_off + 4 * i;
  215. if (read)
  216. bam_prep_ce(&bam_ce_buffer[i],
  217. offset, BAM_READ_COMMAND,
  218. reg_buf_dma_addr(nandc,
  219. (__le32 *)vaddr + i));
  220. else
  221. bam_prep_ce_le32(&bam_ce_buffer[i],
  222. offset, BAM_WRITE_COMMAND,
  223. *((__le32 *)vaddr + i));
  224. }
  225. bam_txn->bam_ce_pos += size;
  226. /* use the separate sgl after this command */
  227. if (flags & NAND_BAM_NEXT_SGL) {
  228. if (bam_txn->cmd_sgl_pos >= bam_txn->cmd_sgl_nitems) {
  229. dev_err(nandc->dev, "BAM %s array is full\n",
  230. "CMD sgl");
  231. return -EINVAL;
  232. }
  233. bam_ce_buffer = &bam_txn->bam_ce[bam_txn->bam_ce_start];
  234. bam_ce_size = (bam_txn->bam_ce_pos -
  235. bam_txn->bam_ce_start) *
  236. sizeof(struct bam_cmd_element);
  237. sg_set_buf(&bam_txn->cmd_sgl[bam_txn->cmd_sgl_pos],
  238. bam_ce_buffer, bam_ce_size);
  239. bam_txn->cmd_sgl_pos++;
  240. bam_txn->bam_ce_start = bam_txn->bam_ce_pos;
  241. if (flags & NAND_BAM_NWD) {
  242. ret = qcom_prepare_bam_async_desc(nandc, nandc->cmd_chan,
  243. DMA_PREP_FENCE | DMA_PREP_CMD);
  244. if (ret)
  245. return ret;
  246. }
  247. }
  248. return 0;
  249. }
  250. EXPORT_SYMBOL(qcom_prep_bam_dma_desc_cmd);
  251. /**
  252. * qcom_prep_bam_dma_desc_data() - Prepares the data descriptor for BAM DMA
  253. * @nandc: qpic nand controller
  254. * @read: read or write type
  255. * @vaddr: virtual address of the buffer we want to write to
  256. * @size: DMA transaction size in bytes
  257. * @flags: flags to control DMA descriptor preparation
  258. *
  259. * This function will prepares the data descriptor for BAM DMA which
  260. * will be used for NAND data reads and writes.
  261. */
  262. int qcom_prep_bam_dma_desc_data(struct qcom_nand_controller *nandc, bool read,
  263. const void *vaddr, int size, unsigned int flags)
  264. {
  265. int ret;
  266. struct bam_transaction *bam_txn = nandc->bam_txn;
  267. if (read) {
  268. if (bam_txn->rx_sgl_pos >= bam_txn->data_sgl_nitems) {
  269. dev_err(nandc->dev, "BAM %s array is full\n", "RX sgl");
  270. return -EINVAL;
  271. }
  272. sg_set_buf(&bam_txn->data_sgl[bam_txn->rx_sgl_pos],
  273. vaddr, size);
  274. bam_txn->rx_sgl_pos++;
  275. } else {
  276. if (bam_txn->tx_sgl_pos >= bam_txn->data_sgl_nitems) {
  277. dev_err(nandc->dev, "BAM %s array is full\n", "TX sgl");
  278. return -EINVAL;
  279. }
  280. sg_set_buf(&bam_txn->data_sgl[bam_txn->tx_sgl_pos],
  281. vaddr, size);
  282. bam_txn->tx_sgl_pos++;
  283. /*
  284. * BAM will only set EOT for DMA_PREP_INTERRUPT so if this flag
  285. * is not set, form the DMA descriptor
  286. */
  287. if (!(flags & NAND_BAM_NO_EOT)) {
  288. ret = qcom_prepare_bam_async_desc(nandc, nandc->tx_chan,
  289. DMA_PREP_INTERRUPT);
  290. if (ret)
  291. return ret;
  292. }
  293. }
  294. return 0;
  295. }
  296. EXPORT_SYMBOL(qcom_prep_bam_dma_desc_data);
  297. /**
  298. * qcom_prep_adm_dma_desc() - Prepare descriptor for adma
  299. * @nandc: qpic nand controller
  300. * @read: read or write type
  301. * @reg_off: offset within the controller's data buffer
  302. * @vaddr: virtual address of the buffer we want to write to
  303. * @size: adm dma transaction size in bytes
  304. * @flow_control: flow controller
  305. *
  306. * This function will prepare descriptor for adma
  307. */
  308. int qcom_prep_adm_dma_desc(struct qcom_nand_controller *nandc, bool read,
  309. int reg_off, const void *vaddr, int size,
  310. bool flow_control)
  311. {
  312. struct qcom_adm_peripheral_config periph_conf = {};
  313. struct dma_async_tx_descriptor *dma_desc;
  314. struct dma_slave_config slave_conf = {0};
  315. enum dma_transfer_direction dir_eng;
  316. struct desc_info *desc;
  317. struct scatterlist *sgl;
  318. int ret;
  319. desc = kzalloc_obj(*desc);
  320. if (!desc)
  321. return -ENOMEM;
  322. sgl = &desc->adm_sgl;
  323. sg_init_one(sgl, vaddr, size);
  324. if (read) {
  325. dir_eng = DMA_DEV_TO_MEM;
  326. desc->dir = DMA_FROM_DEVICE;
  327. } else {
  328. dir_eng = DMA_MEM_TO_DEV;
  329. desc->dir = DMA_TO_DEVICE;
  330. }
  331. ret = dma_map_sg(nandc->dev, sgl, 1, desc->dir);
  332. if (!ret) {
  333. ret = -ENOMEM;
  334. goto err;
  335. }
  336. slave_conf.device_fc = flow_control;
  337. if (read) {
  338. slave_conf.src_maxburst = 16;
  339. slave_conf.src_addr = nandc->base_dma + reg_off;
  340. if (nandc->data_crci) {
  341. periph_conf.crci = nandc->data_crci;
  342. slave_conf.peripheral_config = &periph_conf;
  343. slave_conf.peripheral_size = sizeof(periph_conf);
  344. }
  345. } else {
  346. slave_conf.dst_maxburst = 16;
  347. slave_conf.dst_addr = nandc->base_dma + reg_off;
  348. if (nandc->cmd_crci) {
  349. periph_conf.crci = nandc->cmd_crci;
  350. slave_conf.peripheral_config = &periph_conf;
  351. slave_conf.peripheral_size = sizeof(periph_conf);
  352. }
  353. }
  354. ret = dmaengine_slave_config(nandc->chan, &slave_conf);
  355. if (ret) {
  356. dev_err(nandc->dev, "failed to configure dma channel\n");
  357. goto err;
  358. }
  359. dma_desc = dmaengine_prep_slave_sg(nandc->chan, sgl, 1, dir_eng, 0);
  360. if (!dma_desc) {
  361. dev_err(nandc->dev, "failed to prepare desc\n");
  362. ret = -EINVAL;
  363. goto err;
  364. }
  365. desc->dma_desc = dma_desc;
  366. list_add_tail(&desc->node, &nandc->desc_list);
  367. return 0;
  368. err:
  369. kfree(desc);
  370. return ret;
  371. }
  372. EXPORT_SYMBOL(qcom_prep_adm_dma_desc);
  373. /**
  374. * qcom_read_reg_dma() - read a given number of registers to the reg_read_buf pointer
  375. * @nandc: qpic nand controller
  376. * @first: offset of the first register in the contiguous block
  377. * @num_regs: number of registers to read
  378. * @flags: flags to control DMA descriptor preparation
  379. *
  380. * This function will prepares a descriptor to read a given number of
  381. * contiguous registers to the reg_read_buf pointer.
  382. */
  383. int qcom_read_reg_dma(struct qcom_nand_controller *nandc, int first,
  384. int num_regs, unsigned int flags)
  385. {
  386. bool flow_control = false;
  387. void *vaddr;
  388. vaddr = nandc->reg_read_buf + nandc->reg_read_pos;
  389. nandc->reg_read_pos += num_regs;
  390. if (first == NAND_DEV_CMD_VLD || first == NAND_DEV_CMD1)
  391. first = dev_cmd_reg_addr(nandc, first);
  392. if (nandc->props->supports_bam)
  393. return qcom_prep_bam_dma_desc_cmd(nandc, true, first, vaddr,
  394. num_regs, flags);
  395. if (first == NAND_READ_ID || first == NAND_FLASH_STATUS)
  396. flow_control = true;
  397. return qcom_prep_adm_dma_desc(nandc, true, first, vaddr,
  398. num_regs * sizeof(u32), flow_control);
  399. }
  400. EXPORT_SYMBOL(qcom_read_reg_dma);
  401. /**
  402. * qcom_write_reg_dma() - write a given number of registers
  403. * @nandc: qpic nand controller
  404. * @vaddr: contiguous memory from where register value will
  405. * be written
  406. * @first: offset of the first register in the contiguous block
  407. * @num_regs: number of registers to write
  408. * @flags: flags to control DMA descriptor preparation
  409. *
  410. * This function will prepares a descriptor to write a given number of
  411. * contiguous registers
  412. */
  413. int qcom_write_reg_dma(struct qcom_nand_controller *nandc, __le32 *vaddr,
  414. int first, int num_regs, unsigned int flags)
  415. {
  416. bool flow_control = false;
  417. if (first == NAND_EXEC_CMD)
  418. flags |= NAND_BAM_NWD;
  419. if (first == NAND_DEV_CMD1_RESTORE || first == NAND_DEV_CMD1)
  420. first = dev_cmd_reg_addr(nandc, NAND_DEV_CMD1);
  421. if (first == NAND_DEV_CMD_VLD_RESTORE || first == NAND_DEV_CMD_VLD)
  422. first = dev_cmd_reg_addr(nandc, NAND_DEV_CMD_VLD);
  423. if (nandc->props->supports_bam)
  424. return qcom_prep_bam_dma_desc_cmd(nandc, false, first, vaddr,
  425. num_regs, flags);
  426. if (first == NAND_FLASH_CMD)
  427. flow_control = true;
  428. return qcom_prep_adm_dma_desc(nandc, false, first, vaddr,
  429. num_regs * sizeof(u32), flow_control);
  430. }
  431. EXPORT_SYMBOL(qcom_write_reg_dma);
  432. /**
  433. * qcom_read_data_dma() - transfer data
  434. * @nandc: qpic nand controller
  435. * @reg_off: offset within the controller's data buffer
  436. * @vaddr: virtual address of the buffer we want to write to
  437. * @size: DMA transaction size in bytes
  438. * @flags: flags to control DMA descriptor preparation
  439. *
  440. * This function will prepares a DMA descriptor to transfer data from the
  441. * controller's internal buffer to the buffer 'vaddr'
  442. */
  443. int qcom_read_data_dma(struct qcom_nand_controller *nandc, int reg_off,
  444. const u8 *vaddr, int size, unsigned int flags)
  445. {
  446. if (nandc->props->supports_bam)
  447. return qcom_prep_bam_dma_desc_data(nandc, true, vaddr, size, flags);
  448. return qcom_prep_adm_dma_desc(nandc, true, reg_off, vaddr, size, false);
  449. }
  450. EXPORT_SYMBOL(qcom_read_data_dma);
  451. /**
  452. * qcom_write_data_dma() - transfer data
  453. * @nandc: qpic nand controller
  454. * @reg_off: offset within the controller's data buffer
  455. * @vaddr: virtual address of the buffer we want to read from
  456. * @size: DMA transaction size in bytes
  457. * @flags: flags to control DMA descriptor preparation
  458. *
  459. * This function will prepares a DMA descriptor to transfer data from
  460. * 'vaddr' to the controller's internal buffer
  461. */
  462. int qcom_write_data_dma(struct qcom_nand_controller *nandc, int reg_off,
  463. const u8 *vaddr, int size, unsigned int flags)
  464. {
  465. if (nandc->props->supports_bam)
  466. return qcom_prep_bam_dma_desc_data(nandc, false, vaddr, size, flags);
  467. return qcom_prep_adm_dma_desc(nandc, false, reg_off, vaddr, size, false);
  468. }
  469. EXPORT_SYMBOL(qcom_write_data_dma);
  470. /**
  471. * qcom_submit_descs() - submit dma descriptor
  472. * @nandc: qpic nand controller
  473. *
  474. * This function will submit all the prepared dma descriptor
  475. * cmd or data descriptor
  476. */
  477. int qcom_submit_descs(struct qcom_nand_controller *nandc)
  478. {
  479. struct desc_info *desc, *n;
  480. dma_cookie_t cookie = 0;
  481. struct bam_transaction *bam_txn = nandc->bam_txn;
  482. int ret = 0;
  483. if (nandc->props->supports_bam) {
  484. if (bam_txn->rx_sgl_pos > bam_txn->rx_sgl_start) {
  485. ret = qcom_prepare_bam_async_desc(nandc, nandc->rx_chan, 0);
  486. if (ret)
  487. goto err_unmap_free_desc;
  488. }
  489. if (bam_txn->tx_sgl_pos > bam_txn->tx_sgl_start) {
  490. ret = qcom_prepare_bam_async_desc(nandc, nandc->tx_chan,
  491. DMA_PREP_INTERRUPT);
  492. if (ret)
  493. goto err_unmap_free_desc;
  494. }
  495. if (bam_txn->cmd_sgl_pos > bam_txn->cmd_sgl_start) {
  496. ret = qcom_prepare_bam_async_desc(nandc, nandc->cmd_chan,
  497. DMA_PREP_CMD);
  498. if (ret)
  499. goto err_unmap_free_desc;
  500. }
  501. }
  502. list_for_each_entry(desc, &nandc->desc_list, node)
  503. cookie = dmaengine_submit(desc->dma_desc);
  504. if (nandc->props->supports_bam) {
  505. bam_txn->last_cmd_desc->callback = qcom_qpic_bam_dma_done;
  506. bam_txn->last_cmd_desc->callback_param = bam_txn;
  507. dma_async_issue_pending(nandc->tx_chan);
  508. dma_async_issue_pending(nandc->rx_chan);
  509. dma_async_issue_pending(nandc->cmd_chan);
  510. if (!wait_for_completion_timeout(&bam_txn->txn_done,
  511. QPIC_NAND_COMPLETION_TIMEOUT))
  512. ret = -ETIMEDOUT;
  513. } else {
  514. if (dma_sync_wait(nandc->chan, cookie) != DMA_COMPLETE)
  515. ret = -ETIMEDOUT;
  516. }
  517. err_unmap_free_desc:
  518. /*
  519. * Unmap the dma sg_list and free the desc allocated by both
  520. * qcom_prepare_bam_async_desc() and qcom_prep_adm_dma_desc() functions.
  521. */
  522. list_for_each_entry_safe(desc, n, &nandc->desc_list, node) {
  523. list_del(&desc->node);
  524. if (nandc->props->supports_bam)
  525. dma_unmap_sg(nandc->dev, desc->bam_sgl,
  526. desc->sgl_cnt, desc->dir);
  527. else
  528. dma_unmap_sg(nandc->dev, &desc->adm_sgl, 1,
  529. desc->dir);
  530. kfree(desc);
  531. }
  532. return ret;
  533. }
  534. EXPORT_SYMBOL(qcom_submit_descs);
  535. /**
  536. * qcom_clear_read_regs() - reset the read register buffer
  537. * @nandc: qpic nand controller
  538. *
  539. * This function reset the register read buffer for next NAND operation
  540. */
  541. void qcom_clear_read_regs(struct qcom_nand_controller *nandc)
  542. {
  543. nandc->reg_read_pos = 0;
  544. qcom_nandc_dev_to_mem(nandc, false);
  545. }
  546. EXPORT_SYMBOL(qcom_clear_read_regs);
  547. /**
  548. * qcom_nandc_unalloc() - unallocate qpic nand controller
  549. * @nandc: qpic nand controller
  550. *
  551. * This function will unallocate memory alloacted for qpic nand controller
  552. */
  553. void qcom_nandc_unalloc(struct qcom_nand_controller *nandc)
  554. {
  555. if (nandc->props->supports_bam) {
  556. if (!dma_mapping_error(nandc->dev, nandc->reg_read_dma))
  557. dma_unmap_single(nandc->dev, nandc->reg_read_dma,
  558. MAX_REG_RD *
  559. sizeof(*nandc->reg_read_buf),
  560. DMA_FROM_DEVICE);
  561. if (nandc->tx_chan)
  562. dma_release_channel(nandc->tx_chan);
  563. if (nandc->rx_chan)
  564. dma_release_channel(nandc->rx_chan);
  565. if (nandc->cmd_chan)
  566. dma_release_channel(nandc->cmd_chan);
  567. } else {
  568. if (nandc->chan)
  569. dma_release_channel(nandc->chan);
  570. }
  571. }
  572. EXPORT_SYMBOL(qcom_nandc_unalloc);
  573. /**
  574. * qcom_nandc_alloc() - Allocate qpic nand controller
  575. * @nandc: qpic nand controller
  576. *
  577. * This function will allocate memory for qpic nand controller
  578. */
  579. int qcom_nandc_alloc(struct qcom_nand_controller *nandc)
  580. {
  581. int ret;
  582. ret = dma_set_coherent_mask(nandc->dev, DMA_BIT_MASK(32));
  583. if (ret) {
  584. dev_err(nandc->dev, "failed to set DMA mask\n");
  585. return ret;
  586. }
  587. /*
  588. * we use the internal buffer for reading ONFI params, reading small
  589. * data like ID and status, and preforming read-copy-write operations
  590. * when writing to a codeword partially. 532 is the maximum possible
  591. * size of a codeword for our nand controller
  592. */
  593. nandc->buf_size = 532;
  594. nandc->data_buffer = devm_kzalloc(nandc->dev, nandc->buf_size, GFP_KERNEL);
  595. if (!nandc->data_buffer)
  596. return -ENOMEM;
  597. nandc->regs = devm_kzalloc(nandc->dev, sizeof(*nandc->regs), GFP_KERNEL);
  598. if (!nandc->regs)
  599. return -ENOMEM;
  600. nandc->reg_read_buf = devm_kcalloc(nandc->dev, MAX_REG_RD,
  601. sizeof(*nandc->reg_read_buf),
  602. GFP_KERNEL);
  603. if (!nandc->reg_read_buf)
  604. return -ENOMEM;
  605. if (nandc->props->supports_bam) {
  606. nandc->reg_read_dma =
  607. dma_map_single(nandc->dev, nandc->reg_read_buf,
  608. MAX_REG_RD *
  609. sizeof(*nandc->reg_read_buf),
  610. DMA_FROM_DEVICE);
  611. if (dma_mapping_error(nandc->dev, nandc->reg_read_dma)) {
  612. dev_err(nandc->dev, "failed to DMA MAP reg buffer\n");
  613. return -EIO;
  614. }
  615. nandc->tx_chan = dma_request_chan(nandc->dev, "tx");
  616. if (IS_ERR(nandc->tx_chan)) {
  617. ret = PTR_ERR(nandc->tx_chan);
  618. nandc->tx_chan = NULL;
  619. dev_err_probe(nandc->dev, ret,
  620. "tx DMA channel request failed\n");
  621. goto unalloc;
  622. }
  623. nandc->rx_chan = dma_request_chan(nandc->dev, "rx");
  624. if (IS_ERR(nandc->rx_chan)) {
  625. ret = PTR_ERR(nandc->rx_chan);
  626. nandc->rx_chan = NULL;
  627. dev_err_probe(nandc->dev, ret,
  628. "rx DMA channel request failed\n");
  629. goto unalloc;
  630. }
  631. nandc->cmd_chan = dma_request_chan(nandc->dev, "cmd");
  632. if (IS_ERR(nandc->cmd_chan)) {
  633. ret = PTR_ERR(nandc->cmd_chan);
  634. nandc->cmd_chan = NULL;
  635. dev_err_probe(nandc->dev, ret,
  636. "cmd DMA channel request failed\n");
  637. goto unalloc;
  638. }
  639. /*
  640. * Initially allocate BAM transaction to read ONFI param page.
  641. * After detecting all the devices, this BAM transaction will
  642. * be freed and the next BAM transaction will be allocated with
  643. * maximum codeword size
  644. */
  645. nandc->max_cwperpage = 1;
  646. nandc->bam_txn = qcom_alloc_bam_transaction(nandc);
  647. if (!nandc->bam_txn) {
  648. dev_err(nandc->dev,
  649. "failed to allocate bam transaction\n");
  650. ret = -ENOMEM;
  651. goto unalloc;
  652. }
  653. } else {
  654. nandc->chan = dma_request_chan(nandc->dev, "rxtx");
  655. if (IS_ERR(nandc->chan)) {
  656. ret = PTR_ERR(nandc->chan);
  657. nandc->chan = NULL;
  658. dev_err_probe(nandc->dev, ret,
  659. "rxtx DMA channel request failed\n");
  660. return ret;
  661. }
  662. }
  663. INIT_LIST_HEAD(&nandc->desc_list);
  664. INIT_LIST_HEAD(&nandc->host_list);
  665. return 0;
  666. unalloc:
  667. qcom_nandc_unalloc(nandc);
  668. return ret;
  669. }
  670. EXPORT_SYMBOL(qcom_nandc_alloc);
  671. MODULE_DESCRIPTION("QPIC controller common api");
  672. MODULE_LICENSE("GPL");