Lines Matching +full:compound +full:- +full:device

1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright 2014-2015 Freescale
18 #include <linux/dma-mapping.h>
21 #include "virt-dma.h"
137 (((fsl_qdma_engine)->block_offset) * (x))
140 * struct fsl_qdma_format - This is the struct holding describing compound
144 * @addr_lo: Holding the compound descriptor of the lower
145 * 32-bits address in memory 40-bit address.
146 * @addr_hi: Same as above member, but point high 8-bits in
147 * memory 40-bit address.
149 * @cfg8b_w1: Compound descriptor command queue origin produced
151 * @data: Pointer to the memory 40-bit address, describes DMA
233 return le64_to_cpu(ccdf->data) & (U64_MAX >> 24); in qdma_ccdf_addr_get64()
239 ccdf->addr_hi = upper_32_bits(addr); in qdma_desc_addr_set64()
240 ccdf->addr_lo = cpu_to_le32(lower_32_bits(addr)); in qdma_desc_addr_set64()
246 return ccdf->cfg8b_w1 & U8_MAX; in qdma_ccdf_get_queue()
252 return (le32_to_cpu(ccdf->cfg) & QDMA_CCDF_MASK) >> QDMA_CCDF_OFFSET; in qdma_ccdf_get_offset()
258 ccdf->cfg = cpu_to_le32(QDMA_CCDF_FORMAT | in qdma_ccdf_set_format()
265 return (le32_to_cpu(ccdf->status) & QDMA_CCDF_STATUS_MASK); in qdma_ccdf_get_status()
271 ccdf->status = cpu_to_le32(QDMA_CCDF_SER | status); in qdma_ccdf_set_ser()
276 csgf->cfg = cpu_to_le32(len & QDMA_SG_LEN_MASK); in qdma_csgf_set_len()
281 csgf->cfg = cpu_to_le32(QDMA_SG_FIN | (len & QDMA_SG_LEN_MASK)); in qdma_csgf_set_f()
308 struct fsl_qdma_queue *fsl_queue = fsl_chan->queue; in fsl_qdma_free_chan_resources()
309 struct fsl_qdma_engine *fsl_qdma = fsl_chan->qdma; in fsl_qdma_free_chan_resources()
314 spin_lock_irqsave(&fsl_chan->vchan.lock, flags); in fsl_qdma_free_chan_resources()
315 vchan_get_all_descriptors(&fsl_chan->vchan, &head); in fsl_qdma_free_chan_resources()
316 spin_unlock_irqrestore(&fsl_chan->vchan.lock, flags); in fsl_qdma_free_chan_resources()
318 vchan_dma_desc_free_list(&fsl_chan->vchan, &head); in fsl_qdma_free_chan_resources()
320 if (!fsl_queue->comp_pool && !fsl_queue->desc_pool) in fsl_qdma_free_chan_resources()
324 &fsl_queue->comp_used, list) { in fsl_qdma_free_chan_resources()
325 dma_pool_free(fsl_queue->comp_pool, in fsl_qdma_free_chan_resources()
326 comp_temp->virt_addr, in fsl_qdma_free_chan_resources()
327 comp_temp->bus_addr); in fsl_qdma_free_chan_resources()
328 dma_pool_free(fsl_queue->desc_pool, in fsl_qdma_free_chan_resources()
329 comp_temp->desc_virt_addr, in fsl_qdma_free_chan_resources()
330 comp_temp->desc_bus_addr); in fsl_qdma_free_chan_resources()
331 list_del(&comp_temp->list); in fsl_qdma_free_chan_resources()
336 &fsl_queue->comp_free, list) { in fsl_qdma_free_chan_resources()
337 dma_pool_free(fsl_queue->comp_pool, in fsl_qdma_free_chan_resources()
338 comp_temp->virt_addr, in fsl_qdma_free_chan_resources()
339 comp_temp->bus_addr); in fsl_qdma_free_chan_resources()
340 dma_pool_free(fsl_queue->desc_pool, in fsl_qdma_free_chan_resources()
341 comp_temp->desc_virt_addr, in fsl_qdma_free_chan_resources()
342 comp_temp->desc_bus_addr); in fsl_qdma_free_chan_resources()
343 list_del(&comp_temp->list); in fsl_qdma_free_chan_resources()
347 dma_pool_destroy(fsl_queue->comp_pool); in fsl_qdma_free_chan_resources()
348 dma_pool_destroy(fsl_queue->desc_pool); in fsl_qdma_free_chan_resources()
350 fsl_qdma->desc_allocated--; in fsl_qdma_free_chan_resources()
351 fsl_queue->comp_pool = NULL; in fsl_qdma_free_chan_resources()
352 fsl_queue->desc_pool = NULL; in fsl_qdma_free_chan_resources()
362 ccdf = fsl_comp->virt_addr; in fsl_qdma_comp_fill_memcpy()
363 csgf_desc = fsl_comp->virt_addr + 1; in fsl_qdma_comp_fill_memcpy()
364 csgf_src = fsl_comp->virt_addr + 2; in fsl_qdma_comp_fill_memcpy()
365 csgf_dest = fsl_comp->virt_addr + 3; in fsl_qdma_comp_fill_memcpy()
366 sdf = fsl_comp->desc_virt_addr; in fsl_qdma_comp_fill_memcpy()
367 ddf = fsl_comp->desc_virt_addr + 1; in fsl_qdma_comp_fill_memcpy()
369 memset(fsl_comp->virt_addr, 0, FSL_QDMA_COMMAND_BUFFER_SIZE); in fsl_qdma_comp_fill_memcpy()
370 memset(fsl_comp->desc_virt_addr, 0, FSL_QDMA_DESCRIPTOR_BUFFER_SIZE); in fsl_qdma_comp_fill_memcpy()
372 qdma_desc_addr_set64(ccdf, fsl_comp->bus_addr + 16); in fsl_qdma_comp_fill_memcpy()
376 /* Compound Command Descriptor(Frame List Table) */ in fsl_qdma_comp_fill_memcpy()
377 qdma_desc_addr_set64(csgf_desc, fsl_comp->desc_bus_addr); in fsl_qdma_comp_fill_memcpy()
378 /* It must be 32 as Compound S/G Descriptor */ in fsl_qdma_comp_fill_memcpy()
390 sdf->data = QDMA_SDDF_CMD(cmd); in fsl_qdma_comp_fill_memcpy()
395 ddf->data = QDMA_SDDF_CMD(cmd); in fsl_qdma_comp_fill_memcpy()
399 * Pre-request full command descriptor for enqueue.
406 for (i = 0; i < queue->n_cq + FSL_COMMAND_QUEUE_OVERFLLOW; i++) { in fsl_qdma_pre_request_enqueue_desc()
410 comp_temp->virt_addr = in fsl_qdma_pre_request_enqueue_desc()
411 dma_pool_alloc(queue->comp_pool, GFP_KERNEL, in fsl_qdma_pre_request_enqueue_desc()
412 &comp_temp->bus_addr); in fsl_qdma_pre_request_enqueue_desc()
413 if (!comp_temp->virt_addr) in fsl_qdma_pre_request_enqueue_desc()
416 comp_temp->desc_virt_addr = in fsl_qdma_pre_request_enqueue_desc()
417 dma_pool_alloc(queue->desc_pool, GFP_KERNEL, in fsl_qdma_pre_request_enqueue_desc()
418 &comp_temp->desc_bus_addr); in fsl_qdma_pre_request_enqueue_desc()
419 if (!comp_temp->desc_virt_addr) in fsl_qdma_pre_request_enqueue_desc()
422 list_add_tail(&comp_temp->list, &queue->comp_free); in fsl_qdma_pre_request_enqueue_desc()
428 dma_pool_free(queue->comp_pool, comp_temp->virt_addr, in fsl_qdma_pre_request_enqueue_desc()
429 comp_temp->bus_addr); in fsl_qdma_pre_request_enqueue_desc()
436 &queue->comp_free, list) { in fsl_qdma_pre_request_enqueue_desc()
437 if (comp_temp->virt_addr) in fsl_qdma_pre_request_enqueue_desc()
438 dma_pool_free(queue->comp_pool, in fsl_qdma_pre_request_enqueue_desc()
439 comp_temp->virt_addr, in fsl_qdma_pre_request_enqueue_desc()
440 comp_temp->bus_addr); in fsl_qdma_pre_request_enqueue_desc()
441 if (comp_temp->desc_virt_addr) in fsl_qdma_pre_request_enqueue_desc()
442 dma_pool_free(queue->desc_pool, in fsl_qdma_pre_request_enqueue_desc()
443 comp_temp->desc_virt_addr, in fsl_qdma_pre_request_enqueue_desc()
444 comp_temp->desc_bus_addr); in fsl_qdma_pre_request_enqueue_desc()
446 list_del(&comp_temp->list); in fsl_qdma_pre_request_enqueue_desc()
450 return -ENOMEM; in fsl_qdma_pre_request_enqueue_desc()
462 struct fsl_qdma_queue *queue = fsl_chan->queue; in fsl_qdma_request_enqueue_desc()
464 while (timeout--) { in fsl_qdma_request_enqueue_desc()
465 spin_lock_irqsave(&queue->queue_lock, flags); in fsl_qdma_request_enqueue_desc()
466 if (!list_empty(&queue->comp_free)) { in fsl_qdma_request_enqueue_desc()
467 comp_temp = list_first_entry(&queue->comp_free, in fsl_qdma_request_enqueue_desc()
470 list_del(&comp_temp->list); in fsl_qdma_request_enqueue_desc()
472 spin_unlock_irqrestore(&queue->queue_lock, flags); in fsl_qdma_request_enqueue_desc()
473 comp_temp->qchan = fsl_chan; in fsl_qdma_request_enqueue_desc()
476 spin_unlock_irqrestore(&queue->queue_lock, flags); in fsl_qdma_request_enqueue_desc()
492 queue_num = fsl_qdma->n_queues; in fsl_qdma_alloc_queue_resources()
493 block_number = fsl_qdma->block_number; in fsl_qdma_alloc_queue_resources()
498 queue_head = devm_kzalloc(&pdev->dev, len, GFP_KERNEL); in fsl_qdma_alloc_queue_resources()
502 ret = device_property_read_u32_array(&pdev->dev, "queue-sizes", in fsl_qdma_alloc_queue_resources()
505 dev_err(&pdev->dev, "Can't get queue-sizes.\n"); in fsl_qdma_alloc_queue_resources()
512 dev_err(&pdev->dev, in fsl_qdma_alloc_queue_resources()
513 "Get wrong queue-sizes.\n"); in fsl_qdma_alloc_queue_resources()
518 queue_temp->cq = in fsl_qdma_alloc_queue_resources()
519 dmam_alloc_coherent(&pdev->dev, in fsl_qdma_alloc_queue_resources()
522 &queue_temp->bus_addr, in fsl_qdma_alloc_queue_resources()
524 if (!queue_temp->cq) in fsl_qdma_alloc_queue_resources()
526 queue_temp->block_base = fsl_qdma->block_base + in fsl_qdma_alloc_queue_resources()
528 queue_temp->n_cq = queue_size[i]; in fsl_qdma_alloc_queue_resources()
529 queue_temp->id = i; in fsl_qdma_alloc_queue_resources()
530 queue_temp->virt_head = queue_temp->cq; in fsl_qdma_alloc_queue_resources()
531 queue_temp->virt_tail = queue_temp->cq; in fsl_qdma_alloc_queue_resources()
535 INIT_LIST_HEAD(&queue_temp->comp_used); in fsl_qdma_alloc_queue_resources()
536 spin_lock_init(&queue_temp->queue_lock); in fsl_qdma_alloc_queue_resources()
548 struct device_node *np = pdev->dev.of_node; in fsl_qdma_prep_status_queue()
550 ret = of_property_read_u32(np, "status-sizes", &status_size); in fsl_qdma_prep_status_queue()
552 dev_err(&pdev->dev, "Can't get status-sizes.\n"); in fsl_qdma_prep_status_queue()
557 dev_err(&pdev->dev, "Get wrong status_size.\n"); in fsl_qdma_prep_status_queue()
560 status_head = devm_kzalloc(&pdev->dev, in fsl_qdma_prep_status_queue()
568 status_head->cq = dmam_alloc_coherent(&pdev->dev, in fsl_qdma_prep_status_queue()
571 &status_head->bus_addr, in fsl_qdma_prep_status_queue()
573 if (!status_head->cq) { in fsl_qdma_prep_status_queue()
574 devm_kfree(&pdev->dev, status_head); in fsl_qdma_prep_status_queue()
577 status_head->n_cq = status_size; in fsl_qdma_prep_status_queue()
578 status_head->virt_head = status_head->cq; in fsl_qdma_prep_status_queue()
579 status_head->virt_tail = status_head->cq; in fsl_qdma_prep_status_queue()
580 status_head->comp_pool = NULL; in fsl_qdma_prep_status_queue()
589 void __iomem *block, *ctrl = fsl_qdma->ctrl_base; in fsl_qdma_halt()
595 for (j = 0; j < fsl_qdma->block_number; j++) { in fsl_qdma_halt()
596 block = fsl_qdma->block_base + in fsl_qdma_halt()
605 if (count-- < 0) in fsl_qdma_halt()
606 return -EBUSY; in fsl_qdma_halt()
610 for (j = 0; j < fsl_qdma->block_number; j++) { in fsl_qdma_halt()
611 block = fsl_qdma->block_base + in fsl_qdma_halt()
639 struct fsl_qdma_queue *fsl_queue = fsl_qdma->queue; in fsl_qdma_queue_transfer_complete()
640 struct fsl_qdma_queue *fsl_status = fsl_qdma->status[id]; in fsl_qdma_queue_transfer_complete()
644 while (count--) { in fsl_qdma_queue_transfer_complete()
650 status_addr = fsl_status->virt_head; in fsl_qdma_queue_transfer_complete()
658 id * fsl_qdma->n_queues; in fsl_qdma_queue_transfer_complete()
663 spin_lock(&temp_queue->queue_lock); in fsl_qdma_queue_transfer_complete()
664 if (list_empty(&temp_queue->comp_used)) { in fsl_qdma_queue_transfer_complete()
666 spin_unlock(&temp_queue->queue_lock); in fsl_qdma_queue_transfer_complete()
667 return -EAGAIN; in fsl_qdma_queue_transfer_complete()
670 fsl_comp = list_first_entry(&temp_queue->comp_used, in fsl_qdma_queue_transfer_complete()
672 if (fsl_comp->bus_addr + 16 != in fsl_qdma_queue_transfer_complete()
675 spin_unlock(&temp_queue->queue_lock); in fsl_qdma_queue_transfer_complete()
676 return -EAGAIN; in fsl_qdma_queue_transfer_complete()
685 fsl_status->virt_head++; in fsl_qdma_queue_transfer_complete()
686 if (fsl_status->virt_head == fsl_status->cq in fsl_qdma_queue_transfer_complete()
687 + fsl_status->n_cq) in fsl_qdma_queue_transfer_complete()
688 fsl_status->virt_head = fsl_status->cq; in fsl_qdma_queue_transfer_complete()
690 spin_unlock(&temp_queue->queue_lock); in fsl_qdma_queue_transfer_complete()
693 list_del(&fsl_comp->list); in fsl_qdma_queue_transfer_complete()
700 fsl_status->virt_head++; in fsl_qdma_queue_transfer_complete()
701 if (fsl_status->virt_head == fsl_status->cq + fsl_status->n_cq) in fsl_qdma_queue_transfer_complete()
702 fsl_status->virt_head = fsl_status->cq; in fsl_qdma_queue_transfer_complete()
704 spin_unlock(&temp_queue->queue_lock); in fsl_qdma_queue_transfer_complete()
713 fsl_comp->vdesc.tx_result.result = in fsl_qdma_queue_transfer_complete()
717 fsl_comp->vdesc.tx_result.result = in fsl_qdma_queue_transfer_complete()
723 fsl_comp->vdesc.tx_result.result = in fsl_qdma_queue_transfer_complete()
725 dev_err(fsl_qdma->dma_dev.dev, in fsl_qdma_queue_transfer_complete()
731 spin_lock(&fsl_comp->qchan->vchan.lock); in fsl_qdma_queue_transfer_complete()
732 vchan_cookie_complete(&fsl_comp->vdesc); in fsl_qdma_queue_transfer_complete()
733 fsl_comp->qchan->status = DMA_COMPLETE; in fsl_qdma_queue_transfer_complete()
734 spin_unlock(&fsl_comp->qchan->vchan.lock); in fsl_qdma_queue_transfer_complete()
744 void __iomem *status = fsl_qdma->status_base; in fsl_qdma_error_handler()
757 dev_err(fsl_qdma->dma_dev.dev, in fsl_qdma_error_handler()
758 "DMA transaction error! (%x: %x-%x-%x-%x)\n", in fsl_qdma_error_handler()
771 void __iomem *block, *ctrl = fsl_qdma->ctrl_base; in fsl_qdma_queue_handler()
773 id = irq - fsl_qdma->irq_base; in fsl_qdma_queue_handler()
774 if (id < 0 && id > fsl_qdma->block_number) { in fsl_qdma_queue_handler()
775 dev_err(fsl_qdma->dma_dev.dev, in fsl_qdma_queue_handler()
777 irq, fsl_qdma->irq_base); in fsl_qdma_queue_handler()
780 block = fsl_qdma->block_base + in fsl_qdma_queue_handler()
793 dev_err(fsl_qdma->dma_dev.dev, "QDMA: status err!\n"); in fsl_qdma_queue_handler()
812 fsl_qdma->error_irq = in fsl_qdma_irq_init()
813 platform_get_irq_byname(pdev, "qdma-error"); in fsl_qdma_irq_init()
814 if (fsl_qdma->error_irq < 0) in fsl_qdma_irq_init()
815 return fsl_qdma->error_irq; in fsl_qdma_irq_init()
817 ret = devm_request_irq(&pdev->dev, fsl_qdma->error_irq, in fsl_qdma_irq_init()
821 dev_err(&pdev->dev, "Can't register qDMA controller IRQ.\n"); in fsl_qdma_irq_init()
825 for (i = 0; i < fsl_qdma->block_number; i++) { in fsl_qdma_irq_init()
826 sprintf(irq_name, "qdma-queue%d", i); in fsl_qdma_irq_init()
827 fsl_qdma->queue_irq[i] = in fsl_qdma_irq_init()
830 if (fsl_qdma->queue_irq[i] < 0) in fsl_qdma_irq_init()
831 return fsl_qdma->queue_irq[i]; in fsl_qdma_irq_init()
833 ret = devm_request_irq(&pdev->dev, in fsl_qdma_irq_init()
834 fsl_qdma->queue_irq[i], in fsl_qdma_irq_init()
840 dev_err(&pdev->dev, in fsl_qdma_irq_init()
846 ret = irq_set_affinity_hint(fsl_qdma->queue_irq[i], in fsl_qdma_irq_init()
849 dev_err(&pdev->dev, in fsl_qdma_irq_init()
852 fsl_qdma->queue_irq[i]); in fsl_qdma_irq_init()
865 devm_free_irq(&pdev->dev, fsl_qdma->error_irq, fsl_qdma); in fsl_qdma_irq_exit()
866 for (i = 0; i < fsl_qdma->block_number; i++) in fsl_qdma_irq_exit()
867 devm_free_irq(&pdev->dev, fsl_qdma->queue_irq[i], fsl_qdma); in fsl_qdma_irq_exit()
875 void __iomem *status = fsl_qdma->status_base; in fsl_qdma_reg_init()
876 void __iomem *block, *ctrl = fsl_qdma->ctrl_base; in fsl_qdma_reg_init()
877 struct fsl_qdma_queue *fsl_queue = fsl_qdma->queue; in fsl_qdma_reg_init()
882 dev_err(fsl_qdma->dma_dev.dev, "DMA halt failed!"); in fsl_qdma_reg_init()
886 for (i = 0; i < fsl_qdma->block_number; i++) { in fsl_qdma_reg_init()
892 block = fsl_qdma->block_base + in fsl_qdma_reg_init()
898 for (j = 0; j < fsl_qdma->block_number; j++) { in fsl_qdma_reg_init()
899 block = fsl_qdma->block_base + in fsl_qdma_reg_init()
901 for (i = 0; i < fsl_qdma->n_queues; i++) { in fsl_qdma_reg_init()
902 temp = fsl_queue + i + (j * fsl_qdma->n_queues); in fsl_qdma_reg_init()
911 qdma_writel(fsl_qdma, temp->bus_addr, in fsl_qdma_reg_init()
913 qdma_writel(fsl_qdma, temp->bus_addr, in fsl_qdma_reg_init()
918 reg |= FSL_QDMA_BCQMR_CD_THLD(ilog2(temp->n_cq) - 4); in fsl_qdma_reg_init()
919 reg |= FSL_QDMA_BCQMR_CQ_SIZE(ilog2(temp->n_cq) - 6); in fsl_qdma_reg_init()
939 qdma_writel(fsl_qdma, fsl_qdma->status[j]->bus_addr, in fsl_qdma_reg_init()
941 qdma_writel(fsl_qdma, fsl_qdma->status[j]->bus_addr, in fsl_qdma_reg_init()
956 (fsl_qdma->status[j]->n_cq) - 6); in fsl_qdma_reg_init()
987 return vchan_tx_prep(&fsl_chan->vchan, &fsl_comp->vdesc, flags); in fsl_qdma_prep_memcpy()
995 struct fsl_qdma_queue *fsl_queue = fsl_chan->queue; in fsl_qdma_enqueue_desc()
996 void __iomem *block = fsl_queue->block_base; in fsl_qdma_enqueue_desc()
998 reg = qdma_readl(fsl_chan->qdma, block + FSL_QDMA_BCQSR(fsl_queue->id)); in fsl_qdma_enqueue_desc()
1001 vdesc = vchan_next_desc(&fsl_chan->vchan); in fsl_qdma_enqueue_desc()
1004 list_del(&vdesc->node); in fsl_qdma_enqueue_desc()
1007 memcpy(fsl_queue->virt_head++, in fsl_qdma_enqueue_desc()
1008 fsl_comp->virt_addr, sizeof(struct fsl_qdma_format)); in fsl_qdma_enqueue_desc()
1009 if (fsl_queue->virt_head == fsl_queue->cq + fsl_queue->n_cq) in fsl_qdma_enqueue_desc()
1010 fsl_queue->virt_head = fsl_queue->cq; in fsl_qdma_enqueue_desc()
1012 list_add_tail(&fsl_comp->list, &fsl_queue->comp_used); in fsl_qdma_enqueue_desc()
1014 reg = qdma_readl(fsl_chan->qdma, block + FSL_QDMA_BCQMR(fsl_queue->id)); in fsl_qdma_enqueue_desc()
1016 qdma_writel(fsl_chan->qdma, reg, block + FSL_QDMA_BCQMR(fsl_queue->id)); in fsl_qdma_enqueue_desc()
1017 fsl_chan->status = DMA_IN_PROGRESS; in fsl_qdma_enqueue_desc()
1027 fsl_queue = fsl_comp->qchan->queue; in fsl_qdma_free_desc()
1029 spin_lock_irqsave(&fsl_queue->queue_lock, flags); in fsl_qdma_free_desc()
1030 list_add_tail(&fsl_comp->list, &fsl_queue->comp_free); in fsl_qdma_free_desc()
1031 spin_unlock_irqrestore(&fsl_queue->queue_lock, flags); in fsl_qdma_free_desc()
1038 struct fsl_qdma_queue *fsl_queue = fsl_chan->queue; in fsl_qdma_issue_pending()
1040 spin_lock_irqsave(&fsl_queue->queue_lock, flags); in fsl_qdma_issue_pending()
1041 spin_lock(&fsl_chan->vchan.lock); in fsl_qdma_issue_pending()
1042 if (vchan_issue_pending(&fsl_chan->vchan)) in fsl_qdma_issue_pending()
1044 spin_unlock(&fsl_chan->vchan.lock); in fsl_qdma_issue_pending()
1045 spin_unlock_irqrestore(&fsl_queue->queue_lock, flags); in fsl_qdma_issue_pending()
1052 vchan_synchronize(&fsl_chan->vchan); in fsl_qdma_synchronize()
1061 spin_lock_irqsave(&fsl_chan->vchan.lock, flags); in fsl_qdma_terminate_all()
1062 vchan_get_all_descriptors(&fsl_chan->vchan, &head); in fsl_qdma_terminate_all()
1063 spin_unlock_irqrestore(&fsl_chan->vchan.lock, flags); in fsl_qdma_terminate_all()
1064 vchan_dma_desc_free_list(&fsl_chan->vchan, &head); in fsl_qdma_terminate_all()
1072 struct fsl_qdma_engine *fsl_qdma = fsl_chan->qdma; in fsl_qdma_alloc_chan_resources()
1073 struct fsl_qdma_queue *fsl_queue = fsl_chan->queue; in fsl_qdma_alloc_chan_resources()
1075 if (fsl_queue->comp_pool && fsl_queue->desc_pool) in fsl_qdma_alloc_chan_resources()
1076 return fsl_qdma->desc_allocated; in fsl_qdma_alloc_chan_resources()
1078 INIT_LIST_HEAD(&fsl_queue->comp_free); in fsl_qdma_alloc_chan_resources()
1083 fsl_queue->comp_pool = in fsl_qdma_alloc_chan_resources()
1085 chan->device->dev, in fsl_qdma_alloc_chan_resources()
1088 if (!fsl_queue->comp_pool) in fsl_qdma_alloc_chan_resources()
1089 return -ENOMEM; in fsl_qdma_alloc_chan_resources()
1094 fsl_queue->desc_pool = in fsl_qdma_alloc_chan_resources()
1096 chan->device->dev, in fsl_qdma_alloc_chan_resources()
1099 if (!fsl_queue->desc_pool) in fsl_qdma_alloc_chan_resources()
1104 dev_err(chan->device->dev, in fsl_qdma_alloc_chan_resources()
1109 fsl_qdma->desc_allocated++; in fsl_qdma_alloc_chan_resources()
1110 return fsl_qdma->desc_allocated; in fsl_qdma_alloc_chan_resources()
1113 dma_pool_destroy(fsl_queue->desc_pool); in fsl_qdma_alloc_chan_resources()
1115 dma_pool_destroy(fsl_queue->comp_pool); in fsl_qdma_alloc_chan_resources()
1116 return -ENOMEM; in fsl_qdma_alloc_chan_resources()
1126 struct device_node *np = pdev->dev.of_node; in fsl_qdma_probe()
1128 ret = of_property_read_u32(np, "dma-channels", &chans); in fsl_qdma_probe()
1130 dev_err(&pdev->dev, "Can't get dma-channels.\n"); in fsl_qdma_probe()
1134 ret = of_property_read_u32(np, "block-offset", &blk_off); in fsl_qdma_probe()
1136 dev_err(&pdev->dev, "Can't get block-offset.\n"); in fsl_qdma_probe()
1140 ret = of_property_read_u32(np, "block-number", &blk_num); in fsl_qdma_probe()
1142 dev_err(&pdev->dev, "Can't get block-number.\n"); in fsl_qdma_probe()
1149 fsl_qdma = devm_kzalloc(&pdev->dev, len, GFP_KERNEL); in fsl_qdma_probe()
1151 return -ENOMEM; in fsl_qdma_probe()
1154 fsl_qdma->chans = devm_kzalloc(&pdev->dev, len, GFP_KERNEL); in fsl_qdma_probe()
1155 if (!fsl_qdma->chans) in fsl_qdma_probe()
1156 return -ENOMEM; in fsl_qdma_probe()
1159 fsl_qdma->status = devm_kzalloc(&pdev->dev, len, GFP_KERNEL); in fsl_qdma_probe()
1160 if (!fsl_qdma->status) in fsl_qdma_probe()
1161 return -ENOMEM; in fsl_qdma_probe()
1164 fsl_qdma->queue_irq = devm_kzalloc(&pdev->dev, len, GFP_KERNEL); in fsl_qdma_probe()
1165 if (!fsl_qdma->queue_irq) in fsl_qdma_probe()
1166 return -ENOMEM; in fsl_qdma_probe()
1168 ret = of_property_read_u32(np, "fsl,dma-queues", &queues); in fsl_qdma_probe()
1170 dev_err(&pdev->dev, "Can't get queues.\n"); in fsl_qdma_probe()
1174 fsl_qdma->desc_allocated = 0; in fsl_qdma_probe()
1175 fsl_qdma->n_chans = chans; in fsl_qdma_probe()
1176 fsl_qdma->n_queues = queues; in fsl_qdma_probe()
1177 fsl_qdma->block_number = blk_num; in fsl_qdma_probe()
1178 fsl_qdma->block_offset = blk_off; in fsl_qdma_probe()
1180 mutex_init(&fsl_qdma->fsl_qdma_mutex); in fsl_qdma_probe()
1182 for (i = 0; i < fsl_qdma->block_number; i++) { in fsl_qdma_probe()
1183 fsl_qdma->status[i] = fsl_qdma_prep_status_queue(pdev); in fsl_qdma_probe()
1184 if (!fsl_qdma->status[i]) in fsl_qdma_probe()
1185 return -ENOMEM; in fsl_qdma_probe()
1187 fsl_qdma->ctrl_base = devm_platform_ioremap_resource(pdev, 0); in fsl_qdma_probe()
1188 if (IS_ERR(fsl_qdma->ctrl_base)) in fsl_qdma_probe()
1189 return PTR_ERR(fsl_qdma->ctrl_base); in fsl_qdma_probe()
1191 fsl_qdma->status_base = devm_platform_ioremap_resource(pdev, 1); in fsl_qdma_probe()
1192 if (IS_ERR(fsl_qdma->status_base)) in fsl_qdma_probe()
1193 return PTR_ERR(fsl_qdma->status_base); in fsl_qdma_probe()
1195 fsl_qdma->block_base = devm_platform_ioremap_resource(pdev, 2); in fsl_qdma_probe()
1196 if (IS_ERR(fsl_qdma->block_base)) in fsl_qdma_probe()
1197 return PTR_ERR(fsl_qdma->block_base); in fsl_qdma_probe()
1198 fsl_qdma->queue = fsl_qdma_alloc_queue_resources(pdev, fsl_qdma); in fsl_qdma_probe()
1199 if (!fsl_qdma->queue) in fsl_qdma_probe()
1200 return -ENOMEM; in fsl_qdma_probe()
1202 fsl_qdma->irq_base = platform_get_irq_byname(pdev, "qdma-queue0"); in fsl_qdma_probe()
1203 if (fsl_qdma->irq_base < 0) in fsl_qdma_probe()
1204 return fsl_qdma->irq_base; in fsl_qdma_probe()
1206 fsl_qdma->feature = of_property_read_bool(np, "big-endian"); in fsl_qdma_probe()
1207 INIT_LIST_HEAD(&fsl_qdma->dma_dev.channels); in fsl_qdma_probe()
1209 for (i = 0; i < fsl_qdma->n_chans; i++) { in fsl_qdma_probe()
1210 struct fsl_qdma_chan *fsl_chan = &fsl_qdma->chans[i]; in fsl_qdma_probe()
1212 fsl_chan->qdma = fsl_qdma; in fsl_qdma_probe()
1213 fsl_chan->queue = fsl_qdma->queue + i % (fsl_qdma->n_queues * in fsl_qdma_probe()
1214 fsl_qdma->block_number); in fsl_qdma_probe()
1215 fsl_chan->vchan.desc_free = fsl_qdma_free_desc; in fsl_qdma_probe()
1216 vchan_init(&fsl_chan->vchan, &fsl_qdma->dma_dev); in fsl_qdma_probe()
1219 dma_cap_set(DMA_MEMCPY, fsl_qdma->dma_dev.cap_mask); in fsl_qdma_probe()
1221 fsl_qdma->dma_dev.dev = &pdev->dev; in fsl_qdma_probe()
1222 fsl_qdma->dma_dev.device_free_chan_resources = in fsl_qdma_probe()
1224 fsl_qdma->dma_dev.device_alloc_chan_resources = in fsl_qdma_probe()
1226 fsl_qdma->dma_dev.device_tx_status = dma_cookie_status; in fsl_qdma_probe()
1227 fsl_qdma->dma_dev.device_prep_dma_memcpy = fsl_qdma_prep_memcpy; in fsl_qdma_probe()
1228 fsl_qdma->dma_dev.device_issue_pending = fsl_qdma_issue_pending; in fsl_qdma_probe()
1229 fsl_qdma->dma_dev.device_synchronize = fsl_qdma_synchronize; in fsl_qdma_probe()
1230 fsl_qdma->dma_dev.device_terminate_all = fsl_qdma_terminate_all; in fsl_qdma_probe()
1232 ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(40)); in fsl_qdma_probe()
1234 dev_err(&pdev->dev, "dma_set_mask failure.\n"); in fsl_qdma_probe()
1242 dev_err(&pdev->dev, "Can't Initialize the qDMA engine.\n"); in fsl_qdma_probe()
1250 ret = dma_async_device_register(&fsl_qdma->dma_dev); in fsl_qdma_probe()
1252 dev_err(&pdev->dev, "Can't register NXP Layerscape qDMA engine.\n"); in fsl_qdma_probe()
1264 &dmadev->channels, vchan.chan.device_node) { in fsl_qdma_cleanup_vchan()
1265 list_del(&chan->vchan.chan.device_node); in fsl_qdma_cleanup_vchan()
1266 tasklet_kill(&chan->vchan.task); in fsl_qdma_cleanup_vchan()
1272 struct device_node *np = pdev->dev.of_node; in fsl_qdma_remove()
1276 fsl_qdma_cleanup_vchan(&fsl_qdma->dma_dev); in fsl_qdma_remove()
1278 dma_async_device_unregister(&fsl_qdma->dma_dev); in fsl_qdma_remove()
1284 { .compatible = "fsl,ls1021a-qdma", },
1291 .name = "fsl-qdma",
1300 MODULE_ALIAS("platform:fsl-qdma");