Vision Apps User Guide
app_mem.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2017 Texas Instruments Incorporated
4  *
5  * All rights reserved not granted herein.
6  *
7  * Limited License.
8  *
9  * Texas Instruments Incorporated grants a world-wide, royalty-free, non-exclusive
10  * license under copyrights and patents it now or hereafter owns or controls to make,
11  * have made, use, import, offer to sell and sell ("Utilize") this software subject to the
12  * terms herein. With respect to the foregoing patent license, such license is granted
13  * solely to the extent that any such patent is necessary to Utilize the software alone.
14  * The patent license shall not apply to any combinations which include this software,
15  * other than combinations with devices manufactured by or for TI ("TI Devices").
16  * No hardware patent is licensed hereunder.
17  *
18  * Redistributions must preserve existing copyright notices and reproduce this license
19  * (including the above copyright notice and the disclaimer and (if applicable) source
20  * code license limitations below) in the documentation and/or other materials provided
21  * with the distribution
22  *
23  * Redistribution and use in binary form, without modification, are permitted provided
24  * that the following conditions are met:
25  *
26  * * No reverse engineering, decompilation, or disassembly of this software is
27  * permitted with respect to any software provided in binary form.
28  *
29  * * any redistribution and use are licensed by TI for use only with TI Devices.
30  *
31  * * Nothing shall obligate TI to provide you with source code for the software
32  * licensed and provided to you in object code.
33  *
34  * If software source code is provided to you, modification and redistribution of the
35  * source code are permitted provided that the following conditions are met:
36  *
37  * * any redistribution and use of the source code, including any resulting derivative
38  * works, are licensed by TI for use only with TI Devices.
39  *
40  * * any redistribution and use of any object code compiled from the source code
41  * and any resulting derivative works, are licensed by TI for use only with TI Devices.
42  *
43  * Neither the name of Texas Instruments Incorporated nor the names of its suppliers
44  *
45  * may be used to endorse or promote products derived from this software without
46  * specific prior written permission.
47  *
48  * DISCLAIMER.
49  *
50  * THIS SOFTWARE IS PROVIDED BY TI AND TI'S LICENSORS "AS IS" AND ANY EXPRESS
51  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
52  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
53  * IN NO EVENT SHALL TI AND TI'S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT,
54  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
55  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
56  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
57  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
58  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
59  * OF THE POSSIBILITY OF SUCH DAMAGE.
60  *
61  */
62 
63 #ifndef APP_MEM_H_
64 #define APP_MEM_H_
65 
66 #include <stdint.h>
67 
68 #if defined(FREERTOS) || defined(SAFERTOS)
69 #if defined(SOC_AM62A) || defined(SOC_J722S)
70 #if !defined(MCU_PLUS_SDK)
71 #include <ti/drv/udma/dmautils/udma_standalone/udma.h>
72 #else
73 #include <drivers/dmautils/udma_standalone/udma.h>
74 #endif
75 #else
76 #include <ti/drv/udma/udma.h>
77 #endif
78 #endif
79 
80 #if defined(R5F) && (defined(SOC_J784S4) || defined(SOC_J721S2))
81 #include <ti/csl/csl_rat.h>
82 #endif
83 
84 #ifdef __cplusplus
85 extern "C" {
86 #endif
87 
99 #define APP_MEM_HEAP_NAME_MAX (16u)
100 
118 typedef uint64_t (*app_mem_shared_target_fxn)(const uint64_t sharedAddr);
119 
130 typedef uint64_t (*app_mem_target_shared_fxn)(const uint64_t targetAddr);
131 
133 #define APP_MEM_HEAP_DDR (0u)
134 
136 #define APP_MEM_HEAP_L3 (1u)
137 
139 #define APP_MEM_HEAP_L2 (2u)
140 
142 #define APP_MEM_HEAP_L1 (3u)
143 
145 #define APP_MEM_HEAP_DDR_SCRATCH (4u)
146 
148 #define APP_MEM_HEAP_DDR_NON_CACHE (5u)
149 
151 #define APP_MEM_HEAP_DDR_NON_CACHE_SCRATCH (6u)
152 
154 #define APP_MEM_HEAP_DDR_WT_CACHE (7u)
155 
157 #define APP_MEM_HEAP_MAX (8u)
158 
159 /* @} */
160 
176 #define APP_MEM_HEAP_FLAGS_TYPE_LINEAR_ALLOCATE (0x00000001u)
177 
180 #define APP_MEM_HEAP_FLAGS_IS_SHARED (0x00000004u)
181 
184 #define APP_MEM_HEAP_FLAGS_DO_CLEAR_ON_ALLOC (0x00000008u)
185 
186 /* @} */
187 
191 typedef struct {
192 
193  void *base;
195  uint32_t size;
196  uint32_t flags;
199 
203 typedef struct {
204 
206  #if defined(FREERTOS) || defined(SAFERTOS)
207  Udma_VirtToPhyFxn virtToPhyFxn;
208  app_mem_shared_target_fxn shared2TargetFxn;
209  app_mem_target_shared_fxn target2SharedFxn;
210  #endif
211  #if defined(R5F) && (defined(SOC_J784S4) || defined(SOC_J721S2))
212 
213  CSL_ratRegs *pRatRegs;
214  #endif
216 
217 
221 typedef struct {
222 
223  uint32_t heap_id;
224  char heap_name[APP_MEM_HEAP_NAME_MAX];
225  uint32_t heap_size;
226  uint32_t free_size;
229 
230 #if defined(R5F) && (defined(SOC_J784S4) || defined(SOC_J721S2))
231 
236 typedef struct {
238  uint64_t size;
240  uint64_t translatedAddress;
242  uint32_t baseAddress;
243 } app_mem_rat_prm_t;
244 #endif
245 
249 static inline void *APP_MEM_ALIGNPTR(void *val, uint32_t align)
250 {
251  return (void*)((((uintptr_t)val+align-1) / align) * align);
252 }
253 
257 static inline uint64_t APP_MEM_ALIGN64(uint64_t val, uint32_t align)
258 {
259  return (uint64_t)( (uint64_t)(val+align-1) / align) * align;
260 }
261 
265 static inline uint32_t APP_MEM_ALIGN32(uint32_t val, uint32_t align)
266 {
267  return (uint32_t)( (uint32_t)(val+align-1) / align) * align;
268 }
269 
270 #if defined(__C7120__) && defined(SOC_J784S4)
271 
275 void appMemC7xSetL2WBINV(uint64_t param);
276 
280 uint64_t appMemC7xGetL2WBINV(void);
281 
285 void appMemC7xCleaninvalidateL2Cache();
286 
290 void appMemC7xSetL1DWBINV(uint64_t param);
291 
295 uint64_t appMemC7xGetL1DWBINV(void);
296 
300 void appMemC7xCleaninvalidateL1DCache();
301 #endif
302 
309 void static inline appMemEnableL1DandL2CacheWb()
310 {
311 #if defined(__C7120__) && defined(SOC_J784S4)
312  appMemC7xCleaninvalidateL1DCache();
313  appMemC7xCleaninvalidateL2Cache();
314 #endif
315 }
316 
328 
336 int32_t appMemInit(app_mem_init_prm_t *prm);
337 
343 int32_t appMemDeInit();
344 
355 void *appMemAlloc(uint32_t heap_id, uint32_t size, uint32_t align);
356 
357 
366 int32_t appMemResetScratchHeap(uint32_t heap_id);
367 
378 int32_t appMemFree(uint32_t heap_id, void *ptr, uint32_t size);
379 
388 #if defined(x86_64) || defined(QNX)
389 uint64_t appMemGetDmaBufFd(void *virPtr, volatile uint32_t *dmaBufFdOffset);
390 #else
391 uint32_t appMemGetDmaBufFd(void *virPtr, volatile uint32_t *dmaBufFdOffset);
392 #endif
393 
404 #if defined(x86_64) || defined(QNX)
405 int32_t appMemTranslateDmaBufFd(uint64_t dmaBufFd, uint32_t size, uint64_t *virtPtr, uint64_t *phyPtr);
406 #else
407 int32_t appMemTranslateDmaBufFd(uint32_t dmaBufFd, uint32_t size, uint64_t *virtPtr, uint64_t *phyPtr);
408 #endif
409 
415 #if defined(x86_64) || defined(QNX)
416 void appMemCloseDmaBufFd(uint64_t dmaBufFd);
417 #else
418 void appMemCloseDmaBufFd(int32_t dmaBufFd);
419 #endif
420 
429 uint64_t appMemGetVirt2PhyBufPtr(uint64_t virtPtr, uint32_t heap_id);
430 
440 int32_t appMemStats(uint32_t heap_id, app_mem_stats_t *stats);
441 
449 void appMemCacheInv(void *ptr, uint32_t size);
450 
458 void appMemCacheWb(void *ptr, uint32_t size);
459 
467 void appMemCacheWbInv(void *ptr, uint32_t size);
468 
474 
483 uint64_t appMemShared2PhysPtr(uint64_t shared_ptr, uint32_t heap_id);
484 
492 uint64_t appMemShared2TargetPtr(uint64_t shared_ptr);
493 
494 
503 void *appMemMap(void *phys_addr, uint32_t size);
504 
513 int32_t appMemUnMap(void *virt_addr, uint32_t size);
514 
515 #if defined(R5F) && (defined(SOC_J784S4) || defined(SOC_J721S2))
516 
522 int32_t appMemAddrTranslate(app_mem_rat_prm_t *prm);
523 
529 int32_t appMemSetRatRegs(CSL_ratRegs *pRatRegs);
530 #endif
531 
532 /* @} */
533 
534 #ifdef __cplusplus
535 }
536 #endif
537 
538 #endif
539 
Heap initialization parameters.
Definition: app_mem.h:191
void * base
Definition: app_mem.h:193
void appMemCacheWbInv(void *ptr, uint32_t size)
Write back and invalidate a section of memory from cache.
int32_t appMemDeInit()
De-Init heaps for memory allocation.
int32_t appMemResetScratchHeap(uint32_t heap_id)
Reset scratch memory.
uint64_t appMemShared2PhysPtr(uint64_t shared_ptr, uint32_t heap_id)
Return the physical pointer from a shared pointer.
uint32_t heap_id
Definition: app_mem.h:223
Heap statistics and information.
Definition: app_mem.h:221
uint64_t appMemGetVirt2PhyBufPtr(uint64_t virtPtr, uint32_t heap_id)
Return physical ptr corresponds to a CMEM virtual ptr.
#define APP_MEM_HEAP_NAME_MAX
Max characters to use for heap name.
Definition: app_mem.h:99
static void * APP_MEM_ALIGNPTR(void *val, uint32_t align)
Align ptr value to &#39;align&#39; bytes.
Definition: app_mem.h:249
void appMemCloseDmaBufFd(int32_t dmaBufFd)
Close the dmaBufFd of a CMEM buffer pointer.
int32_t appMemStats(uint32_t heap_id, app_mem_stats_t *stats)
Return heap statistics and information.
static uint32_t APP_MEM_ALIGN32(uint32_t val, uint32_t align)
Align 32b value to &#39;align&#39; bytes.
Definition: app_mem.h:265
int32_t appMemTranslateDmaBufFd(uint32_t dmaBufFd, uint32_t size, uint64_t *virtPtr, uint64_t *phyPtr)
Translates a given &#39;dmaBufFd&#39; to virtual and physical addresses.
int32_t appMemInit(app_mem_init_prm_t *prm)
Init heaps for memory allocation.
uint64_t(* app_mem_target_shared_fxn)(const uint64_t targetAddr)
target pointer to shared pointer address translation callback function.
Definition: app_mem.h:130
uint32_t appMemGetDmaBufFd(void *virPtr, volatile uint32_t *dmaBufFdOffset)
Return dmaBufFd of a CMEM buffer pointer.
static void appMemEnableL1DandL2CacheWb()
Enable L1D and L2 Cache by performing a WB.
Definition: app_mem.h:309
void appMemCacheWb(void *ptr, uint32_t size)
Write back a section of memory from cache.
uint32_t heap_size
Definition: app_mem.h:225
void * appMemMap(void *phys_addr, uint32_t size)
Map the provided physical memory to a virtual address.
void appMemCacheInv(void *ptr, uint32_t size)
Invalidate a section of memory from cache.
Memory module initialization parameters.
Definition: app_mem.h:203
uint32_t flags
Definition: app_mem.h:196
uint64_t(* app_mem_shared_target_fxn)(const uint64_t sharedAddr)
Shared pointer to target pointer address translation callback function.
Definition: app_mem.h:118
void appMemPrintMemAllocInfo()
Print memory allocation from shared memory region.
uint64_t appMemShared2TargetPtr(uint64_t shared_ptr)
Return the physical pointer from a shared pointer.
uint32_t free_size
Definition: app_mem.h:226
#define APP_MEM_HEAP_MAX
Max heaps in system.
Definition: app_mem.h:157
int32_t appMemUnMap(void *virt_addr, uint32_t size)
Unmap the provided virtual memory.
int32_t appMemFree(uint32_t heap_id, void *ptr, uint32_t size)
Free memory that was previously allocated.
uint32_t size
Definition: app_mem.h:195
void appMemInitPrmSetDefault(app_mem_init_prm_t *prm)
Set defaults to app_mem_init_prm_t.
static uint64_t APP_MEM_ALIGN64(uint64_t val, uint32_t align)
Align 64b value to &#39;align&#39; bytes.
Definition: app_mem.h:257
void * appMemAlloc(uint32_t heap_id, uint32_t size, uint32_t align)
Alloc memory from specific heap.