Linux Utils Application Programming Interface (API)  linuxutils-m11
 All Data Structures Files Functions Variables Typedefs Groups Pages
cmem.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2007-2014 Texas Instruments Incorporated - https://www.ti.com
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  *
15  * * Neither the name of Texas Instruments Incorporated nor the names of
16  * its contributors may be used to endorse or promote products derived
17  * from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
29  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
226 #ifndef ti_CMEM_H
227 #define ti_CMEM_H
228 
229 #if defined (__cplusplus)
230 extern "C" {
231 #endif
232 
235 
236 #define CMEM_VERSION 0x04000000U
237 
238 #define MAX_POOLS 32
239 
240 /* magic "block" corresponding to CMA regions */
241 #define CMEM_CMABLOCKID -1
242 
243 /* ioctl cmd "flavors" */
244 #define CMEM_WB 0x00010000
245 #define CMEM_INV 0x00020000
246 #define CMEM_HEAP 0x00040000
247 #define CMEM_POOL 0x00000000
248 #define CMEM_CACHED 0x00080000
249 #define CMEM_NONCACHED 0x00000000
250 #define CMEM_PHYS 0x00100000
251 
252 #define CMEM_IOCMAGIC 0x0000fe00
253 
254 /* supported "base" ioctl cmds for the driver. */
255 #define CMEM_IOCALLOC 1
256 #define CMEM_IOCALLOCHEAP 2
257 #define CMEM_IOCFREE 3
258 #define CMEM_IOCGETPHYS 4
259 #define CMEM_IOCGETSIZE 5
260 #define CMEM_IOCGETPOOL 6
261 #define CMEM_IOCCACHE 7
262 #define CMEM_IOCGETVERSION 8
263 #define CMEM_IOCGETBLOCK 9
264 #define CMEM_IOCREGUSER 10
265 #define CMEM_IOCGETNUMBLOCKS 11
266 /*
267  * New ioctl cmds should use integers greater than the largest current cmd
268  * in order to not break backward compatibility.
269  */
270 
271 /* supported "flavors" to "base" ioctl cmds for the driver. */
272 #define CMEM_IOCCACHEWBINV CMEM_IOCCACHE | CMEM_WB | CMEM_INV
273 #define CMEM_IOCCACHEWB CMEM_IOCCACHE | CMEM_WB
274 #define CMEM_IOCCACHEINV CMEM_IOCCACHE | CMEM_INV
275 #define CMEM_IOCALLOCCACHED CMEM_IOCALLOC | CMEM_CACHED
276 #define CMEM_IOCALLOCHEAPCACHED CMEM_IOCALLOCHEAP | CMEM_CACHED
277 #define CMEM_IOCFREEHEAP CMEM_IOCFREE | CMEM_HEAP
278 #define CMEM_IOCFREEPHYS CMEM_IOCFREE | CMEM_PHYS
279 #define CMEM_IOCFREEHEAPPHYS CMEM_IOCFREE | CMEM_HEAP | CMEM_PHYS
280 
281 #define CMEM_IOCCMDMASK 0x000000ff
282 
287 typedef struct CMEM_AllocParams {
288  int type;
289  int flags;
290  size_t alignment;
294 
296 
297 typedef struct CMEM_BlockAttrs {
298  off_t phys_base;
299  unsigned long long size;
301 
306 union CMEM_AllocUnion {
307  struct {
308  size_t size;
309  size_t align;
310  int blockid;
311  } alloc_heap_inparams;
312  struct {
313  int poolid;
314  int blockid;
315  } alloc_pool_inparams;
316  struct {
317  int poolid;
318  int blockid;
319  } get_size_inparams;
320  struct {
321  unsigned long long size;
322  int blockid;
323  } get_pool_inparams;
324  struct {
325  unsigned long long physp;
326  unsigned long long size;
327  } alloc_pool_outparams;
328  struct {
329  unsigned long long physp;
330  unsigned long long size;
331  } get_block_outparams;
332  struct {
333  int poolid;
334  size_t size;
335  } free_outparams;
336  unsigned long long physp;
337  void *virtp;
338  size_t size;
339  int poolid;
340  int blockid;
341 };
342 
352 int CMEM_init(void);
353 
369 int CMEM_getPool(unsigned long long size);
370 
387 int CMEM_getPool2(int blockid, unsigned long long size);
388 
410 void *CMEM_allocPool(int poolid, CMEM_AllocParams *params);
411 
434 void *CMEM_allocPool2(int blockid, int poolid, CMEM_AllocParams *params);
435 
461 void *CMEM_alloc(size_t size, CMEM_AllocParams *params);
462 
490 void *CMEM_alloc2(int blockid, size_t size, CMEM_AllocParams *params);
491 
512 off_t CMEM_allocPoolPhys(int poolid, CMEM_AllocParams *params);
513 
536 off_t CMEM_allocPoolPhys2(int blockid, int poolid, CMEM_AllocParams *params);
537 
562 off_t CMEM_allocPhys(size_t size, CMEM_AllocParams *params);
563 
591 off_t CMEM_allocPhys2(int blockid, size_t size, CMEM_AllocParams *params);
592 
616 void *CMEM_registerAlloc(off_t physp);
617 
640 int CMEM_free(void *ptr, CMEM_AllocParams *params);
641 
663 int CMEM_freePhys(off_t physp, CMEM_AllocParams *params);
664 
687 int CMEM_unregister(void *ptr, CMEM_AllocParams *params);
688 
698 off_t CMEM_getPhys(void *ptr);
699 
713 int CMEM_cacheWb(void *ptr, size_t size);
714 
729 void *CMEM_map(off_t physp, size_t size);
730 
744 int CMEM_unmap(void *userp, size_t size);
745 
759 int CMEM_cacheInv(void *ptr, size_t size);
760 
775 int CMEM_cacheWbInv(void *ptr, size_t size);
776 
784 int CMEM_getVersion(void);
785 
800 int CMEM_getBlock(off_t *pphys_base, unsigned long long *psize);
801 
817 int CMEM_getBlockAttrs(int blockid, CMEM_BlockAttrs *pattrs);
818 
834 int CMEM_getNumBlocks(int *pnblocks);
835 
848 int CMEM_exit(void);
849 
852 #if defined (__cplusplus)
853 }
854 #endif
855 
856 #endif
struct CMEM_BlockAttrs CMEM_BlockAttrs
int CMEM_freePhys(off_t physp, CMEM_AllocParams *params)
Free an unmapped buffer previously allocated with CMEM_allocPhys()/CMEM_allocPoolPhys().
CMEM_AllocParams CMEM_DEFAULTPARAMS
int CMEM_unmap(void *userp, size_t size)
Unmap allocated memory.
int CMEM_cacheWb(void *ptr, size_t size)
Do a cache writeback of the block pointed to by ptr/size.
int CMEM_free(void *ptr, CMEM_AllocParams *params)
Free a buffer previously allocated with CMEM_alloc()/CMEM_allocPool().
int CMEM_getPool(unsigned long long size)
Find the pool that best fits a given buffer size and has a buffer available.
off_t CMEM_getPhys(void *ptr)
Get the physical address of a contiguous buffer.
off_t CMEM_allocPhys(size_t size, CMEM_AllocParams *params)
Allocate unmapped memory of a specified size.
size_t alignment
Definition: cmem.h:290
void * CMEM_alloc(size_t size, CMEM_AllocParams *params)
Allocate memory of a specified size.
Parameters for CMEM_alloc(), CMEM_alloc2(), CMEM_allocPool(), CMEM_allocPool2(), CMEM_free().
Definition: cmem.h:287
void * CMEM_allocPool2(int blockid, int poolid, CMEM_AllocParams *params)
Allocate memory from a specified pool in a specified memory block.
off_t phys_base
Definition: cmem.h:298
unsigned long long size
Definition: cmem.h:299
struct CMEM_AllocParams CMEM_AllocParams
Parameters for CMEM_alloc(), CMEM_alloc2(), CMEM_allocPool(), CMEM_allocPool2(), CMEM_free().
void * CMEM_registerAlloc(off_t physp)
Register shared usage of an already-allocated buffer.
int CMEM_exit(void)
Finalize the CMEM module.
int CMEM_getBlock(off_t *pphys_base, unsigned long long *psize)
Retrieve memory block bounds from CMEM driver.
int CMEM_getNumBlocks(int *pnblocks)
Retrieve number of blocks configured into CMEM driver.
off_t CMEM_allocPoolPhys2(int blockid, int poolid, CMEM_AllocParams *params)
Allocate unmapped memory from a specified pool in a specified memory block.
void * CMEM_allocPool(int poolid, CMEM_AllocParams *params)
Allocate memory from a specified pool.
int type
Definition: cmem.h:288
Definition: cmem.h:297
int CMEM_getPool2(int blockid, unsigned long long size)
Find the pool in memory block blockid that best fits a given buffer size and has a buffer available...
int CMEM_cacheWbInv(void *ptr, size_t size)
Do a cache writeback/invalidate of the block pointed to by ptr/size.
int CMEM_getBlockAttrs(int blockid, CMEM_BlockAttrs *pattrs)
Retrieve extended memory block attributes from CMEM driver.
void * CMEM_alloc2(int blockid, size_t size, CMEM_AllocParams *params)
Allocate memory of a specified size from a specified memory block.
off_t CMEM_allocPhys2(int blockid, size_t size, CMEM_AllocParams *params)
Allocate unmapped memory of a specified size from a specified memory block.
int CMEM_getVersion(void)
Retrieve version from CMEM driver.
void * CMEM_map(off_t physp, size_t size)
Map allocated memory.
int flags
Definition: cmem.h:289
int CMEM_unregister(void *ptr, CMEM_AllocParams *params)
Unregister use of a buffer previously registered with CMEM_registerAlloc().
int CMEM_init(void)
Initialize the CMEM module. Must be called before other API calls.
off_t CMEM_allocPoolPhys(int poolid, CMEM_AllocParams *params)
Allocate unmapped memory from a specified pool.
int CMEM_cacheInv(void *ptr, size_t size)
Do a cache invalidate of the block pointed to by ptr/size.
Copyright 2014, Texas Instruments Incorporated