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