Lines Matching refs:attach

670 static struct sg_table * __map_dma_buf(struct dma_buf_attachment *attach,  in __map_dma_buf()  argument
675 sg_table = attach->dmabuf->ops->map_dma_buf(attach, direction); in __map_dma_buf()
710 struct dma_buf_attachment *attach; in dma_buf_dynamic_attach() local
719 attach = kzalloc(sizeof(*attach), GFP_KERNEL); in dma_buf_dynamic_attach()
720 if (!attach) in dma_buf_dynamic_attach()
723 attach->dev = dev; in dma_buf_dynamic_attach()
724 attach->dmabuf = dmabuf; in dma_buf_dynamic_attach()
726 attach->peer2peer = importer_ops->allow_peer2peer; in dma_buf_dynamic_attach()
727 attach->importer_ops = importer_ops; in dma_buf_dynamic_attach()
728 attach->importer_priv = importer_priv; in dma_buf_dynamic_attach()
730 if (dmabuf->ops->attach) { in dma_buf_dynamic_attach()
731 ret = dmabuf->ops->attach(dmabuf, attach); in dma_buf_dynamic_attach()
736 list_add(&attach->node, &dmabuf->attachments); in dma_buf_dynamic_attach()
743 if (dma_buf_attachment_is_dynamic(attach) != in dma_buf_dynamic_attach()
747 if (dma_buf_is_dynamic(attach->dmabuf)) { in dma_buf_dynamic_attach()
748 dma_resv_lock(attach->dmabuf->resv, NULL); in dma_buf_dynamic_attach()
749 ret = dmabuf->ops->pin(attach); in dma_buf_dynamic_attach()
754 sgt = __map_dma_buf(attach, DMA_BIDIRECTIONAL); in dma_buf_dynamic_attach()
761 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_dynamic_attach()
762 dma_resv_unlock(attach->dmabuf->resv); in dma_buf_dynamic_attach()
763 attach->sgt = sgt; in dma_buf_dynamic_attach()
764 attach->dir = DMA_BIDIRECTIONAL; in dma_buf_dynamic_attach()
767 return attach; in dma_buf_dynamic_attach()
770 kfree(attach); in dma_buf_dynamic_attach()
774 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_dynamic_attach()
775 dmabuf->ops->unpin(attach); in dma_buf_dynamic_attach()
778 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_dynamic_attach()
779 dma_resv_unlock(attach->dmabuf->resv); in dma_buf_dynamic_attach()
781 dma_buf_detach(dmabuf, attach); in dma_buf_dynamic_attach()
801 static void __unmap_dma_buf(struct dma_buf_attachment *attach, in __unmap_dma_buf() argument
808 attach->dmabuf->ops->unmap_dma_buf(attach, sg_table, direction); in __unmap_dma_buf()
820 void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach) in dma_buf_detach() argument
822 if (WARN_ON(!dmabuf || !attach)) in dma_buf_detach()
825 if (attach->sgt) { in dma_buf_detach()
826 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_detach()
827 dma_resv_lock(attach->dmabuf->resv, NULL); in dma_buf_detach()
829 __unmap_dma_buf(attach, attach->sgt, attach->dir); in dma_buf_detach()
831 if (dma_buf_is_dynamic(attach->dmabuf)) { in dma_buf_detach()
832 dmabuf->ops->unpin(attach); in dma_buf_detach()
833 dma_resv_unlock(attach->dmabuf->resv); in dma_buf_detach()
838 list_del(&attach->node); in dma_buf_detach()
841 dmabuf->ops->detach(dmabuf, attach); in dma_buf_detach()
843 kfree(attach); in dma_buf_detach()
861 int dma_buf_pin(struct dma_buf_attachment *attach) in dma_buf_pin() argument
863 struct dma_buf *dmabuf = attach->dmabuf; in dma_buf_pin()
866 WARN_ON(!dma_buf_attachment_is_dynamic(attach)); in dma_buf_pin()
871 ret = dmabuf->ops->pin(attach); in dma_buf_pin()
885 void dma_buf_unpin(struct dma_buf_attachment *attach) in dma_buf_unpin() argument
887 struct dma_buf *dmabuf = attach->dmabuf; in dma_buf_unpin()
889 WARN_ON(!dma_buf_attachment_is_dynamic(attach)); in dma_buf_unpin()
894 dmabuf->ops->unpin(attach); in dma_buf_unpin()
919 struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach, in dma_buf_map_attachment() argument
927 if (WARN_ON(!attach || !attach->dmabuf)) in dma_buf_map_attachment()
930 if (dma_buf_attachment_is_dynamic(attach)) in dma_buf_map_attachment()
931 dma_resv_assert_held(attach->dmabuf->resv); in dma_buf_map_attachment()
933 if (attach->sgt) { in dma_buf_map_attachment()
938 if (attach->dir != direction && in dma_buf_map_attachment()
939 attach->dir != DMA_BIDIRECTIONAL) in dma_buf_map_attachment()
942 return attach->sgt; in dma_buf_map_attachment()
945 if (dma_buf_is_dynamic(attach->dmabuf)) { in dma_buf_map_attachment()
946 dma_resv_assert_held(attach->dmabuf->resv); in dma_buf_map_attachment()
948 r = attach->dmabuf->ops->pin(attach); in dma_buf_map_attachment()
954 sg_table = __map_dma_buf(attach, direction); in dma_buf_map_attachment()
958 if (IS_ERR(sg_table) && dma_buf_is_dynamic(attach->dmabuf) && in dma_buf_map_attachment()
960 attach->dmabuf->ops->unpin(attach); in dma_buf_map_attachment()
962 if (!IS_ERR(sg_table) && attach->dmabuf->ops->cache_sgt_mapping) { in dma_buf_map_attachment()
963 attach->sgt = sg_table; in dma_buf_map_attachment()
964 attach->dir = direction; in dma_buf_map_attachment()
998 void dma_buf_unmap_attachment(struct dma_buf_attachment *attach, in dma_buf_unmap_attachment() argument
1004 if (WARN_ON(!attach || !attach->dmabuf || !sg_table)) in dma_buf_unmap_attachment()
1007 if (dma_buf_attachment_is_dynamic(attach)) in dma_buf_unmap_attachment()
1008 dma_resv_assert_held(attach->dmabuf->resv); in dma_buf_unmap_attachment()
1010 if (attach->sgt == sg_table) in dma_buf_unmap_attachment()
1013 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_unmap_attachment()
1014 dma_resv_assert_held(attach->dmabuf->resv); in dma_buf_unmap_attachment()
1016 __unmap_dma_buf(attach, sg_table, direction); in dma_buf_unmap_attachment()
1018 if (dma_buf_is_dynamic(attach->dmabuf) && in dma_buf_unmap_attachment()
1020 dma_buf_unpin(attach); in dma_buf_unmap_attachment()
1034 struct dma_buf_attachment *attach; in dma_buf_move_notify() local
1038 list_for_each_entry(attach, &dmabuf->attachments, node) in dma_buf_move_notify()
1039 if (attach->importer_ops) in dma_buf_move_notify()
1040 attach->importer_ops->move_notify(attach); in dma_buf_move_notify()