Lines Matching full:dma

3  * DMA BUF Mapping Helpers
6 #include <linux/dma-buf-mapping.h>
7 #include <linux/dma-resv.h>
21 * that does not have any CPU list, only the DMA list. in fill_sg_entry()
23 * importers can't use it. The phys_addr based DMA API in fill_sg_entry()
58 * struct dma_buf_dma - holds DMA mapping information
60 * @state: DMA IOVA state relevant in IOMMU-based DMA
61 * @size: Total size of DMA transfer
78 * @dir: [in] direction of DMA transfer
83 * On success, the DMA addresses and lengths in the returned scatterlist are
99 struct dma_buf_dma *dma; in dma_buf_phys_vec_to_sgt() local
111 dma = kzalloc(sizeof(*dma), GFP_KERNEL); in dma_buf_phys_vec_to_sgt()
112 if (!dma) in dma_buf_phys_vec_to_sgt()
122 dma->state = kzalloc(sizeof(*dma->state), GFP_KERNEL); in dma_buf_phys_vec_to_sgt()
123 if (!dma->state) { in dma_buf_phys_vec_to_sgt()
128 dma_iova_try_alloc(attach->dev, dma->state, 0, size); in dma_buf_phys_vec_to_sgt()
135 nents = calc_sg_nents(dma->state, phys_vec, nr_ranges, size); in dma_buf_phys_vec_to_sgt()
136 ret = sg_alloc_table(&dma->sgt, nents, GFP_KERNEL | __GFP_ZERO); in dma_buf_phys_vec_to_sgt()
140 sgl = dma->sgt.sgl; in dma_buf_phys_vec_to_sgt()
143 if (!dma->state) { in dma_buf_phys_vec_to_sgt()
146 } else if (dma_use_iova(dma->state)) { in dma_buf_phys_vec_to_sgt()
147 ret = dma_iova_link(attach->dev, dma->state, in dma_buf_phys_vec_to_sgt()
164 if (!dma->state || !dma_use_iova(dma->state)) in dma_buf_phys_vec_to_sgt()
168 if (dma->state && dma_use_iova(dma->state)) { in dma_buf_phys_vec_to_sgt()
170 ret = dma_iova_sync(attach->dev, dma->state, 0, mapped_len); in dma_buf_phys_vec_to_sgt()
174 sgl = fill_sg_entry(sgl, mapped_len, dma->state->addr); in dma_buf_phys_vec_to_sgt()
177 dma->size = size; in dma_buf_phys_vec_to_sgt()
183 dma->sgt.orig_nents = 0; in dma_buf_phys_vec_to_sgt()
191 return &dma->sgt; in dma_buf_phys_vec_to_sgt()
194 if (!i || !dma->state) { in dma_buf_phys_vec_to_sgt()
196 } else if (dma_use_iova(dma->state)) { in dma_buf_phys_vec_to_sgt()
197 dma_iova_destroy(attach->dev, dma->state, mapped_len, dir, in dma_buf_phys_vec_to_sgt()
200 for_each_sgtable_dma_sg(&dma->sgt, sgl, i) in dma_buf_phys_vec_to_sgt()
204 sg_free_table(&dma->sgt); in dma_buf_phys_vec_to_sgt()
206 kfree(dma->state); in dma_buf_phys_vec_to_sgt()
208 kfree(dma); in dma_buf_phys_vec_to_sgt()
217 * @dir: [in] direction of DMA transfer
219 * This unmaps a DMA mapping for @attached obtained
225 struct dma_buf_dma *dma = container_of(sgt, struct dma_buf_dma, sgt); in dma_buf_free_sgt() local
230 if (!dma->state) { in dma_buf_free_sgt()
232 } else if (dma_use_iova(dma->state)) { in dma_buf_free_sgt()
233 dma_iova_destroy(attach->dev, dma->state, dma->size, dir, in dma_buf_free_sgt()
244 kfree(dma->state); in dma_buf_free_sgt()
245 kfree(dma); in dma_buf_free_sgt()