1800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang/* 2800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * 338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * Copyright 2012 Samsung Electronics S.LSI Co. LTD 4800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * 5800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * Licensed under the Apache License, Version 2.0 (the "License"); 6800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * you may not use this file except in compliance with the License. 7800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * You may obtain a copy of the License at 8800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * 9800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * http://www.apache.org/licenses/LICENSE-2.0 10800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * 11800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * Unless required by applicable law or agreed to in writing, software 12800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * distributed under the License is distributed on an "AS IS" BASIS, 13800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * See the License for the specific language governing permissions and 15800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * limitations under the License. 16800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang */ 17800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 18800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang/* 19800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * @file Exynos_OSAL_SharedMemory.c 20800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * @brief 21800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * @author SeungBeom Kim (sbcrux.kim@samsung.com) 22800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * Taehwan Kim (t_h.kim@samsung.com) 2338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @version 2.0.0 24800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang * @history 2538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * 2012.02.20 : Create 26800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang */ 27800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 28a6c8bcb6ee0f5ced4ab6ef80d3ed51642124ec8cDima Zavin#include <stdbool.h> 29800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include <stdio.h> 30800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include <stdlib.h> 31800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include <string.h> 32800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include <errno.h> 33800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include <pthread.h> 34800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include <cutils/log.h> 35800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include <cutils/atomic.h> 36800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include <fcntl.h> 3743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim#include <sys/mman.h> 38800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 39800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include "Exynos_OSAL_SharedMemory.h" 40800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include "ion.h" 41800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 42800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#define EXYNOS_LOG_OFF 43800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang#include "Exynos_OSAL_Log.h" 44800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 45800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changstatic int mem_cnt = 0; 46800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 4743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kimstruct EXYNOS_SHAREDMEM_LIST; 4843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kimtypedef struct _EXYNOS_SHAREDMEM_LIST 49800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{ 5043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim OMX_U32 IONBuffer; 5143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim OMX_PTR mapAddr; 5243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim OMX_U32 allocSize; 53f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim OMX_BOOL owner; 5443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim struct _EXYNOS_SHAREDMEM_LIST *pNextMemory; 5543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim} EXYNOS_SHAREDMEM_LIST; 56800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 5743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kimtypedef struct _EXYNOS_SHARED_MEMORY 58800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{ 5943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim OMX_HANDLETYPE hIONHandle; 6043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pAllocMemory; 6143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim OMX_HANDLETYPE hSMMutex; 6243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim} EXYNOS_SHARED_MEMORY; 63800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 64800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 65800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_HANDLETYPE Exynos_OSAL_SharedMemory_Open() 66800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{ 6743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHARED_MEMORY *pHandle = NULL; 6843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim ion_client IONClient = 0; 6943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim 7043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pHandle = (EXYNOS_SHARED_MEMORY *)Exynos_OSAL_Malloc(sizeof(EXYNOS_SHARED_MEMORY)); 7143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_Memset(pHandle, 0, sizeof(EXYNOS_SHARED_MEMORY)); 72800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang if (pHandle == NULL) 73800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 74800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 75800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang IONClient = (OMX_HANDLETYPE)ion_client_create(); 76800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang if (IONClient <= 0) { 77800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_client_create Error: %d", IONClient); 78800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Free((void *)pHandle); 79800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pHandle = NULL; 80800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 81800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 82800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 8343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pHandle->hIONHandle = IONClient; 84800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 8543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexCreate(&pHandle->hSMMutex); 86800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 87800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangEXIT: 88800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang return (OMX_HANDLETYPE)pHandle; 89800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang} 90800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 91800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changvoid Exynos_OSAL_SharedMemory_Close(OMX_HANDLETYPE handle) 92800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{ 9343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHARED_MEMORY *pHandle = (EXYNOS_SHARED_MEMORY *)handle; 9443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pSMList = NULL; 9543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL; 9643cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pDeleteElement = NULL; 9743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim 9843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if (pHandle == NULL) 9943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim goto EXIT; 100800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 10143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexLock(pHandle->hSMMutex); 10243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pCurrentElement = pSMList = pHandle->pAllocMemory; 103800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 10443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim while (pCurrentElement != NULL) { 10543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pDeleteElement = pCurrentElement; 10643cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pCurrentElement = pCurrentElement->pNextMemory; 10743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim 10843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if (ion_unmap(pDeleteElement->mapAddr, pDeleteElement->allocSize)) 10943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_unmap fail"); 11043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim 11143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pDeleteElement->mapAddr = NULL; 11243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pDeleteElement->allocSize = 0; 11343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim 114a6c8bcb6ee0f5ced4ab6ef80d3ed51642124ec8cDima Zavin if (pDeleteElement->owner) 115a6c8bcb6ee0f5ced4ab6ef80d3ed51642124ec8cDima Zavin ion_free(pDeleteElement->IONBuffer); 11643cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pDeleteElement->IONBuffer = 0; 11743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim 11843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_Free(pDeleteElement); 11943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim 12043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim mem_cnt--; 12143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory free count: %d", mem_cnt); 12243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim } 12343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim 12443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pHandle->pAllocMemory = pSMList = NULL; 12543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 12643cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim 12743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexTerminate(pHandle->hSMMutex); 12843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pHandle->hSMMutex = NULL; 12943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim 13043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim ion_client_destroy((ion_client)pHandle->hIONHandle); 13143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pHandle->hIONHandle = NULL; 132800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 133800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Free(pHandle); 134800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 13543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom KimEXIT: 136800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang return; 137800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang} 138800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 139800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_PTR Exynos_OSAL_SharedMemory_Alloc(OMX_HANDLETYPE handle, OMX_U32 size, MEMORY_TYPE memoryType) 140800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{ 14143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHARED_MEMORY *pHandle = (EXYNOS_SHARED_MEMORY *)handle; 14243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pSMList = NULL; 14343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pElement = NULL; 14443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL; 14543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim ion_buffer IONBuffer = 0; 14643cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim OMX_PTR pBuffer = NULL; 1472590f08f743402db357146c2feed73275440f388SeungBeom Kim unsigned int mask; 1482590f08f743402db357146c2feed73275440f388SeungBeom Kim unsigned int flag; 149800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 150800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang if (pHandle == NULL) 151800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 152800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 15343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pElement = (EXYNOS_SHAREDMEM_LIST *)Exynos_OSAL_Malloc(sizeof(EXYNOS_SHAREDMEM_LIST)); 15443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_Memset(pElement, 0, sizeof(EXYNOS_SHAREDMEM_LIST)); 155f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim pElement->owner = OMX_TRUE; 156800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 1572590f08f743402db357146c2feed73275440f388SeungBeom Kim switch (memoryType) { 1582590f08f743402db357146c2feed73275440f388SeungBeom Kim case SECURE_MEMORY: 1592590f08f743402db357146c2feed73275440f388SeungBeom Kim mask = ION_HEAP_EXYNOS_CONTIG_MASK; 160ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim flag = ION_EXYNOS_MFC_INPUT_MASK; 1612590f08f743402db357146c2feed73275440f388SeungBeom Kim break; 1622590f08f743402db357146c2feed73275440f388SeungBeom Kim case NORMAL_MEMORY: 1632590f08f743402db357146c2feed73275440f388SeungBeom Kim mask = ION_HEAP_EXYNOS_MASK; 1642590f08f743402db357146c2feed73275440f388SeungBeom Kim flag = 0; 1652590f08f743402db357146c2feed73275440f388SeungBeom Kim break; 1662590f08f743402db357146c2feed73275440f388SeungBeom Kim case SYSTEM_MEMORY: 1672590f08f743402db357146c2feed73275440f388SeungBeom Kim mask = ION_HEAP_SYSTEM_MASK; 1682590f08f743402db357146c2feed73275440f388SeungBeom Kim flag = ION_FLAG_CACHED; 1692590f08f743402db357146c2feed73275440f388SeungBeom Kim break; 1702590f08f743402db357146c2feed73275440f388SeungBeom Kim default: 1712590f08f743402db357146c2feed73275440f388SeungBeom Kim pBuffer = NULL; 1722590f08f743402db357146c2feed73275440f388SeungBeom Kim goto EXIT; 1732590f08f743402db357146c2feed73275440f388SeungBeom Kim break; 1742590f08f743402db357146c2feed73275440f388SeungBeom Kim } 175164d853fa7c1d1aa27a168cbaff5968cd492a3f6Dima Zavin 1762590f08f743402db357146c2feed73275440f388SeungBeom Kim IONBuffer = ion_alloc((ion_client)pHandle->hIONHandle, size, 0, mask, flag); 177800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang if (IONBuffer <= 0) { 178800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_alloc Error: %d", IONBuffer); 17943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_Free((OMX_PTR)pElement); 180800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 181800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 182800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 183800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang pBuffer = ion_map(IONBuffer, size, 0); 18443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if (pBuffer == MAP_FAILED) { 185800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_map Error"); 186800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang ion_free(IONBuffer); 18743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_Free((OMX_PTR)pElement); 18843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pBuffer = NULL; 189800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 190800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 191800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 19243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pElement->IONBuffer = IONBuffer; 19343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pElement->mapAddr = pBuffer; 19443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pElement->allocSize = size; 19543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pElement->pNextMemory = NULL; 196800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 19743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexLock(pHandle->hSMMutex); 19843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pSMList = pHandle->pAllocMemory; 19943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if (pSMList == NULL) { 20043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pHandle->pAllocMemory = pSMList = pElement; 201800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } else { 20243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pCurrentElement = pSMList; 20343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim while (pCurrentElement->pNextMemory != NULL) { 20443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pCurrentElement = pCurrentElement->pNextMemory; 205800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 20643cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pCurrentElement->pNextMemory = pElement; 207800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 20843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 209800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 210800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang mem_cnt++; 211800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory alloc count: %d", mem_cnt); 212800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 213800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangEXIT: 214800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang return pBuffer; 215800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang} 216800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 217800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changvoid Exynos_OSAL_SharedMemory_Free(OMX_HANDLETYPE handle, OMX_PTR pBuffer) 218800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{ 21943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHARED_MEMORY *pHandle = (EXYNOS_SHARED_MEMORY *)handle; 22043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pSMList = NULL; 22143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL; 22243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pDeleteElement = NULL; 223800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 224800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang if (pHandle == NULL) 225800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 226800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 22743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexLock(pHandle->hSMMutex); 22843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pSMList = pHandle->pAllocMemory; 22943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if (pSMList == NULL) { 23043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 231800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 232800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 233800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 23443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pCurrentElement = pSMList; 23543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if (pSMList->mapAddr == pBuffer) { 23643cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pDeleteElement = pSMList; 23743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pHandle->pAllocMemory = pSMList = pSMList->pNextMemory; 238800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } else { 23943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim while ((pCurrentElement != NULL) && (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) && 24043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->mapAddr != pBuffer)) 24143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pCurrentElement = pCurrentElement->pNextMemory; 24243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim 24343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if ((((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) && 24443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->mapAddr == pBuffer)) { 24543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pDeleteElement = pCurrentElement->pNextMemory; 24643cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pCurrentElement->pNextMemory = pDeleteElement->pNextMemory; 24743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim } else { 24843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 249800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find SharedMemory"); 250800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 251800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 252800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 25343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 254800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 25543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if (ion_unmap(pDeleteElement->mapAddr, pDeleteElement->allocSize)) { 256800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_unmap fail"); 257800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 258800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 25943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pDeleteElement->mapAddr = NULL; 26043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pDeleteElement->allocSize = 0; 261800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 262a6c8bcb6ee0f5ced4ab6ef80d3ed51642124ec8cDima Zavin if (pDeleteElement->owner) 263a6c8bcb6ee0f5ced4ab6ef80d3ed51642124ec8cDima Zavin ion_free(pDeleteElement->IONBuffer); 26443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pDeleteElement->IONBuffer = 0; 265800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 26643cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_Free(pDeleteElement); 267800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 268800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang mem_cnt--; 269800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory free count: %d", mem_cnt); 2709dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 2719dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom KimEXIT: 2729dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim return; 2739dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim} 2749dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 2759dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom KimOMX_PTR Exynos_OSAL_SharedMemory_Map(OMX_HANDLETYPE handle, OMX_U32 size, unsigned int ionfd) 2769dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim{ 2779dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim EXYNOS_SHARED_MEMORY *pHandle = (EXYNOS_SHARED_MEMORY *)handle; 2789dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pSMList = NULL; 2799dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pElement = NULL; 2809dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL; 2819dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim ion_buffer IONBuffer = 0; 2829dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim OMX_PTR pBuffer = NULL; 2839dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 2849dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim if (pHandle == NULL) 2859dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim goto EXIT; 2869dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 2879dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pElement = (EXYNOS_SHAREDMEM_LIST *)Exynos_OSAL_Malloc(sizeof(EXYNOS_SHAREDMEM_LIST)); 2889dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_Memset(pElement, 0, sizeof(EXYNOS_SHAREDMEM_LIST)); 2899dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 2909dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim IONBuffer = (OMX_PTR)ionfd; 2919dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 2929dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim if (IONBuffer <= 0) { 2939dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_alloc Error: %d", IONBuffer); 2949dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_Free((void*)pElement); 2959dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim goto EXIT; 2969dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim } 2979dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 2989dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pBuffer = ion_map(IONBuffer, size, 0); 2999dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim if (pBuffer == NULL) { 3009dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_map Error"); 3019dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim ion_free(IONBuffer); 3029dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_Free((void*)pElement); 3039dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim goto EXIT; 3049dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim } 3059dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 3069dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pElement->IONBuffer = IONBuffer; 3079dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pElement->mapAddr = pBuffer; 3089dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pElement->allocSize = size; 3099dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pElement->pNextMemory = NULL; 3109dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 3119dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_MutexLock(pHandle->hSMMutex); 3129dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pSMList = pHandle->pAllocMemory; 3139dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim if (pSMList == NULL) { 3149dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pHandle->pAllocMemory = pSMList = pElement; 3159dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim } else { 3169dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pCurrentElement = pSMList; 3179dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim while (pCurrentElement->pNextMemory != NULL) { 3189dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pCurrentElement = pCurrentElement->pNextMemory; 3199dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim } 3209dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pCurrentElement->pNextMemory = pElement; 3219dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim } 3229dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 3239dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 3249dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim mem_cnt++; 3259dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory alloc count: %d", mem_cnt); 3269dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 3279dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom KimEXIT: 3289dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim return pBuffer; 3299dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim} 3309dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 3319dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kimvoid Exynos_OSAL_SharedMemory_Unmap(OMX_HANDLETYPE handle, unsigned int ionfd) 3329dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim{ 3339dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim EXYNOS_SHARED_MEMORY *pHandle = (EXYNOS_SHARED_MEMORY *)handle; 3349dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pSMList = NULL; 3359dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL; 3369dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pDeleteElement = NULL; 3379dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 3389dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim if (pHandle == NULL) 3399dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim goto EXIT; 3409dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 3419dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_MutexLock(pHandle->hSMMutex); 3429dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pSMList = pHandle->pAllocMemory; 3439dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim if (pSMList == NULL) { 3449dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 3459dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim goto EXIT; 3469dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim } 3479dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 3489dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pCurrentElement = pSMList; 3499dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim if (pSMList->IONBuffer == ionfd) { 3509dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pDeleteElement = pSMList; 3519dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pHandle->pAllocMemory = pSMList = pSMList->pNextMemory; 3529dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim } else { 3539dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim while ((pCurrentElement != NULL) && (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) && 3549dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->IONBuffer != ionfd)) 3559dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pCurrentElement = pCurrentElement->pNextMemory; 3569dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 3579dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim if ((((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) && 3589dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->IONBuffer == ionfd)) { 3599dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pDeleteElement = pCurrentElement->pNextMemory; 3609dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pCurrentElement->pNextMemory = pDeleteElement->pNextMemory; 3619dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim } else { 3629dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 3639dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find SharedMemory"); 3649dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim goto EXIT; 3659dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim } 3669dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim } 3679dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 3689dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 3699dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim if (ion_unmap(pDeleteElement->mapAddr, pDeleteElement->allocSize)) { 3709dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_unmap fail"); 3719dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim goto EXIT; 3729dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim } 3739dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pDeleteElement->mapAddr = NULL; 3749dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pDeleteElement->allocSize = 0; 3759dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim pDeleteElement->IONBuffer = 0; 3769dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 3779dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_Free(pDeleteElement); 3789dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim 3799dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim mem_cnt--; 3809dfee4e58cb33fd5da3284f6d56776a4f99e9c92SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory free count: %d", mem_cnt); 381800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 382800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangEXIT: 383800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang return; 384800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang} 385800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 386800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Changint Exynos_OSAL_SharedMemory_VirtToION(OMX_HANDLETYPE handle, OMX_PTR pBuffer) 387800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{ 38843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHARED_MEMORY *pHandle = (EXYNOS_SHARED_MEMORY *)handle; 38943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pSMList = NULL; 39043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL; 39143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pFindElement = NULL; 392800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang int ion_addr = 0; 39343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if (pHandle == NULL || pBuffer == NULL) 394800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 395800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 39643cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexLock(pHandle->hSMMutex); 39743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pSMList = pHandle->pAllocMemory; 39843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if (pSMList == NULL) { 39943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 400800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 401800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 402800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 40343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pCurrentElement = pSMList; 40443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if (pSMList->mapAddr == pBuffer) { 40543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pFindElement = pSMList; 406800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } else { 40743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim while ((pCurrentElement != NULL) && (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) && 40843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->mapAddr != pBuffer)) 40943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pCurrentElement = pCurrentElement->pNextMemory; 41043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim 41143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if ((((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) && 41243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->mapAddr == pBuffer)) { 41343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pFindElement = pCurrentElement->pNextMemory; 41443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim } else { 41543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 4165b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Can not find SharedMemory"); 417800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 418800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 419800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 42043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 421800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 42243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim ion_addr = pFindElement->IONBuffer; 423800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 424800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangEXIT: 425800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang return ion_addr; 426800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang} 427800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 428800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangOMX_PTR Exynos_OSAL_SharedMemory_IONToVirt(OMX_HANDLETYPE handle, int ion_addr) 429800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang{ 43043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHARED_MEMORY *pHandle = (EXYNOS_SHARED_MEMORY *)handle; 43143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pSMList = NULL; 43243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL; 43343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim EXYNOS_SHAREDMEM_LIST *pFindElement = NULL; 434800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang OMX_PTR pBuffer = NULL; 43543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if (pHandle == NULL || ion_addr == 0) 436800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 437800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 43843cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexLock(pHandle->hSMMutex); 43943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pSMList = pHandle->pAllocMemory; 44043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if (pSMList == NULL) { 44143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 442800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 443800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 444800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 44543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pCurrentElement = pSMList; 44643cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if (pSMList->IONBuffer == ion_addr) { 44743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pFindElement = pSMList; 448800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } else { 44943cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim while ((pCurrentElement != NULL) && (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) && 45043cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->IONBuffer != ion_addr)) 45143cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pCurrentElement = pCurrentElement->pNextMemory; 45243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim 45343cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim if ((((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) && 45443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->IONBuffer == ion_addr)) { 45543cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pFindElement = pCurrentElement->pNextMemory; 45643cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim } else { 45743cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 4585b46229d5940c68462ba3c42f65ae00550ab7c0bSeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Can not find SharedMemory"); 459800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang goto EXIT; 460800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 461800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang } 46243cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim Exynos_OSAL_MutexUnlock(pHandle->hSMMutex); 463800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 46443cea9e066f818d4ec271f0996648ffb6fafb9a3SeungBeom Kim pBuffer = pFindElement->mapAddr; 465800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang 466800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho ChangEXIT: 467800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang return pBuffer; 468800a8d754f6251b19a56b1aebde0e239c0e5f3cdJiho Chang} 469