xref: /utopia/UTPA2-700.0.x/modules/msos/utopia_core/linux/utopia.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi 
2*53ee8cc1Swenshuai.xi //************************Kernel Module Define********************************//
3*53ee8cc1Swenshuai.xi //Please Don't Change Code Order.
4*53ee8cc1Swenshuai.xi #include "MsTypes.h"
5*53ee8cc1Swenshuai.xi #include "utopia_driver_id.h"
6*53ee8cc1Swenshuai.xi 
7*53ee8cc1Swenshuai.xi #if 0
8*53ee8cc1Swenshuai.xi typedef enum{
9*53ee8cc1Swenshuai.xi #define PREFIX(MODULE)  CONFIG_API_##MODULE##_MODULE=0,
10*53ee8cc1Swenshuai.xi     INCLUDED_MODULE
11*53ee8cc1Swenshuai.xi #undef PREFIX
12*53ee8cc1Swenshuai.xi }eCONFIG_API_MODULE;
13*53ee8cc1Swenshuai.xi 
14*53ee8cc1Swenshuai.xi typedef enum{
15*53ee8cc1Swenshuai.xi #define PREFIX(MODULE)  CONFIG_DRV_##MODULE##_MODULE=0,
16*53ee8cc1Swenshuai.xi     INCLUDED_MODULE
17*53ee8cc1Swenshuai.xi #undef PREFIX
18*53ee8cc1Swenshuai.xi }eCONFIG_DRV_MODULE;
19*53ee8cc1Swenshuai.xi #endif
20*53ee8cc1Swenshuai.xi 
21*53ee8cc1Swenshuai.xi #ifdef CONFIG_ENABLE_MENUCONFIG
22*53ee8cc1Swenshuai.xi #include <autoconf.h>
23*53ee8cc1Swenshuai.xi #endif
24*53ee8cc1Swenshuai.xi //*************************************************************************//
25*53ee8cc1Swenshuai.xi 
26*53ee8cc1Swenshuai.xi #include "MsCommon.h"
27*53ee8cc1Swenshuai.xi #include "utopia_private.h"
28*53ee8cc1Swenshuai.xi #include "utopia.h"
29*53ee8cc1Swenshuai.xi #include "utopia_dapi.h"
30*53ee8cc1Swenshuai.xi #include "MsOS.h"
31*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
32*53ee8cc1Swenshuai.xi 
33*53ee8cc1Swenshuai.xi #if defined(CONFIG_UTOPIA_FRAMEWORK_KERNEL_DRIVER)
34*53ee8cc1Swenshuai.xi #include <sys/ioctl.h>
35*53ee8cc1Swenshuai.xi #include <sys/types.h>
36*53ee8cc1Swenshuai.xi #include <sys/stat.h>
37*53ee8cc1Swenshuai.xi #include <fcntl.h>
38*53ee8cc1Swenshuai.xi #include <unistd.h>
39*53ee8cc1Swenshuai.xi #include <errno.h>
40*53ee8cc1Swenshuai.xi #endif
41*53ee8cc1Swenshuai.xi 
42*53ee8cc1Swenshuai.xi #if !defined(MSOS_TYPE_LINUX_KERNEL)
43*53ee8cc1Swenshuai.xi #include <stdio.h>
44*53ee8cc1Swenshuai.xi #include <string.h>
45*53ee8cc1Swenshuai.xi #else
46*53ee8cc1Swenshuai.xi #include <linux/string.h>
47*53ee8cc1Swenshuai.xi #include <linux/slab.h>
48*53ee8cc1Swenshuai.xi #endif
49*53ee8cc1Swenshuai.xi 
50*53ee8cc1Swenshuai.xi UTOPIA_PRIVATE* psUtopiaPrivate;
51*53ee8cc1Swenshuai.xi 
52*53ee8cc1Swenshuai.xi char moduleNames[][40] = {
53*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) "MODULE_"#MODULE,
54*53ee8cc1Swenshuai.xi 	INCLUDED_MODULE
55*53ee8cc1Swenshuai.xi #undef PREFIX
56*53ee8cc1Swenshuai.xi };
57*53ee8cc1Swenshuai.xi 
58*53ee8cc1Swenshuai.xi char rpoolNames[][40] = {
59*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) "RPOOL_"#MODULE,
60*53ee8cc1Swenshuai.xi 	INCLUDED_MODULE
61*53ee8cc1Swenshuai.xi #undef PREFIX
62*53ee8cc1Swenshuai.xi };
63*53ee8cc1Swenshuai.xi 
64*53ee8cc1Swenshuai.xi char ResourceNames[][40] = {
65*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) "RESOURCE_"#MODULE,
66*53ee8cc1Swenshuai.xi 	INCLUDED_MODULE
67*53ee8cc1Swenshuai.xi #undef PREFIX
68*53ee8cc1Swenshuai.xi };
69*53ee8cc1Swenshuai.xi 
70*53ee8cc1Swenshuai.xi unsigned int moduleMode[] = {
71*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) 0,
72*53ee8cc1Swenshuai.xi 	INCLUDED_MODULE
73*53ee8cc1Swenshuai.xi #undef PREFIX
74*53ee8cc1Swenshuai.xi };
75*53ee8cc1Swenshuai.xi 
76*53ee8cc1Swenshuai.xi #if 0//defined(CONFIG_UTOPIA_FRAMEWORK_KERNEL_DRIVER)
77*53ee8cc1Swenshuai.xi 
78*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) MS_U32 MODULE_##MODULE##_OPEN = MODULE_##MODULE | \
79*53ee8cc1Swenshuai.xi     ((CONFIG_API_##MODULE##_MODULE | CONFIG_DRV_##MODULE##_MODULE) << 31);
80*53ee8cc1Swenshuai.xi INCLUDED_MODULE
81*53ee8cc1Swenshuai.xi #undef PREFIX
82*53ee8cc1Swenshuai.xi 
83*53ee8cc1Swenshuai.xi #endif
84*53ee8cc1Swenshuai.xi 
85*53ee8cc1Swenshuai.xi #define UTOPIA_VERSION "libutopia-v02.01-20170812"
86*53ee8cc1Swenshuai.xi MS_U32 UTOPIARegisterToUtopia(FUtopiaOpen ModuleType);
87*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) \
88*53ee8cc1Swenshuai.xi 	extern MS_U32 MODULE##RegisterToUtopia(FUtopiaOpen ModuleType);
89*53ee8cc1Swenshuai.xi _INCLUDED_MODULE
90*53ee8cc1Swenshuai.xi #undef PREFIX
91*53ee8cc1Swenshuai.xi 
92*53ee8cc1Swenshuai.xi //#define CONFIG_UTOPIA_MODE_BY_BOOTARQ
93*53ee8cc1Swenshuai.xi 
94*53ee8cc1Swenshuai.xi #ifdef CONFIG_UTOPIA_MODE_BY_BOOTARQ
95*53ee8cc1Swenshuai.xi 
96*53ee8cc1Swenshuai.xi #define BOOTARG_SIZE 2048
UtopiaParserBootArg(char * source,char * pattern,unsigned int size)97*53ee8cc1Swenshuai.xi static unsigned int UtopiaParserBootArg(char* source,char* pattern,unsigned int size)
98*53ee8cc1Swenshuai.xi {
99*53ee8cc1Swenshuai.xi     char sCmdline[BOOTARG_SIZE]={0};
100*53ee8cc1Swenshuai.xi     FILE* fpProcCmdlineFile = NULL;
101*53ee8cc1Swenshuai.xi     int u32ReadCount = 0;
102*53ee8cc1Swenshuai.xi     char* pFindString = NULL;
103*53ee8cc1Swenshuai.xi     char* sTemp = NULL;
104*53ee8cc1Swenshuai.xi 
105*53ee8cc1Swenshuai.xi     unsigned int u32CmdlineLen = 0;
106*53ee8cc1Swenshuai.xi 
107*53ee8cc1Swenshuai.xi 
108*53ee8cc1Swenshuai.xi     fpProcCmdlineFile = fopen("/proc/cmdline","r");
109*53ee8cc1Swenshuai.xi 
110*53ee8cc1Swenshuai.xi     if(fpProcCmdlineFile==NULL)
111*53ee8cc1Swenshuai.xi     {
112*53ee8cc1Swenshuai.xi         printu("[utopia info]%d : can't open /proc/cmdline",__LINE__);
113*53ee8cc1Swenshuai.xi         return 0;
114*53ee8cc1Swenshuai.xi     }
115*53ee8cc1Swenshuai.xi 
116*53ee8cc1Swenshuai.xi     u32ReadCount = fread(sCmdline,1,BOOTARG_SIZE,fpProcCmdlineFile);
117*53ee8cc1Swenshuai.xi 
118*53ee8cc1Swenshuai.xi     if(u32ReadCount > BOOTARG_SIZE)
119*53ee8cc1Swenshuai.xi     {
120*53ee8cc1Swenshuai.xi         printu("[utopia info]%d warring : cmdline info more than buffer size\n",__LINE__);
121*53ee8cc1Swenshuai.xi     }
122*53ee8cc1Swenshuai.xi     u32CmdlineLen = strlen(sCmdline);
123*53ee8cc1Swenshuai.xi 
124*53ee8cc1Swenshuai.xi     //printu("[utopia info]:cmdline = %s \n",sCmdline);
125*53ee8cc1Swenshuai.xi     //printu("[utopia info]:string len = %d \n",u32CmdlineLen);
126*53ee8cc1Swenshuai.xi 
127*53ee8cc1Swenshuai.xi     pFindString=strstr(sCmdline,pattern);
128*53ee8cc1Swenshuai.xi 
129*53ee8cc1Swenshuai.xi     if(pFindString==NULL)
130*53ee8cc1Swenshuai.xi     {
131*53ee8cc1Swenshuai.xi 		printu("[utopia info] can't serch %s in bootargs \n",pattern);
132*53ee8cc1Swenshuai.xi         return 0;
133*53ee8cc1Swenshuai.xi     }
134*53ee8cc1Swenshuai.xi     sTemp = sCmdline;
135*53ee8cc1Swenshuai.xi     while(strsep(&sTemp," "));  //covert space to "\0"
136*53ee8cc1Swenshuai.xi 
137*53ee8cc1Swenshuai.xi     sTemp=strsep(&pFindString,"=");
138*53ee8cc1Swenshuai.xi 
139*53ee8cc1Swenshuai.xi     u32ReadCount = strlen(pFindString);
140*53ee8cc1Swenshuai.xi 
141*53ee8cc1Swenshuai.xi     if(u32ReadCount>size)
142*53ee8cc1Swenshuai.xi     {
143*53ee8cc1Swenshuai.xi         strncpy(source, pFindString, size);
144*53ee8cc1Swenshuai.xi         u32ReadCount = size;
145*53ee8cc1Swenshuai.xi     }else
146*53ee8cc1Swenshuai.xi     {
147*53ee8cc1Swenshuai.xi         strncpy(source, pFindString, u32ReadCount);
148*53ee8cc1Swenshuai.xi     }
149*53ee8cc1Swenshuai.xi 
150*53ee8cc1Swenshuai.xi     //printu("%s\n",pFindString);
151*53ee8cc1Swenshuai.xi     //printu("lens = %d\n",strlen(pFindString));
152*53ee8cc1Swenshuai.xi 
153*53ee8cc1Swenshuai.xi     return u32ReadCount;
154*53ee8cc1Swenshuai.xi }
155*53ee8cc1Swenshuai.xi #endif
156*53ee8cc1Swenshuai.xi #ifndef CONFIG_UTOPIA_MODE_DEFAULT_KERNEL
UtopiaConfigReadFile(char * filePath)157*53ee8cc1Swenshuai.xi static MS_U32 UtopiaConfigReadFile(char* filePath)
158*53ee8cc1Swenshuai.xi {
159*53ee8cc1Swenshuai.xi     char sModule[40], sEqual[20];
160*53ee8cc1Swenshuai.xi     unsigned int u32moduleMode = 0;
161*53ee8cc1Swenshuai.xi     unsigned int u32Cnt =0;
162*53ee8cc1Swenshuai.xi     char sConf[50], *tok=" \n", *pch;
163*53ee8cc1Swenshuai.xi     int len = 0;
164*53ee8cc1Swenshuai.xi 
165*53ee8cc1Swenshuai.xi     FILE* fpUtopiaModuleMode = NULL;
166*53ee8cc1Swenshuai.xi 
167*53ee8cc1Swenshuai.xi #ifdef CONFIG_UTOPIA_MODE_BY_BOOTARQ
168*53ee8cc1Swenshuai.xi     char sFilePathFormBootArq[40] = {0};
169*53ee8cc1Swenshuai.xi     unsigned int u32RetParserBootArg = 0;
170*53ee8cc1Swenshuai.xi     u32RetParserBootArg = UtopiaParserBootArg(sFilePathFormBootArq,"utopia_mode",40);
171*53ee8cc1Swenshuai.xi 
172*53ee8cc1Swenshuai.xi     if(u32RetParserBootArg == 0)
173*53ee8cc1Swenshuai.xi         return 0;
174*53ee8cc1Swenshuai.xi 
175*53ee8cc1Swenshuai.xi     //printu("utopia_conf path : %s \n",sFilePathFormBootArq);
176*53ee8cc1Swenshuai.xi     printu("[utopia info] open: %s\n", sFilePathFormBootArq);
177*53ee8cc1Swenshuai.xi     fpUtopiaModuleMode = fopen(sFilePathFormBootArq, "r");
178*53ee8cc1Swenshuai.xi #else
179*53ee8cc1Swenshuai.xi     printu("[utopia info] open: %s\n", CONFIG_UTOPIAXP_CONF_PATH);
180*53ee8cc1Swenshuai.xi     fpUtopiaModuleMode = fopen(CONFIG_UTOPIAXP_CONF_PATH, "r");
181*53ee8cc1Swenshuai.xi     if(fpUtopiaModuleMode==NULL)  //forward compatible ,remove later
182*53ee8cc1Swenshuai.xi     {
183*53ee8cc1Swenshuai.xi         fpUtopiaModuleMode = fopen("/data/utopia.conf", "r");
184*53ee8cc1Swenshuai.xi     }
185*53ee8cc1Swenshuai.xi #endif
186*53ee8cc1Swenshuai.xi     if(fpUtopiaModuleMode==NULL)
187*53ee8cc1Swenshuai.xi     {
188*53ee8cc1Swenshuai.xi         printu("[utopia info] don't have utopia.conf\n");
189*53ee8cc1Swenshuai.xi         return 0;
190*53ee8cc1Swenshuai.xi     }
191*53ee8cc1Swenshuai.xi 
192*53ee8cc1Swenshuai.xi     // coverity[secure_coding]
193*53ee8cc1Swenshuai.xi     while(fgets(sConf,sizeof(sConf),fpUtopiaModuleMode)!=NULL)
194*53ee8cc1Swenshuai.xi     {
195*53ee8cc1Swenshuai.xi         if(strncmp(sConf,"MODULE_",7)!=0)
196*53ee8cc1Swenshuai.xi         {
197*53ee8cc1Swenshuai.xi             continue;
198*53ee8cc1Swenshuai.xi         }
199*53ee8cc1Swenshuai.xi         memset(sModule,0,sizeof(sModule));
200*53ee8cc1Swenshuai.xi         memset(sEqual,0,sizeof(sEqual));
201*53ee8cc1Swenshuai.xi         pch = strtok(sConf, tok);
202*53ee8cc1Swenshuai.xi         len = (strlen(pch)>sizeof(sModule))?sizeof(sModule):strlen(pch);
203*53ee8cc1Swenshuai.xi         strncpy(sModule,pch,len);
204*53ee8cc1Swenshuai.xi         pch = strtok(NULL, tok);
205*53ee8cc1Swenshuai.xi         len = (strlen(pch)>sizeof(sEqual))?sizeof(sEqual):strlen(pch);
206*53ee8cc1Swenshuai.xi         strncpy(sEqual,pch,len);
207*53ee8cc1Swenshuai.xi         pch = strtok(NULL, tok);
208*53ee8cc1Swenshuai.xi         u32moduleMode = atoi(pch);
209*53ee8cc1Swenshuai.xi         //printf("11. %s %s %d\n", sModule, sEqual, u32moduleMode);
210*53ee8cc1Swenshuai.xi 
211*53ee8cc1Swenshuai.xi         for(u32Cnt = 0;u32Cnt<eMODULE_END;u32Cnt++)
212*53ee8cc1Swenshuai.xi         {
213*53ee8cc1Swenshuai.xi             if (0== strcmp((const char*)sModule, (const char*)moduleNames[u32Cnt]))
214*53ee8cc1Swenshuai.xi             {
215*53ee8cc1Swenshuai.xi                 if(u32moduleMode == 1)
216*53ee8cc1Swenshuai.xi                 {
217*53ee8cc1Swenshuai.xi                     moduleMode[u32Cnt] = KERNEL_MODE;
218*53ee8cc1Swenshuai.xi                     printu("%s = %d \n",moduleNames[u32Cnt],u32moduleMode);
219*53ee8cc1Swenshuai.xi                 }else
220*53ee8cc1Swenshuai.xi                 {
221*53ee8cc1Swenshuai.xi                     moduleMode[u32Cnt] = 0;
222*53ee8cc1Swenshuai.xi                 }
223*53ee8cc1Swenshuai.xi                 break;
224*53ee8cc1Swenshuai.xi             }
225*53ee8cc1Swenshuai.xi 
226*53ee8cc1Swenshuai.xi         }
227*53ee8cc1Swenshuai.xi         u32moduleMode = 0 ; //init
228*53ee8cc1Swenshuai.xi     }
229*53ee8cc1Swenshuai.xi 
230*53ee8cc1Swenshuai.xi     fclose(fpUtopiaModuleMode);
231*53ee8cc1Swenshuai.xi     return 0;
232*53ee8cc1Swenshuai.xi }
233*53ee8cc1Swenshuai.xi #endif
234*53ee8cc1Swenshuai.xi 
UtopiaInit()235*53ee8cc1Swenshuai.xi MS_U32 UtopiaInit()
236*53ee8cc1Swenshuai.xi {
237*53ee8cc1Swenshuai.xi 	MS_U32 u32Ret = 0;
238*53ee8cc1Swenshuai.xi 
239*53ee8cc1Swenshuai.xi 	printu("[utopia info] utopia init version: %s\n", UTOPIA_VERSION);
240*53ee8cc1Swenshuai.xi     psUtopiaPrivate = (UTOPIA_PRIVATE*)malloc(sizeof(UTOPIA_PRIVATE));
241*53ee8cc1Swenshuai.xi 	memset(psUtopiaPrivate, 0, sizeof(UTOPIA_PRIVATE));
242*53ee8cc1Swenshuai.xi 	psUtopiaPrivate->u32MutexID = MsOS_CreateMutex(E_MSOS_FIFO
243*53ee8cc1Swenshuai.xi 			, "UtopiaPrivateMutex", MSOS_PROCESS_SHARED);
244*53ee8cc1Swenshuai.xi 
245*53ee8cc1Swenshuai.xi 	MsOS_ObtainMutex(psUtopiaPrivate->u32MutexID, MSOS_WAIT_FOREVER);
246*53ee8cc1Swenshuai.xi #ifdef CONFIG_UTOPIA_MODE_DEFAULT_KERNEL
247*53ee8cc1Swenshuai.xi #define MODULE_DEFAULT_KERNEL \
248*53ee8cc1Swenshuai.xi     PREFIX(XC) \
249*53ee8cc1Swenshuai.xi     PREFIX(DIP) \
250*53ee8cc1Swenshuai.xi     PREFIX(PNL) \
251*53ee8cc1Swenshuai.xi     PREFIX(ACE) \
252*53ee8cc1Swenshuai.xi     PREFIX(DLC) \
253*53ee8cc1Swenshuai.xi     PREFIX(PQ) \
254*53ee8cc1Swenshuai.xi     PREFIX(TVENCODER) \
255*53ee8cc1Swenshuai.xi     PREFIX(HDMIRX) \
256*53ee8cc1Swenshuai.xi     PREFIX(BDMA) \
257*53ee8cc1Swenshuai.xi     PREFIX(AESDMA) \
258*53ee8cc1Swenshuai.xi     PREFIX(HWI2C) \
259*53ee8cc1Swenshuai.xi     PREFIX(MIU) \
260*53ee8cc1Swenshuai.xi     PREFIX(VIF) \
261*53ee8cc1Swenshuai.xi     PREFIX(AVD) \
262*53ee8cc1Swenshuai.xi     PREFIX(MVOP) \
263*53ee8cc1Swenshuai.xi     PREFIX(GOP) \
264*53ee8cc1Swenshuai.xi     PREFIX(GFX) \
265*53ee8cc1Swenshuai.xi     PREFIX(GPD) \
266*53ee8cc1Swenshuai.xi     PREFIX(DTMB) \
267*53ee8cc1Swenshuai.xi     PREFIX(CEC) \
268*53ee8cc1Swenshuai.xi     PREFIX(MHL) \
269*53ee8cc1Swenshuai.xi     PREFIX(AUDIO) \
270*53ee8cc1Swenshuai.xi     PREFIX(NJPEG_EX) \
271*53ee8cc1Swenshuai.xi     PREFIX(VDEC_EX) \
272*53ee8cc1Swenshuai.xi     PREFIX(DSCMB) \
273*53ee8cc1Swenshuai.xi     PREFIX(DMX) \
274*53ee8cc1Swenshuai.xi     PREFIX(VBI) \
275*53ee8cc1Swenshuai.xi 
276*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) moduleMode[MODULE_##MODULE] = KERNEL_MODE;
277*53ee8cc1Swenshuai.xi     MODULE_DEFAULT_KERNEL
278*53ee8cc1Swenshuai.xi #undef PREFIX
279*53ee8cc1Swenshuai.xi #else
280*53ee8cc1Swenshuai.xi 	UtopiaConfigReadFile(CONFIG_UTOPIAXP_CONF_PATH);
281*53ee8cc1Swenshuai.xi #endif
282*53ee8cc1Swenshuai.xi     UTOPIARegisterToUtopia((FUtopiaOpen)MODULE_TYPE_UTOPIA_FULL);
283*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) \
284*53ee8cc1Swenshuai.xi 	if (MODULE##RegisterToUtopia != NULL && MODULE_TYPE_##MODULE##_FULL) \
285*53ee8cc1Swenshuai.xi 	{ \
286*53ee8cc1Swenshuai.xi 		u32Ret |= MODULE##RegisterToUtopia((FUtopiaOpen)MODULE_TYPE_##MODULE##_FULL); \
287*53ee8cc1Swenshuai.xi 	}
288*53ee8cc1Swenshuai.xi 	_INCLUDED_MODULE
289*53ee8cc1Swenshuai.xi #undef PREFIX
290*53ee8cc1Swenshuai.xi 	MsOS_ReleaseMutex(psUtopiaPrivate->u32MutexID);
291*53ee8cc1Swenshuai.xi 
292*53ee8cc1Swenshuai.xi 	return u32Ret;
293*53ee8cc1Swenshuai.xi }
294*53ee8cc1Swenshuai.xi 
UtopiaOpen(MS_U32 u32ModuleID,void ** ppInstanceTmp,MS_U32 u32ModuleVersion,const void * const pAttribute)295*53ee8cc1Swenshuai.xi MS_U32 UtopiaOpen(MS_U32 u32ModuleID, void** ppInstanceTmp
296*53ee8cc1Swenshuai.xi 		, MS_U32 u32ModuleVersion, const void* const pAttribute)
297*53ee8cc1Swenshuai.xi {
298*53ee8cc1Swenshuai.xi     UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
299*53ee8cc1Swenshuai.xi #if defined(CONFIG_UTOPIA_FRAMEWORK_KERNEL_DRIVER)
300*53ee8cc1Swenshuai.xi     //UTOPIA_USER_INSTANCE ** ppInstance= (UTOPIA_USER_INSTANCE**)ppInstanceTmp;
301*53ee8cc1Swenshuai.xi     MS_S32              _s32UtopiaFd = -1;
302*53ee8cc1Swenshuai.xi 	UTOPIA_DDI_OPEN_ARG sOpenArg;
303*53ee8cc1Swenshuai.xi 	UTOPIA_USER_INSTANCE* pInstance = NULL;
304*53ee8cc1Swenshuai.xi 	while(psUtopiaModule != NULL)
305*53ee8cc1Swenshuai.xi     {
306*53ee8cc1Swenshuai.xi         if(psUtopiaModule->u32ModuleID == (u32ModuleID&~KERNEL_MODE))
307*53ee8cc1Swenshuai.xi         {
308*53ee8cc1Swenshuai.xi             MS_U32 u32ModuleIndex = u32ModuleID&~KERNEL_MODE;
309*53ee8cc1Swenshuai.xi             pInstance= malloc(sizeof(UTOPIA_USER_INSTANCE));
310*53ee8cc1Swenshuai.xi 
311*53ee8cc1Swenshuai.xi             if(pInstance == NULL)
312*53ee8cc1Swenshuai.xi             {
313*53ee8cc1Swenshuai.xi                 printu("utopia.c : malloc fail %d \n",__LINE__);
314*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_FAIL;
315*53ee8cc1Swenshuai.xi             }else
316*53ee8cc1Swenshuai.xi             {
317*53ee8cc1Swenshuai.xi //                printu("utopia.c : malloc ok,Module= %s \n",moduleNames[u32ModuleIndex]);
318*53ee8cc1Swenshuai.xi             }
319*53ee8cc1Swenshuai.xi 
320*53ee8cc1Swenshuai.xi              //if(u32ModuleID & KERNEL_MODE)
321*53ee8cc1Swenshuai.xi              if(moduleMode[u32ModuleIndex] & KERNEL_MODE)
322*53ee8cc1Swenshuai.xi 			 {
323*53ee8cc1Swenshuai.xi 			     if (0 > (_s32UtopiaFd = open("/proc/utopia", O_RDWR)))
324*53ee8cc1Swenshuai.xi 			     {
325*53ee8cc1Swenshuai.xi 			         printu("aa : 0x%x  Open /proc/utopia fail aa\n", u32ModuleID);
326*53ee8cc1Swenshuai.xi                                  free(pInstance);//coverity Resource leak
327*53ee8cc1Swenshuai.xi                                  return UTOPIA_STATUS_FAIL;
328*53ee8cc1Swenshuai.xi 			     }
329*53ee8cc1Swenshuai.xi //                 printu("Module : %s  kernel mode\n",moduleNames[u32ModuleIndex]);
330*53ee8cc1Swenshuai.xi //				 printu("_s32UtopiaFd : %d  \n",_s32UtopiaFd);
331*53ee8cc1Swenshuai.xi 				 sOpenArg.u32ModuleID = psUtopiaModule->u32ModuleID;
332*53ee8cc1Swenshuai.xi 				 sOpenArg.u32ModuleVersion = u32ModuleVersion;
333*53ee8cc1Swenshuai.xi 				 sOpenArg.pAttribute = (void*)pAttribute;
334*53ee8cc1Swenshuai.xi 				 if(ioctl(_s32UtopiaFd,UTOPIA_IOCTL_SetMODULE,&sOpenArg)!=UTOPIA_STATUS_SUCCESS)
335*53ee8cc1Swenshuai.xi 				 {
336*53ee8cc1Swenshuai.xi 				     printu("utopia.c : UtopiaOpen fail %d \n",__LINE__);
337*53ee8cc1Swenshuai.xi 				     free(pInstance);
338*53ee8cc1Swenshuai.xi 					 close(_s32UtopiaFd);
339*53ee8cc1Swenshuai.xi 				     return UTOPIA_STATUS_FAIL;
340*53ee8cc1Swenshuai.xi 				 }
341*53ee8cc1Swenshuai.xi 				 //while(1);
342*53ee8cc1Swenshuai.xi 			     pInstance->psUtopiaInstant = 0;
343*53ee8cc1Swenshuai.xi 				 pInstance->s32Fd = _s32UtopiaFd;
344*53ee8cc1Swenshuai.xi 			     pInstance->u32KernelSpaceIdentify =KERNEL_MODE;
345*53ee8cc1Swenshuai.xi 				 pInstance->u32ModuleID = psUtopiaModule->u32ModuleID;
346*53ee8cc1Swenshuai.xi 				 *ppInstanceTmp = pInstance;
347*53ee8cc1Swenshuai.xi 				 return UTOPIA_STATUS_SUCCESS;
348*53ee8cc1Swenshuai.xi              }else
349*53ee8cc1Swenshuai.xi              {
350*53ee8cc1Swenshuai.xi //                 printu("Module : %s  user mode\n",moduleNames[u32ModuleIndex]);
351*53ee8cc1Swenshuai.xi                  MS_U32 ret = psUtopiaModule->fpOpen(&(pInstance->psUtopiaInstant), pAttribute);
352*53ee8cc1Swenshuai.xi 
353*53ee8cc1Swenshuai.xi 				 if(MSOS_BRANCH_PREDICTION_UNLIKELY(ret))
354*53ee8cc1Swenshuai.xi                  {
355*53ee8cc1Swenshuai.xi                      printu("[utopia open error] fail to create instance\n");
356*53ee8cc1Swenshuai.xi 				     RET_OR_BLOCK(ret);
357*53ee8cc1Swenshuai.xi                  }
358*53ee8cc1Swenshuai.xi                  ((UTOPIA_INSTANCE*)(pInstance->psUtopiaInstant))->psModule =psUtopiaModule;
359*53ee8cc1Swenshuai.xi 				 ((UTOPIA_INSTANCE*)(pInstance->psUtopiaInstant))->u32AppRequireModuleVersion = u32ModuleVersion;
360*53ee8cc1Swenshuai.xi 				 //(*ppInstance)->psModule = psUtopiaModule;
361*53ee8cc1Swenshuai.xi 			     //(*ppInstance)->u32AppRequireModuleVersion = u32ModuleVersion;
362*53ee8cc1Swenshuai.xi 				 pInstance->u32KernelSpaceIdentify = 0;
363*53ee8cc1Swenshuai.xi 				 pInstance->s32Fd = 0;
364*53ee8cc1Swenshuai.xi 
365*53ee8cc1Swenshuai.xi 				 *ppInstanceTmp = pInstance;
366*53ee8cc1Swenshuai.xi 				 return ret; /* depend on fpOpen, may not be UTOPIA_STATUS_SUCCESS */
367*53ee8cc1Swenshuai.xi              }
368*53ee8cc1Swenshuai.xi         }
369*53ee8cc1Swenshuai.xi 		psUtopiaModule = psUtopiaModule->psNext;
370*53ee8cc1Swenshuai.xi     }
371*53ee8cc1Swenshuai.xi 	return UTOPIA_STATUS_FAIL;
372*53ee8cc1Swenshuai.xi #else
373*53ee8cc1Swenshuai.xi     UTOPIA_INSTANCE** ppInstance = (UTOPIA_INSTANCE**)ppInstanceTmp;
374*53ee8cc1Swenshuai.xi 
375*53ee8cc1Swenshuai.xi 
376*53ee8cc1Swenshuai.xi     while(psUtopiaModule != NULL)
377*53ee8cc1Swenshuai.xi     {
378*53ee8cc1Swenshuai.xi         if(psUtopiaModule->u32ModuleID == u32ModuleID)
379*53ee8cc1Swenshuai.xi         {
380*53ee8cc1Swenshuai.xi             MS_U32 ret = psUtopiaModule->fpOpen((void**)ppInstance, pAttribute);
381*53ee8cc1Swenshuai.xi 
382*53ee8cc1Swenshuai.xi             if(MSOS_BRANCH_PREDICTION_UNLIKELY(ret))
383*53ee8cc1Swenshuai.xi             {
384*53ee8cc1Swenshuai.xi                 printu("[utopia open error] fail to create instance\n");
385*53ee8cc1Swenshuai.xi 				RET_OR_BLOCK(ret);
386*53ee8cc1Swenshuai.xi             }
387*53ee8cc1Swenshuai.xi 
388*53ee8cc1Swenshuai.xi             (*ppInstance)->psModule = psUtopiaModule;
389*53ee8cc1Swenshuai.xi 			(*ppInstance)->u32AppRequireModuleVersion = u32ModuleVersion;
390*53ee8cc1Swenshuai.xi             return ret; /* depend on fpOpen, may not be UTOPIA_STATUS_SUCCESS */
391*53ee8cc1Swenshuai.xi         }
392*53ee8cc1Swenshuai.xi         psUtopiaModule = psUtopiaModule->psNext;
393*53ee8cc1Swenshuai.xi     }
394*53ee8cc1Swenshuai.xi 	return UTOPIA_STATUS_FAIL;
395*53ee8cc1Swenshuai.xi #endif
396*53ee8cc1Swenshuai.xi }
397*53ee8cc1Swenshuai.xi 
UtopiaIoctl(void * pInstanceTmp,MS_U32 u32Cmd,void * const pArgs)398*53ee8cc1Swenshuai.xi MS_U32 UtopiaIoctl(void* pInstanceTmp, MS_U32 u32Cmd, void* const pArgs)
399*53ee8cc1Swenshuai.xi {
400*53ee8cc1Swenshuai.xi #if defined(CONFIG_UTOPIA_FRAMEWORK_KERNEL_DRIVER)
401*53ee8cc1Swenshuai.xi     UTOPIA_DDI_IOCTL_ARG sIOCTLArg;
402*53ee8cc1Swenshuai.xi     UTOPIA_USER_INSTANCE* pInstance = (UTOPIA_USER_INSTANCE*)pInstanceTmp;
403*53ee8cc1Swenshuai.xi     MS_U32 ret = 0;
404*53ee8cc1Swenshuai.xi 
405*53ee8cc1Swenshuai.xi 	/* check param. */
406*53ee8cc1Swenshuai.xi 	if (MSOS_BRANCH_PREDICTION_UNLIKELY(pInstance == NULL))
407*53ee8cc1Swenshuai.xi 	{
408*53ee8cc1Swenshuai.xi 		printu("[utopia param error] instance pointer should not be null\n");
409*53ee8cc1Swenshuai.xi 		RET_OR_BLOCK(UTOPIA_STATUS_FAIL);
410*53ee8cc1Swenshuai.xi 	}
411*53ee8cc1Swenshuai.xi 
412*53ee8cc1Swenshuai.xi 	if((pInstance->u32KernelSpaceIdentify) & KERNEL_MODE)
413*53ee8cc1Swenshuai.xi 	{
414*53ee8cc1Swenshuai.xi 		sIOCTLArg.u32Cmd = u32Cmd;
415*53ee8cc1Swenshuai.xi 		sIOCTLArg.pArg = pArgs;
416*53ee8cc1Swenshuai.xi 
417*53ee8cc1Swenshuai.xi 		ret = ioctl((pInstance->s32Fd),UTOPIA_IOCTL_IoctlMODULE,&sIOCTLArg);
418*53ee8cc1Swenshuai.xi 		if(ret != 0)
419*53ee8cc1Swenshuai.xi 		{
420*53ee8cc1Swenshuai.xi 
421*53ee8cc1Swenshuai.xi 		    //printf("UtopiaIoctl error %d \n",ret);
422*53ee8cc1Swenshuai.xi 			//printf("Module: %s  Cmd: %d \n",moduleNames[pInstance->u32ModuleID] , u32Cmd);
423*53ee8cc1Swenshuai.xi 			//print_trace();
424*53ee8cc1Swenshuai.xi 		    //RET_OR_BLOCK(UTOPIA_STATUS_FAIL);
425*53ee8cc1Swenshuai.xi 		}
426*53ee8cc1Swenshuai.xi 
427*53ee8cc1Swenshuai.xi 	    //ioctl(((MS_S32)(pInstance->psUtopiaInstant)),u32Cmd,pArgs);
428*53ee8cc1Swenshuai.xi 		return ret;
429*53ee8cc1Swenshuai.xi 	}else
430*53ee8cc1Swenshuai.xi 	{
431*53ee8cc1Swenshuai.xi 	   return TO_INSTANCE_PTR((pInstance->psUtopiaInstant))->psModule->fpIoctl((pInstance->psUtopiaInstant),
432*53ee8cc1Swenshuai.xi 			u32Cmd, pArgs);
433*53ee8cc1Swenshuai.xi 	}
434*53ee8cc1Swenshuai.xi #else
435*53ee8cc1Swenshuai.xi 	UTOPIA_INSTANCE* pInstance = (UTOPIA_INSTANCE*)pInstanceTmp;
436*53ee8cc1Swenshuai.xi 	/* check param. */
437*53ee8cc1Swenshuai.xi 	if (MSOS_BRANCH_PREDICTION_UNLIKELY(pInstance == NULL))
438*53ee8cc1Swenshuai.xi 	{
439*53ee8cc1Swenshuai.xi 		printu("[utopia param error] instance pointer should not be null\n");
440*53ee8cc1Swenshuai.xi 		RET_OR_BLOCK(UTOPIA_STATUS_FAIL);
441*53ee8cc1Swenshuai.xi 	}
442*53ee8cc1Swenshuai.xi 
443*53ee8cc1Swenshuai.xi 	return TO_INSTANCE_PTR(pInstance)->psModule->fpIoctl(pInstance,
444*53ee8cc1Swenshuai.xi 			u32Cmd, pArgs);
445*53ee8cc1Swenshuai.xi #endif
446*53ee8cc1Swenshuai.xi }
447*53ee8cc1Swenshuai.xi 
UtopiaClose(void * pInstantTmp)448*53ee8cc1Swenshuai.xi MS_U32 UtopiaClose(void* pInstantTmp)
449*53ee8cc1Swenshuai.xi {
450*53ee8cc1Swenshuai.xi #if defined(CONFIG_UTOPIA_FRAMEWORK_KERNEL_DRIVER)
451*53ee8cc1Swenshuai.xi     UTOPIA_USER_INSTANCE* pInstance = (UTOPIA_USER_INSTANCE*)pInstantTmp;
452*53ee8cc1Swenshuai.xi     //UTOPIA_INSTANCE* pInstant = (UTOPIA_INSTANCE*)pInstantTmp;
453*53ee8cc1Swenshuai.xi 
454*53ee8cc1Swenshuai.xi     UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
455*53ee8cc1Swenshuai.xi 	MS_U32 u32Ret = UTOPIA_STATUS_FAIL;
456*53ee8cc1Swenshuai.xi 
457*53ee8cc1Swenshuai.xi 	if((pInstance->u32KernelSpaceIdentify) & KERNEL_MODE)
458*53ee8cc1Swenshuai.xi 	{
459*53ee8cc1Swenshuai.xi 	   close((int)(pInstance->s32Fd));
460*53ee8cc1Swenshuai.xi 	   free(pInstance);
461*53ee8cc1Swenshuai.xi 	   return 0;//fix me
462*53ee8cc1Swenshuai.xi 	}else
463*53ee8cc1Swenshuai.xi 	{
464*53ee8cc1Swenshuai.xi         while(psUtopiaModule != NULL)
465*53ee8cc1Swenshuai.xi         {
466*53ee8cc1Swenshuai.xi             if(psUtopiaModule->u32ModuleID == (TO_INSTANCE_PTR(pInstance->psUtopiaInstant))->psModule->u32ModuleID)
467*53ee8cc1Swenshuai.xi             {
468*53ee8cc1Swenshuai.xi                 u32Ret = psUtopiaModule->fpClose(pInstance->psUtopiaInstant);
469*53ee8cc1Swenshuai.xi 				if(u32Ret==UTOPIA_STATUS_SUCCESS)
470*53ee8cc1Swenshuai.xi 				{
471*53ee8cc1Swenshuai.xi                     //printf("utopia.c : UtopiaClose ok,Module= %s \n",moduleNames[psUtopiaModule->u32ModuleID]);
472*53ee8cc1Swenshuai.xi 					free(pInstantTmp);
473*53ee8cc1Swenshuai.xi 				}
474*53ee8cc1Swenshuai.xi 				else
475*53ee8cc1Swenshuai.xi 					printf("UtopiaClose fail : Module  = %s \n",moduleNames[psUtopiaModule->u32ModuleID]);
476*53ee8cc1Swenshuai.xi 
477*53ee8cc1Swenshuai.xi 
478*53ee8cc1Swenshuai.xi 				return u32Ret;
479*53ee8cc1Swenshuai.xi             }
480*53ee8cc1Swenshuai.xi             psUtopiaModule = psUtopiaModule->psNext;
481*53ee8cc1Swenshuai.xi         }
482*53ee8cc1Swenshuai.xi 	return 0;
483*53ee8cc1Swenshuai.xi 	}
484*53ee8cc1Swenshuai.xi #else
485*53ee8cc1Swenshuai.xi     UTOPIA_INSTANCE* pInstance = (UTOPIA_INSTANCE*)pInstantTmp;
486*53ee8cc1Swenshuai.xi 
487*53ee8cc1Swenshuai.xi 	/* check param. */
488*53ee8cc1Swenshuai.xi 	if (MSOS_BRANCH_PREDICTION_UNLIKELY(pInstance == NULL))
489*53ee8cc1Swenshuai.xi 	{
490*53ee8cc1Swenshuai.xi 		printu("[utopia param error] instance pointer should not be null\n");
491*53ee8cc1Swenshuai.xi 		RET_OR_BLOCK(UTOPIA_STATUS_FAIL);
492*53ee8cc1Swenshuai.xi 	}
493*53ee8cc1Swenshuai.xi 
494*53ee8cc1Swenshuai.xi     UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
495*53ee8cc1Swenshuai.xi     while(psUtopiaModule != NULL)
496*53ee8cc1Swenshuai.xi     {
497*53ee8cc1Swenshuai.xi         if(psUtopiaModule->u32ModuleID == pInstance->psModule->u32ModuleID)
498*53ee8cc1Swenshuai.xi         {
499*53ee8cc1Swenshuai.xi             return psUtopiaModule->fpClose(pInstance);
500*53ee8cc1Swenshuai.xi         }
501*53ee8cc1Swenshuai.xi         psUtopiaModule = psUtopiaModule->psNext;
502*53ee8cc1Swenshuai.xi     }
503*53ee8cc1Swenshuai.xi 	return 0;
504*53ee8cc1Swenshuai.xi #endif
505*53ee8cc1Swenshuai.xi }
506*53ee8cc1Swenshuai.xi 
507