1f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal#include <stdio.h>
2f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal#include <string.h>
3f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal#include <assert.h>
4f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal#include "omx_proxy_common.h"
5f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal#include <timm_osal_interfaces.h>
63cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal#include <sys/ioctl.h>
73cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal#include <errno.h>
83cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal#include <sys/stat.h>
93cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal#include <fcntl.h>
10f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal
11f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal#define COMPONENT_NAME "OMX.TI.DUCATI1.VIDEO.DECODER.secure"
12f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal
133cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwalextern OMX_U32 DUCATI_IN_SECURE_MODE;
143cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwalextern OMX_U32 SECURE_COMPONENTS_RUNNING;
153cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
163cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwalextern OMX_ERRORTYPE OMX_ProxyViddecInit(OMX_HANDLETYPE hComponent);
173cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak AggarwalOMX_ERRORTYPE PROXY_VIDDEC_Secure_ComponentDeInit(OMX_HANDLETYPE hComponent);
183cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
19f94e0fb97765a9927e21028499f43771264f37cbSarthak AggarwalOMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE hComponent)
20f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal{
21f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	OMX_ERRORTYPE eError = OMX_ErrorNone;
22f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	OMX_COMPONENTTYPE *pHandle = NULL;
23f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	PROXY_COMPONENT_PRIVATE *pComponentPrivate = NULL;
242a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	const OMX_U8 enable = 1, disable = 0;
252a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        OMX_U8 mode;
263cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	int ret;
273cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
28f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	pHandle = (OMX_COMPONENTTYPE *) hComponent;
29f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal
30f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	DOMX_ENTER("");
31f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal
32f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	DOMX_DEBUG("Component name provided is %s", COMPONENT_NAME);
33f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal
34f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	pHandle->pComponentPrivate =
35f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	    (PROXY_COMPONENT_PRIVATE *)
36f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	    TIMM_OSAL_Malloc(sizeof(PROXY_COMPONENT_PRIVATE), TIMM_OSAL_TRUE,
37f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	    0, TIMMOSAL_MEM_SEGMENT_INT);
38f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal
39f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	PROXY_assert(pHandle->pComponentPrivate != NULL,
40f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	    OMX_ErrorInsufficientResources,
41f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	    "ERROR IN ALLOCATING PROXY COMPONENT PRIVATE STRUCTURE");
42f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal
43f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	pComponentPrivate =
44f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	    (PROXY_COMPONENT_PRIVATE *) pHandle->pComponentPrivate;
45f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal
46f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	TIMM_OSAL_Memset(pComponentPrivate, 0,
47f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal		sizeof(PROXY_COMPONENT_PRIVATE));
48f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal
49f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	pComponentPrivate->cCompName =
50f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	    TIMM_OSAL_Malloc(MAX_COMPONENT_NAME_LENGTH * sizeof(OMX_U8),
51f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	    TIMM_OSAL_TRUE, 0, TIMMOSAL_MEM_SEGMENT_INT);
52f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal
53f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	PROXY_assert(pComponentPrivate->cCompName != NULL,
54f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	    OMX_ErrorInsufficientResources,
55f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	    " Error in Allocating space for proxy component table");
56f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal
57f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	// Copying component Name - this will be picked up in the proxy common
58f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	PROXY_assert(strlen(COMPONENT_NAME) + 1 < MAX_COMPONENT_NAME_LENGTH,
59f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	    OMX_ErrorInvalidComponentName,
60f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	    "Length of component name is longer than the max allowed");
61f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	TIMM_OSAL_Memcpy(pComponentPrivate->cCompName, COMPONENT_NAME,
62f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	    strlen(COMPONENT_NAME) + 1);
63f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal
642a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	pComponentPrivate->secure_misc_drv_fd = open("/dev/rproc_user", O_SYNC | O_RDWR);
652a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	if (pComponentPrivate->secure_misc_drv_fd < 0)
663cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	{
672a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal		DOMX_ERROR("Can't open rproc_user device 0x%x\n", errno);
682a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal		return OMX_ErrorInsufficientResources;
693cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	}
703cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
712a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        ret = write(pComponentPrivate->secure_misc_drv_fd, &enable, sizeof(enable));
722a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        if(ret != 1)
732a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        {
742a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal            DOMX_ERROR("errno from setting secure mode = %x",errno);
752a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	    ret = write(pComponentPrivate->secure_misc_drv_fd, &disable, sizeof(disable));
762a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	    if (ret < 0)
772a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	    {
782a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	        DOMX_ERROR("Setting unsecure mode failed");
792a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal            }
802a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal
812a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	    ret = close(pComponentPrivate->secure_misc_drv_fd);
822a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	    if (ret < 0)
832a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	    {
842a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal		DOMX_ERROR("Can't close the driver");
852a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	    }
862a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal            eError = OMX_ErrorInsufficientResources;
872a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal            goto EXIT;
882a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        }
892a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal
902a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	ret = read(pComponentPrivate->secure_misc_drv_fd, &mode, sizeof(mode));
912a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	PROXY_assert(mode == enable, OMX_ErrorUndefined,"ERROR: We are not in secure mode");
922a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	DOMX_DEBUG("secure mode recieved from Misc driver for secure playback = 0x%x\n", mode);
933cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
94f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	eError = OMX_ProxyViddecInit(hComponent);
953cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	pHandle->ComponentDeInit = PROXY_VIDDEC_Secure_ComponentDeInit;
96f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal
97f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal#ifdef USE_ION
98f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	pComponentPrivate->bUseIon = OMX_TRUE;
99f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	pComponentPrivate->bMapIonBuffers = OMX_FALSE;
100f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal#endif
101f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal	EXIT:
1022a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal                if(eError != OMX_ErrorNone)
1032a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal                {
1042a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal                    TIMM_OSAL_Free(pHandle->pComponentPrivate);
1052a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal                    pHandle->pComponentPrivate = NULL;
1062a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal                }
107f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal		return eError;
108f94e0fb97765a9927e21028499f43771264f37cbSarthak Aggarwal}
1093cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
1103cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak AggarwalOMX_ERRORTYPE PROXY_VIDDEC_Secure_ComponentDeInit(OMX_HANDLETYPE hComponent)
1113cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal{
1123cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	OMX_ERRORTYPE eError = OMX_ErrorNone;
1133cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	OMX_COMPONENTTYPE *pHandle = NULL;
1143cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	PROXY_COMPONENT_PRIVATE *pComponentPrivate = NULL;
1153cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	int ret;
1162a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	const OMX_U8 disable = 0;
1173cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal        int secure_misc_drv_fd;
1183cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
1193cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	pHandle = (OMX_COMPONENTTYPE *) hComponent;
1203cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
1213cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	pComponentPrivate =
1223cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	    (PROXY_COMPONENT_PRIVATE *) pHandle->pComponentPrivate;
1233cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
1243cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal        secure_misc_drv_fd = pComponentPrivate->secure_misc_drv_fd;
1253cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
1263cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal        eError = PROXY_ComponentDeInit(hComponent);
1273cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal        if(eError != OMX_ErrorNone)
1283cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal        {
1293cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal                DOMX_ERROR("Proxy common deinit returned error = %x",eError);
1303cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal        }
1313cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal        pComponentPrivate = NULL;
1323cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
1332a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        ret = write(secure_misc_drv_fd, &disable, sizeof(disable));
1342a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	if (ret < 0)
1353cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	{
1362a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	        DOMX_ERROR("Setting unsecure mode failed");
1372a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        }
1383cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
1392a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	ret = close(secure_misc_drv_fd);
1402a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	if (ret < 0)
1412a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	{
1422a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal		DOMX_ERROR("Can't close the driver");
1432a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	}
1443cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
1453cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	return eError;
1463cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal}
1473cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
148