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