xref: /utopia/UTPA2-700.0.x/modules/security/drv/cipher/mdrvAESDMA.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2*53ee8cc1Swenshuai.xi #include <linux/string.h>
3*53ee8cc1Swenshuai.xi #include <linux/uaccess.h>
4*53ee8cc1Swenshuai.xi #include <linux/compat.h>
5*53ee8cc1Swenshuai.xi #else
6*53ee8cc1Swenshuai.xi #include <stdio.h>
7*53ee8cc1Swenshuai.xi #include <string.h>
8*53ee8cc1Swenshuai.xi #endif
9*53ee8cc1Swenshuai.xi 
10*53ee8cc1Swenshuai.xi #include "MsTypes.h"
11*53ee8cc1Swenshuai.xi #include "utopia_dapi.h"
12*53ee8cc1Swenshuai.xi #include "utopia.h"
13*53ee8cc1Swenshuai.xi //#include "drvAESDMA.h"
14*53ee8cc1Swenshuai.xi #include "drvCIPHER.h"
15*53ee8cc1Swenshuai.xi #include "drvAESDMA_private.h"
16*53ee8cc1Swenshuai.xi #include "MsOS.h"
17*53ee8cc1Swenshuai.xi 
18*53ee8cc1Swenshuai.xi #define AESDMA_KEY_SLOT_BASE (0x10)
19*53ee8cc1Swenshuai.xi 
20*53ee8cc1Swenshuai.xi enum
21*53ee8cc1Swenshuai.xi {
22*53ee8cc1Swenshuai.xi     AESDMA_POOL_ID_AES = 0,
23*53ee8cc1Swenshuai.xi     AESDMA_POOL_ID_SHA,
24*53ee8cc1Swenshuai.xi     AESDMA_POOL_ID_RSA,
25*53ee8cc1Swenshuai.xi     AESDMA_POOL_ID_DRVAES,
26*53ee8cc1Swenshuai.xi } eAesdmaPoolID;
27*53ee8cc1Swenshuai.xi 
28*53ee8cc1Swenshuai.xi void* pModuleAESDMA = NULL;
29*53ee8cc1Swenshuai.xi 
_AESDMA_MSB2LSB(MS_U8 u8Bytes[4])30*53ee8cc1Swenshuai.xi MS_U32 _AESDMA_MSB2LSB(MS_U8 u8Bytes[4])
31*53ee8cc1Swenshuai.xi {
32*53ee8cc1Swenshuai.xi     return (u8Bytes[0] << 24) | (u8Bytes[1] << 16) | (u8Bytes[2] << 8) | u8Bytes[3];
33*53ee8cc1Swenshuai.xi }
34*53ee8cc1Swenshuai.xi 
AESDMARegisterToUtopia(FUtopiaOpen ModuleType)35*53ee8cc1Swenshuai.xi void AESDMARegisterToUtopia(FUtopiaOpen ModuleType)
36*53ee8cc1Swenshuai.xi {
37*53ee8cc1Swenshuai.xi     void* psResource = NULL;
38*53ee8cc1Swenshuai.xi 
39*53ee8cc1Swenshuai.xi     // 1. deal with module
40*53ee8cc1Swenshuai.xi     //void* pUtopiaModule = NULL;
41*53ee8cc1Swenshuai.xi 	UtopiaModuleCreate(MODULE_AESDMA, 8, &pModuleAESDMA);
42*53ee8cc1Swenshuai.xi     UtopiaModuleRegister(pModuleAESDMA);
43*53ee8cc1Swenshuai.xi     UtopiaModuleSetupFunctionPtr(pModuleAESDMA, (FUtopiaOpen)AESDMAOpen, (FUtopiaClose)AESDMAClose, (FUtopiaIOctl)AESDMAIoctl);
44*53ee8cc1Swenshuai.xi 
45*53ee8cc1Swenshuai.xi     // 2. deal with resource
46*53ee8cc1Swenshuai.xi     //Resource AES
47*53ee8cc1Swenshuai.xi 	UtopiaModuleAddResourceStart(pModuleAESDMA, AESDMA_POOL_ID_AES);
48*53ee8cc1Swenshuai.xi     UtopiaResourceCreate("AES", sizeof(AESDMA_RESOURCE_PRIVATE), &psResource);
49*53ee8cc1Swenshuai.xi     UtopiaResourceRegister(pModuleAESDMA, psResource, AESDMA_POOL_ID_AES);
50*53ee8cc1Swenshuai.xi 	UtopiaModuleAddResourceEnd(pModuleAESDMA, AESDMA_POOL_ID_AES);
51*53ee8cc1Swenshuai.xi 
52*53ee8cc1Swenshuai.xi     //Resource SHA
53*53ee8cc1Swenshuai.xi     UtopiaModuleAddResourceStart(pModuleAESDMA, AESDMA_POOL_ID_SHA);
54*53ee8cc1Swenshuai.xi     psResource = NULL;
55*53ee8cc1Swenshuai.xi     UtopiaResourceCreate("SHA", sizeof(SHA_RESOURCE_PRIVATE), &psResource);
56*53ee8cc1Swenshuai.xi     UtopiaResourceRegister(pModuleAESDMA, psResource, AESDMA_POOL_ID_SHA);
57*53ee8cc1Swenshuai.xi 	UtopiaModuleAddResourceEnd(pModuleAESDMA, AESDMA_POOL_ID_SHA);
58*53ee8cc1Swenshuai.xi 
59*53ee8cc1Swenshuai.xi     //Resource RSA
60*53ee8cc1Swenshuai.xi     UtopiaModuleAddResourceStart(pModuleAESDMA, AESDMA_POOL_ID_RSA);
61*53ee8cc1Swenshuai.xi     psResource = NULL;
62*53ee8cc1Swenshuai.xi     UtopiaResourceCreate("RSA", sizeof(RSA_RESOURCE_PRIVATE), &psResource);
63*53ee8cc1Swenshuai.xi     UtopiaResourceRegister(pModuleAESDMA, psResource, AESDMA_POOL_ID_RSA);
64*53ee8cc1Swenshuai.xi 	UtopiaModuleAddResourceEnd(pModuleAESDMA, AESDMA_POOL_ID_RSA);
65*53ee8cc1Swenshuai.xi 
66*53ee8cc1Swenshuai.xi     //Resource DRVAES
67*53ee8cc1Swenshuai.xi     UtopiaModuleAddResourceStart(pModuleAESDMA, AESDMA_POOL_ID_DRVAES);
68*53ee8cc1Swenshuai.xi     psResource = NULL;
69*53ee8cc1Swenshuai.xi     UtopiaResourceCreate("DRVAES", sizeof(DRVAESDMA_RESOURCE_PRIVATE), &psResource);
70*53ee8cc1Swenshuai.xi     UtopiaResourceRegister(pModuleAESDMA, psResource, AESDMA_POOL_ID_DRVAES);
71*53ee8cc1Swenshuai.xi 	UtopiaModuleAddResourceEnd(pModuleAESDMA, AESDMA_POOL_ID_DRVAES);
72*53ee8cc1Swenshuai.xi 
73*53ee8cc1Swenshuai.xi }
74*53ee8cc1Swenshuai.xi 
AESDMAOpen(void ** ppInstance,MS_U32 u32ModuleVersion,void * pAttribute)75*53ee8cc1Swenshuai.xi MS_U32 AESDMAOpen(void** ppInstance, MS_U32 u32ModuleVersion, void* pAttribute)
76*53ee8cc1Swenshuai.xi {
77*53ee8cc1Swenshuai.xi 	MS_DEBUG_MSG(printf("\n[AESDMA INFO]AESDMA open \n"));
78*53ee8cc1Swenshuai.xi 
79*53ee8cc1Swenshuai.xi     AESDMA_INSTANT_PRIVATE *pAesdmaPri = NULL;
80*53ee8cc1Swenshuai.xi     void *pAesdmaPriVoid = NULL;
81*53ee8cc1Swenshuai.xi     UtopiaInstanceCreate(sizeof(AESDMA_INSTANT_PRIVATE), ppInstance);
82*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(*ppInstance, &pAesdmaPriVoid);
83*53ee8cc1Swenshuai.xi 
84*53ee8cc1Swenshuai.xi     pAesdmaPri = (AESDMA_INSTANT_PRIVATE *)pAesdmaPriVoid;
85*53ee8cc1Swenshuai.xi 
86*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAInit = _MDrv_AESDMA_Init;
87*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetIV = _MDrv_AESDMA_SetIV;
88*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAReset = _MDrv_AESDMA_Reset;
89*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetFileInOut = _MDrv_AESDMA_SetFileInOut;
90*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetKey = _MDrv_AESDMA_SetKey;
91*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASelEng = _MDrv_AESDMA_SelEng;
92*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAStart = _MDrv_AESDMA_Start;
93*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAGetStatus = _MDrv_AESDMA_GetStatus;
94*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAIsFinished = _MDrv_AESDMA_IsFinished;
95*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetSecureKey = _MDrv_AESDMA_SetSecureKey;
96*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetPS = _MDrv_AESDMA_SetPS;
97*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAPSRelease = _MDrv_AESDMA_PSRelease;
98*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAGetPSMatchedByteCNT = _MDrv_AESDMA_GetPSMatchedByteCNT;
99*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAGetPSMatchedPTN = _MDrv_AESDMA_GetPSMatchedPTN;
100*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMANotify = _MDrv_AESDMA_Notify;
101*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMARand = _MDrv_AESDMA_Rand;
102*53ee8cc1Swenshuai.xi     pAesdmaPri->fpRSACalculate = _MDrv_RSA_Calculate;
103*53ee8cc1Swenshuai.xi     pAesdmaPri->fpRSAIsFinished = _MDrv_RSA_IsFinished;
104*53ee8cc1Swenshuai.xi     pAesdmaPri->fpRSAOutput = _MDrv_RSA_Output;
105*53ee8cc1Swenshuai.xi     pAesdmaPri->fpSHACalculate = _MDrv_SHA_Calculate;
106*53ee8cc1Swenshuai.xi     pAesdmaPri->fpSHACalculateManual = _MDrv_SHA_CalculateManual;
107*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetKey_Ex = _MDrv_AESDMA_SetKey_Ex;
108*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetIV_Ex = _MDrv_AESDMA_SetIV_Ex;
109*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetDefaultCAVid = _MDrv_AESDMA_SetDefaultCAVid;
110*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMASetKeyIndex = _MDrv_AESDMA_SetKeyIndex;
111*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAAllocKeySlot = _MDrv_AESDMA_AllocKeySlot;
112*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAFreeKeySlot = _MDrv_AESDMA_FreeKeySlot;
113*53ee8cc1Swenshuai.xi     pAesdmaPri->fpAESDMAInitBySWFlag = _MDrv_AESDMA_InitBySWFlag;
114*53ee8cc1Swenshuai.xi 
115*53ee8cc1Swenshuai.xi 	return UTOPIA_STATUS_SUCCESS;
116*53ee8cc1Swenshuai.xi }
117*53ee8cc1Swenshuai.xi 
AESDMAIoctl(void * pInstance,MS_U32 u32Cmd,void * pArgs)118*53ee8cc1Swenshuai.xi MS_U32 AESDMAIoctl(void* pInstance, MS_U32 u32Cmd, void* pArgs)
119*53ee8cc1Swenshuai.xi {
120*53ee8cc1Swenshuai.xi     PAESDMA_INIT pInitParam = NULL;
121*53ee8cc1Swenshuai.xi     PAESDMA_FILE_INOUT pFileInOutParam = NULL;
122*53ee8cc1Swenshuai.xi     PAESDMA_SEL_ENG pSelEngParam = NULL;
123*53ee8cc1Swenshuai.xi     PAESDMA_SET_KEY_EX pSetKeyEx = NULL;
124*53ee8cc1Swenshuai.xi     PAESDMA_SET_IV_EX pSetIVEx = NULL;
125*53ee8cc1Swenshuai.xi     PAESDMA_SET_PS pSetPSParam = NULL;
126*53ee8cc1Swenshuai.xi     PAESDMA_NOTIFY pNotifyParam = NULL;
127*53ee8cc1Swenshuai.xi     PAESDMA_RAND pRandParam = NULL;
128*53ee8cc1Swenshuai.xi     PAESDMA_CAVID pCAVid = NULL;
129*53ee8cc1Swenshuai.xi     PRSA_CALCULATE pRSACalParam = NULL;
130*53ee8cc1Swenshuai.xi     PRSA_OUTPUT pRSAOutParam = NULL;
131*53ee8cc1Swenshuai.xi     PSHA_CALCULATE pSHACalParam = NULL;
132*53ee8cc1Swenshuai.xi     PSHA_CALCULATE_MANUAL pSHACalManuParam = NULL;
133*53ee8cc1Swenshuai.xi     PAESDMA_KEY_INDEX pKeyIndex = NULL;
134*53ee8cc1Swenshuai.xi     PAESDMA_ALLOC_KEY_SLOT pAllocKeySlot = NULL;
135*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = 0;
136*53ee8cc1Swenshuai.xi 	AESDMA_INSTANT_PRIVATE* psAesInstPri = NULL;
137*53ee8cc1Swenshuai.xi     AESDMA_RESOURCE_SHARED* psAesResourceShared = NULL;
138*53ee8cc1Swenshuai.xi     RSA_RESOURCE_SHARED* psRSAResourceShared = NULL;
139*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psAesInstPri);
140*53ee8cc1Swenshuai.xi 	void* pTmpResource = NULL;
141*53ee8cc1Swenshuai.xi     void* pDRVAESResource = NULL;
142*53ee8cc1Swenshuai.xi     MS_U32 u32ShmId = 0;
143*53ee8cc1Swenshuai.xi     MS_VIRT u32Addr = 0;
144*53ee8cc1Swenshuai.xi     MS_U32 u32BufSize = 0;
145*53ee8cc1Swenshuai.xi     MS_U32 u32IVarrayAddr[4] = {0};
146*53ee8cc1Swenshuai.xi     MS_U32 u32KeyarryAddr[4] = {0};
147*53ee8cc1Swenshuai.xi     MS_U32 u32timeout_count = 0;
148*53ee8cc1Swenshuai.xi     MS_U32 u32timeout_value = 0;
149*53ee8cc1Swenshuai.xi     DRVAESDMA_RESOURCE_PRIVATE* pstResPri  = NULL;
150*53ee8cc1Swenshuai.xi 
151*53ee8cc1Swenshuai.xi     if(UtopiaResourceObtain(pModuleAESDMA, AESDMA_POOL_ID_DRVAES, &pDRVAESResource) != UTOPIA_STATUS_SUCCESS)
152*53ee8cc1Swenshuai.xi     {
153*53ee8cc1Swenshuai.xi          printf("UtopiaResourceObtain fail\n");
154*53ee8cc1Swenshuai.xi          return UTOPIA_STATUS_ERR_RESOURCE;
155*53ee8cc1Swenshuai.xi     }
156*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(pDRVAESResource, (void**)&pstResPri);
157*53ee8cc1Swenshuai.xi 
158*53ee8cc1Swenshuai.xi     if((FALSE == pstResPri->bInited_Drv)  &&
159*53ee8cc1Swenshuai.xi         (u32Cmd != MDrv_CMD_AESDMA_Init) )  // which command don't need do it after init?
160*53ee8cc1Swenshuai.xi     {
161*53ee8cc1Swenshuai.xi         UtopiaResourceRelease(pDRVAESResource);
162*53ee8cc1Swenshuai.xi         return UTOPIA_STATUS_FAIL;
163*53ee8cc1Swenshuai.xi     }
164*53ee8cc1Swenshuai.xi 
165*53ee8cc1Swenshuai.xi     switch(u32Cmd)
166*53ee8cc1Swenshuai.xi     {
167*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Init:
168*53ee8cc1Swenshuai.xi             {
169*53ee8cc1Swenshuai.xi                 if(pstResPri->bInited_Drv == FALSE)
170*53ee8cc1Swenshuai.xi                 {
171*53ee8cc1Swenshuai.xi                     pInitParam = (PAESDMA_INIT)pArgs;
172*53ee8cc1Swenshuai.xi                     u32Ret = (psAesInstPri->fpAESDMAInit)(pInitParam->u32miu0addr,pInitParam->u32miu1addr,pInitParam->u32miunum);
173*53ee8cc1Swenshuai.xi                     psAesInstPri->u32IVLen = 0;
174*53ee8cc1Swenshuai.xi                     psAesInstPri->u32FileinAddr = 0;
175*53ee8cc1Swenshuai.xi                     psAesInstPri->u32FileInNum = 0;
176*53ee8cc1Swenshuai.xi                     psAesInstPri->u32FileOutSAddr = 0;
177*53ee8cc1Swenshuai.xi                     psAesInstPri->u32FileOutEAddr = 0;
178*53ee8cc1Swenshuai.xi                     psAesInstPri->ptrKey = 0;
179*53ee8cc1Swenshuai.xi                     psAesInstPri->u32KeyLen = 0;
180*53ee8cc1Swenshuai.xi                     psAesInstPri->u32Mode = 0xFF; //Default simple DMA
181*53ee8cc1Swenshuai.xi                     psAesInstPri->u32KeyIndex = 0;
182*53ee8cc1Swenshuai.xi                     psAesInstPri->bOddKey = FALSE;
183*53ee8cc1Swenshuai.xi                     psAesInstPri->u32CAVid = 0;
184*53ee8cc1Swenshuai.xi 
185*53ee8cc1Swenshuai.xi                     memset(psAesInstPri->CipherKey, 0, sizeof(psAesInstPri->CipherKey));
186*53ee8cc1Swenshuai.xi                     memset(psAesInstPri->InitVector, 0, sizeof(psAesInstPri->InitVector));
187*53ee8cc1Swenshuai.xi                     memset(psAesInstPri->u8KeySlotUsage, 0, sizeof(psAesInstPri->u8KeySlotUsage));
188*53ee8cc1Swenshuai.xi 
189*53ee8cc1Swenshuai.xi                     if (u32Ret == DRVAESDMA_OK)
190*53ee8cc1Swenshuai.xi                     {
191*53ee8cc1Swenshuai.xi                         pstResPri->bInited_Drv = TRUE;
192*53ee8cc1Swenshuai.xi                         u32Ret = UTOPIA_STATUS_SUCCESS;
193*53ee8cc1Swenshuai.xi                     }
194*53ee8cc1Swenshuai.xi                     else
195*53ee8cc1Swenshuai.xi                     {
196*53ee8cc1Swenshuai.xi                         u32Ret = UTOPIA_STATUS_FAIL;
197*53ee8cc1Swenshuai.xi                     }
198*53ee8cc1Swenshuai.xi                 }
199*53ee8cc1Swenshuai.xi                 else
200*53ee8cc1Swenshuai.xi                 {
201*53ee8cc1Swenshuai.xi                     u32Ret = (psAesInstPri->fpAESDMAInitBySWFlag)(TRUE);
202*53ee8cc1Swenshuai.xi                     if (u32Ret == DRVAESDMA_OK)
203*53ee8cc1Swenshuai.xi                     {
204*53ee8cc1Swenshuai.xi                         u32Ret = UTOPIA_STATUS_SUCCESS;
205*53ee8cc1Swenshuai.xi                     }
206*53ee8cc1Swenshuai.xi                     else
207*53ee8cc1Swenshuai.xi                     {
208*53ee8cc1Swenshuai.xi                         u32Ret = UTOPIA_STATUS_FAIL;
209*53ee8cc1Swenshuai.xi                     }
210*53ee8cc1Swenshuai.xi                 }
211*53ee8cc1Swenshuai.xi             }
212*53ee8cc1Swenshuai.xi             break;
213*53ee8cc1Swenshuai.xi 
214*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetIV:
215*53ee8cc1Swenshuai.xi             {
216*53ee8cc1Swenshuai.xi                 if(NULL != pArgs)
217*53ee8cc1Swenshuai.xi                 {
218*53ee8cc1Swenshuai.xi                     u32IVarrayAddr[3] = _AESDMA_MSB2LSB((MS_U8 *)pArgs);
219*53ee8cc1Swenshuai.xi                     u32IVarrayAddr[2] = _AESDMA_MSB2LSB((MS_U8 *)pArgs + 4);
220*53ee8cc1Swenshuai.xi                     u32IVarrayAddr[1] = _AESDMA_MSB2LSB((MS_U8 *)pArgs + 8);
221*53ee8cc1Swenshuai.xi                     u32IVarrayAddr[0] = _AESDMA_MSB2LSB((MS_U8 *)pArgs + 12);
222*53ee8cc1Swenshuai.xi                 }
223*53ee8cc1Swenshuai.xi                 else
224*53ee8cc1Swenshuai.xi                 {
225*53ee8cc1Swenshuai.xi                     printf("[AESDMA INFO]Set IV fail, IV is NULL\n");
226*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
227*53ee8cc1Swenshuai.xi                     break;
228*53ee8cc1Swenshuai.xi                 }
229*53ee8cc1Swenshuai.xi 
230*53ee8cc1Swenshuai.xi                 memcpy((void *)psAesInstPri->InitVector,(MS_U8 *)u32IVarrayAddr,16);
231*53ee8cc1Swenshuai.xi                 psAesInstPri->u32IVLen = 16;
232*53ee8cc1Swenshuai.xi                 u32Ret = UTOPIA_STATUS_SUCCESS;
233*53ee8cc1Swenshuai.xi             }
234*53ee8cc1Swenshuai.xi             break;
235*53ee8cc1Swenshuai.xi 
236*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Reset:
237*53ee8cc1Swenshuai.xi             {
238*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMAReset)();
239*53ee8cc1Swenshuai.xi                 //Reset private data
240*53ee8cc1Swenshuai.xi                 psAesInstPri->u32IVLen = 0;
241*53ee8cc1Swenshuai.xi                 psAesInstPri->u32FileinAddr = 0;
242*53ee8cc1Swenshuai.xi                 psAesInstPri->u32FileInNum = 0;
243*53ee8cc1Swenshuai.xi                 psAesInstPri->u32FileOutSAddr = 0;
244*53ee8cc1Swenshuai.xi                 psAesInstPri->u32FileOutEAddr = 0;
245*53ee8cc1Swenshuai.xi                 psAesInstPri->ptrKey = 0;
246*53ee8cc1Swenshuai.xi                 psAesInstPri->u32KeyLen = 0;
247*53ee8cc1Swenshuai.xi                 psAesInstPri->u32Mode = 0xFF;
248*53ee8cc1Swenshuai.xi                 psAesInstPri->u32KeyIndex = 0;
249*53ee8cc1Swenshuai.xi                 psAesInstPri->bOddKey = FALSE;
250*53ee8cc1Swenshuai.xi                 psAesInstPri->u32CAVid = 0;
251*53ee8cc1Swenshuai.xi 
252*53ee8cc1Swenshuai.xi                 memset(psAesInstPri->CipherKey, 0, sizeof(psAesInstPri->CipherKey));
253*53ee8cc1Swenshuai.xi                 memset(psAesInstPri->InitVector, 0, sizeof(psAesInstPri->InitVector));
254*53ee8cc1Swenshuai.xi                 memset(psAesInstPri->u8KeySlotUsage, 0, sizeof(psAesInstPri->u8KeySlotUsage));
255*53ee8cc1Swenshuai.xi 
256*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
257*53ee8cc1Swenshuai.xi                 {
258*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
259*53ee8cc1Swenshuai.xi                 }
260*53ee8cc1Swenshuai.xi                 else
261*53ee8cc1Swenshuai.xi                 {
262*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
263*53ee8cc1Swenshuai.xi                 }
264*53ee8cc1Swenshuai.xi             }
265*53ee8cc1Swenshuai.xi             break;
266*53ee8cc1Swenshuai.xi 
267*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetFileInOut:
268*53ee8cc1Swenshuai.xi             {
269*53ee8cc1Swenshuai.xi                 pFileInOutParam = (PAESDMA_FILE_INOUT)pArgs;
270*53ee8cc1Swenshuai.xi                 psAesInstPri->u32FileinAddr = pFileInOutParam->u32FileinAddr;
271*53ee8cc1Swenshuai.xi                 psAesInstPri->u32FileInNum = pFileInOutParam->u32FileInNum;
272*53ee8cc1Swenshuai.xi                 psAesInstPri->u32FileOutSAddr = pFileInOutParam->u32FileOutSAddr;
273*53ee8cc1Swenshuai.xi                 psAesInstPri->u32FileOutEAddr = pFileInOutParam->u32FileOutEAddr;
274*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(printf("[AESDMA INFO]FileinAddr = %lx\n",psAesInstPri->u32FileinAddr));
275*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(printf("[AESDMA INFO]FileInNum = %lx\n",psAesInstPri->u32FileInNum));
276*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(printf("[AESDMA INFO]FileOutSAddr = %lx\n",psAesInstPri->u32FileOutSAddr));
277*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(printf("[AESDMA INFO]FileOutEAddr = %lx\n",psAesInstPri->u32FileOutEAddr));
278*53ee8cc1Swenshuai.xi                 u32Ret = UTOPIA_STATUS_SUCCESS;
279*53ee8cc1Swenshuai.xi             }
280*53ee8cc1Swenshuai.xi             break;
281*53ee8cc1Swenshuai.xi 
282*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetKey:
283*53ee8cc1Swenshuai.xi             {
284*53ee8cc1Swenshuai.xi                 if(NULL != pArgs)
285*53ee8cc1Swenshuai.xi                 {
286*53ee8cc1Swenshuai.xi                     u32KeyarryAddr[3] = _AESDMA_MSB2LSB((MS_U8 *)pArgs);
287*53ee8cc1Swenshuai.xi                     u32KeyarryAddr[2] = _AESDMA_MSB2LSB((MS_U8 *)pArgs + 4);
288*53ee8cc1Swenshuai.xi                     u32KeyarryAddr[1] = _AESDMA_MSB2LSB((MS_U8 *)pArgs + 8);
289*53ee8cc1Swenshuai.xi                     u32KeyarryAddr[0] = _AESDMA_MSB2LSB((MS_U8 *)pArgs + 12);
290*53ee8cc1Swenshuai.xi                     memcpy((void *)psAesInstPri->CipherKey,(MS_U8 *)u32KeyarryAddr,16);
291*53ee8cc1Swenshuai.xi                     psAesInstPri->ptrKey = (MS_VIRT)psAesInstPri->CipherKey;
292*53ee8cc1Swenshuai.xi                 }
293*53ee8cc1Swenshuai.xi                 else
294*53ee8cc1Swenshuai.xi                 {
295*53ee8cc1Swenshuai.xi                     psAesInstPri->ptrKey = 0;
296*53ee8cc1Swenshuai.xi                 }
297*53ee8cc1Swenshuai.xi 
298*53ee8cc1Swenshuai.xi                 psAesInstPri->u32KeyLen = 16;
299*53ee8cc1Swenshuai.xi                 u32Ret = UTOPIA_STATUS_SUCCESS;
300*53ee8cc1Swenshuai.xi             }
301*53ee8cc1Swenshuai.xi             break;
302*53ee8cc1Swenshuai.xi 
303*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SelEng:
304*53ee8cc1Swenshuai.xi             {
305*53ee8cc1Swenshuai.xi                 pSelEngParam = (PAESDMA_SEL_ENG)pArgs;
306*53ee8cc1Swenshuai.xi                 psAesInstPri->u32Mode = pSelEngParam->eMode;
307*53ee8cc1Swenshuai.xi                 psAesInstPri->bDescrypt = pSelEngParam->bDescrypt;
308*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(printf("[AESDMA INFO]mode = %lu\n",(long unsigned int)psAesInstPri->u32Mode));
309*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(printf("[AESDMA INFO]Descrypt = %x\n",psAesInstPri->bDescrypt));
310*53ee8cc1Swenshuai.xi                 u32Ret = UTOPIA_STATUS_SUCCESS;
311*53ee8cc1Swenshuai.xi             }
312*53ee8cc1Swenshuai.xi             break;
313*53ee8cc1Swenshuai.xi 
314*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Start:
315*53ee8cc1Swenshuai.xi             {
316*53ee8cc1Swenshuai.xi                 if(UtopiaResourceObtain(pModuleAESDMA, AESDMA_POOL_ID_AES, &pTmpResource) != 0)
317*53ee8cc1Swenshuai.xi                 {
318*53ee8cc1Swenshuai.xi                     printf("UtopiaResourceObtainToInstant fail\n");
319*53ee8cc1Swenshuai.xi 		            u32Ret = UTOPIA_STATUS_ERR_NOT_AVAIL;
320*53ee8cc1Swenshuai.xi                     break;
321*53ee8cc1Swenshuai.xi                 }
322*53ee8cc1Swenshuai.xi 
323*53ee8cc1Swenshuai.xi                 if(FALSE == MsOS_SHM_GetId((MS_U8*)"AESDMA driver", sizeof(AESDMA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
324*53ee8cc1Swenshuai.xi                 {
325*53ee8cc1Swenshuai.xi                     if(FALSE == MsOS_SHM_GetId((MS_U8*)"AESDMA driver", sizeof(AESDMA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_CREATE))
326*53ee8cc1Swenshuai.xi                     {
327*53ee8cc1Swenshuai.xi                         printf("[AESDMA INFO]create Resouce shared memory fail\n");
328*53ee8cc1Swenshuai.xi                         u32Ret = UTOPIA_STATUS_ERR_NOMEM;
329*53ee8cc1Swenshuai.xi                         break;
330*53ee8cc1Swenshuai.xi                     }
331*53ee8cc1Swenshuai.xi                     memset((MS_U8 *)u32Addr, 0, sizeof(AESDMA_RESOURCE_SHARED));
332*53ee8cc1Swenshuai.xi                 }
333*53ee8cc1Swenshuai.xi 
334*53ee8cc1Swenshuai.xi                 psAesResourceShared = (AESDMA_RESOURCE_SHARED*)u32Addr;
335*53ee8cc1Swenshuai.xi 
336*53ee8cc1Swenshuai.xi                 psAesResourceShared->pAESResource = pTmpResource;
337*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(printf("\n[AESDMA INFO]pResource = %x\n",(int)psAesResourceShared->pAESResource));
338*53ee8cc1Swenshuai.xi 
339*53ee8cc1Swenshuai.xi                 //AESDMA reset
340*53ee8cc1Swenshuai.xi //                (psAesInstPri->fpAESDMAReset)();
341*53ee8cc1Swenshuai.xi 
342*53ee8cc1Swenshuai.xi                 //AESDMA set mode and select encrypt or decrypt
343*53ee8cc1Swenshuai.xi                 (psAesInstPri->fpAESDMASelEng)(psAesInstPri->u32Mode,psAesInstPri->bDescrypt);
344*53ee8cc1Swenshuai.xi 
345*53ee8cc1Swenshuai.xi                 //AESDMA set IV
346*53ee8cc1Swenshuai.xi                 if((psAesInstPri->u32Mode == E_DRVAESDMA_CIPHER_CBC)||
347*53ee8cc1Swenshuai.xi                    (psAesInstPri->u32Mode == E_DRVAESDMA_CIPHER_CTR)||
348*53ee8cc1Swenshuai.xi                    (psAesInstPri->u32Mode == E_DRVAESDMA_CIPHER_CTS_CBC))
349*53ee8cc1Swenshuai.xi                 {
350*53ee8cc1Swenshuai.xi                     //u32IVarrayAddr = (MS_U32)&psAesInstPri->InitVector[0];
351*53ee8cc1Swenshuai.xi                     //(psAesInstPri->fpAESDMASetIV)((MS_U32*)u32IVarrayAddr);
352*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMASetIV_Ex)(&psAesInstPri->InitVector[0], psAesInstPri->u32IVLen);
353*53ee8cc1Swenshuai.xi                 }
354*53ee8cc1Swenshuai.xi 
355*53ee8cc1Swenshuai.xi                 //CBC segmental decryption case
356*53ee8cc1Swenshuai.xi                 //if(((psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CBC)||(psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CTR)||(psAesInstPri->eMode == E_DRVAESDMA_CIPHER_CTS_CBC))
357*53ee8cc1Swenshuai.xi                 //    && psAesInstPri->bDescrypt == TRUE)
358*53ee8cc1Swenshuai.xi                 if((((psAesInstPri->u32Mode == E_DRVAESDMA_CIPHER_CBC)||(psAesInstPri->u32Mode == E_DRVAESDMA_CIPHER_CTS_CBC))&& psAesInstPri->bDescrypt == TRUE)||
359*53ee8cc1Swenshuai.xi                     (psAesInstPri->u32Mode == E_DRVAESDMA_CIPHER_CTR))
360*53ee8cc1Swenshuai.xi                 {
361*53ee8cc1Swenshuai.xi                     //printf("[AESDMA]FileInAddr PA = %x\n",psAesInstPri->u32FileinAddr);
362*53ee8cc1Swenshuai.xi                     //printf("[AESDMA]Descrypt = %x\n",psAesInstPri->bDescrypt);
363*53ee8cc1Swenshuai.xi                     MS_U32 i;
364*53ee8cc1Swenshuai.xi                     MS_VIRT FileinVirtAddr;
365*53ee8cc1Swenshuai.xi 
366*53ee8cc1Swenshuai.xi                     FileinVirtAddr = MsOS_PA2KSEG1(psAesInstPri->u32FileinAddr);
367*53ee8cc1Swenshuai.xi 
368*53ee8cc1Swenshuai.xi                     if(psAesInstPri->u32Mode != E_DRVAESDMA_CIPHER_CTR)
369*53ee8cc1Swenshuai.xi                     {
370*53ee8cc1Swenshuai.xi                         for(i = 0; i < 16; i++)
371*53ee8cc1Swenshuai.xi                         {
372*53ee8cc1Swenshuai.xi                             psAesInstPri->InitVector[16-i-1] = *(MS_U8 *)(FileinVirtAddr + psAesInstPri->u32FileInNum-1-i);
373*53ee8cc1Swenshuai.xi                             MS_DEBUG_MSG(printf("[AESDMA INFO]Init Vector[%d] = 0x%x\n",(int)i, psAesInstPri->InitVector[i]));
374*53ee8cc1Swenshuai.xi                         }
375*53ee8cc1Swenshuai.xi                     }
376*53ee8cc1Swenshuai.xi                     psAesInstPri->u32IVLen = 16;
377*53ee8cc1Swenshuai.xi                 }
378*53ee8cc1Swenshuai.xi 
379*53ee8cc1Swenshuai.xi                 //AESDMA set FileInOut info
380*53ee8cc1Swenshuai.xi                 (psAesInstPri->fpAESDMASetFileInOut)(psAesInstPri->u32FileinAddr,psAesInstPri->u32FileInNum,psAesInstPri->u32FileOutSAddr,psAesInstPri->u32FileOutEAddr);
381*53ee8cc1Swenshuai.xi 
382*53ee8cc1Swenshuai.xi                 //AESDMA set key
383*53ee8cc1Swenshuai.xi                 if(psAesInstPri->bSecretKey==1)
384*53ee8cc1Swenshuai.xi                 {
385*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMASetSecureKey)();
386*53ee8cc1Swenshuai.xi                 }
387*53ee8cc1Swenshuai.xi                 else
388*53ee8cc1Swenshuai.xi                 {
389*53ee8cc1Swenshuai.xi                     //u32KeyarryAddr = (MS_U32)&psAesInstPri->CipherKey[0];
390*53ee8cc1Swenshuai.xi                     //(psAesInstPri->fpAESDMASetKey)((MS_U32*)u32KeyarryAddr);
391*53ee8cc1Swenshuai.xi                     (psAesInstPri->fpAESDMASetKey_Ex)((MS_U8*)psAesInstPri->ptrKey, psAesInstPri->u32KeyLen);
392*53ee8cc1Swenshuai.xi 
393*53ee8cc1Swenshuai.xi                     if(0 != psAesInstPri->u32KeyIndex)
394*53ee8cc1Swenshuai.xi                     {
395*53ee8cc1Swenshuai.xi                         (psAesInstPri->fpAESDMASetKeyIndex)(psAesInstPri->u32KeyIndex, psAesInstPri->bOddKey);
396*53ee8cc1Swenshuai.xi                     }
397*53ee8cc1Swenshuai.xi                 }
398*53ee8cc1Swenshuai.xi 
399*53ee8cc1Swenshuai.xi                 //AESDMA trigger start
400*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMAStart)(1);
401*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(printf("[AESDMA INFO]MDrv_CMD_AESDMA_Start\n"));
402*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
403*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
404*53ee8cc1Swenshuai.xi                 else
405*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
406*53ee8cc1Swenshuai.xi             }
407*53ee8cc1Swenshuai.xi             break;
408*53ee8cc1Swenshuai.xi 
409*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_GetStatus:
410*53ee8cc1Swenshuai.xi             {
411*53ee8cc1Swenshuai.xi                 if ((psAesInstPri->fpAESDMAGetStatus)(&u32Ret) == UTOPIA_STATUS_SUCCESS)
412*53ee8cc1Swenshuai.xi                 {
413*53ee8cc1Swenshuai.xi                     *(MS_U32 *)pArgs = u32Ret;
414*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
415*53ee8cc1Swenshuai.xi                 }
416*53ee8cc1Swenshuai.xi                 else
417*53ee8cc1Swenshuai.xi                 {
418*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
419*53ee8cc1Swenshuai.xi                 }
420*53ee8cc1Swenshuai.xi             }
421*53ee8cc1Swenshuai.xi             break;
422*53ee8cc1Swenshuai.xi 
423*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_IsFinished:
424*53ee8cc1Swenshuai.xi             {
425*53ee8cc1Swenshuai.xi                 if (FALSE == MsOS_SHM_GetId((MS_U8*)"AESDMA driver", sizeof(AESDMA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
426*53ee8cc1Swenshuai.xi                 {
427*53ee8cc1Swenshuai.xi                     printf("[AESDMA INFO]query Resouce shared memory fail\n");
428*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_ERR_NOMEM;
429*53ee8cc1Swenshuai.xi                     break;
430*53ee8cc1Swenshuai.xi                 }
431*53ee8cc1Swenshuai.xi                 else
432*53ee8cc1Swenshuai.xi                 {
433*53ee8cc1Swenshuai.xi 
434*53ee8cc1Swenshuai.xi #if defined (__aarch64__)
435*53ee8cc1Swenshuai.xi 
436*53ee8cc1Swenshuai.xi                     psAesResourceShared = (AESDMA_RESOURCE_SHARED*)u32Addr;
437*53ee8cc1Swenshuai.xi #else
438*53ee8cc1Swenshuai.xi                     psAesResourceShared = (AESDMA_RESOURCE_SHARED*)(MS_U32)u32Addr;
439*53ee8cc1Swenshuai.xi #endif
440*53ee8cc1Swenshuai.xi                     pTmpResource = psAesResourceShared->pAESResource;
441*53ee8cc1Swenshuai.xi                     MS_DEBUG_MSG(printf("\n[AESDMA INFO]pResource = %p\n",(int)psAesResourceShared->pAESResource));
442*53ee8cc1Swenshuai.xi                 }
443*53ee8cc1Swenshuai.xi 
444*53ee8cc1Swenshuai.xi                 while ((psAesInstPri->fpAESDMAIsFinished)(&u32Ret) != DRVAESDMA_OK);
445*53ee8cc1Swenshuai.xi 
446*53ee8cc1Swenshuai.xi                 //CBC segmental encryption case
447*53ee8cc1Swenshuai.xi                 if(((psAesInstPri->u32Mode == E_DRVAESDMA_CIPHER_CBC)||(psAesInstPri->u32Mode == E_DRVAESDMA_CIPHER_CTS_CBC))
448*53ee8cc1Swenshuai.xi                     && psAesInstPri->bDescrypt == FALSE)
449*53ee8cc1Swenshuai.xi                 {
450*53ee8cc1Swenshuai.xi                     //printf("[AESDMA]FileOutStartAddr PA = %x\n",psAesInstPri->u32FileOutSAddr);
451*53ee8cc1Swenshuai.xi                     //printf("[AESDMA]Descrypt = %x\n",psAesInstPri->bDescrypt);
452*53ee8cc1Swenshuai.xi                     MS_U32 i;
453*53ee8cc1Swenshuai.xi                     MS_VIRT FileOutStartVirtAddr;
454*53ee8cc1Swenshuai.xi 
455*53ee8cc1Swenshuai.xi                     FileOutStartVirtAddr = MsOS_PA2KSEG1(psAesInstPri->u32FileOutSAddr);
456*53ee8cc1Swenshuai.xi 
457*53ee8cc1Swenshuai.xi                     for(i = 0; i < 16; i++)
458*53ee8cc1Swenshuai.xi                     {
459*53ee8cc1Swenshuai.xi                         psAesInstPri->InitVector[16-i-1] = *(MS_U8 *)(FileOutStartVirtAddr+psAesInstPri->u32FileInNum-1-i);
460*53ee8cc1Swenshuai.xi                         MS_DEBUG_MSG(printf("[AESDMA INFO]Init Vector[%d] = 0x%x\n",(int)i, psAesInstPri->InitVector[i]));
461*53ee8cc1Swenshuai.xi                     }
462*53ee8cc1Swenshuai.xi                     psAesInstPri->u32IVLen = 16;
463*53ee8cc1Swenshuai.xi 
464*53ee8cc1Swenshuai.xi                 }
465*53ee8cc1Swenshuai.xi 
466*53ee8cc1Swenshuai.xi                 //clear secret key setting
467*53ee8cc1Swenshuai.xi                 psAesInstPri->bSecretKey = 0;
468*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(pTmpResource);
469*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(printf("[AESDMA INFO]MDrv_AESDMA_IsFinished\n"));
470*53ee8cc1Swenshuai.xi                 u32Ret = UTOPIA_STATUS_SUCCESS;
471*53ee8cc1Swenshuai.xi             }
472*53ee8cc1Swenshuai.xi             break;
473*53ee8cc1Swenshuai.xi 
474*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetSecureKey:
475*53ee8cc1Swenshuai.xi             {
476*53ee8cc1Swenshuai.xi                 psAesInstPri->bSecretKey = 1;
477*53ee8cc1Swenshuai.xi                 u32Ret = UTOPIA_STATUS_SUCCESS;
478*53ee8cc1Swenshuai.xi             }
479*53ee8cc1Swenshuai.xi             break;
480*53ee8cc1Swenshuai.xi 
481*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetPS:
482*53ee8cc1Swenshuai.xi             {
483*53ee8cc1Swenshuai.xi                 pSetPSParam = (PAESDMA_SET_PS)pArgs;
484*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMASetPS)(pSetPSParam->u32PTN,pSetPSParam->u32Mask,pSetPSParam->bPSin_Enable,pSetPSParam->bPSout_Enable);
485*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
486*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
487*53ee8cc1Swenshuai.xi                 else
488*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
489*53ee8cc1Swenshuai.xi             }
490*53ee8cc1Swenshuai.xi             break;
491*53ee8cc1Swenshuai.xi 
492*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_PSRelease:
493*53ee8cc1Swenshuai.xi             {
494*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMAPSRelease)();
495*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
496*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
497*53ee8cc1Swenshuai.xi                 else
498*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
499*53ee8cc1Swenshuai.xi             }
500*53ee8cc1Swenshuai.xi             break;
501*53ee8cc1Swenshuai.xi 
502*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_GetPSMatchedByteCNT:
503*53ee8cc1Swenshuai.xi             {
504*53ee8cc1Swenshuai.xi                 if ((psAesInstPri->fpAESDMAGetPSMatchedByteCNT)(&u32Ret) == UTOPIA_STATUS_SUCCESS)
505*53ee8cc1Swenshuai.xi                 {
506*53ee8cc1Swenshuai.xi                     *(MS_U32 *)pArgs = u32Ret;
507*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
508*53ee8cc1Swenshuai.xi                 }
509*53ee8cc1Swenshuai.xi                 else
510*53ee8cc1Swenshuai.xi                 {
511*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
512*53ee8cc1Swenshuai.xi                 }
513*53ee8cc1Swenshuai.xi             }
514*53ee8cc1Swenshuai.xi             break;
515*53ee8cc1Swenshuai.xi 
516*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_GetPSMatchedPTN:
517*53ee8cc1Swenshuai.xi             {
518*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMAGetPSMatchedPTN)();
519*53ee8cc1Swenshuai.xi             }
520*53ee8cc1Swenshuai.xi             break;
521*53ee8cc1Swenshuai.xi 
522*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Notify:
523*53ee8cc1Swenshuai.xi             {
524*53ee8cc1Swenshuai.xi                 pNotifyParam = (PAESDMA_NOTIFY)pArgs;
525*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMANotify)(pNotifyParam->eEvents,pNotifyParam->pfCallback);
526*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
527*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
528*53ee8cc1Swenshuai.xi                 else
529*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
530*53ee8cc1Swenshuai.xi             }
531*53ee8cc1Swenshuai.xi             break;
532*53ee8cc1Swenshuai.xi 
533*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Rand:
534*53ee8cc1Swenshuai.xi             {
535*53ee8cc1Swenshuai.xi                 pRandParam = (PAESDMA_RAND)pArgs;
536*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMARand)(pRandParam->u32PABuf,pRandParam->u32Size);
537*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
538*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
539*53ee8cc1Swenshuai.xi                 else
540*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
541*53ee8cc1Swenshuai.xi             }
542*53ee8cc1Swenshuai.xi             break;
543*53ee8cc1Swenshuai.xi 
544*53ee8cc1Swenshuai.xi         case MDrv_CMD_RSA_Calculate:
545*53ee8cc1Swenshuai.xi             {
546*53ee8cc1Swenshuai.xi                 pRSACalParam = (PRSA_CALCULATE)pArgs;
547*53ee8cc1Swenshuai.xi                 if(UtopiaResourceObtain(pModuleAESDMA, AESDMA_POOL_ID_RSA, &pTmpResource) != 0)
548*53ee8cc1Swenshuai.xi                 {
549*53ee8cc1Swenshuai.xi                     printf("UtopiaResourceObtainToInstant fail\n");
550*53ee8cc1Swenshuai.xi 		            u32Ret = UTOPIA_STATUS_ERR_NOT_AVAIL;
551*53ee8cc1Swenshuai.xi                     break;
552*53ee8cc1Swenshuai.xi                 }
553*53ee8cc1Swenshuai.xi 
554*53ee8cc1Swenshuai.xi                 if(FALSE == MsOS_SHM_GetId((MS_U8*)"RSA driver", sizeof(RSA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
555*53ee8cc1Swenshuai.xi                 {
556*53ee8cc1Swenshuai.xi                     if(FALSE == MsOS_SHM_GetId((MS_U8*)"RSA driver", sizeof(RSA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_CREATE))
557*53ee8cc1Swenshuai.xi                     {
558*53ee8cc1Swenshuai.xi                         printf("[RSA INFO]create Resouce shared memory fail\n");
559*53ee8cc1Swenshuai.xi                         u32Ret = UTOPIA_STATUS_ERR_NOMEM;
560*53ee8cc1Swenshuai.xi                         break;
561*53ee8cc1Swenshuai.xi                     }
562*53ee8cc1Swenshuai.xi                     memset((MS_U8 *)u32Addr, 0, sizeof(RSA_RESOURCE_SHARED));
563*53ee8cc1Swenshuai.xi                 }
564*53ee8cc1Swenshuai.xi 
565*53ee8cc1Swenshuai.xi #if defined (__aarch64__)
566*53ee8cc1Swenshuai.xi 
567*53ee8cc1Swenshuai.xi                 psRSAResourceShared = (RSA_RESOURCE_SHARED*)u32Addr;
568*53ee8cc1Swenshuai.xi #else
569*53ee8cc1Swenshuai.xi                 psRSAResourceShared = (RSA_RESOURCE_SHARED*)(MS_U32)u32Addr;
570*53ee8cc1Swenshuai.xi #endif
571*53ee8cc1Swenshuai.xi 
572*53ee8cc1Swenshuai.xi                 psRSAResourceShared->pRSAResource = pTmpResource;
573*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(printf("\n[RSA INFO]pResource = %x\n",(int)psRSAResourceShared->pRSAResource));
574*53ee8cc1Swenshuai.xi 
575*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpRSACalculate)(pRSACalParam->pstSign,pRSACalParam->pstKey,pRSACalParam->eMode);
576*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
577*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
578*53ee8cc1Swenshuai.xi                 else
579*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
580*53ee8cc1Swenshuai.xi             }
581*53ee8cc1Swenshuai.xi             break;
582*53ee8cc1Swenshuai.xi 
583*53ee8cc1Swenshuai.xi         case MDrv_CMD_RSA_IsFinished:
584*53ee8cc1Swenshuai.xi             {
585*53ee8cc1Swenshuai.xi                 if(pArgs)
586*53ee8cc1Swenshuai.xi                 {
587*53ee8cc1Swenshuai.xi                     u32timeout_value = *(MS_U32 *)pArgs;
588*53ee8cc1Swenshuai.xi                 }
589*53ee8cc1Swenshuai.xi                 else
590*53ee8cc1Swenshuai.xi                 {
591*53ee8cc1Swenshuai.xi                     printf("[RSA INFO] Please pass timeout value to driver\n");
592*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_ERR_INV;
593*53ee8cc1Swenshuai.xi                     break;
594*53ee8cc1Swenshuai.xi                 }
595*53ee8cc1Swenshuai.xi 
596*53ee8cc1Swenshuai.xi                 if (u32timeout_value > RSA_MAX_TIMEOUT_VALUE)
597*53ee8cc1Swenshuai.xi                 {
598*53ee8cc1Swenshuai.xi                     printf("[RSA INFO] Invalid timeout value\n");
599*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_ERR_INV;
600*53ee8cc1Swenshuai.xi                     break;
601*53ee8cc1Swenshuai.xi                 }
602*53ee8cc1Swenshuai.xi 
603*53ee8cc1Swenshuai.xi                 if (FALSE == MsOS_SHM_GetId((MS_U8*)"RSA driver", sizeof(RSA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
604*53ee8cc1Swenshuai.xi                 {
605*53ee8cc1Swenshuai.xi                     printf("[RSA INFO]query Resouce shared memory fail\n");
606*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_ERR_NOMEM;
607*53ee8cc1Swenshuai.xi                     break;
608*53ee8cc1Swenshuai.xi                 }
609*53ee8cc1Swenshuai.xi                 else
610*53ee8cc1Swenshuai.xi                 {
611*53ee8cc1Swenshuai.xi                     psRSAResourceShared = (RSA_RESOURCE_SHARED*)u32Addr;
612*53ee8cc1Swenshuai.xi                     pTmpResource = psRSAResourceShared->pRSAResource;
613*53ee8cc1Swenshuai.xi                     MS_DEBUG_MSG(printf("\n[RSA INFO]pResource = %x\n",(int)psRSAResourceShared->pRSAResource));
614*53ee8cc1Swenshuai.xi                 }
615*53ee8cc1Swenshuai.xi 
616*53ee8cc1Swenshuai.xi                 while ((psAesInstPri->fpRSAIsFinished)() != DRVAESDMA_OK)
617*53ee8cc1Swenshuai.xi 				{
618*53ee8cc1Swenshuai.xi                     #ifdef MSOS_TYPE_OPTEE
619*53ee8cc1Swenshuai.xi                     #else
620*53ee8cc1Swenshuai.xi 					MsOS_DelayTaskUs(10);
621*53ee8cc1Swenshuai.xi                     #endif
622*53ee8cc1Swenshuai.xi 					u32timeout_count++;
623*53ee8cc1Swenshuai.xi 
624*53ee8cc1Swenshuai.xi 					//timeout
625*53ee8cc1Swenshuai.xi 					if(u32timeout_count>u32timeout_value)
626*53ee8cc1Swenshuai.xi 					{
627*53ee8cc1Swenshuai.xi                         UtopiaResourceRelease(pTmpResource);
628*53ee8cc1Swenshuai.xi                         printf("[RSA ERROR] RSA timeout happened\n");
629*53ee8cc1Swenshuai.xi 						u32Ret = UTOPIA_STATUS_FAIL;
630*53ee8cc1Swenshuai.xi                         break;
631*53ee8cc1Swenshuai.xi 					}
632*53ee8cc1Swenshuai.xi 
633*53ee8cc1Swenshuai.xi 				}
634*53ee8cc1Swenshuai.xi 
635*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(printf("[RSA INFO]MDrv_RSA_IsFinished\n"));
636*53ee8cc1Swenshuai.xi                 u32Ret = UTOPIA_STATUS_SUCCESS;
637*53ee8cc1Swenshuai.xi             }
638*53ee8cc1Swenshuai.xi             break;
639*53ee8cc1Swenshuai.xi 
640*53ee8cc1Swenshuai.xi         case MDrv_CMD_RSA_Output:
641*53ee8cc1Swenshuai.xi             {
642*53ee8cc1Swenshuai.xi                 if (FALSE == MsOS_SHM_GetId((MS_U8*)"RSA driver", sizeof(RSA_RESOURCE_SHARED), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
643*53ee8cc1Swenshuai.xi                 {
644*53ee8cc1Swenshuai.xi                     printf("[RSA INFO]query Resouce shared memory fail\n");
645*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_ERR_NOMEM;
646*53ee8cc1Swenshuai.xi                     break;
647*53ee8cc1Swenshuai.xi                 }
648*53ee8cc1Swenshuai.xi                 else
649*53ee8cc1Swenshuai.xi                 {
650*53ee8cc1Swenshuai.xi                     psRSAResourceShared = (RSA_RESOURCE_SHARED*)u32Addr;
651*53ee8cc1Swenshuai.xi                     pTmpResource = psRSAResourceShared->pRSAResource;
652*53ee8cc1Swenshuai.xi                     MS_DEBUG_MSG(printf("\n[RSA INFO]pResource = %x\n",(int)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(pTmpResource);
660*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
661*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
662*53ee8cc1Swenshuai.xi                 else
663*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
664*53ee8cc1Swenshuai.xi             }
665*53ee8cc1Swenshuai.xi             break;
666*53ee8cc1Swenshuai.xi 
667*53ee8cc1Swenshuai.xi         case MDrv_CMD_SHA_Calculate:
668*53ee8cc1Swenshuai.xi             {
669*53ee8cc1Swenshuai.xi                 pSHACalParam = (PSHA_CALCULATE)pArgs;
670*53ee8cc1Swenshuai.xi                 if(UtopiaResourceObtain(pModuleAESDMA, AESDMA_POOL_ID_SHA, &pTmpResource) != 0)
671*53ee8cc1Swenshuai.xi                 {
672*53ee8cc1Swenshuai.xi                     printf("UtopiaResourceObtainToInstant fail\n");
673*53ee8cc1Swenshuai.xi 		            u32Ret = UTOPIA_STATUS_ERR_NOT_AVAIL;
674*53ee8cc1Swenshuai.xi                 }
675*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpSHACalculate)(pSHACalParam->eMode,pSHACalParam->u32PAInBuf,pSHACalParam->u32Size,pSHACalParam->u32PAOutBuf);
676*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(pTmpResource);
677*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
678*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
679*53ee8cc1Swenshuai.xi                 else
680*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
681*53ee8cc1Swenshuai.xi             }
682*53ee8cc1Swenshuai.xi             break;
683*53ee8cc1Swenshuai.xi 
684*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Memcpy:
685*53ee8cc1Swenshuai.xi             {
686*53ee8cc1Swenshuai.xi                 //AESDMA trigger start for using AESDMA replace BDMA case
687*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMAStart)(1);
688*53ee8cc1Swenshuai.xi 
689*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
690*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
691*53ee8cc1Swenshuai.xi                 else
692*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
693*53ee8cc1Swenshuai.xi             }
694*53ee8cc1Swenshuai.xi             break;
695*53ee8cc1Swenshuai.xi 
696*53ee8cc1Swenshuai.xi         case MDrv_CMD_SHA_CalculateManual:
697*53ee8cc1Swenshuai.xi             {
698*53ee8cc1Swenshuai.xi                 pSHACalManuParam = (PSHA_CALCULATE_MANUAL)pArgs;
699*53ee8cc1Swenshuai.xi                 if(UtopiaResourceObtain(pModuleAESDMA, AESDMA_POOL_ID_SHA, &pTmpResource) != 0)
700*53ee8cc1Swenshuai.xi                 {
701*53ee8cc1Swenshuai.xi                     printf("UtopiaResourceObtainToInstant fail\n");
702*53ee8cc1Swenshuai.xi 		            u32Ret = UTOPIA_STATUS_ERR_NOT_AVAIL;
703*53ee8cc1Swenshuai.xi                 }
704*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpSHACalculateManual)(pSHACalManuParam->stCfg,pSHACalManuParam->eStage,pSHACalManuParam->u32DoneBytes,pSHACalManuParam->pu8SetIV);
705*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(pTmpResource);
706*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
707*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
708*53ee8cc1Swenshuai.xi                 else
709*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
710*53ee8cc1Swenshuai.xi             }
711*53ee8cc1Swenshuai.xi             break;
712*53ee8cc1Swenshuai.xi 
713*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetKey_Ex:
714*53ee8cc1Swenshuai.xi             {
715*53ee8cc1Swenshuai.xi                 pSetKeyEx = (PAESDMA_SET_KEY_EX)pArgs;
716*53ee8cc1Swenshuai.xi                 if(pSetKeyEx->pu8Key == NULL)
717*53ee8cc1Swenshuai.xi                 {
718*53ee8cc1Swenshuai.xi                     psAesInstPri->ptrKey = 0;
719*53ee8cc1Swenshuai.xi                 }
720*53ee8cc1Swenshuai.xi                 else
721*53ee8cc1Swenshuai.xi                 {
722*53ee8cc1Swenshuai.xi                     psAesInstPri->u32KeyIndex = 0;
723*53ee8cc1Swenshuai.xi                     memcpy((void *)psAesInstPri->CipherKey, pSetKeyEx->pu8Key, pSetKeyEx->u32Len);
724*53ee8cc1Swenshuai.xi                     psAesInstPri->ptrKey = (MS_VIRT)psAesInstPri->CipherKey;
725*53ee8cc1Swenshuai.xi                 }
726*53ee8cc1Swenshuai.xi 
727*53ee8cc1Swenshuai.xi                 psAesInstPri->u32KeyLen = pSetKeyEx->u32Len;
728*53ee8cc1Swenshuai.xi                 u32Ret = UTOPIA_STATUS_SUCCESS;
729*53ee8cc1Swenshuai.xi             }
730*53ee8cc1Swenshuai.xi             break;
731*53ee8cc1Swenshuai.xi 
732*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetIV_Ex:
733*53ee8cc1Swenshuai.xi             {
734*53ee8cc1Swenshuai.xi                 pSetIVEx = (PAESDMA_SET_IV_EX)pArgs;
735*53ee8cc1Swenshuai.xi                 memcpy((void *)psAesInstPri->InitVector, pSetIVEx->pu8IV, pSetIVEx->u32Len);
736*53ee8cc1Swenshuai.xi                 psAesInstPri->u32IVLen = pSetIVEx->u32Len;
737*53ee8cc1Swenshuai.xi                 u32Ret = UTOPIA_STATUS_SUCCESS;
738*53ee8cc1Swenshuai.xi             }
739*53ee8cc1Swenshuai.xi             break;
740*53ee8cc1Swenshuai.xi 
741*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_Set_Key_Index:
742*53ee8cc1Swenshuai.xi             {
743*53ee8cc1Swenshuai.xi                 pKeyIndex = (PAESDMA_KEY_INDEX)pArgs;
744*53ee8cc1Swenshuai.xi                 psAesInstPri->u32KeyIndex = pKeyIndex->u32KeyIndex;
745*53ee8cc1Swenshuai.xi                 psAesInstPri->bOddKey = pKeyIndex->bOddKeyEn;
746*53ee8cc1Swenshuai.xi                 psAesInstPri->ptrKey = 0;
747*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMASetKeyIndex)(pKeyIndex->u32KeyIndex, pKeyIndex->bOddKeyEn);
748*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
749*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
750*53ee8cc1Swenshuai.xi                 else
751*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
752*53ee8cc1Swenshuai.xi             }
753*53ee8cc1Swenshuai.xi             break;
754*53ee8cc1Swenshuai.xi 
755*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_SetDefaultCAVid:
756*53ee8cc1Swenshuai.xi             {
757*53ee8cc1Swenshuai.xi                 pCAVid = (PAESDMA_CAVID)pArgs;
758*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMASetDefaultCAVid)(pCAVid->u32CAVid);
759*53ee8cc1Swenshuai.xi                 if (u32Ret == DRVAESDMA_OK)
760*53ee8cc1Swenshuai.xi                 {
761*53ee8cc1Swenshuai.xi                     psAesInstPri->u32CAVid = pCAVid->u32CAVid;
762*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
763*53ee8cc1Swenshuai.xi                 }
764*53ee8cc1Swenshuai.xi                 else
765*53ee8cc1Swenshuai.xi                 {
766*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
767*53ee8cc1Swenshuai.xi                 }
768*53ee8cc1Swenshuai.xi             }
769*53ee8cc1Swenshuai.xi             break;
770*53ee8cc1Swenshuai.xi 
771*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_AllocKeySlot:
772*53ee8cc1Swenshuai.xi             {
773*53ee8cc1Swenshuai.xi                 MS_U32 i = 0;
774*53ee8cc1Swenshuai.xi 
775*53ee8cc1Swenshuai.xi                 pAllocKeySlot = (PAESDMA_ALLOC_KEY_SLOT)pArgs;
776*53ee8cc1Swenshuai.xi 
777*53ee8cc1Swenshuai.xi                 for(i = 0;i< sizeof(psAesInstPri->u8KeySlotUsage);i++)
778*53ee8cc1Swenshuai.xi                 {
779*53ee8cc1Swenshuai.xi                     if(0 == psAesInstPri->u8KeySlotUsage[i])
780*53ee8cc1Swenshuai.xi                     {
781*53ee8cc1Swenshuai.xi                         break;
782*53ee8cc1Swenshuai.xi                     }
783*53ee8cc1Swenshuai.xi                 }
784*53ee8cc1Swenshuai.xi 
785*53ee8cc1Swenshuai.xi                 if(sizeof(psAesInstPri->u8KeySlotUsage) == i)
786*53ee8cc1Swenshuai.xi                 {
787*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
788*53ee8cc1Swenshuai.xi                 }
789*53ee8cc1Swenshuai.xi                 else
790*53ee8cc1Swenshuai.xi                 {
791*53ee8cc1Swenshuai.xi                     psAesInstPri->u8KeySlotUsage[i] = 1;
792*53ee8cc1Swenshuai.xi                     *pAllocKeySlot->pu32KeyIndex = i + AESDMA_KEY_SLOT_BASE;
793*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
794*53ee8cc1Swenshuai.xi                 }
795*53ee8cc1Swenshuai.xi             }
796*53ee8cc1Swenshuai.xi             break;
797*53ee8cc1Swenshuai.xi 
798*53ee8cc1Swenshuai.xi         case MDrv_CMD_AESDMA_FreeKeySlot:
799*53ee8cc1Swenshuai.xi             {
800*53ee8cc1Swenshuai.xi                 pKeyIndex = (PAESDMA_KEY_INDEX)pArgs;
801*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMASetDefaultCAVid)(psAesInstPri->u32CAVid);
802*53ee8cc1Swenshuai.xi                 if(u32Ret != DRVAESDMA_OK)
803*53ee8cc1Swenshuai.xi                 {
804*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
805*53ee8cc1Swenshuai.xi                     break;
806*53ee8cc1Swenshuai.xi                 }
807*53ee8cc1Swenshuai.xi 
808*53ee8cc1Swenshuai.xi                 u32Ret = (psAesInstPri->fpAESDMAFreeKeySlot)(pKeyIndex->u32KeyIndex);
809*53ee8cc1Swenshuai.xi 
810*53ee8cc1Swenshuai.xi                 if ((u32Ret == DRVAESDMA_OK) && (pKeyIndex->u32KeyIndex >= AESDMA_KEY_SLOT_BASE))
811*53ee8cc1Swenshuai.xi                 {
812*53ee8cc1Swenshuai.xi                     psAesInstPri->u8KeySlotUsage[(pKeyIndex->u32KeyIndex - AESDMA_KEY_SLOT_BASE)] = 0;
813*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_SUCCESS;
814*53ee8cc1Swenshuai.xi                 }
815*53ee8cc1Swenshuai.xi                 else
816*53ee8cc1Swenshuai.xi                 {
817*53ee8cc1Swenshuai.xi                     u32Ret = UTOPIA_STATUS_FAIL;
818*53ee8cc1Swenshuai.xi                 }
819*53ee8cc1Swenshuai.xi             }
820*53ee8cc1Swenshuai.xi             break;
821*53ee8cc1Swenshuai.xi 
822*53ee8cc1Swenshuai.xi         default:
823*53ee8cc1Swenshuai.xi             break;
824*53ee8cc1Swenshuai.xi     };
825*53ee8cc1Swenshuai.xi 
826*53ee8cc1Swenshuai.xi     UtopiaResourceRelease(pDRVAESResource);
827*53ee8cc1Swenshuai.xi 
828*53ee8cc1Swenshuai.xi 	return u32Ret;
829*53ee8cc1Swenshuai.xi }
830*53ee8cc1Swenshuai.xi 
AESDMAClose(void * pInstance)831*53ee8cc1Swenshuai.xi MS_U32 AESDMAClose(void* pInstance)
832*53ee8cc1Swenshuai.xi {
833*53ee8cc1Swenshuai.xi 	UtopiaInstanceDelete(pInstance);
834*53ee8cc1Swenshuai.xi 
835*53ee8cc1Swenshuai.xi 	return TRUE;
836*53ee8cc1Swenshuai.xi }
837*53ee8cc1Swenshuai.xi 
838