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