Lines Matching refs:dma
5 #include <linux/dma-mapping.h>
27 struct bcm_vk_dma *dma,
30 static int bcm_vk_dma_free(struct device *dev, struct bcm_vk_dma *dma);
36 struct bcm_vk_dma *dma,
60 dma->nr_pages = last - first + 1;
63 dma->pages = kmalloc_array(dma->nr_pages,
66 if (!dma->pages)
70 data, vkdata->size, dma->nr_pages);
72 dma->direction = direction;
76 dma->nr_pages,
78 dma->pages);
79 if (err != dma->nr_pages) {
80 dma->nr_pages = (err >= 0) ? err : 0;
82 err, dma->nr_pages);
87 dma->sglen = (dma->nr_pages * sizeof(*sgdata)) +
91 dma->sglist = dma_alloc_coherent(dev,
92 dma->sglen,
93 &dma->handle,
95 if (!dma->sglist)
98 dma->sglist[SGLIST_NUM_SG] = 0;
99 dma->sglist[SGLIST_TOTALSIZE] = vkdata->size;
101 sgdata = (struct _vk_data *)&dma->sglist[SGLIST_VKDATA_START];
107 dma->pages[0],
110 dma->direction);
113 __free_page(dma->pages[0]);
117 for (i = 1; i < dma->nr_pages; i++) {
121 dma->pages[i],
124 dma->direction);
126 __free_page(dma->pages[i]);
142 dma->sglist[SGLIST_NUM_SG]++;
153 dma->sglist[SGLIST_NUM_SG]++;
156 put_unaligned((u64)dma->handle, &vkdata->address);
157 vkdata->size = (dma->sglist[SGLIST_NUM_SG] * sizeof(*sgdata)) +
163 (u64)dma->sglist,
164 dma->handle,
165 dma->sglen,
168 dev_dbg(dev, "i:0x%x 0x%x\n", i, dma->sglist[i]);
175 struct bcm_vk_dma *dma,
191 &dma[i],
220 if (dma[i].sglist)
221 bcm_vk_dma_free(dev, &dma[i]);
226 static int bcm_vk_dma_free(struct device *dev, struct bcm_vk_dma *dma)
234 dev_dbg(dev, "free sglist=%p sglen=0x%x\n", dma->sglist, dma->sglen);
237 num_sg = dma->sglist[SGLIST_NUM_SG];
238 vkdata = (struct _vk_data *)&dma->sglist[SGLIST_VKDATA_START];
243 dma_unmap_page(dev, addr, size, dma->direction);
247 dma_free_coherent(dev, dma->sglen, dma->sglist, dma->handle);
250 for (i = 0; i < dma->nr_pages; i++)
251 put_page(dma->pages[i]);
253 /* Free allocated dma pages */
254 kfree(dma->pages);
255 dma->sglist = NULL;
260 int bcm_vk_sg_free(struct device *dev, struct bcm_vk_dma *dma, int num,
268 if (dma[i].sglist) {
269 bcm_vk_dma_free(dev, &dma[i]);