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