/*
 *  ======== MemMgr_Free_skel ========
 */
Int32 MemMgr_Free_skel(UInt32 size, UInt32 *data)
{
    void *ptr;
    Int32 rval;
    UInt16 remoteProcId;

//  printf("--> MemMgr_Free_skel(size: %d, data: 0x%x)\n",
//      (int)size, (unsigned int)data);

    /* setup a call frame */
    remoteProcId = (UInt16)data[0];
    ptr = (void *)(data[1]);
//  printf("ptr: 0x%x\n", (unsigned int)ptr);

    /* invoke the requested api */
    rval = (Int32)MemMgr_Free(ptr);

//  printf("<-- MemMgr_Free_skel, %d\n", (int)rval);
    return(rval);
}
/*!
 *  @brief      Free memory allocated by SysLinkMemUtils_alloc
 *
 *              This function  is called by remote processor application to
 *              Free a previous allocated userspace buffer.
 *
 *  @param      dataSize    Size of the marshalled data packet
 *  @param      data        Marshalled data packet
 *
 *  @sa         SysLinkMemUtils_alloc
 */
Int32
SysLinkMemUtils_free (UInt32 dataSize, UInt32 * data)
{
    FreeArgs  * args    = (FreeArgs *)data;
    Ptr         ua;
    Int32       status;

    GT_2trace (curTrace, GT_ENTER, "SysLinkMemUtils_free", dataSize, data);

    ua = _SysLinkMemUtils_removeMapElement (args->bufPtr);
    if (!ua) {
        status = PROCMGR_E_INVALIDARG;
#if !defined(SYSLINK_BUILD_OPTIMIZE)
        GT_setFailureReason (curTrace,
                             GT_4CLASS,
                             (Char *)__func__,
                             status,
                             "Not valid address");
#endif /* if !defined(SYSLINK_BUILD_OPTIMIZE) */
    }
    else {
        status = SysLinkMemUtils_unmap ((UInt32)ua, PROC_SYSM3);
#if !defined(SYSLINK_BUILD_OPTIMIZE)
        if (status < 0) {
            GT_setFailureReason (curTrace,
                                 GT_4CLASS,
                                 (Char *)__func__,
                                 status,
                                 "SysLinkMemUtils_unmap failed!");
        }
#endif /* if !defined(SYSLINK_BUILD_OPTIMIZE) */
        status = MemMgr_Free (ua);
    }

    GT_1trace (curTrace, GT_LEAVE, "SysLinkMemUtils_free", status);

    return !!status;
}
/*!
 *  @brief      Allocate memory for remote processor application
 *
 *              This function  is called by remote processor application to
 *              Allocate a buffer.
 *
 *  @param      dataSize    Size of the marshalled data packet
 *  @param      data        Marshalled data packet
 *
 *  @sa         SysLinkMemUtils_free
 */
Int32
SysLinkMemUtils_alloc (UInt32 dataSize, UInt32 * data)
{

    AllocArgs                     * args            = (AllocArgs *)data;
    Int                             i;
    MemAllocBlock                 * memBlock        = NULL;
    Ptr                             allocedPtr      = NULL;
    UInt32                          retAddr         = 0;
    UInt32                          size            = 0;
    Int32                           status          = PROCMGR_SUCCESS;
    SyslinkMemUtils_MpuAddrToMap    mpuAddrList [1];

    GT_2trace (curTrace, GT_ENTER, "SysLinkMemUtils_alloc", dataSize, data);

    memBlock = Memory_calloc (NULL, sizeof (MemAllocBlock) * args->numBuffers,
                                0);
    if (!memBlock) {
        status = PROCMGR_E_MEMORY;
#if !defined(SYSLINK_BUILD_OPTIMIZE)
        GT_setFailureReason (curTrace,
                             GT_4CLASS,
                             (Char *)__func__,
                             status,
                             "Error allocating memBlock");
#endif /* if !defined(SYSLINK_BUILD_OPTIMIZE) */
    }
    else {
        for (i = 0; i < args->numBuffers; i++) {
            memBlock [i].pixelFormat = args->params [i].pixelFormat;
            memBlock [i].dim.area.width = args->params [i].width;
            memBlock [i].dim.area.height = args->params [i].height;
            memBlock [i].dim.len = args->params [i].length;
        }
    }

    if (status == PROCMGR_SUCCESS) {
        /* Allocation */
        allocedPtr = MemMgr_Alloc (memBlock, args->numBuffers);
        if (!allocedPtr) {
            status = PROCMGR_E_MEMORY;
#if !defined(SYSLINK_BUILD_OPTIMIZE)
            GT_setFailureReason (curTrace,
                                 GT_4CLASS,
                                 (Char *)__func__,
                                 status,
                                 "Error MemMgr buffer");
#endif /* if !defined(SYSLINK_BUILD_OPTIMIZE) */
        }
    }

    if (status == PROCMGR_SUCCESS) {
        for (i = 0; i < args->numBuffers; i++) {
            args->params [i].stride = memBlock [i].stride;
            args->params [i].ptr = memBlock [i].ptr;
        }
        size = _SysLinkMemUtils_bufferSize (memBlock, args->numBuffers);
        mpuAddrList [0].mpuAddr = (UInt32)allocedPtr;
        mpuAddrList [0].size = size;
        status = SysLinkMemUtils_map (mpuAddrList, 1, &retAddr,
                                      ProcMgr_MapType_Tiler, PROC_SYSM3);
#if !defined(SYSLINK_BUILD_OPTIMIZE)
        if (status != PROCMGR_SUCCESS) {
            GT_setFailureReason (curTrace,
                                 GT_4CLASS,
                                 (Char *)__func__,
                                 status,
                                 "Error in SysLinkMemUtils_map");
        }
#endif /* if !defined(SYSLINK_BUILD_OPTIMIZE) */
    }

    if (status == PROCMGR_SUCCESS) {
        status = _SysLinkMemUtils_insertMapElement ((Ptr)retAddr,
                                                        allocedPtr, size);
#if !defined(SYSLINK_BUILD_OPTIMIZE)
        if (status != PROCMGR_SUCCESS) {
            GT_setFailureReason (curTrace,
                                 GT_4CLASS,
                                 (Char *)__func__,
                                 status,
                                 "Error in SysLinkMemUtils_InsertMapElement");
        }
#endif /* if !defined(SYSLINK_BUILD_OPTIMIZE) */
    }

    if (status != PROCMGR_SUCCESS) {
        if (retAddr) {
            SysLinkMemUtils_unmap (retAddr, PROC_SYSM3);
        }
        if (allocedPtr) {
            MemMgr_Free (allocedPtr);
        }
    }

    if (memBlock)
        Memory_free (NULL, memBlock, 1);

    GT_1trace (curTrace, GT_LEAVE, "SysLinkMemUtils_alloc", retAddr);

    return retAddr;
}
/*========================================================*/
OMX_ERRORTYPE SampleTest_DeInitBuffers(SampleCompTestCtxt * pContext)
{
	OMX_ERRORTYPE eError = OMX_ErrorNone;
	OMX_U8 *pBuffer;
	BufferList *pBufferList;
	BufferList *pTemp;

	OMX_U32 nRetVal = 0;

	pTemp = pContext->pInBufferList;

	while (pTemp)
	{
		pBufferList = (BufferList *) pTemp;
		pBuffer = (OMX_U8 *) pTemp->pOrigBufHdr->pBuffer;

		printf("\nCalling Free Buffer on port no. %d\n",
		    pTemp->pOrigBufHdr->nInputPortIndex);

		eError =
		    OMX_FreeBuffer(pContext->hComp,
		    pTemp->pOrigBufHdr->nInputPortIndex, pTemp->pOrigBufHdr);
		OMX_TEST_BAIL_IF_ERROR(eError);

                if (pContext->bClientAllocBuf)
                {

#ifdef OMX_SAMPLE_TILER_TEST
                        nRetVal = MemMgr_Free(pBuffer);
                        if (nRetVal)
                        {
                                printf("\nError in MemMgr free\n");
                        }
#else
                        TIMM_OSAL_Free(pBuffer);
#endif
                }

		pTemp = pTemp->pNextBuf;
		if (pBufferList)
			TIMM_OSAL_Free(pBufferList);
	}

	pContext->pInBufferList = NULL;

	pTemp = pContext->pOutBufferList;
	while (pTemp)
	{
		pBufferList = (BufferList *) pTemp;
		pBuffer = (OMX_U8 *) pTemp->pOrigBufHdr->pBuffer;
		printf("\nCalling Free Buffer on port no. %d\n",
		    pTemp->pOrigBufHdr->nOutputPortIndex);

		eError =
		    OMX_FreeBuffer(pContext->hComp,
		    pTemp->pOrigBufHdr->nOutputPortIndex, pTemp->pOrigBufHdr);
		OMX_TEST_BAIL_IF_ERROR(eError);
                if (pContext->bClientAllocBuf)
                {
#ifdef OMX_SAMPLE_TILER_TEST
                        nRetVal = MemMgr_Free(pBuffer);
                        if (nRetVal)
                        {
                                printf("\nError in MemMgr free\n");
                        }
#else
                        TIMM_OSAL_Free(pBuffer);
#endif
                }

		pTemp = pTemp->pNextBuf;
		if (pBufferList)
			TIMM_OSAL_Free(pBufferList);

	}

	pContext->pOutBufferList = NULL;

      OMX_TEST_BAIL:
	return eError;
}