xref: /utopia/UTPA2-700.0.x/modules/security/drv/aesdma/mdrvAESDMA.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi #if !defined(MSOS_TYPE_LINUX_KERNEL)
2*53ee8cc1Swenshuai.xi #include <stdio.h>
3*53ee8cc1Swenshuai.xi #include <string.h>
4*53ee8cc1Swenshuai.xi #else
5*53ee8cc1Swenshuai.xi #include <linux/string.h>
6*53ee8cc1Swenshuai.xi #include <linux/slab.h>
7*53ee8cc1Swenshuai.xi #endif
8*53ee8cc1Swenshuai.xi #include "MsTypes.h"
9*53ee8cc1Swenshuai.xi #include "utopia_dapi.h"
10*53ee8cc1Swenshuai.xi #include "utopia.h"
11*53ee8cc1Swenshuai.xi #include "drvAESDMA.h"
12*53ee8cc1Swenshuai.xi #include "drvAESDMA_private.h"
13*53ee8cc1Swenshuai.xi #include "MsOS.h"
14*53ee8cc1Swenshuai.xi #include "halAESDMA.h"
15*53ee8cc1Swenshuai.xi #include "ULog.h"
16*53ee8cc1Swenshuai.xi 
17*53ee8cc1Swenshuai.xi #define TAG_AESDMA "AESDMA"
18*53ee8cc1Swenshuai.xi 
19*53ee8cc1Swenshuai.xi enum
20*53ee8cc1Swenshuai.xi {
21*53ee8cc1Swenshuai.xi     AESDMA_POOL_ID_AES = 0,
22*53ee8cc1Swenshuai.xi     AESDMA_POOL_ID_SHA,
23*53ee8cc1Swenshuai.xi     AESDMA_POOL_ID_RSA,
24*53ee8cc1Swenshuai.xi } eAesdmaPoolID;
25*53ee8cc1Swenshuai.xi 
AESDMARegisterToUtopia(FUtopiaOpen ModuleType)26*53ee8cc1Swenshuai.xi void AESDMARegisterToUtopia(FUtopiaOpen ModuleType)
27*53ee8cc1Swenshuai.xi {
28*53ee8cc1Swenshuai.xi     // 1. deal with module
29*53ee8cc1Swenshuai.xi     void* pUtopiaModule = NULL;
30*53ee8cc1Swenshuai.xi 	UtopiaModuleCreate(MODULE_AESDMA, 8, &pUtopiaModule);
31*53ee8cc1Swenshuai.xi     UtopiaModuleRegister(pUtopiaModule);
32*53ee8cc1Swenshuai.xi     UtopiaModuleSetupFunctionPtr(pUtopiaModule, (FUtopiaOpen)AESDMAOpen, (FUtopiaClose)AESDMAClose, (FUtopiaIOctl)AESDMAIoctl);
33*53ee8cc1Swenshuai.xi 
34*53ee8cc1Swenshuai.xi     // 2. deal with resource
35*53ee8cc1Swenshuai.xi     void* psResource = NULL;
36*53ee8cc1Swenshuai.xi 	UtopiaModuleAddResourceStart(pUtopiaModule, AESDMA_POOL_ID_AES);
37*53ee8cc1Swenshuai.xi     UtopiaResourceCreate("AES", sizeof(AESDMA_RESOURCE_PRIVATE), &psResource);
38*53ee8cc1Swenshuai.xi     UtopiaResourceRegister(pUtopiaModule, psResource, AESDMA_POOL_ID_AES);
39*53ee8cc1Swenshuai.xi 	UtopiaModuleAddResourceEnd(pUtopiaModule, AESDMA_POOL_ID_AES);
40*53ee8cc1Swenshuai.xi 
41*53ee8cc1Swenshuai.xi     UtopiaModuleAddResourceStart(pUtopiaModule, AESDMA_POOL_ID_SHA);
42*53ee8cc1Swenshuai.xi     psResource = NULL;
43*53ee8cc1Swenshuai.xi     UtopiaResourceCreate("SHA", sizeof(SHA_RESOURCE_PRIVATE), &psResource);
44*53ee8cc1Swenshuai.xi     UtopiaResourceRegister(pUtopiaModule, psResource, AESDMA_POOL_ID_SHA);
45*53ee8cc1Swenshuai.xi 	UtopiaModuleAddResourceEnd(pUtopiaModule, AESDMA_POOL_ID_SHA);
46*53ee8cc1Swenshuai.xi 
47*53ee8cc1Swenshuai.xi     UtopiaModuleAddResourceStart(pUtopiaModule, AESDMA_POOL_ID_RSA);
48*53ee8cc1Swenshuai.xi     psResource = NULL;
49*53ee8cc1Swenshuai.xi     UtopiaResourceCreate("RSA", sizeof(RSA_RESOURCE_PRIVATE), &psResource);
50*53ee8cc1Swenshuai.xi     UtopiaResourceRegister(pUtopiaModule, psResource, AESDMA_POOL_ID_RSA);
51*53ee8cc1Swenshuai.xi 	UtopiaModuleAddResourceEnd(pUtopiaModule, AESDMA_POOL_ID_RSA);
52*53ee8cc1Swenshuai.xi 
53*53ee8cc1Swenshuai.xi }
54*53ee8cc1Swenshuai.xi 
AESDMAOpen(void ** ppInstance,MS_U32 u32ModuleVersion,void * pAttribute)55*53ee8cc1Swenshuai.xi MS_U32 AESDMAOpen(void** ppInstance, MS_U32 u32ModuleVersion, void* pAttribute)
56*53ee8cc1Swenshuai.xi {
57*53ee8cc1Swenshuai.xi 	MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "\n[AESDMA INFO]AESDMA open \n"));
58*53ee8cc1Swenshuai.xi 
59*53ee8cc1Swenshuai.xi     AESDMA_INSTANT_PRIVATE *pAesdmaPri = NULL;
60*53ee8cc1Swenshuai.xi     void *pAesdmaPriVoid = NULL;
61*53ee8cc1Swenshuai.xi     UtopiaInstanceCreate(sizeof(AESDMA_INSTANT_PRIVATE), ppInstance);
62*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(*ppInstance, &pAesdmaPriVoid);
63*53ee8cc1Swenshuai.xi 
64*53ee8cc1Swenshuai.xi     pAesdmaPri = (AESDMA_INSTANT_PRIVATE *)pAesdmaPriVoid;
65*53ee8cc1Swenshuai.xi 
66*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAInit = _MDrv_AESDMA_Init;
67*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetIV = _MDrv_AESDMA_SetIV;
68*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAReset = _MDrv_AESDMA_Reset;
69*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetFileInOut = _MDrv_AESDMA_SetFileInOut;
70*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetKey = _MDrv_AESDMA_SetKey;
71*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASelEng = _MDrv_AESDMA_SelEng;
72*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAStart = _MDrv_AESDMA_Start;
73*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAGetStatus = _MDrv_AESDMA_GetStatus;
74*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAIsFinished = _MDrv_AESDMA_IsFinished;
75*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetClk = _MDrv_AESDMA_Set_Clk;
76*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetSecureKey = _MDrv_AESDMA_SetSecureKey;
77*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetPS = _MDrv_AESDMA_SetPS;
78*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAPSRelease = _MDrv_AESDMA_PSRelease;
79*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAGetPSMatchedByteCNT = _MDrv_AESDMA_GetPSMatchedByteCNT;
80*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAGetPSMatchedPTN = _MDrv_AESDMA_GetPSMatchedPTN;
81*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMANotify = _MDrv_AESDMA_Notify;
82*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMARand = _MDrv_AESDMA_Rand;
83*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAGetRandNum = _MDrv_AESDMA_Get_Rand_Num;
84*53ee8cc1Swenshuai.xi     pAesdmaPri->fpRSACalculate = _MDrv_RSA_Calculate;
85*53ee8cc1Swenshuai.xi     pAesdmaPri->fpRSAIsFinished = _MDrv_RSA_IsFinished;
86*53ee8cc1Swenshuai.xi     pAesdmaPri->fpRSAOutput = _MDrv_RSA_Output;
87*53ee8cc1Swenshuai.xi     pAesdmaPri->fpSHACalculate = _MDrv_SHA_Calculate;
88*53ee8cc1Swenshuai.xi     pAesdmaPri->fpSHACalculateManual = MDrv_SHA_CalculateManual;
89*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAParserMaskscrmb = _MDrv_AESDMA_Parser_MaskScrmb;
90*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAParserSetScrmbPatten = _MDrv_AESDMA_Parser_SetScrmbPattern;
91*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAParserBypassPid = _MDrv_AESDMA_Parser_BypassPid;
92*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAParserSetPid = _MDrv_AESDMA_Parser_SetPid;
93*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAParserEncrypt = _MDrv_AESDMA_Parser_Encrypt;
94*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAParserDecrypt = _MDrv_AESDMA_Parser_Decrypt;
95*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAParserQueryPidCount = _MDrv_AESDMA_Parser_QueryPidCount;
96*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAParserSetAddedScrmbPattern = _MDrv_AESDMA_Parser_SetAddedScrmbPattern;
97*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetKeySel = _MDrv_AESDMA_SetKeySel;
98*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetOddIv = _MDrv_AESDMA_SetOddIV;
99*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAIsSecretKeyInNormalBlank = _MDrv_AESDMA_IsSecretKeyInNormalBank;
100*53ee8cc1Swenshuai.xi     pAesdmaPri->fpHDCPHDCPProcessCipher = MDrv_HDCP_ProcessCipher;
101*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMANormalReset = _MDrv_AESDMA_NormalReset;
102*53ee8cc1Swenshuai.xi     pAesdmaPri->fpGetHDCPCipherState = MDrv_HDCP_GetHdcpCipherState;
103*53ee8cc1Swenshuai.xi     pAesdmaPri->bEvenScrmbPatternEn = FALSE;
104*53ee8cc1Swenshuai.xi     pAesdmaPri->bOddScrmbPatternEn = FALSE;
105*53ee8cc1Swenshuai.xi     pAesdmaPri->bSetKey = FALSE;
106*53ee8cc1Swenshuai.xi     pAesdmaPri->bSetEng = FALSE;
107*53ee8cc1Swenshuai.xi     pAesdmaPri->bSetIV = FALSE;
108*53ee8cc1Swenshuai.xi     pAesdmaPri->bHwParserEn = FALSE;
109*53ee8cc1Swenshuai.xi     pAesdmaPri->bPid0En = FALSE;
110*53ee8cc1Swenshuai.xi     pAesdmaPri->bPid1En = FALSE;
111*53ee8cc1Swenshuai.xi     pAesdmaPri->bMaskScrmbEn = FALSE;
112*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAKeyIndex = _MDrv_AESDMA_SetKeyIndex;
113*53ee8cc1Swenshuai.xi     pAesdmaPri->u32KeyIndexEven = 0x0;
114*53ee8cc1Swenshuai.xi     pAesdmaPri->u32KeyIndexOdd = 0x0;
115*53ee8cc1Swenshuai.xi     pAesdmaPri->bEnableKeyIndexEvenKey = FALSE;
116*53ee8cc1Swenshuai.xi     pAesdmaPri->bEnableKeyIndexOddKey = FALSE;
117*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAesCtr64 = _MDrv_AESDMA_SetAesCtr64;
118*53ee8cc1Swenshuai.xi     pAesdmaPri->bEnableAesCtr64 = FALSE;
119*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASecureKeyIdx = _MDrv_AESDMA_SetSecuredKeyIndex;
120*53ee8cc1Swenshuai.xi     pAesdmaPri->u8SecureKeyIndex = 1;
121*53ee8cc1Swenshuai.xi     pAesdmaPri->u32miunum = 0;
122*53ee8cc1Swenshuai.xi     return UTOPIA_STATUS_SUCCESS;
123*53ee8cc1Swenshuai.xi }
124*53ee8cc1Swenshuai.xi 
AESDMAIoctl(void * pInstance,MS_U32 u32Cmd,void * pArgs)125*53ee8cc1Swenshuai.xi MS_U32 AESDMAIoctl(void* pInstance, MS_U32 u32Cmd, void* pArgs)
126*53ee8cc1Swenshuai.xi {
127*53ee8cc1Swenshuai.xi     PAESDMA_INIT pInitParam = NULL;
128*53ee8cc1Swenshuai.xi     PAESDMA_FILE_INOUT pFileInOutParam = NULL;
129*53ee8cc1Swenshuai.xi     PAESDMA_SEL_ENG pSelEngParam = NULL;
130*53ee8cc1Swenshuai.xi     PAESDMA_SET_PS pSetPSParam = NULL;
131*53ee8cc1Swenshuai.xi     PAESDMA_NOTIFY pNotifyParam = NULL;
132*53ee8cc1Swenshuai.xi     PAESDMA_RAND pRandParam = NULL;
133*53ee8cc1Swenshuai.xi     PRSA_CALCULATE pRSACalParam = NULL;
134*53ee8cc1Swenshuai.xi     PRSA_OUTPUT pRSAOutParam = NULL;
135*53ee8cc1Swenshuai.xi     PSHA_CALCULATE pSHACalParam = NULL;
136*53ee8cc1Swenshuai.xi     PSHA_CALCULATE_MANUAL pSHACalManualParam = NULL;
137*53ee8cc1Swenshuai.xi     PAESDMA_PARSER_CONFIGURATIONS pParserConfigurations = NULL;
138*53ee8cc1Swenshuai.xi     PAESDMA_PARSER_PID_CONFIGURATIONS pParserPidConfigurations = NULL;
139*53ee8cc1Swenshuai.xi 
140*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = 0;
141*53ee8cc1Swenshuai.xi     MS_BOOL bEnable = 0;
142*53ee8cc1Swenshuai.xi     AESDMA_INSTANT_PRIVATE* psAesInstPri = NULL;
143*53ee8cc1Swenshuai.xi     AESDMA_RESOURCE_SHARED* psAesResourceShared = NULL;
144*53ee8cc1Swenshuai.xi     RSA_RESOURCE_SHARED* psRSAResourceShared = NULL;
145*53ee8cc1Swenshuai.xi     PHDCP_CIPHER psHDCPData = NULL;
146*53ee8cc1Swenshuai.xi     PHDCP_CIPHER_STATE psHDCPCipherState = NULL;
147*53ee8cc1Swenshuai.xi     PAESDMA_KEY_INDEX psAESDMAKeyIndex = NULL;
148*53ee8cc1Swenshuai.xi 
149*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psAesInstPri);
150*53ee8cc1Swenshuai.xi     void* pResource = NULL;
151*53ee8cc1Swenshuai.xi     void* pModule = NULL;
152*53ee8cc1Swenshuai.xi     UtopiaInstanceGetModule(pInstance, &pModule);
153*53ee8cc1Swenshuai.xi     MS_VIRT u32Addr = 0;
154*53ee8cc1Swenshuai.xi     MS_U32 u32ShmId = 0;
155*53ee8cc1Swenshuai.xi     MS_U32 u32BufSize = 0;
156*53ee8cc1Swenshuai.xi     MS_VIRT u32IVarrayAddr = 0;
157*53ee8cc1Swenshuai.xi     MS_VIRT u32KeyarryAddr = 0;
158*53ee8cc1Swenshuai.xi     MS_U32 u32timeout_count = 0;
159*53ee8cc1Swenshuai.xi     MS_U32 u32timeout_value = 0;
160*53ee8cc1Swenshuai.xi 
161*53ee8cc1Swenshuai.xi     switch(u32Cmd)
162*53ee8cc1Swenshuai.xi     {
163*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Init:
164*53ee8cc1Swenshuai.xi             {
165*53ee8cc1Swenshuai.xi                 pInitParam = (PAESDMA_INIT)pArgs;
166*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMAInit)(pInitParam->u32miu0addr,pInitParam->u32miu1addr,pInitParam->u32miunum);
167*53ee8cc1Swenshuai.xi 
168*53ee8cc1Swenshuai.xi                 psAesInstPri->u32miu0addr = pInitParam->u32miu0addr;
169*53ee8cc1Swenshuai.xi                 psAesInstPri->u32miu1addr = pInitParam->u32miu1addr;
170*53ee8cc1Swenshuai.xi                 psAesInstPri->u32miunum = pInitParam->u32miunum;
171*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "[AESDMA INFO]u32miu0addr = %lx\n",psAesInstPri->u32miu0addr));
172*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "[AESDMA INFO]u32miu1addr = %lx\n",psAesInstPri->u32miu1addr));
173*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "[AESDMA INFO]u32miunum = %lx\n",psAesInstPri->u32miunum));
174*53ee8cc1Swenshuai.xi 
175*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
176*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
177*53ee8cc1Swenshuai.xi                 else
178*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
179*53ee8cc1Swenshuai.xi             }
180*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetIV:
181*53ee8cc1Swenshuai.xi             {
182*53ee8cc1Swenshuai.xi                 memcpy((void *)psAesInstPri->InitVector,(void *)pArgs,16);
183*53ee8cc1Swenshuai.xi                 psAesInstPri->bSetIV = TRUE;
184*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
185*53ee8cc1Swenshuai.xi             }
186*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Reset:
187*53ee8cc1Swenshuai.xi             {
188*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMAReset)();
189*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
190*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
191*53ee8cc1Swenshuai.xi                 else
192*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
193*53ee8cc1Swenshuai.xi             }
194*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetFileInOut:
195*53ee8cc1Swenshuai.xi             {
196*53ee8cc1Swenshuai.xi                 pFileInOutParam = (PAESDMA_FILE_INOUT)pArgs;
197*53ee8cc1Swenshuai.xi                 psAesInstPri->u32FileinAddr = pFileInOutParam->u32FileinAddr;
198*53ee8cc1Swenshuai.xi                 psAesInstPri->u32FileInNum = pFileInOutParam->u32FileInNum;
199*53ee8cc1Swenshuai.xi                 psAesInstPri->u32FileOutSAddr = pFileInOutParam->u32FileOutSAddr;
200*53ee8cc1Swenshuai.xi                 psAesInstPri->u32FileOutEAddr = pFileInOutParam->u32FileOutEAddr;
201*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "[AESDMA INFO]FileinAddr = %lx\n",psAesInstPri->u32FileinAddr));
202*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "[AESDMA INFO]FileInNum = %lx\n",psAesInstPri->u32FileInNum));
203*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "[AESDMA INFO]FileOutSAddr = %lx\n",psAesInstPri->u32FileOutSAddr));
204*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "[AESDMA INFO]FileOutEAddr = %lx\n",psAesInstPri->u32FileOutEAddr));
205*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
206*53ee8cc1Swenshuai.xi             }
207*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetKey:
208*53ee8cc1Swenshuai.xi             {
209*53ee8cc1Swenshuai.xi                 memcpy((void *)psAesInstPri->CipherKey,(void *)pArgs,16);
210*53ee8cc1Swenshuai.xi                 psAesInstPri->bSetKey = TRUE;
211*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
212*53ee8cc1Swenshuai.xi             }
213*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SelEng:
214*53ee8cc1Swenshuai.xi             {
215*53ee8cc1Swenshuai.xi                 pSelEngParam = (PAESDMA_SEL_ENG)pArgs;
216*53ee8cc1Swenshuai.xi                 psAesInstPri->eMode = pSelEngParam->eMode;
217*53ee8cc1Swenshuai.xi                 psAesInstPri->bDescrypt = pSelEngParam->bDescrypt;
218*53ee8cc1Swenshuai.xi 				psAesInstPri->bSetEng = TRUE;
219*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "[AESDMA INFO]mode = %x\n",psAesInstPri->eMode));
220*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "[AESDMA INFO]Descrypt = %x\n",psAesInstPri->bDescrypt));
221*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
222*53ee8cc1Swenshuai.xi             }
223*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Start:
224*53ee8cc1Swenshuai.xi             {
225*53ee8cc1Swenshuai.xi                 if(UtopiaResourceObtain(pModule, AESDMA_POOL_ID_AES, &pResource) != 0)
226*53ee8cc1Swenshuai.xi                 {
227*53ee8cc1Swenshuai.xi                     ULOGE(TAG_AESDMA, "UtopiaResourceObtainToInstant fail\n");
228*53ee8cc1Swenshuai.xi 		            return UTOPIA_STATUS_ERR_NOT_AVAIL;
229*53ee8cc1Swenshuai.xi                 }
230*53ee8cc1Swenshuai.xi 
231*53ee8cc1Swenshuai.xi                 if(FALSE == MsOS_SHM_GetId((MS_U8*)"AESDMA driver", sizeof(AESDMA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
232*53ee8cc1Swenshuai.xi                 {
233*53ee8cc1Swenshuai.xi                     if(FALSE == MsOS_SHM_GetId((MS_U8*)"AESDMA driver", sizeof(AESDMA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_CREATE))
234*53ee8cc1Swenshuai.xi                     {
235*53ee8cc1Swenshuai.xi                         ULOGE(TAG_AESDMA, "[AESDMA INFO]create Resouce shared memory fail\n");
236*53ee8cc1Swenshuai.xi                         return UTOPIA_STATUS_ERR_NOMEM;
237*53ee8cc1Swenshuai.xi                     }
238*53ee8cc1Swenshuai.xi                     memset( (MS_U8*)u32Addr, 0, sizeof(AESDMA_RESOURCE_SHARED));
239*53ee8cc1Swenshuai.xi                 }
240*53ee8cc1Swenshuai.xi 
241*53ee8cc1Swenshuai.xi                 psAesResourceShared = (AESDMA_RESOURCE_SHARED*)u32Addr;
242*53ee8cc1Swenshuai.xi 
243*53ee8cc1Swenshuai.xi                 psAesResourceShared->pAESResource = pResource;
244*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "\n[AESDMA INFO]pResource = %x\n",(MS_U32)psAesResourceShared->pAESResource));
245*53ee8cc1Swenshuai.xi 
246*53ee8cc1Swenshuai.xi                 //AESDMA reset
247*53ee8cc1Swenshuai.xi                 if ((psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CTR)||
248*53ee8cc1Swenshuai.xi                     (psAesInstPri->eMode == E_DRVAESDMA_CIPHER_DES_CTR)||
249*53ee8cc1Swenshuai.xi                     (psAesInstPri->eMode == E_DRVAESDMA_CIPHER_TDES_CTR))
250*53ee8cc1Swenshuai.xi                 {
251*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMANormalReset)();
252*53ee8cc1Swenshuai.xi                 }
253*53ee8cc1Swenshuai.xi                 else
254*53ee8cc1Swenshuai.xi                 {
255*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMAReset)();
256*53ee8cc1Swenshuai.xi                 }
257*53ee8cc1Swenshuai.xi 
258*53ee8cc1Swenshuai.xi                 //AESDMA set mode and select encrypt or decrypt
259*53ee8cc1Swenshuai.xi                 if (psAesInstPri->bSetEng == TRUE)
260*53ee8cc1Swenshuai.xi                 {
261*53ee8cc1Swenshuai.xi                     //AESDMA set mode and select encrypt or decrypt
262*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMASelEng)(psAesInstPri->eMode,psAesInstPri->bDescrypt);
263*53ee8cc1Swenshuai.xi                     psAesInstPri->bSetEng = FALSE;
264*53ee8cc1Swenshuai.xi                 }
265*53ee8cc1Swenshuai.xi 
266*53ee8cc1Swenshuai.xi                 //AESDMA set FileInOut info
267*53ee8cc1Swenshuai.xi                 (psAesInstPri->fpAESDMASetFileInOut)(psAesInstPri->u32FileinAddr,psAesInstPri->u32FileInNum,psAesInstPri->u32FileOutSAddr,psAesInstPri->u32FileOutEAddr);
268*53ee8cc1Swenshuai.xi 
269*53ee8cc1Swenshuai.xi                 //AESDMA set key
270*53ee8cc1Swenshuai.xi                 if(psAesInstPri->bEnableTwoKey==1)
271*53ee8cc1Swenshuai.xi                 {
272*53ee8cc1Swenshuai.xi                     u32KeyarryAddr = (MS_VIRT)&psAesInstPri->CipherOddKey[0];
273*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMASetKeySel)((MS_U32*)u32KeyarryAddr, E_DRVAESDMA_ODD_KEY);
274*53ee8cc1Swenshuai.xi 
275*53ee8cc1Swenshuai.xi                     u32KeyarryAddr = (MS_VIRT)&psAesInstPri->CipherKey[0];
276*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMASetKeySel)((MS_U32*)u32KeyarryAddr, E_DRVAESDMA_EVEN_KEY);
277*53ee8cc1Swenshuai.xi                 }
278*53ee8cc1Swenshuai.xi                 else
279*53ee8cc1Swenshuai.xi                 {
280*53ee8cc1Swenshuai.xi                     if(psAesInstPri->bSecretKey==1)
281*53ee8cc1Swenshuai.xi                     {
282*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMASecureKeyIdx)(psAesInstPri->u8SecureKeyIndex);
283*53ee8cc1Swenshuai.xi                     }
284*53ee8cc1Swenshuai.xi                     else
285*53ee8cc1Swenshuai.xi                     {
286*53ee8cc1Swenshuai.xi                         u32KeyarryAddr = (MS_VIRT)&psAesInstPri->CipherKey[0];
287*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMASetKey)((MS_U32*)u32KeyarryAddr);
288*53ee8cc1Swenshuai.xi                     }
289*53ee8cc1Swenshuai.xi                 }
290*53ee8cc1Swenshuai.xi 
291*53ee8cc1Swenshuai.xi                 //AESDMA set IV
292*53ee8cc1Swenshuai.xi                 if((psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CBC)||
293*53ee8cc1Swenshuai.xi                    (psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CTR)||
294*53ee8cc1Swenshuai.xi                    (psAesInstPri->eMode == E_DRVAESDMA_CIPHER_TDES_CTR)||
295*53ee8cc1Swenshuai.xi                    (psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CTS_CBC))
296*53ee8cc1Swenshuai.xi                 {
297*53ee8cc1Swenshuai.xi                     u32IVarrayAddr = (MS_VIRT)&psAesInstPri->InitVector[0];
298*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMASetIV)((MS_U32*)u32IVarrayAddr);
299*53ee8cc1Swenshuai.xi                     psAesInstPri->bSetIV = FALSE;
300*53ee8cc1Swenshuai.xi 
301*53ee8cc1Swenshuai.xi 
302*53ee8cc1Swenshuai.xi                     if(psAesInstPri->bEnableTwoKey==1)
303*53ee8cc1Swenshuai.xi                     {
304*53ee8cc1Swenshuai.xi                         u32IVarrayAddr = (MS_VIRT)&psAesInstPri->InitVectorOdd[0];
305*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMASetOddIv)((MS_U32*)u32IVarrayAddr);
306*53ee8cc1Swenshuai.xi                     }
307*53ee8cc1Swenshuai.xi                 }
308*53ee8cc1Swenshuai.xi 
309*53ee8cc1Swenshuai.xi                 // HW Parser configurations
310*53ee8cc1Swenshuai.xi                 if (psAesInstPri->bHwParserEn == TRUE)
311*53ee8cc1Swenshuai.xi                 {
312*53ee8cc1Swenshuai.xi                     psAesInstPri->bHwParserEn = FALSE;
313*53ee8cc1Swenshuai.xi                     if (psAesInstPri->bParserDecrypt == TRUE)
314*53ee8cc1Swenshuai.xi                     {
315*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMAParserDecrypt)(psAesInstPri->eParserMode);
316*53ee8cc1Swenshuai.xi                     }
317*53ee8cc1Swenshuai.xi                     else
318*53ee8cc1Swenshuai.xi                     {
319*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMAParserEncrypt)(psAesInstPri->eParserMode);
320*53ee8cc1Swenshuai.xi                     }
321*53ee8cc1Swenshuai.xi 
322*53ee8cc1Swenshuai.xi                     if (psAesInstPri->bEvenScrmbPatternEn == TRUE)
323*53ee8cc1Swenshuai.xi                     {
324*53ee8cc1Swenshuai.xi                         psAesInstPri->bEvenScrmbPatternEn = FALSE;
325*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMAParserSetScrmbPatten)(psAesInstPri->eScrmbPattern);
326*53ee8cc1Swenshuai.xi                     }
327*53ee8cc1Swenshuai.xi 
328*53ee8cc1Swenshuai.xi                     if (psAesInstPri->bOddScrmbPatternEn == TRUE)
329*53ee8cc1Swenshuai.xi                     {
330*53ee8cc1Swenshuai.xi                         psAesInstPri->bOddScrmbPatternEn = FALSE;
331*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMAParserSetAddedScrmbPattern)(psAesInstPri->eAddedScrmbPattern);
332*53ee8cc1Swenshuai.xi                     }
333*53ee8cc1Swenshuai.xi 
334*53ee8cc1Swenshuai.xi                     if (psAesInstPri->bMaskScrmbEn == TRUE)
335*53ee8cc1Swenshuai.xi                     {
336*53ee8cc1Swenshuai.xi                         psAesInstPri->bMaskScrmbEn = FALSE;
337*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMAParserMaskscrmb)(psAesInstPri->bMaskScrmb);
338*53ee8cc1Swenshuai.xi                     }
339*53ee8cc1Swenshuai.xi 
340*53ee8cc1Swenshuai.xi                     // Set PID
341*53ee8cc1Swenshuai.xi                     if (psAesInstPri->bBypassPid == TRUE)
342*53ee8cc1Swenshuai.xi                     {
343*53ee8cc1Swenshuai.xi                         psAesInstPri->bBypassPid = FALSE;
344*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMAParserBypassPid)(psAesInstPri->bBypassPid);
345*53ee8cc1Swenshuai.xi                     }
346*53ee8cc1Swenshuai.xi 
347*53ee8cc1Swenshuai.xi                     if (psAesInstPri->bPid0En == TRUE)
348*53ee8cc1Swenshuai.xi                     {
349*53ee8cc1Swenshuai.xi                         psAesInstPri->bPid0En = FALSE;
350*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMAParserSetPid)(psAesInstPri->u8PidIndex, psAesInstPri->u16Pid);
351*53ee8cc1Swenshuai.xi                     }
352*53ee8cc1Swenshuai.xi 
353*53ee8cc1Swenshuai.xi                     if (psAesInstPri->bPid1En == TRUE)
354*53ee8cc1Swenshuai.xi                     {
355*53ee8cc1Swenshuai.xi                         psAesInstPri->bPid1En = FALSE;
356*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMAParserSetPid)(psAesInstPri->u8PidIndex1, psAesInstPri->u16Pid1);
357*53ee8cc1Swenshuai.xi                     }
358*53ee8cc1Swenshuai.xi                 }
359*53ee8cc1Swenshuai.xi                 //CBC segmental decryption case
360*53ee8cc1Swenshuai.xi                 //if(((psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CBC)||(psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CTR)||(psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CTS_CBC))
361*53ee8cc1Swenshuai.xi                 //    && psAesInstPri->bDescrypt == TRUE)
362*53ee8cc1Swenshuai.xi                 if((((psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CBC)||(psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CTS_CBC))&& psAesInstPri->bDescrypt == TRUE)||
363*53ee8cc1Swenshuai.xi                     (psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CTR))
364*53ee8cc1Swenshuai.xi                 {
365*53ee8cc1Swenshuai.xi                     MS_U32 i;
366*53ee8cc1Swenshuai.xi                     MS_VIRT FileinVirtAddr;
367*53ee8cc1Swenshuai.xi 
368*53ee8cc1Swenshuai.xi                     FileinVirtAddr = MsOS_PA2KSEG1(psAesInstPri->u32FileinAddr);
369*53ee8cc1Swenshuai.xi 
370*53ee8cc1Swenshuai.xi                     if(psAesInstPri->eMode != E_DRVAESDMA_CIPHER_CTR)
371*53ee8cc1Swenshuai.xi                     {
372*53ee8cc1Swenshuai.xi                         for(i = 0; i < 16; i++)
373*53ee8cc1Swenshuai.xi                         {
374*53ee8cc1Swenshuai.xi                             psAesInstPri->InitVector[i] = *(MS_U8 *)(FileinVirtAddr + psAesInstPri->u32FileInNum-1-i);
375*53ee8cc1Swenshuai.xi                             MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "[AESDMA INFO]Init Vector[%d] = 0x%x\n",(MS_U32)i, psAesInstPri->InitVector[i]));
376*53ee8cc1Swenshuai.xi                         }
377*53ee8cc1Swenshuai.xi                     }
378*53ee8cc1Swenshuai.xi                 }
379*53ee8cc1Swenshuai.xi 
380*53ee8cc1Swenshuai.xi                 //AESDMA set FileInOut info
381*53ee8cc1Swenshuai.xi                 (psAesInstPri->fpAESDMASetFileInOut)(psAesInstPri->u32FileinAddr,psAesInstPri->u32FileInNum,psAesInstPri->u32FileOutSAddr,psAesInstPri->u32FileOutEAddr);
382*53ee8cc1Swenshuai.xi 
383*53ee8cc1Swenshuai.xi                 //AESDMA set key
384*53ee8cc1Swenshuai.xi                 if(psAesInstPri->bSecretKey==1)
385*53ee8cc1Swenshuai.xi                 {
386*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMASecureKeyIdx)(psAesInstPri->u8SecureKeyIndex);
387*53ee8cc1Swenshuai.xi                 }
388*53ee8cc1Swenshuai.xi                 else
389*53ee8cc1Swenshuai.xi                 {
390*53ee8cc1Swenshuai.xi                     u32KeyarryAddr = (MS_VIRT)&psAesInstPri->CipherKey[0];
391*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMASetKey)((MS_U32*)u32KeyarryAddr);
392*53ee8cc1Swenshuai.xi                 }
393*53ee8cc1Swenshuai.xi 
394*53ee8cc1Swenshuai.xi                 //Set Key Index
395*53ee8cc1Swenshuai.xi                 if(psAesInstPri->bEnableKeyIndexEvenKey == TRUE)
396*53ee8cc1Swenshuai.xi                 {
397*53ee8cc1Swenshuai.xi                     psAesInstPri->bEnableKeyIndexEvenKey = FALSE;
398*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMAKeyIndex) (psAesInstPri->u32KeyIndexEven, FALSE);
399*53ee8cc1Swenshuai.xi                 }
400*53ee8cc1Swenshuai.xi 
401*53ee8cc1Swenshuai.xi                 if(psAesInstPri->bEnableKeyIndexOddKey == TRUE)
402*53ee8cc1Swenshuai.xi                 {
403*53ee8cc1Swenshuai.xi                     psAesInstPri->bEnableKeyIndexOddKey = FALSE;
404*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMAKeyIndex) (psAesInstPri->u32KeyIndexOdd, TRUE);
405*53ee8cc1Swenshuai.xi                 }
406*53ee8cc1Swenshuai.xi 
407*53ee8cc1Swenshuai.xi                 //Set AESDMA CTR 64 Enable
408*53ee8cc1Swenshuai.xi                 psAesInstPri->fpAesCtr64 (psAesInstPri->bEnableAesCtr64);
409*53ee8cc1Swenshuai.xi 
410*53ee8cc1Swenshuai.xi                 //AESDMA trigger start
411*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMAStart)(1);
412*53ee8cc1Swenshuai.xi 
413*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
414*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
415*53ee8cc1Swenshuai.xi                 else
416*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
417*53ee8cc1Swenshuai.xi             }
418*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_GetStatus:
419*53ee8cc1Swenshuai.xi             {
420*53ee8cc1Swenshuai.xi                 if ((psAesInstPri->fpAESDMAGetStatus)(&u32Ret) == UTOPIA_STATUS_SUCCESS)
421*53ee8cc1Swenshuai.xi                 {
422*53ee8cc1Swenshuai.xi                     *(MS_U32 *)pArgs = u32Ret;
423*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
424*53ee8cc1Swenshuai.xi                 }
425*53ee8cc1Swenshuai.xi                 else
426*53ee8cc1Swenshuai.xi                 {
427*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
428*53ee8cc1Swenshuai.xi                 }
429*53ee8cc1Swenshuai.xi             }
430*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_IsFinished:
431*53ee8cc1Swenshuai.xi             {
432*53ee8cc1Swenshuai.xi                 if(pArgs)
433*53ee8cc1Swenshuai.xi                 {
434*53ee8cc1Swenshuai.xi                     u32timeout_value = *(MS_U32 *)pArgs;
435*53ee8cc1Swenshuai.xi                 }
436*53ee8cc1Swenshuai.xi                 else
437*53ee8cc1Swenshuai.xi                 {
438*53ee8cc1Swenshuai.xi                     ULOGE(TAG_AESDMA, "[AESDMA INFO] Please pass timeout value to driver\n");
439*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_ERR_INV;
440*53ee8cc1Swenshuai.xi                 }
441*53ee8cc1Swenshuai.xi 
442*53ee8cc1Swenshuai.xi                 if ((u32timeout_value < 1) | (u32timeout_value > AES_MAX_TIMEOUT_VALUE))
443*53ee8cc1Swenshuai.xi                 {
444*53ee8cc1Swenshuai.xi                     ULOGE(TAG_AESDMA, "[AESDMA INFO] Invalid timeout value\n");
445*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_ERR_INV;
446*53ee8cc1Swenshuai.xi                 }
447*53ee8cc1Swenshuai.xi 
448*53ee8cc1Swenshuai.xi 
449*53ee8cc1Swenshuai.xi                 if (FALSE == MsOS_SHM_GetId((MS_U8*)"AESDMA driver", sizeof(AESDMA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
450*53ee8cc1Swenshuai.xi                 {
451*53ee8cc1Swenshuai.xi                     ULOGE(TAG_AESDMA, "[AESDMA INFO]query Resouce shared memory fail\n");
452*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_ERR_NOMEM;
453*53ee8cc1Swenshuai.xi                 }
454*53ee8cc1Swenshuai.xi                 else
455*53ee8cc1Swenshuai.xi                 {
456*53ee8cc1Swenshuai.xi                     psAesResourceShared = (AESDMA_RESOURCE_SHARED*)u32Addr;
457*53ee8cc1Swenshuai.xi                     pResource = psAesResourceShared->pAESResource;
458*53ee8cc1Swenshuai.xi                     MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "\n[AESDMA INFO]pResource = %x\n",(MS_U32)psAesResourceShared->pAESResource));
459*53ee8cc1Swenshuai.xi                 }
460*53ee8cc1Swenshuai.xi 
461*53ee8cc1Swenshuai.xi                 psAesInstPri->fpAESDMAIsFinished(&u32Ret);
462*53ee8cc1Swenshuai.xi                 while (u32Ret != DRVAESDMA_OK)
463*53ee8cc1Swenshuai.xi 				{
464*53ee8cc1Swenshuai.xi 					MsOS_DelayTaskUs(10);
465*53ee8cc1Swenshuai.xi 					u32timeout_count++;
466*53ee8cc1Swenshuai.xi 
467*53ee8cc1Swenshuai.xi 					//timeout
468*53ee8cc1Swenshuai.xi 					if(u32timeout_count>u32timeout_value)
469*53ee8cc1Swenshuai.xi 					{
470*53ee8cc1Swenshuai.xi 						(psAesInstPri->fpAESDMAReset)();
471*53ee8cc1Swenshuai.xi                         UtopiaResourceRelease(pResource);
472*53ee8cc1Swenshuai.xi                         ULOGE(TAG_AESDMA, "[AESDMA ERROR] AESDMA timeout happened\n");
473*53ee8cc1Swenshuai.xi 						return UTOPIA_STATUS_FAIL;
474*53ee8cc1Swenshuai.xi 					}
475*53ee8cc1Swenshuai.xi                     psAesInstPri->fpAESDMAIsFinished(&u32Ret);
476*53ee8cc1Swenshuai.xi 				}
477*53ee8cc1Swenshuai.xi 
478*53ee8cc1Swenshuai.xi                 //CBC segmental encryption case
479*53ee8cc1Swenshuai.xi                 if(((psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CBC)||(psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CTS_CBC))
480*53ee8cc1Swenshuai.xi                     && psAesInstPri->bDescrypt == FALSE)
481*53ee8cc1Swenshuai.xi                 {
482*53ee8cc1Swenshuai.xi                     //printf("[AESDMA]FileOutStartAddr PA = %x\n",psAesInstPri->u32FileOutSAddr);
483*53ee8cc1Swenshuai.xi                     //printf("[AESDMA]Descrypt = %x\n",psAesInstPri->bDescrypt);
484*53ee8cc1Swenshuai.xi                     MS_U32 i;
485*53ee8cc1Swenshuai.xi                     MS_VIRT FileOutStartVirtAddr;
486*53ee8cc1Swenshuai.xi 
487*53ee8cc1Swenshuai.xi                     FileOutStartVirtAddr = MsOS_PA2KSEG1(psAesInstPri->u32FileOutSAddr);
488*53ee8cc1Swenshuai.xi 
489*53ee8cc1Swenshuai.xi                     for(i = 0; i < 16; i++)
490*53ee8cc1Swenshuai.xi                     {
491*53ee8cc1Swenshuai.xi                         psAesInstPri->InitVector[i] = *(MS_U8 *)(FileOutStartVirtAddr+psAesInstPri->u32FileInNum-1-i);
492*53ee8cc1Swenshuai.xi                         MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "[AESDMA INFO]Init Vector[%d] = 0x%x\n",(MS_U32)i, psAesInstPri->InitVector[i]));
493*53ee8cc1Swenshuai.xi                     }
494*53ee8cc1Swenshuai.xi                 }
495*53ee8cc1Swenshuai.xi 
496*53ee8cc1Swenshuai.xi                 //clear secret key setting
497*53ee8cc1Swenshuai.xi                 psAesInstPri->bSecretKey = 0;
498*53ee8cc1Swenshuai.xi 
499*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(pResource);
500*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "[AESDMA INFO]MDrv_AESDMA_IsFinished\n"));
501*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
502*53ee8cc1Swenshuai.xi             }
503*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetClk:
504*53ee8cc1Swenshuai.xi             {
505*53ee8cc1Swenshuai.xi                 bEnable = *(MS_BOOL *)pArgs;
506*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMASetClk)(bEnable);
507*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
508*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
509*53ee8cc1Swenshuai.xi                 else
510*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
511*53ee8cc1Swenshuai.xi             }
512*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetSecureKey:
513*53ee8cc1Swenshuai.xi             {
514*53ee8cc1Swenshuai.xi                 psAesInstPri->bSecretKey = 1;
515*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
516*53ee8cc1Swenshuai.xi             }
517*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetPS:
518*53ee8cc1Swenshuai.xi             {
519*53ee8cc1Swenshuai.xi                 pSetPSParam = (PAESDMA_SET_PS)pArgs;
520*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMASetPS)(pSetPSParam->u32PTN,pSetPSParam->u32Mask,pSetPSParam->bPSin_Enable,pSetPSParam->bPSout_Enable);
521*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
522*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
523*53ee8cc1Swenshuai.xi                 else
524*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
525*53ee8cc1Swenshuai.xi             }
526*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_PSRelease:
527*53ee8cc1Swenshuai.xi             {
528*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMAPSRelease)();
529*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
530*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
531*53ee8cc1Swenshuai.xi                 else
532*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
533*53ee8cc1Swenshuai.xi             }
534*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_GetPSMatchedByteCNT:
535*53ee8cc1Swenshuai.xi             {
536*53ee8cc1Swenshuai.xi                 (psAesInstPri->fpAESDMAGetPSMatchedByteCNT)(&u32Ret);
537*53ee8cc1Swenshuai.xi                 return u32Ret;
538*53ee8cc1Swenshuai.xi             }
539*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_GetPSMatchedPTN:
540*53ee8cc1Swenshuai.xi             {
541*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMAGetPSMatchedPTN)();
542*53ee8cc1Swenshuai.xi                 return u32Ret;
543*53ee8cc1Swenshuai.xi             }
544*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Notify:
545*53ee8cc1Swenshuai.xi             {
546*53ee8cc1Swenshuai.xi                 pNotifyParam = (PAESDMA_NOTIFY)pArgs;
547*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMANotify)(pNotifyParam->eEvents,pNotifyParam->pfCallback);
548*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
549*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
550*53ee8cc1Swenshuai.xi                 else
551*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
552*53ee8cc1Swenshuai.xi             }
553*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Rand:
554*53ee8cc1Swenshuai.xi             {
555*53ee8cc1Swenshuai.xi                 pRandParam = (PAESDMA_RAND)pArgs;
556*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMARand)(pRandParam->u32PABuf,pRandParam->u32Size);
557*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
558*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
559*53ee8cc1Swenshuai.xi                 else
560*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
561*53ee8cc1Swenshuai.xi             }
562*53ee8cc1Swenshuai.xi         case MDrv_CMD_RSA_Calculate:
563*53ee8cc1Swenshuai.xi             {
564*53ee8cc1Swenshuai.xi                 pRSACalParam = (PRSA_CALCULATE)pArgs;
565*53ee8cc1Swenshuai.xi                 if(UtopiaResourceObtain(pModule, AESDMA_POOL_ID_RSA, &pResource) != 0)
566*53ee8cc1Swenshuai.xi                 {
567*53ee8cc1Swenshuai.xi                     ULOGE(TAG_AESDMA, "UtopiaResourceObtainToInstant fail\n");
568*53ee8cc1Swenshuai.xi 		            return UTOPIA_STATUS_ERR_NOT_AVAIL;
569*53ee8cc1Swenshuai.xi                 }
570*53ee8cc1Swenshuai.xi 
571*53ee8cc1Swenshuai.xi                 if(FALSE == MsOS_SHM_GetId((MS_U8*)"RSA driver", sizeof(RSA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
572*53ee8cc1Swenshuai.xi                 {
573*53ee8cc1Swenshuai.xi                     if(FALSE == MsOS_SHM_GetId((MS_U8*)"RSA driver", sizeof(RSA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_CREATE))
574*53ee8cc1Swenshuai.xi                     {
575*53ee8cc1Swenshuai.xi                         ULOGE(TAG_AESDMA, "[RSA INFO]create Resouce shared memory fail\n");
576*53ee8cc1Swenshuai.xi                         return UTOPIA_STATUS_ERR_NOMEM;
577*53ee8cc1Swenshuai.xi                     }
578*53ee8cc1Swenshuai.xi                     memset( (MS_U8*)u32Addr, 0, sizeof(RSA_RESOURCE_SHARED));
579*53ee8cc1Swenshuai.xi                 }
580*53ee8cc1Swenshuai.xi 
581*53ee8cc1Swenshuai.xi                 psRSAResourceShared = (RSA_RESOURCE_SHARED*)u32Addr;
582*53ee8cc1Swenshuai.xi 
583*53ee8cc1Swenshuai.xi                 psRSAResourceShared->pRSAResource = pResource;
584*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "\n[RSA INFO]pResource = %x\n",(MS_U32)psRSAResourceShared->pRSAResource));
585*53ee8cc1Swenshuai.xi 
586*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpRSACalculate)(pRSACalParam->pstSign,pRSACalParam->pstKey,pRSACalParam->eMode);
587*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
588*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
589*53ee8cc1Swenshuai.xi                 else
590*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
591*53ee8cc1Swenshuai.xi             }
592*53ee8cc1Swenshuai.xi         case MDrv_CMD_RSA_IsFinished:
593*53ee8cc1Swenshuai.xi             {
594*53ee8cc1Swenshuai.xi                 if(pArgs)
595*53ee8cc1Swenshuai.xi                 {
596*53ee8cc1Swenshuai.xi                     u32timeout_value = *(MS_U32 *)pArgs;
597*53ee8cc1Swenshuai.xi                 }
598*53ee8cc1Swenshuai.xi                 else
599*53ee8cc1Swenshuai.xi                 {
600*53ee8cc1Swenshuai.xi                     ULOGE(TAG_AESDMA, "[RSA INFO] Please pass timeout value to driver\n");
601*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_ERR_INV;
602*53ee8cc1Swenshuai.xi                 }
603*53ee8cc1Swenshuai.xi 
604*53ee8cc1Swenshuai.xi                 if (u32timeout_value > RSA_MAX_TIMEOUT_VALUE)
605*53ee8cc1Swenshuai.xi                 {
606*53ee8cc1Swenshuai.xi                     ULOGE(TAG_AESDMA, "[RSA INFO] Invalid timeout value\n");
607*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_ERR_INV;
608*53ee8cc1Swenshuai.xi                 }
609*53ee8cc1Swenshuai.xi 
610*53ee8cc1Swenshuai.xi                 if (FALSE == MsOS_SHM_GetId((MS_U8*)"RSA driver", sizeof(RSA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
611*53ee8cc1Swenshuai.xi                 {
612*53ee8cc1Swenshuai.xi                     ULOGE(TAG_AESDMA, "[RSA INFO]query Resouce shared memory fail\n");
613*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_ERR_NOMEM;
614*53ee8cc1Swenshuai.xi                 }
615*53ee8cc1Swenshuai.xi                 else
616*53ee8cc1Swenshuai.xi                 {
617*53ee8cc1Swenshuai.xi                     psRSAResourceShared = (RSA_RESOURCE_SHARED*)u32Addr;
618*53ee8cc1Swenshuai.xi                     pResource = psRSAResourceShared->pRSAResource;
619*53ee8cc1Swenshuai.xi                     MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "\n[RSA INFO]pResource = %x\n",(MS_U32)psRSAResourceShared->pRSAResource));
620*53ee8cc1Swenshuai.xi                 }
621*53ee8cc1Swenshuai.xi 
622*53ee8cc1Swenshuai.xi                 while ((psAesInstPri->fpRSAIsFinished)() != DRVAESDMA_OK)
623*53ee8cc1Swenshuai.xi 				{
624*53ee8cc1Swenshuai.xi 					MsOS_DelayTaskUs(10);
625*53ee8cc1Swenshuai.xi 					u32timeout_count++;
626*53ee8cc1Swenshuai.xi 
627*53ee8cc1Swenshuai.xi 					//timeout
628*53ee8cc1Swenshuai.xi 					if(u32timeout_count>u32timeout_value)
629*53ee8cc1Swenshuai.xi 					{
630*53ee8cc1Swenshuai.xi                         UtopiaResourceRelease(pResource);
631*53ee8cc1Swenshuai.xi                         ULOGE(TAG_AESDMA, "[RSA ERROR] RSA timeout happened\n");
632*53ee8cc1Swenshuai.xi 						return UTOPIA_STATUS_FAIL;
633*53ee8cc1Swenshuai.xi 					}
634*53ee8cc1Swenshuai.xi 
635*53ee8cc1Swenshuai.xi 				}
636*53ee8cc1Swenshuai.xi 
637*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "[RSA INFO]MDrv_RSA_IsFinished\n"));
638*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
639*53ee8cc1Swenshuai.xi 
640*53ee8cc1Swenshuai.xi             }
641*53ee8cc1Swenshuai.xi         case MDrv_CMD_RSA_Output:
642*53ee8cc1Swenshuai.xi             {
643*53ee8cc1Swenshuai.xi                 if (FALSE == MsOS_SHM_GetId((MS_U8*)"RSA driver", sizeof(RSA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
644*53ee8cc1Swenshuai.xi                 {
645*53ee8cc1Swenshuai.xi                     ULOGE(TAG_AESDMA, "[RSA INFO]query Resouce shared memory fail\n");
646*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_ERR_NOMEM;
647*53ee8cc1Swenshuai.xi                 }
648*53ee8cc1Swenshuai.xi                 else
649*53ee8cc1Swenshuai.xi                 {
650*53ee8cc1Swenshuai.xi                     psRSAResourceShared = (RSA_RESOURCE_SHARED*)u32Addr;
651*53ee8cc1Swenshuai.xi                     pResource = psRSAResourceShared->pRSAResource;
652*53ee8cc1Swenshuai.xi                     MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "\n[RSA INFO]pResource = %x\n",(MS_U32)psRSAResourceShared->pRSAResource));
653*53ee8cc1Swenshuai.xi                 }
654*53ee8cc1Swenshuai.xi 
655*53ee8cc1Swenshuai.xi                 pRSAOutParam = (PRSA_OUTPUT)pArgs;
656*53ee8cc1Swenshuai.xi                 while((psAesInstPri->fpRSAIsFinished)()==1);
657*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpRSAOutput)(pRSAOutParam->eMode,pRSAOutParam->pstRSAOut);
658*53ee8cc1Swenshuai.xi 
659*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(pResource);
660*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
661*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
662*53ee8cc1Swenshuai.xi                 else
663*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
664*53ee8cc1Swenshuai.xi             }
665*53ee8cc1Swenshuai.xi         case MDrv_CMD_SHA_Calculate:
666*53ee8cc1Swenshuai.xi             {
667*53ee8cc1Swenshuai.xi                 pSHACalParam = (PSHA_CALCULATE)pArgs;
668*53ee8cc1Swenshuai.xi                 if(UtopiaResourceObtain(pModule, AESDMA_POOL_ID_SHA, &pResource) != 0)
669*53ee8cc1Swenshuai.xi                 {
670*53ee8cc1Swenshuai.xi                     ULOGE(TAG_AESDMA, "UtopiaResourceObtainToInstant fail\n");
671*53ee8cc1Swenshuai.xi 		            return UTOPIA_STATUS_ERR_NOT_AVAIL;
672*53ee8cc1Swenshuai.xi                 }
673*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpSHACalculate)(pSHACalParam->eMode,pSHACalParam->u32PAInBuf,pSHACalParam->u32Size,pSHACalParam->u32PAOutBuf);
674*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(pResource);
675*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
676*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
677*53ee8cc1Swenshuai.xi                 else
678*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
679*53ee8cc1Swenshuai.xi             }
680*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Memcpy:
681*53ee8cc1Swenshuai.xi             {
682*53ee8cc1Swenshuai.xi                 if(UtopiaResourceObtain(pModule, AESDMA_POOL_ID_AES, &pResource) != 0)
683*53ee8cc1Swenshuai.xi                 {
684*53ee8cc1Swenshuai.xi                     ULOGE(TAG_AESDMA, "UtopiaResourceObtainToInstant fail\n");
685*53ee8cc1Swenshuai.xi 		            return UTOPIA_STATUS_ERR_NOT_AVAIL;
686*53ee8cc1Swenshuai.xi                 }
687*53ee8cc1Swenshuai.xi 
688*53ee8cc1Swenshuai.xi                 if(FALSE == MsOS_SHM_GetId((MS_U8*)"AESDMA driver", sizeof(AESDMA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
689*53ee8cc1Swenshuai.xi                 {
690*53ee8cc1Swenshuai.xi                     if(FALSE == MsOS_SHM_GetId((MS_U8*)"AESDMA driver", sizeof(AESDMA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_CREATE))
691*53ee8cc1Swenshuai.xi                     {
692*53ee8cc1Swenshuai.xi                         ULOGE(TAG_AESDMA, "[AESDMA INFO]create Resouce shared memory fail\n");
693*53ee8cc1Swenshuai.xi                         return UTOPIA_STATUS_ERR_NOMEM;
694*53ee8cc1Swenshuai.xi                     }
695*53ee8cc1Swenshuai.xi                     memset( (MS_U8*)u32Addr, 0, sizeof(AESDMA_RESOURCE_SHARED));
696*53ee8cc1Swenshuai.xi                 }
697*53ee8cc1Swenshuai.xi 
698*53ee8cc1Swenshuai.xi                 psAesResourceShared = (AESDMA_RESOURCE_SHARED*)u32Addr;
699*53ee8cc1Swenshuai.xi 
700*53ee8cc1Swenshuai.xi                 psAesResourceShared->pAESResource = pResource;
701*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "\n[AESDMA INFO]pResource = %x\n",(MS_U32)psAesResourceShared->pAESResource));
702*53ee8cc1Swenshuai.xi 
703*53ee8cc1Swenshuai.xi                 //AESDMA reset
704*53ee8cc1Swenshuai.xi                 (psAesInstPri->fpAESDMAReset)();
705*53ee8cc1Swenshuai.xi 
706*53ee8cc1Swenshuai.xi                 //AESDMA set FileInOut info
707*53ee8cc1Swenshuai.xi                 (psAesInstPri->fpAESDMASetFileInOut)(psAesInstPri->u32FileinAddr,psAesInstPri->u32FileInNum,psAesInstPri->u32FileOutSAddr,psAesInstPri->u32FileOutEAddr);
708*53ee8cc1Swenshuai.xi 
709*53ee8cc1Swenshuai.xi                 //AESDMA trigger start for using AESDMA replace BDMA case
710*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMAStart)(1);
711*53ee8cc1Swenshuai.xi 
712*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
713*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
714*53ee8cc1Swenshuai.xi                 else
715*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
716*53ee8cc1Swenshuai.xi             }
717*53ee8cc1Swenshuai.xi         case MDrv_CMD_SHA_CalculateManual:
718*53ee8cc1Swenshuai.xi             {
719*53ee8cc1Swenshuai.xi                 pSHACalManualParam = (PSHA_CALCULATE_MANUAL)pArgs;
720*53ee8cc1Swenshuai.xi                 if(UtopiaResourceObtain(pModule, AESDMA_POOL_ID_SHA, &pResource) != 0)
721*53ee8cc1Swenshuai.xi                 {
722*53ee8cc1Swenshuai.xi                     ULOGE(TAG_AESDMA, "UtopiaResourceObtainToInstant fail\n");
723*53ee8cc1Swenshuai.xi 		            return UTOPIA_STATUS_ERR_NOT_AVAIL;
724*53ee8cc1Swenshuai.xi                 }
725*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpSHACalculateManual)(pSHACalManualParam->stCfg,pSHACalManualParam->eStage,pSHACalManualParam->u32DoneBytes,pSHACalManualParam->pu8SetIV);
726*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(pResource);
727*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
728*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
729*53ee8cc1Swenshuai.xi                 else
730*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
731*53ee8cc1Swenshuai.xi             }
732*53ee8cc1Swenshuai.xi 
733*53ee8cc1Swenshuai.xi 
734*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_PARSER_SETADDEDSCRMBPATTERN:
735*53ee8cc1Swenshuai.xi             {
736*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
737*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
738*53ee8cc1Swenshuai.xi 
739*53ee8cc1Swenshuai.xi                 pParserConfigurations = (PAESDMA_PARSER_CONFIGURATIONS)pArgs;
740*53ee8cc1Swenshuai.xi                 psAesInstPri->eAddedScrmbPattern = pParserConfigurations->eAddedScrmbPattern;
741*53ee8cc1Swenshuai.xi                 psAesInstPri->bOddScrmbPatternEn = TRUE;
742*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
743*53ee8cc1Swenshuai.xi             }
744*53ee8cc1Swenshuai.xi 
745*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_PARSER_QUERYPIDCOUNT:
746*53ee8cc1Swenshuai.xi             {
747*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
748*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
749*53ee8cc1Swenshuai.xi 
750*53ee8cc1Swenshuai.xi                 psAesInstPri->fpAESDMAParserQueryPidCount(pArgs);
751*53ee8cc1Swenshuai.xi 
752*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
753*53ee8cc1Swenshuai.xi             }
754*53ee8cc1Swenshuai.xi 
755*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_PARSER_MASKSCRMB:
756*53ee8cc1Swenshuai.xi             {
757*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
758*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
759*53ee8cc1Swenshuai.xi 
760*53ee8cc1Swenshuai.xi                 bEnable = *(MS_BOOL *)pArgs;
761*53ee8cc1Swenshuai.xi                 psAesInstPri->bMaskScrmb = bEnable;
762*53ee8cc1Swenshuai.xi                 psAesInstPri->bMaskScrmbEn = TRUE;
763*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
764*53ee8cc1Swenshuai.xi             }
765*53ee8cc1Swenshuai.xi 
766*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_PARSER_SETSCRMBPATTERN:
767*53ee8cc1Swenshuai.xi             {
768*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
769*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
770*53ee8cc1Swenshuai.xi 
771*53ee8cc1Swenshuai.xi                 pParserConfigurations = (PAESDMA_PARSER_CONFIGURATIONS)pArgs;
772*53ee8cc1Swenshuai.xi                 psAesInstPri->eScrmbPattern = pParserConfigurations->eScrmbPattern;
773*53ee8cc1Swenshuai.xi                 psAesInstPri->bEvenScrmbPatternEn = TRUE;
774*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
775*53ee8cc1Swenshuai.xi             }
776*53ee8cc1Swenshuai.xi 
777*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_PARSER_BYPASSPID:
778*53ee8cc1Swenshuai.xi             {
779*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
780*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
781*53ee8cc1Swenshuai.xi 
782*53ee8cc1Swenshuai.xi                 pParserPidConfigurations = (PAESDMA_PARSER_PID_CONFIGURATIONS)pArgs;
783*53ee8cc1Swenshuai.xi                 psAesInstPri->bBypassPid = pParserPidConfigurations->bBypassPid;
784*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
785*53ee8cc1Swenshuai.xi             }
786*53ee8cc1Swenshuai.xi 
787*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_PARSER_SETPID:
788*53ee8cc1Swenshuai.xi             {
789*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
790*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
791*53ee8cc1Swenshuai.xi 
792*53ee8cc1Swenshuai.xi                 pParserPidConfigurations = (PAESDMA_PARSER_PID_CONFIGURATIONS)pArgs;
793*53ee8cc1Swenshuai.xi 
794*53ee8cc1Swenshuai.xi                 if (pParserPidConfigurations->u8PidIndex == 0)
795*53ee8cc1Swenshuai.xi                 {
796*53ee8cc1Swenshuai.xi                     psAesInstPri->u8PidIndex = pParserPidConfigurations->u8PidIndex;
797*53ee8cc1Swenshuai.xi                     psAesInstPri->u16Pid = pParserPidConfigurations->u16Pid;
798*53ee8cc1Swenshuai.xi                     psAesInstPri->bPid0En = TRUE;
799*53ee8cc1Swenshuai.xi                 }
800*53ee8cc1Swenshuai.xi                 else if (pParserPidConfigurations->u8PidIndex == 1)
801*53ee8cc1Swenshuai.xi                 {
802*53ee8cc1Swenshuai.xi                     psAesInstPri->u8PidIndex1 = pParserPidConfigurations->u8PidIndex;
803*53ee8cc1Swenshuai.xi                     psAesInstPri->u16Pid1 = pParserPidConfigurations->u16Pid;
804*53ee8cc1Swenshuai.xi                     psAesInstPri->bPid1En = TRUE;
805*53ee8cc1Swenshuai.xi                 }
806*53ee8cc1Swenshuai.xi 
807*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
808*53ee8cc1Swenshuai.xi             }
809*53ee8cc1Swenshuai.xi 
810*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_PARSER_ENCRYPT:
811*53ee8cc1Swenshuai.xi             {
812*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
813*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
814*53ee8cc1Swenshuai.xi 
815*53ee8cc1Swenshuai.xi                 pParserConfigurations = (PAESDMA_PARSER_CONFIGURATIONS)pArgs;
816*53ee8cc1Swenshuai.xi                 psAesInstPri->eParserMode = pParserConfigurations->eParserMode;
817*53ee8cc1Swenshuai.xi                 psAesInstPri->bParserDecrypt = FALSE;
818*53ee8cc1Swenshuai.xi                 psAesInstPri->bHwParserEn = TRUE;
819*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
820*53ee8cc1Swenshuai.xi             }
821*53ee8cc1Swenshuai.xi 
822*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_PARSER_DECRYPT:
823*53ee8cc1Swenshuai.xi             {
824*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
825*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
826*53ee8cc1Swenshuai.xi 
827*53ee8cc1Swenshuai.xi                 pParserConfigurations = (PAESDMA_PARSER_CONFIGURATIONS)pArgs;
828*53ee8cc1Swenshuai.xi                 psAesInstPri->eParserMode = pParserConfigurations->eParserMode;
829*53ee8cc1Swenshuai.xi                 psAesInstPri->bParserDecrypt = TRUE;
830*53ee8cc1Swenshuai.xi                 psAesInstPri->bHwParserEn = TRUE;
831*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
832*53ee8cc1Swenshuai.xi             }
833*53ee8cc1Swenshuai.xi 
834*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_PARSER_Start:
835*53ee8cc1Swenshuai.xi             {
836*53ee8cc1Swenshuai.xi                 if(UtopiaResourceObtain(pModule, AESDMA_POOL_ID_AES, &pResource) != 0)
837*53ee8cc1Swenshuai.xi                 {
838*53ee8cc1Swenshuai.xi                     ULOGE(TAG_AESDMA, "UtopiaResourceObtainToInstant fail\n");
839*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_ERR_NOT_AVAIL;
840*53ee8cc1Swenshuai.xi                 }
841*53ee8cc1Swenshuai.xi 
842*53ee8cc1Swenshuai.xi                 if(FALSE == MsOS_SHM_GetId((MS_U8*)"AESDMA driver", sizeof(AESDMA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
843*53ee8cc1Swenshuai.xi                 {
844*53ee8cc1Swenshuai.xi                     if(FALSE == MsOS_SHM_GetId((MS_U8*)"AESDMA driver", sizeof(AESDMA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_CREATE))
845*53ee8cc1Swenshuai.xi                     {
846*53ee8cc1Swenshuai.xi                         ULOGE(TAG_AESDMA, "[AESDMA INFO]create Resouce shared memory fail\n");
847*53ee8cc1Swenshuai.xi                         return UTOPIA_STATUS_ERR_NOMEM;
848*53ee8cc1Swenshuai.xi                     }
849*53ee8cc1Swenshuai.xi                     memset( (MS_U8*)u32Addr, 0, sizeof(AESDMA_RESOURCE_SHARED));
850*53ee8cc1Swenshuai.xi                 }
851*53ee8cc1Swenshuai.xi 
852*53ee8cc1Swenshuai.xi                 psAesResourceShared = (AESDMA_RESOURCE_SHARED*)u32Addr;
853*53ee8cc1Swenshuai.xi 
854*53ee8cc1Swenshuai.xi                 psAesResourceShared->pAESResource = pResource;
855*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "\n[AESDMA INFO]pResource = %x\n",(MS_U32)psAesResourceShared->pAESResource));
856*53ee8cc1Swenshuai.xi 
857*53ee8cc1Swenshuai.xi                 if ((psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CTR)||
858*53ee8cc1Swenshuai.xi                     (psAesInstPri->eMode == E_DRVAESDMA_CIPHER_DES_CTR)||
859*53ee8cc1Swenshuai.xi                     (psAesInstPri->eMode == E_DRVAESDMA_CIPHER_TDES_CTR))
860*53ee8cc1Swenshuai.xi                 {
861*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMANormalReset)();
862*53ee8cc1Swenshuai.xi                 }
863*53ee8cc1Swenshuai.xi                 else
864*53ee8cc1Swenshuai.xi                 {
865*53ee8cc1Swenshuai.xi                     //AESDMA reset
866*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMAReset)();
867*53ee8cc1Swenshuai.xi                 }
868*53ee8cc1Swenshuai.xi 
869*53ee8cc1Swenshuai.xi                 if (psAesInstPri->bSetEng == TRUE)
870*53ee8cc1Swenshuai.xi                 {
871*53ee8cc1Swenshuai.xi                     //AESDMA set mode and select encrypt or decrypt
872*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMASelEng)(psAesInstPri->eMode,psAesInstPri->bDescrypt);
873*53ee8cc1Swenshuai.xi                     psAesInstPri->bSetEng = FALSE;
874*53ee8cc1Swenshuai.xi                 }
875*53ee8cc1Swenshuai.xi 
876*53ee8cc1Swenshuai.xi                 //AESDMA set FileInOut info
877*53ee8cc1Swenshuai.xi                 (psAesInstPri->fpAESDMASetFileInOut)(psAesInstPri->u32FileinAddr,psAesInstPri->u32FileInNum,psAesInstPri->u32FileOutSAddr,psAesInstPri->u32FileOutEAddr);
878*53ee8cc1Swenshuai.xi 
879*53ee8cc1Swenshuai.xi                 //AESDMA set key
880*53ee8cc1Swenshuai.xi                 if(psAesInstPri->bEnableTwoKey==1)
881*53ee8cc1Swenshuai.xi                 {
882*53ee8cc1Swenshuai.xi                     u32KeyarryAddr = (MS_VIRT)&psAesInstPri->CipherOddKey[0];
883*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMASetKeySel)((MS_U32*)u32KeyarryAddr, E_DRVAESDMA_ODD_KEY);
884*53ee8cc1Swenshuai.xi 
885*53ee8cc1Swenshuai.xi                     u32KeyarryAddr = (MS_VIRT)&psAesInstPri->CipherKey[0];
886*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMASetKeySel)((MS_U32*)u32KeyarryAddr, E_DRVAESDMA_EVEN_KEY);
887*53ee8cc1Swenshuai.xi                 }
888*53ee8cc1Swenshuai.xi                 else
889*53ee8cc1Swenshuai.xi                 {
890*53ee8cc1Swenshuai.xi                     if(psAesInstPri->bSecretKey==1)
891*53ee8cc1Swenshuai.xi                     {
892*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMASecureKeyIdx)(psAesInstPri->u8SecureKeyIndex);
893*53ee8cc1Swenshuai.xi                     }
894*53ee8cc1Swenshuai.xi                     else
895*53ee8cc1Swenshuai.xi                     {
896*53ee8cc1Swenshuai.xi                         u32KeyarryAddr = (MS_VIRT)&psAesInstPri->CipherKey[0];
897*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMASetKey)((MS_U32*)u32KeyarryAddr);
898*53ee8cc1Swenshuai.xi                     }
899*53ee8cc1Swenshuai.xi                 }
900*53ee8cc1Swenshuai.xi 
901*53ee8cc1Swenshuai.xi                 //AESDMA set IV
902*53ee8cc1Swenshuai.xi                 if((psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CBC)||
903*53ee8cc1Swenshuai.xi                    (psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CTR)||
904*53ee8cc1Swenshuai.xi                    (psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CTS_CBC))
905*53ee8cc1Swenshuai.xi                 {
906*53ee8cc1Swenshuai.xi                     u32IVarrayAddr = (MS_VIRT)&psAesInstPri->InitVector[0];
907*53ee8cc1Swenshuai.xi                     if (psAesInstPri->bSetIV == TRUE)
908*53ee8cc1Swenshuai.xi                     {
909*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMASetIV)((MS_U32*)u32IVarrayAddr);
910*53ee8cc1Swenshuai.xi                         psAesInstPri->bSetIV = FALSE;
911*53ee8cc1Swenshuai.xi                     }
912*53ee8cc1Swenshuai.xi 
913*53ee8cc1Swenshuai.xi                     if(psAesInstPri->bEnableTwoKey==1)
914*53ee8cc1Swenshuai.xi                     {
915*53ee8cc1Swenshuai.xi                         u32IVarrayAddr = (MS_VIRT)&psAesInstPri->InitVectorOdd[0];
916*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMASetOddIv)((MS_U32*)u32IVarrayAddr);
917*53ee8cc1Swenshuai.xi                     }
918*53ee8cc1Swenshuai.xi 
919*53ee8cc1Swenshuai.xi                 }
920*53ee8cc1Swenshuai.xi 
921*53ee8cc1Swenshuai.xi                 // HW Parser configurations
922*53ee8cc1Swenshuai.xi                 if (psAesInstPri->bHwParserEn == TRUE)
923*53ee8cc1Swenshuai.xi                 {
924*53ee8cc1Swenshuai.xi                     psAesInstPri->bHwParserEn = FALSE;
925*53ee8cc1Swenshuai.xi                 }
926*53ee8cc1Swenshuai.xi                 if (psAesInstPri->bParserDecrypt == TRUE)
927*53ee8cc1Swenshuai.xi                 {
928*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMAParserDecrypt)(psAesInstPri->eParserMode);
929*53ee8cc1Swenshuai.xi                 }
930*53ee8cc1Swenshuai.xi                 else
931*53ee8cc1Swenshuai.xi                 {
932*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMAParserEncrypt)(psAesInstPri->eParserMode);
933*53ee8cc1Swenshuai.xi                 }
934*53ee8cc1Swenshuai.xi 
935*53ee8cc1Swenshuai.xi                 if (psAesInstPri->bEvenScrmbPatternEn == TRUE)
936*53ee8cc1Swenshuai.xi                 {
937*53ee8cc1Swenshuai.xi                     psAesInstPri->bEvenScrmbPatternEn = FALSE;
938*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMAParserSetScrmbPatten)(psAesInstPri->eScrmbPattern);
939*53ee8cc1Swenshuai.xi                 }
940*53ee8cc1Swenshuai.xi 
941*53ee8cc1Swenshuai.xi                 if (psAesInstPri->bOddScrmbPatternEn == TRUE)
942*53ee8cc1Swenshuai.xi                 {
943*53ee8cc1Swenshuai.xi                     psAesInstPri->bOddScrmbPatternEn = FALSE;
944*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMAParserSetAddedScrmbPattern)(psAesInstPri->eAddedScrmbPattern);
945*53ee8cc1Swenshuai.xi                 }
946*53ee8cc1Swenshuai.xi 
947*53ee8cc1Swenshuai.xi                 (psAesInstPri->fpAESDMAParserMaskscrmb)(psAesInstPri->bMaskScrmb);
948*53ee8cc1Swenshuai.xi 
949*53ee8cc1Swenshuai.xi                 // Set PID
950*53ee8cc1Swenshuai.xi                 if (psAesInstPri->bBypassPid == TRUE)
951*53ee8cc1Swenshuai.xi                 {
952*53ee8cc1Swenshuai.xi                     psAesInstPri->bBypassPid = FALSE;
953*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMAParserBypassPid)(psAesInstPri->bBypassPid);
954*53ee8cc1Swenshuai.xi                 }
955*53ee8cc1Swenshuai.xi 
956*53ee8cc1Swenshuai.xi                 if (psAesInstPri->bPid0En == TRUE)
957*53ee8cc1Swenshuai.xi                 {
958*53ee8cc1Swenshuai.xi                     psAesInstPri->bPid0En = FALSE;
959*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMAParserSetPid)(psAesInstPri->u8PidIndex, psAesInstPri->u16Pid);
960*53ee8cc1Swenshuai.xi                 }
961*53ee8cc1Swenshuai.xi                 if (psAesInstPri->bPid1En == TRUE)
962*53ee8cc1Swenshuai.xi                 {
963*53ee8cc1Swenshuai.xi                     psAesInstPri->bPid1En = FALSE;
964*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMAParserSetPid)(psAesInstPri->u8PidIndex1, psAesInstPri->u16Pid1);
965*53ee8cc1Swenshuai.xi                 }
966*53ee8cc1Swenshuai.xi 
967*53ee8cc1Swenshuai.xi                 // AESDMA trigger start
968*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMAStart)(1);
969*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(ULOGD(TAG_AESDMA, "[AESDMA INFO]MDrv_CMD_AESDMA_PARSER_Start\n"));
970*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
971*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
972*53ee8cc1Swenshuai.xi                 else
973*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
974*53ee8cc1Swenshuai.xi             }
975*53ee8cc1Swenshuai.xi 
976*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetOddKey:
977*53ee8cc1Swenshuai.xi             {
978*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
979*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
980*53ee8cc1Swenshuai.xi 
981*53ee8cc1Swenshuai.xi                 memcpy((void *)psAesInstPri->CipherOddKey,(void *)pArgs,16);
982*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
983*53ee8cc1Swenshuai.xi             }
984*53ee8cc1Swenshuai.xi 
985*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_ENABLE_Two_Key:
986*53ee8cc1Swenshuai.xi             {
987*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
988*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
989*53ee8cc1Swenshuai.xi 
990*53ee8cc1Swenshuai.xi                 bEnable = *(MS_BOOL *)pArgs;
991*53ee8cc1Swenshuai.xi                 psAesInstPri->bEnableTwoKey = bEnable;
992*53ee8cc1Swenshuai.xi 
993*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
994*53ee8cc1Swenshuai.xi             }
995*53ee8cc1Swenshuai.xi 
996*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetOddIV:
997*53ee8cc1Swenshuai.xi             {
998*53ee8cc1Swenshuai.xi                 memcpy((void *)psAesInstPri->InitVectorOdd,(void *)pArgs,16);
999*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
1000*53ee8cc1Swenshuai.xi             }
1001*53ee8cc1Swenshuai.xi 
1002*53ee8cc1Swenshuai.xi         case MDrv_CMD_IS_SECRETKEY_IN_NORMAL_BLANK:
1003*53ee8cc1Swenshuai.xi             {
1004*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
1005*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
1006*53ee8cc1Swenshuai.xi 
1007*53ee8cc1Swenshuai.xi                 if ( psAesInstPri->fpAESDMAIsSecretKeyInNormalBlank(pArgs) == DRVAESDMA_OK )
1008*53ee8cc1Swenshuai.xi                 {
1009*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
1010*53ee8cc1Swenshuai.xi                 }
1011*53ee8cc1Swenshuai.xi                 else
1012*53ee8cc1Swenshuai.xi                 {
1013*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
1014*53ee8cc1Swenshuai.xi                 }
1015*53ee8cc1Swenshuai.xi             }
1016*53ee8cc1Swenshuai.xi 
1017*53ee8cc1Swenshuai.xi 
1018*53ee8cc1Swenshuai.xi         case MDrv_CMD_HDCP_MDrv_PROCESSCIPHER:
1019*53ee8cc1Swenshuai.xi             {
1020*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
1021*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
1022*53ee8cc1Swenshuai.xi 
1023*53ee8cc1Swenshuai.xi                 psHDCPData = (HDCP_CIPHER *)pArgs;
1024*53ee8cc1Swenshuai.xi 
1025*53ee8cc1Swenshuai.xi                 if ( psAesInstPri->fpHDCPHDCPProcessCipher(psHDCPData->u8Idx, (void*)psHDCPData->pu8Riv, (void*)psHDCPData->pu8ContentKey) == DRVAESDMA_OK )
1026*53ee8cc1Swenshuai.xi                 {
1027*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
1028*53ee8cc1Swenshuai.xi                 }
1029*53ee8cc1Swenshuai.xi                 else
1030*53ee8cc1Swenshuai.xi                 {
1031*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
1032*53ee8cc1Swenshuai.xi                 }
1033*53ee8cc1Swenshuai.xi             }
1034*53ee8cc1Swenshuai.xi 
1035*53ee8cc1Swenshuai.xi         case MDrv_CMD_HDCP_GetHdcpCipherState:
1036*53ee8cc1Swenshuai.xi             {
1037*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
1038*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
1039*53ee8cc1Swenshuai.xi 
1040*53ee8cc1Swenshuai.xi                 psHDCPCipherState = (HDCP_CIPHER_STATE *)pArgs;
1041*53ee8cc1Swenshuai.xi 
1042*53ee8cc1Swenshuai.xi                 if ( psAesInstPri->fpGetHDCPCipherState(psHDCPCipherState->u8Idx, psHDCPCipherState->pu8State) == DRVAESDMA_OK )
1043*53ee8cc1Swenshuai.xi                 {
1044*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_SUCCESS;
1045*53ee8cc1Swenshuai.xi                 }
1046*53ee8cc1Swenshuai.xi                 else
1047*53ee8cc1Swenshuai.xi                 {
1048*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
1049*53ee8cc1Swenshuai.xi                 }
1050*53ee8cc1Swenshuai.xi             }
1051*53ee8cc1Swenshuai.xi 
1052*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Set_Key_Index:
1053*53ee8cc1Swenshuai.xi             {
1054*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
1055*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
1056*53ee8cc1Swenshuai.xi 
1057*53ee8cc1Swenshuai.xi                 psAESDMAKeyIndex = (AESDMA_KEY_INDEX *)pArgs;
1058*53ee8cc1Swenshuai.xi 
1059*53ee8cc1Swenshuai.xi                 if (psAESDMAKeyIndex-> bOddKeyEn == TRUE)
1060*53ee8cc1Swenshuai.xi                 {
1061*53ee8cc1Swenshuai.xi                     psAesInstPri->bEnableKeyIndexOddKey = TRUE;
1062*53ee8cc1Swenshuai.xi                     psAesInstPri->u32KeyIndexOdd = psAESDMAKeyIndex->u32KeyIndex;
1063*53ee8cc1Swenshuai.xi                 }
1064*53ee8cc1Swenshuai.xi                 else
1065*53ee8cc1Swenshuai.xi                 {
1066*53ee8cc1Swenshuai.xi                     psAesInstPri->bEnableKeyIndexEvenKey = TRUE;
1067*53ee8cc1Swenshuai.xi                     psAesInstPri->u32KeyIndexEven = psAESDMAKeyIndex->u32KeyIndex;
1068*53ee8cc1Swenshuai.xi                 }
1069*53ee8cc1Swenshuai.xi 
1070*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
1071*53ee8cc1Swenshuai.xi             }
1072*53ee8cc1Swenshuai.xi 
1073*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Set_AES_CTR64_En:
1074*53ee8cc1Swenshuai.xi             {
1075*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
1076*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
1077*53ee8cc1Swenshuai.xi 
1078*53ee8cc1Swenshuai.xi                 bEnable = *(MS_BOOL *)pArgs;
1079*53ee8cc1Swenshuai.xi                 psAesInstPri->bEnableAesCtr64 = bEnable;
1080*53ee8cc1Swenshuai.xi 
1081*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
1082*53ee8cc1Swenshuai.xi             }
1083*53ee8cc1Swenshuai.xi 
1084*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Set_Efuse_Key_Index:
1085*53ee8cc1Swenshuai.xi             {
1086*53ee8cc1Swenshuai.xi                 if (pArgs == NULL)
1087*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
1088*53ee8cc1Swenshuai.xi 
1089*53ee8cc1Swenshuai.xi                 psAesInstPri->bSecretKey = 1;
1090*53ee8cc1Swenshuai.xi                 psAesInstPri->u8SecureKeyIndex = *(MS_U8 *)pArgs;
1091*53ee8cc1Swenshuai.xi 
1092*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
1093*53ee8cc1Swenshuai.xi             }
1094*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_GetConfig:
1095*53ee8cc1Swenshuai.xi             {
1096*53ee8cc1Swenshuai.xi                 if (psAesInstPri->u32miunum == 0){
1097*53ee8cc1Swenshuai.xi                     return UTOPIA_STATUS_FAIL;
1098*53ee8cc1Swenshuai.xi                 }
1099*53ee8cc1Swenshuai.xi                 pInitParam = (PAESDMA_INIT) pArgs;
1100*53ee8cc1Swenshuai.xi 
1101*53ee8cc1Swenshuai.xi                 pInitParam->u32miu0addr = psAesInstPri->u32miu0addr;
1102*53ee8cc1Swenshuai.xi                 pInitParam->u32miu1addr = psAesInstPri->u32miu1addr;
1103*53ee8cc1Swenshuai.xi                 pInitParam->u32miunum = psAesInstPri->u32miunum;
1104*53ee8cc1Swenshuai.xi 
1105*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_SUCCESS;
1106*53ee8cc1Swenshuai.xi             }
1107*53ee8cc1Swenshuai.xi         default:
1108*53ee8cc1Swenshuai.xi             break;
1109*53ee8cc1Swenshuai.xi     };
1110*53ee8cc1Swenshuai.xi 
1111*53ee8cc1Swenshuai.xi 	return 0;
1112*53ee8cc1Swenshuai.xi }
1113*53ee8cc1Swenshuai.xi 
AESDMAClose(void * pInstance)1114*53ee8cc1Swenshuai.xi MS_U32 AESDMAClose(void* pInstance)
1115*53ee8cc1Swenshuai.xi {
1116*53ee8cc1Swenshuai.xi 	UtopiaInstanceDelete(pInstance);
1117*53ee8cc1Swenshuai.xi 
1118*53ee8cc1Swenshuai.xi 	return 0;
1119*53ee8cc1Swenshuai.xi }
1120*53ee8cc1Swenshuai.xi 
1121