3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 * @file Exynos_OSAL_SharedMemory.c
21 * @author SeungBeom Kim (sbcrux.kim@samsung.com)
22 * Taehwan Kim (t_h.kim@samsung.com)
34 #ifndef TIZEN_FEATURE_E3250 /* build env */
35 #include <cutils/log.h>
36 #include <cutils/atomic.h>
41 #include "Exynos_OSAL_SharedMemory.h"
44 #define EXYNOS_LOG_OFF
45 #include "Exynos_OSAL_Log.h"
47 static int mem_cnt = 0;
49 struct EXYNOS_SHAREDMEM_LIST;
50 typedef struct _EXYNOS_SHAREDMEM_LIST
56 struct _EXYNOS_SHAREDMEM_LIST *pNextMemory;
57 } EXYNOS_SHAREDMEM_LIST;
59 typedef struct _EXYNOS_SHARED_MEMORY
61 OMX_HANDLETYPE hIONHandle;
62 EXYNOS_SHAREDMEM_LIST *pAllocMemory;
63 OMX_HANDLETYPE hSMMutex;
64 } EXYNOS_SHARED_MEMORY;
67 OMX_HANDLETYPE Exynos_OSAL_SharedMemory_Open()
69 EXYNOS_SHARED_MEMORY *pHandle = NULL;
70 ion_client IONClient = 0;
72 pHandle = (EXYNOS_SHARED_MEMORY *)Exynos_OSAL_Malloc(sizeof(EXYNOS_SHARED_MEMORY));
73 Exynos_OSAL_Memset(pHandle, 0, sizeof(EXYNOS_SHARED_MEMORY));
77 IONClient = (OMX_HANDLETYPE)ion_client_create();
79 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_client_create Error: %d", IONClient);
80 Exynos_OSAL_Free((void *)pHandle);
85 pHandle->hIONHandle = IONClient;
87 Exynos_OSAL_MutexCreate(&pHandle->hSMMutex);
90 return (OMX_HANDLETYPE)pHandle;
93 void Exynos_OSAL_SharedMemory_Close(OMX_HANDLETYPE handle)
95 EXYNOS_SHARED_MEMORY *pHandle = (EXYNOS_SHARED_MEMORY *)handle;
96 EXYNOS_SHAREDMEM_LIST *pSMList = NULL;
97 EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL;
98 EXYNOS_SHAREDMEM_LIST *pDeleteElement = NULL;
103 Exynos_OSAL_MutexLock(pHandle->hSMMutex);
104 pCurrentElement = pSMList = pHandle->pAllocMemory;
106 while (pCurrentElement != NULL) {
107 pDeleteElement = pCurrentElement;
108 pCurrentElement = pCurrentElement->pNextMemory;
110 if (ion_unmap(pDeleteElement->mapAddr, pDeleteElement->allocSize))
111 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_unmap fail");
113 pDeleteElement->mapAddr = NULL;
114 pDeleteElement->allocSize = 0;
116 if (pDeleteElement->owner)
117 ion_free(pDeleteElement->IONBuffer);
118 pDeleteElement->IONBuffer = 0;
120 Exynos_OSAL_Free(pDeleteElement);
123 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory free count: %d", mem_cnt);
126 pHandle->pAllocMemory = pSMList = NULL;
127 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
129 Exynos_OSAL_MutexTerminate(pHandle->hSMMutex);
130 pHandle->hSMMutex = NULL;
132 ion_client_destroy((ion_client)pHandle->hIONHandle);
133 pHandle->hIONHandle = NULL;
135 Exynos_OSAL_Free(pHandle);
141 OMX_PTR Exynos_OSAL_SharedMemory_Alloc(OMX_HANDLETYPE handle, OMX_U32 size, MEMORY_TYPE memoryType)
143 EXYNOS_SHARED_MEMORY *pHandle = (EXYNOS_SHARED_MEMORY *)handle;
144 EXYNOS_SHAREDMEM_LIST *pSMList = NULL;
145 EXYNOS_SHAREDMEM_LIST *pElement = NULL;
146 EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL;
147 ion_buffer IONBuffer = 0;
148 OMX_PTR pBuffer = NULL;
155 pElement = (EXYNOS_SHAREDMEM_LIST *)Exynos_OSAL_Malloc(sizeof(EXYNOS_SHAREDMEM_LIST));
156 Exynos_OSAL_Memset(pElement, 0, sizeof(EXYNOS_SHAREDMEM_LIST));
157 pElement->owner = true;
159 switch (memoryType) {
161 mask = ION_HEAP_EXYNOS_CONTIG_MASK;
162 flag = ION_EXYNOS_FIMD_VIDEO_MASK;
165 mask = ION_HEAP_EXYNOS_MASK;
169 mask = ION_HEAP_SYSTEM_MASK;
170 flag = ION_FLAG_CACHED;
178 IONBuffer = ion_alloc((ion_client)pHandle->hIONHandle, size, 0, mask, flag);
180 if (IONBuffer <= 0) {
181 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_alloc Error: %d", IONBuffer);
182 Exynos_OSAL_Free((OMX_PTR)pElement);
186 pBuffer = ion_map(IONBuffer, size, 0);
187 if (pBuffer == MAP_FAILED) {
188 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_map Error");
190 Exynos_OSAL_Free((OMX_PTR)pElement);
195 pElement->IONBuffer = IONBuffer;
196 pElement->mapAddr = pBuffer;
197 pElement->allocSize = size;
198 pElement->pNextMemory = NULL;
200 Exynos_OSAL_MutexLock(pHandle->hSMMutex);
201 pSMList = pHandle->pAllocMemory;
202 if (pSMList == NULL) {
203 pHandle->pAllocMemory = pSMList = pElement;
205 pCurrentElement = pSMList;
206 while (pCurrentElement->pNextMemory != NULL) {
207 pCurrentElement = pCurrentElement->pNextMemory;
209 pCurrentElement->pNextMemory = pElement;
211 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
214 #ifndef TIZEN_FEATURE_E3250
215 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory alloc count: %d", mem_cnt);
217 Exynos_OSAL_Log(EXYNOS_LOG_VERVOSE, "SharedMemory alloc count: %d", mem_cnt);
224 void Exynos_OSAL_SharedMemory_Free(OMX_HANDLETYPE handle, OMX_PTR pBuffer)
226 EXYNOS_SHARED_MEMORY *pHandle = (EXYNOS_SHARED_MEMORY *)handle;
227 EXYNOS_SHAREDMEM_LIST *pSMList = NULL;
228 EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL;
229 EXYNOS_SHAREDMEM_LIST *pDeleteElement = NULL;
234 Exynos_OSAL_MutexLock(pHandle->hSMMutex);
235 pSMList = pHandle->pAllocMemory;
236 if (pSMList == NULL) {
237 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
241 pCurrentElement = pSMList;
242 if (pSMList->mapAddr == pBuffer) {
243 pDeleteElement = pSMList;
244 pHandle->pAllocMemory = pSMList = pSMList->pNextMemory;
246 while ((pCurrentElement != NULL) && (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
247 (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->mapAddr != pBuffer))
248 pCurrentElement = pCurrentElement->pNextMemory;
250 if ((((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
251 (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->mapAddr == pBuffer)) {
252 pDeleteElement = pCurrentElement->pNextMemory;
253 pCurrentElement->pNextMemory = pDeleteElement->pNextMemory;
255 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
256 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find SharedMemory");
260 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
262 if (ion_unmap(pDeleteElement->mapAddr, pDeleteElement->allocSize)) {
263 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_unmap fail");
266 pDeleteElement->mapAddr = NULL;
267 pDeleteElement->allocSize = 0;
269 if (pDeleteElement->owner)
270 ion_free(pDeleteElement->IONBuffer);
271 pDeleteElement->IONBuffer = 0;
273 Exynos_OSAL_Free(pDeleteElement);
276 #ifndef TIZEN_FEATURE_E3250
277 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory free count: %d", mem_cnt);
279 Exynos_OSAL_Log(EXYNOS_LOG_VERVOSE, "SharedMemory free count: %d", mem_cnt);
287 OMX_PTR Exynos_OSAL_SharedMemory_Map(OMX_HANDLETYPE handle, OMX_U32 size, unsigned int ionfd)
289 EXYNOS_SHARED_MEMORY *pHandle = (EXYNOS_SHARED_MEMORY *)handle;
290 EXYNOS_SHAREDMEM_LIST *pSMList = NULL;
291 EXYNOS_SHAREDMEM_LIST *pElement = NULL;
292 EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL;
293 ion_buffer IONBuffer = 0;
294 OMX_PTR pBuffer = NULL;
299 pElement = (EXYNOS_SHAREDMEM_LIST *)Exynos_OSAL_Malloc(sizeof(EXYNOS_SHAREDMEM_LIST));
300 Exynos_OSAL_Memset(pElement, 0, sizeof(EXYNOS_SHAREDMEM_LIST));
302 IONBuffer = (OMX_PTR)ionfd;
304 if (IONBuffer <= 0) {
305 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_alloc Error: %d", IONBuffer);
306 Exynos_OSAL_Free((void*)pElement);
310 pBuffer = ion_map(IONBuffer, size, 0);
311 if (pBuffer == NULL) {
312 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_map Error");
314 Exynos_OSAL_Free((void*)pElement);
318 pElement->IONBuffer = IONBuffer;
319 pElement->mapAddr = pBuffer;
320 pElement->allocSize = size;
321 pElement->pNextMemory = NULL;
323 Exynos_OSAL_MutexLock(pHandle->hSMMutex);
324 pSMList = pHandle->pAllocMemory;
325 if (pSMList == NULL) {
326 pHandle->pAllocMemory = pSMList = pElement;
328 pCurrentElement = pSMList;
329 while (pCurrentElement->pNextMemory != NULL) {
330 pCurrentElement = pCurrentElement->pNextMemory;
332 pCurrentElement->pNextMemory = pElement;
334 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
337 #ifndef TIZEN_FEATURE_E3250
338 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory alloc count: %d", mem_cnt);
340 Exynos_OSAL_Log(EXYNOS_LOG_VERVOSE, "SharedMemory alloc count: %d", mem_cnt);
347 void Exynos_OSAL_SharedMemory_Unmap(OMX_HANDLETYPE handle, unsigned int ionfd)
349 EXYNOS_SHARED_MEMORY *pHandle = (EXYNOS_SHARED_MEMORY *)handle;
350 EXYNOS_SHAREDMEM_LIST *pSMList = NULL;
351 EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL;
352 EXYNOS_SHAREDMEM_LIST *pDeleteElement = NULL;
357 Exynos_OSAL_MutexLock(pHandle->hSMMutex);
358 pSMList = pHandle->pAllocMemory;
359 if (pSMList == NULL) {
360 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
364 pCurrentElement = pSMList;
365 if (pSMList->IONBuffer == ionfd) {
366 pDeleteElement = pSMList;
367 pHandle->pAllocMemory = pSMList = pSMList->pNextMemory;
369 while ((pCurrentElement != NULL) && (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
370 (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->IONBuffer != ionfd))
371 pCurrentElement = pCurrentElement->pNextMemory;
373 if ((((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
374 (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->IONBuffer == ionfd)) {
375 pDeleteElement = pCurrentElement->pNextMemory;
376 pCurrentElement->pNextMemory = pDeleteElement->pNextMemory;
378 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
379 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find SharedMemory");
383 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
385 if (ion_unmap(pDeleteElement->mapAddr, pDeleteElement->allocSize)) {
386 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_unmap fail");
389 pDeleteElement->mapAddr = NULL;
390 pDeleteElement->allocSize = 0;
391 pDeleteElement->IONBuffer = 0;
393 Exynos_OSAL_Free(pDeleteElement);
396 #ifndef TIZEN_FEATURE_E3250
397 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory free count: %d", mem_cnt);
399 Exynos_OSAL_Log(EXYNOS_LOG_VERVOSE, "SharedMemory free count: %d", mem_cnt);
407 int Exynos_OSAL_SharedMemory_VirtToION(OMX_HANDLETYPE handle, OMX_PTR pBuffer)
409 EXYNOS_SHARED_MEMORY *pHandle = (EXYNOS_SHARED_MEMORY *)handle;
410 EXYNOS_SHAREDMEM_LIST *pSMList = NULL;
411 EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL;
412 EXYNOS_SHAREDMEM_LIST *pFindElement = NULL;
414 if (pHandle == NULL || pBuffer == NULL)
417 Exynos_OSAL_MutexLock(pHandle->hSMMutex);
418 pSMList = pHandle->pAllocMemory;
419 if (pSMList == NULL) {
420 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
424 pCurrentElement = pSMList;
425 if (pSMList->mapAddr == pBuffer) {
426 pFindElement = pSMList;
428 while ((pCurrentElement != NULL) && (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
429 (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->mapAddr != pBuffer))
430 pCurrentElement = pCurrentElement->pNextMemory;
432 if ((((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
433 (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->mapAddr == pBuffer)) {
434 pFindElement = pCurrentElement->pNextMemory;
436 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
437 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find SharedMemory");
441 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
443 ion_addr = pFindElement->IONBuffer;
449 OMX_PTR Exynos_OSAL_SharedMemory_IONToVirt(OMX_HANDLETYPE handle, int ion_addr)
451 EXYNOS_SHARED_MEMORY *pHandle = (EXYNOS_SHARED_MEMORY *)handle;
452 EXYNOS_SHAREDMEM_LIST *pSMList = NULL;
453 EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL;
454 EXYNOS_SHAREDMEM_LIST *pFindElement = NULL;
455 OMX_PTR pBuffer = NULL;
456 if (pHandle == NULL || ion_addr == 0)
459 Exynos_OSAL_MutexLock(pHandle->hSMMutex);
460 pSMList = pHandle->pAllocMemory;
461 if (pSMList == NULL) {
462 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
466 pCurrentElement = pSMList;
467 if (pSMList->IONBuffer == ion_addr) {
468 pFindElement = pSMList;
470 while ((pCurrentElement != NULL) && (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
471 (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->IONBuffer != ion_addr))
472 pCurrentElement = pCurrentElement->pNextMemory;
474 if ((((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
475 (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->IONBuffer == ion_addr)) {
476 pFindElement = pCurrentElement->pNextMemory;
478 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
479 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find SharedMemory");
483 Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
485 pBuffer = pFindElement->mapAddr;