Lines Matching full:buffer
36 struct mpp_dma_buffer *buffer = NULL, *n; in mpp_dma_find_buffer_fd() local
43 list_for_each_entry_safe(buffer, n, in mpp_dma_find_buffer_fd()
49 if (buffer->dmabuf == dmabuf) { in mpp_dma_find_buffer_fd()
50 out = buffer; in mpp_dma_find_buffer_fd()
60 /* Release the buffer from the current list */
63 struct mpp_dma_buffer *buffer = in mpp_dma_release_buffer() local
66 buffer->dma->buffer_count--; in mpp_dma_release_buffer()
67 list_move_tail(&buffer->link, &buffer->dma->unused_list); in mpp_dma_release_buffer()
69 dma_buf_unmap_attachment(buffer->attach, buffer->sgt, buffer->dir); in mpp_dma_release_buffer()
70 dma_buf_detach(buffer->dmabuf, buffer->attach); in mpp_dma_release_buffer()
71 dma_buf_put(buffer->dmabuf); in mpp_dma_release_buffer()
72 buffer->dma = NULL; in mpp_dma_release_buffer()
73 buffer->dmabuf = NULL; in mpp_dma_release_buffer()
74 buffer->attach = NULL; in mpp_dma_release_buffer()
75 buffer->sgt = NULL; in mpp_dma_release_buffer()
76 buffer->copy_sgt = NULL; in mpp_dma_release_buffer()
77 buffer->iova = 0; in mpp_dma_release_buffer()
78 buffer->size = 0; in mpp_dma_release_buffer()
79 buffer->vaddr = NULL; in mpp_dma_release_buffer()
80 buffer->last_used = 0; in mpp_dma_release_buffer()
83 /* Remove the oldest buffer when count more than the setting */
88 struct mpp_dma_buffer *oldest = NULL, *buffer = NULL; in mpp_dma_remove_extra_buffer() local
93 list_for_each_entry_safe(buffer, n, in mpp_dma_remove_extra_buffer()
97 ktime_after(oldest_time, buffer->last_used)) { in mpp_dma_remove_extra_buffer()
98 oldest_time = buffer->last_used; in mpp_dma_remove_extra_buffer()
99 oldest = buffer; in mpp_dma_remove_extra_buffer()
111 struct mpp_dma_buffer *buffer) in mpp_dma_release() argument
114 kref_put(&buffer->ref, mpp_dma_release_buffer); in mpp_dma_release()
123 struct mpp_dma_buffer *buffer = NULL; in mpp_dma_release_fd() local
125 buffer = mpp_dma_find_buffer_fd(dma, fd); in mpp_dma_release_fd()
126 if (IS_ERR_OR_NULL(buffer)) { in mpp_dma_release_fd()
127 dev_err(dev, "can not find %d buffer in list\n", fd); in mpp_dma_release_fd()
133 kref_put(&buffer->ref, mpp_dma_release_buffer); in mpp_dma_release_fd()
144 struct mpp_dma_buffer *buffer; in mpp_dma_alloc() local
146 buffer = kzalloc(sizeof(*buffer), GFP_KERNEL); in mpp_dma_alloc()
147 if (!buffer) in mpp_dma_alloc()
151 buffer->vaddr = dma_alloc_coherent(dev, align_size, &iova, GFP_KERNEL); in mpp_dma_alloc()
152 if (!buffer->vaddr) in mpp_dma_alloc()
155 buffer->size = align_size; in mpp_dma_alloc()
156 buffer->iova = iova; in mpp_dma_alloc()
157 buffer->dev = dev; in mpp_dma_alloc()
159 return buffer; in mpp_dma_alloc()
161 kfree(buffer); in mpp_dma_alloc()
165 int mpp_dma_free(struct mpp_dma_buffer *buffer) in mpp_dma_free() argument
167 dma_free_coherent(buffer->dev, buffer->size, in mpp_dma_free()
168 buffer->vaddr, buffer->iova); in mpp_dma_free()
169 buffer->vaddr = NULL; in mpp_dma_free()
170 buffer->iova = 0; in mpp_dma_free()
171 buffer->size = 0; in mpp_dma_free()
172 buffer->dev = NULL; in mpp_dma_free()
173 kfree(buffer); in mpp_dma_free()
185 struct mpp_dma_buffer *buffer; in mpp_dma_import_fd() local
193 /* remove the oldest before add buffer */ in mpp_dma_import_fd()
198 buffer = mpp_dma_find_buffer_fd(dma, fd); in mpp_dma_import_fd()
199 if (!IS_ERR_OR_NULL(buffer)) { in mpp_dma_import_fd()
200 if (kref_get_unless_zero(&buffer->ref)) { in mpp_dma_import_fd()
201 buffer->last_used = ktime_get(); in mpp_dma_import_fd()
202 return buffer; in mpp_dma_import_fd()
213 /* A new DMA buffer */ in mpp_dma_import_fd()
215 buffer = list_first_entry_or_null(&dma->unused_list, in mpp_dma_import_fd()
218 if (!buffer) { in mpp_dma_import_fd()
223 list_del_init(&buffer->link); in mpp_dma_import_fd()
226 buffer->dmabuf = dmabuf; in mpp_dma_import_fd()
227 buffer->dir = DMA_BIDIRECTIONAL; in mpp_dma_import_fd()
228 buffer->last_used = ktime_get(); in mpp_dma_import_fd()
230 attach = dma_buf_attach(buffer->dmabuf, dma->dev); in mpp_dma_import_fd()
237 sgt = dma_buf_map_attachment(attach, buffer->dir); in mpp_dma_import_fd()
243 buffer->iova = sg_dma_address(sgt->sgl); in mpp_dma_import_fd()
244 buffer->size = sg_dma_len(sgt->sgl); in mpp_dma_import_fd()
245 buffer->attach = attach; in mpp_dma_import_fd()
246 buffer->sgt = sgt; in mpp_dma_import_fd()
247 buffer->dma = dma; in mpp_dma_import_fd()
249 kref_init(&buffer->ref); in mpp_dma_import_fd()
252 /* Increase the reference for used outside the buffer pool */ in mpp_dma_import_fd()
253 kref_get(&buffer->ref); in mpp_dma_import_fd()
257 list_add_tail(&buffer->link, &dma->used_list); in mpp_dma_import_fd()
260 return buffer; in mpp_dma_import_fd()
263 dma_buf_detach(buffer->dmabuf, attach); in mpp_dma_import_fd()
266 list_add_tail(&buffer->link, &dma->unused_list); in mpp_dma_import_fd()
274 struct mpp_dma_buffer *buffer) in mpp_dma_unmap_kernel() argument
276 void *vaddr = buffer->vaddr; in mpp_dma_unmap_kernel()
277 struct dma_buf *dmabuf = buffer->dmabuf; in mpp_dma_unmap_kernel()
284 buffer->vaddr = NULL; in mpp_dma_unmap_kernel()
292 struct mpp_dma_buffer *buffer) in mpp_dma_map_kernel() argument
296 struct dma_buf *dmabuf = buffer->dmabuf; in mpp_dma_map_kernel()
303 dev_dbg(dma->dev, "can't access the dma buffer\n"); in mpp_dma_map_kernel()
309 dev_dbg(dma->dev, "can't vmap the dma buffer\n"); in mpp_dma_map_kernel()
314 buffer->vaddr = vaddr; in mpp_dma_map_kernel()
327 struct mpp_dma_buffer *n, *buffer = NULL; in mpp_dma_session_destroy() local
333 list_for_each_entry_safe(buffer, n, in mpp_dma_session_destroy()
336 kref_put(&buffer->ref, mpp_dma_release_buffer); in mpp_dma_session_destroy()
350 struct mpp_dma_buffer *buffer = NULL; in mpp_dma_session_create() local
369 buffer = &dma->dma_bufs[i]; in mpp_dma_session_create()
370 buffer->dma = dma; in mpp_dma_session_create()
371 INIT_LIST_HEAD(&buffer->link); in mpp_dma_session_create()
372 list_add_tail(&buffer->link, &dma->unused_list); in mpp_dma_session_create()
383 void mpp_dma_buf_sync(struct mpp_dma_buffer *buffer, u32 offset, u32 length, in mpp_dma_buf_sync() argument
386 struct device *dev = buffer->dma->dev; in mpp_dma_buf_sync()
387 struct sg_table *sgt = buffer->sgt; in mpp_dma_buf_sync()