struct dma_buf { size_t size; // buffer size struct file *file; // binded fd struct list_head attachments; // attached device list const struct dma_buf_ops *ops; // 由exporter 提供 struct mutex lock; unsigned vmapping_counter; // vmap相关,非必要 void *vmap_ptr; const char *exp_n...
一旦驱动程序完成了对共享缓冲区的使用,它需要调用dma_buf_detach()(在清理任何映射之后),然后通过调用dma_buf_put()释放通过dma_buf_get()获得的引用。 对于导出者预期实现的详细语义,请参见dma_buf_ops。 CPU对DMA缓冲区对象的访问 支持CPU访问dma缓冲区对象有多个原因: 内核中的回退操作,例如当设备通过USB连...
从上面的代码来看,要实现一个 dma-buf exporter驱动,需要执行3个步骤: dma_buf_ops DEFINE_DMA_BUF_EXPORT_INFO dma_buf_export() 注意: 其中 dma_buf_ops 的回调接口中,如下接口又是必须要实现的,缺少任何一个都将导致 dma_buf_export() 函数调用失败! map_dma_buf unmap_dma_buf map map_atomic mmap ...
dma_buf对象中最重要的成员变量是ops方法集,dma_buf本身是一个通用的框架,正是依靠这里的ops回调函数集来实现dma_buf对象的重载功能,所谓重载就是 说dma_buf框架可以用于不同的运用场景。所以ops定义的回调函数是我们编写dma_buf框架下exporter驱动的主要实现代码。 ops中定义的回调函数都对应着dma_buf模块外部头文件...
实现对buf的操作,比如在用户空间想要操作这块buf需要先map一下,在内核空间相关通过dma或者cpu来访问该buf,或者做cache同步,这些都是由exporter来实现的,如图中左侧的cma_heap_buf_ops结构,就是该实现的一组操作函数。另外为什么需要由exporter来实现呢?因为exporter是清楚这些内存从那里申请的,因此当然清楚怎么map,所以...
dma_buf_init(&my_dmabuf->dma_buf, &ops, size, DMA_BUF_ALLOC_HINT_ZEROCOPY); // 创建一个匿名inode并将其与DMABUF对象关联起来 struct inode *inode = anon_inode_getfile("dmabuf", &my_dmabuf->dma_buf.fops, my_dmabuf, O_RDWR); if (IS_ERR(inode)) { dma_buf...
struct ion_handle *ion_import_dma_buf(struct ion_client *client,intfd){structdma_buf*dmabuf;struction_buffer*buffer;struction_handle*handle;dmabuf = dma_buf_get(fd);if(IS_ERR_OR_NULL(dmabuf))returnERR_PTR(PTR_ERR(dmabuf));if(dmabuf->ops != &dma_buf_ops) { ...
> @@ -267,8 +267,14 @@ static void vb2_dc_dmabuf_ops_detach(struct dma_buf > *dbuf, > > /* release the scatterlist cache */ > if (attach->dma_dir != DMA_NONE) > - dma_unmap_sg(db_attach->dev, sgt->sgl, sgt->orig_nents, ...
* @ops: dma_buf_ops associated with this buffer object. * @lock: used internally to serialize list manipulation, attach/detach and vmap/unmap * @vmapping_counter: used internally to refcnt the vmaps * @vmap_ptr: the current vmap ptr if vmapping_counter > 0 * @exp_name: name of the...
dmabuf->ops->mmap) 138 return -EINVAL; 139 140 /* check for overflowing the buffer's size */ 141 if (vma->vm_pgoff + vma_pages(vma) > 142 dmabuf->size >> PAGE_SHIFT) 143 return -EINVAL; 144 145 return dmabuf->ops->mmap(dmabuf, vma); 146} 147 148static loff_t dma_buf_...