• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * DMABUF Heaps Allocation Infrastructure
4  *
5  * Copyright (C) 2011 Google, Inc.
6  * Copyright (C) 2019 Linaro Ltd.
7  */
8 
9 #ifndef _DMA_HEAPS_H
10 #define _DMA_HEAPS_H
11 
12 #include <linux/cdev.h>
13 #include <linux/types.h>
14 
15 struct dma_heap;
16 
17 /**
18  * struct dma_heap_ops - ops to operate on a given heap
19  * @allocate:		allocate dmabuf and return struct dma_buf ptr
20  * @get_pool_size:	if heap maintains memory pools, get pool size in bytes
21  *
22  * allocate returns dmabuf on success, ERR_PTR(-errno) on error.
23  */
24 struct dma_heap_ops {
25 	struct dma_buf *(*allocate)(struct dma_heap *heap,
26 			unsigned long len,
27 			unsigned long fd_flags,
28 			unsigned long heap_flags);
29 	long (*get_pool_size)(struct dma_heap *heap);
30 };
31 
32 /**
33  * struct dma_heap_export_info - information needed to export a new dmabuf heap
34  * @name:	used for debugging/device-node name
35  * @ops:	ops struct for this heap
36  * @priv:	heap exporter private data
37  *
38  * Information needed to export a new dmabuf heap.
39  */
40 struct dma_heap_export_info {
41 	const char *name;
42 	const struct dma_heap_ops *ops;
43 	void *priv;
44 };
45 
46 /**
47  * dma_heap_get_drvdata() - get per-heap driver data
48  * @heap: DMA-Heap to retrieve private data for
49  *
50  * Returns:
51  * The per-heap data for the heap.
52  */
53 void *dma_heap_get_drvdata(struct dma_heap *heap);
54 
55 /**
56  * dma_heap_get_dev() - get device struct for the heap
57  * @heap: DMA-Heap to retrieve device struct from
58  *
59  * Returns:
60  * The device struct for the heap.
61  */
62 struct device *dma_heap_get_dev(struct dma_heap *heap);
63 
64 /**
65  * dma_heap_get_name() - get heap name
66  * @heap: DMA-Heap to retrieve private data for
67  *
68  * Returns:
69  * The char* for the heap name.
70  */
71 const char *dma_heap_get_name(struct dma_heap *heap);
72 
73 /**
74  * dma_heap_add - adds a heap to dmabuf heaps
75  * @exp_info:		information needed to register this heap
76  */
77 struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info);
78 
79 /**
80  * dma_heap_put - drops a reference to a dmabuf heaps, potentially freeing it
81  * @heap:		heap pointer
82  */
83 void dma_heap_put(struct dma_heap *heap);
84 
85 /**
86  * dma_heap_find - Returns the registered dma_heap with the specified name
87  * @name: Name of the heap to find
88  *
89  * NOTE: dma_heaps returned from this function MUST be released
90  * using dma_heap_put() when the user is done.
91  */
92 struct dma_heap *dma_heap_find(const char *name);
93 
94 /**
95  * dma_heap_buffer_alloc - Allocate dma-buf from a dma_heap
96  * @heap:	dma_heap to allocate from
97  * @len:	size to allocate
98  * @fd_flags:	flags to set on returned dma-buf fd
99  * @heap_flags:	flags to pass to the dma heap
100  *
101  * This is for internal dma-buf allocations only.
102  */
103 struct dma_buf *dma_heap_buffer_alloc(struct dma_heap *heap, size_t len,
104 				      unsigned int fd_flags,
105 				      unsigned int heap_flags);
106 
107 /** dma_heap_buffer_free - Free dma_buf allocated by dma_heap_buffer_alloc
108  * @dma_buf:	dma_buf to free
109  *
110  * This is really only a simple wrapper to dma_buf_put()
111  */
112 void dma_heap_buffer_free(struct dma_buf *);
113 
114 /**
115  * dma_heap_bufferfd_alloc - Allocate dma-buf fd from a dma_heap
116  * @heap:	dma_heap to allocate from
117  * @len:	size to allocate
118  * @fd_flags:	flags to set on returned dma-buf fd
119  * @heap_flags:	flags to pass to the dma heap
120  */
121 int dma_heap_bufferfd_alloc(struct dma_heap *heap, size_t len,
122 			    unsigned int fd_flags,
123 			    unsigned int heap_flags);
124 #endif /* _DMA_HEAPS_H */
125