Lines Matching full:attach
842 * calls attach() of dma_buf_ops to allow device-specific attach functionality
843 * @dmabuf: [in] buffer to attach device to.
865 struct dma_buf_attachment *attach; in dma_buf_dynamic_attach() local
874 attach = kzalloc(sizeof(*attach), GFP_KERNEL); in dma_buf_dynamic_attach()
875 if (!attach) in dma_buf_dynamic_attach()
878 attach->dev = dev; in dma_buf_dynamic_attach()
879 attach->dmabuf = dmabuf; in dma_buf_dynamic_attach()
881 attach->peer2peer = importer_ops->allow_peer2peer; in dma_buf_dynamic_attach()
882 attach->importer_ops = importer_ops; in dma_buf_dynamic_attach()
883 attach->importer_priv = importer_priv; in dma_buf_dynamic_attach()
885 if (dmabuf->ops->attach) { in dma_buf_dynamic_attach()
886 ret = dmabuf->ops->attach(dmabuf, attach); in dma_buf_dynamic_attach()
891 list_add(&attach->node, &dmabuf->attachments); in dma_buf_dynamic_attach()
898 if (dma_buf_attachment_is_dynamic(attach) != in dma_buf_dynamic_attach()
902 if (dma_buf_is_dynamic(attach->dmabuf)) { in dma_buf_dynamic_attach()
903 dma_resv_lock(attach->dmabuf->resv, NULL); in dma_buf_dynamic_attach()
904 ret = dma_buf_pin(attach); in dma_buf_dynamic_attach()
909 sgt = dmabuf->ops->map_dma_buf(attach, DMA_BIDIRECTIONAL); in dma_buf_dynamic_attach()
916 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_dynamic_attach()
917 dma_resv_unlock(attach->dmabuf->resv); in dma_buf_dynamic_attach()
918 attach->sgt = sgt; in dma_buf_dynamic_attach()
919 attach->dir = DMA_BIDIRECTIONAL; in dma_buf_dynamic_attach()
922 return attach; in dma_buf_dynamic_attach()
925 kfree(attach); in dma_buf_dynamic_attach()
929 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_dynamic_attach()
930 dma_buf_unpin(attach); in dma_buf_dynamic_attach()
933 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_dynamic_attach()
934 dma_resv_unlock(attach->dmabuf->resv); in dma_buf_dynamic_attach()
936 dma_buf_detach(dmabuf, attach); in dma_buf_dynamic_attach()
943 * @dmabuf: [in] buffer to attach device to.
960 * @attach: [in] attachment to be detached; is free'd after this call.
964 void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach) in dma_buf_detach() argument
966 if (WARN_ON(!dmabuf || !attach)) in dma_buf_detach()
969 if (attach->sgt) { in dma_buf_detach()
970 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_detach()
971 dma_resv_lock(attach->dmabuf->resv, NULL); in dma_buf_detach()
973 dmabuf->ops->unmap_dma_buf(attach, attach->sgt, attach->dir); in dma_buf_detach()
975 if (dma_buf_is_dynamic(attach->dmabuf)) { in dma_buf_detach()
976 dma_buf_unpin(attach); in dma_buf_detach()
977 dma_resv_unlock(attach->dmabuf->resv); in dma_buf_detach()
982 list_del(&attach->node); in dma_buf_detach()
985 dmabuf->ops->detach(dmabuf, attach); in dma_buf_detach()
987 kfree(attach); in dma_buf_detach()
994 * @attach: [in] attachment which should be pinned
999 int dma_buf_pin(struct dma_buf_attachment *attach) in dma_buf_pin() argument
1001 struct dma_buf *dmabuf = attach->dmabuf; in dma_buf_pin()
1007 ret = dmabuf->ops->pin(attach); in dma_buf_pin()
1016 * @attach: [in] attachment which should be unpinned
1018 void dma_buf_unpin(struct dma_buf_attachment *attach) in dma_buf_unpin() argument
1020 struct dma_buf *dmabuf = attach->dmabuf; in dma_buf_unpin()
1025 dmabuf->ops->unpin(attach); in dma_buf_unpin()
1033 * @attach: [in] attachment whose scatterlist is to be returned
1044 struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach, in dma_buf_map_attachment() argument
1052 if (WARN_ON(!attach || !attach->dmabuf)) in dma_buf_map_attachment()
1055 if (dma_buf_attachment_is_dynamic(attach)) in dma_buf_map_attachment()
1056 dma_resv_assert_held(attach->dmabuf->resv); in dma_buf_map_attachment()
1058 if (attach->sgt) { in dma_buf_map_attachment()
1063 if (attach->dir != direction && in dma_buf_map_attachment()
1064 attach->dir != DMA_BIDIRECTIONAL) in dma_buf_map_attachment()
1067 return attach->sgt; in dma_buf_map_attachment()
1070 if (dma_buf_is_dynamic(attach->dmabuf)) { in dma_buf_map_attachment()
1071 dma_resv_assert_held(attach->dmabuf->resv); in dma_buf_map_attachment()
1073 r = dma_buf_pin(attach); in dma_buf_map_attachment()
1079 sg_table = attach->dmabuf->ops->map_dma_buf(attach, direction); in dma_buf_map_attachment()
1083 if (IS_ERR(sg_table) && dma_buf_is_dynamic(attach->dmabuf) && in dma_buf_map_attachment()
1085 dma_buf_unpin(attach); in dma_buf_map_attachment()
1087 if (!IS_ERR(sg_table) && attach->dmabuf->ops->cache_sgt_mapping) { in dma_buf_map_attachment()
1088 attach->sgt = sg_table; in dma_buf_map_attachment()
1089 attach->dir = direction; in dma_buf_map_attachment()
1100 * @attach: [in] attachment to unmap buffer from
1106 void dma_buf_unmap_attachment(struct dma_buf_attachment *attach, in dma_buf_unmap_attachment() argument
1112 if (WARN_ON(!attach || !attach->dmabuf || !sg_table)) in dma_buf_unmap_attachment()
1115 if (dma_buf_attachment_is_dynamic(attach)) in dma_buf_unmap_attachment()
1116 dma_resv_assert_held(attach->dmabuf->resv); in dma_buf_unmap_attachment()
1118 if (attach->sgt == sg_table) in dma_buf_unmap_attachment()
1121 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_unmap_attachment()
1122 dma_resv_assert_held(attach->dmabuf->resv); in dma_buf_unmap_attachment()
1124 attach->dmabuf->ops->unmap_dma_buf(attach, sg_table, direction); in dma_buf_unmap_attachment()
1126 if (dma_buf_is_dynamic(attach->dmabuf) && in dma_buf_unmap_attachment()
1128 dma_buf_unpin(attach); in dma_buf_unmap_attachment()
1142 struct dma_buf_attachment *attach; in dma_buf_move_notify() local
1146 list_for_each_entry(attach, &dmabuf->attachments, node) in dma_buf_move_notify()
1147 if (attach->importer_ops) in dma_buf_move_notify()
1148 attach->importer_ops->move_notify(attach); in dma_buf_move_notify()