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