Lines Matching +full:dma +full:- +full:info
1 // SPDX-License-Identifier: GPL-2.0
14 #include <linux/pci-epc.h>
15 #include <linux/pci-epf.h>
75 MHI_EP_CHANNEL_CONFIG_UL(18, "IP-CTRL-1"),
76 MHI_EP_CHANNEL_CONFIG_DL(19, "IP-CTRL-1"),
145 const struct pci_epf_mhi_ep_info *info; member
163 return addr & (epf_mhi->epc_features->align -1); in get_align_offset()
171 struct pci_epf *epf = epf_mhi->epf; in __pci_epf_mhi_alloc_map()
172 struct pci_epc *epc = epf->epc; in __pci_epf_mhi_alloc_map()
177 return -ENOMEM; in __pci_epf_mhi_alloc_map()
179 ret = pci_epc_map_addr(epc, epf->func_no, epf->vfunc_no, *paddr, in __pci_epf_mhi_alloc_map()
180 pci_addr - offset, size + offset); in __pci_epf_mhi_alloc_map()
209 struct pci_epf *epf = epf_mhi->epf; in __pci_epf_mhi_unmap_free()
210 struct pci_epc *epc = epf->epc; in __pci_epf_mhi_unmap_free()
212 pci_epc_unmap_addr(epc, epf->func_no, epf->vfunc_no, paddr - offset); in __pci_epf_mhi_unmap_free()
213 pci_epc_mem_free_addr(epc, paddr - offset, vaddr - offset, in __pci_epf_mhi_unmap_free()
231 struct pci_epf *epf = epf_mhi->epf; in pci_epf_mhi_raise_irq()
232 struct pci_epc *epc = epf->epc; in pci_epf_mhi_raise_irq()
238 pci_epc_raise_irq(epc, epf->func_no, epf->vfunc_no, PCI_IRQ_MSI, in pci_epf_mhi_raise_irq()
246 size_t offset = get_align_offset(epf_mhi, buf_info->host_addr); in pci_epf_mhi_iatu_read()
251 mutex_lock(&epf_mhi->lock); in pci_epf_mhi_iatu_read()
253 ret = __pci_epf_mhi_alloc_map(mhi_cntrl, buf_info->host_addr, &tre_phys, in pci_epf_mhi_iatu_read()
254 &tre_buf, offset, buf_info->size); in pci_epf_mhi_iatu_read()
256 mutex_unlock(&epf_mhi->lock); in pci_epf_mhi_iatu_read()
260 memcpy_fromio(buf_info->dev_addr, tre_buf, buf_info->size); in pci_epf_mhi_iatu_read()
262 __pci_epf_mhi_unmap_free(mhi_cntrl, buf_info->host_addr, tre_phys, in pci_epf_mhi_iatu_read()
263 tre_buf, offset, buf_info->size); in pci_epf_mhi_iatu_read()
265 mutex_unlock(&epf_mhi->lock); in pci_epf_mhi_iatu_read()
267 if (buf_info->cb) in pci_epf_mhi_iatu_read()
268 buf_info->cb(buf_info); in pci_epf_mhi_iatu_read()
277 size_t offset = get_align_offset(epf_mhi, buf_info->host_addr); in pci_epf_mhi_iatu_write()
282 mutex_lock(&epf_mhi->lock); in pci_epf_mhi_iatu_write()
284 ret = __pci_epf_mhi_alloc_map(mhi_cntrl, buf_info->host_addr, &tre_phys, in pci_epf_mhi_iatu_write()
285 &tre_buf, offset, buf_info->size); in pci_epf_mhi_iatu_write()
287 mutex_unlock(&epf_mhi->lock); in pci_epf_mhi_iatu_write()
291 memcpy_toio(tre_buf, buf_info->dev_addr, buf_info->size); in pci_epf_mhi_iatu_write()
293 __pci_epf_mhi_unmap_free(mhi_cntrl, buf_info->host_addr, tre_phys, in pci_epf_mhi_iatu_write()
294 tre_buf, offset, buf_info->size); in pci_epf_mhi_iatu_write()
296 mutex_unlock(&epf_mhi->lock); in pci_epf_mhi_iatu_write()
298 if (buf_info->cb) in pci_epf_mhi_iatu_write()
299 buf_info->cb(buf_info); in pci_epf_mhi_iatu_write()
313 struct device *dma_dev = epf_mhi->epf->epc->dev.parent; in pci_epf_mhi_edma_read()
314 struct dma_chan *chan = epf_mhi->dma_chan_rx; in pci_epf_mhi_edma_read()
315 struct device *dev = &epf_mhi->epf->dev; in pci_epf_mhi_edma_read()
323 if (buf_info->size < SZ_4K) in pci_epf_mhi_edma_read()
326 mutex_lock(&epf_mhi->lock); in pci_epf_mhi_edma_read()
329 config.src_addr = buf_info->host_addr; in pci_epf_mhi_edma_read()
333 dev_err(dev, "Failed to configure DMA channel\n"); in pci_epf_mhi_edma_read()
337 dst_addr = dma_map_single(dma_dev, buf_info->dev_addr, buf_info->size, in pci_epf_mhi_edma_read()
345 desc = dmaengine_prep_slave_single(chan, dst_addr, buf_info->size, in pci_epf_mhi_edma_read()
349 dev_err(dev, "Failed to prepare DMA\n"); in pci_epf_mhi_edma_read()
350 ret = -EIO; in pci_epf_mhi_edma_read()
354 desc->callback = pci_epf_mhi_dma_callback; in pci_epf_mhi_edma_read()
355 desc->callback_param = &complete; in pci_epf_mhi_edma_read()
360 dev_err(dev, "Failed to do DMA submit\n"); in pci_epf_mhi_edma_read()
367 dev_err(dev, "DMA transfer timeout\n"); in pci_epf_mhi_edma_read()
369 ret = -ETIMEDOUT; in pci_epf_mhi_edma_read()
373 dma_unmap_single(dma_dev, dst_addr, buf_info->size, DMA_FROM_DEVICE); in pci_epf_mhi_edma_read()
375 mutex_unlock(&epf_mhi->lock); in pci_epf_mhi_edma_read()
384 struct device *dma_dev = epf_mhi->epf->epc->dev.parent; in pci_epf_mhi_edma_write()
385 struct dma_chan *chan = epf_mhi->dma_chan_tx; in pci_epf_mhi_edma_write()
386 struct device *dev = &epf_mhi->epf->dev; in pci_epf_mhi_edma_write()
394 if (buf_info->size < SZ_4K) in pci_epf_mhi_edma_write()
397 mutex_lock(&epf_mhi->lock); in pci_epf_mhi_edma_write()
400 config.dst_addr = buf_info->host_addr; in pci_epf_mhi_edma_write()
404 dev_err(dev, "Failed to configure DMA channel\n"); in pci_epf_mhi_edma_write()
408 src_addr = dma_map_single(dma_dev, buf_info->dev_addr, buf_info->size, in pci_epf_mhi_edma_write()
416 desc = dmaengine_prep_slave_single(chan, src_addr, buf_info->size, in pci_epf_mhi_edma_write()
420 dev_err(dev, "Failed to prepare DMA\n"); in pci_epf_mhi_edma_write()
421 ret = -EIO; in pci_epf_mhi_edma_write()
425 desc->callback = pci_epf_mhi_dma_callback; in pci_epf_mhi_edma_write()
426 desc->callback_param = &complete; in pci_epf_mhi_edma_write()
431 dev_err(dev, "Failed to do DMA submit\n"); in pci_epf_mhi_edma_write()
438 dev_err(dev, "DMA transfer timeout\n"); in pci_epf_mhi_edma_write()
440 ret = -ETIMEDOUT; in pci_epf_mhi_edma_write()
444 dma_unmap_single(dma_dev, src_addr, buf_info->size, DMA_TO_DEVICE); in pci_epf_mhi_edma_write()
446 mutex_unlock(&epf_mhi->lock); in pci_epf_mhi_edma_write()
454 struct device *dma_dev = epf_mhi->epf->epc->dev.parent; in pci_epf_mhi_dma_worker()
460 spin_lock_irqsave(&epf_mhi->list_lock, flags); in pci_epf_mhi_dma_worker()
461 list_splice_tail_init(&epf_mhi->dma_list, &head); in pci_epf_mhi_dma_worker()
462 spin_unlock_irqrestore(&epf_mhi->list_lock, flags); in pci_epf_mhi_dma_worker()
465 list_del(&itr->node); in pci_epf_mhi_dma_worker()
466 dma_unmap_single(dma_dev, itr->paddr, itr->size, itr->dir); in pci_epf_mhi_dma_worker()
467 buf_info = &itr->buf_info; in pci_epf_mhi_dma_worker()
468 buf_info->cb(buf_info); in pci_epf_mhi_dma_worker()
476 struct pci_epf_mhi *epf_mhi = transfer->epf_mhi; in pci_epf_mhi_dma_async_callback()
478 spin_lock(&epf_mhi->list_lock); in pci_epf_mhi_dma_async_callback()
479 list_add_tail(&transfer->node, &epf_mhi->dma_list); in pci_epf_mhi_dma_async_callback()
480 spin_unlock(&epf_mhi->list_lock); in pci_epf_mhi_dma_async_callback()
482 queue_work(epf_mhi->dma_wq, &epf_mhi->dma_work); in pci_epf_mhi_dma_async_callback()
489 struct device *dma_dev = epf_mhi->epf->epc->dev.parent; in pci_epf_mhi_edma_read_async()
491 struct dma_chan *chan = epf_mhi->dma_chan_rx; in pci_epf_mhi_edma_read_async()
492 struct device *dev = &epf_mhi->epf->dev; in pci_epf_mhi_edma_read_async()
500 mutex_lock(&epf_mhi->lock); in pci_epf_mhi_edma_read_async()
503 config.src_addr = buf_info->host_addr; in pci_epf_mhi_edma_read_async()
507 dev_err(dev, "Failed to configure DMA channel\n"); in pci_epf_mhi_edma_read_async()
511 dst_addr = dma_map_single(dma_dev, buf_info->dev_addr, buf_info->size, in pci_epf_mhi_edma_read_async()
519 desc = dmaengine_prep_slave_single(chan, dst_addr, buf_info->size, in pci_epf_mhi_edma_read_async()
523 dev_err(dev, "Failed to prepare DMA\n"); in pci_epf_mhi_edma_read_async()
524 ret = -EIO; in pci_epf_mhi_edma_read_async()
530 ret = -ENOMEM; in pci_epf_mhi_edma_read_async()
534 transfer->epf_mhi = epf_mhi; in pci_epf_mhi_edma_read_async()
535 transfer->paddr = dst_addr; in pci_epf_mhi_edma_read_async()
536 transfer->size = buf_info->size; in pci_epf_mhi_edma_read_async()
537 transfer->dir = DMA_FROM_DEVICE; in pci_epf_mhi_edma_read_async()
538 memcpy(&transfer->buf_info, buf_info, sizeof(*buf_info)); in pci_epf_mhi_edma_read_async()
540 desc->callback = pci_epf_mhi_dma_async_callback; in pci_epf_mhi_edma_read_async()
541 desc->callback_param = transfer; in pci_epf_mhi_edma_read_async()
546 dev_err(dev, "Failed to do DMA submit\n"); in pci_epf_mhi_edma_read_async()
557 dma_unmap_single(dma_dev, dst_addr, buf_info->size, DMA_FROM_DEVICE); in pci_epf_mhi_edma_read_async()
559 mutex_unlock(&epf_mhi->lock); in pci_epf_mhi_edma_read_async()
568 struct device *dma_dev = epf_mhi->epf->epc->dev.parent; in pci_epf_mhi_edma_write_async()
570 struct dma_chan *chan = epf_mhi->dma_chan_tx; in pci_epf_mhi_edma_write_async()
571 struct device *dev = &epf_mhi->epf->dev; in pci_epf_mhi_edma_write_async()
579 mutex_lock(&epf_mhi->lock); in pci_epf_mhi_edma_write_async()
582 config.dst_addr = buf_info->host_addr; in pci_epf_mhi_edma_write_async()
586 dev_err(dev, "Failed to configure DMA channel\n"); in pci_epf_mhi_edma_write_async()
590 src_addr = dma_map_single(dma_dev, buf_info->dev_addr, buf_info->size, in pci_epf_mhi_edma_write_async()
598 desc = dmaengine_prep_slave_single(chan, src_addr, buf_info->size, in pci_epf_mhi_edma_write_async()
602 dev_err(dev, "Failed to prepare DMA\n"); in pci_epf_mhi_edma_write_async()
603 ret = -EIO; in pci_epf_mhi_edma_write_async()
609 ret = -ENOMEM; in pci_epf_mhi_edma_write_async()
613 transfer->epf_mhi = epf_mhi; in pci_epf_mhi_edma_write_async()
614 transfer->paddr = src_addr; in pci_epf_mhi_edma_write_async()
615 transfer->size = buf_info->size; in pci_epf_mhi_edma_write_async()
616 transfer->dir = DMA_TO_DEVICE; in pci_epf_mhi_edma_write_async()
617 memcpy(&transfer->buf_info, buf_info, sizeof(*buf_info)); in pci_epf_mhi_edma_write_async()
619 desc->callback = pci_epf_mhi_dma_async_callback; in pci_epf_mhi_edma_write_async()
620 desc->callback_param = transfer; in pci_epf_mhi_edma_write_async()
625 dev_err(dev, "Failed to do DMA submit\n"); in pci_epf_mhi_edma_write_async()
636 dma_unmap_single(dma_dev, src_addr, buf_info->size, DMA_TO_DEVICE); in pci_epf_mhi_edma_write_async()
638 mutex_unlock(&epf_mhi->lock); in pci_epf_mhi_edma_write_async()
656 return chan->device->dev == filter->dev && filter->dma_mask & in pci_epf_mhi_filter()
662 struct device *dma_dev = epf_mhi->epf->epc->dev.parent; in pci_epf_mhi_dma_init()
663 struct device *dev = &epf_mhi->epf->dev; in pci_epf_mhi_dma_init()
673 epf_mhi->dma_chan_tx = dma_request_channel(mask, pci_epf_mhi_filter, in pci_epf_mhi_dma_init()
675 if (IS_ERR_OR_NULL(epf_mhi->dma_chan_tx)) { in pci_epf_mhi_dma_init()
677 return -ENODEV; in pci_epf_mhi_dma_init()
681 epf_mhi->dma_chan_rx = dma_request_channel(mask, pci_epf_mhi_filter, in pci_epf_mhi_dma_init()
683 if (IS_ERR_OR_NULL(epf_mhi->dma_chan_rx)) { in pci_epf_mhi_dma_init()
685 ret = -ENODEV; in pci_epf_mhi_dma_init()
689 epf_mhi->dma_wq = alloc_workqueue("pci_epf_mhi_dma_wq", 0, 0); in pci_epf_mhi_dma_init()
690 if (!epf_mhi->dma_wq) { in pci_epf_mhi_dma_init()
691 ret = -ENOMEM; in pci_epf_mhi_dma_init()
695 INIT_LIST_HEAD(&epf_mhi->dma_list); in pci_epf_mhi_dma_init()
696 INIT_WORK(&epf_mhi->dma_work, pci_epf_mhi_dma_worker); in pci_epf_mhi_dma_init()
697 spin_lock_init(&epf_mhi->list_lock); in pci_epf_mhi_dma_init()
702 dma_release_channel(epf_mhi->dma_chan_rx); in pci_epf_mhi_dma_init()
703 epf_mhi->dma_chan_rx = NULL; in pci_epf_mhi_dma_init()
705 dma_release_channel(epf_mhi->dma_chan_tx); in pci_epf_mhi_dma_init()
706 epf_mhi->dma_chan_tx = NULL; in pci_epf_mhi_dma_init()
713 destroy_workqueue(epf_mhi->dma_wq); in pci_epf_mhi_dma_deinit()
714 dma_release_channel(epf_mhi->dma_chan_tx); in pci_epf_mhi_dma_deinit()
715 dma_release_channel(epf_mhi->dma_chan_rx); in pci_epf_mhi_dma_deinit()
716 epf_mhi->dma_chan_tx = NULL; in pci_epf_mhi_dma_deinit()
717 epf_mhi->dma_chan_rx = NULL; in pci_epf_mhi_dma_deinit()
723 const struct pci_epf_mhi_ep_info *info = epf_mhi->info; in pci_epf_mhi_epc_init() local
724 struct pci_epf_bar *epf_bar = &epf->bar[info->bar_num]; in pci_epf_mhi_epc_init()
725 struct pci_epc *epc = epf->epc; in pci_epf_mhi_epc_init()
726 struct device *dev = &epf->dev; in pci_epf_mhi_epc_init()
729 epf_bar->phys_addr = epf_mhi->mmio_phys; in pci_epf_mhi_epc_init()
730 epf_bar->size = epf_mhi->mmio_size; in pci_epf_mhi_epc_init()
731 epf_bar->barno = info->bar_num; in pci_epf_mhi_epc_init()
732 epf_bar->flags = info->epf_flags; in pci_epf_mhi_epc_init()
733 ret = pci_epc_set_bar(epc, epf->func_no, epf->vfunc_no, epf_bar); in pci_epf_mhi_epc_init()
739 ret = pci_epc_set_msi(epc, epf->func_no, epf->vfunc_no, in pci_epf_mhi_epc_init()
740 order_base_2(info->msi_count)); in pci_epf_mhi_epc_init()
746 ret = pci_epc_write_header(epc, epf->func_no, epf->vfunc_no, in pci_epf_mhi_epc_init()
747 epf->header); in pci_epf_mhi_epc_init()
753 epf_mhi->epc_features = pci_epc_get_features(epc, epf->func_no, epf->vfunc_no); in pci_epf_mhi_epc_init()
754 if (!epf_mhi->epc_features) in pci_epf_mhi_epc_init()
755 return -ENODATA; in pci_epf_mhi_epc_init()
757 if (info->flags & MHI_EPF_USE_DMA) { in pci_epf_mhi_epc_init()
760 dev_err(dev, "Failed to initialize DMA: %d\n", ret); in pci_epf_mhi_epc_init()
771 const struct pci_epf_mhi_ep_info *info = epf_mhi->info; in pci_epf_mhi_epc_deinit() local
772 struct pci_epf_bar *epf_bar = &epf->bar[info->bar_num]; in pci_epf_mhi_epc_deinit()
773 struct mhi_ep_cntrl *mhi_cntrl = &epf_mhi->mhi_cntrl; in pci_epf_mhi_epc_deinit()
774 struct pci_epc *epc = epf->epc; in pci_epf_mhi_epc_deinit()
776 if (mhi_cntrl->mhi_dev) { in pci_epf_mhi_epc_deinit()
778 if (info->flags & MHI_EPF_USE_DMA) in pci_epf_mhi_epc_deinit()
783 pci_epc_clear_bar(epc, epf->func_no, epf->vfunc_no, epf_bar); in pci_epf_mhi_epc_deinit()
789 const struct pci_epf_mhi_ep_info *info = epf_mhi->info; in pci_epf_mhi_link_up() local
790 struct mhi_ep_cntrl *mhi_cntrl = &epf_mhi->mhi_cntrl; in pci_epf_mhi_link_up()
791 struct pci_epc *epc = epf->epc; in pci_epf_mhi_link_up()
792 struct device *dev = &epf->dev; in pci_epf_mhi_link_up()
795 mhi_cntrl->mmio = epf_mhi->mmio; in pci_epf_mhi_link_up()
796 mhi_cntrl->irq = epf_mhi->irq; in pci_epf_mhi_link_up()
797 mhi_cntrl->mru = info->mru; in pci_epf_mhi_link_up()
800 mhi_cntrl->cntrl_dev = epc->dev.parent; in pci_epf_mhi_link_up()
801 mhi_cntrl->raise_irq = pci_epf_mhi_raise_irq; in pci_epf_mhi_link_up()
802 mhi_cntrl->alloc_map = pci_epf_mhi_alloc_map; in pci_epf_mhi_link_up()
803 mhi_cntrl->unmap_free = pci_epf_mhi_unmap_free; in pci_epf_mhi_link_up()
804 mhi_cntrl->read_sync = mhi_cntrl->read_async = pci_epf_mhi_iatu_read; in pci_epf_mhi_link_up()
805 mhi_cntrl->write_sync = mhi_cntrl->write_async = pci_epf_mhi_iatu_write; in pci_epf_mhi_link_up()
806 if (info->flags & MHI_EPF_USE_DMA) { in pci_epf_mhi_link_up()
807 mhi_cntrl->read_sync = pci_epf_mhi_edma_read; in pci_epf_mhi_link_up()
808 mhi_cntrl->write_sync = pci_epf_mhi_edma_write; in pci_epf_mhi_link_up()
809 mhi_cntrl->read_async = pci_epf_mhi_edma_read_async; in pci_epf_mhi_link_up()
810 mhi_cntrl->write_async = pci_epf_mhi_edma_write_async; in pci_epf_mhi_link_up()
814 ret = mhi_ep_register_controller(mhi_cntrl, info->config); in pci_epf_mhi_link_up()
817 if (info->flags & MHI_EPF_USE_DMA) in pci_epf_mhi_link_up()
828 const struct pci_epf_mhi_ep_info *info = epf_mhi->info; in pci_epf_mhi_link_down() local
829 struct mhi_ep_cntrl *mhi_cntrl = &epf_mhi->mhi_cntrl; in pci_epf_mhi_link_down()
831 if (mhi_cntrl->mhi_dev) { in pci_epf_mhi_link_down()
833 if (info->flags & MHI_EPF_USE_DMA) in pci_epf_mhi_link_down()
844 const struct pci_epf_mhi_ep_info *info = epf_mhi->info; in pci_epf_mhi_bus_master_enable() local
845 struct mhi_ep_cntrl *mhi_cntrl = &epf_mhi->mhi_cntrl; in pci_epf_mhi_bus_master_enable()
846 struct device *dev = &epf->dev; in pci_epf_mhi_bus_master_enable()
853 if (!mhi_cntrl->enabled && mhi_cntrl->mhi_dev) { in pci_epf_mhi_bus_master_enable()
857 if (info->flags & MHI_EPF_USE_DMA) in pci_epf_mhi_bus_master_enable()
869 struct pci_epc *epc = epf->epc; in pci_epf_mhi_bind()
870 struct device *dev = &epf->dev; in pci_epf_mhi_bind()
871 struct platform_device *pdev = to_platform_device(epc->dev.parent); in pci_epf_mhi_bind()
879 return -ENODEV; in pci_epf_mhi_bind()
882 epf_mhi->mmio_phys = res->start; in pci_epf_mhi_bind()
883 epf_mhi->mmio_size = resource_size(res); in pci_epf_mhi_bind()
885 epf_mhi->mmio = ioremap(epf_mhi->mmio_phys, epf_mhi->mmio_size); in pci_epf_mhi_bind()
886 if (!epf_mhi->mmio) in pci_epf_mhi_bind()
887 return -ENOMEM; in pci_epf_mhi_bind()
891 iounmap(epf_mhi->mmio); in pci_epf_mhi_bind()
895 epf_mhi->irq = ret; in pci_epf_mhi_bind()
903 const struct pci_epf_mhi_ep_info *info = epf_mhi->info; in pci_epf_mhi_unbind() local
904 struct pci_epf_bar *epf_bar = &epf->bar[info->bar_num]; in pci_epf_mhi_unbind()
905 struct mhi_ep_cntrl *mhi_cntrl = &epf_mhi->mhi_cntrl; in pci_epf_mhi_unbind()
906 struct pci_epc *epc = epf->epc; in pci_epf_mhi_unbind()
913 if (mhi_cntrl->mhi_dev) { in pci_epf_mhi_unbind()
915 if (info->flags & MHI_EPF_USE_DMA) in pci_epf_mhi_unbind()
920 iounmap(epf_mhi->mmio); in pci_epf_mhi_unbind()
921 pci_epc_clear_bar(epc, epf->func_no, epf->vfunc_no, epf_bar); in pci_epf_mhi_unbind()
935 struct pci_epf_mhi_ep_info *info = in pci_epf_mhi_probe() local
936 (struct pci_epf_mhi_ep_info *)id->driver_data; in pci_epf_mhi_probe()
938 struct device *dev = &epf->dev; in pci_epf_mhi_probe()
942 return -ENOMEM; in pci_epf_mhi_probe()
944 epf->header = info->epf_header; in pci_epf_mhi_probe()
945 epf_mhi->info = info; in pci_epf_mhi_probe()
946 epf_mhi->epf = epf; in pci_epf_mhi_probe()
948 epf->event_ops = &pci_epf_mhi_event_ops; in pci_epf_mhi_probe()
950 mutex_init(&epf_mhi->lock); in pci_epf_mhi_probe()