2 * SPDX-License-Identifier: MIT
4 * Copyright © 2016 Intel Corporation
7 #include "mock_dmabuf.h"
9 static struct sg_table
*mock_map_dma_buf(struct dma_buf_attachment
*attachment
,
10 enum dma_data_direction dir
)
12 struct mock_dmabuf
*mock
= to_mock(attachment
->dmabuf
);
14 struct scatterlist
*sg
;
17 st
= kmalloc(sizeof(*st
), GFP_KERNEL
);
19 return ERR_PTR(-ENOMEM
);
21 err
= sg_alloc_table(st
, mock
->npages
, GFP_KERNEL
);
26 for (i
= 0; i
< mock
->npages
; i
++) {
27 sg_set_page(sg
, mock
->pages
[i
], PAGE_SIZE
, 0);
31 err
= dma_map_sgtable(attachment
->dev
, st
, dir
, 0);
44 static void mock_unmap_dma_buf(struct dma_buf_attachment
*attachment
,
46 enum dma_data_direction dir
)
48 dma_unmap_sgtable(attachment
->dev
, st
, dir
, 0);
53 static void mock_dmabuf_release(struct dma_buf
*dma_buf
)
55 struct mock_dmabuf
*mock
= to_mock(dma_buf
);
58 for (i
= 0; i
< mock
->npages
; i
++)
59 put_page(mock
->pages
[i
]);
64 static int mock_dmabuf_vmap(struct dma_buf
*dma_buf
, struct dma_buf_map
*map
)
66 struct mock_dmabuf
*mock
= to_mock(dma_buf
);
69 vaddr
= vm_map_ram(mock
->pages
, mock
->npages
, 0);
72 dma_buf_map_set_vaddr(map
, vaddr
);
77 static void mock_dmabuf_vunmap(struct dma_buf
*dma_buf
, struct dma_buf_map
*map
)
79 struct mock_dmabuf
*mock
= to_mock(dma_buf
);
81 vm_unmap_ram(map
->vaddr
, mock
->npages
);
84 static int mock_dmabuf_mmap(struct dma_buf
*dma_buf
, struct vm_area_struct
*vma
)
89 static const struct dma_buf_ops mock_dmabuf_ops
= {
90 .map_dma_buf
= mock_map_dma_buf
,
91 .unmap_dma_buf
= mock_unmap_dma_buf
,
92 .release
= mock_dmabuf_release
,
93 .mmap
= mock_dmabuf_mmap
,
94 .vmap
= mock_dmabuf_vmap
,
95 .vunmap
= mock_dmabuf_vunmap
,
98 static struct dma_buf
*mock_dmabuf(int npages
)
100 struct mock_dmabuf
*mock
;
101 DEFINE_DMA_BUF_EXPORT_INFO(exp_info
);
102 struct dma_buf
*dmabuf
;
105 mock
= kmalloc(sizeof(*mock
) + npages
* sizeof(struct page
*),
108 return ERR_PTR(-ENOMEM
);
110 mock
->npages
= npages
;
111 for (i
= 0; i
< npages
; i
++) {
112 mock
->pages
[i
] = alloc_page(GFP_KERNEL
);
117 exp_info
.ops
= &mock_dmabuf_ops
;
118 exp_info
.size
= npages
* PAGE_SIZE
;
119 exp_info
.flags
= O_CLOEXEC
;
120 exp_info
.priv
= mock
;
122 dmabuf
= dma_buf_export(&exp_info
);
130 put_page(mock
->pages
[i
]);
132 return ERR_PTR(-ENOMEM
);