add files to build ducati (m3) side firmware
[gstreamer-omap:ndecs-libdce.git] / ducati / platform / base_image / src / baseimage_ivahd_frwkconfig.c
1 /*\r
2  * Copyright (c) 2010, Texas Instruments Incorporated\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  *\r
9  * *  Redistributions of source code must retain the above copyright\r
10  *    notice, this list of conditions and the following disclaimer.\r
11  *\r
12  * *  Redistributions in binary form must reproduce the above copyright\r
13  *    notice, this list of conditions and the following disclaimer in the\r
14  *    documentation and/or other materials provided with the distribution.\r
15  *\r
16  * *  Neither the name of Texas Instruments Incorporated nor the names of\r
17  *    its contributors may be used to endorse or promote products derived\r
18  *    from this software without specific prior written permission.\r
19  *\r
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\r
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\r
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\r
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\r
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
31  */\r
32 \r
33 \r
34 #include <xdc/std.h>\r
35 #include <xdc/runtime/System.h>\r
36 #include <xdc/runtime/Memory.h>\r
37 #include <xdc/runtime/Error.h>\r
38 #include <ti/sdo/ce/Engine.h>\r
39 #include <ti/sdo/ce/CERuntime.h>\r
40 #include <ti/sdo/utils/trace/gt.h>\r
41 #include <xdc/cfg/global.h>\r
42 \r
43 #include "dce_priv.h"\r
44 \r
45 //#include <ti/omap/mem/shim/MemMgr.h>\r
46 #include <ti/omap/mem/SyslinkMemUtils.h>\r
47 \r
48 #include <ti/xdais/ires.h>\r
49 #include <ti/sdo/fc/ires/hdvicp/iresman_hdvicp.h>\r
50 #include <ti/sdo/fc/ires/hdvicp/ires_hdvicp2.h>\r
51 #include <ti/sdo/fc/ires/tiledmemory/iresman_tiledmemory.h>\r
52 \r
53 \r
54 #define MEMORYSTATS_DEBUG 1\r
55 \r
56 void *MEMUTILS_getPhysicalAddr(Ptr vaddr)\r
57 {\r
58         unsigned int paddr = SyslinkMemUtils_VirtToPhys(vaddr);\r
59         DEBUG("virtual addr:%x\tphysical addr:%x", vaddr, paddr);\r
60         return (void *)paddr;\r
61 }\r
62 \r
63 static Bool allocFxn(IALG_MemRec *memTab, Int numRecs);\r
64 static void freeFxn(IALG_MemRec *memTab, Int numRecs);\r
65 \r
66 \r
67 Void init_IVAHDFrwk(void)\r
68 {\r
69         IRES_Status ret;\r
70         IRESMAN_Params rman_params = {\r
71                         .size = sizeof(IRESMAN_Params),\r
72                         .allocFxn = allocFxn,\r
73                         .freeFxn = freeFxn,\r
74         };\r
75 \r
76         CERuntime_init();\r
77 \r
78         ret = RMAN_init();\r
79         if (ret != IRES_OK) {\r
80                 goto end;\r
81         }\r
82 \r
83         /* Register HDVICP with RMAN if not already registered */\r
84         ret = RMAN_register(&IRESMAN_HDVICP, &rman_params);\r
85         if ((ret != IRES_OK) && (ret != IRES_EEXISTS)) {\r
86                 DEBUG("could not register IRESMAN_HDVICP: %d", ret);\r
87                 goto end;\r
88         }\r
89 \r
90         /* NOTE: this might try MemMgr allocations over RCM remote\r
91          * call back to host side.  Which will fail if we don't\r
92          * have memsrv.  But will eventually fall back to allocFxn\r
93          * which will allocate from the local heap.\r
94          */\r
95         ret = RMAN_register(&IRESMAN_TILEDMEMORY, &rman_params);\r
96         if ((ret != IRES_OK) && (ret != IRES_EEXISTS)) {\r
97                 DEBUG("could not register IRESMAN_TILEDMEMORY: %d", ret);\r
98                 goto end;\r
99         }\r
100 \r
101         DEBUG("RMAN_register() for HDVICP is successful");\r
102 \r
103 end:\r
104         return;\r
105 }\r
106 \r
107 Void exit_IVAHDFrwk()\r
108 {\r
109         /* CERuntime_exit() will call global exit that deinitialize all\r
110          * (RMAN,Algorithm...etc)\r
111          */\r
112         DEBUG("call to CERuntime_exit()");\r
113         CERuntime_exit();\r
114 }\r
115 \r
116 /* we need to track the block size ourselves, to ensure that it is\r
117  * properly deallocated
118  */\r
119 typedef struct {\r
120         Uns size;\r
121         void *ptr;\r
122 } MemHeader;\r
123 \r
124 #define P2H(p) (&(((MemHeader *)(p))[-1]))\r
125 \r
126 static Bool allocFxn(IALG_MemRec memTab[], Int n)\r
127 {\r
128         Int i;\r
129 #ifdef MEMORYSTATS_DEBUG\r
130         Memory_Stats stats;\r
131 #endif\r
132 \r
133         for (i = 0; i < n; i++) {\r
134                 Error_Block eb;\r
135                 Uns pad, size;\r
136                 void *blk;\r
137                 MemHeader *hdr;\r
138 \r
139                 if (memTab[i].alignment > sizeof(MemHeader)) {\r
140                         pad = memTab[i].alignment;\r
141                 } else {\r
142                         pad = sizeof(MemHeader);\r
143                 }\r
144 \r
145                 size = memTab[i].size + pad;\r
146 \r
147 #ifdef MEMORYSTATS_DEBUG\r
148                 Memory_getStats(heap1, &stats);\r
149                 INFO("Total: %d\tFree: %d\tLargest: %d", stats.totalSize,\r
150                                 stats.totalFreeSize, stats.largestFreeSize);\r
151 #endif\r
152 \r
153                 blk = Memory_alloc(heap1, size, memTab[i].alignment, &eb);\r
154 \r
155                 if (!blk) {\r
156                         ERROR("MemTab Allocation failed at %d", i);\r
157                         freeFxn(memTab, i);\r
158                         return FALSE;\r
159                 } else {\r
160                         memTab[i].base = (void *)((char *)blk + pad);\r
161                         hdr = P2H(memTab[i].base);\r
162                         hdr->size = size;\r
163                         hdr->ptr  = blk;\r
164                         DEBUG("%d: alloc: %p/%p (%d)", i, hdr->ptr,\r
165                                         memTab[i].base, hdr->size);\r
166                 }\r
167         }\r
168         DEBUG("MemTab Allocation is Successful");\r
169         return TRUE;\r
170 }\r
171 \r
172 static void freeFxn(IALG_MemRec memTab[], Int n)\r
173 {\r
174         Int i;\r
175 #ifdef MEMORYSTATS_DEBUG\r
176         Memory_Stats stats;\r
177 #endif\r
178 \r
179         for (i = 0; i < n; i++) {\r
180                 if (memTab[i].base != NULL) {\r
181                         MemHeader *hdr = P2H(memTab[i].base);\r
182 \r
183 #ifdef MEMORYSTATS_DEBUG\r
184                         DEBUG("%d: free: %p/%p (%d)", n, hdr->ptr,\r
185                                         memTab[i].base, hdr->size);\r
186 #endif\r
187                         Memory_free(heap1, hdr->ptr, hdr->size);\r
188                 }\r
189 #ifdef MEMORYSTATS_DEBUG\r
190                 Memory_getStats(heap1, &stats);\r
191                 INFO("Total: %d\tFree: %d\tLargest: %d", stats.totalSize,\r
192                                 stats.totalFreeSize, stats.largestFreeSize);\r
193 #endif\r
194         }\r
195 }\r