xref: /wlan-driver/qca-wifi-host-cmn/qdf/linux/src/i_qdf_mem.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  * DOC: i_qdf_mem.h
22*5113495bSYour Name  * Linux-specific definitions for QDF memory API's
23*5113495bSYour Name  */
24*5113495bSYour Name 
25*5113495bSYour Name #ifndef __I_QDF_MEM_H
26*5113495bSYour Name #define __I_QDF_MEM_H
27*5113495bSYour Name 
28*5113495bSYour Name #ifdef __KERNEL__
29*5113495bSYour Name #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)
30*5113495bSYour Name #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
31*5113495bSYour Name #include <linux/autoconf.h>
32*5113495bSYour Name #else
33*5113495bSYour Name #include <generated/autoconf.h>
34*5113495bSYour Name #endif
35*5113495bSYour Name #endif
36*5113495bSYour Name #include <linux/slab.h>
37*5113495bSYour Name #include <linux/hardirq.h>
38*5113495bSYour Name #include <linux/vmalloc.h>
39*5113495bSYour Name #include <linux/pci.h> /* pci_alloc_consistent */
40*5113495bSYour Name #include <linux/cache.h> /* L1_CACHE_BYTES */
41*5113495bSYour Name 
42*5113495bSYour Name #define __qdf_cache_line_sz L1_CACHE_BYTES
43*5113495bSYour Name #include "queue.h"
44*5113495bSYour Name 
45*5113495bSYour Name #else
46*5113495bSYour Name /*
47*5113495bSYour Name  * Provide dummy defs for kernel data types, functions, and enums
48*5113495bSYour Name  * used in this header file.
49*5113495bSYour Name  */
50*5113495bSYour Name #define GFP_KERNEL 0
51*5113495bSYour Name #define GFP_ATOMIC 0
52*5113495bSYour Name #define __GFP_KSWAPD_RECLAIM 0
53*5113495bSYour Name #define __GFP_DIRECT_RECLAIM 0
54*5113495bSYour Name #define kzalloc(size, flags) NULL
55*5113495bSYour Name #define vmalloc(size)        NULL
56*5113495bSYour Name #define kfree(buf)
57*5113495bSYour Name #define vfree(buf)
58*5113495bSYour Name #define pci_alloc_consistent(dev, size, paddr) NULL
59*5113495bSYour Name #define __qdf_mempool_t void*
60*5113495bSYour Name #define QDF_RET_IP NULL
61*5113495bSYour Name #endif /* __KERNEL__ */
62*5113495bSYour Name #include <qdf_status.h>
63*5113495bSYour Name #if (defined(__ANDROID_COMMON_KERNEL__) && \
64*5113495bSYour Name 		(LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)) && \
65*5113495bSYour Name 		(defined(MSM_PLATFORM) || defined(QCA_IPA_LL_TX_FLOW_CONTROL)))
66*5113495bSYour Name #include <linux/qcom-iommu-util.h>
67*5113495bSYour Name #endif
68*5113495bSYour Name 
69*5113495bSYour Name #if IS_ENABLED(CONFIG_ARM_SMMU)
70*5113495bSYour Name #include <pld_common.h>
71*5113495bSYour Name #ifdef ENABLE_SMMU_S1_TRANSLATION
72*5113495bSYour Name #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
73*5113495bSYour Name #include <asm/dma-iommu.h>
74*5113495bSYour Name #endif
75*5113495bSYour Name #endif
76*5113495bSYour Name #include <linux/iommu.h>
77*5113495bSYour Name #endif
78*5113495bSYour Name 
79*5113495bSYour Name #ifdef __KERNEL__
80*5113495bSYour Name typedef struct mempool_elem {
81*5113495bSYour Name 	STAILQ_ENTRY(mempool_elem) mempool_entry;
82*5113495bSYour Name } mempool_elem_t;
83*5113495bSYour Name 
84*5113495bSYour Name /**
85*5113495bSYour Name  * typedef __qdf_mempool_ctxt_t - Memory pool context
86*5113495bSYour Name  * @pool_id: pool identifier
87*5113495bSYour Name  * @flags: flags
88*5113495bSYour Name  * @elem_size: size of each pool element in bytes
89*5113495bSYour Name  * @pool_mem: pool_addr address of the pool created
90*5113495bSYour Name  * @mem_size: Total size of the pool in bytes
91*5113495bSYour Name  * @free_list: free pool list
92*5113495bSYour Name  * @lock: spinlock object
93*5113495bSYour Name  * @max_elem: Maximum number of elements in the pool
94*5113495bSYour Name  * @free_cnt: Number of free elements available
95*5113495bSYour Name  */
96*5113495bSYour Name typedef struct __qdf_mempool_ctxt {
97*5113495bSYour Name 	int pool_id;
98*5113495bSYour Name 	u_int32_t flags;
99*5113495bSYour Name 	size_t elem_size;
100*5113495bSYour Name 	void *pool_mem;
101*5113495bSYour Name 	u_int32_t mem_size;
102*5113495bSYour Name 
103*5113495bSYour Name 	STAILQ_HEAD(, mempool_elem) free_list;
104*5113495bSYour Name 	spinlock_t lock;
105*5113495bSYour Name 	u_int32_t max_elem;
106*5113495bSYour Name 	u_int32_t free_cnt;
107*5113495bSYour Name } __qdf_mempool_ctxt_t;
108*5113495bSYour Name 
109*5113495bSYour Name typedef struct kmem_cache *qdf_kmem_cache_t;
110*5113495bSYour Name #endif /* __KERNEL__ */
111*5113495bSYour Name 
112*5113495bSYour Name #define __page_size ((size_t)PAGE_SIZE)
113*5113495bSYour Name #define __qdf_align(a, mask) ALIGN(a, mask)
114*5113495bSYour Name 
115*5113495bSYour Name #ifdef DISABLE_MEMDEBUG_PANIC
116*5113495bSYour Name #define QDF_MEMDEBUG_PANIC(reason_fmt, args...) \
117*5113495bSYour Name 	do { \
118*5113495bSYour Name 		/* no-op */ \
119*5113495bSYour Name 	} while (false)
120*5113495bSYour Name #else
121*5113495bSYour Name #define QDF_MEMDEBUG_PANIC(reason_fmt, args...) \
122*5113495bSYour Name 	QDF_DEBUG_PANIC(reason_fmt, ## args)
123*5113495bSYour Name #endif
124*5113495bSYour Name 
125*5113495bSYour Name /**
126*5113495bSYour Name  * typedef __dma_data_direction - typedef for dma_data_direction
127*5113495bSYour Name  */
128*5113495bSYour Name typedef enum dma_data_direction __dma_data_direction;
129*5113495bSYour Name 
130*5113495bSYour Name /**
131*5113495bSYour Name  * __qdf_dma_dir_to_os() - Convert DMA data direction to OS specific enum
132*5113495bSYour Name  * @qdf_dir: QDF DMA data direction
133*5113495bSYour Name  *
134*5113495bSYour Name  * Return:
135*5113495bSYour Name  * enum dma_data_direction
136*5113495bSYour Name  */
137*5113495bSYour Name static inline
__qdf_dma_dir_to_os(qdf_dma_dir_t qdf_dir)138*5113495bSYour Name enum dma_data_direction __qdf_dma_dir_to_os(qdf_dma_dir_t qdf_dir)
139*5113495bSYour Name {
140*5113495bSYour Name 	switch (qdf_dir) {
141*5113495bSYour Name 	case QDF_DMA_BIDIRECTIONAL:
142*5113495bSYour Name 		return DMA_BIDIRECTIONAL;
143*5113495bSYour Name 	case QDF_DMA_TO_DEVICE:
144*5113495bSYour Name 		return DMA_TO_DEVICE;
145*5113495bSYour Name 	case QDF_DMA_FROM_DEVICE:
146*5113495bSYour Name 		return DMA_FROM_DEVICE;
147*5113495bSYour Name 	default:
148*5113495bSYour Name 		return DMA_NONE;
149*5113495bSYour Name 	}
150*5113495bSYour Name }
151*5113495bSYour Name 
152*5113495bSYour Name 
153*5113495bSYour Name /**
154*5113495bSYour Name  * __qdf_mem_map_nbytes_single - Map memory for DMA
155*5113495bSYour Name  * @osdev: pomter OS device context
156*5113495bSYour Name  * @buf: pointer to memory to be dma mapped
157*5113495bSYour Name  * @dir: DMA map direction
158*5113495bSYour Name  * @nbytes: number of bytes to be mapped.
159*5113495bSYour Name  * @phy_addr: pointer to receive physical address.
160*5113495bSYour Name  *
161*5113495bSYour Name  * Return: success/failure
162*5113495bSYour Name  */
__qdf_mem_map_nbytes_single(qdf_device_t osdev,void * buf,qdf_dma_dir_t dir,int nbytes,qdf_dma_addr_t * phy_addr)163*5113495bSYour Name static inline uint32_t __qdf_mem_map_nbytes_single(qdf_device_t osdev,
164*5113495bSYour Name 						  void *buf, qdf_dma_dir_t dir,
165*5113495bSYour Name 						  int nbytes,
166*5113495bSYour Name 						  qdf_dma_addr_t *phy_addr)
167*5113495bSYour Name {
168*5113495bSYour Name 	/* assume that the OS only provides a single fragment */
169*5113495bSYour Name 	*phy_addr = dma_map_single(osdev->dev, buf, nbytes,
170*5113495bSYour Name 					__qdf_dma_dir_to_os(dir));
171*5113495bSYour Name 	return dma_mapping_error(osdev->dev, *phy_addr) ?
172*5113495bSYour Name 	QDF_STATUS_E_FAILURE : QDF_STATUS_SUCCESS;
173*5113495bSYour Name }
174*5113495bSYour Name 
175*5113495bSYour Name #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
__qdf_mem_dma_cache_sync(qdf_device_t osdev,qdf_dma_addr_t buf,qdf_dma_dir_t dir,int nbytes)176*5113495bSYour Name static inline void __qdf_mem_dma_cache_sync(qdf_device_t osdev,
177*5113495bSYour Name 					    qdf_dma_addr_t buf,
178*5113495bSYour Name 					    qdf_dma_dir_t dir,
179*5113495bSYour Name 					    int nbytes)
180*5113495bSYour Name {
181*5113495bSYour Name 	dma_cache_sync(osdev->dev, buf, nbytes, __qdf_dma_dir_to_os(dir));
182*5113495bSYour Name }
183*5113495bSYour Name #else
__qdf_mem_dma_cache_sync(qdf_device_t osdev,qdf_dma_addr_t buf,qdf_dma_dir_t dir,int nbytes)184*5113495bSYour Name static inline void __qdf_mem_dma_cache_sync(qdf_device_t osdev,
185*5113495bSYour Name 					    qdf_dma_addr_t buf,
186*5113495bSYour Name 					    qdf_dma_dir_t dir,
187*5113495bSYour Name 					    int nbytes)
188*5113495bSYour Name {
189*5113495bSYour Name 	dma_sync_single_for_cpu(osdev->dev, buf, nbytes,
190*5113495bSYour Name 				__qdf_dma_dir_to_os(dir));
191*5113495bSYour Name }
192*5113495bSYour Name #endif
193*5113495bSYour Name 
194*5113495bSYour Name /**
195*5113495bSYour Name  * __qdf_mem_unmap_nbytes_single() - un_map memory for DMA
196*5113495bSYour Name  *
197*5113495bSYour Name  * @osdev: pomter OS device context
198*5113495bSYour Name  * @phy_addr: physical address of memory to be dma unmapped
199*5113495bSYour Name  * @dir: DMA unmap direction
200*5113495bSYour Name  * @nbytes: number of bytes to be unmapped.
201*5113495bSYour Name  *
202*5113495bSYour Name  * Return - none
203*5113495bSYour Name  */
__qdf_mem_unmap_nbytes_single(qdf_device_t osdev,qdf_dma_addr_t phy_addr,qdf_dma_dir_t dir,int nbytes)204*5113495bSYour Name static inline void __qdf_mem_unmap_nbytes_single(qdf_device_t osdev,
205*5113495bSYour Name 						 qdf_dma_addr_t phy_addr,
206*5113495bSYour Name 						 qdf_dma_dir_t dir, int nbytes)
207*5113495bSYour Name {
208*5113495bSYour Name 	dma_unmap_single(osdev->dev, phy_addr, nbytes,
209*5113495bSYour Name 				__qdf_dma_dir_to_os(dir));
210*5113495bSYour Name }
211*5113495bSYour Name #ifdef __KERNEL__
212*5113495bSYour Name 
213*5113495bSYour Name typedef __qdf_mempool_ctxt_t *__qdf_mempool_t;
214*5113495bSYour Name 
215*5113495bSYour Name /**
216*5113495bSYour Name  * __qdf_mempool_init() - Create and initialize memory pool
217*5113495bSYour Name  * @osdev: platform device object
218*5113495bSYour Name  * @pool_addr: address of the pool created
219*5113495bSYour Name  * @elem_cnt: no. of elements in pool
220*5113495bSYour Name  * @elem_size: size of each pool element in bytes
221*5113495bSYour Name  * @flags: flags
222*5113495bSYour Name  *
223*5113495bSYour Name  * Return: Handle to memory pool or NULL if allocation failed
224*5113495bSYour Name  */
225*5113495bSYour Name int __qdf_mempool_init(qdf_device_t osdev, __qdf_mempool_t *pool_addr,
226*5113495bSYour Name 		       int elem_cnt, size_t elem_size, u_int32_t flags);
227*5113495bSYour Name 
228*5113495bSYour Name /**
229*5113495bSYour Name  * __qdf_mempool_destroy() - Destroy memory pool
230*5113495bSYour Name  * @osdev: platform device object
231*5113495bSYour Name  * @pool: memory pool
232*5113495bSYour Name  *
233*5113495bSYour Name  * Returns: none
234*5113495bSYour Name  */
235*5113495bSYour Name void __qdf_mempool_destroy(qdf_device_t osdev, __qdf_mempool_t pool);
236*5113495bSYour Name 
237*5113495bSYour Name /**
238*5113495bSYour Name  * __qdf_mempool_alloc() - Allocate an element memory pool
239*5113495bSYour Name  * @osdev: platform device object
240*5113495bSYour Name  * @pool: to memory pool
241*5113495bSYour Name  *
242*5113495bSYour Name  * Return: Pointer to the allocated element or NULL if the pool is empty
243*5113495bSYour Name  */
244*5113495bSYour Name void *__qdf_mempool_alloc(qdf_device_t osdev, __qdf_mempool_t pool);
245*5113495bSYour Name 
246*5113495bSYour Name /**
247*5113495bSYour Name  * __qdf_mempool_free() - Free a memory pool element
248*5113495bSYour Name  * @osdev: Platform device object
249*5113495bSYour Name  * @pool: Handle to memory pool
250*5113495bSYour Name  * @buf: Element to be freed
251*5113495bSYour Name  *
252*5113495bSYour Name  * Return: none
253*5113495bSYour Name  */
254*5113495bSYour Name void __qdf_mempool_free(qdf_device_t osdev, __qdf_mempool_t pool, void *buf);
255*5113495bSYour Name 
256*5113495bSYour Name /**
257*5113495bSYour Name  * __qdf_kmem_cache_create() - OS abstraction for cache creation
258*5113495bSYour Name  * @cache_name: Cache name
259*5113495bSYour Name  * @size: Size of the object to be created
260*5113495bSYour Name  *
261*5113495bSYour Name  * Return: Cache address on successful creation, else NULL
262*5113495bSYour Name  */
263*5113495bSYour Name qdf_kmem_cache_t __qdf_kmem_cache_create(const char *cache_name,
264*5113495bSYour Name 					 qdf_size_t size);
265*5113495bSYour Name 
266*5113495bSYour Name /**
267*5113495bSYour Name  * __qdf_kmem_cache_destroy() - OS abstraction for cache destruction
268*5113495bSYour Name  * @cache: Cache pointer
269*5113495bSYour Name  *
270*5113495bSYour Name  * Return: void
271*5113495bSYour Name  */
272*5113495bSYour Name void __qdf_kmem_cache_destroy(qdf_kmem_cache_t cache);
273*5113495bSYour Name 
274*5113495bSYour Name /**
275*5113495bSYour Name  * __qdf_kmem_cache_alloc() - Function to allocation object from a cache
276*5113495bSYour Name  * @cache: Cache address
277*5113495bSYour Name  *
278*5113495bSYour Name  * Return: Object from cache
279*5113495bSYour Name  *
280*5113495bSYour Name  */
281*5113495bSYour Name void *__qdf_kmem_cache_alloc(qdf_kmem_cache_t cache);
282*5113495bSYour Name 
283*5113495bSYour Name /**
284*5113495bSYour Name  * __qdf_kmem_cache_free() - Function to free cache object
285*5113495bSYour Name  * @cache: Cache address
286*5113495bSYour Name  * @node: Object to be returned to cache
287*5113495bSYour Name  *
288*5113495bSYour Name  * Return: void
289*5113495bSYour Name  */
290*5113495bSYour Name void __qdf_kmem_cache_free(qdf_kmem_cache_t cache, void *node);
291*5113495bSYour Name 
292*5113495bSYour Name #define QDF_RET_IP ((void *)_RET_IP_)
293*5113495bSYour Name 
294*5113495bSYour Name #define __qdf_mempool_elem_size(_pool) ((_pool)->elem_size)
295*5113495bSYour Name #endif
296*5113495bSYour Name 
297*5113495bSYour Name /**
298*5113495bSYour Name  * __qdf_ioremap() - map bus memory into cpu space
299*5113495bSYour Name  * @HOST_CE_ADDRESS: bus address of the memory
300*5113495bSYour Name  * @HOST_CE_SIZE: memory size to map
301*5113495bSYour Name  */
302*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0))
303*5113495bSYour Name #define __qdf_ioremap(HOST_CE_ADDRESS, HOST_CE_SIZE) \
304*5113495bSYour Name 		   ioremap(HOST_CE_ADDRESS, HOST_CE_SIZE)
305*5113495bSYour Name #else
306*5113495bSYour Name #define __qdf_ioremap(HOST_CE_ADDRESS, HOST_CE_SIZE) \
307*5113495bSYour Name 		   ioremap_nocache(HOST_CE_ADDRESS, HOST_CE_SIZE)
308*5113495bSYour Name #endif
309*5113495bSYour Name 
310*5113495bSYour Name /**
311*5113495bSYour Name  * __qdf_mem_smmu_s1_enabled() - Return SMMU stage 1 translation enable status
312*5113495bSYour Name  * @osdev: parent device instance
313*5113495bSYour Name  *
314*5113495bSYour Name  * Return: true if smmu s1 enabled, false if smmu s1 is bypassed
315*5113495bSYour Name  */
__qdf_mem_smmu_s1_enabled(qdf_device_t osdev)316*5113495bSYour Name static inline bool __qdf_mem_smmu_s1_enabled(qdf_device_t osdev)
317*5113495bSYour Name {
318*5113495bSYour Name 	return osdev->smmu_s1_enabled;
319*5113495bSYour Name }
320*5113495bSYour Name 
321*5113495bSYour Name #if IS_ENABLED(CONFIG_ARM_SMMU) && defined(ENABLE_SMMU_S1_TRANSLATION)
322*5113495bSYour Name /**
323*5113495bSYour Name  * typedef __qdf_iommu_domain_t - abstraction for struct iommu_domain
324*5113495bSYour Name  */
325*5113495bSYour Name typedef struct iommu_domain __qdf_iommu_domain_t;
326*5113495bSYour Name 
327*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 13, 0))
328*5113495bSYour Name #if IS_ENABLED(CONFIG_QCOM_IOMMU_UTIL)
329*5113495bSYour Name /**
330*5113495bSYour Name  * __qdf_iommu_attr_to_os() - Convert qdf iommu attribute to OS mapping
331*5113495bSYour Name  *			      configurations bitmap
332*5113495bSYour Name  * @attr: QDF iommu attribute
333*5113495bSYour Name  *
334*5113495bSYour Name  * Return: IOMMU mapping configuration bitmaps
335*5113495bSYour Name  */
__qdf_iommu_attr_to_os(enum qdf_iommu_attr attr)336*5113495bSYour Name static inline int __qdf_iommu_attr_to_os(enum qdf_iommu_attr attr)
337*5113495bSYour Name {
338*5113495bSYour Name 	switch (attr) {
339*5113495bSYour Name 	case QDF_DOMAIN_ATTR_S1_BYPASS:
340*5113495bSYour Name 		return QCOM_IOMMU_MAPPING_CONF_S1_BYPASS;
341*5113495bSYour Name 	case QDF_DOMAIN_ATTR_ATOMIC:
342*5113495bSYour Name 		return QCOM_IOMMU_MAPPING_CONF_ATOMIC;
343*5113495bSYour Name 	case QDF_DOMAIN_ATTR_FAST:
344*5113495bSYour Name 		return QCOM_IOMMU_MAPPING_CONF_FAST;
345*5113495bSYour Name 	default:
346*5113495bSYour Name 		return -EINVAL;
347*5113495bSYour Name 	}
348*5113495bSYour Name }
349*5113495bSYour Name 
350*5113495bSYour Name /**
351*5113495bSYour Name  * __qdf_iommu_domain_get_attr() - API to get iommu domain attributes
352*5113495bSYour Name  *
353*5113495bSYour Name  * @domain: iommu domain
354*5113495bSYour Name  * @attr: iommu attribute
355*5113495bSYour Name  * @data: data pointer
356*5113495bSYour Name  *
357*5113495bSYour Name  * Return: 0 for success, and negative values otherwise
358*5113495bSYour Name  */
359*5113495bSYour Name static inline int
__qdf_iommu_domain_get_attr(__qdf_iommu_domain_t * domain,enum qdf_iommu_attr attr,void * data)360*5113495bSYour Name __qdf_iommu_domain_get_attr(__qdf_iommu_domain_t *domain,
361*5113495bSYour Name 			    enum qdf_iommu_attr attr, void *data)
362*5113495bSYour Name {
363*5113495bSYour Name 	int mapping_config;
364*5113495bSYour Name 	int mapping_bitmap;
365*5113495bSYour Name 	int *value;
366*5113495bSYour Name 
367*5113495bSYour Name 	mapping_bitmap = __qdf_iommu_attr_to_os(attr);
368*5113495bSYour Name 	if (mapping_bitmap < 0)
369*5113495bSYour Name 		return -EINVAL;
370*5113495bSYour Name 
371*5113495bSYour Name 	mapping_config = qcom_iommu_get_mappings_configuration(domain);
372*5113495bSYour Name 	if (mapping_config < 0)
373*5113495bSYour Name 		return -EINVAL;
374*5113495bSYour Name 
375*5113495bSYour Name 	value = data;
376*5113495bSYour Name 	*value = (mapping_config & mapping_bitmap) ? 1 : 0;
377*5113495bSYour Name 
378*5113495bSYour Name 	return 0;
379*5113495bSYour Name }
380*5113495bSYour Name #else /* !CONFIG_QCOM_IOMMU_UTIL */
381*5113495bSYour Name static inline int
__qdf_iommu_domain_get_attr(__qdf_iommu_domain_t * domain,enum qdf_iommu_attr attr,void * data)382*5113495bSYour Name __qdf_iommu_domain_get_attr(__qdf_iommu_domain_t *domain,
383*5113495bSYour Name 			    enum qdf_iommu_attr attr, void *data)
384*5113495bSYour Name {
385*5113495bSYour Name 	return -ENOTSUPP;
386*5113495bSYour Name }
387*5113495bSYour Name #endif /* CONFIG_QCOM_IOMMU_UTIL */
388*5113495bSYour Name #else
389*5113495bSYour Name /**
390*5113495bSYour Name  * __qdf_iommu_attr_to_os() - Convert qdf iommu attribute to OS specific enum
391*5113495bSYour Name  * @attr: QDF iommu attribute
392*5113495bSYour Name  *
393*5113495bSYour Name  * Return: enum iommu_attr
394*5113495bSYour Name  */
395*5113495bSYour Name static inline
__qdf_iommu_attr_to_os(enum qdf_iommu_attr attr)396*5113495bSYour Name enum iommu_attr __qdf_iommu_attr_to_os(enum qdf_iommu_attr attr)
397*5113495bSYour Name {
398*5113495bSYour Name 	switch (attr) {
399*5113495bSYour Name 	case QDF_DOMAIN_ATTR_GEOMETRY:
400*5113495bSYour Name 		return DOMAIN_ATTR_GEOMETRY;
401*5113495bSYour Name 	case QDF_DOMAIN_ATTR_PAGING:
402*5113495bSYour Name 		return DOMAIN_ATTR_PAGING;
403*5113495bSYour Name 	case QDF_DOMAIN_ATTR_WINDOWS:
404*5113495bSYour Name 		return DOMAIN_ATTR_WINDOWS;
405*5113495bSYour Name 	case QDF_DOMAIN_ATTR_FSL_PAMU_STASH:
406*5113495bSYour Name 		return DOMAIN_ATTR_FSL_PAMU_STASH;
407*5113495bSYour Name 	case QDF_DOMAIN_ATTR_FSL_PAMU_ENABLE:
408*5113495bSYour Name 		return DOMAIN_ATTR_FSL_PAMU_ENABLE;
409*5113495bSYour Name 	case QDF_DOMAIN_ATTR_FSL_PAMUV1:
410*5113495bSYour Name 		return DOMAIN_ATTR_FSL_PAMUV1;
411*5113495bSYour Name 	case QDF_DOMAIN_ATTR_NESTING:
412*5113495bSYour Name 		return DOMAIN_ATTR_NESTING;
413*5113495bSYour Name 	case QDF_DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE:
414*5113495bSYour Name 		return DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE;
415*5113495bSYour Name 	case QDF_DOMAIN_ATTR_CONTEXT_BANK:
416*5113495bSYour Name 		return DOMAIN_ATTR_CONTEXT_BANK;
417*5113495bSYour Name 	case QDF_DOMAIN_ATTR_NON_FATAL_FAULTS:
418*5113495bSYour Name 		return DOMAIN_ATTR_NON_FATAL_FAULTS;
419*5113495bSYour Name 	case QDF_DOMAIN_ATTR_S1_BYPASS:
420*5113495bSYour Name 		return DOMAIN_ATTR_S1_BYPASS;
421*5113495bSYour Name 	case QDF_DOMAIN_ATTR_ATOMIC:
422*5113495bSYour Name 		return DOMAIN_ATTR_ATOMIC;
423*5113495bSYour Name 	case QDF_DOMAIN_ATTR_SECURE_VMID:
424*5113495bSYour Name 		return DOMAIN_ATTR_SECURE_VMID;
425*5113495bSYour Name 	case QDF_DOMAIN_ATTR_FAST:
426*5113495bSYour Name 		return DOMAIN_ATTR_FAST;
427*5113495bSYour Name 	case QDF_DOMAIN_ATTR_PGTBL_INFO:
428*5113495bSYour Name 		return DOMAIN_ATTR_PGTBL_INFO;
429*5113495bSYour Name 	case QDF_DOMAIN_ATTR_USE_UPSTREAM_HINT:
430*5113495bSYour Name 		return DOMAIN_ATTR_USE_UPSTREAM_HINT;
431*5113495bSYour Name 	case QDF_DOMAIN_ATTR_EARLY_MAP:
432*5113495bSYour Name 		return DOMAIN_ATTR_EARLY_MAP;
433*5113495bSYour Name 	case QDF_DOMAIN_ATTR_PAGE_TABLE_IS_COHERENT:
434*5113495bSYour Name 		return DOMAIN_ATTR_PAGE_TABLE_IS_COHERENT;
435*5113495bSYour Name 	case QDF_DOMAIN_ATTR_PAGE_TABLE_FORCE_COHERENT:
436*5113495bSYour Name 		return DOMAIN_ATTR_PAGE_TABLE_FORCE_COHERENT;
437*5113495bSYour Name 	case QDF_DOMAIN_ATTR_USE_LLC_NWA:
438*5113495bSYour Name 		return DOMAIN_ATTR_USE_LLC_NWA;
439*5113495bSYour Name 	case QDF_DOMAIN_ATTR_SPLIT_TABLES:
440*5113495bSYour Name 		return DOMAIN_ATTR_SPLIT_TABLES;
441*5113495bSYour Name 	case QDF_DOMAIN_ATTR_FAULT_MODEL_NO_CFRE:
442*5113495bSYour Name 		return DOMAIN_ATTR_FAULT_MODEL_NO_CFRE;
443*5113495bSYour Name 	case QDF_DOMAIN_ATTR_FAULT_MODEL_NO_STALL:
444*5113495bSYour Name 		return DOMAIN_ATTR_FAULT_MODEL_NO_STALL;
445*5113495bSYour Name 	case QDF_DOMAIN_ATTR_FAULT_MODEL_HUPCF:
446*5113495bSYour Name 		return DOMAIN_ATTR_FAULT_MODEL_HUPCF;
447*5113495bSYour Name 	default:
448*5113495bSYour Name 		return DOMAIN_ATTR_EXTENDED_MAX;
449*5113495bSYour Name 	}
450*5113495bSYour Name }
451*5113495bSYour Name 
452*5113495bSYour Name /**
453*5113495bSYour Name  * __qdf_iommu_domain_get_attr() - API to get iommu domain attributes
454*5113495bSYour Name  *
455*5113495bSYour Name  * @domain: iommu domain
456*5113495bSYour Name  * @attr: iommu attribute
457*5113495bSYour Name  * @data: data pointer
458*5113495bSYour Name  *
459*5113495bSYour Name  * Return: iommu domain attr
460*5113495bSYour Name  */
461*5113495bSYour Name static inline int
__qdf_iommu_domain_get_attr(__qdf_iommu_domain_t * domain,enum qdf_iommu_attr attr,void * data)462*5113495bSYour Name __qdf_iommu_domain_get_attr(__qdf_iommu_domain_t *domain,
463*5113495bSYour Name 			    enum qdf_iommu_attr attr, void *data)
464*5113495bSYour Name {
465*5113495bSYour Name 	return iommu_domain_get_attr(domain, __qdf_iommu_attr_to_os(attr),
466*5113495bSYour Name 				     data);
467*5113495bSYour Name }
468*5113495bSYour Name #endif
469*5113495bSYour Name 
470*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0))
471*5113495bSYour Name /**
472*5113495bSYour Name  * __qdf_dev_get_domain() - get iommu domain from osdev
473*5113495bSYour Name  * @osdev: parent device instance
474*5113495bSYour Name  *
475*5113495bSYour Name  * Return: iommu domain
476*5113495bSYour Name  */
477*5113495bSYour Name static inline struct iommu_domain *
__qdf_dev_get_domain(qdf_device_t osdev)478*5113495bSYour Name __qdf_dev_get_domain(qdf_device_t osdev)
479*5113495bSYour Name {
480*5113495bSYour Name 	return osdev->domain;
481*5113495bSYour Name }
482*5113495bSYour Name #else
483*5113495bSYour Name static inline struct iommu_domain *
__qdf_dev_get_domain(qdf_device_t osdev)484*5113495bSYour Name __qdf_dev_get_domain(qdf_device_t osdev)
485*5113495bSYour Name {
486*5113495bSYour Name 	if (osdev->iommu_mapping)
487*5113495bSYour Name 		return osdev->iommu_mapping->domain;
488*5113495bSYour Name 
489*5113495bSYour Name 	return NULL;
490*5113495bSYour Name }
491*5113495bSYour Name #endif
492*5113495bSYour Name 
493*5113495bSYour Name /**
494*5113495bSYour Name  * __qdf_mem_paddr_from_dmaaddr() - get actual physical address from dma_addr
495*5113495bSYour Name  * @osdev: parent device instance
496*5113495bSYour Name  * @dma_addr: dma_addr
497*5113495bSYour Name  *
498*5113495bSYour Name  * Get actual physical address from dma_addr based on SMMU enablement status.
499*5113495bSYour Name  * IF SMMU Stage 1 translation is enabled, DMA APIs return IO virtual address
500*5113495bSYour Name  * (IOVA) otherwise returns physical address. So get SMMU physical address
501*5113495bSYour Name  * mapping from IOVA.
502*5113495bSYour Name  *
503*5113495bSYour Name  * Return: dmaable physical address
504*5113495bSYour Name  */
505*5113495bSYour Name static inline unsigned long
__qdf_mem_paddr_from_dmaaddr(qdf_device_t osdev,qdf_dma_addr_t dma_addr)506*5113495bSYour Name __qdf_mem_paddr_from_dmaaddr(qdf_device_t osdev,
507*5113495bSYour Name 			     qdf_dma_addr_t dma_addr)
508*5113495bSYour Name {
509*5113495bSYour Name 	struct iommu_domain *domain;
510*5113495bSYour Name 
511*5113495bSYour Name 	if (__qdf_mem_smmu_s1_enabled(osdev)) {
512*5113495bSYour Name 		domain = __qdf_dev_get_domain(osdev);
513*5113495bSYour Name 		if (domain)
514*5113495bSYour Name 			return iommu_iova_to_phys(domain, dma_addr);
515*5113495bSYour Name 	}
516*5113495bSYour Name 
517*5113495bSYour Name 	return dma_addr;
518*5113495bSYour Name }
519*5113495bSYour Name #else
520*5113495bSYour Name static inline unsigned long
__qdf_mem_paddr_from_dmaaddr(qdf_device_t osdev,qdf_dma_addr_t dma_addr)521*5113495bSYour Name __qdf_mem_paddr_from_dmaaddr(qdf_device_t osdev,
522*5113495bSYour Name 			     qdf_dma_addr_t dma_addr)
523*5113495bSYour Name {
524*5113495bSYour Name 	return dma_addr;
525*5113495bSYour Name }
526*5113495bSYour Name #endif
527*5113495bSYour Name 
528*5113495bSYour Name /**
529*5113495bSYour Name  * __qdf_os_mem_dma_get_sgtable() - Returns DMA memory scatter gather table
530*5113495bSYour Name  * @dev: device instance
531*5113495bSYour Name  * @sgt: scatter gather table pointer
532*5113495bSYour Name  * @cpu_addr: HLOS virtual address
533*5113495bSYour Name  * @dma_addr: dma/iova
534*5113495bSYour Name  * @size: allocated memory size
535*5113495bSYour Name  *
536*5113495bSYour Name  * Return: physical address
537*5113495bSYour Name  */
538*5113495bSYour Name static inline int
__qdf_os_mem_dma_get_sgtable(struct device * dev,void * sgt,void * cpu_addr,qdf_dma_addr_t dma_addr,size_t size)539*5113495bSYour Name __qdf_os_mem_dma_get_sgtable(struct device *dev, void *sgt, void *cpu_addr,
540*5113495bSYour Name 			     qdf_dma_addr_t dma_addr, size_t size)
541*5113495bSYour Name {
542*5113495bSYour Name 	return dma_get_sgtable(dev, (struct sg_table *)sgt, cpu_addr, dma_addr,
543*5113495bSYour Name 				size);
544*5113495bSYour Name }
545*5113495bSYour Name 
546*5113495bSYour Name /**
547*5113495bSYour Name  * __qdf_os_mem_free_sgtable() - Free a previously allocated sg table
548*5113495bSYour Name  * @sgt: the mapped sg table header
549*5113495bSYour Name  *
550*5113495bSYour Name  * Return: None
551*5113495bSYour Name  */
552*5113495bSYour Name static inline void
__qdf_os_mem_free_sgtable(struct sg_table * sgt)553*5113495bSYour Name __qdf_os_mem_free_sgtable(struct sg_table *sgt)
554*5113495bSYour Name {
555*5113495bSYour Name 	sg_free_table(sgt);
556*5113495bSYour Name }
557*5113495bSYour Name 
558*5113495bSYour Name /**
559*5113495bSYour Name  * __qdf_dma_get_sgtable_dma_addr()-Assigns DMA address to scatterlist elements
560*5113495bSYour Name  * @sgt: scatter gather table pointer
561*5113495bSYour Name  *
562*5113495bSYour Name  * Return: None
563*5113495bSYour Name  */
564*5113495bSYour Name static inline void
__qdf_dma_get_sgtable_dma_addr(struct sg_table * sgt)565*5113495bSYour Name __qdf_dma_get_sgtable_dma_addr(struct sg_table *sgt)
566*5113495bSYour Name {
567*5113495bSYour Name 	struct scatterlist *sg;
568*5113495bSYour Name 	int i;
569*5113495bSYour Name 
570*5113495bSYour Name 	for_each_sg(sgt->sgl, sg, sgt->nents, i) {
571*5113495bSYour Name 		if (!sg)
572*5113495bSYour Name 			break;
573*5113495bSYour Name 
574*5113495bSYour Name 		sg->dma_address = sg_phys(sg);
575*5113495bSYour Name 	}
576*5113495bSYour Name }
577*5113495bSYour Name 
578*5113495bSYour Name /**
579*5113495bSYour Name  * __qdf_mem_get_dma_addr() - Return dma addr based on SMMU translation status
580*5113495bSYour Name  * @osdev: parent device instance
581*5113495bSYour Name  * @mem_info: Pointer to allocated memory information
582*5113495bSYour Name  *
583*5113495bSYour Name  * Based on smmu stage 1 translation enablement status, return corresponding dma
584*5113495bSYour Name  * address from qdf_mem_info_t. If stage 1 translation enabled, return
585*5113495bSYour Name  * IO virtual address otherwise return physical address.
586*5113495bSYour Name  *
587*5113495bSYour Name  * Return: dma address
588*5113495bSYour Name  */
__qdf_mem_get_dma_addr(qdf_device_t osdev,qdf_mem_info_t * mem_info)589*5113495bSYour Name static inline qdf_dma_addr_t __qdf_mem_get_dma_addr(qdf_device_t osdev,
590*5113495bSYour Name 						    qdf_mem_info_t *mem_info)
591*5113495bSYour Name {
592*5113495bSYour Name 	if (__qdf_mem_smmu_s1_enabled(osdev))
593*5113495bSYour Name 		return (qdf_dma_addr_t)mem_info->iova;
594*5113495bSYour Name 	else
595*5113495bSYour Name 		return (qdf_dma_addr_t)mem_info->pa;
596*5113495bSYour Name }
597*5113495bSYour Name 
598*5113495bSYour Name /**
599*5113495bSYour Name  * __qdf_mem_get_dma_addr_ptr() - Return DMA address storage pointer
600*5113495bSYour Name  * @osdev: parent device instance
601*5113495bSYour Name  * @mem_info: Pointer to allocated memory information
602*5113495bSYour Name  *
603*5113495bSYour Name  * Based on smmu stage 1 translation enablement status, return corresponding
604*5113495bSYour Name  * dma address pointer from qdf_mem_info_t structure. If stage 1 translation
605*5113495bSYour Name  * enabled, return pointer to IO virtual address otherwise return pointer to
606*5113495bSYour Name  * physical address
607*5113495bSYour Name  *
608*5113495bSYour Name  * Return: dma address storage pointer
609*5113495bSYour Name  */
610*5113495bSYour Name static inline qdf_dma_addr_t *
__qdf_mem_get_dma_addr_ptr(qdf_device_t osdev,qdf_mem_info_t * mem_info)611*5113495bSYour Name __qdf_mem_get_dma_addr_ptr(qdf_device_t osdev,
612*5113495bSYour Name 			   qdf_mem_info_t *mem_info)
613*5113495bSYour Name {
614*5113495bSYour Name 	if (__qdf_mem_smmu_s1_enabled(osdev))
615*5113495bSYour Name 		return (qdf_dma_addr_t *)(&mem_info->iova);
616*5113495bSYour Name 	else
617*5113495bSYour Name 		return (qdf_dma_addr_t *)(&mem_info->pa);
618*5113495bSYour Name }
619*5113495bSYour Name 
620*5113495bSYour Name /**
621*5113495bSYour Name  * __qdf_update_mem_map_table() - Update DMA memory map info
622*5113495bSYour Name  * @osdev: Parent device instance
623*5113495bSYour Name  * @mem_info: Pointer to shared memory information
624*5113495bSYour Name  * @dma_addr: dma address
625*5113495bSYour Name  * @mem_size: memory size allocated
626*5113495bSYour Name  *
627*5113495bSYour Name  * Store DMA shared memory information
628*5113495bSYour Name  *
629*5113495bSYour Name  * Return: none
630*5113495bSYour Name  */
__qdf_update_mem_map_table(qdf_device_t osdev,qdf_mem_info_t * mem_info,qdf_dma_addr_t dma_addr,uint32_t mem_size)631*5113495bSYour Name static inline void __qdf_update_mem_map_table(qdf_device_t osdev,
632*5113495bSYour Name 					      qdf_mem_info_t *mem_info,
633*5113495bSYour Name 					      qdf_dma_addr_t dma_addr,
634*5113495bSYour Name 					      uint32_t mem_size)
635*5113495bSYour Name {
636*5113495bSYour Name 	mem_info->pa = __qdf_mem_paddr_from_dmaaddr(osdev, dma_addr);
637*5113495bSYour Name 	mem_info->iova = dma_addr;
638*5113495bSYour Name 	mem_info->size = mem_size;
639*5113495bSYour Name }
640*5113495bSYour Name 
641*5113495bSYour Name /**
642*5113495bSYour Name  * __qdf_mem_get_dma_size() - Return DMA memory size
643*5113495bSYour Name  * @osdev: parent device instance
644*5113495bSYour Name  * @mem_info: Pointer to allocated memory information
645*5113495bSYour Name  *
646*5113495bSYour Name  * Return: DMA memory size
647*5113495bSYour Name  */
648*5113495bSYour Name static inline uint32_t
__qdf_mem_get_dma_size(qdf_device_t osdev,qdf_mem_info_t * mem_info)649*5113495bSYour Name __qdf_mem_get_dma_size(qdf_device_t osdev,
650*5113495bSYour Name 		       qdf_mem_info_t *mem_info)
651*5113495bSYour Name {
652*5113495bSYour Name 	return mem_info->size;
653*5113495bSYour Name }
654*5113495bSYour Name 
655*5113495bSYour Name /**
656*5113495bSYour Name  * __qdf_mem_set_dma_size() - Set DMA memory size
657*5113495bSYour Name  * @osdev: parent device instance
658*5113495bSYour Name  * @mem_info: Pointer to allocated memory information
659*5113495bSYour Name  * @mem_size: memory size allocated
660*5113495bSYour Name  *
661*5113495bSYour Name  * Return: none
662*5113495bSYour Name  */
663*5113495bSYour Name static inline void
__qdf_mem_set_dma_size(qdf_device_t osdev,qdf_mem_info_t * mem_info,uint32_t mem_size)664*5113495bSYour Name __qdf_mem_set_dma_size(qdf_device_t osdev,
665*5113495bSYour Name 		       qdf_mem_info_t *mem_info,
666*5113495bSYour Name 		       uint32_t mem_size)
667*5113495bSYour Name {
668*5113495bSYour Name 	mem_info->size = mem_size;
669*5113495bSYour Name }
670*5113495bSYour Name 
671*5113495bSYour Name /**
672*5113495bSYour Name  * __qdf_mem_get_dma_pa() - Return DMA physical address
673*5113495bSYour Name  * @osdev: parent device instance
674*5113495bSYour Name  * @mem_info: Pointer to allocated memory information
675*5113495bSYour Name  *
676*5113495bSYour Name  * Return: DMA physical address
677*5113495bSYour Name  */
678*5113495bSYour Name static inline qdf_dma_addr_t
__qdf_mem_get_dma_pa(qdf_device_t osdev,qdf_mem_info_t * mem_info)679*5113495bSYour Name __qdf_mem_get_dma_pa(qdf_device_t osdev,
680*5113495bSYour Name 		     qdf_mem_info_t *mem_info)
681*5113495bSYour Name {
682*5113495bSYour Name 	return mem_info->pa;
683*5113495bSYour Name }
684*5113495bSYour Name 
685*5113495bSYour Name /**
686*5113495bSYour Name  * __qdf_mem_set_dma_pa() - Set DMA physical address
687*5113495bSYour Name  * @osdev: parent device instance
688*5113495bSYour Name  * @mem_info: Pointer to allocated memory information
689*5113495bSYour Name  * @dma_pa: DMA phsical address
690*5113495bSYour Name  *
691*5113495bSYour Name  * Return: none
692*5113495bSYour Name  */
693*5113495bSYour Name static inline void
__qdf_mem_set_dma_pa(qdf_device_t osdev,qdf_mem_info_t * mem_info,qdf_dma_addr_t dma_pa)694*5113495bSYour Name __qdf_mem_set_dma_pa(qdf_device_t osdev,
695*5113495bSYour Name 		     qdf_mem_info_t *mem_info,
696*5113495bSYour Name 		     qdf_dma_addr_t dma_pa)
697*5113495bSYour Name {
698*5113495bSYour Name 	mem_info->pa = dma_pa;
699*5113495bSYour Name }
700*5113495bSYour Name 
701*5113495bSYour Name 
702*5113495bSYour Name /**
703*5113495bSYour Name  * __qdf_mem_alloc_consistent() - allocates consistent qdf memory
704*5113495bSYour Name  * @osdev: OS device handle
705*5113495bSYour Name  * @dev: Pointer to device handle
706*5113495bSYour Name  * @size: Size to be allocated
707*5113495bSYour Name  * @paddr: Physical address
708*5113495bSYour Name  * @func: Function name of the call site
709*5113495bSYour Name  * @line: line numbe rof the call site
710*5113495bSYour Name  *
711*5113495bSYour Name  * Return: pointer of allocated memory or null if memory alloc fails
712*5113495bSYour Name  */
713*5113495bSYour Name void *__qdf_mem_alloc_consistent(qdf_device_t osdev, void *dev,
714*5113495bSYour Name 				 qdf_size_t size, qdf_dma_addr_t *paddr,
715*5113495bSYour Name 				 const char *func, uint32_t line);
716*5113495bSYour Name 
717*5113495bSYour Name /**
718*5113495bSYour Name  * __qdf_mem_malloc() - allocates QDF memory
719*5113495bSYour Name  * @size: Number of bytes of memory to allocate.
720*5113495bSYour Name  *
721*5113495bSYour Name  * @func: Function name of the call site
722*5113495bSYour Name  * @line: line numbe rof the call site
723*5113495bSYour Name  *
724*5113495bSYour Name  * This function will dynamicallly allocate the specified number of bytes of
725*5113495bSYour Name  * memory.
726*5113495bSYour Name  *
727*5113495bSYour Name  * Return:
728*5113495bSYour Name  * Upon successful allocate, returns a non-NULL pointer to the allocated
729*5113495bSYour Name  * memory.  If this function is unable to allocate the amount of memory
730*5113495bSYour Name  * specified (for any reason) it returns NULL.
731*5113495bSYour Name  */
732*5113495bSYour Name void *__qdf_mem_malloc(qdf_size_t size, const char *func, uint32_t line);
733*5113495bSYour Name 
734*5113495bSYour Name /**
735*5113495bSYour Name  * __qdf_mem_free() - free QDF memory
736*5113495bSYour Name  * @ptr: Pointer to the starting address of the memory to be freed.
737*5113495bSYour Name  *
738*5113495bSYour Name  * This function will free the memory pointed to by 'ptr'.
739*5113495bSYour Name  * Return: None
740*5113495bSYour Name  */
741*5113495bSYour Name void __qdf_mem_free(void *ptr);
742*5113495bSYour Name 
743*5113495bSYour Name /**
744*5113495bSYour Name  * __qdf_mem_valloc() - QDF virtual memory allocation API
745*5113495bSYour Name  * @size: Number of bytes of virtual memory to allocate.
746*5113495bSYour Name  * @func: Caller function name
747*5113495bSYour Name  * @line: Line number
748*5113495bSYour Name  *
749*5113495bSYour Name  * Return: A valid memory location on success, or NULL on failure
750*5113495bSYour Name  */
751*5113495bSYour Name void *__qdf_mem_valloc(size_t size, const char *func, uint32_t line);
752*5113495bSYour Name 
753*5113495bSYour Name /**
754*5113495bSYour Name  * __qdf_mem_vfree() - QDF API to free virtual memory
755*5113495bSYour Name  * @ptr: Pointer to the virtual memory to free
756*5113495bSYour Name  *
757*5113495bSYour Name  * Return: None
758*5113495bSYour Name  */
759*5113495bSYour Name void __qdf_mem_vfree(void *ptr);
760*5113495bSYour Name 
761*5113495bSYour Name /**
762*5113495bSYour Name  * __qdf_mem_virt_to_phys() - Convert virtual address to physical
763*5113495bSYour Name  * @vaddr: virtual address
764*5113495bSYour Name  *
765*5113495bSYour Name  * Return: physical address
766*5113495bSYour Name  */
767*5113495bSYour Name #define __qdf_mem_virt_to_phys(vaddr) virt_to_phys(vaddr)
768*5113495bSYour Name 
769*5113495bSYour Name #ifdef QCA_WIFI_MODULE_PARAMS_FROM_INI
770*5113495bSYour Name /**
771*5113495bSYour Name  * __qdf_untracked_mem_malloc() - allocates non-QDF memory
772*5113495bSYour Name  * @size: Number of bytes of memory to allocate.
773*5113495bSYour Name  * @func: Function name of the call site
774*5113495bSYour Name  * @line: line number of the call site
775*5113495bSYour Name  *
776*5113495bSYour Name  * This function will dynamically allocate the specified number of bytes of
777*5113495bSYour Name  * memory. Memory allocated is not tracked by qdf memory debug framework.
778*5113495bSYour Name  *
779*5113495bSYour Name  * Return:
780*5113495bSYour Name  * Upon successful allocation, returns a non-NULL pointer to the allocated
781*5113495bSYour Name  * memory.  If this function is unable to allocate the amount of memory
782*5113495bSYour Name  * specified (for any reason) it returns NULL.
783*5113495bSYour Name  */
784*5113495bSYour Name void *__qdf_untracked_mem_malloc(qdf_size_t size, const char *func,
785*5113495bSYour Name 				 uint32_t line);
786*5113495bSYour Name 
787*5113495bSYour Name /**
788*5113495bSYour Name  * __qdf_untracked_mem_free() - free non-QDF memory
789*5113495bSYour Name  * @ptr: Pointer to the starting address of the memory to be freed.
790*5113495bSYour Name  *
791*5113495bSYour Name  * This function will free the memory pointed to by 'ptr'.
792*5113495bSYour Name  * Return: None
793*5113495bSYour Name  */
794*5113495bSYour Name 
795*5113495bSYour Name void __qdf_untracked_mem_free(void *ptr);
796*5113495bSYour Name #endif
797*5113495bSYour Name 
798*5113495bSYour Name /**
799*5113495bSYour Name  * __qdf_mem_free_consistent() - free consistent qdf memory
800*5113495bSYour Name  * @osdev: OS device handle
801*5113495bSYour Name  * @dev: Pointer to device handle
802*5113495bSYour Name  * @size: Size to be allocated
803*5113495bSYour Name  * @vaddr: virtual address
804*5113495bSYour Name  * @paddr: Physical address
805*5113495bSYour Name  * @memctx: Pointer to DMA context
806*5113495bSYour Name  *
807*5113495bSYour Name  * Return: none
808*5113495bSYour Name  */
809*5113495bSYour Name void __qdf_mem_free_consistent(qdf_device_t osdev, void *dev,
810*5113495bSYour Name 			       qdf_size_t size, void *vaddr,
811*5113495bSYour Name 			       qdf_dma_addr_t paddr, qdf_dma_context_t memctx);
812*5113495bSYour Name 
813*5113495bSYour Name #endif /* __I_QDF_MEM_H */
814