1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* 2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (c) 2010, Texas Instruments Incorporated 3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * All rights reserved. 4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Redistribution and use in source and binary forms, with or without 6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * modification, are permitted provided that the following conditions 7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * are met: 8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * * Redistributions of source code must retain the above copyright 10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * notice, this list of conditions and the following disclaimer. 11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * * Redistributions in binary form must reproduce the above copyright 13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * notice, this list of conditions and the following disclaimer in the 14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * documentation and/or other materials provided with the distribution. 15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * * Neither the name of Texas Instruments Incorporated nor the names of 17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * its contributors may be used to endorse or promote products derived 18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * from this software without specific prior written permission. 19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * @file omx_rpc_stub.c 35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * This file contains methods that provides the functionality for 36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * the OpenMAX1.1 DOMX Framework RPC Stub implementations. 37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * @path \WTSD_DucatiMMSW\framework\domx\omx_rpc\src 39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * @rev 1.0 41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/****************************************************************** 45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * INCLUDE FILES 46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ******************************************************************/ 47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* ----- system and platform files ----------------------------*/ 48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <errno.h> 49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//#include <errno-base.h> 50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <fcntl.h> 52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <sys/ioctl.h> 53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <sys/eventfd.h> 54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <unistd.h> 55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <string.h> 56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <stdio.h> 57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <OMX_Types.h> 59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <timm_osal_interfaces.h> 60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <timm_osal_trace.h> 61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------program files ----------------------------------------*/ 64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "omx_rpc.h" 65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "omx_proxy_common.h" 66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "omx_rpc_stub.h" 67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "omx_rpc_skel.h" 68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "omx_rpc_internal.h" 69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "omx_rpc_utils.h" 70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "rpmsg_omx_defs.h" 72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define RPC_MSGPIPE_SIZE (4) 74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define RPC_MSG_SIZE_FOR_PIPE (sizeof(OMX_PTR)) 75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define RPC_getPacket(nPacketSize, pPacket) do { \ 78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pPacket = TIMM_OSAL_Malloc(nPacketSize, TIMM_OSAL_TRUE, 0, TIMMOSAL_MEM_SEGMENT_INT); \ 79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_assert(pPacket != NULL, RPC_OMX_ErrorInsufficientResources, \ 80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "Error Allocating RCM Message Frame"); \ 81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } while(0) 82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define RPC_freePacket(pPacket) do { \ 84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(pPacket != NULL) TIMM_OSAL_Free(pPacket); \ 85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } while(0) 86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid *RPC_CallbackThread(void *data); 90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* ===========================================================================*/ 93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @name RPC_InstanceInit() 95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @brief RPC instance init is used for initialization. It is called once for 96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* every instance of an OMX component. 97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param cComponentName [IN] : Name of the component. 98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param phRPCCtx [OUT] : RPC Context structure - to be filled in and returned 99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @return RPC_OMX_ErrorNone = Successful 100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/ 101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* ===========================================================================*/ 102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevRPC_OMX_ERRORTYPE RPC_InstanceInit(OMX_STRING cComponentName, 104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_HANDLETYPE * phRPCCtx) 105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone; 107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_OMX_CONTEXT *pRPCCtx = NULL; 108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_S32 status = 0; 109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev struct omx_conn_req sReq = { .name = "OMX" }; 110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE; 1113cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal OMX_U32 i = 0, nAttempts = 0; 112e005708a4599caa650c653028bea2ccb216fc653Sarthak Aggarwal 113e005708a4599caa650c653028bea2ccb216fc653Sarthak Aggarwal *(RPC_OMX_CONTEXT **) phRPCCtx = NULL; 114e005708a4599caa650c653028bea2ccb216fc653Sarthak Aggarwal 115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //pthread_t cbThread; 116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// sReq.name = "OMX"; 118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /*pRPCCtx contains context information for each instance */ 120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pRPCCtx = 121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (RPC_OMX_CONTEXT *) TIMM_OSAL_Malloc(sizeof(RPC_OMX_CONTEXT), 122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_TRUE, 0, TIMMOSAL_MEM_SEGMENT_INT); 123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_assert(pRPCCtx != NULL, RPC_OMX_ErrorInsufficientResources, 124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "Malloc failed"); 125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Memset(pRPCCtx, 0, sizeof(RPC_OMX_CONTEXT)); 126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /*Assuming that open maintains an internal count for multi instance */ 128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_DEBUG("Calling open on the device"); 1293cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal while (1) 1303cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal { 1313cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal pRPCCtx->fd_omx = open("/dev/rpmsg-omx1", O_RDWR); 1323cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal if(pRPCCtx->fd_omx >= 0 || errno != ENOENT || nAttempts == 15) 1333cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal break; 1343cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal DOMX_DEBUG("errno from open= %d, REATTEMPTING OPEN!!!!",errno); 1353cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal nAttempts++; 1363cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal usleep(1000000); 1373cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal } 1383cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal if(pRPCCtx->fd_omx < 0) 1393cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal { 1403cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal DOMX_ERROR("Can't open device, errorno from open = %d",errno); 1413cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal eError = RPC_OMX_ErrorInsufficientResources; 1423cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal goto EXIT; 1433cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal } 144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_DEBUG("Open was successful, pRPCCtx->fd_omx = %d", 145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pRPCCtx->fd_omx); 146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//AD 147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// strncpy(sReq.name, cComponentName, OMX_MAX_STRINGNAME_SIZE); 148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_DEBUG("Calling ioctl"); 150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status = ioctl(pRPCCtx->fd_omx, OMX_IOCCONNECT, &sReq); 151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_assert(status >= 0, RPC_OMX_ErrorInsufficientResources, 152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "Can't connect"); 153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (i = 0; i < RPC_OMX_MAX_FUNCTION_LIST; i++) 155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = 157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_CreatePipe(&(pRPCCtx->pMsgPipe[i]), 158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_MSGPIPE_SIZE, RPC_MSG_SIZE_FOR_PIPE, 1); 159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_assert(eError == TIMM_OSAL_ERR_NONE, 160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_OMX_ErrorInsufficientResources, 161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "Pipe creation failed"); 162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_DEBUG("Creating event fd"); 165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pRPCCtx->fd_killcb = eventfd(0, 0); 166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_assert(pRPCCtx->fd_killcb >= 0, 167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_OMX_ErrorInsufficientResources, "Can't create kill fd"); 168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /*Create a listener/server thread to listen for Ducati callbacks */ 169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_DEBUG("Create listener thread"); 170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status = 171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pthread_create(&(pRPCCtx->cbThread), NULL, RPC_CallbackThread, 172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pRPCCtx); 173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_assert(status == 0, RPC_OMX_ErrorInsufficientResources, 174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "Can't create cb thread"); 175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EXIT: 177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (eRPCError != RPC_OMX_ErrorNone) 178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_InstanceDeInit(pRPCCtx); 180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 181e005708a4599caa650c653028bea2ccb216fc653Sarthak Aggarwal else 182e005708a4599caa650c653028bea2ccb216fc653Sarthak Aggarwal { 183e005708a4599caa650c653028bea2ccb216fc653Sarthak Aggarwal *(RPC_OMX_CONTEXT **) phRPCCtx = pRPCCtx; 184e005708a4599caa650c653028bea2ccb216fc653Sarthak Aggarwal } 185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return eRPCError; 186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* ===========================================================================*/ 191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @name RPC_InstanceDeInit() 193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @brief RPC instance deinit is used for tear down. It is called once when an 194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* instance of OMX component is going down. 195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param phRPCCtx [IN] : RPC Context structure. 196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @return RPC_OMX_ErrorNone = Successful 197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/ 198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* ===========================================================================*/ 199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevRPC_OMX_ERRORTYPE RPC_InstanceDeInit(OMX_HANDLETYPE hRPCCtx) 200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone; 202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE; 203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_OMX_CONTEXT *pRPCCtx = (RPC_OMX_CONTEXT *) hRPCCtx; 204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_S32 status = 0; 205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 i = 0; 206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U64 nKillEvent = 1; 207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_assert(hRPCCtx != NULL, RPC_OMX_ErrorUndefined, 209e005708a4599caa650c653028bea2ccb216fc653Sarthak Aggarwal "NULL context handle supplied to RPC Deinit"); 210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pRPCCtx->fd_killcb) 212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status = 214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev write(pRPCCtx->fd_killcb, &nKillEvent, sizeof(OMX_U64)); 215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (status <= 0) 216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_ERROR 218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ("Write to kill fd failed - cb thread may not exit"); 219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eRPCError = RPC_OMX_ErrorUndefined; 220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else if (pRPCCtx->cbThread) 221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_DEBUG("Waiting for cb thread to exit"); 223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status = pthread_join(pRPCCtx->cbThread, NULL); 224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (status != 0) 225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_ERROR("Join for cb thread failed"); 227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eRPCError = RPC_OMX_ErrorUndefined; 228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_DEBUG("Closing the kill fd"); 231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status = close(pRPCCtx->fd_killcb); 232e005708a4599caa650c653028bea2ccb216fc653Sarthak Aggarwal pRPCCtx->fd_killcb = 0; 233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (status != 0) 234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_ERROR("Close failed on kill fd"); 236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eRPCError = RPC_OMX_ErrorUndefined; 237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (i = 0; i < RPC_OMX_MAX_FUNCTION_LIST; i++) 241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pRPCCtx->pMsgPipe[i]) 243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = TIMM_OSAL_DeletePipe(pRPCCtx->pMsgPipe[i]); 245e005708a4599caa650c653028bea2ccb216fc653Sarthak Aggarwal pRPCCtx->pMsgPipe[i] = NULL; 246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (eError != TIMM_OSAL_ERR_NONE) 247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_ERROR("Pipe deletion failed"); 249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eRPCError = RPC_OMX_ErrorUndefined; 250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_DEBUG("Closing the omx fd"); 255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pRPCCtx->fd_omx) 256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status = close(pRPCCtx->fd_omx); 258e005708a4599caa650c653028bea2ccb216fc653Sarthak Aggarwal pRPCCtx->fd_omx = 0; 259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (status != 0) 260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_ERROR("Close failed on omx fd"); 262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eRPCError = RPC_OMX_ErrorUndefined; 263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 265e005708a4599caa650c653028bea2ccb216fc653Sarthak Aggarwal 266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Free(pRPCCtx); 267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 268e005708a4599caa650c653028bea2ccb216fc653Sarthak Aggarwal EXIT: 269e005708a4599caa650c653028bea2ccb216fc653Sarthak Aggarwal return eRPCError; 270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* ===========================================================================*/ 275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @name RPC_CallbackThread() 277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @brief This is the entry function of the thread which keeps spinning, waiting 278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* for messages from Ducati. 279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param data [IN] : The RPC Context structure is passed here. 280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @return RPC_OMX_ErrorNone = Successful 281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/ 282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* ===========================================================================*/ 283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid *RPC_CallbackThread(void *data) 284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_PTR pBuffer = NULL; 286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_OMX_CONTEXT *pRPCCtx = (RPC_OMX_CONTEXT *) data; 287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev fd_set readfds; 288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_S32 maxfd = 0, status = 0; 289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 nFxnIdx = 0, nPacketSize = RPC_PACKET_SIZE, nPos = 0; 290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone; 291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE; 292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_COMPONENTTYPE *hComp = NULL; 293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev PROXY_COMPONENT_PRIVATE *pCompPrv = NULL; 294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev maxfd = 296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (pRPCCtx->fd_killcb > 297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pRPCCtx->fd_omx ? pRPCCtx->fd_killcb : pRPCCtx->fd_omx) + 1; 298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev while (1) 299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev FD_ZERO(&readfds); 301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev FD_SET(pRPCCtx->fd_omx, &readfds); 302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev FD_SET(pRPCCtx->fd_killcb, &readfds); 303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_DEBUG("Waiting for messages from remote core"); 305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status = select(maxfd, &readfds, NULL, NULL, NULL); 306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_assert(status > 0, RPC_OMX_ErrorUndefined, 307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "select failed"); 308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (FD_ISSET(pRPCCtx->fd_killcb, &readfds)) 310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_DEBUG("Recd. kill message - exiting the thread"); 312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (FD_ISSET(pRPCCtx->fd_omx, &readfds)) 316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DOMX_DEBUG("Recd. omx message"); 318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_getPacket(nPacketSize, pBuffer); 319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status = read(pRPCCtx->fd_omx, pBuffer, nPacketSize); 320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(status < 0) 321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(errno == ENXIO) 323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /*Indicate fatal error and exit*/ 325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_assert(0, RPC_OMX_ErrorHardware, 326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "Remote processor fatal error"); 327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_assert(0, RPC_OMX_ErrorUndefined, 331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "read failed"); 332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev nPos = 0; 336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev nFxnIdx = ((struct omx_packet *) pBuffer)->fxn_idx; 337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /*Indices from static table will have bit 31 set */ 338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (nFxnIdx & 0x80000000) 339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev nFxnIdx &= 0x0FFFFFFF; 340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_assert(nFxnIdx < RPC_OMX_MAX_FUNCTION_LIST, 341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_OMX_ErrorUndefined, 342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "Bad function index recd"); 343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch (nFxnIdx) 344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case RPC_OMX_FXN_IDX_EVENTHANDLER: 346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_SKEL_EventHandler(((struct omx_packet *) 347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pBuffer)->data); 348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_freePacket(pBuffer); 349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pBuffer = NULL; 350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case RPC_OMX_FXN_IDX_EMPTYBUFFERDONE: 352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_SKEL_EmptyBufferDone(((struct omx_packet *) 353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pBuffer)->data); 354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_freePacket(pBuffer); 355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pBuffer = NULL; 356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case RPC_OMX_FXN_IDX_FILLBUFFERDONE: 358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_SKEL_FillBufferDone(((struct omx_packet *) 359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pBuffer)->data); 360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_freePacket(pBuffer); 361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pBuffer = NULL; 362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = 365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_WriteToPipe(pRPCCtx-> 366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pMsgPipe[nFxnIdx], &pBuffer, 367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_MSG_SIZE_FOR_PIPE, TIMM_OSAL_SUSPEND); 368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_assert(eError == TIMM_OSAL_ERR_NONE, 369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_OMX_ErrorUndefined, 370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "Write to pipe failed"); 371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevEXIT: 375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (eRPCError != RPC_OMX_ErrorNone) 376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //AD TODO: Send error CB to client and then go back in loop to wait for killfd 378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pBuffer != NULL) 379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_freePacket(pBuffer); 381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pBuffer = NULL; 382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /*Report all hardware errors as fatal and exit from listener thread*/ 384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (eRPCError == RPC_OMX_ErrorHardware) 385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /*Implicit detail: pAppData is proxy component handle updated during 387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RPC_GetHandle*/ 388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev hComp = (OMX_COMPONENTTYPE *) pRPCCtx->pAppData; 389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(hComp != NULL) 390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate; 392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /*Indicate fatal error. Users are expected to cleanup the OMX instance 393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev to ensure all resources are cleaned up.*/ 394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pCompPrv->proxyEventHandler(hComp, pCompPrv->pILAppData, OMX_EventError, 395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ErrorHardware, 0, NULL); 396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return (void*)0; 402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 403