Rename struct dma_buf_map to struct iosys_map and corresponding APIs. Over time dma-buf-map grew up to more functionality than the one used by dma-buf: in fact it's just a shim layer to abstract system memory, that can be accessed via regular load and store, from IO memory that needs to be acessed via arch helpers. The idea is to extend this API so it can fulfill other needs, internal to a single driver. Example: in the i915 driver it's desired to share the implementation for integrated graphics, which uses mostly system memory, with discrete graphics, which may need to access IO memory. The conversion was mostly done with the following semantic patch: @r1@ @@ - struct dma_buf_map + struct iosys_map @r2@ @@ ( - DMA_BUF_MAP_INIT_VADDR + IOSYS_MAP_INIT_VADDR | - dma_buf_map_set_vaddr + iosys_map_set_vaddr | - dma_buf_map_set_vaddr_iomem + iosys_map_set_vaddr_iomem | - dma_buf_map_is_equal + iosys_map_is_equal | - dma_buf_map_is_null + iosys_map_is_null | - dma_buf_map_is_set + iosys_map_is_set | - dma_buf_map_clear + iosys_map_clear | - dma_buf_map_memcpy_to + iosys_map_memcpy_to | - dma_buf_map_incr + iosys_map_incr ) @@ @@ - #include <linux/dma-buf-map.h> + #include <linux/iosys-map.h> Then some files had their includes adjusted and some comments were update to remove mentions to dma-buf-map. Since this is not specific to dma-buf anymore, move the documentation to the "Bus-Independent Device Accesses" section. v2: - Squash patches v3: - Fix wrong removal of dma-buf.h from MAINTAINERS - Move documentation from dma-buf.rst to device-io.rst v4: - Change documentation title and level Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com> Acked-by: Christian König <christian.koenig@amd.com> Acked-by: Sumit Semwal <sumit.semwal@linaro.org> Acked-by: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patchwork.freedesktop.org/patch/msgid/20220204170541.829227-1-lucas.demarchi@intel.com
134 lines
2.7 KiB
C
134 lines
2.7 KiB
C
/*
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
* Copyright © 2016 Intel Corporation
|
|
*/
|
|
|
|
#include "mock_dmabuf.h"
|
|
|
|
static struct sg_table *mock_map_dma_buf(struct dma_buf_attachment *attachment,
|
|
enum dma_data_direction dir)
|
|
{
|
|
struct mock_dmabuf *mock = to_mock(attachment->dmabuf);
|
|
struct sg_table *st;
|
|
struct scatterlist *sg;
|
|
int i, err;
|
|
|
|
st = kmalloc(sizeof(*st), GFP_KERNEL);
|
|
if (!st)
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
err = sg_alloc_table(st, mock->npages, GFP_KERNEL);
|
|
if (err)
|
|
goto err_free;
|
|
|
|
sg = st->sgl;
|
|
for (i = 0; i < mock->npages; i++) {
|
|
sg_set_page(sg, mock->pages[i], PAGE_SIZE, 0);
|
|
sg = sg_next(sg);
|
|
}
|
|
|
|
err = dma_map_sgtable(attachment->dev, st, dir, 0);
|
|
if (err)
|
|
goto err_st;
|
|
|
|
return st;
|
|
|
|
err_st:
|
|
sg_free_table(st);
|
|
err_free:
|
|
kfree(st);
|
|
return ERR_PTR(err);
|
|
}
|
|
|
|
static void mock_unmap_dma_buf(struct dma_buf_attachment *attachment,
|
|
struct sg_table *st,
|
|
enum dma_data_direction dir)
|
|
{
|
|
dma_unmap_sgtable(attachment->dev, st, dir, 0);
|
|
sg_free_table(st);
|
|
kfree(st);
|
|
}
|
|
|
|
static void mock_dmabuf_release(struct dma_buf *dma_buf)
|
|
{
|
|
struct mock_dmabuf *mock = to_mock(dma_buf);
|
|
int i;
|
|
|
|
for (i = 0; i < mock->npages; i++)
|
|
put_page(mock->pages[i]);
|
|
|
|
kfree(mock);
|
|
}
|
|
|
|
static int mock_dmabuf_vmap(struct dma_buf *dma_buf, struct iosys_map *map)
|
|
{
|
|
struct mock_dmabuf *mock = to_mock(dma_buf);
|
|
void *vaddr;
|
|
|
|
vaddr = vm_map_ram(mock->pages, mock->npages, 0);
|
|
if (!vaddr)
|
|
return -ENOMEM;
|
|
iosys_map_set_vaddr(map, vaddr);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void mock_dmabuf_vunmap(struct dma_buf *dma_buf, struct iosys_map *map)
|
|
{
|
|
struct mock_dmabuf *mock = to_mock(dma_buf);
|
|
|
|
vm_unmap_ram(map->vaddr, mock->npages);
|
|
}
|
|
|
|
static int mock_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static const struct dma_buf_ops mock_dmabuf_ops = {
|
|
.map_dma_buf = mock_map_dma_buf,
|
|
.unmap_dma_buf = mock_unmap_dma_buf,
|
|
.release = mock_dmabuf_release,
|
|
.mmap = mock_dmabuf_mmap,
|
|
.vmap = mock_dmabuf_vmap,
|
|
.vunmap = mock_dmabuf_vunmap,
|
|
};
|
|
|
|
static struct dma_buf *mock_dmabuf(int npages)
|
|
{
|
|
struct mock_dmabuf *mock;
|
|
DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
|
|
struct dma_buf *dmabuf;
|
|
int i;
|
|
|
|
mock = kmalloc(sizeof(*mock) + npages * sizeof(struct page *),
|
|
GFP_KERNEL);
|
|
if (!mock)
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
mock->npages = npages;
|
|
for (i = 0; i < npages; i++) {
|
|
mock->pages[i] = alloc_page(GFP_KERNEL);
|
|
if (!mock->pages[i])
|
|
goto err;
|
|
}
|
|
|
|
exp_info.ops = &mock_dmabuf_ops;
|
|
exp_info.size = npages * PAGE_SIZE;
|
|
exp_info.flags = O_CLOEXEC;
|
|
exp_info.priv = mock;
|
|
|
|
dmabuf = dma_buf_export(&exp_info);
|
|
if (IS_ERR(dmabuf))
|
|
goto err;
|
|
|
|
return dmabuf;
|
|
|
|
err:
|
|
while (i--)
|
|
put_page(mock->pages[i]);
|
|
kfree(mock);
|
|
return ERR_PTR(-ENOMEM);
|
|
}
|