xref: /utopia/UTPA2-700.0.x/modules/dscmb/drv/dscmb/dscmb.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi #include "MsTypes.h"
2*53ee8cc1Swenshuai.xi #include "utopia.h"
3*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
4*53ee8cc1Swenshuai.xi #include <linux/string.h>
5*53ee8cc1Swenshuai.xi #else
6*53ee8cc1Swenshuai.xi #include <stdio.h>
7*53ee8cc1Swenshuai.xi #include <string.h>
8*53ee8cc1Swenshuai.xi #endif
9*53ee8cc1Swenshuai.xi #include "drvDSCMB_v2.h"
10*53ee8cc1Swenshuai.xi #include "dscmb_private.h"
11*53ee8cc1Swenshuai.xi 
12*53ee8cc1Swenshuai.xi #include "utopia_dapi.h"
13*53ee8cc1Swenshuai.xi #include "drvDSCMB.h"
14*53ee8cc1Swenshuai.xi #include "MsOS.h"
15*53ee8cc1Swenshuai.xi #include "ULog.h"
16*53ee8cc1Swenshuai.xi // MACRO definition
17*53ee8cc1Swenshuai.xi #define DBG_EN  0
18*53ee8cc1Swenshuai.xi 
19*53ee8cc1Swenshuai.xi #define DSCMB_ASSERT_RETURN(x, y) if(!(x)) {ULOGE("DSCMB", "Assert Fail : %s, %d\n", __FUNCTION__, __LINE__); return y;}
20*53ee8cc1Swenshuai.xi 
21*53ee8cc1Swenshuai.xi #if DBG_EN
22*53ee8cc1Swenshuai.xi     #define DSCMB_PRINT(x) ULOGD("DSCMB", x);
23*53ee8cc1Swenshuai.xi 
24*53ee8cc1Swenshuai.xi #else
25*53ee8cc1Swenshuai.xi     #define DSCMB_PRINT(x)
26*53ee8cc1Swenshuai.xi 
27*53ee8cc1Swenshuai.xi #endif
28*53ee8cc1Swenshuai.xi //
29*53ee8cc1Swenshuai.xi // ========== Global definition ==========
30*53ee8cc1Swenshuai.xi void* pModuleDscmb = NULL;
31*53ee8cc1Swenshuai.xi 
32*53ee8cc1Swenshuai.xi #if DBG_EN
33*53ee8cc1Swenshuai.xi static const char *aCmdStr[E_MDRV_CMD_DSCMB_MAX] = { "E_MDRV_CMD_DSCMB_Init\n",
34*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_Exit\n",
35*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_SetPowerState\n",
36*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_FltAlloc\n",
37*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_FltFree\n",
38*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_FltConnectFltId\n",
39*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_FltDisconnectFltId\n",
40*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_FltDisconnectPid\n",
41*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_FltDscmb\n",
42*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_FltTypeSet\n",
43*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_FltKeySet\n",
44*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_FltKeyReset\n",
45*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_FltIVSet\n",
46*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_HDCP2_SetRiv\n",
47*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_Multi2_SetRound\n",
48*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_Multi2_SetSysKey\n",
49*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_ScmbStatus\n",
50*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_PVR_RecCtrl\n",
51*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_SetDefaultCAVid\n",
52*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_EngSetAlgo\n",
53*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_EngSetKey\n",
54*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_EngResetKey\n",
55*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_EngSetIV\n",
56*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_EngSetSwitch\n",
57*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_EngSetFSCB\n",
58*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_KLadder_AtomicExec\n",
59*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_KLadder_ETSI\n",
60*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_QueryCap\n",
61*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_SetDBGLevel\n",
62*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_GetLibVer\n",
63*53ee8cc1Swenshuai.xi                                                      "E_MDRV_CMD_DSCMB_PidFlt_GetConnectStatus\n"};
64*53ee8cc1Swenshuai.xi 
65*53ee8cc1Swenshuai.xi #endif
66*53ee8cc1Swenshuai.xi 
67*53ee8cc1Swenshuai.xi // variable export to driver layer
68*53ee8cc1Swenshuai.xi MS_U32* _u32FreeSlot;
69*53ee8cc1Swenshuai.xi stDscmbTspMap (*DscmbTspMap)[MAX_NUM];
70*53ee8cc1Swenshuai.xi 
DSCMBStr(MS_U32 u32PowerState,void * pModule)71*53ee8cc1Swenshuai.xi MS_U32 DSCMBStr(MS_U32 u32PowerState, void* pModule)
72*53ee8cc1Swenshuai.xi {
73*53ee8cc1Swenshuai.xi     return MDrv_DSCMB2_SetPowerState(u32PowerState);
74*53ee8cc1Swenshuai.xi }
75*53ee8cc1Swenshuai.xi 
DSCMBRegisterToUtopia(void)76*53ee8cc1Swenshuai.xi void DSCMBRegisterToUtopia(void)
77*53ee8cc1Swenshuai.xi {
78*53ee8cc1Swenshuai.xi     DSCMB_RESOURCE_PRIVATE * pResPri = NULL;
79*53ee8cc1Swenshuai.xi 
80*53ee8cc1Swenshuai.xi     // 1. deal with module
81*53ee8cc1Swenshuai.xi     UtopiaModuleCreate(MODULE_DSCMB, 8, &pModuleDscmb);
82*53ee8cc1Swenshuai.xi     UtopiaModuleRegister(pModuleDscmb);
83*53ee8cc1Swenshuai.xi     UtopiaModuleSetupFunctionPtr(pModuleDscmb, (FUtopiaOpen)DSCMBOpen, (FUtopiaClose)DSCMBClose, (FUtopiaIOctl)DSCMBIoctl);
84*53ee8cc1Swenshuai.xi 
85*53ee8cc1Swenshuai.xi     #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
86*53ee8cc1Swenshuai.xi     UtopiaModuleRegisterMdbNode("dscmb", (FUtopiaMdbIoctl)DSCMBMdbIoctl);
87*53ee8cc1Swenshuai.xi     #endif
88*53ee8cc1Swenshuai.xi 
89*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX_KERNEL)
90*53ee8cc1Swenshuai.xi     UtopiaModuleSetupSTRFunctionPtr(pModuleDscmb, (FUtopiaSTR)DSCMBStr);
91*53ee8cc1Swenshuai.xi #endif
92*53ee8cc1Swenshuai.xi     // 2. deal with resource
93*53ee8cc1Swenshuai.xi     void* psResource = NULL;
94*53ee8cc1Swenshuai.xi     UtopiaModuleAddResourceStart(pModuleDscmb, E_DSCMB_RESOURCE);
95*53ee8cc1Swenshuai.xi     UtopiaResourceCreate("DSCMB", sizeof(DSCMB_RESOURCE_PRIVATE), &psResource);
96*53ee8cc1Swenshuai.xi     UtopiaResourceRegister(pModuleDscmb, psResource, E_DSCMB_RESOURCE);
97*53ee8cc1Swenshuai.xi 
98*53ee8cc1Swenshuai.xi     UtopiaModuleAddResourceEnd(pModuleDscmb, E_DSCMB_RESOURCE);
99*53ee8cc1Swenshuai.xi 
100*53ee8cc1Swenshuai.xi     if(UtopiaResourceObtain(pModuleDscmb, E_DSCMB_RESOURCE, &psResource) != 0)
101*53ee8cc1Swenshuai.xi     {
102*53ee8cc1Swenshuai.xi         ULOGE("DSCMB", "Dscmb - UtopiaResourceObtain fail\n");
103*53ee8cc1Swenshuai.xi         return;
104*53ee8cc1Swenshuai.xi     }
105*53ee8cc1Swenshuai.xi 
106*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(psResource, (void**)&pResPri);
107*53ee8cc1Swenshuai.xi 
108*53ee8cc1Swenshuai.xi     if(pResPri->u32Magic != MAGIC_NUM)
109*53ee8cc1Swenshuai.xi     {
110*53ee8cc1Swenshuai.xi         // not regiser yet
111*53ee8cc1Swenshuai.xi         pResPri->u32Magic = MAGIC_NUM;
112*53ee8cc1Swenshuai.xi         pResPri->bInited_Drv = FALSE;
113*53ee8cc1Swenshuai.xi     }
114*53ee8cc1Swenshuai.xi 
115*53ee8cc1Swenshuai.xi     UtopiaResourceRelease(psResource);
116*53ee8cc1Swenshuai.xi 
117*53ee8cc1Swenshuai.xi /*
118*53ee8cc1Swenshuai.xi     UtopiaStartResourceAdd(pUtopiaModule, E_DSCMB_POOL_ID_ENG0);
119*53ee8cc1Swenshuai.xi     psResource = (UTOPIA_RESOURCE*)UtopiaResourceCreate("DSCMB_ENG0", sizeof(DSCMB_RESOURCE_PRIVATE));
120*53ee8cc1Swenshuai.xi     UtopiaResourceRegister(pUtopiaModule, psResource, E_DSCMB_POOL_ID_ENG0);
121*53ee8cc1Swenshuai.xi 
122*53ee8cc1Swenshuai.xi     psResource = NULL;
123*53ee8cc1Swenshuai.xi     UtopiaStartResourceAdd(pUtopiaModule, E_DSCMB_POOL_ID_ENG1);
124*53ee8cc1Swenshuai.xi     psResource = (UTOPIA_RESOURCE*)UtopiaResourceCreate("DSCMB_ENG1", sizeof(DSCMB_RESOURCE_PRIVATE));
125*53ee8cc1Swenshuai.xi     UtopiaResourceRegister(pUtopiaModule, psResource, E_DSCMB_POOL_ID_ENG1);
126*53ee8cc1Swenshuai.xi 
127*53ee8cc1Swenshuai.xi     psResource = NULL;
128*53ee8cc1Swenshuai.xi     UtopiaStartResourceAdd(pUtopiaModule, E_DSCMB_POOL_ID_ENG2);
129*53ee8cc1Swenshuai.xi     psResource = (UTOPIA_RESOURCE*)UtopiaResourceCreate("DSCMB_ENG2", sizeof(DSCMB_RESOURCE_PRIVATE));
130*53ee8cc1Swenshuai.xi     UtopiaResourceRegister(pUtopiaModule, psResource, E_DSCMB_POOL_ID_ENG2);
131*53ee8cc1Swenshuai.xi */
132*53ee8cc1Swenshuai.xi }
133*53ee8cc1Swenshuai.xi 
134*53ee8cc1Swenshuai.xi #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
DSCMBMdbIoctl(MS_U32 cmd,const void * const pArgs)135*53ee8cc1Swenshuai.xi MS_U32 DSCMBMdbIoctl(MS_U32 cmd, const void* const pArgs)
136*53ee8cc1Swenshuai.xi {
137*53ee8cc1Swenshuai.xi     MDBCMD_CMDLINE_PARAMETER *paraCmdLine;
138*53ee8cc1Swenshuai.xi     MDBCMD_GETINFO_PARAMETER *paraGetInfo;
139*53ee8cc1Swenshuai.xi     void* pstRes = NULL;
140*53ee8cc1Swenshuai.xi     DSCMB_RESOURCE_PRIVATE * pstResPri = NULL;
141*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap;
142*53ee8cc1Swenshuai.xi     switch(cmd)
143*53ee8cc1Swenshuai.xi     {
144*53ee8cc1Swenshuai.xi         case MDBCMD_CMDLINE:
145*53ee8cc1Swenshuai.xi             paraCmdLine = (MDBCMD_CMDLINE_PARAMETER *)pArgs;
146*53ee8cc1Swenshuai.xi             paraCmdLine->result = MDBRESULT_SUCCESS_FIN;
147*53ee8cc1Swenshuai.xi             break;
148*53ee8cc1Swenshuai.xi         case MDBCMD_GETINFO:
149*53ee8cc1Swenshuai.xi             paraGetInfo = (MDBCMD_GETINFO_PARAMETER *)pArgs;
150*53ee8cc1Swenshuai.xi             if(UtopiaResourceObtain(pModuleDscmb, E_DSCMB_RESOURCE, &pstRes) != 0)
151*53ee8cc1Swenshuai.xi             {
152*53ee8cc1Swenshuai.xi                 MdbPrint(paraGetInfo->u64ReqHdl, "ERROR : DSCMB - UtopiaResourceObtain fail\n");
153*53ee8cc1Swenshuai.xi                 paraCmdLine->result = MDBRESULT_SUCCESS_FIN;
154*53ee8cc1Swenshuai.xi                 return 0;
155*53ee8cc1Swenshuai.xi             }
156*53ee8cc1Swenshuai.xi 
157*53ee8cc1Swenshuai.xi             UtopiaResourceGetPrivate(pstRes, (void**)&pstResPri);
158*53ee8cc1Swenshuai.xi             DscmbTspMap = pstResPri->DscmbTspMap;
159*53ee8cc1Swenshuai.xi             if(FALSE == pstResPri->bInited_Drv)
160*53ee8cc1Swenshuai.xi             {
161*53ee8cc1Swenshuai.xi                 MdbPrint(paraGetInfo->u64ReqHdl,"ERROR : DSCMB not initialize yet\n");
162*53ee8cc1Swenshuai.xi             }
163*53ee8cc1Swenshuai.xi             else
164*53ee8cc1Swenshuai.xi             {
165*53ee8cc1Swenshuai.xi                 int u32Eng = 0;
166*53ee8cc1Swenshuai.xi                 int u32DscmbId = 0;
167*53ee8cc1Swenshuai.xi                 int u32Cnt = 0;
168*53ee8cc1Swenshuai.xi                 MdbPrint(paraGetInfo->u64ReqHdl,"---------MStar Demux KeySet Info---------\n");
169*53ee8cc1Swenshuai.xi                 MdbPrint(paraGetInfo->u64ReqHdl,"DSCMB ID\t# of Keys\tCAVID\tTSID\t Connected Demux ID\n");
170*53ee8cc1Swenshuai.xi                 for(u32Eng = 0; u32Eng < ENG_NUM; u32Eng++)
171*53ee8cc1Swenshuai.xi                 {
172*53ee8cc1Swenshuai.xi                     pMap = &DscmbTspMap[u32Eng][u32DscmbId];
173*53ee8cc1Swenshuai.xi                     if(pMap->bUsed == FALSE)
174*53ee8cc1Swenshuai.xi                         continue;
175*53ee8cc1Swenshuai.xi 
176*53ee8cc1Swenshuai.xi                     for(u32DscmbId = 0; u32DscmbId < MAX_KEY; u32DscmbId++)
177*53ee8cc1Swenshuai.xi                     {
178*53ee8cc1Swenshuai.xi                         MdbPrint(paraGetInfo->u64ReqHdl,"%d\t0xF\t0\t", (u32Eng * ENG_NUM) + u32DscmbId);
179*53ee8cc1Swenshuai.xi                         for(u32Cnt = 0; u32Cnt < pMap->u32PidFltIdNum; u32Cnt++)
180*53ee8cc1Swenshuai.xi                         {
181*53ee8cc1Swenshuai.xi                             MdbPrint(paraGetInfo->u64ReqHdl,"%d, ", pMap->u32PidFltId[u32Cnt]);
182*53ee8cc1Swenshuai.xi                         }
183*53ee8cc1Swenshuai.xi                         MdbPrint(paraGetInfo->u64ReqHdl,"\n");
184*53ee8cc1Swenshuai.xi                     }
185*53ee8cc1Swenshuai.xi                 }
186*53ee8cc1Swenshuai.xi 
187*53ee8cc1Swenshuai.xi             }
188*53ee8cc1Swenshuai.xi             paraGetInfo->result = MDBRESULT_SUCCESS_FIN;
189*53ee8cc1Swenshuai.xi             break;
190*53ee8cc1Swenshuai.xi         default:
191*53ee8cc1Swenshuai.xi             break;
192*53ee8cc1Swenshuai.xi     }
193*53ee8cc1Swenshuai.xi     return 0;
194*53ee8cc1Swenshuai.xi }
195*53ee8cc1Swenshuai.xi #endif
196*53ee8cc1Swenshuai.xi 
DSCMBOpen(void ** ppInstance,MS_U32 u32ModuleVersion,void * pAttribute)197*53ee8cc1Swenshuai.xi MS_U32 DSCMBOpen(void** ppInstance, MS_U32 u32ModuleVersion, void* pAttribute)
198*53ee8cc1Swenshuai.xi {
199*53ee8cc1Swenshuai.xi     //UTOPIA_TRACE(MS_UTOPIA_DB_LEVEL_TRACE,ULOGD("DSCMB", "enter %s %d\n",__FUNCTION__,__LINE__));
200*53ee8cc1Swenshuai.xi     UtopiaInstanceCreate(sizeof(DSCMB_INSTANT_PRIVATE), ppInstance);
201*53ee8cc1Swenshuai.xi 
202*53ee8cc1Swenshuai.xi     DSCMB_INSTANT_PRIVATE* psDscmbInstPri = NULL;
203*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(*ppInstance, (void**)&psDscmbInstPri);
204*53ee8cc1Swenshuai.xi     memset(&psDscmbInstPri->pInitVector, 0x0, DSCMB_IV_LENGTH);
205*53ee8cc1Swenshuai.xi     memset(&psDscmbInstPri->pCipherKey, 0x0, DSCMB_KEY_LENGTH);
206*53ee8cc1Swenshuai.xi 
207*53ee8cc1Swenshuai.xi     //MDrv_DSCMB_Init();
208*53ee8cc1Swenshuai.xi     //UTOPIA_TRACE(MS_UTOPIA_DB_LEVEL_TRACE,ULOGD("DSCMB", "leave %s %d\n",__FUNCTION__,__LINE__));
209*53ee8cc1Swenshuai.xi 
210*53ee8cc1Swenshuai.xi     return UTOPIA_STATUS_SUCCESS;
211*53ee8cc1Swenshuai.xi }
212*53ee8cc1Swenshuai.xi 
DSCMBIoctl(void * pInstance,MS_U32 u32Cmd,void * pu32Args)213*53ee8cc1Swenshuai.xi MS_U32 DSCMBIoctl(void* pInstance, MS_U32 u32Cmd, void* pu32Args)
214*53ee8cc1Swenshuai.xi {
215*53ee8cc1Swenshuai.xi     void* pstRes = NULL;
216*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_FAIL;
217*53ee8cc1Swenshuai.xi     DSCMB_RESOURCE_PRIVATE * pstResPri = NULL;
218*53ee8cc1Swenshuai.xi     DSCMB_INSTANT_PRIVATE *pstInstPri = NULL;
219*53ee8cc1Swenshuai.xi     //UTOPIA_TRACE(MS_UTOPIA_DB_LEVEL_TRACE,ULOGD("DSCMB", "enter %s %d\n",__FUNCTION__,__LINE__));
220*53ee8cc1Swenshuai.xi 
221*53ee8cc1Swenshuai.xi     DSCMB_ASSERT_RETURN((pInstance != NULL), UTOPIA_STATUS_PARAMETER_ERROR);
222*53ee8cc1Swenshuai.xi 
223*53ee8cc1Swenshuai.xi     DSCMB_ASSERT_RETURN((u32Cmd < E_MDRV_CMD_DSCMB_MAX), UTOPIA_STATUS_NOT_SUPPORTED);
224*53ee8cc1Swenshuai.xi 
225*53ee8cc1Swenshuai.xi     DSCMB_PRINT(aCmdStr[u32Cmd]);
226*53ee8cc1Swenshuai.xi 
227*53ee8cc1Swenshuai.xi     //DSCMB_INSTANT_PRIVATE* psDscmbInstPri = (DSCMB_INSTANT_PRIVATE*)UtopiaInstantGetPrivate(pInstant);
228*53ee8cc1Swenshuai.xi 
229*53ee8cc1Swenshuai.xi     //UtopiaResourceObtainToInstant(pInstant, E_DSCMB_RESOURCE);
230*53ee8cc1Swenshuai.xi     if(UtopiaResourceObtain(pModuleDscmb, E_DSCMB_RESOURCE, &pstRes) != 0)
231*53ee8cc1Swenshuai.xi     {
232*53ee8cc1Swenshuai.xi         ULOGE("DSCMB", "Dscmb - UtopiaResourceObtain fail\n");
233*53ee8cc1Swenshuai.xi         return UTOPIA_STATUS_FAIL;
234*53ee8cc1Swenshuai.xi     }
235*53ee8cc1Swenshuai.xi 
236*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(pstRes, (void**)&pstResPri);
237*53ee8cc1Swenshuai.xi 
238*53ee8cc1Swenshuai.xi     if((FALSE == pstResPri->bInited_Drv)  &&
239*53ee8cc1Swenshuai.xi         (u32Cmd != E_MDRV_CMD_DSCMB_Init) &&
240*53ee8cc1Swenshuai.xi         (u32Cmd != E_MDRV_CMD_DSCMB_QueryCap))
241*53ee8cc1Swenshuai.xi     {
242*53ee8cc1Swenshuai.xi         ULOGE("DSCMB", "Dscmb has not been initialized.\n");
243*53ee8cc1Swenshuai.xi         UtopiaResourceRelease(pstRes);
244*53ee8cc1Swenshuai.xi         return UTOPIA_STATUS_FAIL;
245*53ee8cc1Swenshuai.xi     }
246*53ee8cc1Swenshuai.xi 
247*53ee8cc1Swenshuai.xi     _u32FreeSlot = pstResPri->u32FreeSlot;
248*53ee8cc1Swenshuai.xi     DscmbTspMap = pstResPri->DscmbTspMap;
249*53ee8cc1Swenshuai.xi 
250*53ee8cc1Swenshuai.xi     switch(u32Cmd)
251*53ee8cc1Swenshuai.xi     {
252*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_Init:
253*53ee8cc1Swenshuai.xi             if(pstResPri->bInited_Drv == FALSE)
254*53ee8cc1Swenshuai.xi             {
255*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB_Init())
256*53ee8cc1Swenshuai.xi                 {
257*53ee8cc1Swenshuai.xi                     pstResPri->bInited_Drv = TRUE;
258*53ee8cc1Swenshuai.xi                 }
259*53ee8cc1Swenshuai.xi             }
260*53ee8cc1Swenshuai.xi             u32Ret = UTOPIA_STATUS_SUCCESS;
261*53ee8cc1Swenshuai.xi             break;
262*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_Exit:
263*53ee8cc1Swenshuai.xi             if(pstResPri->bInited_Drv == TRUE)
264*53ee8cc1Swenshuai.xi             {
265*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB_Exit())
266*53ee8cc1Swenshuai.xi                 {
267*53ee8cc1Swenshuai.xi                     pstResPri->bInited_Drv = FALSE;
268*53ee8cc1Swenshuai.xi                 }
269*53ee8cc1Swenshuai.xi             }
270*53ee8cc1Swenshuai.xi             u32Ret = UTOPIA_STATUS_SUCCESS;
271*53ee8cc1Swenshuai.xi             break;
272*53ee8cc1Swenshuai.xi 
273*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_QueryCap:
274*53ee8cc1Swenshuai.xi         {
275*53ee8cc1Swenshuai.xi             DSCMB_QUERYCAP * psQuery = (DSCMB_QUERYCAP *)pu32Args;
276*53ee8cc1Swenshuai.xi             if(TRUE == _MDrv_DSCMB2_GetCap(
277*53ee8cc1Swenshuai.xi                         psQuery->u32EngId,
278*53ee8cc1Swenshuai.xi                         psQuery->eQueryType,
279*53ee8cc1Swenshuai.xi                         psQuery->pInput,
280*53ee8cc1Swenshuai.xi                         psQuery->pOutput))
281*53ee8cc1Swenshuai.xi             {
282*53ee8cc1Swenshuai.xi                 u32Ret = UTOPIA_STATUS_SUCCESS;
283*53ee8cc1Swenshuai.xi             }
284*53ee8cc1Swenshuai.xi 
285*53ee8cc1Swenshuai.xi             break;
286*53ee8cc1Swenshuai.xi         }
287*53ee8cc1Swenshuai.xi 
288*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_OptConfig:
289*53ee8cc1Swenshuai.xi         {
290*53ee8cc1Swenshuai.xi             DSCMB_OPTCONFIG * psOpt = (DSCMB_OPTCONFIG *)pu32Args;
291*53ee8cc1Swenshuai.xi             if(TRUE == _MDrv_DSCMB2_OptConfig(
292*53ee8cc1Swenshuai.xi                         psOpt->u32EngId,
293*53ee8cc1Swenshuai.xi                         psOpt->eOpt,
294*53ee8cc1Swenshuai.xi                         psOpt->pInput,
295*53ee8cc1Swenshuai.xi                         psOpt->pOutput,
296*53ee8cc1Swenshuai.xi                         psOpt->bSet))
297*53ee8cc1Swenshuai.xi             {
298*53ee8cc1Swenshuai.xi                 u32Ret = UTOPIA_STATUS_SUCCESS;
299*53ee8cc1Swenshuai.xi             }
300*53ee8cc1Swenshuai.xi 
301*53ee8cc1Swenshuai.xi             break;
302*53ee8cc1Swenshuai.xi         }
303*53ee8cc1Swenshuai.xi 
304*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_FltAlloc:
305*53ee8cc1Swenshuai.xi             {
306*53ee8cc1Swenshuai.xi                 //MS_U32 u32Flt = 0;
307*53ee8cc1Swenshuai.xi                 DSCMB_FLTALLOC* pFltAlloc = (DSCMB_FLTALLOC *)pu32Args;
308*53ee8cc1Swenshuai.xi                 //u32EngId = (MS_U32)psDscmbInstPri->ePoolId;
309*53ee8cc1Swenshuai.xi 
310*53ee8cc1Swenshuai.xi                 pFltAlloc->u32DscmbId = _MDrv_DSCMB2_FltAlloc_Ex(pFltAlloc->u32EngId,
311*53ee8cc1Swenshuai.xi                                                                  pFltAlloc->eFltType);
312*53ee8cc1Swenshuai.xi                 if(pFltAlloc->u32DscmbId != DRV_DSCMB_FLT_NULL)
313*53ee8cc1Swenshuai.xi                 {
314*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
315*53ee8cc1Swenshuai.xi                 }
316*53ee8cc1Swenshuai.xi             }
317*53ee8cc1Swenshuai.xi             break;
318*53ee8cc1Swenshuai.xi 
319*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_FltConnectFltId:
320*53ee8cc1Swenshuai.xi             {
321*53ee8cc1Swenshuai.xi                 DSCMB_CONNECTFLT * pConnectFlt = (DSCMB_CONNECTFLT *)pu32Args;
322*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB2_FltConnectFltId(pConnectFlt->u32EngId,
323*53ee8cc1Swenshuai.xi                                                         pConnectFlt->u32DscmbId,
324*53ee8cc1Swenshuai.xi                                                         pConnectFlt->u32DmxFltId))
325*53ee8cc1Swenshuai.xi                 {
326*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
327*53ee8cc1Swenshuai.xi                 }
328*53ee8cc1Swenshuai.xi             }
329*53ee8cc1Swenshuai.xi             break;
330*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_FltDisconnectFltId:
331*53ee8cc1Swenshuai.xi             {
332*53ee8cc1Swenshuai.xi                 DSCMB_DISCONNECTFLT * pDisconnectFlt = (DSCMB_DISCONNECTFLT *)pu32Args;
333*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB2_FltDisconnectFltId(pDisconnectFlt->u32EngId,
334*53ee8cc1Swenshuai.xi                                                            pDisconnectFlt->u32DscmbId,
335*53ee8cc1Swenshuai.xi                                                            pDisconnectFlt->u32DmxFltId))
336*53ee8cc1Swenshuai.xi                 {
337*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
338*53ee8cc1Swenshuai.xi                 }
339*53ee8cc1Swenshuai.xi             }
340*53ee8cc1Swenshuai.xi             break;
341*53ee8cc1Swenshuai.xi #if !(defined(MSOS_TYPE_NUTTX) || defined(MSOS_TYPE_OPTEE))
342*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_FltConnectPid:
343*53ee8cc1Swenshuai.xi             {
344*53ee8cc1Swenshuai.xi                 DSCMB_CONNECTPID * pstConnectPid = (DSCMB_CONNECTPID *)pu32Args;
345*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB2_FltConnectPid(
346*53ee8cc1Swenshuai.xi                             pstConnectPid->u32EngId,
347*53ee8cc1Swenshuai.xi                             pstConnectPid->u32DscmbId,
348*53ee8cc1Swenshuai.xi                             pstConnectPid->u32Pid))
349*53ee8cc1Swenshuai.xi                 {
350*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
351*53ee8cc1Swenshuai.xi                 }
352*53ee8cc1Swenshuai.xi             }
353*53ee8cc1Swenshuai.xi             break;
354*53ee8cc1Swenshuai.xi 
355*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_FltDisconnectPid:
356*53ee8cc1Swenshuai.xi             {
357*53ee8cc1Swenshuai.xi                 DSCMB_DISCONNECTPID * pstDisconnectPid = (DSCMB_DISCONNECTPID *)pu32Args;
358*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB2_FltDisconnectPid(pstDisconnectPid->u32EngId,
359*53ee8cc1Swenshuai.xi                                                          pstDisconnectPid->u32DscmbId,
360*53ee8cc1Swenshuai.xi                                                          pstDisconnectPid->u32Pid))
361*53ee8cc1Swenshuai.xi                 {
362*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
363*53ee8cc1Swenshuai.xi                 }
364*53ee8cc1Swenshuai.xi             }
365*53ee8cc1Swenshuai.xi             break;
366*53ee8cc1Swenshuai.xi #endif
367*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_FltDscmb:
368*53ee8cc1Swenshuai.xi             {
369*53ee8cc1Swenshuai.xi                 DSCMB_FLTDSCMB * pstFltDscmb = (DSCMB_FLTDSCMB *)pu32Args;
370*53ee8cc1Swenshuai.xi 
371*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB2_FltDscmb(pstFltDscmb->u32EngId,
372*53ee8cc1Swenshuai.xi                                                  pstFltDscmb->u32DscmbId,
373*53ee8cc1Swenshuai.xi                                                  pstFltDscmb->bDscmb))
374*53ee8cc1Swenshuai.xi                 {
375*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
376*53ee8cc1Swenshuai.xi                 }
377*53ee8cc1Swenshuai.xi             }
378*53ee8cc1Swenshuai.xi             break;
379*53ee8cc1Swenshuai.xi 
380*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_FltFree:
381*53ee8cc1Swenshuai.xi             {
382*53ee8cc1Swenshuai.xi                 //u32EngId = (MS_U32)psDscmbInstPri->ePoolId;
383*53ee8cc1Swenshuai.xi                 DSCMB_FLTFREE * pFltFree = (DSCMB_FLTFREE *)pu32Args;
384*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB2_FltFree(pFltFree->u32EngId,
385*53ee8cc1Swenshuai.xi                                                  pFltFree->u32DscmbId))
386*53ee8cc1Swenshuai.xi                 {
387*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
388*53ee8cc1Swenshuai.xi                 }
389*53ee8cc1Swenshuai.xi             }
390*53ee8cc1Swenshuai.xi             break;
391*53ee8cc1Swenshuai.xi 
392*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_FltIVSet:
393*53ee8cc1Swenshuai.xi             {
394*53ee8cc1Swenshuai.xi                 UtopiaInstanceGetPrivate(pInstance, (void**)&pstInstPri);
395*53ee8cc1Swenshuai.xi                 DSCMB_FLTIVSET * pstFltIVSet = (DSCMB_FLTIVSET *)pu32Args;
396*53ee8cc1Swenshuai.xi 
397*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB2_FltIVSet(pstFltIVSet->u32EngId,
398*53ee8cc1Swenshuai.xi                                                  pstFltIVSet->u32DscmbId,
399*53ee8cc1Swenshuai.xi                                                  pstFltIVSet->eKeyType,
400*53ee8cc1Swenshuai.xi                                                  pstFltIVSet->pu8IV))
401*53ee8cc1Swenshuai.xi                 {
402*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
403*53ee8cc1Swenshuai.xi                 }
404*53ee8cc1Swenshuai.xi                 ///@@ FIXME : IV belong to each DSCMB id, not to one engine
405*53ee8cc1Swenshuai.xi                 memcpy(pstInstPri->pInitVector, pstFltIVSet->pu8IV, DSCMB_IV_LENGTH);
406*53ee8cc1Swenshuai.xi                 pstInstPri->eKeyType = pstFltIVSet->eKeyType;
407*53ee8cc1Swenshuai.xi             }
408*53ee8cc1Swenshuai.xi             break;
409*53ee8cc1Swenshuai.xi 
410*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_FltKeyReset:
411*53ee8cc1Swenshuai.xi             {
412*53ee8cc1Swenshuai.xi                 DSCMB_FLTKEYRESET * pstFltKeyReset = (DSCMB_FLTKEYRESET *)pu32Args;
413*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB2_FltKeyReset(pstFltKeyReset->u32EngId,
414*53ee8cc1Swenshuai.xi                                                     pstFltKeyReset->u32DscmbId,
415*53ee8cc1Swenshuai.xi                                                     pstFltKeyReset->eKeyType))
416*53ee8cc1Swenshuai.xi                 {
417*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
418*53ee8cc1Swenshuai.xi                 }
419*53ee8cc1Swenshuai.xi             }
420*53ee8cc1Swenshuai.xi             break;
421*53ee8cc1Swenshuai.xi 
422*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_FltKeySet:
423*53ee8cc1Swenshuai.xi             {
424*53ee8cc1Swenshuai.xi                 UtopiaInstanceGetPrivate(pInstance, (void**)&pstInstPri);
425*53ee8cc1Swenshuai.xi                 DSCMB_FLTKEYSET * pstFltKeySet = (DSCMB_FLTKEYSET *)pu32Args;
426*53ee8cc1Swenshuai.xi 
427*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB2_FltKeySet(pstFltKeySet->u32EngId,
428*53ee8cc1Swenshuai.xi                                                   pstFltKeySet->u32DscmbId,
429*53ee8cc1Swenshuai.xi                                                   pstFltKeySet->eKeyType,
430*53ee8cc1Swenshuai.xi                                                   pstFltKeySet->pu8Key))
431*53ee8cc1Swenshuai.xi                 {
432*53ee8cc1Swenshuai.xi                     ///@@ FIXME : Key belong to each DSCMB id, not to one engine
433*53ee8cc1Swenshuai.xi                     memcpy(pstInstPri->pCipherKey, pstFltKeySet->pu8Key, DSCMB_KEY_LENGTH);
434*53ee8cc1Swenshuai.xi                     pstInstPri->eKeyType = pstFltKeySet->eKeyType;
435*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
436*53ee8cc1Swenshuai.xi                 }
437*53ee8cc1Swenshuai.xi             }
438*53ee8cc1Swenshuai.xi             break;
439*53ee8cc1Swenshuai.xi 
440*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_FltTypeSet:
441*53ee8cc1Swenshuai.xi             {
442*53ee8cc1Swenshuai.xi                 UtopiaInstanceGetPrivate(pInstance, (void**)&pstInstPri);
443*53ee8cc1Swenshuai.xi                 DSCMB_TYPESET *pstTypeSet = (DSCMB_TYPESET *)pu32Args;
444*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB2_FltTypeSet(pstTypeSet->u32EngId,
445*53ee8cc1Swenshuai.xi                                                    pstTypeSet->u32DscmbId,
446*53ee8cc1Swenshuai.xi                                                    pstTypeSet->eType))
447*53ee8cc1Swenshuai.xi                 {
448*53ee8cc1Swenshuai.xi                     pstInstPri->eType = pstTypeSet->eType;
449*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
450*53ee8cc1Swenshuai.xi                 }
451*53ee8cc1Swenshuai.xi             }
452*53ee8cc1Swenshuai.xi             break;
453*53ee8cc1Swenshuai.xi 
454*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_HDCP2_SetRiv:
455*53ee8cc1Swenshuai.xi             {
456*53ee8cc1Swenshuai.xi                 DSCMB_HDCP2_SETRIV * pstSetRiv = (DSCMB_HDCP2_SETRIV *)pu32Args;
457*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB2_HDCP2_SetRIV(pstSetRiv->u32EngId,
458*53ee8cc1Swenshuai.xi                                                      pstSetRiv->pu8Riv))
459*53ee8cc1Swenshuai.xi                 {
460*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
461*53ee8cc1Swenshuai.xi                 }
462*53ee8cc1Swenshuai.xi             }
463*53ee8cc1Swenshuai.xi             break;
464*53ee8cc1Swenshuai.xi 
465*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_Multi2_SetRound:
466*53ee8cc1Swenshuai.xi             {
467*53ee8cc1Swenshuai.xi                 DSCMB_MULTI2_SETROUND * pstSetRnd = (DSCMB_MULTI2_SETROUND *)pu32Args;
468*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB2_Multi2_SetRound(pstSetRnd->u32EngId,
469*53ee8cc1Swenshuai.xi                                                         pstSetRnd->u32Round))
470*53ee8cc1Swenshuai.xi                 {
471*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
472*53ee8cc1Swenshuai.xi                 }
473*53ee8cc1Swenshuai.xi             }
474*53ee8cc1Swenshuai.xi             break;
475*53ee8cc1Swenshuai.xi 
476*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_Multi2_SetSysKey:
477*53ee8cc1Swenshuai.xi             {
478*53ee8cc1Swenshuai.xi                 DSCMB_MULTI2_SETSYSKEY * psSetSysKey = (DSCMB_MULTI2_SETSYSKEY *)pu32Args;
479*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB2_Multi2_SetSystemKey(psSetSysKey->u32EngId,
480*53ee8cc1Swenshuai.xi                                                             (MS_U8*)psSetSysKey->pu8SysKey))
481*53ee8cc1Swenshuai.xi                 {
482*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
483*53ee8cc1Swenshuai.xi                 }
484*53ee8cc1Swenshuai.xi             }
485*53ee8cc1Swenshuai.xi             break;
486*53ee8cc1Swenshuai.xi 
487*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_PidFlt_ScmbStatus:
488*53ee8cc1Swenshuai.xi             {
489*53ee8cc1Swenshuai.xi                 DSCMB_DSCMBSTATUS * pDscmbStatus = (DSCMB_DSCMBSTATUS *)pu32Args;
490*53ee8cc1Swenshuai.xi                 if(TRUE == _MDrv_DSCMB2_PidFlt_ScmbStatus(pDscmbStatus->u32EngId,
491*53ee8cc1Swenshuai.xi                                                           pDscmbStatus->u32DmxFltId,
492*53ee8cc1Swenshuai.xi                                                           pDscmbStatus->pScmbLevel))
493*53ee8cc1Swenshuai.xi                 {
494*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
495*53ee8cc1Swenshuai.xi                 }
496*53ee8cc1Swenshuai.xi             }
497*53ee8cc1Swenshuai.xi             break;
498*53ee8cc1Swenshuai.xi 
499*53ee8cc1Swenshuai.xi         case E_MDRV_CMD_DSCMB_SetPowerState:
500*53ee8cc1Swenshuai.xi         {
501*53ee8cc1Swenshuai.xi             EN_POWER_MODE * pPowereMode = (EN_POWER_MODE *)pu32Args;
502*53ee8cc1Swenshuai.xi             if(TRUE == _MDrv_DSCMB2_SetPowerState(*pPowereMode))
503*53ee8cc1Swenshuai.xi             {
504*53ee8cc1Swenshuai.xi                 u32Ret = UTOPIA_STATUS_SUCCESS;
505*53ee8cc1Swenshuai.xi             }
506*53ee8cc1Swenshuai.xi         }
507*53ee8cc1Swenshuai.xi         break;
508*53ee8cc1Swenshuai.xi 
509*53ee8cc1Swenshuai.xi         default:
510*53ee8cc1Swenshuai.xi             ULOGE("DSCMB", "Unsupport dscmb command 0x%x\n", (int)u32Cmd);
511*53ee8cc1Swenshuai.xi             break;
512*53ee8cc1Swenshuai.xi     };
513*53ee8cc1Swenshuai.xi 
514*53ee8cc1Swenshuai.xi     UtopiaResourceRelease(pstRes);
515*53ee8cc1Swenshuai.xi     //UTOPIA_TRACE(MS_UTOPIA_DB_LEVEL_TRACE,ULOGD("DSCMB", "leave %s %d\n",__FUNCTION__,__LINE__));
516*53ee8cc1Swenshuai.xi     return u32Ret;
517*53ee8cc1Swenshuai.xi }
518*53ee8cc1Swenshuai.xi 
DSCMBClose(void * pInstance)519*53ee8cc1Swenshuai.xi MS_U32 DSCMBClose(void* pInstance)
520*53ee8cc1Swenshuai.xi {
521*53ee8cc1Swenshuai.xi     //UTOPIA_TRACE(MS_UTOPIA_DB_LEVEL_TRACE,ULOGD("DSCMB", "enter %s %d\n",__FUNCTION__,__LINE__));
522*53ee8cc1Swenshuai.xi     //UTOPIA_TRACE(MS_UTOPIA_DB_LEVEL_TRACE,ULOGD("DSCMB", "leave %s %d\n",__FUNCTION__,__LINE__));
523*53ee8cc1Swenshuai.xi     UtopiaInstanceDelete(pInstance);
524*53ee8cc1Swenshuai.xi     return UTOPIA_STATUS_SUCCESS;
525*53ee8cc1Swenshuai.xi }
526*53ee8cc1Swenshuai.xi 
527*53ee8cc1Swenshuai.xi 
528*53ee8cc1Swenshuai.xi 
529