xref: /OK3568_Linux_fs/kernel/drivers/dma-buf/rk_heaps/rk-dma-heap.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * DMABUF Heaps Allocation Infrastructure
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2011 Google, Inc.
6*4882a593Smuzhiyun  * Copyright (C) 2019 Linaro Ltd.
7*4882a593Smuzhiyun  * Copyright (C) 2022 Rockchip Electronics Co. Ltd.
8*4882a593Smuzhiyun  * Author: Simon Xue <xxm@rock-chips.com>
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #ifndef _RK_DMA_HEAPS_H
12*4882a593Smuzhiyun #define _RK_DMA_HEAPS_H
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <linux/cdev.h>
15*4882a593Smuzhiyun #include <linux/types.h>
16*4882a593Smuzhiyun #include <linux/dma-buf.h>
17*4882a593Smuzhiyun #include <linux/rk-dma-heap.h>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #if defined(CONFIG_DMABUF_RK_HEAPS_DEBUG_PRINT)
20*4882a593Smuzhiyun #define dma_heap_print(fmt, ...)	\
21*4882a593Smuzhiyun 	printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
22*4882a593Smuzhiyun #else
23*4882a593Smuzhiyun #define dma_heap_print(fmt, ...)	\
24*4882a593Smuzhiyun 	no_printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
25*4882a593Smuzhiyun #endif
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define RK_DMA_HEAP_NAME_LEN 16
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun struct rk_vmap_pfn_data {
30*4882a593Smuzhiyun 	unsigned long	pfn; /* first pfn of contiguous */
31*4882a593Smuzhiyun 	pgprot_t	prot;
32*4882a593Smuzhiyun };
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun /**
35*4882a593Smuzhiyun  * struct rk_dma_heap_ops - ops to operate on a given heap
36*4882a593Smuzhiyun  * @allocate:		allocate dmabuf and return struct dma_buf ptr
37*4882a593Smuzhiyun  * @get_pool_size:	if heap maintains memory pools, get pool size in bytes
38*4882a593Smuzhiyun  *
39*4882a593Smuzhiyun  * allocate returns dmabuf on success, ERR_PTR(-errno) on error.
40*4882a593Smuzhiyun  */
41*4882a593Smuzhiyun struct rk_dma_heap_ops {
42*4882a593Smuzhiyun 	struct dma_buf *(*allocate)(struct rk_dma_heap *heap,
43*4882a593Smuzhiyun 			unsigned long len,
44*4882a593Smuzhiyun 			unsigned long fd_flags,
45*4882a593Smuzhiyun 			unsigned long heap_flags,
46*4882a593Smuzhiyun 			const char *name);
47*4882a593Smuzhiyun 	struct page *(*alloc_contig_pages)(struct rk_dma_heap *heap,
48*4882a593Smuzhiyun 					   size_t len, const char *name);
49*4882a593Smuzhiyun 	void (*free_contig_pages)(struct rk_dma_heap *heap,
50*4882a593Smuzhiyun 				  struct page *pages, size_t len,
51*4882a593Smuzhiyun 				  const char *name);
52*4882a593Smuzhiyun 	long (*get_pool_size)(struct rk_dma_heap *heap);
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun /**
56*4882a593Smuzhiyun  * struct rk_dma_heap_export_info - information needed to export a new dmabuf heap
57*4882a593Smuzhiyun  * @name:	used for debugging/device-node name
58*4882a593Smuzhiyun  * @ops:	ops struct for this heap
59*4882a593Smuzhiyun  * @priv:	heap exporter private data
60*4882a593Smuzhiyun  *
61*4882a593Smuzhiyun  * Information needed to export a new dmabuf heap.
62*4882a593Smuzhiyun  */
63*4882a593Smuzhiyun struct rk_dma_heap_export_info {
64*4882a593Smuzhiyun 	const char *name;
65*4882a593Smuzhiyun 	const struct rk_dma_heap_ops *ops;
66*4882a593Smuzhiyun 	void *priv;
67*4882a593Smuzhiyun 	bool support_cma;
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun /**
71*4882a593Smuzhiyun  * struct rk_dma_heap - represents a dmabuf heap in the system
72*4882a593Smuzhiyun  * @name:		used for debugging/device-node name
73*4882a593Smuzhiyun  * @ops:		ops struct for this heap
74*4882a593Smuzhiyun  * @heap_devt		heap device node
75*4882a593Smuzhiyun  * @list		list head connecting to list of heaps
76*4882a593Smuzhiyun  * @heap_cdev		heap char device
77*4882a593Smuzhiyun  * @heap_dev		heap device struct
78*4882a593Smuzhiyun  *
79*4882a593Smuzhiyun  * Represents a heap of memory from which buffers can be made.
80*4882a593Smuzhiyun  */
81*4882a593Smuzhiyun struct rk_dma_heap {
82*4882a593Smuzhiyun 	const char *name;
83*4882a593Smuzhiyun 	const struct rk_dma_heap_ops *ops;
84*4882a593Smuzhiyun 	void *priv;
85*4882a593Smuzhiyun 	dev_t heap_devt;
86*4882a593Smuzhiyun 	struct list_head list;
87*4882a593Smuzhiyun 	struct list_head dmabuf_list; /* dmabuf attach to this node */
88*4882a593Smuzhiyun 	struct mutex dmabuf_lock;
89*4882a593Smuzhiyun 	struct list_head contig_list; /* contig buffer attach to this node */
90*4882a593Smuzhiyun 	struct mutex contig_lock;
91*4882a593Smuzhiyun 	struct cdev heap_cdev;
92*4882a593Smuzhiyun 	struct kref refcount;
93*4882a593Smuzhiyun 	struct device *heap_dev;
94*4882a593Smuzhiyun 	bool support_cma;
95*4882a593Smuzhiyun 	struct seq_file *s;
96*4882a593Smuzhiyun 	struct proc_dir_entry *procfs;
97*4882a593Smuzhiyun 	unsigned long total_size;
98*4882a593Smuzhiyun };
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun struct rk_dma_heap_dmabuf {
101*4882a593Smuzhiyun 	struct list_head node;
102*4882a593Smuzhiyun 	struct dma_buf *dmabuf;
103*4882a593Smuzhiyun 	const char *orig_alloc;
104*4882a593Smuzhiyun 	phys_addr_t start;
105*4882a593Smuzhiyun 	phys_addr_t end;
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun struct rk_dma_heap_contig_buf {
109*4882a593Smuzhiyun 	struct list_head node;
110*4882a593Smuzhiyun 	const char *orig_alloc;
111*4882a593Smuzhiyun 	phys_addr_t start;
112*4882a593Smuzhiyun 	phys_addr_t end;
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun /**
116*4882a593Smuzhiyun  * rk_dma_heap_get_drvdata() - get per-heap driver data
117*4882a593Smuzhiyun  * @heap: DMA-Heap to retrieve private data for
118*4882a593Smuzhiyun  *
119*4882a593Smuzhiyun  * Returns:
120*4882a593Smuzhiyun  * The per-heap data for the heap.
121*4882a593Smuzhiyun  */
122*4882a593Smuzhiyun void *rk_dma_heap_get_drvdata(struct rk_dma_heap *heap);
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun /**
125*4882a593Smuzhiyun  * rk_dma_heap_get_dev() - get device struct for the heap
126*4882a593Smuzhiyun  * @heap: DMA-Heap to retrieve device struct from
127*4882a593Smuzhiyun  *
128*4882a593Smuzhiyun  * Returns:
129*4882a593Smuzhiyun  * The device struct for the heap.
130*4882a593Smuzhiyun  */
131*4882a593Smuzhiyun struct device *rk_dma_heap_get_dev(struct rk_dma_heap *heap);
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun /**
134*4882a593Smuzhiyun  * rk_dma_heap_get_name() - get heap name
135*4882a593Smuzhiyun  * @heap: DMA-Heap to retrieve private data for
136*4882a593Smuzhiyun  *
137*4882a593Smuzhiyun  * Returns:
138*4882a593Smuzhiyun  * The char* for the heap name.
139*4882a593Smuzhiyun  */
140*4882a593Smuzhiyun const char *rk_dma_heap_get_name(struct rk_dma_heap *heap);
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun /**
143*4882a593Smuzhiyun  * rk_dma_heap_add - adds a heap to dmabuf heaps
144*4882a593Smuzhiyun  * @exp_info:		information needed to register this heap
145*4882a593Smuzhiyun  */
146*4882a593Smuzhiyun struct rk_dma_heap *rk_dma_heap_add(const struct rk_dma_heap_export_info *exp_info);
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun /**
149*4882a593Smuzhiyun  * rk_dma_heap_put - drops a reference to a dmabuf heaps, potentially freeing it
150*4882a593Smuzhiyun  * @heap:		heap pointer
151*4882a593Smuzhiyun  */
152*4882a593Smuzhiyun void rk_dma_heap_put(struct rk_dma_heap *heap);
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun /**
155*4882a593Smuzhiyun  * rk_vmap_contig_pfn - Map contiguous pfn to vm area
156*4882a593Smuzhiyun  * @pfn:	indicate the first pfn of contig
157*4882a593Smuzhiyun  * @count:	count of pfns
158*4882a593Smuzhiyun  * @prot:	for mapping
159*4882a593Smuzhiyun  */
160*4882a593Smuzhiyun void *rk_vmap_contig_pfn(unsigned long pfn, unsigned int count,
161*4882a593Smuzhiyun 				 pgprot_t prot);
162*4882a593Smuzhiyun /**
163*4882a593Smuzhiyun  * rk_dma_heap_total_inc - Increase total buffer size
164*4882a593Smuzhiyun  * @heap:	dma_heap to increase
165*4882a593Smuzhiyun  * @len:	length to increase
166*4882a593Smuzhiyun  */
167*4882a593Smuzhiyun void rk_dma_heap_total_inc(struct rk_dma_heap *heap, size_t len);
168*4882a593Smuzhiyun /**
169*4882a593Smuzhiyun  * rk_dma_heap_total_dec - Decrease total buffer size
170*4882a593Smuzhiyun  * @heap:	dma_heap to decrease
171*4882a593Smuzhiyun  * @len:	length to decrease
172*4882a593Smuzhiyun  */
173*4882a593Smuzhiyun void rk_dma_heap_total_dec(struct rk_dma_heap *heap, size_t len);
174*4882a593Smuzhiyun /**
175*4882a593Smuzhiyun  * rk_dma_heap_get_cma - get cma structure
176*4882a593Smuzhiyun  */
177*4882a593Smuzhiyun struct cma *rk_dma_heap_get_cma(void);
178*4882a593Smuzhiyun #endif /* _DMA_HEAPS_H */
179