Lines Matching +full:dma +full:- +full:safe +full:- +full:map
1 // SPDX-License-Identifier: GPL-2.0
7 #include <linux/dma-buf.h>
9 #include <linux/dma-buf-cache.h>
11 /* NOTE: dma-buf-cache APIs are not irq safe, please DO NOT run in irq context !! */
29 mutex_lock(&dmabuf->cache_lock); in dma_buf_cache_destructor()
31 data = dmabuf->dtor_data; in dma_buf_cache_destructor()
33 list_for_each_entry_safe(cache, tmp, &data->head, list) { in dma_buf_cache_destructor()
34 if (!IS_ERR_OR_NULL(cache->sg_table)) in dma_buf_cache_destructor()
35 dma_buf_unmap_attachment(cache->attach, in dma_buf_cache_destructor()
36 cache->sg_table, in dma_buf_cache_destructor()
37 cache->direction); in dma_buf_cache_destructor()
39 dma_buf_detach(dmabuf, cache->attach); in dma_buf_cache_destructor()
40 list_del(&cache->list); in dma_buf_cache_destructor()
44 mutex_unlock(&dmabuf->cache_lock); in dma_buf_cache_destructor()
55 struct dma_buf *dmabuf = attach->dmabuf; in dma_buf_cache_get_cache()
57 if (dmabuf->dtor != dma_buf_cache_destructor) in dma_buf_cache_get_cache()
60 data = dmabuf->dtor_data; in dma_buf_cache_get_cache()
62 list_for_each_entry(cache, &data->head, list) { in dma_buf_cache_get_cache()
63 if (cache->attach == attach) in dma_buf_cache_get_cache()
75 mutex_lock(&dmabuf->cache_lock); in dma_buf_cache_detach()
81 mutex_unlock(&dmabuf->cache_lock); in dma_buf_cache_detach()
92 mutex_lock(&dmabuf->cache_lock); in dma_buf_cache_attach()
94 if (!dmabuf->dtor) { in dma_buf_cache_attach()
97 attach = ERR_PTR(-ENOMEM); in dma_buf_cache_attach()
100 INIT_LIST_HEAD(&data->head); in dma_buf_cache_attach()
104 if (dmabuf->dtor && dmabuf->dtor != dma_buf_cache_destructor) { in dma_buf_cache_attach()
109 data = dmabuf->dtor_data; in dma_buf_cache_attach()
111 list_for_each_entry(cache, &data->head, list) { in dma_buf_cache_attach()
112 if (cache->attach->dev == dev) { in dma_buf_cache_attach()
114 attach = cache->attach; in dma_buf_cache_attach()
121 attach = ERR_PTR(-ENOMEM); in dma_buf_cache_attach()
129 cache->attach = attach; in dma_buf_cache_attach()
130 list_add(&cache->list, &data->head); in dma_buf_cache_attach()
133 mutex_unlock(&dmabuf->cache_lock); in dma_buf_cache_attach()
142 mutex_unlock(&dmabuf->cache_lock); in dma_buf_cache_attach()
151 struct dma_buf *dmabuf = attach->dmabuf; in dma_buf_cache_unmap_attachment()
154 mutex_lock(&dmabuf->cache_lock); in dma_buf_cache_unmap_attachment()
160 mutex_unlock(&dmabuf->cache_lock); in dma_buf_cache_unmap_attachment()
167 struct dma_buf *dmabuf = attach->dmabuf; in dma_buf_cache_map_attachment()
171 mutex_lock(&dmabuf->cache_lock); in dma_buf_cache_map_attachment()
178 if (cache->sg_table) { in dma_buf_cache_map_attachment()
180 if (cache->direction == direction) { in dma_buf_cache_map_attachment()
181 sg_table = cache->sg_table; in dma_buf_cache_map_attachment()
185 dma_buf_unmap_attachment(attach, cache->sg_table, in dma_buf_cache_map_attachment()
186 cache->direction); in dma_buf_cache_map_attachment()
189 /* Cache map */ in dma_buf_cache_map_attachment()
191 cache->sg_table = sg_table; in dma_buf_cache_map_attachment()
192 cache->direction = direction; in dma_buf_cache_map_attachment()
195 mutex_unlock(&dmabuf->cache_lock); in dma_buf_cache_map_attachment()