xref: /utopia/UTPA2-700.0.x/modules/msos/utopia_core/optee/utopia.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi #include "utopia_private.h"
2*53ee8cc1Swenshuai.xi #include "utopia_module.h"
3*53ee8cc1Swenshuai.xi #include <stdio.h>
4*53ee8cc1Swenshuai.xi #include "utopia.h"
5*53ee8cc1Swenshuai.xi #include "utopia_dapi.h"
6*53ee8cc1Swenshuai.xi #include "string.h"
7*53ee8cc1Swenshuai.xi #include "MsOS.h"
8*53ee8cc1Swenshuai.xi #include "ULog.h"
9*53ee8cc1Swenshuai.xi 
10*53ee8cc1Swenshuai.xi //Global Variable===================================================
11*53ee8cc1Swenshuai.xi UTOPIA_PRIVATE* psUtopiaPrivate;
12*53ee8cc1Swenshuai.xi 
13*53ee8cc1Swenshuai.xi char moduleNames[][40] = {
14*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) "MODULE_"#MODULE,
15*53ee8cc1Swenshuai.xi 	INCLUDED_MODULE
16*53ee8cc1Swenshuai.xi #undef PREFIX
17*53ee8cc1Swenshuai.xi };
18*53ee8cc1Swenshuai.xi 
19*53ee8cc1Swenshuai.xi char rpoolNames[][40] = {
20*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) "RPOOL_"#MODULE,
21*53ee8cc1Swenshuai.xi 	INCLUDED_MODULE
22*53ee8cc1Swenshuai.xi #undef PREFIX
23*53ee8cc1Swenshuai.xi };
24*53ee8cc1Swenshuai.xi 
25*53ee8cc1Swenshuai.xi char ResourceNames[][40] = {
26*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) "RESOURCE_"#MODULE,
27*53ee8cc1Swenshuai.xi 	INCLUDED_MODULE
28*53ee8cc1Swenshuai.xi #undef PREFIX
29*53ee8cc1Swenshuai.xi };
30*53ee8cc1Swenshuai.xi 
31*53ee8cc1Swenshuai.xi void AESDMARegisterToUtopia(FUtopiaOpen ModuleType);
32*53ee8cc1Swenshuai.xi void SYSRegisterToUtopia(FUtopiaOpen ModuleType);
33*53ee8cc1Swenshuai.xi void DSCMBRegisterToUtopia();
34*53ee8cc1Swenshuai.xi void XCRegisterToUtopia(FUtopiaOpen ModuleType);
35*53ee8cc1Swenshuai.xi void SEMRegisterToUtopia(FUtopiaOpen ModuleType);
36*53ee8cc1Swenshuai.xi void GFXRegisterToUtopia(FUtopiaOpen ModuleType);
37*53ee8cc1Swenshuai.xi 
UtopiaInit()38*53ee8cc1Swenshuai.xi MS_U32 UtopiaInit()
39*53ee8cc1Swenshuai.xi {
40*53ee8cc1Swenshuai.xi 	MS_U32 u32Ret = 0;
41*53ee8cc1Swenshuai.xi 
42*53ee8cc1Swenshuai.xi 	printf("utopia init\n" );
43*53ee8cc1Swenshuai.xi 	psUtopiaPrivate = (UTOPIA_PRIVATE*)malloc(sizeof(UTOPIA_PRIVATE));
44*53ee8cc1Swenshuai.xi 	memset(psUtopiaPrivate, 0, sizeof(UTOPIA_PRIVATE));
45*53ee8cc1Swenshuai.xi 	psUtopiaPrivate->u32MutexID = MsOS_CreateMutex(E_MSOS_FIFO
46*53ee8cc1Swenshuai.xi 			, "UtopiaPrivateMutex", MSOS_PROCESS_SHARED);
47*53ee8cc1Swenshuai.xi 
48*53ee8cc1Swenshuai.xi 	MsOS_ObtainMutex(psUtopiaPrivate->u32MutexID, MSOS_WAIT_FOREVER);
49*53ee8cc1Swenshuai.xi 	/*
50*53ee8cc1Swenshuai.xi 	 * to avoid weak attribute malfunction in static lib,
51*53ee8cc1Swenshuai.xi 	 * we explicitly call needed functions
52*53ee8cc1Swenshuai.xi 	 */
53*53ee8cc1Swenshuai.xi 
54*53ee8cc1Swenshuai.xi 	AESDMARegisterToUtopia((FUtopiaOpen)MODULE_TYPE_AESDMA_FULL);
55*53ee8cc1Swenshuai.xi 	SYSRegisterToUtopia(NULL);
56*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_OPTEE
57*53ee8cc1Swenshuai.xi 	DSCMBRegisterToUtopia();
58*53ee8cc1Swenshuai.xi #endif
59*53ee8cc1Swenshuai.xi     XCRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_XC_TEE);
60*53ee8cc1Swenshuai.xi     DACRegisterToUtopia();
61*53ee8cc1Swenshuai.xi     TVENCODERRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_TVENCODER_FULL);
62*53ee8cc1Swenshuai.xi     ACPRegisterToUtopia();
63*53ee8cc1Swenshuai.xi     SEMRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_SEM_FULL);
64*53ee8cc1Swenshuai.xi     GFXRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_GFX_FULL);
65*53ee8cc1Swenshuai.xi 
66*53ee8cc1Swenshuai.xi 	MsOS_ReleaseMutex(psUtopiaPrivate->u32MutexID);
67*53ee8cc1Swenshuai.xi 	return u32Ret;
68*53ee8cc1Swenshuai.xi }
69*53ee8cc1Swenshuai.xi 
UtopiaOpen(MS_U32 u32ModuleID,void ** ppInstanceTmp,MS_U32 u32ModuleVersion,const void * const pAttribute)70*53ee8cc1Swenshuai.xi MS_U32 UtopiaOpen(MS_U32 u32ModuleID, void** ppInstanceTmp
71*53ee8cc1Swenshuai.xi 		, MS_U32 u32ModuleVersion, const void* const pAttribute)
72*53ee8cc1Swenshuai.xi {
73*53ee8cc1Swenshuai.xi     UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
74*53ee8cc1Swenshuai.xi     UTOPIA_INSTANCE** ppInstance = (UTOPIA_INSTANCE**)ppInstanceTmp;
75*53ee8cc1Swenshuai.xi 
76*53ee8cc1Swenshuai.xi 
77*53ee8cc1Swenshuai.xi     // psUtopiaInstant->u32OpenThreadName = pthred_ctrl(get_name); // FIXME: need to be discussed implementation
78*53ee8cc1Swenshuai.xi     while(psUtopiaModule != NULL)
79*53ee8cc1Swenshuai.xi     {
80*53ee8cc1Swenshuai.xi         if(psUtopiaModule->u32ModuleID == u32ModuleID)//need modify to link list
81*53ee8cc1Swenshuai.xi         {
82*53ee8cc1Swenshuai.xi             int ret = psUtopiaModule->fpOpen((void**)ppInstance, pAttribute);
83*53ee8cc1Swenshuai.xi 
84*53ee8cc1Swenshuai.xi             if(ret)
85*53ee8cc1Swenshuai.xi             {
86*53ee8cc1Swenshuai.xi                 printf("[utopia error] fail to create instance\n");
87*53ee8cc1Swenshuai.xi                 return ret;
88*53ee8cc1Swenshuai.xi             }
89*53ee8cc1Swenshuai.xi 
90*53ee8cc1Swenshuai.xi             (*ppInstance)->psModule = psUtopiaModule;
91*53ee8cc1Swenshuai.xi 			(*ppInstance)->u32AppRequireModuleVersion = u32ModuleVersion;
92*53ee8cc1Swenshuai.xi             return ret;
93*53ee8cc1Swenshuai.xi         }
94*53ee8cc1Swenshuai.xi         psUtopiaModule = psUtopiaModule->psNext;
95*53ee8cc1Swenshuai.xi     }
96*53ee8cc1Swenshuai.xi 	return 0xFFFFFFFF; // FIXME: 1. error code, 2. to avoid possible fpOpen return value
97*53ee8cc1Swenshuai.xi }
98*53ee8cc1Swenshuai.xi 
UtopiaIoctl(void * pInstanceTmp,MS_U32 u32Cmd,void * const pArgs)99*53ee8cc1Swenshuai.xi MS_U32 UtopiaIoctl(void* pInstanceTmp, MS_U32 u32Cmd, void* const pArgs)
100*53ee8cc1Swenshuai.xi {
101*53ee8cc1Swenshuai.xi 	UTOPIA_INSTANCE* pInstance = (UTOPIA_INSTANCE*)pInstanceTmp;
102*53ee8cc1Swenshuai.xi     return ((UTOPIA_INSTANCE*)pInstance)->psModule->fpIoctl(pInstance, u32Cmd, pArgs);
103*53ee8cc1Swenshuai.xi }
104*53ee8cc1Swenshuai.xi 
UtopiaClose(void * pInstantTmp)105*53ee8cc1Swenshuai.xi MS_U32 UtopiaClose(void* pInstantTmp)
106*53ee8cc1Swenshuai.xi {
107*53ee8cc1Swenshuai.xi     UTOPIA_INSTANCE* pInstant = (UTOPIA_INSTANCE*)pInstantTmp;
108*53ee8cc1Swenshuai.xi 
109*53ee8cc1Swenshuai.xi     UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
110*53ee8cc1Swenshuai.xi     while(psUtopiaModule != NULL)
111*53ee8cc1Swenshuai.xi     {
112*53ee8cc1Swenshuai.xi         if(psUtopiaModule->u32ModuleID == pInstant->psModule->u32ModuleID)
113*53ee8cc1Swenshuai.xi         {
114*53ee8cc1Swenshuai.xi             return psUtopiaModule->fpClose(pInstant);
115*53ee8cc1Swenshuai.xi         }
116*53ee8cc1Swenshuai.xi         psUtopiaModule = psUtopiaModule->psNext;
117*53ee8cc1Swenshuai.xi     }
118*53ee8cc1Swenshuai.xi 	return 0;
119*53ee8cc1Swenshuai.xi }
120*53ee8cc1Swenshuai.xi 
121