xref: /utopia/UTPA2-700.0.x/modules/security/drv/cipher/drvCIPHER.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2006-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi //
97*53ee8cc1Swenshuai.xi // file    drvCIPHER.c
98*53ee8cc1Swenshuai.xi // @brief  CIPHER Driver
99*53ee8cc1Swenshuai.xi // @author MStar Semiconductor,Inc.
100*53ee8cc1Swenshuai.xi //
101*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////////////////
102*53ee8cc1Swenshuai.xi 
103*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
104*53ee8cc1Swenshuai.xi #include <linux/string.h>
105*53ee8cc1Swenshuai.xi #include <linux/uaccess.h>
106*53ee8cc1Swenshuai.xi #include <linux/compat.h>
107*53ee8cc1Swenshuai.xi #else
108*53ee8cc1Swenshuai.xi #include <stdio.h>
109*53ee8cc1Swenshuai.xi #include <string.h>
110*53ee8cc1Swenshuai.xi #endif
111*53ee8cc1Swenshuai.xi 
112*53ee8cc1Swenshuai.xi #include "MsCommon.h"
113*53ee8cc1Swenshuai.xi #include "MsIRQ.h"
114*53ee8cc1Swenshuai.xi #include "MsOS.h"
115*53ee8cc1Swenshuai.xi #include "MsVersion.h"
116*53ee8cc1Swenshuai.xi 
117*53ee8cc1Swenshuai.xi #include "drvCIPHER.h"
118*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
119*53ee8cc1Swenshuai.xi #include "halRSA.h"
120*53ee8cc1Swenshuai.xi #include "halCIPHER.h"
121*53ee8cc1Swenshuai.xi #include "utopia.h"
122*53ee8cc1Swenshuai.xi 
123*53ee8cc1Swenshuai.xi #include "drvAESDMA_v2.h"
124*53ee8cc1Swenshuai.xi #include "drvAESDMA_private.h"
125*53ee8cc1Swenshuai.xi 
126*53ee8cc1Swenshuai.xi #ifdef CIPHER_UTOPIA_20
127*53ee8cc1Swenshuai.xi #define CIPHER_UTOPIA2 1UL
128*53ee8cc1Swenshuai.xi #else
129*53ee8cc1Swenshuai.xi #define CIPHER_UTOPIA2 0UL
130*53ee8cc1Swenshuai.xi #endif
131*53ee8cc1Swenshuai.xi 
132*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
133*53ee8cc1Swenshuai.xi #include "drvCIPHER_v2.h"
134*53ee8cc1Swenshuai.xi #endif
135*53ee8cc1Swenshuai.xi #include "drvCIPHER_private.h"
136*53ee8cc1Swenshuai.xi 
137*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
138*53ee8cc1Swenshuai.xi //  Driver Compiler Option
139*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
140*53ee8cc1Swenshuai.xi #define CIPHERIntEnable()                       MsOS_EnableInterrupt (CRYPTODMA_IRQ)
141*53ee8cc1Swenshuai.xi #define CIPHERIntDisable()                      MsOS_DisableInterrupt(CRYPTODMA_IRQ)
142*53ee8cc1Swenshuai.xi #define CIPHERIntAttach()                       MsOS_AttachInterrupt (CRYPTODMA_IRQ, (InterruptCb )_CIPHER_Isr)
143*53ee8cc1Swenshuai.xi #define CIPHERIntDetach()                       MsOS_DetachInterrupt (CRYPTODMA_IRQ)
144*53ee8cc1Swenshuai.xi 
145*53ee8cc1Swenshuai.xi #define AESDMAPA2KSEG1(addr)                    ((void *)(((MS_U32)addr) | 0xa0000000UL)) //physical -> unchched
146*53ee8cc1Swenshuai.xi 
147*53ee8cc1Swenshuai.xi 
148*53ee8cc1Swenshuai.xi #define RSAInitChk()                               if(_bRSA_Init == FALSE){ DEBUG_CIPHER(CIPHER_DBG_ERR,"Not initialized"); return DRVAESDMA_FAIL; }
149*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
150*53ee8cc1Swenshuai.xi //  Local Defines
151*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
152*53ee8cc1Swenshuai.xi #define CIPHER_TASK_STACK_SIZE   (4096UL)
153*53ee8cc1Swenshuai.xi #define CIPHER_CAVID             (0x0FUL)
154*53ee8cc1Swenshuai.xi #define HASH_HMAC_KEYPAD_SIZE    (64UL)
155*53ee8cc1Swenshuai.xi #define HASH_RPT_SIZE_ALL        (10UL)
156*53ee8cc1Swenshuai.xi #define HASH_RPT_SIZE_STATUS     (2UL)
157*53ee8cc1Swenshuai.xi 
158*53ee8cc1Swenshuai.xi #define HASH_MD5_DIGEST_SIZE     (16UL)
159*53ee8cc1Swenshuai.xi #define HASH_SHA1_DIGEST_SIZE    (20UL)
160*53ee8cc1Swenshuai.xi #define HASH_SHA256_DIGEST_SIZE  (32UL)
161*53ee8cc1Swenshuai.xi #define HASH_SM3_DIGEST_SIZE     (32UL)
162*53ee8cc1Swenshuai.xi #define HASH_BLOCK_SIZE          (64UL)
163*53ee8cc1Swenshuai.xi 
164*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_SHA_CHECK_SIZE    (8UL)
165*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_LUT3_BITMAP_LUT   (0x1UL)
166*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_LUT3_BITMAP_M     (0x2UL)
167*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_LUT3_BITMAP_BC    (0x4UL)
168*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_KCV_SIZE          (16UL)   //HW limitation, need padding to 16 bytes
169*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_LUT_SIZE          (256UL)
170*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_M_SIZE            (128UL)
171*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_BC_SIZE           (16UL)
172*53ee8cc1Swenshuai.xi 
173*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_SHA_FAIL          (0x00000010UL)
174*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_KCV_FAIL          (0x00000020UL)
175*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_LUT_FAIL          (0x00000030UL)
176*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_M_FAIL            (0x00000040UL)
177*53ee8cc1Swenshuai.xi #define DRV_CIPHER_TA_BC_FAIL           (0x00000050UL)
178*53ee8cc1Swenshuai.xi 
179*53ee8cc1Swenshuai.xi #define DRV_CIPHER_NO_REPORT_BUFFER     (0x00000003UL)
180*53ee8cc1Swenshuai.xi 
181*53ee8cc1Swenshuai.xi //Interrupt
182*53ee8cc1Swenshuai.xi #define DRV_CIPHER_DMA_DATA_INIT        (0x00000000UL)
183*53ee8cc1Swenshuai.xi #define DRV_CIPHER_DONE                 (0x00000100UL)
184*53ee8cc1Swenshuai.xi #define DRV_CIPHER_CALLBACK             (0x0000000FUL)
185*53ee8cc1Swenshuai.xi #define DRV_CIPHER_CLOSE                (0x80000000UL)
186*53ee8cc1Swenshuai.xi 
187*53ee8cc1Swenshuai.xi //Report status
188*53ee8cc1Swenshuai.xi #define DRV_CIPHER_REPORT_OK            (0x80000000UL)
189*53ee8cc1Swenshuai.xi 
190*53ee8cc1Swenshuai.xi typedef struct
191*53ee8cc1Swenshuai.xi {
192*53ee8cc1Swenshuai.xi     MS_U32 u32LUT;  //LUT3 fill in 512 bytes table, each has 9 bits to describe
193*53ee8cc1Swenshuai.xi     MS_U32 u32M;
194*53ee8cc1Swenshuai.xi     MS_U32 u32BC;
195*53ee8cc1Swenshuai.xi }DRV_CIPHER_TA_LUT3;
196*53ee8cc1Swenshuai.xi 
197*53ee8cc1Swenshuai.xi 
198*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
199*53ee8cc1Swenshuai.xi //  Global Variable
200*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
201*53ee8cc1Swenshuai.xi static MS_BOOL _bCIPHERDrv_Inited = FALSE;
202*53ee8cc1Swenshuai.xi static MS_BOOL _bCIPHERDrv_KeyCtrlEn = FALSE;
203*53ee8cc1Swenshuai.xi 
204*53ee8cc1Swenshuai.xi #ifdef CIPHER_NO_PRINTF
205*53ee8cc1Swenshuai.xi #define DRV_CIPHER_ASSERT( _bool_, _msg_, ret) if(!(_bool_)){return (ret);}
206*53ee8cc1Swenshuai.xi #else
207*53ee8cc1Swenshuai.xi #define DRV_CIPHER_ASSERT( _bool_, _msg_, ret) if(!(_bool_)){ printf(_msg_); return (ret);}
208*53ee8cc1Swenshuai.xi #endif
209*53ee8cc1Swenshuai.xi #define DRV_CIPHER_INIT_CHECK(ret) DRV_CIPHER_ASSERT(TRUE == _bCIPHERDrv_Inited, "drvCIPHER is not initialized\n", ret)
210*53ee8cc1Swenshuai.xi #define DRV_CIPHER_KEYCTRL_CHECK(ret) DRV_CIPHER_ASSERT(TRUE == _bCIPHERDrv_KeyCtrlEn, "drvCIPHER key control mode is not enable\n", ret)
211*53ee8cc1Swenshuai.xi 
212*53ee8cc1Swenshuai.xi MS_S32  _CipherMtx = 0;
213*53ee8cc1Swenshuai.xi MS_S32  _CipherRSAMtx;
214*53ee8cc1Swenshuai.xi MS_S32  _CipherSemaphore;
215*53ee8cc1Swenshuai.xi 
216*53ee8cc1Swenshuai.xi MS_S32  _AESDMAMtx = 0;
217*53ee8cc1Swenshuai.xi 
218*53ee8cc1Swenshuai.xi MS_BOOL bDES_Key = FALSE;
219*53ee8cc1Swenshuai.xi 
220*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
221*53ee8cc1Swenshuai.xi static void *pu32AesdmaInst = NULL;
222*53ee8cc1Swenshuai.xi static void *pu32CipherInst = NULL;
223*53ee8cc1Swenshuai.xi #endif
224*53ee8cc1Swenshuai.xi 
225*53ee8cc1Swenshuai.xi static CIPHER_DBGMSG_LEVEL _CIPHERDBGLevel = CIPHER_DBG_ERR;
226*53ee8cc1Swenshuai.xi static MSIF_Version _drv_cipher_version = {
227*53ee8cc1Swenshuai.xi     .DDI = { CIPHER_DRV_VERSION, },
228*53ee8cc1Swenshuai.xi };
229*53ee8cc1Swenshuai.xi 
230*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
231*53ee8cc1Swenshuai.xi //Isr proc
232*53ee8cc1Swenshuai.xi static void*                            _pCIPHERTaskStack;
233*53ee8cc1Swenshuai.xi static MS_U8                            _u8CIPHER_StackBuffer[CIPHER_TASK_STACK_SIZE];
234*53ee8cc1Swenshuai.xi static MS_S32                           _s32CIPHERTaskId;
235*53ee8cc1Swenshuai.xi 
236*53ee8cc1Swenshuai.xi static MS_U32                           _u32LastErr;
237*53ee8cc1Swenshuai.xi 
238*53ee8cc1Swenshuai.xi typedef enum
239*53ee8cc1Swenshuai.xi {
240*53ee8cc1Swenshuai.xi     E_CIPHER_DMA_DONE,
241*53ee8cc1Swenshuai.xi     E_CIPHER_HASH_DONE,
242*53ee8cc1Swenshuai.xi }CIPHER_WAIT;
243*53ee8cc1Swenshuai.xi 
244*53ee8cc1Swenshuai.xi static CIPHER_WAIT _eCipherWait;
245*53ee8cc1Swenshuai.xi 
246*53ee8cc1Swenshuai.xi #endif
247*53ee8cc1Swenshuai.xi 
248*53ee8cc1Swenshuai.xi #define CIPHER_REPORT_BUFFER_MAX 2UL
249*53ee8cc1Swenshuai.xi 
250*53ee8cc1Swenshuai.xi typedef struct
251*53ee8cc1Swenshuai.xi {
252*53ee8cc1Swenshuai.xi     MS_U32  u32Report;
253*53ee8cc1Swenshuai.xi     MS_U32  u32DoneBytes;
254*53ee8cc1Swenshuai.xi     MS_U32  u32ExcMsg;
255*53ee8cc1Swenshuai.xi     MS_U8*  pu8Digest_Buf;
256*53ee8cc1Swenshuai.xi     MS_U32  u32Digest_Buf_Size;
257*53ee8cc1Swenshuai.xi     P_DrvCIPHER_EvtCallback pfCallback;
258*53ee8cc1Swenshuai.xi     CIPHER_KEY_SRC  eKeySrc;
259*53ee8cc1Swenshuai.xi     MS_U8   u8KeyIdx;
260*53ee8cc1Swenshuai.xi     MS_BOOL bUsed;
261*53ee8cc1Swenshuai.xi }CIPHER_REPORT;
262*53ee8cc1Swenshuai.xi 
263*53ee8cc1Swenshuai.xi typedef struct
264*53ee8cc1Swenshuai.xi {
265*53ee8cc1Swenshuai.xi     DRV_CIPHER_DMACFG stConfig;
266*53ee8cc1Swenshuai.xi     MS_U8           u8Key[HAL_CRYPTODMA_KEYLEN_MAX];
267*53ee8cc1Swenshuai.xi     MS_U8           u8IV[HAL_CRYPTODMA_KEYLEN_MAX];
268*53ee8cc1Swenshuai.xi     MS_BOOL         bUsed;
269*53ee8cc1Swenshuai.xi }CIPHER_RESOURCE;
270*53ee8cc1Swenshuai.xi 
271*53ee8cc1Swenshuai.xi static CIPHER_REPORT _CIPHER_ReportBuffer[CIPHER_REPORT_BUFFER_MAX];
272*53ee8cc1Swenshuai.xi static CIPHER_RESOURCE _CIPHER_Resource[HAL_CRYPTODMA_DMA_KEY_SLOT];
273*53ee8cc1Swenshuai.xi 
274*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
275*53ee8cc1Swenshuai.xi     extern MS_U32 _u32CallbackID;
276*53ee8cc1Swenshuai.xi     extern MS_U16 _u16ThreadID;
277*53ee8cc1Swenshuai.xi #else
278*53ee8cc1Swenshuai.xi     static MS_U32 _u32CallbackID = 1;
279*53ee8cc1Swenshuai.xi     static MS_U16 _u16ThreadID = 1;
280*53ee8cc1Swenshuai.xi #endif
281*53ee8cc1Swenshuai.xi 
282*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
283*53ee8cc1Swenshuai.xi //  Internal Variable
284*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
285*53ee8cc1Swenshuai.xi 
286*53ee8cc1Swenshuai.xi static MS_BOOL                        _bRSA_Init = FALSE;
287*53ee8cc1Swenshuai.xi 
288*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
289*53ee8cc1Swenshuai.xi static MS_S32                           _s32CIPHEREventId;
290*53ee8cc1Swenshuai.xi 
291*53ee8cc1Swenshuai.xi #define _CIPHER_SetEvent(flag)             MsOS_SetEvent(_s32CIPHEREventId, (flag))
292*53ee8cc1Swenshuai.xi #define _CIPHER_GetEvent(events)           MsOS_WaitEvent(_s32CIPHEREventId, DRV_CIPHER_DONE, &events, E_OR_CLEAR, MSOS_WAIT_FOREVER)
293*53ee8cc1Swenshuai.xi 
294*53ee8cc1Swenshuai.xi #endif
295*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
296*53ee8cc1Swenshuai.xi //  Debug Function
297*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
298*53ee8cc1Swenshuai.xi #ifdef CIPHER_NO_PRINTF
299*53ee8cc1Swenshuai.xi #define DEBUG_CIPHER(debug_level, fmt, args...)
300*53ee8cc1Swenshuai.xi #define DEBUG_CIPHER_KEYCTRL(debug_level, fmt, args...)
301*53ee8cc1Swenshuai.xi #else
302*53ee8cc1Swenshuai.xi #define DEBUG_CIPHER(debug_level, fmt, args...) do{ if (_CIPHERDBGLevel >= (debug_level))\
303*53ee8cc1Swenshuai.xi         printf("[%s][%d]"fmt"\n", __FUNCTION__, __LINE__,  ## args);}\
304*53ee8cc1Swenshuai.xi         while(0)
305*53ee8cc1Swenshuai.xi #define DEBUG_CIPHER_KEYCTRL(debug_level, fmt, args...) do{ if (_CIPHERDBGLevel >= (debug_level))\
306*53ee8cc1Swenshuai.xi         printf("[%s][%d][KeyCtrl] "fmt"\n", __FUNCTION__, __LINE__,  ## args);}\
307*53ee8cc1Swenshuai.xi         while(0)
308*53ee8cc1Swenshuai.xi #endif
309*53ee8cc1Swenshuai.xi 
310*53ee8cc1Swenshuai.xi 
311*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
312*53ee8cc1Swenshuai.xi //  Internal Function
313*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
314*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
_CIPHER_Isr(void)315*53ee8cc1Swenshuai.xi static void _CIPHER_Isr(void)
316*53ee8cc1Swenshuai.xi {
317*53ee8cc1Swenshuai.xi     MS_U32  u32Rpt[10] = {0};
318*53ee8cc1Swenshuai.xi     MS_U32  u32ExcMsg = 0;
319*53ee8cc1Swenshuai.xi     MS_U32  u32RptId = 0;
320*53ee8cc1Swenshuai.xi     MS_U8   u8BufNum     = 0;
321*53ee8cc1Swenshuai.xi     MS_U8*  pu8Digest_Buf  = NULL;
322*53ee8cc1Swenshuai.xi     MS_U32  u32Digest_Buf_Size = 0;
323*53ee8cc1Swenshuai.xi 
324*53ee8cc1Swenshuai.xi     HAL_CIPHER_IntClear();
325*53ee8cc1Swenshuai.xi 
326*53ee8cc1Swenshuai.xi     if(E_CIPHER_DMA_DONE == _eCipherWait)
327*53ee8cc1Swenshuai.xi     {
328*53ee8cc1Swenshuai.xi         HAL_CIPHER_DMA_GetRpt(u32Rpt);
329*53ee8cc1Swenshuai.xi         HAL_CIPHER_GetException(&u32ExcMsg);
330*53ee8cc1Swenshuai.xi 
331*53ee8cc1Swenshuai.xi         u32RptId = u32Rpt[0] & REG_CIPHER_RPT_THREAD_MSK;
332*53ee8cc1Swenshuai.xi         u8BufNum = u32RptId % (MS_U32)CIPHER_REPORT_BUFFER_MAX;
333*53ee8cc1Swenshuai.xi 
334*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[u8BufNum].u32Report    = u32Rpt[0];
335*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = u32Rpt[1];
336*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[u8BufNum].u32ExcMsg    = u32ExcMsg;
337*53ee8cc1Swenshuai.xi 
338*53ee8cc1Swenshuai.xi     }
339*53ee8cc1Swenshuai.xi     else  //E_CIPHER_HASH_DONE
340*53ee8cc1Swenshuai.xi     {
341*53ee8cc1Swenshuai.xi         //Get all register report, include status and digest
342*53ee8cc1Swenshuai.xi         HAL_CIPHER_Hash_GetRpt(u32Rpt, HASH_RPT_SIZE_ALL);
343*53ee8cc1Swenshuai.xi         HAL_CIPHER_GetException(&u32ExcMsg);
344*53ee8cc1Swenshuai.xi 
345*53ee8cc1Swenshuai.xi         u32RptId = u32Rpt[0] & REG_CIPHER_RPT_THREAD_MSK;
346*53ee8cc1Swenshuai.xi         u8BufNum = u32RptId % (MS_U32)CIPHER_REPORT_BUFFER_MAX;
347*53ee8cc1Swenshuai.xi 
348*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[u8BufNum].u32Report    = u32Rpt[0];
349*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = u32Rpt[1];
350*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[u8BufNum].u32ExcMsg    = u32ExcMsg;
351*53ee8cc1Swenshuai.xi 
352*53ee8cc1Swenshuai.xi         pu8Digest_Buf      = _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf;
353*53ee8cc1Swenshuai.xi         u32Digest_Buf_Size = _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size;
354*53ee8cc1Swenshuai.xi 
355*53ee8cc1Swenshuai.xi         if((pu8Digest_Buf != NULL) && (u32Digest_Buf_Size != 0))
356*53ee8cc1Swenshuai.xi         {
357*53ee8cc1Swenshuai.xi             //Avoid status report, only copy digest to output address
358*53ee8cc1Swenshuai.xi             memcpy((MS_U8 *)pu8Digest_Buf, u32Rpt+HASH_RPT_SIZE_STATUS, u32Digest_Buf_Size);
359*53ee8cc1Swenshuai.xi         }
360*53ee8cc1Swenshuai.xi 
361*53ee8cc1Swenshuai.xi     }
362*53ee8cc1Swenshuai.xi 
363*53ee8cc1Swenshuai.xi     _u32CallbackID = u32RptId;
364*53ee8cc1Swenshuai.xi 
365*53ee8cc1Swenshuai.xi     _CIPHER_SetEvent(DRV_CIPHER_DONE); // Trigger task
366*53ee8cc1Swenshuai.xi     CIPHERIntEnable();
367*53ee8cc1Swenshuai.xi 
368*53ee8cc1Swenshuai.xi }
369*53ee8cc1Swenshuai.xi 
_CIPHER_Isr_Proc(void)370*53ee8cc1Swenshuai.xi static void _CIPHER_Isr_Proc(void)
371*53ee8cc1Swenshuai.xi {
372*53ee8cc1Swenshuai.xi     MS_U32  u32Events = 0;
373*53ee8cc1Swenshuai.xi     MS_U32  u32Rpt    = 0;
374*53ee8cc1Swenshuai.xi     MS_BOOL bSuccess  = FALSE;
375*53ee8cc1Swenshuai.xi     MS_U32  u32ExcMsg = 0;
376*53ee8cc1Swenshuai.xi     MS_U32  u32ExcTmp = 0;
377*53ee8cc1Swenshuai.xi     MS_U32  u32RptId  = 0;
378*53ee8cc1Swenshuai.xi     MS_U8   u8BufNum  = 0;
379*53ee8cc1Swenshuai.xi     MS_U8   u8KeyIdx  = 0;
380*53ee8cc1Swenshuai.xi     P_DrvCIPHER_EvtCallback pfCallBack = NULL;
381*53ee8cc1Swenshuai.xi     CIPHER_KEY_SRC  eKeySrc = 0;
382*53ee8cc1Swenshuai.xi 
383*53ee8cc1Swenshuai.xi     while (1)
384*53ee8cc1Swenshuai.xi     {
385*53ee8cc1Swenshuai.xi         _CIPHER_GetEvent(u32Events);
386*53ee8cc1Swenshuai.xi 
387*53ee8cc1Swenshuai.xi         if (HAS_FLAG(u32Events, DRV_CIPHER_DONE))
388*53ee8cc1Swenshuai.xi         {
389*53ee8cc1Swenshuai.xi             //Handling callback
390*53ee8cc1Swenshuai.xi             u8BufNum   = _u32CallbackID % (MS_U32)CIPHER_REPORT_BUFFER_MAX;
391*53ee8cc1Swenshuai.xi             u32Rpt     = _CIPHER_ReportBuffer[u8BufNum].u32Report;
392*53ee8cc1Swenshuai.xi             pfCallBack = _CIPHER_ReportBuffer[u8BufNum].pfCallback;
393*53ee8cc1Swenshuai.xi             u32ExcTmp  = _CIPHER_ReportBuffer[u8BufNum].u32ExcMsg;
394*53ee8cc1Swenshuai.xi             eKeySrc    = _CIPHER_ReportBuffer[u8BufNum].eKeySrc;
395*53ee8cc1Swenshuai.xi             u8KeyIdx   = _CIPHER_ReportBuffer[u8BufNum].u8KeyIdx;
396*53ee8cc1Swenshuai.xi 
397*53ee8cc1Swenshuai.xi 			HAL_CIPHER_Hash_ExceptFilter(&u32ExcTmp, eKeySrc, u8KeyIdx);
398*53ee8cc1Swenshuai.xi             u32ExcMsg  = HAL_CIPHER_ReadException(u32ExcTmp);
399*53ee8cc1Swenshuai.xi 
400*53ee8cc1Swenshuai.xi             u32RptId   = u32Rpt & REG_CIPHER_RPT_THREAD_MSK;
401*53ee8cc1Swenshuai.xi 
402*53ee8cc1Swenshuai.xi             bSuccess = FALSE;
403*53ee8cc1Swenshuai.xi 
404*53ee8cc1Swenshuai.xi             if(u32Rpt & DRV_CIPHER_REPORT_OK)
405*53ee8cc1Swenshuai.xi             {
406*53ee8cc1Swenshuai.xi                 bSuccess = TRUE;
407*53ee8cc1Swenshuai.xi             }
408*53ee8cc1Swenshuai.xi 
409*53ee8cc1Swenshuai.xi             if(u32ExcMsg != 0)
410*53ee8cc1Swenshuai.xi             {
411*53ee8cc1Swenshuai.xi                 HAL_CIPHER_ResetException();
412*53ee8cc1Swenshuai.xi             }
413*53ee8cc1Swenshuai.xi 
414*53ee8cc1Swenshuai.xi             _CIPHER_ReportBuffer[u8BufNum].u32Report          = 0;
415*53ee8cc1Swenshuai.xi             _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes       = 0;
416*53ee8cc1Swenshuai.xi             _CIPHER_ReportBuffer[u8BufNum].u32ExcMsg          = 0;
417*53ee8cc1Swenshuai.xi             _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf      = NULL;
418*53ee8cc1Swenshuai.xi             _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size = 0;
419*53ee8cc1Swenshuai.xi             _CIPHER_ReportBuffer[u8BufNum].pfCallback         = NULL;
420*53ee8cc1Swenshuai.xi             _CIPHER_ReportBuffer[u8BufNum].eKeySrc            = 0;
421*53ee8cc1Swenshuai.xi             _CIPHER_ReportBuffer[u8BufNum].u8KeyIdx           = 0;
422*53ee8cc1Swenshuai.xi             _CIPHER_ReportBuffer[u8BufNum].bUsed              = FALSE;
423*53ee8cc1Swenshuai.xi 
424*53ee8cc1Swenshuai.xi             MsOS_ReleaseSemaphore(_CipherSemaphore);
425*53ee8cc1Swenshuai.xi             if(pfCallBack != NULL)
426*53ee8cc1Swenshuai.xi             {
427*53ee8cc1Swenshuai.xi                 pfCallBack(u32RptId, bSuccess, u32ExcMsg);
428*53ee8cc1Swenshuai.xi 
429*53ee8cc1Swenshuai.xi             }
430*53ee8cc1Swenshuai.xi         }
431*53ee8cc1Swenshuai.xi 
432*53ee8cc1Swenshuai.xi         if (HAS_FLAG(u32Events, DRV_CIPHER_CLOSE))
433*53ee8cc1Swenshuai.xi         {
434*53ee8cc1Swenshuai.xi             break;
435*53ee8cc1Swenshuai.xi         }
436*53ee8cc1Swenshuai.xi 
437*53ee8cc1Swenshuai.xi     } // Task while loop
438*53ee8cc1Swenshuai.xi }
439*53ee8cc1Swenshuai.xi 
440*53ee8cc1Swenshuai.xi #endif
441*53ee8cc1Swenshuai.xi 
_MDrv_CIPHER_IsDMADone(MS_U32 u32CmdId,MS_U32 * pu32Exception)442*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_CIPHER_IsDMADone(MS_U32 u32CmdId, MS_U32 *pu32Exception)
443*53ee8cc1Swenshuai.xi {
444*53ee8cc1Swenshuai.xi     MS_U32  u32Ret     = DRV_CIPHER_OK;
445*53ee8cc1Swenshuai.xi     MS_U32  u32Rpt[2]  = {0};
446*53ee8cc1Swenshuai.xi     MS_U8   u8BufNum   = 0;
447*53ee8cc1Swenshuai.xi     MS_BOOL bDone      = FALSE;
448*53ee8cc1Swenshuai.xi 
449*53ee8cc1Swenshuai.xi     DRV_CIPHER_INIT_CHECK(FALSE);
450*53ee8cc1Swenshuai.xi 
451*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
452*53ee8cc1Swenshuai.xi 
453*53ee8cc1Swenshuai.xi     u8BufNum = u32CmdId % (MS_U32)CIPHER_REPORT_BUFFER_MAX;
454*53ee8cc1Swenshuai.xi 
455*53ee8cc1Swenshuai.xi     //Check register report
456*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_DMA_CmdDone(u32CmdId, &u32Ret))
457*53ee8cc1Swenshuai.xi     {
458*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:DMA cmd[%u] NOT done!", u32CmdId);
459*53ee8cc1Swenshuai.xi         bDone = FALSE;
460*53ee8cc1Swenshuai.xi         goto ISDMADONE_FINISH;
461*53ee8cc1Swenshuai.xi     }
462*53ee8cc1Swenshuai.xi 
463*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_GetRpt(u32Rpt);
464*53ee8cc1Swenshuai.xi 
465*53ee8cc1Swenshuai.xi     if((u32Rpt[0] & DRV_CIPHER_REPORT_OK) == 0)
466*53ee8cc1Swenshuai.xi     {
467*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA fail[%u]!", u32CmdId);
468*53ee8cc1Swenshuai.xi 
469*53ee8cc1Swenshuai.xi 		if(u32Ret != 0)
470*53ee8cc1Swenshuai.xi     	{
471*53ee8cc1Swenshuai.xi         	*pu32Exception = HAL_CIPHER_ReadException(u32Ret);
472*53ee8cc1Swenshuai.xi         	HAL_CIPHER_ResetException();
473*53ee8cc1Swenshuai.xi     	}
474*53ee8cc1Swenshuai.xi     }
475*53ee8cc1Swenshuai.xi 
476*53ee8cc1Swenshuai.xi     bDone = TRUE;
477*53ee8cc1Swenshuai.xi 
478*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Report          = 0;
479*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes       = 0;
480*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32ExcMsg          = 0;
481*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf      = NULL;
482*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size = 0;
483*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].bUsed              = FALSE;
484*53ee8cc1Swenshuai.xi 
485*53ee8cc1Swenshuai.xi ISDMADONE_FINISH:
486*53ee8cc1Swenshuai.xi 
487*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
488*53ee8cc1Swenshuai.xi 
489*53ee8cc1Swenshuai.xi     if(bDone)
490*53ee8cc1Swenshuai.xi     {
491*53ee8cc1Swenshuai.xi         MsOS_ReadMemory();
492*53ee8cc1Swenshuai.xi         MsOS_ReleaseSemaphore(_CipherSemaphore);
493*53ee8cc1Swenshuai.xi     }
494*53ee8cc1Swenshuai.xi 
495*53ee8cc1Swenshuai.xi     return bDone;
496*53ee8cc1Swenshuai.xi }
497*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_IsDMADone(MS_U32 u32CmdId,MS_U32 * pu32Exception)498*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_BOOL MDrv_CIPHER_IsDMADone(MS_U32 u32CmdId, MS_U32 *pu32Exception)
499*53ee8cc1Swenshuai.xi {
500*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
501*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
502*53ee8cc1Swenshuai.xi     CIPHER_ISDMADONE pArgs;
503*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(CIPHER_ISDMADONE));
504*53ee8cc1Swenshuai.xi 
505*53ee8cc1Swenshuai.xi     if(pu32CipherInst == NULL)
506*53ee8cc1Swenshuai.xi     {
507*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
508*53ee8cc1Swenshuai.xi     }
509*53ee8cc1Swenshuai.xi 
510*53ee8cc1Swenshuai.xi     pArgs.u32CmdId = u32CmdId;
511*53ee8cc1Swenshuai.xi     pArgs.pu32Exception = pu32Exception;
512*53ee8cc1Swenshuai.xi 
513*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_IsDMADone, (void*)&pArgs);
514*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
515*53ee8cc1Swenshuai.xi     {
516*53ee8cc1Swenshuai.xi         //DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
517*53ee8cc1Swenshuai.xi         return FALSE;
518*53ee8cc1Swenshuai.xi     }
519*53ee8cc1Swenshuai.xi 
520*53ee8cc1Swenshuai.xi     return TRUE;
521*53ee8cc1Swenshuai.xi #else
522*53ee8cc1Swenshuai.xi     return _MDrv_CIPHER_IsDMADone(u32CmdId, pu32Exception);
523*53ee8cc1Swenshuai.xi #endif
524*53ee8cc1Swenshuai.xi }
525*53ee8cc1Swenshuai.xi 
_MDrv_CIPHER_IsHASHDone(MS_U32 u32CmdId,MS_U32 * pu32Exception)526*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_CIPHER_IsHASHDone(MS_U32 u32CmdId, MS_U32 *pu32Exception)
527*53ee8cc1Swenshuai.xi {
528*53ee8cc1Swenshuai.xi     MS_U32  u32Ret         = DRV_CIPHER_OK;
529*53ee8cc1Swenshuai.xi     MS_U32  u32Rpt[10]     = {0};
530*53ee8cc1Swenshuai.xi     MS_U8   u8BufNum       = 0;
531*53ee8cc1Swenshuai.xi     MS_BOOL bDone          = FALSE;
532*53ee8cc1Swenshuai.xi 
533*53ee8cc1Swenshuai.xi     MS_U8*  pu8Digest_Buf = NULL;
534*53ee8cc1Swenshuai.xi     MS_U32  u32Digest_Buf_Size = 0;
535*53ee8cc1Swenshuai.xi     CIPHER_KEY_SRC  eKeySrc = 0;
536*53ee8cc1Swenshuai.xi     MS_U8   u8KeyIdx        = 0;
537*53ee8cc1Swenshuai.xi 
538*53ee8cc1Swenshuai.xi     DRV_CIPHER_INIT_CHECK(FALSE);
539*53ee8cc1Swenshuai.xi 
540*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
541*53ee8cc1Swenshuai.xi 
542*53ee8cc1Swenshuai.xi     u8BufNum = u32CmdId % (MS_U32)CIPHER_REPORT_BUFFER_MAX;
543*53ee8cc1Swenshuai.xi 
544*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_CmdDone(u32CmdId, &u32Ret))
545*53ee8cc1Swenshuai.xi     {
546*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:HASH cmd[%u] NOT done!", u32CmdId);
547*53ee8cc1Swenshuai.xi         bDone = FALSE;
548*53ee8cc1Swenshuai.xi         goto ISHASHDONE_FINISH;
549*53ee8cc1Swenshuai.xi     }
550*53ee8cc1Swenshuai.xi 
551*53ee8cc1Swenshuai.xi     //Get all register report, include status and digest
552*53ee8cc1Swenshuai.xi     HAL_CIPHER_Hash_GetRpt(u32Rpt, HASH_RPT_SIZE_ALL);
553*53ee8cc1Swenshuai.xi 
554*53ee8cc1Swenshuai.xi     pu8Digest_Buf      = _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf;
555*53ee8cc1Swenshuai.xi     u32Digest_Buf_Size = _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size;
556*53ee8cc1Swenshuai.xi     eKeySrc            = _CIPHER_ReportBuffer[u8BufNum].eKeySrc;
557*53ee8cc1Swenshuai.xi     u8KeyIdx           = _CIPHER_ReportBuffer[u8BufNum].u8KeyIdx;
558*53ee8cc1Swenshuai.xi 
559*53ee8cc1Swenshuai.xi     //Avoid status report, only copy digest to output address
560*53ee8cc1Swenshuai.xi     if((pu8Digest_Buf != NULL) && (u32Digest_Buf_Size > 0))
561*53ee8cc1Swenshuai.xi     {
562*53ee8cc1Swenshuai.xi         memcpy((MS_U8 *)pu8Digest_Buf, u32Rpt+HASH_RPT_SIZE_STATUS, u32Digest_Buf_Size);
563*53ee8cc1Swenshuai.xi     }
564*53ee8cc1Swenshuai.xi 
565*53ee8cc1Swenshuai.xi     //Reset exception flag for polling mode
566*53ee8cc1Swenshuai.xi     if(u32Ret != 0)
567*53ee8cc1Swenshuai.xi     {
568*53ee8cc1Swenshuai.xi         HAL_CIPHER_Hash_ExceptFilter(&u32Ret, eKeySrc, u8KeyIdx);
569*53ee8cc1Swenshuai.xi         *pu32Exception = HAL_CIPHER_ReadException(u32Ret);
570*53ee8cc1Swenshuai.xi         HAL_CIPHER_ResetException();
571*53ee8cc1Swenshuai.xi     }
572*53ee8cc1Swenshuai.xi 
573*53ee8cc1Swenshuai.xi     if((u32Rpt[0] & DRV_CIPHER_REPORT_OK) == 0)
574*53ee8cc1Swenshuai.xi     {
575*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH fail[%u]!", u32CmdId);
576*53ee8cc1Swenshuai.xi     }
577*53ee8cc1Swenshuai.xi 
578*53ee8cc1Swenshuai.xi     bDone = TRUE;
579*53ee8cc1Swenshuai.xi 
580*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Report          = 0;
581*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes       = 0;
582*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32ExcMsg          = 0;
583*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf      = NULL;
584*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size = 0;
585*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].eKeySrc            = 0;
586*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u8KeyIdx           = 0;
587*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].bUsed              = FALSE;
588*53ee8cc1Swenshuai.xi 
589*53ee8cc1Swenshuai.xi ISHASHDONE_FINISH:
590*53ee8cc1Swenshuai.xi 
591*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
592*53ee8cc1Swenshuai.xi 
593*53ee8cc1Swenshuai.xi     if(bDone)
594*53ee8cc1Swenshuai.xi     {
595*53ee8cc1Swenshuai.xi         MsOS_FlushMemory();
596*53ee8cc1Swenshuai.xi         MsOS_ReleaseSemaphore(_CipherSemaphore);
597*53ee8cc1Swenshuai.xi     }
598*53ee8cc1Swenshuai.xi 
599*53ee8cc1Swenshuai.xi     return bDone;
600*53ee8cc1Swenshuai.xi }
601*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_IsHASHDone(MS_U32 u32CmdId,MS_U32 * pu32Exception)602*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_BOOL MDrv_CIPHER_IsHASHDone(MS_U32 u32CmdId, MS_U32 *pu32Exception)
603*53ee8cc1Swenshuai.xi {
604*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
605*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
606*53ee8cc1Swenshuai.xi     CIPHER_ISHASHDONE pArgs;
607*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(CIPHER_ISHASHDONE));
608*53ee8cc1Swenshuai.xi 
609*53ee8cc1Swenshuai.xi     if(pu32CipherInst == NULL)
610*53ee8cc1Swenshuai.xi     {
611*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
612*53ee8cc1Swenshuai.xi     }
613*53ee8cc1Swenshuai.xi 
614*53ee8cc1Swenshuai.xi     pArgs.u32CmdId = u32CmdId;
615*53ee8cc1Swenshuai.xi     pArgs.pu32Exception = pu32Exception;
616*53ee8cc1Swenshuai.xi 
617*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_IsHASHDone, (void*)&pArgs);
618*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
619*53ee8cc1Swenshuai.xi     {
620*53ee8cc1Swenshuai.xi         //DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
621*53ee8cc1Swenshuai.xi         return FALSE;
622*53ee8cc1Swenshuai.xi     }
623*53ee8cc1Swenshuai.xi 
624*53ee8cc1Swenshuai.xi     return TRUE;
625*53ee8cc1Swenshuai.xi #else
626*53ee8cc1Swenshuai.xi     return _MDrv_CIPHER_IsHASHDone(u32CmdId, pu32Exception);
627*53ee8cc1Swenshuai.xi #endif
628*53ee8cc1Swenshuai.xi }
629*53ee8cc1Swenshuai.xi 
630*53ee8cc1Swenshuai.xi #if 0
631*53ee8cc1Swenshuai.xi static void _dump(MS_U8 *ptr, MS_U32 size)
632*53ee8cc1Swenshuai.xi {
633*53ee8cc1Swenshuai.xi     int i = 0;
634*53ee8cc1Swenshuai.xi     printf("[DUMP Start]\n");
635*53ee8cc1Swenshuai.xi     for(i = 0; i < size; i++)
636*53ee8cc1Swenshuai.xi     {
637*53ee8cc1Swenshuai.xi         printf("0x%02x ", *(ptr+i));
638*53ee8cc1Swenshuai.xi     }
639*53ee8cc1Swenshuai.xi     printf("[DUMP Finish]\n");
640*53ee8cc1Swenshuai.xi }
641*53ee8cc1Swenshuai.xi #endif
642*53ee8cc1Swenshuai.xi 
_AESDMA_MSBF2Native(MS_U8 u8Bytes[4])643*53ee8cc1Swenshuai.xi MS_U32 _AESDMA_MSBF2Native(MS_U8 u8Bytes[4])
644*53ee8cc1Swenshuai.xi {
645*53ee8cc1Swenshuai.xi     return (u8Bytes[0] << 24) | (u8Bytes[1] << 16) | (u8Bytes[2] << 8) | u8Bytes[3];
646*53ee8cc1Swenshuai.xi }
647*53ee8cc1Swenshuai.xi 
_ReverseU8Buf(MS_U8 * buf,MS_U32 len)648*53ee8cc1Swenshuai.xi void _ReverseU8Buf(MS_U8 *buf, MS_U32 len)
649*53ee8cc1Swenshuai.xi {
650*53ee8cc1Swenshuai.xi     MS_U8 i = 0;
651*53ee8cc1Swenshuai.xi     MS_U8 j = len-1;
652*53ee8cc1Swenshuai.xi     MS_U8 temp = 0;
653*53ee8cc1Swenshuai.xi 
654*53ee8cc1Swenshuai.xi     if((buf==NULL)||(len<=1)) return;
655*53ee8cc1Swenshuai.xi 
656*53ee8cc1Swenshuai.xi     while(i<j)
657*53ee8cc1Swenshuai.xi     {
658*53ee8cc1Swenshuai.xi          temp   = buf[i];
659*53ee8cc1Swenshuai.xi          buf[i] = buf[j];
660*53ee8cc1Swenshuai.xi          buf[j] = temp;
661*53ee8cc1Swenshuai.xi          i++;
662*53ee8cc1Swenshuai.xi          j--;
663*53ee8cc1Swenshuai.xi      }
664*53ee8cc1Swenshuai.xi }
665*53ee8cc1Swenshuai.xi 
_CIPHER_TransDbgLevel(DrvAESDMA_DbgLevel eDbgLevel)666*53ee8cc1Swenshuai.xi CIPHER_DBGMSG_LEVEL _CIPHER_TransDbgLevel(DrvAESDMA_DbgLevel eDbgLevel)
667*53ee8cc1Swenshuai.xi {
668*53ee8cc1Swenshuai.xi     CIPHER_DBGMSG_LEVEL eCipherDbgLevel = CIPHER_DBG_NONE;
669*53ee8cc1Swenshuai.xi     switch(eDbgLevel)
670*53ee8cc1Swenshuai.xi     {
671*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_DBG_L1:
672*53ee8cc1Swenshuai.xi             eCipherDbgLevel = CIPHER_DBG_ERR;
673*53ee8cc1Swenshuai.xi             break;
674*53ee8cc1Swenshuai.xi 
675*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_DBG_L2:
676*53ee8cc1Swenshuai.xi             eCipherDbgLevel = CIPHER_DBG_INFO;
677*53ee8cc1Swenshuai.xi             break;
678*53ee8cc1Swenshuai.xi 
679*53ee8cc1Swenshuai.xi         default:
680*53ee8cc1Swenshuai.xi             eCipherDbgLevel = CIPHER_DBG_NONE;
681*53ee8cc1Swenshuai.xi             break;
682*53ee8cc1Swenshuai.xi     }
683*53ee8cc1Swenshuai.xi 
684*53ee8cc1Swenshuai.xi     return eCipherDbgLevel;
685*53ee8cc1Swenshuai.xi 
686*53ee8cc1Swenshuai.xi }
687*53ee8cc1Swenshuai.xi 
688*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
689*53ee8cc1Swenshuai.xi //  Global Function
690*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
_MDrv_CIPHER_InitBySWFlag(MS_BOOL bSWInit)691*53ee8cc1Swenshuai.xi DRV_CIPHER_RET _MDrv_CIPHER_InitBySWFlag(MS_BOOL bSWInit)
692*53ee8cc1Swenshuai.xi {
693*53ee8cc1Swenshuai.xi     MS_VIRT u32Bank;
694*53ee8cc1Swenshuai.xi     MS_PHY  u32BankSize;
695*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
696*53ee8cc1Swenshuai.xi 
697*53ee8cc1Swenshuai.xi     if(_bCIPHERDrv_Inited == TRUE)
698*53ee8cc1Swenshuai.xi     {
699*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:Double Init!");
700*53ee8cc1Swenshuai.xi         return DRV_CIPHER_OK;
701*53ee8cc1Swenshuai.xi     }
702*53ee8cc1Swenshuai.xi 
703*53ee8cc1Swenshuai.xi     if (FALSE == MDrv_MMIO_GetBASE(&u32Bank, &u32BankSize, MS_MODULE_HW))
704*53ee8cc1Swenshuai.xi     {
705*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Get MMIO base fail");
706*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
707*53ee8cc1Swenshuai.xi     }
708*53ee8cc1Swenshuai.xi 
709*53ee8cc1Swenshuai.xi     HAL_CIPHER_SetBank(u32Bank);
710*53ee8cc1Swenshuai.xi     HAL_CIPHER_ResetStatus(TRUE, TRUE);
711*53ee8cc1Swenshuai.xi 
712*53ee8cc1Swenshuai.xi     if(FALSE == bSWInit)
713*53ee8cc1Swenshuai.xi     {
714*53ee8cc1Swenshuai.xi         HAL_CIPHER_SWReset();
715*53ee8cc1Swenshuai.xi 
716*53ee8cc1Swenshuai.xi         _u16ThreadID   = 1;
717*53ee8cc1Swenshuai.xi         _u32CallbackID = 1;
718*53ee8cc1Swenshuai.xi     }
719*53ee8cc1Swenshuai.xi 
720*53ee8cc1Swenshuai.xi     for(i=0;i<CIPHER_REPORT_BUFFER_MAX;i++)
721*53ee8cc1Swenshuai.xi     {
722*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].u32Report          = 0;
723*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].u32DoneBytes       = 0;
724*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].u32ExcMsg          = 0;
725*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].pu8Digest_Buf      = NULL;
726*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].u32Digest_Buf_Size = 0;
727*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].eKeySrc     = 0;
728*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].u8KeyIdx    = 0;
729*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].bUsed              = FALSE;
730*53ee8cc1Swenshuai.xi     }
731*53ee8cc1Swenshuai.xi 
732*53ee8cc1Swenshuai.xi     _CipherMtx = MsOS_CreateMutex(E_MSOS_FIFO, (char*)"CIPHER Mutex", MSOS_PROCESS_SHARED);
733*53ee8cc1Swenshuai.xi 	_AESDMAMtx = MsOS_CreateMutex(E_MSOS_FIFO, (char*)"AESDMA Mutex", MSOS_PROCESS_SHARED);
734*53ee8cc1Swenshuai.xi     _CipherSemaphore = MsOS_CreateSemaphore(1, E_MSOS_FIFO, (char *)"CIPHER Semaphore");
735*53ee8cc1Swenshuai.xi 
736*53ee8cc1Swenshuai.xi 	_bCIPHERDrv_Inited = TRUE;
737*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
738*53ee8cc1Swenshuai.xi 
739*53ee8cc1Swenshuai.xi     //Isr event
740*53ee8cc1Swenshuai.xi     _s32CIPHEREventId = MsOS_CreateEventGroup("CIPHER_Event");
741*53ee8cc1Swenshuai.xi     if (_s32CIPHEREventId < 0)
742*53ee8cc1Swenshuai.xi     {
743*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "_s32CIPHEREventId < 0 ");
744*53ee8cc1Swenshuai.xi         _u32LastErr = DRV_CIPHER_FAIL;
745*53ee8cc1Swenshuai.xi         return _u32LastErr;
746*53ee8cc1Swenshuai.xi     }
747*53ee8cc1Swenshuai.xi 
748*53ee8cc1Swenshuai.xi     //Task stack
749*53ee8cc1Swenshuai.xi     _pCIPHERTaskStack = _u8CIPHER_StackBuffer;
750*53ee8cc1Swenshuai.xi 
751*53ee8cc1Swenshuai.xi     //Isr Task
752*53ee8cc1Swenshuai.xi     _s32CIPHERTaskId = MsOS_CreateTask((TaskEntry)_CIPHER_Isr_Proc,
753*53ee8cc1Swenshuai.xi                                         0,
754*53ee8cc1Swenshuai.xi                                         E_TASK_PRI_SYS,
755*53ee8cc1Swenshuai.xi                                         TRUE,
756*53ee8cc1Swenshuai.xi                                         _pCIPHERTaskStack,
757*53ee8cc1Swenshuai.xi                                         CIPHER_TASK_STACK_SIZE,
758*53ee8cc1Swenshuai.xi                                         "CIPHER_Task");
759*53ee8cc1Swenshuai.xi 
760*53ee8cc1Swenshuai.xi     if (_s32CIPHERTaskId < 0)
761*53ee8cc1Swenshuai.xi     {
762*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "_s32CIPHERTaskId < 0 ");
763*53ee8cc1Swenshuai.xi         MsOS_DeleteEventGroup(_s32CIPHEREventId);
764*53ee8cc1Swenshuai.xi         _u32LastErr = DRV_CIPHER_FAIL;
765*53ee8cc1Swenshuai.xi         return _u32LastErr;
766*53ee8cc1Swenshuai.xi     }
767*53ee8cc1Swenshuai.xi 
768*53ee8cc1Swenshuai.xi     HAL_CIPHER_IntEnable();
769*53ee8cc1Swenshuai.xi 
770*53ee8cc1Swenshuai.xi     CIPHERIntDisable();
771*53ee8cc1Swenshuai.xi     CIPHERIntDetach();
772*53ee8cc1Swenshuai.xi     CIPHERIntAttach();
773*53ee8cc1Swenshuai.xi     CIPHERIntEnable();
774*53ee8cc1Swenshuai.xi 
775*53ee8cc1Swenshuai.xi #endif
776*53ee8cc1Swenshuai.xi 
777*53ee8cc1Swenshuai.xi     return DRV_CIPHER_OK;
778*53ee8cc1Swenshuai.xi }
779*53ee8cc1Swenshuai.xi 
_MDrv_CIPHER_Init(void)780*53ee8cc1Swenshuai.xi DRV_CIPHER_RET _MDrv_CIPHER_Init(void)
781*53ee8cc1Swenshuai.xi {
782*53ee8cc1Swenshuai.xi     return _MDrv_CIPHER_InitBySWFlag(FALSE);
783*53ee8cc1Swenshuai.xi }
784*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_Init(void)785*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_Init(void)
786*53ee8cc1Swenshuai.xi {
787*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
788*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
789*53ee8cc1Swenshuai.xi 
790*53ee8cc1Swenshuai.xi     if(pu32CipherInst == NULL)
791*53ee8cc1Swenshuai.xi     {
792*53ee8cc1Swenshuai.xi         if(UTOPIA_STATUS_FAIL == UtopiaOpen(MODULE_CIPHER, &pu32CipherInst, 0x0, NULL))
793*53ee8cc1Swenshuai.xi         {
794*53ee8cc1Swenshuai.xi             DEBUG_CIPHER(CIPHER_DBG_ERR, "UtopiaOpen CIPHER fail\n");
795*53ee8cc1Swenshuai.xi             return DRV_CIPHER_FAIL;
796*53ee8cc1Swenshuai.xi         }
797*53ee8cc1Swenshuai.xi     }
798*53ee8cc1Swenshuai.xi 
799*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_Init, NULL);
800*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
801*53ee8cc1Swenshuai.xi     {
802*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
803*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
804*53ee8cc1Swenshuai.xi     }
805*53ee8cc1Swenshuai.xi 
806*53ee8cc1Swenshuai.xi     return DRV_CIPHER_OK;
807*53ee8cc1Swenshuai.xi #else
808*53ee8cc1Swenshuai.xi     return _MDrv_CIPHER_Init();
809*53ee8cc1Swenshuai.xi #endif
810*53ee8cc1Swenshuai.xi }
811*53ee8cc1Swenshuai.xi 
_MDrv_CIPHER_Reset(void)812*53ee8cc1Swenshuai.xi DRV_CIPHER_RET _MDrv_CIPHER_Reset(void)
813*53ee8cc1Swenshuai.xi {
814*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
815*53ee8cc1Swenshuai.xi     DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
816*53ee8cc1Swenshuai.xi 
817*53ee8cc1Swenshuai.xi 	MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
818*53ee8cc1Swenshuai.xi 
819*53ee8cc1Swenshuai.xi     HAL_CIPHER_ResetStatus(TRUE, TRUE);
820*53ee8cc1Swenshuai.xi     HAL_CIPHER_SWReset();
821*53ee8cc1Swenshuai.xi     HAL_CIPHER_ResetException();
822*53ee8cc1Swenshuai.xi 
823*53ee8cc1Swenshuai.xi     _u16ThreadID   = 1;
824*53ee8cc1Swenshuai.xi     _u32CallbackID = 1;
825*53ee8cc1Swenshuai.xi 
826*53ee8cc1Swenshuai.xi     for(i=0;i<CIPHER_REPORT_BUFFER_MAX;i++)
827*53ee8cc1Swenshuai.xi     {
828*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].u32Report          = 0;
829*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].u32DoneBytes       = 0;
830*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].u32ExcMsg          = 0;
831*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].pu8Digest_Buf      = NULL;
832*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].u32Digest_Buf_Size = 0;
833*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].pfCallback         = NULL;
834*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].eKeySrc            = 0;
835*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].u8KeyIdx           = 0;
836*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[i].bUsed              = FALSE;
837*53ee8cc1Swenshuai.xi     }
838*53ee8cc1Swenshuai.xi 
839*53ee8cc1Swenshuai.xi     if(TRUE == _bCIPHERDrv_KeyCtrlEn)
840*53ee8cc1Swenshuai.xi     {
841*53ee8cc1Swenshuai.xi         for(i = 0;i < HAL_CRYPTODMA_DMA_KEY_SLOT;i++)
842*53ee8cc1Swenshuai.xi         {
843*53ee8cc1Swenshuai.xi             memset(&_CIPHER_Resource[i], 0, sizeof(CIPHER_RESOURCE));
844*53ee8cc1Swenshuai.xi         }
845*53ee8cc1Swenshuai.xi 
846*53ee8cc1Swenshuai.xi         DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "INFO:Reset Key Ctrl!\n");
847*53ee8cc1Swenshuai.xi     }
848*53ee8cc1Swenshuai.xi 
849*53ee8cc1Swenshuai.xi 	DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Cipher Reset!\n");
850*53ee8cc1Swenshuai.xi 
851*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
852*53ee8cc1Swenshuai.xi 
853*53ee8cc1Swenshuai.xi     return DRV_CIPHER_OK;
854*53ee8cc1Swenshuai.xi }
855*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_Reset(void)856*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_Reset(void)
857*53ee8cc1Swenshuai.xi {
858*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
859*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
860*53ee8cc1Swenshuai.xi 
861*53ee8cc1Swenshuai.xi     if(pu32CipherInst == NULL)
862*53ee8cc1Swenshuai.xi     {
863*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
864*53ee8cc1Swenshuai.xi     }
865*53ee8cc1Swenshuai.xi 
866*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_Reset, NULL);
867*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
868*53ee8cc1Swenshuai.xi     {
869*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
870*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
871*53ee8cc1Swenshuai.xi     }
872*53ee8cc1Swenshuai.xi 
873*53ee8cc1Swenshuai.xi     return DRV_CIPHER_OK;
874*53ee8cc1Swenshuai.xi #else
875*53ee8cc1Swenshuai.xi     return _MDrv_CIPHER_Reset();
876*53ee8cc1Swenshuai.xi #endif
877*53ee8cc1Swenshuai.xi }
878*53ee8cc1Swenshuai.xi 
_MDrv_CIPHER_ResetKey(MS_U32 u32CAVid,MS_U32 u32KeyIdx)879*53ee8cc1Swenshuai.xi DRV_CIPHER_RET _MDrv_CIPHER_ResetKey(MS_U32 u32CAVid, MS_U32 u32KeyIdx)
880*53ee8cc1Swenshuai.xi {
881*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret = DRV_CIPHER_OK;
882*53ee8cc1Swenshuai.xi     DRV_CIPHER_ALGO algo = {0};
883*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = 0;
884*53ee8cc1Swenshuai.xi     MS_U32 u32WaitCnt = 0;
885*53ee8cc1Swenshuai.xi 
886*53ee8cc1Swenshuai.xi     DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
887*53ee8cc1Swenshuai.xi 
888*53ee8cc1Swenshuai.xi     MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
889*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
890*53ee8cc1Swenshuai.xi 
891*53ee8cc1Swenshuai.xi     HAL_CIPHER_ResetStatus(TRUE , FALSE );
892*53ee8cc1Swenshuai.xi 
893*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_DMA_Set_CaVid(u32CAVid))
894*53ee8cc1Swenshuai.xi     {
895*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
896*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!", (unsigned int)u32CAVid);
897*53ee8cc1Swenshuai.xi         goto RESETKEY_FINISH;
898*53ee8cc1Swenshuai.xi     }
899*53ee8cc1Swenshuai.xi 
900*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_Algo(algo);
901*53ee8cc1Swenshuai.xi 
902*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_ResetKey(u32KeyIdx))
903*53ee8cc1Swenshuai.xi     {
904*53ee8cc1Swenshuai.xi        ret =  DRV_CIPHER_BAD_PARAM;
905*53ee8cc1Swenshuai.xi        DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Reset Key Index fail!");
906*53ee8cc1Swenshuai.xi        goto RESETKEY_FINISH;
907*53ee8cc1Swenshuai.xi     }
908*53ee8cc1Swenshuai.xi 
909*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_InputSrcFrom(E_CIPHER_DIRECT, NULL, 0);
910*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_OutputDstTo(E_CIPHER_DIRECT, NULL, 0);
911*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_FileinDesc ( 0, HAL_CRYPTODMA_DIRDATA_MAX);
912*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_FileoutDesc( 0, (HAL_CRYPTODMA_DIRDATA_MAX - 1));
913*53ee8cc1Swenshuai.xi 
914*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_DMA_Start(FALSE, E_DMA_INT_NONE, TRUE, 0))
915*53ee8cc1Swenshuai.xi     {
916*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Reset Key fail!\n");
917*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_FAIL;
918*53ee8cc1Swenshuai.xi         goto RESETKEY_FINISH;
919*53ee8cc1Swenshuai.xi     }
920*53ee8cc1Swenshuai.xi 
921*53ee8cc1Swenshuai.xi     //Check register report
922*53ee8cc1Swenshuai.xi     while((FALSE == HAL_CIPHER_DMA_CmdDone(0, &u32Ret)) && (u32WaitCnt < HAL_CIPHER_RESETKEY_TIMEOUT_VALUE))
923*53ee8cc1Swenshuai.xi     {
924*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:Reset Key NOT done!");
925*53ee8cc1Swenshuai.xi         u32WaitCnt++;
926*53ee8cc1Swenshuai.xi     }
927*53ee8cc1Swenshuai.xi 
928*53ee8cc1Swenshuai.xi     if(u32WaitCnt >= HAL_CIPHER_RESETKEY_TIMEOUT_VALUE)
929*53ee8cc1Swenshuai.xi     {
930*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:Reset Key timeout!");
931*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_FAIL;
932*53ee8cc1Swenshuai.xi         goto RESETKEY_FINISH;
933*53ee8cc1Swenshuai.xi     }
934*53ee8cc1Swenshuai.xi 
935*53ee8cc1Swenshuai.xi     if(u32Ret != 0)
936*53ee8cc1Swenshuai.xi     {
937*53ee8cc1Swenshuai.xi         //Ignore exception here, HW still clear session key
938*53ee8cc1Swenshuai.xi         HAL_CIPHER_ResetException();
939*53ee8cc1Swenshuai.xi     }
940*53ee8cc1Swenshuai.xi 
941*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Cipher Reset Key success!\n");
942*53ee8cc1Swenshuai.xi 
943*53ee8cc1Swenshuai.xi RESETKEY_FINISH:
944*53ee8cc1Swenshuai.xi 
945*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
946*53ee8cc1Swenshuai.xi 
947*53ee8cc1Swenshuai.xi     MsOS_ReleaseSemaphore(_CipherSemaphore);
948*53ee8cc1Swenshuai.xi 
949*53ee8cc1Swenshuai.xi 
950*53ee8cc1Swenshuai.xi     return ret;
951*53ee8cc1Swenshuai.xi }
952*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_ResetKey(MS_U32 u32CAVid,MS_U32 u32KeyIdx)953*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_ResetKey(MS_U32 u32CAVid, MS_U32 u32KeyIdx)
954*53ee8cc1Swenshuai.xi {
955*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
956*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
957*53ee8cc1Swenshuai.xi     CIPHER_RESETKEY pArgs;
958*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(CIPHER_RESETKEY));
959*53ee8cc1Swenshuai.xi 
960*53ee8cc1Swenshuai.xi     if(pu32CipherInst == NULL)
961*53ee8cc1Swenshuai.xi     {
962*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
963*53ee8cc1Swenshuai.xi     }
964*53ee8cc1Swenshuai.xi 
965*53ee8cc1Swenshuai.xi     pArgs.u32CAVid = u32CAVid;
966*53ee8cc1Swenshuai.xi     pArgs.u32KeyIdx = u32KeyIdx;
967*53ee8cc1Swenshuai.xi     pArgs.ret = DRV_CIPHER_OK;
968*53ee8cc1Swenshuai.xi 
969*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_ResetKey, (void*)&pArgs);
970*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
971*53ee8cc1Swenshuai.xi     {
972*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
973*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
974*53ee8cc1Swenshuai.xi     }
975*53ee8cc1Swenshuai.xi 
976*53ee8cc1Swenshuai.xi     return pArgs.ret;
977*53ee8cc1Swenshuai.xi #else
978*53ee8cc1Swenshuai.xi     return _MDrv_CIPHER_ResetKey(u32CAVid, u32KeyIdx);
979*53ee8cc1Swenshuai.xi #endif
980*53ee8cc1Swenshuai.xi }
981*53ee8cc1Swenshuai.xi 
_MDrv_CIPHER_SetDbgLevel(CIPHER_DBGMSG_LEVEL eDBGMsgLevel)982*53ee8cc1Swenshuai.xi DRV_CIPHER_RET _MDrv_CIPHER_SetDbgLevel(CIPHER_DBGMSG_LEVEL eDBGMsgLevel)
983*53ee8cc1Swenshuai.xi {
984*53ee8cc1Swenshuai.xi     _CIPHERDBGLevel = eDBGMsgLevel;
985*53ee8cc1Swenshuai.xi     HAL_CIPHER_SetDbgLevel(eDBGMsgLevel);
986*53ee8cc1Swenshuai.xi 
987*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Debug level[%d]!", eDBGMsgLevel);
988*53ee8cc1Swenshuai.xi 
989*53ee8cc1Swenshuai.xi     return DRV_CIPHER_OK;
990*53ee8cc1Swenshuai.xi }
991*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_SetDbgLevel(CIPHER_DBGMSG_LEVEL eDBGMsgLevel)992*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_SetDbgLevel(CIPHER_DBGMSG_LEVEL eDBGMsgLevel)
993*53ee8cc1Swenshuai.xi {
994*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
995*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
996*53ee8cc1Swenshuai.xi     CIPHER_DBGLEVEL pArgs;
997*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(CIPHER_DBGLEVEL));
998*53ee8cc1Swenshuai.xi 
999*53ee8cc1Swenshuai.xi     if(pu32CipherInst == NULL)
1000*53ee8cc1Swenshuai.xi     {
1001*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
1002*53ee8cc1Swenshuai.xi     }
1003*53ee8cc1Swenshuai.xi 
1004*53ee8cc1Swenshuai.xi     pArgs.eDBGMsgLevel = eDBGMsgLevel;
1005*53ee8cc1Swenshuai.xi 
1006*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_DbgLevel, (void*)&pArgs);
1007*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
1008*53ee8cc1Swenshuai.xi     {
1009*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
1010*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
1011*53ee8cc1Swenshuai.xi     }
1012*53ee8cc1Swenshuai.xi 
1013*53ee8cc1Swenshuai.xi     return DRV_CIPHER_OK;
1014*53ee8cc1Swenshuai.xi #else
1015*53ee8cc1Swenshuai.xi     return _MDrv_CIPHER_SetDbgLevel(eDBGMsgLevel);
1016*53ee8cc1Swenshuai.xi #endif
1017*53ee8cc1Swenshuai.xi }
1018*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_GetLibVer(const MSIF_Version ** ppVersion)1019*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_GetLibVer(const MSIF_Version **ppVersion)
1020*53ee8cc1Swenshuai.xi {
1021*53ee8cc1Swenshuai.xi     if (!ppVersion)
1022*53ee8cc1Swenshuai.xi     {
1023*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
1024*53ee8cc1Swenshuai.xi     }
1025*53ee8cc1Swenshuai.xi 
1026*53ee8cc1Swenshuai.xi     *ppVersion = &_drv_cipher_version;
1027*53ee8cc1Swenshuai.xi 
1028*53ee8cc1Swenshuai.xi     return DRV_CIPHER_OK;
1029*53ee8cc1Swenshuai.xi }
1030*53ee8cc1Swenshuai.xi 
_MDrv_CIPHER_DMACalc(DRV_CIPHER_DMACFG stCfg,MS_U32 * pu32CmdId)1031*53ee8cc1Swenshuai.xi DRV_CIPHER_RET _MDrv_CIPHER_DMACalc(DRV_CIPHER_DMACFG stCfg, MS_U32 *pu32CmdId)
1032*53ee8cc1Swenshuai.xi {
1033*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret = DRV_CIPHER_OK;
1034*53ee8cc1Swenshuai.xi     HAL_CIPHER_INTMODE eIntMode = E_DMA_INT_NONE;
1035*53ee8cc1Swenshuai.xi     MS_U8 u8BufNum = 0;
1036*53ee8cc1Swenshuai.xi 
1037*53ee8cc1Swenshuai.xi 	DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
1038*53ee8cc1Swenshuai.xi 
1039*53ee8cc1Swenshuai.xi     if(TRUE == _bCIPHERDrv_KeyCtrlEn)
1040*53ee8cc1Swenshuai.xi     {
1041*53ee8cc1Swenshuai.xi         if(HAL_CRYPTODMA_DMA_KEY_SLOT <= stCfg.stKey.u8KeyIdx)
1042*53ee8cc1Swenshuai.xi         {
1043*53ee8cc1Swenshuai.xi             DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Invalid Key Index!");
1044*53ee8cc1Swenshuai.xi             return DRV_CIPHER_BAD_PARAM;
1045*53ee8cc1Swenshuai.xi         }
1046*53ee8cc1Swenshuai.xi 
1047*53ee8cc1Swenshuai.xi         if(E_CIPHER_KSRC_KL == stCfg.stKey.eKeySrc && FALSE == _CIPHER_Resource[stCfg.stKey.u8KeyIdx % HAL_CRYPTODMA_DMA_KEY_SLOT].bUsed)
1048*53ee8cc1Swenshuai.xi         {
1049*53ee8cc1Swenshuai.xi            DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Not used Cipher Id[%u]!", stCfg.stKey.u8KeyIdx);
1050*53ee8cc1Swenshuai.xi            return DRV_CIPHER_BAD_PARAM;
1051*53ee8cc1Swenshuai.xi         }
1052*53ee8cc1Swenshuai.xi     }
1053*53ee8cc1Swenshuai.xi 
1054*53ee8cc1Swenshuai.xi     //Check data size
1055*53ee8cc1Swenshuai.xi     if((stCfg.stInput.u32Size == 0) || (stCfg.stOutput.u32Size == 0))
1056*53ee8cc1Swenshuai.xi     {
1057*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA data size is zero!");
1058*53ee8cc1Swenshuai.xi         return DRV_CIPHER_BAD_PARAM;
1059*53ee8cc1Swenshuai.xi     }
1060*53ee8cc1Swenshuai.xi 
1061*53ee8cc1Swenshuai.xi     //Check Key length
1062*53ee8cc1Swenshuai.xi     if((stCfg.stKey.u8KeyLen > HAL_CRYPTODMA_KEYLEN_MAX) || (stCfg.stKey.u8IVLen > HAL_CRYPTODMA_KEYLEN_MAX))
1063*53ee8cc1Swenshuai.xi     {
1064*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Invalid Key length!\n");
1065*53ee8cc1Swenshuai.xi         return DRV_CIPHER_BAD_PARAM;
1066*53ee8cc1Swenshuai.xi     }
1067*53ee8cc1Swenshuai.xi 
1068*53ee8cc1Swenshuai.xi     if(pu32CmdId == NULL)
1069*53ee8cc1Swenshuai.xi     {
1070*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA CmdId is NULL!");
1071*53ee8cc1Swenshuai.xi         return DRV_CIPHER_BAD_PARAM;
1072*53ee8cc1Swenshuai.xi     }
1073*53ee8cc1Swenshuai.xi 
1074*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
1075*53ee8cc1Swenshuai.xi 
1076*53ee8cc1Swenshuai.xi     //==============Obtain Semaphore==============
1077*53ee8cc1Swenshuai.xi     MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
1078*53ee8cc1Swenshuai.xi 
1079*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
1080*53ee8cc1Swenshuai.xi 
1081*53ee8cc1Swenshuai.xi     HAL_CIPHER_ResetStatus(TRUE , FALSE ) ;
1082*53ee8cc1Swenshuai.xi 
1083*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set CAVid [0x%x]", (unsigned int)stCfg.u32CAVid);
1084*53ee8cc1Swenshuai.xi 
1085*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_DMA_Set_CaVid(stCfg.u32CAVid))
1086*53ee8cc1Swenshuai.xi     {
1087*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
1088*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!", (unsigned int)stCfg.u32CAVid);
1089*53ee8cc1Swenshuai.xi         goto DMA_FINISH;
1090*53ee8cc1Swenshuai.xi     }
1091*53ee8cc1Swenshuai.xi 
1092*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_Algo( stCfg.stAlgo);
1093*53ee8cc1Swenshuai.xi 
1094*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_DMA_Set_Key(stCfg.stKey))
1095*53ee8cc1Swenshuai.xi     {
1096*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
1097*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set Key fail!");
1098*53ee8cc1Swenshuai.xi         goto DMA_FINISH;
1099*53ee8cc1Swenshuai.xi     }
1100*53ee8cc1Swenshuai.xi 
1101*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_IV(stCfg.stKey.pu8IVData, stCfg.stKey.u8IVLen);
1102*53ee8cc1Swenshuai.xi 
1103*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set algorithm: MAIN[%d], SUB[%d], RES[%d], SB[%d]",
1104*53ee8cc1Swenshuai.xi         stCfg.stAlgo.eMainAlgo, stCfg.stAlgo.eSubAlgo, stCfg.stAlgo.eResAlgo, stCfg.stAlgo.eSBAlgo);
1105*53ee8cc1Swenshuai.xi 
1106*53ee8cc1Swenshuai.xi 	// need to call DMA_Set_InputSrcFrom and DMA_Set_OutputDstTo
1107*53ee8cc1Swenshuai.xi 	// before call  DMA_Set_FileinDesc and DMA_Set_FileoutDesc
1108*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_InputSrcFrom(stCfg.stInput.eMemoryType, NULL, 0);
1109*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_DMA_Set_OutputDstTo(stCfg.stOutput.eMemoryType, NULL, 0))
1110*53ee8cc1Swenshuai.xi     {
1111*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
1112*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set Output destination fail!");
1113*53ee8cc1Swenshuai.xi         goto DMA_FINISH;
1114*53ee8cc1Swenshuai.xi     }
1115*53ee8cc1Swenshuai.xi 
1116*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Input source from [%d], Output destination to [%d]",
1117*53ee8cc1Swenshuai.xi         stCfg.stInput.eMemoryType, stCfg.stOutput.eMemoryType);
1118*53ee8cc1Swenshuai.xi 
1119*53ee8cc1Swenshuai.xi     // Set File-in Addr //
1120*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_FileinDesc ( stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
1121*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_FileoutDesc( stCfg.stOutput.u32Addr, stCfg.stOutput.u32Addr + stCfg.stOutput.u32Size - 1);
1122*53ee8cc1Swenshuai.xi 
1123*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Input address [0x%08x], size[%u], Output address [0x%08x], size[%u]",
1124*53ee8cc1Swenshuai.xi         (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size, (unsigned int)stCfg.stOutput.u32Addr, stCfg.stOutput.u32Size);
1125*53ee8cc1Swenshuai.xi 
1126*53ee8cc1Swenshuai.xi     //Check report buffer
1127*53ee8cc1Swenshuai.xi     u8BufNum = (MS_U8)(_u16ThreadID % (MS_U16)CIPHER_REPORT_BUFFER_MAX);
1128*53ee8cc1Swenshuai.xi 
1129*53ee8cc1Swenshuai.xi     //Report buffer already used
1130*53ee8cc1Swenshuai.xi     if(_CIPHER_ReportBuffer[u8BufNum].bUsed == TRUE)
1131*53ee8cc1Swenshuai.xi     {
1132*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:CIPHER report buffer is used!");
1133*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_NO_REPORT_BUFFER;
1134*53ee8cc1Swenshuai.xi         goto DMA_FINISH;
1135*53ee8cc1Swenshuai.xi     }
1136*53ee8cc1Swenshuai.xi 
1137*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Report    = 0;
1138*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
1139*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].bUsed        = TRUE;
1140*53ee8cc1Swenshuai.xi 
1141*53ee8cc1Swenshuai.xi 
1142*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
1143*53ee8cc1Swenshuai.xi 
1144*53ee8cc1Swenshuai.xi     _eCipherWait = E_CIPHER_DMA_DONE;
1145*53ee8cc1Swenshuai.xi 
1146*53ee8cc1Swenshuai.xi     if(stCfg.pfCallback != NULL)
1147*53ee8cc1Swenshuai.xi     {
1148*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[u8BufNum].pfCallback = stCfg.pfCallback;
1149*53ee8cc1Swenshuai.xi         eIntMode = E_DMA_INT_ENABLE;
1150*53ee8cc1Swenshuai.xi     }
1151*53ee8cc1Swenshuai.xi #endif
1152*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:DMA decrypt operation[%d]", stCfg.bDecrypt);
1153*53ee8cc1Swenshuai.xi 
1154*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_DMA_Start(stCfg.bDecrypt, eIntMode , TRUE , _u16ThreadID))
1155*53ee8cc1Swenshuai.xi     {
1156*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA Fail!\n");
1157*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_FAIL;
1158*53ee8cc1Swenshuai.xi         goto DMA_FINISH;
1159*53ee8cc1Swenshuai.xi     }
1160*53ee8cc1Swenshuai.xi 
1161*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IntMode[%d], CmdId[%hu]", eIntMode, _u16ThreadID);
1162*53ee8cc1Swenshuai.xi 
1163*53ee8cc1Swenshuai.xi     *pu32CmdId = (MS_U32)_u16ThreadID;
1164*53ee8cc1Swenshuai.xi 
1165*53ee8cc1Swenshuai.xi     //Check thread id max
1166*53ee8cc1Swenshuai.xi     if(_u16ThreadID == HAL_CRYPTODMA_THREAD_ID_MAX)
1167*53ee8cc1Swenshuai.xi     {
1168*53ee8cc1Swenshuai.xi         _u16ThreadID = 1;
1169*53ee8cc1Swenshuai.xi     }
1170*53ee8cc1Swenshuai.xi     else
1171*53ee8cc1Swenshuai.xi     {
1172*53ee8cc1Swenshuai.xi         _u16ThreadID++;
1173*53ee8cc1Swenshuai.xi     }
1174*53ee8cc1Swenshuai.xi 
1175*53ee8cc1Swenshuai.xi DMA_FINISH:
1176*53ee8cc1Swenshuai.xi 
1177*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
1178*53ee8cc1Swenshuai.xi 
1179*53ee8cc1Swenshuai.xi     if(ret != DRV_CIPHER_OK)
1180*53ee8cc1Swenshuai.xi     {
1181*53ee8cc1Swenshuai.xi         MsOS_ReleaseSemaphore(_CipherSemaphore);
1182*53ee8cc1Swenshuai.xi     }
1183*53ee8cc1Swenshuai.xi 
1184*53ee8cc1Swenshuai.xi     return ret;
1185*53ee8cc1Swenshuai.xi }
1186*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_DMACalc(DRV_CIPHER_DMACFG stCfg,MS_U32 * pu32CmdId)1187*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_DMACalc(DRV_CIPHER_DMACFG stCfg, MS_U32 *pu32CmdId)
1188*53ee8cc1Swenshuai.xi {
1189*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
1190*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
1191*53ee8cc1Swenshuai.xi     CIPHER_DMACALC pArgs;
1192*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(CIPHER_DMACALC));
1193*53ee8cc1Swenshuai.xi 
1194*53ee8cc1Swenshuai.xi     if(pu32CipherInst == NULL)
1195*53ee8cc1Swenshuai.xi     {
1196*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
1197*53ee8cc1Swenshuai.xi     }
1198*53ee8cc1Swenshuai.xi 
1199*53ee8cc1Swenshuai.xi     memcpy(&pArgs.stCfg, &stCfg, sizeof(DRV_CIPHER_DMACFG));
1200*53ee8cc1Swenshuai.xi     pArgs.pu32CmdId = pu32CmdId;
1201*53ee8cc1Swenshuai.xi     pArgs.ret = DRV_CIPHER_OK;
1202*53ee8cc1Swenshuai.xi 
1203*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_DMACalc, (void*)&pArgs);
1204*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
1205*53ee8cc1Swenshuai.xi     {
1206*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
1207*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
1208*53ee8cc1Swenshuai.xi     }
1209*53ee8cc1Swenshuai.xi 
1210*53ee8cc1Swenshuai.xi     return pArgs.ret;
1211*53ee8cc1Swenshuai.xi #else
1212*53ee8cc1Swenshuai.xi     return _MDrv_CIPHER_DMACalc(stCfg, pu32CmdId);
1213*53ee8cc1Swenshuai.xi #endif
1214*53ee8cc1Swenshuai.xi }
1215*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_OTPHASHCalc(DRV_CIPHER_DMACFG stCfg,MS_U32 * pu32CmdId)1216*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_OTPHASHCalc(DRV_CIPHER_DMACFG stCfg, MS_U32 *pu32CmdId)
1217*53ee8cc1Swenshuai.xi {
1218*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret = DRV_CIPHER_OK;
1219*53ee8cc1Swenshuai.xi     HAL_CIPHER_INTMODE eIntMode = E_DMA_INT_NONE;
1220*53ee8cc1Swenshuai.xi     MS_U8 u8BufNum = 0;
1221*53ee8cc1Swenshuai.xi     MS_U32 u32OTPHashRound = 0;
1222*53ee8cc1Swenshuai.xi     MS_U32 u32CurrentRound = 0;
1223*53ee8cc1Swenshuai.xi 
1224*53ee8cc1Swenshuai.xi 	DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
1225*53ee8cc1Swenshuai.xi 
1226*53ee8cc1Swenshuai.xi     // Check data size
1227*53ee8cc1Swenshuai.xi     if((stCfg.stInput.u32Size == 0) || (stCfg.stOutput.u32Size == 0))
1228*53ee8cc1Swenshuai.xi     {
1229*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA data size is zero!");
1230*53ee8cc1Swenshuai.xi         return DRV_CIPHER_BAD_PARAM;
1231*53ee8cc1Swenshuai.xi     }
1232*53ee8cc1Swenshuai.xi 
1233*53ee8cc1Swenshuai.xi     // Check CmdId
1234*53ee8cc1Swenshuai.xi     if(pu32CmdId == NULL)
1235*53ee8cc1Swenshuai.xi     {
1236*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA CmdId is NULL!");
1237*53ee8cc1Swenshuai.xi         return DRV_CIPHER_BAD_PARAM;
1238*53ee8cc1Swenshuai.xi     }
1239*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
1240*53ee8cc1Swenshuai.xi 
1241*53ee8cc1Swenshuai.xi     //==============Obtain Semaphore==============
1242*53ee8cc1Swenshuai.xi     MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
1243*53ee8cc1Swenshuai.xi 
1244*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
1245*53ee8cc1Swenshuai.xi 
1246*53ee8cc1Swenshuai.xi     HAL_CIPHER_ResetStatus(TRUE , FALSE ) ;
1247*53ee8cc1Swenshuai.xi 
1248*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set CAVid [0x%x]", (unsigned int)stCfg.u32CAVid);
1249*53ee8cc1Swenshuai.xi 
1250*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_DMA_Set_CaVid(stCfg.u32CAVid))
1251*53ee8cc1Swenshuai.xi     {
1252*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
1253*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!", (unsigned int)stCfg.u32CAVid);
1254*53ee8cc1Swenshuai.xi         goto DMA_FINISH;
1255*53ee8cc1Swenshuai.xi     }
1256*53ee8cc1Swenshuai.xi 
1257*53ee8cc1Swenshuai.xi     // Set Algorithm
1258*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_Algo( stCfg.stAlgo);
1259*53ee8cc1Swenshuai.xi 
1260*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set algorithm: MAIN[%d], SUB[%d], RES[%d], SB[%d]",
1261*53ee8cc1Swenshuai.xi         stCfg.stAlgo.eMainAlgo, stCfg.stAlgo.eSubAlgo, stCfg.stAlgo.eResAlgo, stCfg.stAlgo.eSBAlgo);
1262*53ee8cc1Swenshuai.xi 
1263*53ee8cc1Swenshuai.xi 	// need to call DMA_Set_InputSrcFrom and DMA_Set_OutputDstTo
1264*53ee8cc1Swenshuai.xi 	// before call  DMA_Set_FileinDesc and DMA_Set_FileoutDesc
1265*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_InputSrcFrom(stCfg.stInput.eMemoryType, NULL, 0);
1266*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_OutputDstTo(stCfg.stOutput.eMemoryType, NULL, 0);
1267*53ee8cc1Swenshuai.xi 
1268*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Input source from [%d], Output destination to [%d]",
1269*53ee8cc1Swenshuai.xi         stCfg.stInput.eMemoryType, stCfg.stOutput.eMemoryType);
1270*53ee8cc1Swenshuai.xi 
1271*53ee8cc1Swenshuai.xi     // Not suppoet OTPHash (size low than 32 bytes)
1272*53ee8cc1Swenshuai.xi     if(stCfg.stInput.u32Size < HAL_CRYPTODMA_OTPHASH_SIZE_MIN)
1273*53ee8cc1Swenshuai.xi     {
1274*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:OTPHASH input size error!");
1275*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:OTPHASH support input size should lagger than %lu bytes!", HAL_CRYPTODMA_OTPHASH_SIZE_MIN);
1276*53ee8cc1Swenshuai.xi         return DRV_CIPHER_BAD_PARAM;
1277*53ee8cc1Swenshuai.xi     }
1278*53ee8cc1Swenshuai.xi 
1279*53ee8cc1Swenshuai.xi     // Check OTPHash round
1280*53ee8cc1Swenshuai.xi     while(1)
1281*53ee8cc1Swenshuai.xi     {
1282*53ee8cc1Swenshuai.xi         if(stCfg.stInput.u32Size <= (u32OTPHashRound+1)*HAL_CRYPTODMA_OTPHASH_UNIT)
1283*53ee8cc1Swenshuai.xi         {
1284*53ee8cc1Swenshuai.xi             break;
1285*53ee8cc1Swenshuai.xi         }
1286*53ee8cc1Swenshuai.xi         else
1287*53ee8cc1Swenshuai.xi         {
1288*53ee8cc1Swenshuai.xi             u32OTPHashRound++;
1289*53ee8cc1Swenshuai.xi         }
1290*53ee8cc1Swenshuai.xi     }
1291*53ee8cc1Swenshuai.xi 
1292*53ee8cc1Swenshuai.xi     // Set File-out Addr //
1293*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_FileoutDesc( stCfg.stOutput.u32Addr, stCfg.stOutput.u32Addr + stCfg.stOutput.u32Size - 1);
1294*53ee8cc1Swenshuai.xi 
1295*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Output address [0x%08x], size[%u]",
1296*53ee8cc1Swenshuai.xi         (unsigned int)stCfg.stOutput.u32Addr, stCfg.stOutput.u32Size);
1297*53ee8cc1Swenshuai.xi 
1298*53ee8cc1Swenshuai.xi     //Check report buffer
1299*53ee8cc1Swenshuai.xi     u8BufNum = (MS_U8)(_u16ThreadID % (MS_U16)CIPHER_REPORT_BUFFER_MAX);
1300*53ee8cc1Swenshuai.xi 
1301*53ee8cc1Swenshuai.xi     //Report buffer already used
1302*53ee8cc1Swenshuai.xi     if(_CIPHER_ReportBuffer[u8BufNum].bUsed == TRUE)
1303*53ee8cc1Swenshuai.xi     {
1304*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:CIPHER report buffer is used!");
1305*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_NO_REPORT_BUFFER;
1306*53ee8cc1Swenshuai.xi         goto DMA_FINISH;
1307*53ee8cc1Swenshuai.xi     }
1308*53ee8cc1Swenshuai.xi 
1309*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Report    = 0;
1310*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
1311*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].bUsed        = TRUE;
1312*53ee8cc1Swenshuai.xi 
1313*53ee8cc1Swenshuai.xi 
1314*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
1315*53ee8cc1Swenshuai.xi 
1316*53ee8cc1Swenshuai.xi     _eCipherWait = E_CIPHER_DMA_DONE;
1317*53ee8cc1Swenshuai.xi 
1318*53ee8cc1Swenshuai.xi     if(stCfg.pfCallback != NULL)
1319*53ee8cc1Swenshuai.xi     {
1320*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[u8BufNum].pfCallback = stCfg.pfCallback;
1321*53ee8cc1Swenshuai.xi         eIntMode = E_DMA_INT_ENABLE;
1322*53ee8cc1Swenshuai.xi     }
1323*53ee8cc1Swenshuai.xi #endif
1324*53ee8cc1Swenshuai.xi 
1325*53ee8cc1Swenshuai.xi     // Start OTPHash
1326*53ee8cc1Swenshuai.xi     for(u32CurrentRound=0; u32CurrentRound<=u32OTPHashRound; u32CurrentRound++)
1327*53ee8cc1Swenshuai.xi     {
1328*53ee8cc1Swenshuai.xi         // Set OTPHash configuration //
1329*53ee8cc1Swenshuai.xi         HAL_CIPHER_DMA_Set_OTPHash( u32CurrentRound, u32OTPHashRound);
1330*53ee8cc1Swenshuai.xi 
1331*53ee8cc1Swenshuai.xi         // Set OTPHash File-in Addr //
1332*53ee8cc1Swenshuai.xi         HAL_CIPHER_OTPHash_Set_FileinDesc( stCfg.stInput.u32Addr, stCfg.stInput.u32Size, u32CurrentRound, stCfg.stInput.eMemoryType);
1333*53ee8cc1Swenshuai.xi 
1334*53ee8cc1Swenshuai.xi         if(FALSE == HAL_CIPHER_OTPHash_Start(eIntMode , TRUE , _u16ThreadID))
1335*53ee8cc1Swenshuai.xi         {
1336*53ee8cc1Swenshuai.xi             DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA Fail!\n");
1337*53ee8cc1Swenshuai.xi             ret =  DRV_CIPHER_FAIL;
1338*53ee8cc1Swenshuai.xi             goto DMA_FINISH;
1339*53ee8cc1Swenshuai.xi         }
1340*53ee8cc1Swenshuai.xi 
1341*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IntMode[%d], CmdId[%hu]", eIntMode, _u16ThreadID);
1342*53ee8cc1Swenshuai.xi 
1343*53ee8cc1Swenshuai.xi         *pu32CmdId = (MS_U32)_u16ThreadID;
1344*53ee8cc1Swenshuai.xi 
1345*53ee8cc1Swenshuai.xi         //Check thread id max
1346*53ee8cc1Swenshuai.xi         if(_u16ThreadID == HAL_CRYPTODMA_THREAD_ID_MAX)
1347*53ee8cc1Swenshuai.xi         {
1348*53ee8cc1Swenshuai.xi             _u16ThreadID = 1;
1349*53ee8cc1Swenshuai.xi         }
1350*53ee8cc1Swenshuai.xi         else
1351*53ee8cc1Swenshuai.xi         {
1352*53ee8cc1Swenshuai.xi             _u16ThreadID++;
1353*53ee8cc1Swenshuai.xi         }
1354*53ee8cc1Swenshuai.xi     }
1355*53ee8cc1Swenshuai.xi 
1356*53ee8cc1Swenshuai.xi DMA_FINISH:
1357*53ee8cc1Swenshuai.xi 
1358*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
1359*53ee8cc1Swenshuai.xi 
1360*53ee8cc1Swenshuai.xi     if(ret != DRV_CIPHER_OK)
1361*53ee8cc1Swenshuai.xi     {
1362*53ee8cc1Swenshuai.xi         MsOS_ReleaseSemaphore(_CipherSemaphore);
1363*53ee8cc1Swenshuai.xi     }
1364*53ee8cc1Swenshuai.xi 
1365*53ee8cc1Swenshuai.xi     return ret;
1366*53ee8cc1Swenshuai.xi 
1367*53ee8cc1Swenshuai.xi }
1368*53ee8cc1Swenshuai.xi 
_MDrv_CIPHER_HASH(DRV_CIPHER_HASHCFG stCfg,MS_U32 * pu32CmdId)1369*53ee8cc1Swenshuai.xi DRV_CIPHER_RET _MDrv_CIPHER_HASH(DRV_CIPHER_HASHCFG stCfg, MS_U32 *pu32CmdId)
1370*53ee8cc1Swenshuai.xi {
1371*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret  = DRV_CIPHER_OK;
1372*53ee8cc1Swenshuai.xi     HAL_CIPHER_INTMODE eIntMode = E_DMA_INT_NONE;
1373*53ee8cc1Swenshuai.xi     MS_U32 u32OutLen    = 32;
1374*53ee8cc1Swenshuai.xi     MS_U32 u32HashSrc   = 0;
1375*53ee8cc1Swenshuai.xi     MS_U32 u32HashDst   = 0;
1376*53ee8cc1Swenshuai.xi     MS_U8  u8BufNum    = 0;
1377*53ee8cc1Swenshuai.xi 
1378*53ee8cc1Swenshuai.xi 	DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
1379*53ee8cc1Swenshuai.xi 
1380*53ee8cc1Swenshuai.xi     //==============Obtain Semaphore==============
1381*53ee8cc1Swenshuai.xi     MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
1382*53ee8cc1Swenshuai.xi 
1383*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
1384*53ee8cc1Swenshuai.xi 
1385*53ee8cc1Swenshuai.xi     //Check data size
1386*53ee8cc1Swenshuai.xi     if((stCfg.stInput.u32Size == 0) || (stCfg.u32Digest_Buf_Size == 0))
1387*53ee8cc1Swenshuai.xi     {
1388*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1389*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH data size is zero!");
1390*53ee8cc1Swenshuai.xi         goto HASHAUTO_FINISH;
1391*53ee8cc1Swenshuai.xi     }
1392*53ee8cc1Swenshuai.xi 
1393*53ee8cc1Swenshuai.xi     if(pu32CmdId == NULL)
1394*53ee8cc1Swenshuai.xi     {
1395*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH CmdId is NULL!");
1396*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
1397*53ee8cc1Swenshuai.xi         goto HASHAUTO_FINISH;
1398*53ee8cc1Swenshuai.xi     }
1399*53ee8cc1Swenshuai.xi 
1400*53ee8cc1Swenshuai.xi     if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA1)          u32OutLen = HASH_SHA1_DIGEST_SIZE;    //160 bits
1401*53ee8cc1Swenshuai.xi     else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA256)   u32OutLen = HASH_SHA256_DIGEST_SIZE;    //256 bits
1402*53ee8cc1Swenshuai.xi     else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_MD5)      u32OutLen = HASH_MD5_DIGEST_SIZE;    //128 bits
1403*53ee8cc1Swenshuai.xi     else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SM3)      u32OutLen = HASH_SM3_DIGEST_SIZE;    //256 bits
1404*53ee8cc1Swenshuai.xi     else u32OutLen = HASH_SHA256_DIGEST_SIZE;
1405*53ee8cc1Swenshuai.xi 
1406*53ee8cc1Swenshuai.xi     if(stCfg.u32Digest_Buf_Size != u32OutLen)
1407*53ee8cc1Swenshuai.xi     {
1408*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1409*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Wrong buffer size[%u]!", stCfg.u32Digest_Buf_Size);
1410*53ee8cc1Swenshuai.xi         goto HASHAUTO_FINISH;
1411*53ee8cc1Swenshuai.xi     }
1412*53ee8cc1Swenshuai.xi 
1413*53ee8cc1Swenshuai.xi     //Reset all
1414*53ee8cc1Swenshuai.xi     HAL_CIPHER_ResetStatus(FALSE , TRUE);
1415*53ee8cc1Swenshuai.xi 
1416*53ee8cc1Swenshuai.xi     //Set CAVid
1417*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set CAVid [0x%x]\n", (unsigned int)stCfg.u32CAVid);
1418*53ee8cc1Swenshuai.xi 
1419*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_CaVid(stCfg.u32CAVid))
1420*53ee8cc1Swenshuai.xi     {
1421*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
1422*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!", (unsigned int)stCfg.u32CAVid);
1423*53ee8cc1Swenshuai.xi         goto HASHAUTO_FINISH;
1424*53ee8cc1Swenshuai.xi     }
1425*53ee8cc1Swenshuai.xi 
1426*53ee8cc1Swenshuai.xi     //Set Algo
1427*53ee8cc1Swenshuai.xi     HAL_CIPHER_Hash_Set_Config(stCfg.eAlgo, TRUE, FALSE );
1428*53ee8cc1Swenshuai.xi 
1429*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Algorithm [%d]", stCfg.eAlgo);
1430*53ee8cc1Swenshuai.xi 
1431*53ee8cc1Swenshuai.xi     //Set IV to FIPS
1432*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_IV(NULL, 0 , CMD_HASH_IV_FIPS))
1433*53ee8cc1Swenshuai.xi      {
1434*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
1435*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set HASH IV fail!");
1436*53ee8cc1Swenshuai.xi         goto HASHAUTO_FINISH;
1437*53ee8cc1Swenshuai.xi     }
1438*53ee8cc1Swenshuai.xi 
1439*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_InitWordCnt(E_CIPHER_HASH_IWC_MANUAL, 0))
1440*53ee8cc1Swenshuai.xi     {
1441*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
1442*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set init word count fail!");
1443*53ee8cc1Swenshuai.xi         goto HASHAUTO_FINISH;
1444*53ee8cc1Swenshuai.xi     }
1445*53ee8cc1Swenshuai.xi 
1446*53ee8cc1Swenshuai.xi     //Set Hash message source
1447*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_MsgSrcFrom(stCfg.stInput.eMemoryType, &u32HashSrc))
1448*53ee8cc1Swenshuai.xi     {
1449*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1450*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Set source memory type [%d] fail", stCfg.stInput.eMemoryType);
1451*53ee8cc1Swenshuai.xi         goto HASHAUTO_FINISH;
1452*53ee8cc1Swenshuai.xi     }
1453*53ee8cc1Swenshuai.xi 
1454*53ee8cc1Swenshuai.xi     //Set input message address
1455*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_SetMsg(stCfg.stInput.u32Addr, stCfg.stInput.u32Size, u32HashSrc))
1456*53ee8cc1Swenshuai.xi     {
1457*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1458*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Input address[0x%08x], size[%u]",
1459*53ee8cc1Swenshuai.xi             (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
1460*53ee8cc1Swenshuai.xi         goto HASHAUTO_FINISH;
1461*53ee8cc1Swenshuai.xi     }
1462*53ee8cc1Swenshuai.xi 
1463*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO;Set Input address[0x%08x], size[%u]",
1464*53ee8cc1Swenshuai.xi         (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
1465*53ee8cc1Swenshuai.xi 
1466*53ee8cc1Swenshuai.xi     //Set output destination
1467*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_OutputDstTo(E_CIPHER_DIRECT, &u32HashDst))
1468*53ee8cc1Swenshuai.xi     {
1469*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1470*53ee8cc1Swenshuai.xi         goto HASHAUTO_FINISH;
1471*53ee8cc1Swenshuai.xi     }
1472*53ee8cc1Swenshuai.xi 
1473*53ee8cc1Swenshuai.xi #if 0 //Default output to Register
1474*53ee8cc1Swenshuai.xi     //Set output address
1475*53ee8cc1Swenshuai.xi 	if(FALSE == HAL_CIPHER_Hash_Set_OuputAddr(MsOS_VA2PA((MS_U32)stCfg.pu8Digest_Buf), u32HashDst))
1476*53ee8cc1Swenshuai.xi     {
1477*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_FAIL;
1478*53ee8cc1Swenshuai.xi         goto HASHAUTO_FINISH;
1479*53ee8cc1Swenshuai.xi     }
1480*53ee8cc1Swenshuai.xi #endif
1481*53ee8cc1Swenshuai.xi 
1482*53ee8cc1Swenshuai.xi 	//Set HOS = 1 , Output will be MSB First
1483*53ee8cc1Swenshuai.xi 	HAL_CIPHER_Hash_SetHOS(TRUE);
1484*53ee8cc1Swenshuai.xi 
1485*53ee8cc1Swenshuai.xi     u8BufNum = (MS_U8)(_u16ThreadID % (MS_U16)CIPHER_REPORT_BUFFER_MAX);
1486*53ee8cc1Swenshuai.xi 
1487*53ee8cc1Swenshuai.xi     //Report buffer already used
1488*53ee8cc1Swenshuai.xi     if(_CIPHER_ReportBuffer[u8BufNum].bUsed == TRUE)
1489*53ee8cc1Swenshuai.xi     {
1490*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:CIPHER report buffer is used!");
1491*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_NO_REPORT_BUFFER;
1492*53ee8cc1Swenshuai.xi         goto HASHAUTO_FINISH;
1493*53ee8cc1Swenshuai.xi     }
1494*53ee8cc1Swenshuai.xi 
1495*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Report    = 0;
1496*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
1497*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf      = stCfg.pu8Digest_Buf;
1498*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size = stCfg.u32Digest_Buf_Size;
1499*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].bUsed = TRUE;
1500*53ee8cc1Swenshuai.xi 
1501*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Digest buffer address[0x%08lx], buffer size[%u]",
1502*53ee8cc1Swenshuai.xi                 (long unsigned int)stCfg.pu8Digest_Buf,
1503*53ee8cc1Swenshuai.xi                 stCfg.u32Digest_Buf_Size);
1504*53ee8cc1Swenshuai.xi 
1505*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
1506*53ee8cc1Swenshuai.xi 
1507*53ee8cc1Swenshuai.xi     _eCipherWait = E_CIPHER_HASH_DONE;
1508*53ee8cc1Swenshuai.xi 
1509*53ee8cc1Swenshuai.xi     if(stCfg.pfCallback != NULL)
1510*53ee8cc1Swenshuai.xi     {
1511*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[u8BufNum].pfCallback = stCfg.pfCallback;
1512*53ee8cc1Swenshuai.xi         eIntMode = E_DMA_INT_ENABLE;
1513*53ee8cc1Swenshuai.xi     }
1514*53ee8cc1Swenshuai.xi #endif
1515*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
1516*53ee8cc1Swenshuai.xi 
1517*53ee8cc1Swenshuai.xi     //Start hash
1518*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Start(eIntMode , TRUE, FALSE, _u16ThreadID))
1519*53ee8cc1Swenshuai.xi     {
1520*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_FAIL;
1521*53ee8cc1Swenshuai.xi         goto HASHAUTO_FINISH;
1522*53ee8cc1Swenshuai.xi     }
1523*53ee8cc1Swenshuai.xi 
1524*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IntMode[%d], CmdId[%hu]", eIntMode, _u16ThreadID);
1525*53ee8cc1Swenshuai.xi 
1526*53ee8cc1Swenshuai.xi     *pu32CmdId = (MS_U32)_u16ThreadID;
1527*53ee8cc1Swenshuai.xi 
1528*53ee8cc1Swenshuai.xi     //Check thread id max
1529*53ee8cc1Swenshuai.xi     if(_u16ThreadID == HAL_CRYPTODMA_THREAD_ID_MAX)
1530*53ee8cc1Swenshuai.xi     {
1531*53ee8cc1Swenshuai.xi         _u16ThreadID = 1;
1532*53ee8cc1Swenshuai.xi     }
1533*53ee8cc1Swenshuai.xi     else
1534*53ee8cc1Swenshuai.xi     {
1535*53ee8cc1Swenshuai.xi         _u16ThreadID++;
1536*53ee8cc1Swenshuai.xi     }
1537*53ee8cc1Swenshuai.xi 
1538*53ee8cc1Swenshuai.xi HASHAUTO_FINISH:
1539*53ee8cc1Swenshuai.xi 
1540*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
1541*53ee8cc1Swenshuai.xi 
1542*53ee8cc1Swenshuai.xi     if(ret != DRV_CIPHER_OK)
1543*53ee8cc1Swenshuai.xi     {
1544*53ee8cc1Swenshuai.xi         MsOS_ReleaseSemaphore(_CipherSemaphore);
1545*53ee8cc1Swenshuai.xi     }
1546*53ee8cc1Swenshuai.xi 
1547*53ee8cc1Swenshuai.xi     return ret;
1548*53ee8cc1Swenshuai.xi }
1549*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_HASH(DRV_CIPHER_HASHCFG stCfg,MS_U32 * pu32CmdId)1550*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_HASH(DRV_CIPHER_HASHCFG stCfg, MS_U32 *pu32CmdId)
1551*53ee8cc1Swenshuai.xi {
1552*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
1553*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
1554*53ee8cc1Swenshuai.xi     CIPHER_HASHCALC pArgs;
1555*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(CIPHER_HASHCALC));
1556*53ee8cc1Swenshuai.xi 
1557*53ee8cc1Swenshuai.xi     if(pu32CipherInst == NULL)
1558*53ee8cc1Swenshuai.xi     {
1559*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
1560*53ee8cc1Swenshuai.xi     }
1561*53ee8cc1Swenshuai.xi 
1562*53ee8cc1Swenshuai.xi     memcpy(&pArgs.stCfg, &stCfg, sizeof(DRV_CIPHER_HASHCFG));
1563*53ee8cc1Swenshuai.xi     pArgs.pu32CmdId = pu32CmdId;
1564*53ee8cc1Swenshuai.xi     pArgs.ret = DRV_CIPHER_OK;
1565*53ee8cc1Swenshuai.xi 
1566*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32CipherInst, E_MDRV_CMD_CIPHER_HASH, (void*)&pArgs);
1567*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
1568*53ee8cc1Swenshuai.xi     {
1569*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
1570*53ee8cc1Swenshuai.xi         return DRV_CIPHER_FAIL;
1571*53ee8cc1Swenshuai.xi     }
1572*53ee8cc1Swenshuai.xi 
1573*53ee8cc1Swenshuai.xi     return pArgs.ret;
1574*53ee8cc1Swenshuai.xi #else
1575*53ee8cc1Swenshuai.xi     return _MDrv_CIPHER_HASH(stCfg, pu32CmdId);
1576*53ee8cc1Swenshuai.xi #endif
1577*53ee8cc1Swenshuai.xi }
1578*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_HASHManual(DRV_CIPHER_HASHCFG_MANUAL stCfg,MS_U32 * pu32CmdId)1579*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_HASHManual(DRV_CIPHER_HASHCFG_MANUAL stCfg, MS_U32 *pu32CmdId)
1580*53ee8cc1Swenshuai.xi {
1581*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET      ret      = DRV_CIPHER_OK;
1582*53ee8cc1Swenshuai.xi     HAL_CIPHER_INTMODE  eIntMode = E_DMA_INT_NONE;
1583*53ee8cc1Swenshuai.xi     HAL_CIPHER_IWCTYPE  eIWCType = E_CIPHER_HASH_IWC_MANUAL; //Init Word Count
1584*53ee8cc1Swenshuai.xi     MS_U32  u32IVSel    = CMD_HASH_IV_FIPS;
1585*53ee8cc1Swenshuai.xi     MS_U8* pu8IV       = NULL;
1586*53ee8cc1Swenshuai.xi     MS_U32  u32DataSize = 0;
1587*53ee8cc1Swenshuai.xi     MS_U32  u32IVSize   = 0;
1588*53ee8cc1Swenshuai.xi     MS_BOOL bAutoPad    = FALSE;
1589*53ee8cc1Swenshuai.xi     MS_U32  u32OutLen   = 32;
1590*53ee8cc1Swenshuai.xi     MS_U32  u32HashSrc  = 0;
1591*53ee8cc1Swenshuai.xi     MS_U32  u32HashDst  = 0;
1592*53ee8cc1Swenshuai.xi     MS_U8   u8BufNum    = 0;
1593*53ee8cc1Swenshuai.xi 
1594*53ee8cc1Swenshuai.xi 	DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
1595*53ee8cc1Swenshuai.xi 
1596*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
1597*53ee8cc1Swenshuai.xi 
1598*53ee8cc1Swenshuai.xi     //==============Obtain Semaphore==============
1599*53ee8cc1Swenshuai.xi     MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
1600*53ee8cc1Swenshuai.xi 
1601*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
1602*53ee8cc1Swenshuai.xi 
1603*53ee8cc1Swenshuai.xi     //Check data size
1604*53ee8cc1Swenshuai.xi     u32DataSize = stCfg.stInput.u32Size;
1605*53ee8cc1Swenshuai.xi 
1606*53ee8cc1Swenshuai.xi     if((0 == u32DataSize) && (E_CIPHER_HASH_STAGE_LAST != stCfg.eStage))
1607*53ee8cc1Swenshuai.xi     {
1608*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1609*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH data size is [%u]!\n", u32DataSize);
1610*53ee8cc1Swenshuai.xi         goto HASHMANUAL_FINISH;
1611*53ee8cc1Swenshuai.xi     }
1612*53ee8cc1Swenshuai.xi 
1613*53ee8cc1Swenshuai.xi     if(pu32CmdId == NULL)
1614*53ee8cc1Swenshuai.xi     {
1615*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
1616*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH CmdId is NULL!");
1617*53ee8cc1Swenshuai.xi         goto HASHMANUAL_FINISH;
1618*53ee8cc1Swenshuai.xi     }
1619*53ee8cc1Swenshuai.xi 
1620*53ee8cc1Swenshuai.xi     if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA1)          u32OutLen = HASH_SHA1_DIGEST_SIZE;    //160 bits
1621*53ee8cc1Swenshuai.xi     else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA256)   u32OutLen = HASH_SHA256_DIGEST_SIZE;    //256 bits
1622*53ee8cc1Swenshuai.xi     else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_MD5)      u32OutLen = HASH_MD5_DIGEST_SIZE;    //128 bits
1623*53ee8cc1Swenshuai.xi     else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SM3)      u32OutLen = HASH_SM3_DIGEST_SIZE;    //256 bits
1624*53ee8cc1Swenshuai.xi     else u32OutLen = HASH_SHA256_DIGEST_SIZE;
1625*53ee8cc1Swenshuai.xi 
1626*53ee8cc1Swenshuai.xi     //Check buffer and size
1627*53ee8cc1Swenshuai.xi     if((stCfg.pu8Digest_Buf != NULL) && (stCfg.u32Digest_Buf_Size != u32OutLen))
1628*53ee8cc1Swenshuai.xi     {
1629*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1630*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Wrong buffer size[%u]!\n", stCfg.u32Digest_Buf_Size);
1631*53ee8cc1Swenshuai.xi         goto HASHMANUAL_FINISH;
1632*53ee8cc1Swenshuai.xi     }
1633*53ee8cc1Swenshuai.xi 
1634*53ee8cc1Swenshuai.xi     //Check IV setting
1635*53ee8cc1Swenshuai.xi     if(stCfg.pu8SetIV != NULL)
1636*53ee8cc1Swenshuai.xi     {
1637*53ee8cc1Swenshuai.xi         pu8IV = stCfg.pu8SetIV;
1638*53ee8cc1Swenshuai.xi         u32IVSel = CMD_HASH_IV_CMD;
1639*53ee8cc1Swenshuai.xi 
1640*53ee8cc1Swenshuai.xi         if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA1)
1641*53ee8cc1Swenshuai.xi         {
1642*53ee8cc1Swenshuai.xi             u32IVSize = HASH_SHA1_DIGEST_SIZE;
1643*53ee8cc1Swenshuai.xi         }
1644*53ee8cc1Swenshuai.xi         else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA256)
1645*53ee8cc1Swenshuai.xi         {
1646*53ee8cc1Swenshuai.xi             u32IVSize = HASH_SHA256_DIGEST_SIZE;
1647*53ee8cc1Swenshuai.xi         }
1648*53ee8cc1Swenshuai.xi         else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_MD5)
1649*53ee8cc1Swenshuai.xi         {
1650*53ee8cc1Swenshuai.xi             u32IVSize = HASH_MD5_DIGEST_SIZE;
1651*53ee8cc1Swenshuai.xi         }
1652*53ee8cc1Swenshuai.xi         else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SM3)
1653*53ee8cc1Swenshuai.xi         {
1654*53ee8cc1Swenshuai.xi             u32IVSize = HASH_SM3_DIGEST_SIZE;
1655*53ee8cc1Swenshuai.xi         }
1656*53ee8cc1Swenshuai.xi     }
1657*53ee8cc1Swenshuai.xi     else
1658*53ee8cc1Swenshuai.xi     {
1659*53ee8cc1Swenshuai.xi         //NULL IV
1660*53ee8cc1Swenshuai.xi         if(stCfg.eIVMode == E_CIPHER_HASH_IV_CMD)
1661*53ee8cc1Swenshuai.xi         {
1662*53ee8cc1Swenshuai.xi             ret = DRV_CIPHER_BAD_PARAM;
1663*53ee8cc1Swenshuai.xi             DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:NULL IV!");
1664*53ee8cc1Swenshuai.xi             goto HASHMANUAL_FINISH;
1665*53ee8cc1Swenshuai.xi         }
1666*53ee8cc1Swenshuai.xi     }
1667*53ee8cc1Swenshuai.xi 
1668*53ee8cc1Swenshuai.xi     //IV and IWC is from previous report
1669*53ee8cc1Swenshuai.xi     if(stCfg.eIVMode == E_CIPHER_HASH_IV_PRV)
1670*53ee8cc1Swenshuai.xi     {
1671*53ee8cc1Swenshuai.xi         u32IVSel = CMD_HASH_IV_PRV_RPT;
1672*53ee8cc1Swenshuai.xi         eIWCType = E_CIPHER_HASH_IWC_PRV;
1673*53ee8cc1Swenshuai.xi     }
1674*53ee8cc1Swenshuai.xi 
1675*53ee8cc1Swenshuai.xi     //AutoPad only works on last stage, previous stage is 64 bytes alignment
1676*53ee8cc1Swenshuai.xi     if(stCfg.eStage == E_CIPHER_HASH_STAGE_LAST)
1677*53ee8cc1Swenshuai.xi     {
1678*53ee8cc1Swenshuai.xi         bAutoPad = TRUE;
1679*53ee8cc1Swenshuai.xi     }
1680*53ee8cc1Swenshuai.xi     else
1681*53ee8cc1Swenshuai.xi     {
1682*53ee8cc1Swenshuai.xi         if((u32DataSize % (MS_U32)HASH_BLOCK_SIZE) != 0 )
1683*53ee8cc1Swenshuai.xi         {
1684*53ee8cc1Swenshuai.xi             ret = DRV_CIPHER_BAD_PARAM;
1685*53ee8cc1Swenshuai.xi             DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH block is 64 bytes alignment!");
1686*53ee8cc1Swenshuai.xi             goto HASHMANUAL_FINISH;
1687*53ee8cc1Swenshuai.xi         }
1688*53ee8cc1Swenshuai.xi     }
1689*53ee8cc1Swenshuai.xi 
1690*53ee8cc1Swenshuai.xi     //Reset all
1691*53ee8cc1Swenshuai.xi     HAL_CIPHER_ResetStatus(FALSE , TRUE);
1692*53ee8cc1Swenshuai.xi 
1693*53ee8cc1Swenshuai.xi     //Set CAVid
1694*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set CAVid [0x%x]", (unsigned int)stCfg.u32CAVid);
1695*53ee8cc1Swenshuai.xi 
1696*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_CaVid(stCfg.u32CAVid))
1697*53ee8cc1Swenshuai.xi     {
1698*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
1699*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!", (unsigned int)stCfg.u32CAVid);
1700*53ee8cc1Swenshuai.xi         goto HASHMANUAL_FINISH;
1701*53ee8cc1Swenshuai.xi     }
1702*53ee8cc1Swenshuai.xi 
1703*53ee8cc1Swenshuai.xi     //Set Algo
1704*53ee8cc1Swenshuai.xi     HAL_CIPHER_Hash_Set_Config(stCfg.eAlgo, bAutoPad, FALSE);
1705*53ee8cc1Swenshuai.xi 
1706*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Algorithm[%d], AutoPad[%d]", stCfg.eAlgo, bAutoPad);
1707*53ee8cc1Swenshuai.xi 
1708*53ee8cc1Swenshuai.xi     //Set IV to FIPS
1709*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_IV(pu8IV, u32IVSize , u32IVSel))
1710*53ee8cc1Swenshuai.xi     {
1711*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1712*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Set IV fail, IV size[%u]", u32IVSize);
1713*53ee8cc1Swenshuai.xi         goto HASHMANUAL_FINISH;
1714*53ee8cc1Swenshuai.xi     }
1715*53ee8cc1Swenshuai.xi 
1716*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set IV size[%u], IV Mode[%d]", u32IVSize, stCfg.eIVMode);
1717*53ee8cc1Swenshuai.xi 
1718*53ee8cc1Swenshuai.xi     //Set Init Word Count
1719*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_InitWordCnt(eIWCType, stCfg.u32StartByte))
1720*53ee8cc1Swenshuai.xi     {
1721*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1722*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Set IWC fail, IWC[%d], StartBytes[%u]", eIWCType, stCfg.u32StartByte);
1723*53ee8cc1Swenshuai.xi         goto HASHMANUAL_FINISH;
1724*53ee8cc1Swenshuai.xi     }
1725*53ee8cc1Swenshuai.xi 
1726*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set IWC[%d], StartBytes[%u]", eIWCType, stCfg.u32StartByte);
1727*53ee8cc1Swenshuai.xi 
1728*53ee8cc1Swenshuai.xi     //Set HMAC Key
1729*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_SetHMACKey(stCfg.stHMACKey, stCfg.eHMACKPad, FALSE))
1730*53ee8cc1Swenshuai.xi     {
1731*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1732*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Set HMAC key fail, HMAC key source[%d], key index[%u]", stCfg.stHMACKey.eKeySrc, stCfg.stHMACKey.u8KeyIdx);
1733*53ee8cc1Swenshuai.xi         goto HASHMANUAL_FINISH;
1734*53ee8cc1Swenshuai.xi     }
1735*53ee8cc1Swenshuai.xi 
1736*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set HMAC Key Source[%d], Key Index[%u], KeyPad[%d]",
1737*53ee8cc1Swenshuai.xi         stCfg.stHMACKey.eKeySrc, stCfg.stHMACKey.u8KeyIdx, stCfg.eHMACKPad);
1738*53ee8cc1Swenshuai.xi 
1739*53ee8cc1Swenshuai.xi     //Set Hash message source
1740*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_MsgSrcFrom(stCfg.stInput.eMemoryType, &u32HashSrc))
1741*53ee8cc1Swenshuai.xi     {
1742*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1743*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Set source memory type [%d] fail", stCfg.stInput.eMemoryType);
1744*53ee8cc1Swenshuai.xi         goto HASHMANUAL_FINISH;
1745*53ee8cc1Swenshuai.xi     }
1746*53ee8cc1Swenshuai.xi 
1747*53ee8cc1Swenshuai.xi     //Set input message address
1748*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_SetMsg(stCfg.stInput.u32Addr, stCfg.stInput.u32Size, u32HashSrc))
1749*53ee8cc1Swenshuai.xi     {
1750*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1751*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Input address[0x%08x], size[%u]",
1752*53ee8cc1Swenshuai.xi             (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
1753*53ee8cc1Swenshuai.xi         goto HASHMANUAL_FINISH;
1754*53ee8cc1Swenshuai.xi     }
1755*53ee8cc1Swenshuai.xi 
1756*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "Set Input address[0x%08x], size[%u]",
1757*53ee8cc1Swenshuai.xi             (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
1758*53ee8cc1Swenshuai.xi 
1759*53ee8cc1Swenshuai.xi     //Set output destination
1760*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_OutputDstTo(E_CIPHER_DIRECT, &u32HashDst))
1761*53ee8cc1Swenshuai.xi     {
1762*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1763*53ee8cc1Swenshuai.xi         goto HASHMANUAL_FINISH;
1764*53ee8cc1Swenshuai.xi     }
1765*53ee8cc1Swenshuai.xi #if 0
1766*53ee8cc1Swenshuai.xi     //Set output address
1767*53ee8cc1Swenshuai.xi 	if(FALSE == HAL_CIPHER_Hash_Set_OuputAddr(MsOS_VA2PA(stCfg.stOutput.u32Addr), u32HashDst))
1768*53ee8cc1Swenshuai.xi     {
1769*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_FAIL;
1770*53ee8cc1Swenshuai.xi         goto HASHMANUAL_FINISH;
1771*53ee8cc1Swenshuai.xi     }
1772*53ee8cc1Swenshuai.xi #endif
1773*53ee8cc1Swenshuai.xi 	//Set HOS = 1, Output will be MSB First
1774*53ee8cc1Swenshuai.xi 	//IV auto mode use previous report digest as IV, report must be LSB first
1775*53ee8cc1Swenshuai.xi     if(stCfg.pu8Digest_Buf == NULL)
1776*53ee8cc1Swenshuai.xi     {
1777*53ee8cc1Swenshuai.xi         HAL_CIPHER_Hash_SetHOS(FALSE);
1778*53ee8cc1Swenshuai.xi     }
1779*53ee8cc1Swenshuai.xi     else
1780*53ee8cc1Swenshuai.xi     {
1781*53ee8cc1Swenshuai.xi         HAL_CIPHER_Hash_SetHOS(TRUE);
1782*53ee8cc1Swenshuai.xi     }
1783*53ee8cc1Swenshuai.xi 
1784*53ee8cc1Swenshuai.xi     //Set total size if last command
1785*53ee8cc1Swenshuai.xi     if(stCfg.eStage == E_CIPHER_HASH_STAGE_LAST)
1786*53ee8cc1Swenshuai.xi     {
1787*53ee8cc1Swenshuai.xi         HAL_CIPHER_Hash_SetMsgLength(stCfg.u32StartByte + stCfg.stInput.u32Size);
1788*53ee8cc1Swenshuai.xi     }
1789*53ee8cc1Swenshuai.xi 
1790*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Message length, StartBytes[0x%08x], Input Size[%u]",
1791*53ee8cc1Swenshuai.xi         (unsigned int)stCfg.u32StartByte, stCfg.stInput.u32Size);
1792*53ee8cc1Swenshuai.xi 
1793*53ee8cc1Swenshuai.xi 
1794*53ee8cc1Swenshuai.xi     u8BufNum = (MS_U8)(_u16ThreadID % (MS_U16)CIPHER_REPORT_BUFFER_MAX);
1795*53ee8cc1Swenshuai.xi 
1796*53ee8cc1Swenshuai.xi     //Report buffer already used
1797*53ee8cc1Swenshuai.xi     if(_CIPHER_ReportBuffer[u8BufNum].bUsed == TRUE)
1798*53ee8cc1Swenshuai.xi     {
1799*53ee8cc1Swenshuai.xi        DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:CIPHER report buffer[%u] is used!", u8BufNum);
1800*53ee8cc1Swenshuai.xi        ret =  DRV_CIPHER_NO_REPORT_BUFFER;
1801*53ee8cc1Swenshuai.xi        goto HASHMANUAL_FINISH;
1802*53ee8cc1Swenshuai.xi     }
1803*53ee8cc1Swenshuai.xi 
1804*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Report    = 0;
1805*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
1806*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf      = stCfg.pu8Digest_Buf;
1807*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size = stCfg.u32Digest_Buf_Size;
1808*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].eKeySrc  = stCfg.stHMACKey.eKeySrc;
1809*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u8KeyIdx = stCfg.stHMACKey.u8KeyIdx;
1810*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].bUsed = TRUE;
1811*53ee8cc1Swenshuai.xi 
1812*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Digest buffer address[0x%08lx], buffer size[%u]",
1813*53ee8cc1Swenshuai.xi                 (long unsigned int)stCfg.pu8Digest_Buf, stCfg.u32Digest_Buf_Size);
1814*53ee8cc1Swenshuai.xi 
1815*53ee8cc1Swenshuai.xi 
1816*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
1817*53ee8cc1Swenshuai.xi 
1818*53ee8cc1Swenshuai.xi     _eCipherWait = E_CIPHER_HASH_DONE;
1819*53ee8cc1Swenshuai.xi #endif
1820*53ee8cc1Swenshuai.xi 
1821*53ee8cc1Swenshuai.xi     //Start hash
1822*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Start(eIntMode , TRUE, FALSE, _u16ThreadID))
1823*53ee8cc1Swenshuai.xi     {
1824*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_FAIL;
1825*53ee8cc1Swenshuai.xi         goto HASHMANUAL_FINISH;
1826*53ee8cc1Swenshuai.xi     }
1827*53ee8cc1Swenshuai.xi 
1828*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IntMode[%d], CmdId[%hu]\n", eIntMode, _u16ThreadID);
1829*53ee8cc1Swenshuai.xi 
1830*53ee8cc1Swenshuai.xi     *pu32CmdId = (MS_U32)_u16ThreadID;
1831*53ee8cc1Swenshuai.xi 
1832*53ee8cc1Swenshuai.xi     //Check thread id max
1833*53ee8cc1Swenshuai.xi     if(_u16ThreadID == HAL_CRYPTODMA_THREAD_ID_MAX)
1834*53ee8cc1Swenshuai.xi     {
1835*53ee8cc1Swenshuai.xi         _u16ThreadID = 1;
1836*53ee8cc1Swenshuai.xi     }
1837*53ee8cc1Swenshuai.xi     else
1838*53ee8cc1Swenshuai.xi     {
1839*53ee8cc1Swenshuai.xi         _u16ThreadID++;
1840*53ee8cc1Swenshuai.xi     }
1841*53ee8cc1Swenshuai.xi 
1842*53ee8cc1Swenshuai.xi HASHMANUAL_FINISH:
1843*53ee8cc1Swenshuai.xi 
1844*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
1845*53ee8cc1Swenshuai.xi 
1846*53ee8cc1Swenshuai.xi     if(ret != DRV_CIPHER_OK)
1847*53ee8cc1Swenshuai.xi     {
1848*53ee8cc1Swenshuai.xi         MsOS_ReleaseSemaphore(_CipherSemaphore);
1849*53ee8cc1Swenshuai.xi     }
1850*53ee8cc1Swenshuai.xi 
1851*53ee8cc1Swenshuai.xi     return ret;
1852*53ee8cc1Swenshuai.xi }
1853*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_HMAC(DRV_CIPHER_HMACCFG stCfg,MS_U32 * pu32CmdId)1854*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_HMAC(DRV_CIPHER_HMACCFG stCfg, MS_U32 *pu32CmdId)
1855*53ee8cc1Swenshuai.xi {
1856*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET      ret      = DRV_CIPHER_OK;
1857*53ee8cc1Swenshuai.xi     HAL_CIPHER_INTMODE  eIntMode = E_DMA_INT_NONE;
1858*53ee8cc1Swenshuai.xi     MS_U32 u32OutLen   = 0;
1859*53ee8cc1Swenshuai.xi     MS_U32 u32HashSrc  = 0;
1860*53ee8cc1Swenshuai.xi     MS_U32 u32HashDst  = 0;
1861*53ee8cc1Swenshuai.xi     MS_U8  u8BufNum    = 0;
1862*53ee8cc1Swenshuai.xi 
1863*53ee8cc1Swenshuai.xi #if defined (MSOS_TYPE_NOS) || defined (MCU_AEON) || defined (MSOS_TYPE_OPTEE)
1864*53ee8cc1Swenshuai.xi     MS_U32 Rpt[10]     = {0};
1865*53ee8cc1Swenshuai.xi     MS_U32 u32WaitCnt  = 0;
1866*53ee8cc1Swenshuai.xi     MS_U32 u32ErrorMsg = 0;
1867*53ee8cc1Swenshuai.xi #endif
1868*53ee8cc1Swenshuai.xi 
1869*53ee8cc1Swenshuai.xi 	DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
1870*53ee8cc1Swenshuai.xi 
1871*53ee8cc1Swenshuai.xi     if(TRUE == _bCIPHERDrv_KeyCtrlEn)
1872*53ee8cc1Swenshuai.xi     {
1873*53ee8cc1Swenshuai.xi         if(E_CIPHER_KSRC_KL == stCfg.stHMACKey.eKeySrc)
1874*53ee8cc1Swenshuai.xi         {
1875*53ee8cc1Swenshuai.xi            DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Not support!");
1876*53ee8cc1Swenshuai.xi            return DRV_CIPHER_FAIL;
1877*53ee8cc1Swenshuai.xi         }
1878*53ee8cc1Swenshuai.xi     }
1879*53ee8cc1Swenshuai.xi 
1880*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
1881*53ee8cc1Swenshuai.xi 
1882*53ee8cc1Swenshuai.xi     //==============Obtain Semaphore==============
1883*53ee8cc1Swenshuai.xi     MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
1884*53ee8cc1Swenshuai.xi 
1885*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
1886*53ee8cc1Swenshuai.xi 
1887*53ee8cc1Swenshuai.xi     //Check data size
1888*53ee8cc1Swenshuai.xi     if((stCfg.stInput.u32Size == 0) || (stCfg.u32Digest_Buf_Size == 0))
1889*53ee8cc1Swenshuai.xi     {
1890*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH data size is zero!");
1891*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1892*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
1893*53ee8cc1Swenshuai.xi     }
1894*53ee8cc1Swenshuai.xi 
1895*53ee8cc1Swenshuai.xi     if(pu32CmdId == NULL)
1896*53ee8cc1Swenshuai.xi     {
1897*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH CmdId is NULL!");
1898*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
1899*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
1900*53ee8cc1Swenshuai.xi     }
1901*53ee8cc1Swenshuai.xi 
1902*53ee8cc1Swenshuai.xi     if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA1)          u32OutLen = HASH_SHA1_DIGEST_SIZE;    //160 bits
1903*53ee8cc1Swenshuai.xi     else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SHA256)   u32OutLen = HASH_SHA256_DIGEST_SIZE;    //256 bits
1904*53ee8cc1Swenshuai.xi     else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_MD5)      u32OutLen = HASH_MD5_DIGEST_SIZE;    //128 bits
1905*53ee8cc1Swenshuai.xi     else if(stCfg.eAlgo == E_CIPHER_HASH_ALGO_SM3)      u32OutLen = HASH_SM3_DIGEST_SIZE;    //256 bits
1906*53ee8cc1Swenshuai.xi     else u32OutLen = HASH_SHA256_DIGEST_SIZE;
1907*53ee8cc1Swenshuai.xi 
1908*53ee8cc1Swenshuai.xi     if(stCfg.u32Digest_Buf_Size != u32OutLen)
1909*53ee8cc1Swenshuai.xi     {
1910*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1911*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Wrong buffer size[%u]!", stCfg.u32Digest_Buf_Size);
1912*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
1913*53ee8cc1Swenshuai.xi     }
1914*53ee8cc1Swenshuai.xi     //------------Inner hash----------------------------
1915*53ee8cc1Swenshuai.xi     //Reset all
1916*53ee8cc1Swenshuai.xi     HAL_CIPHER_ResetStatus(FALSE , TRUE);
1917*53ee8cc1Swenshuai.xi     //Set CAVid
1918*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_CaVid(stCfg.u32CAVid))
1919*53ee8cc1Swenshuai.xi     {
1920*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
1921*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!", (unsigned int)stCfg.u32CAVid);
1922*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
1923*53ee8cc1Swenshuai.xi     }
1924*53ee8cc1Swenshuai.xi     //Set Algo
1925*53ee8cc1Swenshuai.xi     HAL_CIPHER_Hash_Set_Config(stCfg.eAlgo, TRUE, FALSE);
1926*53ee8cc1Swenshuai.xi 
1927*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Algorithm [%d]", stCfg.eAlgo);
1928*53ee8cc1Swenshuai.xi 
1929*53ee8cc1Swenshuai.xi     //Set IV to FIPS
1930*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_IV(NULL, 0 , CMD_HASH_IV_FIPS))
1931*53ee8cc1Swenshuai.xi     {
1932*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
1933*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set HMAC IV fail!");
1934*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
1935*53ee8cc1Swenshuai.xi     }
1936*53ee8cc1Swenshuai.xi 
1937*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_InitWordCnt(E_CIPHER_HASH_IWC_MANUAL, 0))
1938*53ee8cc1Swenshuai.xi     {
1939*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
1940*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set init word count fail!");
1941*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
1942*53ee8cc1Swenshuai.xi     }
1943*53ee8cc1Swenshuai.xi 
1944*53ee8cc1Swenshuai.xi     //Set HMAC Key
1945*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_SetHMACKey(stCfg.stHMACKey, E_CIPHER_HMAC_IKPAD, FALSE))
1946*53ee8cc1Swenshuai.xi     {
1947*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1948*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Set HMAC key fail, HMAC key source[%d], key index[%u]", stCfg.stHMACKey.eKeySrc, stCfg.stHMACKey.u8KeyIdx);
1949*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
1950*53ee8cc1Swenshuai.xi     }
1951*53ee8cc1Swenshuai.xi 
1952*53ee8cc1Swenshuai.xi     //Set Hash message source
1953*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_MsgSrcFrom(stCfg.stInput.eMemoryType, &u32HashSrc))
1954*53ee8cc1Swenshuai.xi     {
1955*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1956*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Set source memory type [%d] fail", stCfg.stInput.eMemoryType);
1957*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
1958*53ee8cc1Swenshuai.xi     }
1959*53ee8cc1Swenshuai.xi     //Set input message address
1960*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_SetMsg(stCfg.stInput.u32Addr, stCfg.stInput.u32Size, u32HashSrc))
1961*53ee8cc1Swenshuai.xi     {
1962*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1963*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Input address[0x%08x], size[%u]",
1964*53ee8cc1Swenshuai.xi             (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
1965*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
1966*53ee8cc1Swenshuai.xi     }
1967*53ee8cc1Swenshuai.xi 
1968*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Input address[0x%08x], size[%u]",
1969*53ee8cc1Swenshuai.xi         (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
1970*53ee8cc1Swenshuai.xi 
1971*53ee8cc1Swenshuai.xi     //Set output destination, HMAC inner hash output to register
1972*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_OutputDstTo(E_CIPHER_DIRECT, &u32HashDst))
1973*53ee8cc1Swenshuai.xi     {
1974*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
1975*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
1976*53ee8cc1Swenshuai.xi     }
1977*53ee8cc1Swenshuai.xi #if 0
1978*53ee8cc1Swenshuai.xi     //Set output address
1979*53ee8cc1Swenshuai.xi 	if(FALSE == HAL_CIPHER_Hash_Set_OuputAddr(MsOS_VA2PA(stCfg.stOutput.u32Addr), u32HashDst))
1980*53ee8cc1Swenshuai.xi     {
1981*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_FAIL;
1982*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
1983*53ee8cc1Swenshuai.xi     }
1984*53ee8cc1Swenshuai.xi #endif
1985*53ee8cc1Swenshuai.xi 	//Set HOS = 0, HW limitation
1986*53ee8cc1Swenshuai.xi 	HAL_CIPHER_Hash_SetHOS(FALSE);
1987*53ee8cc1Swenshuai.xi 
1988*53ee8cc1Swenshuai.xi     HAL_CIPHER_Hash_SetMsgLength(stCfg.stInput.u32Size + HASH_HMAC_KEYPAD_SIZE);
1989*53ee8cc1Swenshuai.xi 
1990*53ee8cc1Swenshuai.xi     u8BufNum = (MS_U8)(_u16ThreadID % (MS_U16)CIPHER_REPORT_BUFFER_MAX);
1991*53ee8cc1Swenshuai.xi 
1992*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Report    = 0;
1993*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
1994*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf      = NULL;
1995*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size = 0;
1996*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].eKeySrc  = stCfg.stHMACKey.eKeySrc;
1997*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u8KeyIdx = stCfg.stHMACKey.u8KeyIdx;
1998*53ee8cc1Swenshuai.xi 
1999*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
2000*53ee8cc1Swenshuai.xi 
2001*53ee8cc1Swenshuai.xi     _eCipherWait = E_CIPHER_HASH_DONE;
2002*53ee8cc1Swenshuai.xi     eIntMode     = E_DMA_INT_ENABLE;
2003*53ee8cc1Swenshuai.xi 
2004*53ee8cc1Swenshuai.xi #endif
2005*53ee8cc1Swenshuai.xi 
2006*53ee8cc1Swenshuai.xi     //Start hash
2007*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Start(eIntMode , TRUE, FALSE, _u16ThreadID))
2008*53ee8cc1Swenshuai.xi     {
2009*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_FAIL;
2010*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
2011*53ee8cc1Swenshuai.xi     }
2012*53ee8cc1Swenshuai.xi 
2013*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IntMode[%d], CmdId[%hu]", eIntMode, _u16ThreadID);
2014*53ee8cc1Swenshuai.xi 
2015*53ee8cc1Swenshuai.xi #if defined (MSOS_TYPE_NOS) || defined (MCU_AEON) || defined (MSOS_TYPE_OPTEE)
2016*53ee8cc1Swenshuai.xi 
2017*53ee8cc1Swenshuai.xi     while(FALSE == HAL_CIPHER_Hash_CmdDone(_u16ThreadID, &u32ErrorMsg) && u32WaitCnt < HASH_TIMEOUT_VALUE)
2018*53ee8cc1Swenshuai.xi     {
2019*53ee8cc1Swenshuai.xi     #ifdef MSOS_TYPE_NUTTX
2020*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(200);
2021*53ee8cc1Swenshuai.xi     #elif MSOS_TYPE_OPTEE
2022*53ee8cc1Swenshuai.xi 
2023*53ee8cc1Swenshuai.xi     #else
2024*53ee8cc1Swenshuai.xi         MsOS_DelayTask(20);
2025*53ee8cc1Swenshuai.xi     #endif
2026*53ee8cc1Swenshuai.xi         u32WaitCnt++;
2027*53ee8cc1Swenshuai.xi     }
2028*53ee8cc1Swenshuai.xi     //First time should print HMAC error flag
2029*53ee8cc1Swenshuai.xi     if(u32ErrorMsg != 0)
2030*53ee8cc1Swenshuai.xi     {
2031*53ee8cc1Swenshuai.xi         HAL_CIPHER_Hash_ExceptFilter(&u32ErrorMsg, stCfg.stHMACKey.eKeySrc, stCfg.stHMACKey.u8KeyIdx);
2032*53ee8cc1Swenshuai.xi         HAL_CIPHER_ReadException(u32ErrorMsg);
2033*53ee8cc1Swenshuai.xi     }
2034*53ee8cc1Swenshuai.xi 
2035*53ee8cc1Swenshuai.xi     if(u32WaitCnt >= HASH_TIMEOUT_VALUE)
2036*53ee8cc1Swenshuai.xi     {
2037*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning;HASH timeout!");
2038*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_FAIL;
2039*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
2040*53ee8cc1Swenshuai.xi     }
2041*53ee8cc1Swenshuai.xi 
2042*53ee8cc1Swenshuai.xi     HAL_CIPHER_Hash_GetRpt(Rpt, HASH_RPT_SIZE_STATUS);
2043*53ee8cc1Swenshuai.xi 
2044*53ee8cc1Swenshuai.xi     if((Rpt[0] & DRV_CIPHER_REPORT_OK) == 0)
2045*53ee8cc1Swenshuai.xi     {
2046*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_FAIL;
2047*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HMAC Inner Hash Fail!");
2048*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
2049*53ee8cc1Swenshuai.xi     }
2050*53ee8cc1Swenshuai.xi 
2051*53ee8cc1Swenshuai.xi     MsOS_ReleaseSemaphore(_CipherSemaphore);
2052*53ee8cc1Swenshuai.xi #endif
2053*53ee8cc1Swenshuai.xi 
2054*53ee8cc1Swenshuai.xi     //Check thread id max
2055*53ee8cc1Swenshuai.xi     if(_u16ThreadID == HAL_CRYPTODMA_THREAD_ID_MAX)
2056*53ee8cc1Swenshuai.xi     {
2057*53ee8cc1Swenshuai.xi         _u16ThreadID = 1;
2058*53ee8cc1Swenshuai.xi     }
2059*53ee8cc1Swenshuai.xi     else
2060*53ee8cc1Swenshuai.xi     {
2061*53ee8cc1Swenshuai.xi         _u16ThreadID++;
2062*53ee8cc1Swenshuai.xi     }
2063*53ee8cc1Swenshuai.xi 
2064*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
2065*53ee8cc1Swenshuai.xi 
2066*53ee8cc1Swenshuai.xi     //----------------Outer hash------------------------------
2067*53ee8cc1Swenshuai.xi 
2068*53ee8cc1Swenshuai.xi     //==============Obtain Semaphore==============
2069*53ee8cc1Swenshuai.xi     MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
2070*53ee8cc1Swenshuai.xi 
2071*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
2072*53ee8cc1Swenshuai.xi 
2073*53ee8cc1Swenshuai.xi     eIntMode = E_DMA_INT_NONE;
2074*53ee8cc1Swenshuai.xi 
2075*53ee8cc1Swenshuai.xi     //Set CAVid
2076*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_CaVid(stCfg.u32CAVid))
2077*53ee8cc1Swenshuai.xi     {
2078*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
2079*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!", (unsigned int)stCfg.u32CAVid);
2080*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
2081*53ee8cc1Swenshuai.xi     }
2082*53ee8cc1Swenshuai.xi 
2083*53ee8cc1Swenshuai.xi     //Set Algo
2084*53ee8cc1Swenshuai.xi     HAL_CIPHER_Hash_Set_Config(stCfg.eAlgo, TRUE, FALSE );
2085*53ee8cc1Swenshuai.xi 
2086*53ee8cc1Swenshuai.xi     //Set IV to FIPS
2087*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_IV(NULL, 0 , CMD_HASH_IV_FIPS))
2088*53ee8cc1Swenshuai.xi     {
2089*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
2090*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set HMAC IV fail!");
2091*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
2092*53ee8cc1Swenshuai.xi     }
2093*53ee8cc1Swenshuai.xi 
2094*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_InitWordCnt(E_CIPHER_HASH_IWC_MANUAL, 0))
2095*53ee8cc1Swenshuai.xi     {
2096*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
2097*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set init word count fail!");
2098*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
2099*53ee8cc1Swenshuai.xi     }
2100*53ee8cc1Swenshuai.xi 
2101*53ee8cc1Swenshuai.xi 
2102*53ee8cc1Swenshuai.xi     //Set HMAC Key,
2103*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_SetHMACKey(stCfg.stHMACKey, E_CIPHER_HMAC_OKPAD, FALSE))
2104*53ee8cc1Swenshuai.xi     {
2105*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
2106*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set HMAC key fail!");
2107*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
2108*53ee8cc1Swenshuai.xi     }
2109*53ee8cc1Swenshuai.xi 
2110*53ee8cc1Swenshuai.xi     //No need to set Hash message source
2111*53ee8cc1Swenshuai.xi     //HAL_CIPHER_Hash_Set_MsgSrcFrom(stCfg.stInput.eMemoryType, &u32HashSrc);
2112*53ee8cc1Swenshuai.xi 
2113*53ee8cc1Swenshuai.xi     //Set input message address, outer hash from previous report
2114*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_SetMsg(NULL, 0,  CMD_HASH_SRC_PRV_RPT))
2115*53ee8cc1Swenshuai.xi     {
2116*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
2117*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set HMAC message fail!");
2118*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
2119*53ee8cc1Swenshuai.xi     }
2120*53ee8cc1Swenshuai.xi 
2121*53ee8cc1Swenshuai.xi     //Set output destination
2122*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Set_OutputDstTo(E_CIPHER_DIRECT, &u32HashDst))
2123*53ee8cc1Swenshuai.xi     {
2124*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_BAD_PARAM;
2125*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set HMAC output destination fail!");
2126*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
2127*53ee8cc1Swenshuai.xi     }
2128*53ee8cc1Swenshuai.xi 
2129*53ee8cc1Swenshuai.xi #if 0 //Default output to Register
2130*53ee8cc1Swenshuai.xi     //Set output address
2131*53ee8cc1Swenshuai.xi 	if(FALSE == HAL_CIPHER_Hash_Set_OuputAddr(MsOS_VA2PA(stCfg.stOutput.u32Addr), u32HashDst))
2132*53ee8cc1Swenshuai.xi     {
2133*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_FAIL;
2134*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
2135*53ee8cc1Swenshuai.xi     }
2136*53ee8cc1Swenshuai.xi #endif
2137*53ee8cc1Swenshuai.xi 
2138*53ee8cc1Swenshuai.xi 	//Set HOS = 1
2139*53ee8cc1Swenshuai.xi 	HAL_CIPHER_Hash_SetHOS(TRUE);
2140*53ee8cc1Swenshuai.xi 
2141*53ee8cc1Swenshuai.xi     HAL_CIPHER_Hash_SetMsgLength(u32OutLen + HASH_HMAC_KEYPAD_SIZE); //Hash output size + O_keypad_size
2142*53ee8cc1Swenshuai.xi 
2143*53ee8cc1Swenshuai.xi     u8BufNum = _u16ThreadID % (MS_U32)CIPHER_REPORT_BUFFER_MAX;
2144*53ee8cc1Swenshuai.xi 
2145*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Report    = 0;
2146*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
2147*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].pu8Digest_Buf      = stCfg.pu8Digest_Buf;
2148*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Digest_Buf_Size = stCfg.u32Digest_Buf_Size;
2149*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].eKeySrc  = stCfg.stHMACKey.eKeySrc;
2150*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u8KeyIdx = stCfg.stHMACKey.u8KeyIdx;
2151*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].bUsed = TRUE;
2152*53ee8cc1Swenshuai.xi 
2153*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Digest buffer address[0x%08lx], buffer size[%u]\n",
2154*53ee8cc1Swenshuai.xi                 (long unsigned int)stCfg.pu8Digest_Buf, stCfg.u32Digest_Buf_Size);
2155*53ee8cc1Swenshuai.xi 
2156*53ee8cc1Swenshuai.xi 
2157*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) &&  !defined (MSOS_TYPE_OPTEE)
2158*53ee8cc1Swenshuai.xi 
2159*53ee8cc1Swenshuai.xi     _eCipherWait = E_CIPHER_HASH_DONE;
2160*53ee8cc1Swenshuai.xi 
2161*53ee8cc1Swenshuai.xi     if(stCfg.pfCallback != NULL)
2162*53ee8cc1Swenshuai.xi     {
2163*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[u8BufNum].pfCallback = stCfg.pfCallback;
2164*53ee8cc1Swenshuai.xi         eIntMode = E_DMA_INT_ENABLE;
2165*53ee8cc1Swenshuai.xi     }
2166*53ee8cc1Swenshuai.xi #endif
2167*53ee8cc1Swenshuai.xi 
2168*53ee8cc1Swenshuai.xi     //Start hash
2169*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_Hash_Start(eIntMode , TRUE, FALSE, _u16ThreadID))
2170*53ee8cc1Swenshuai.xi     {
2171*53ee8cc1Swenshuai.xi         ret = DRV_CIPHER_FAIL;
2172*53ee8cc1Swenshuai.xi         goto HASHHMAC_FINISH;
2173*53ee8cc1Swenshuai.xi     }
2174*53ee8cc1Swenshuai.xi 
2175*53ee8cc1Swenshuai.xi      DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IntMode[%d], CmdId[%hu]\n", eIntMode, _u16ThreadID);
2176*53ee8cc1Swenshuai.xi 
2177*53ee8cc1Swenshuai.xi     *pu32CmdId = (MS_U32)_u16ThreadID;
2178*53ee8cc1Swenshuai.xi 
2179*53ee8cc1Swenshuai.xi     //Check thread id max
2180*53ee8cc1Swenshuai.xi     if(_u16ThreadID == HAL_CRYPTODMA_THREAD_ID_MAX)
2181*53ee8cc1Swenshuai.xi     {
2182*53ee8cc1Swenshuai.xi         _u16ThreadID = 1;
2183*53ee8cc1Swenshuai.xi     }
2184*53ee8cc1Swenshuai.xi     else
2185*53ee8cc1Swenshuai.xi     {
2186*53ee8cc1Swenshuai.xi         _u16ThreadID++;
2187*53ee8cc1Swenshuai.xi     }
2188*53ee8cc1Swenshuai.xi 
2189*53ee8cc1Swenshuai.xi HASHHMAC_FINISH:
2190*53ee8cc1Swenshuai.xi 
2191*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
2192*53ee8cc1Swenshuai.xi 
2193*53ee8cc1Swenshuai.xi     if(ret != DRV_CIPHER_OK)
2194*53ee8cc1Swenshuai.xi     {
2195*53ee8cc1Swenshuai.xi         MsOS_ReleaseSemaphore(_CipherSemaphore);
2196*53ee8cc1Swenshuai.xi     }
2197*53ee8cc1Swenshuai.xi 
2198*53ee8cc1Swenshuai.xi     return ret;
2199*53ee8cc1Swenshuai.xi }
2200*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_KeyCtrl(MS_BOOL bEnable)2201*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_KeyCtrl(MS_BOOL bEnable)
2202*53ee8cc1Swenshuai.xi {
2203*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2204*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
2205*53ee8cc1Swenshuai.xi 
2206*53ee8cc1Swenshuai.xi     DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
2207*53ee8cc1Swenshuai.xi 
2208*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
2209*53ee8cc1Swenshuai.xi 
2210*53ee8cc1Swenshuai.xi     if(bEnable)
2211*53ee8cc1Swenshuai.xi     {
2212*53ee8cc1Swenshuai.xi         for(i = 0;i < HAL_CRYPTODMA_DMA_KEY_SLOT;i++)
2213*53ee8cc1Swenshuai.xi         {
2214*53ee8cc1Swenshuai.xi             memset(&_CIPHER_Resource[i], 0, sizeof(CIPHER_RESOURCE));
2215*53ee8cc1Swenshuai.xi         }
2216*53ee8cc1Swenshuai.xi 
2217*53ee8cc1Swenshuai.xi         _bCIPHERDrv_KeyCtrlEn = TRUE;
2218*53ee8cc1Swenshuai.xi     }
2219*53ee8cc1Swenshuai.xi     else
2220*53ee8cc1Swenshuai.xi     {
2221*53ee8cc1Swenshuai.xi         for(i = 0;i < HAL_CRYPTODMA_DMA_KEY_SLOT;i++)
2222*53ee8cc1Swenshuai.xi         {
2223*53ee8cc1Swenshuai.xi             memset(&_CIPHER_Resource[i], 0, sizeof(CIPHER_RESOURCE));
2224*53ee8cc1Swenshuai.xi         }
2225*53ee8cc1Swenshuai.xi 
2226*53ee8cc1Swenshuai.xi         _bCIPHERDrv_KeyCtrlEn = FALSE;
2227*53ee8cc1Swenshuai.xi     }
2228*53ee8cc1Swenshuai.xi 
2229*53ee8cc1Swenshuai.xi     DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Key slot control mode[%d]", _bCIPHERDrv_KeyCtrlEn);
2230*53ee8cc1Swenshuai.xi 
2231*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
2232*53ee8cc1Swenshuai.xi 
2233*53ee8cc1Swenshuai.xi     return ret;
2234*53ee8cc1Swenshuai.xi }
2235*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_Alloc(MS_U32 * pu32CipherId)2236*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_Alloc(MS_U32 *pu32CipherId)
2237*53ee8cc1Swenshuai.xi {
2238*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2239*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
2240*53ee8cc1Swenshuai.xi 
2241*53ee8cc1Swenshuai.xi     DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
2242*53ee8cc1Swenshuai.xi     DRV_CIPHER_KEYCTRL_CHECK(DRV_CIPHER_FAIL);
2243*53ee8cc1Swenshuai.xi 
2244*53ee8cc1Swenshuai.xi     if(NULL == pu32CipherId)
2245*53ee8cc1Swenshuai.xi     {
2246*53ee8cc1Swenshuai.xi         DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Cipher Id is NULL!");
2247*53ee8cc1Swenshuai.xi         return DRV_CIPHER_BAD_PARAM;
2248*53ee8cc1Swenshuai.xi     }
2249*53ee8cc1Swenshuai.xi 
2250*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
2251*53ee8cc1Swenshuai.xi 
2252*53ee8cc1Swenshuai.xi     for(i = 0;i < HAL_CRYPTODMA_DMA_KEY_SLOT;i++)
2253*53ee8cc1Swenshuai.xi     {
2254*53ee8cc1Swenshuai.xi         if(FALSE == _CIPHER_Resource[i].bUsed)
2255*53ee8cc1Swenshuai.xi         {
2256*53ee8cc1Swenshuai.xi             _CIPHER_Resource[i].bUsed = TRUE;
2257*53ee8cc1Swenshuai.xi             *pu32CipherId = i;
2258*53ee8cc1Swenshuai.xi             DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Allocate Cipher Id[%u]", i);
2259*53ee8cc1Swenshuai.xi             goto CIPHER_ALLOC_DONE;
2260*53ee8cc1Swenshuai.xi         }
2261*53ee8cc1Swenshuai.xi     }
2262*53ee8cc1Swenshuai.xi 
2263*53ee8cc1Swenshuai.xi     ret = DRV_CIPHER_FAIL;
2264*53ee8cc1Swenshuai.xi     DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Allocate Cipher Id fail");
2265*53ee8cc1Swenshuai.xi 
2266*53ee8cc1Swenshuai.xi CIPHER_ALLOC_DONE:
2267*53ee8cc1Swenshuai.xi 
2268*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
2269*53ee8cc1Swenshuai.xi     return ret;
2270*53ee8cc1Swenshuai.xi 
2271*53ee8cc1Swenshuai.xi }
2272*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_Free(MS_U32 u32CipherId)2273*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_Free(MS_U32 u32CipherId)
2274*53ee8cc1Swenshuai.xi {
2275*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2276*53ee8cc1Swenshuai.xi 
2277*53ee8cc1Swenshuai.xi     DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
2278*53ee8cc1Swenshuai.xi     DRV_CIPHER_KEYCTRL_CHECK(DRV_CIPHER_FAIL);
2279*53ee8cc1Swenshuai.xi 
2280*53ee8cc1Swenshuai.xi     if(HAL_CRYPTODMA_DMA_KEY_SLOT <= u32CipherId)
2281*53ee8cc1Swenshuai.xi     {
2282*53ee8cc1Swenshuai.xi         DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Invalid Cipher Id[%u]!", u32CipherId);
2283*53ee8cc1Swenshuai.xi         return DRV_CIPHER_BAD_PARAM;
2284*53ee8cc1Swenshuai.xi     }
2285*53ee8cc1Swenshuai.xi 
2286*53ee8cc1Swenshuai.xi     u32CipherId %= HAL_CRYPTODMA_DMA_KEY_SLOT;
2287*53ee8cc1Swenshuai.xi 
2288*53ee8cc1Swenshuai.xi     if(FALSE == _CIPHER_Resource[u32CipherId].bUsed)
2289*53ee8cc1Swenshuai.xi     {
2290*53ee8cc1Swenshuai.xi         DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_WARN, "Warning:Not used Cipher Id[%u]!", u32CipherId);
2291*53ee8cc1Swenshuai.xi         return DRV_CIPHER_BAD_PARAM;
2292*53ee8cc1Swenshuai.xi     }
2293*53ee8cc1Swenshuai.xi 
2294*53ee8cc1Swenshuai.xi     if(E_CIPHER_KSRC_KL == _CIPHER_Resource[u32CipherId].stConfig.stKey.eKeySrc)
2295*53ee8cc1Swenshuai.xi     {
2296*53ee8cc1Swenshuai.xi         if(DRV_CIPHER_OK != MDrv_CIPHER_ResetKey(_CIPHER_Resource[u32CipherId].stConfig.u32CAVid, _CIPHER_Resource[u32CipherId].stConfig.stKey.u8KeyIdx))
2297*53ee8cc1Swenshuai.xi         {
2298*53ee8cc1Swenshuai.xi             DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Reset key slot fail!");
2299*53ee8cc1Swenshuai.xi             return DRV_CIPHER_FAIL;
2300*53ee8cc1Swenshuai.xi 
2301*53ee8cc1Swenshuai.xi         }
2302*53ee8cc1Swenshuai.xi     }
2303*53ee8cc1Swenshuai.xi 
2304*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
2305*53ee8cc1Swenshuai.xi 
2306*53ee8cc1Swenshuai.xi     memset(&_CIPHER_Resource[u32CipherId], 0, sizeof(CIPHER_RESOURCE));
2307*53ee8cc1Swenshuai.xi     DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Free Cipher Id[%u]", u32CipherId);
2308*53ee8cc1Swenshuai.xi 
2309*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
2310*53ee8cc1Swenshuai.xi 
2311*53ee8cc1Swenshuai.xi     return ret;
2312*53ee8cc1Swenshuai.xi }
2313*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_DMAConfigure(MS_U32 u32CipherId,DRV_CIPHER_DMACFG stCfg)2314*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_DMAConfigure(MS_U32 u32CipherId, DRV_CIPHER_DMACFG stCfg)
2315*53ee8cc1Swenshuai.xi {
2316*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2317*53ee8cc1Swenshuai.xi 
2318*53ee8cc1Swenshuai.xi     DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
2319*53ee8cc1Swenshuai.xi     DRV_CIPHER_KEYCTRL_CHECK(DRV_CIPHER_FAIL);
2320*53ee8cc1Swenshuai.xi 
2321*53ee8cc1Swenshuai.xi     if(HAL_CRYPTODMA_DMA_KEY_SLOT <= u32CipherId)
2322*53ee8cc1Swenshuai.xi     {
2323*53ee8cc1Swenshuai.xi         DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Invalid Cipher Id[%u]!", u32CipherId);
2324*53ee8cc1Swenshuai.xi         return DRV_CIPHER_BAD_PARAM;
2325*53ee8cc1Swenshuai.xi     }
2326*53ee8cc1Swenshuai.xi 
2327*53ee8cc1Swenshuai.xi     u32CipherId %= HAL_CRYPTODMA_DMA_KEY_SLOT;
2328*53ee8cc1Swenshuai.xi 
2329*53ee8cc1Swenshuai.xi     if(FALSE == _CIPHER_Resource[u32CipherId].bUsed)
2330*53ee8cc1Swenshuai.xi     {
2331*53ee8cc1Swenshuai.xi        DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Not used Cipher Id[%u]!", u32CipherId);
2332*53ee8cc1Swenshuai.xi        return DRV_CIPHER_BAD_PARAM;
2333*53ee8cc1Swenshuai.xi     }
2334*53ee8cc1Swenshuai.xi 
2335*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
2336*53ee8cc1Swenshuai.xi 
2337*53ee8cc1Swenshuai.xi     if(0 != stCfg.u32CAVid)
2338*53ee8cc1Swenshuai.xi     {
2339*53ee8cc1Swenshuai.xi         _CIPHER_Resource[u32CipherId].stConfig.u32CAVid = stCfg.u32CAVid;
2340*53ee8cc1Swenshuai.xi         DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "INFO:Set CAVid [0x%x]", (unsigned int)stCfg.u32CAVid);
2341*53ee8cc1Swenshuai.xi     }
2342*53ee8cc1Swenshuai.xi 
2343*53ee8cc1Swenshuai.xi     //Update Algorithm and Encrypt/Decrypt operation
2344*53ee8cc1Swenshuai.xi     if(0 != stCfg.stAlgo.eMainAlgo || 0 != stCfg.stAlgo.eSubAlgo || 0 != stCfg.stAlgo.eResAlgo || 0 != stCfg.stAlgo.eSBAlgo)
2345*53ee8cc1Swenshuai.xi     {
2346*53ee8cc1Swenshuai.xi         _CIPHER_Resource[u32CipherId].stConfig.stAlgo = stCfg.stAlgo;
2347*53ee8cc1Swenshuai.xi         _CIPHER_Resource[u32CipherId].stConfig.bDecrypt = stCfg.bDecrypt;
2348*53ee8cc1Swenshuai.xi         DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "INFO:Set algorithm: MAIN[%d], SUB[%d], RES[%d], SB[%d]",
2349*53ee8cc1Swenshuai.xi         stCfg.stAlgo.eMainAlgo, stCfg.stAlgo.eSubAlgo, stCfg.stAlgo.eResAlgo, stCfg.stAlgo.eSBAlgo);
2350*53ee8cc1Swenshuai.xi     }
2351*53ee8cc1Swenshuai.xi 
2352*53ee8cc1Swenshuai.xi     if(0 != stCfg.stInput.u32Addr || 0 != stCfg.stInput.u32Size || 0 != stCfg.stInput.eMemoryType)
2353*53ee8cc1Swenshuai.xi     {
2354*53ee8cc1Swenshuai.xi         _CIPHER_Resource[u32CipherId].stConfig.stInput = stCfg.stInput;
2355*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Input address [0x%08x], size[%u]",
2356*53ee8cc1Swenshuai.xi         (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size);
2357*53ee8cc1Swenshuai.xi     }
2358*53ee8cc1Swenshuai.xi 
2359*53ee8cc1Swenshuai.xi     if(0 != stCfg.stOutput.u32Addr || 0 != stCfg.stOutput.u32Size || 0 != stCfg.stOutput.eMemoryType)
2360*53ee8cc1Swenshuai.xi     {
2361*53ee8cc1Swenshuai.xi         _CIPHER_Resource[u32CipherId].stConfig.stOutput = stCfg.stOutput;
2362*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Set Output address [0x%08x], size[%u]",
2363*53ee8cc1Swenshuai.xi         (unsigned int)stCfg.stOutput.u32Addr, stCfg.stOutput.u32Size);
2364*53ee8cc1Swenshuai.xi     }
2365*53ee8cc1Swenshuai.xi 
2366*53ee8cc1Swenshuai.xi     if(0 != stCfg.stKey.eKeySrc || 0 != stCfg.stKey.u8KeyIdx || NULL != stCfg.stKey.pu8KeyData)
2367*53ee8cc1Swenshuai.xi     {
2368*53ee8cc1Swenshuai.xi         if(E_CIPHER_KSRC_CPU == stCfg.stKey.eKeySrc)
2369*53ee8cc1Swenshuai.xi         {
2370*53ee8cc1Swenshuai.xi             if(NULL != stCfg.stKey.pu8KeyData && 0 != stCfg.stKey.u8KeyLen)
2371*53ee8cc1Swenshuai.xi             {
2372*53ee8cc1Swenshuai.xi                 memset(&_CIPHER_Resource[u32CipherId].u8Key, 0, HAL_CRYPTODMA_KEYLEN_MAX);
2373*53ee8cc1Swenshuai.xi                 memcpy(&_CIPHER_Resource[u32CipherId].u8Key, (MS_U8 *)stCfg.stKey.pu8KeyData, stCfg.stKey.u8KeyLen);
2374*53ee8cc1Swenshuai.xi 
2375*53ee8cc1Swenshuai.xi                 _CIPHER_Resource[u32CipherId].stConfig.stKey.eKeySrc = E_CIPHER_KSRC_CPU;
2376*53ee8cc1Swenshuai.xi                 _CIPHER_Resource[u32CipherId].stConfig.stKey.pu8KeyData = _CIPHER_Resource[u32CipherId].u8Key;
2377*53ee8cc1Swenshuai.xi                 _CIPHER_Resource[u32CipherId].stConfig.stKey.u8KeyLen = stCfg.stKey.u8KeyLen;
2378*53ee8cc1Swenshuai.xi                 DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Set ACPU key in CipherId[%u]", u32CipherId);
2379*53ee8cc1Swenshuai.xi             }
2380*53ee8cc1Swenshuai.xi             else
2381*53ee8cc1Swenshuai.xi             {
2382*53ee8cc1Swenshuai.xi                 DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Key is NULL!");
2383*53ee8cc1Swenshuai.xi                 ret = DRV_CIPHER_BAD_PARAM;
2384*53ee8cc1Swenshuai.xi                 goto DMA_CONFIGURE_DONE;
2385*53ee8cc1Swenshuai.xi             }
2386*53ee8cc1Swenshuai.xi         }
2387*53ee8cc1Swenshuai.xi 
2388*53ee8cc1Swenshuai.xi         if(E_CIPHER_KSRC_KL == stCfg.stKey.eKeySrc)
2389*53ee8cc1Swenshuai.xi         {
2390*53ee8cc1Swenshuai.xi             _CIPHER_Resource[u32CipherId].stConfig.stKey.eKeySrc = E_CIPHER_KSRC_KL;
2391*53ee8cc1Swenshuai.xi             _CIPHER_Resource[u32CipherId].stConfig.stKey.u8KeyIdx = (MS_U8)u32CipherId;
2392*53ee8cc1Swenshuai.xi             DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Set KL index in CipherId[%u]", u32CipherId);
2393*53ee8cc1Swenshuai.xi         }
2394*53ee8cc1Swenshuai.xi 
2395*53ee8cc1Swenshuai.xi         if(E_CIPHER_KSRC_OTP == stCfg.stKey.eKeySrc)
2396*53ee8cc1Swenshuai.xi         {
2397*53ee8cc1Swenshuai.xi             _CIPHER_Resource[u32CipherId].stConfig.stKey.eKeySrc = E_CIPHER_KSRC_OTP;
2398*53ee8cc1Swenshuai.xi             _CIPHER_Resource[u32CipherId].stConfig.stKey.u8KeyIdx = stCfg.stKey.u8KeyIdx;
2399*53ee8cc1Swenshuai.xi             DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Set OTP key index in CipherId[%u]", u32CipherId);
2400*53ee8cc1Swenshuai.xi         }
2401*53ee8cc1Swenshuai.xi 
2402*53ee8cc1Swenshuai.xi         if(E_CIPHER_KSRC_CAIP == stCfg.stKey.eKeySrc)
2403*53ee8cc1Swenshuai.xi         {
2404*53ee8cc1Swenshuai.xi             _CIPHER_Resource[u32CipherId].stConfig.stKey.eKeySrc = E_CIPHER_KSRC_CAIP;
2405*53ee8cc1Swenshuai.xi             DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Set CAIP key in CipherId[%u]", u32CipherId);
2406*53ee8cc1Swenshuai.xi         }
2407*53ee8cc1Swenshuai.xi 
2408*53ee8cc1Swenshuai.xi     }
2409*53ee8cc1Swenshuai.xi 
2410*53ee8cc1Swenshuai.xi     if(NULL != stCfg.stKey.pu8IVData && 0 != stCfg.stKey.u8IVLen)
2411*53ee8cc1Swenshuai.xi     {
2412*53ee8cc1Swenshuai.xi         memset(&_CIPHER_Resource[u32CipherId].u8IV, 0, HAL_CRYPTODMA_KEYLEN_MAX);
2413*53ee8cc1Swenshuai.xi         memcpy(&_CIPHER_Resource[u32CipherId].u8IV, (MS_U8 *)stCfg.stKey.pu8IVData, stCfg.stKey.u8IVLen);
2414*53ee8cc1Swenshuai.xi         _CIPHER_Resource[u32CipherId].stConfig.stKey.pu8IVData = _CIPHER_Resource[u32CipherId].u8IV;
2415*53ee8cc1Swenshuai.xi         _CIPHER_Resource[u32CipherId].stConfig.stKey.u8IVLen = stCfg.stKey.u8IVLen;
2416*53ee8cc1Swenshuai.xi         DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "Set IV in CipherId[%u]", u32CipherId);
2417*53ee8cc1Swenshuai.xi     }
2418*53ee8cc1Swenshuai.xi 
2419*53ee8cc1Swenshuai.xi DMA_CONFIGURE_DONE:
2420*53ee8cc1Swenshuai.xi 
2421*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
2422*53ee8cc1Swenshuai.xi     return ret;
2423*53ee8cc1Swenshuai.xi 
2424*53ee8cc1Swenshuai.xi }
2425*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_DMAStart(MS_U32 u32CipherId,MS_U32 * pu32CmdId)2426*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_DMAStart(MS_U32 u32CipherId, MS_U32 *pu32CmdId)
2427*53ee8cc1Swenshuai.xi {
2428*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2429*53ee8cc1Swenshuai.xi     DRV_CIPHER_DMACFG stCfg;
2430*53ee8cc1Swenshuai.xi 
2431*53ee8cc1Swenshuai.xi     DRV_CIPHER_INIT_CHECK(DRV_CIPHER_FAIL);
2432*53ee8cc1Swenshuai.xi     DRV_CIPHER_KEYCTRL_CHECK(DRV_CIPHER_FAIL);
2433*53ee8cc1Swenshuai.xi 
2434*53ee8cc1Swenshuai.xi     if(HAL_CRYPTODMA_DMA_KEY_SLOT <= u32CipherId)
2435*53ee8cc1Swenshuai.xi     {
2436*53ee8cc1Swenshuai.xi         DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Invalid Cipher Id[%u]!", u32CipherId);
2437*53ee8cc1Swenshuai.xi         return DRV_CIPHER_BAD_PARAM;
2438*53ee8cc1Swenshuai.xi     }
2439*53ee8cc1Swenshuai.xi 
2440*53ee8cc1Swenshuai.xi     u32CipherId %= HAL_CRYPTODMA_DMA_KEY_SLOT;
2441*53ee8cc1Swenshuai.xi 
2442*53ee8cc1Swenshuai.xi     if(FALSE == _CIPHER_Resource[u32CipherId].bUsed)
2443*53ee8cc1Swenshuai.xi     {
2444*53ee8cc1Swenshuai.xi        DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:Not used Cipher Id[%u]!", u32CipherId);
2445*53ee8cc1Swenshuai.xi        return DRV_CIPHER_BAD_PARAM;
2446*53ee8cc1Swenshuai.xi     }
2447*53ee8cc1Swenshuai.xi 
2448*53ee8cc1Swenshuai.xi     if(pu32CmdId == NULL)
2449*53ee8cc1Swenshuai.xi     {
2450*53ee8cc1Swenshuai.xi         DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_ERR, "Error:DMA CmdId is NULL!");
2451*53ee8cc1Swenshuai.xi         return DRV_CIPHER_BAD_PARAM;
2452*53ee8cc1Swenshuai.xi     }
2453*53ee8cc1Swenshuai.xi 
2454*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
2455*53ee8cc1Swenshuai.xi 
2456*53ee8cc1Swenshuai.xi     memset(&stCfg, 0 , sizeof(DRV_CIPHER_DMACFG));
2457*53ee8cc1Swenshuai.xi 
2458*53ee8cc1Swenshuai.xi     stCfg = _CIPHER_Resource[u32CipherId].stConfig;
2459*53ee8cc1Swenshuai.xi 
2460*53ee8cc1Swenshuai.xi     DEBUG_CIPHER_KEYCTRL(CIPHER_DBG_INFO, "DMA use CipherId[%u]", u32CipherId);
2461*53ee8cc1Swenshuai.xi 
2462*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
2463*53ee8cc1Swenshuai.xi 
2464*53ee8cc1Swenshuai.xi     ret = MDrv_CIPHER_DMACalc(stCfg, pu32CmdId);
2465*53ee8cc1Swenshuai.xi 
2466*53ee8cc1Swenshuai.xi     return ret;
2467*53ee8cc1Swenshuai.xi 
2468*53ee8cc1Swenshuai.xi }
2469*53ee8cc1Swenshuai.xi 
2470*53ee8cc1Swenshuai.xi 
2471*53ee8cc1Swenshuai.xi #if 0
2472*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_DMAParser(CIPHER_PARSERCFG stParserCfg, MS_U32 *pu32CmdId)
2473*53ee8cc1Swenshuai.xi {
2474*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2475*53ee8cc1Swenshuai.xi     HAL_CIPHER_INTMODE eIntMode = E_DMA_INT_NONE;
2476*53ee8cc1Swenshuai.xi     MS_U8  u8BufNum  = 0;
2477*53ee8cc1Swenshuai.xi 
2478*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
2479*53ee8cc1Swenshuai.xi 
2480*53ee8cc1Swenshuai.xi     //==============Obtain Semaphore==============
2481*53ee8cc1Swenshuai.xi     MsOS_ObtainSemaphore(_CipherSemaphore, MSOS_WAIT_FOREVER);
2482*53ee8cc1Swenshuai.xi 
2483*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_CipherMtx, MSOS_WAIT_FOREVER);
2484*53ee8cc1Swenshuai.xi 
2485*53ee8cc1Swenshuai.xi     //Check data size
2486*53ee8cc1Swenshuai.xi     if((stParserCfg.stInput.u32Size == 0) || (stParserCfg.stOutput.u32Size == 0))
2487*53ee8cc1Swenshuai.xi     {
2488*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA data size is zero!\n");
2489*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
2490*53ee8cc1Swenshuai.xi         goto PARSER_FINISH;
2491*53ee8cc1Swenshuai.xi     }
2492*53ee8cc1Swenshuai.xi 
2493*53ee8cc1Swenshuai.xi     if(pu32CmdId == NULL)
2494*53ee8cc1Swenshuai.xi     {
2495*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:DMA CmdId is NULL!\n");
2496*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
2497*53ee8cc1Swenshuai.xi         goto PARSER_FINISH;
2498*53ee8cc1Swenshuai.xi     }
2499*53ee8cc1Swenshuai.xi 
2500*53ee8cc1Swenshuai.xi     HAL_CIPHER_ResetStatus(TRUE , FALSE ) ;
2501*53ee8cc1Swenshuai.xi 
2502*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "Set CAVid [0x%x]\n", (unsigned int)stParserCfg.u32CAVid);
2503*53ee8cc1Swenshuai.xi 
2504*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_DMA_Set_CaVid(stParserCfg.u32CAVid))
2505*53ee8cc1Swenshuai.xi     {
2506*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_BAD_PARAM;
2507*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error: Set CAVid [0x%x]fail!\n", (unsigned int)stParserCfg.u32CAVid);
2508*53ee8cc1Swenshuai.xi         goto PARSER_FINISH;
2509*53ee8cc1Swenshuai.xi     }
2510*53ee8cc1Swenshuai.xi 
2511*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_Algo( stParserCfg.stAlgo);
2512*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_Key ( stParserCfg.stKey);
2513*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_IV(stParserCfg.stKey.pu8IVData, stParserCfg.stKey.u8IVLen);
2514*53ee8cc1Swenshuai.xi 
2515*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "Set algorithm: MAIN[%d], SUB[%d], RES[%d], SB[%d]\n"
2516*53ee8cc1Swenshuai.xi             ,stParserCfg.stAlgo.eMainAlgo, stParserCfg.stAlgo.eSubAlgo, stParserCfg.stAlgo.eResAlgo, stParserCfg.stAlgo.eSBAlgo);
2517*53ee8cc1Swenshuai.xi 
2518*53ee8cc1Swenshuai.xi 	// need to call DMA_Set_InputSrcFrom and DMA_Set_OutputDstTo
2519*53ee8cc1Swenshuai.xi 	// before call  DMA_Set_FileinDesc and DMA_Set_FileoutDesc
2520*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_InputSrcFrom(stParserCfg.stInput.eMemoryType, NULL, 0);
2521*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_OutputDstTo(stParserCfg.stOutput.eMemoryType, NULL, 0);
2522*53ee8cc1Swenshuai.xi 
2523*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "Set Input source from [%d], Output source from [%d]\n",
2524*53ee8cc1Swenshuai.xi             stParserCfg.stInput.eMemoryType, stParserCfg.stOutput.eMemoryType);
2525*53ee8cc1Swenshuai.xi 
2526*53ee8cc1Swenshuai.xi     // Set File-in Addr //
2527*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_FileinDesc ( stParserCfg.stInput.u32Addr, stParserCfg.stInput.u32Size);
2528*53ee8cc1Swenshuai.xi     HAL_CIPHER_DMA_Set_FileoutDesc( stParserCfg.stOutput.u32Addr, stParserCfg.stOutput.u32Addr + stParserCfg.stOutput.u32Size - 1);
2529*53ee8cc1Swenshuai.xi 
2530*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "Set Input address [0x%08x], size[%u], Output address [0x%08x], size[%u]\n",
2531*53ee8cc1Swenshuai.xi            (unsigned int)stParserCfg.stInput.u32Addr, stParserCfg.stInput.u32Size, (unsigned int)stParserCfg.stOutput.u32Addr, stParserCfg.stOutput.u32Size);
2532*53ee8cc1Swenshuai.xi 
2533*53ee8cc1Swenshuai.xi     // Set Hardware Parser
2534*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_Set_Mode(stParserCfg.eParserMode);
2535*53ee8cc1Swenshuai.xi 
2536*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_Set_PID(stParserCfg.stPID);
2537*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_Set_SCB(stParserCfg.stTSCfg.eSCB);
2538*53ee8cc1Swenshuai.xi 
2539*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_Set_ForceSCB(stParserCfg.stTSCfg.bInScrb, stParserCfg.stTSCfg.eFSCB);
2540*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_Rmv_SCB(stParserCfg.stTSCfg.bRmvScrb);
2541*53ee8cc1Swenshuai.xi 
2542*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_Set_MaskSCB(stParserCfg.stTSCfg.bTsScrbMask);
2543*53ee8cc1Swenshuai.xi 
2544*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_Set_Key2(stParserCfg.stKey2);
2545*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_Set_IV2(stParserCfg.stKey2.pu8IVData, stParserCfg.stKey2.u8IVLen);
2546*53ee8cc1Swenshuai.xi 
2547*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_Set_ClearHeaderMode(stParserCfg.bClearHead);
2548*53ee8cc1Swenshuai.xi 
2549*53ee8cc1Swenshuai.xi     //Check report buffer
2550*53ee8cc1Swenshuai.xi     u8BufNum = (MS_U8)(_u16ThreadID % (MS_U16)CIPHER_REPORT_BUFFER_MAX);
2551*53ee8cc1Swenshuai.xi 
2552*53ee8cc1Swenshuai.xi     //Report buffer already used
2553*53ee8cc1Swenshuai.xi     if(_CIPHER_ReportBuffer[u8BufNum].bUsed == TRUE)
2554*53ee8cc1Swenshuai.xi     {
2555*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:CIPHER report buffer is used!\n");
2556*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_NO_REPORT_BUFFER;
2557*53ee8cc1Swenshuai.xi         goto PARSER_FINISH;
2558*53ee8cc1Swenshuai.xi     }
2559*53ee8cc1Swenshuai.xi 
2560*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32Report    = 0;
2561*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].u32DoneBytes = 0;
2562*53ee8cc1Swenshuai.xi     _CIPHER_ReportBuffer[u8BufNum].bUsed        = TRUE;
2563*53ee8cc1Swenshuai.xi 
2564*53ee8cc1Swenshuai.xi 
2565*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
2566*53ee8cc1Swenshuai.xi 
2567*53ee8cc1Swenshuai.xi     _eCipherWait = E_CIPHER_DMA_DONE;
2568*53ee8cc1Swenshuai.xi 
2569*53ee8cc1Swenshuai.xi     if(stParserCfg.pfCallback != NULL)
2570*53ee8cc1Swenshuai.xi     {
2571*53ee8cc1Swenshuai.xi         _CIPHER_ReportBuffer[u8BufNum].pfCallback = stParserCfg.pfCallback;
2572*53ee8cc1Swenshuai.xi         eIntMode = E_DMA_INT_ENABLE;
2573*53ee8cc1Swenshuai.xi     }
2574*53ee8cc1Swenshuai.xi #endif
2575*53ee8cc1Swenshuai.xi 
2576*53ee8cc1Swenshuai.xi     if(FALSE == HAL_CIPHER_DMA_Start(stParserCfg.bDecrypt, eIntMode , TRUE , _u16ThreadID))
2577*53ee8cc1Swenshuai.xi     {
2578*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:PARSER Fail!\n");
2579*53ee8cc1Swenshuai.xi         ret =  DRV_CIPHER_FAIL;
2580*53ee8cc1Swenshuai.xi         goto PARSER_FINISH;
2581*53ee8cc1Swenshuai.xi     }
2582*53ee8cc1Swenshuai.xi 
2583*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "IntMode[%d], CmdId[%hu]\n", eIntMode, _u16ThreadID);
2584*53ee8cc1Swenshuai.xi 
2585*53ee8cc1Swenshuai.xi     *pu32CmdId = (MS_U32)_u16ThreadID;
2586*53ee8cc1Swenshuai.xi 
2587*53ee8cc1Swenshuai.xi     _u16ThreadID++;
2588*53ee8cc1Swenshuai.xi 
2589*53ee8cc1Swenshuai.xi PARSER_FINISH:
2590*53ee8cc1Swenshuai.xi 
2591*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherMtx);
2592*53ee8cc1Swenshuai.xi 
2593*53ee8cc1Swenshuai.xi     if(ret != DRV_CIPHER_OK)
2594*53ee8cc1Swenshuai.xi     {
2595*53ee8cc1Swenshuai.xi         MsOS_ReleaseSemaphore(_CipherSemaphore);
2596*53ee8cc1Swenshuai.xi     }
2597*53ee8cc1Swenshuai.xi 
2598*53ee8cc1Swenshuai.xi     return ret;
2599*53ee8cc1Swenshuai.xi 
2600*53ee8cc1Swenshuai.xi }
2601*53ee8cc1Swenshuai.xi #endif
2602*53ee8cc1Swenshuai.xi 
2603*53ee8cc1Swenshuai.xi #ifdef ENABLE_BGC
MDrv_CIPHER_BGC_Enable(MS_U32 u32EngId,MS_U32 u32Algo,MS_U8 * pu8Golden,MS_U32 u32SAddr,MS_U32 u32Size)2604*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_BGC_Enable(MS_U32 u32EngId,MS_U32 u32Algo, MS_U8 *pu8Golden, MS_U32 u32SAddr, MS_U32 u32Size)
2605*53ee8cc1Swenshuai.xi {
2606*53ee8cc1Swenshuai.xi      //Set BGC Algo
2607*53ee8cc1Swenshuai.xi      HAL_CIPHER_BGC_Algo(u32EngId, u32Algo);
2608*53ee8cc1Swenshuai.xi 
2609*53ee8cc1Swenshuai.xi      //Set BGC Period
2610*53ee8cc1Swenshuai.xi      HAL_CIPHER_BGC_Period(u32EngId, E_CIPHER_BGC_PERIOD_1MS);
2611*53ee8cc1Swenshuai.xi 
2612*53ee8cc1Swenshuai.xi      //Set BGC Range
2613*53ee8cc1Swenshuai.xi      HAL_CIPHER_BGC_Range(u32EngId, u32SAddr, (u32SAddr + u32Size-1) );
2614*53ee8cc1Swenshuai.xi 
2615*53ee8cc1Swenshuai.xi      //Set BGC Golden
2616*53ee8cc1Swenshuai.xi      HAL_CIPHER_BGC_Golden(u32EngId, pu8Golden);
2617*53ee8cc1Swenshuai.xi 
2618*53ee8cc1Swenshuai.xi      //Set BGC Enable
2619*53ee8cc1Swenshuai.xi      HAL_CIPHER_BGC_Start(u32EngId, TRUE);
2620*53ee8cc1Swenshuai.xi 
2621*53ee8cc1Swenshuai.xi 
2622*53ee8cc1Swenshuai.xi     return 0;
2623*53ee8cc1Swenshuai.xi }
2624*53ee8cc1Swenshuai.xi 
MDrv_CIPHER_BGC_Check(MS_U32 u32EngId,MS_BOOL * bOK)2625*53ee8cc1Swenshuai.xi DLL_PUBLIC DRV_CIPHER_RET MDrv_CIPHER_BGC_Check(MS_U32 u32EngId, MS_BOOL *bOK)
2626*53ee8cc1Swenshuai.xi {
2627*53ee8cc1Swenshuai.xi     if(HAL_CIPHER_BGC_Check(u32EngId) == FALSE)
2628*53ee8cc1Swenshuai.xi     {
2629*53ee8cc1Swenshuai.xi         *bOK = FALSE;
2630*53ee8cc1Swenshuai.xi     }
2631*53ee8cc1Swenshuai.xi     else
2632*53ee8cc1Swenshuai.xi     {
2633*53ee8cc1Swenshuai.xi         *bOK = TRUE;
2634*53ee8cc1Swenshuai.xi     }
2635*53ee8cc1Swenshuai.xi     return 0;
2636*53ee8cc1Swenshuai.xi }
2637*53ee8cc1Swenshuai.xi 
2638*53ee8cc1Swenshuai.xi #endif
2639*53ee8cc1Swenshuai.xi //////////////////////////////////////////////////////////////////
2640*53ee8cc1Swenshuai.xi static DRV_CIPHER_KEY _CipherKey = {
2641*53ee8cc1Swenshuai.xi         E_CIPHER_KSRC_CPU,
2642*53ee8cc1Swenshuai.xi             0,
2643*53ee8cc1Swenshuai.xi             0,
2644*53ee8cc1Swenshuai.xi             0,
2645*53ee8cc1Swenshuai.xi             0,
2646*53ee8cc1Swenshuai.xi             0
2647*53ee8cc1Swenshuai.xi };
2648*53ee8cc1Swenshuai.xi static MS_BOOL _isDecrypt = TRUE;
2649*53ee8cc1Swenshuai.xi static DRV_CIPHER_ALGO _stAlgo = {0};
2650*53ee8cc1Swenshuai.xi static DRV_CIPHER_DATA _stInput  = {0};
2651*53ee8cc1Swenshuai.xi static DRV_CIPHER_DATA _stOutput = {0};
2652*53ee8cc1Swenshuai.xi static MS_U32 _RetId = 0;
2653*53ee8cc1Swenshuai.xi static MS_U8 _u8IV[16] = {0};
2654*53ee8cc1Swenshuai.xi static MS_U8 _u8Key[16] = {0};
2655*53ee8cc1Swenshuai.xi static MS_U8 _u8ZeroData[16] = {0};
2656*53ee8cc1Swenshuai.xi static MS_U32 _u32CAVid = 0x0F;
2657*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_InitBySWFlag(MS_BOOL bSWInit)2658*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_InitBySWFlag(MS_BOOL bSWInit)
2659*53ee8cc1Swenshuai.xi {
2660*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2661*53ee8cc1Swenshuai.xi 
2662*53ee8cc1Swenshuai.xi     ret = _MDrv_CIPHER_InitBySWFlag(bSWInit);
2663*53ee8cc1Swenshuai.xi 
2664*53ee8cc1Swenshuai.xi     if(DRV_CIPHER_OK != ret)
2665*53ee8cc1Swenshuai.xi     {
2666*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:_MDrv_CIPHER_InitBySWFlag fail");
2667*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
2668*53ee8cc1Swenshuai.xi     }
2669*53ee8cc1Swenshuai.xi 
2670*53ee8cc1Swenshuai.xi     // Default Key from ACPU
2671*53ee8cc1Swenshuai.xi     _CipherKey.eKeySrc = E_CIPHER_KSRC_CPU;
2672*53ee8cc1Swenshuai.xi     _CipherKey.pu8KeyData = _u8ZeroData;
2673*53ee8cc1Swenshuai.xi     _CipherKey.u8KeyLen = 16;
2674*53ee8cc1Swenshuai.xi     _CipherKey.u8KeyIdx = 0;
2675*53ee8cc1Swenshuai.xi 
2676*53ee8cc1Swenshuai.xi     //Clear IV
2677*53ee8cc1Swenshuai.xi     _CipherKey.pu8IVData = _u8ZeroData;
2678*53ee8cc1Swenshuai.xi     _CipherKey.u8IVLen = 16;
2679*53ee8cc1Swenshuai.xi 
2680*53ee8cc1Swenshuai.xi     //Clear Algo
2681*53ee8cc1Swenshuai.xi     _stAlgo.eMainAlgo = 0;
2682*53ee8cc1Swenshuai.xi     _stAlgo.eSubAlgo  = 0;
2683*53ee8cc1Swenshuai.xi     _stAlgo.eResAlgo  = 0;
2684*53ee8cc1Swenshuai.xi     _stAlgo.eSBAlgo   = 0;
2685*53ee8cc1Swenshuai.xi 
2686*53ee8cc1Swenshuai.xi     //Clear Input
2687*53ee8cc1Swenshuai.xi     _stInput.u32Addr = 0;
2688*53ee8cc1Swenshuai.xi     _stInput.u32Size = 0;
2689*53ee8cc1Swenshuai.xi     _stInput.eMemoryType = 0;
2690*53ee8cc1Swenshuai.xi 
2691*53ee8cc1Swenshuai.xi     //Clear Output
2692*53ee8cc1Swenshuai.xi     _stOutput.u32Addr = 0;
2693*53ee8cc1Swenshuai.xi     _stOutput.u32Size = 0;
2694*53ee8cc1Swenshuai.xi     _stOutput.eMemoryType = 0;
2695*53ee8cc1Swenshuai.xi 
2696*53ee8cc1Swenshuai.xi     memset(_u8Key, 0, sizeof(_u8Key));
2697*53ee8cc1Swenshuai.xi     memset(_u8IV, 0, sizeof(_u8IV));
2698*53ee8cc1Swenshuai.xi 
2699*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
2700*53ee8cc1Swenshuai.xi }
2701*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_Init(MS_PHY u32miu0addr,MS_PHY u32miu1addr,MS_U32 u32miunum)2702*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_Init(MS_PHY u32miu0addr , MS_PHY u32miu1addr , MS_U32 u32miunum)
2703*53ee8cc1Swenshuai.xi {
2704*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret = DRV_CIPHER_OK;
2705*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
2706*53ee8cc1Swenshuai.xi 
2707*53ee8cc1Swenshuai.xi     ret = MDrv_CIPHER_Init();
2708*53ee8cc1Swenshuai.xi 
2709*53ee8cc1Swenshuai.xi     for(i = 0;i < HAL_CRYPTODMA_DMA_KEY_SLOT;i++)
2710*53ee8cc1Swenshuai.xi     {
2711*53ee8cc1Swenshuai.xi         memset(&_CIPHER_Resource[i], 0, sizeof(CIPHER_RESOURCE));
2712*53ee8cc1Swenshuai.xi     }
2713*53ee8cc1Swenshuai.xi 
2714*53ee8cc1Swenshuai.xi     return ret;
2715*53ee8cc1Swenshuai.xi }
2716*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Init(MS_PHY u32miu0addr,MS_PHY u32miu1addr,MS_U32 u32miunum)2717*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Init(MS_PHY u32miu0addr , MS_PHY u32miu1addr , MS_U32 u32miunum)
2718*53ee8cc1Swenshuai.xi {
2719*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
2720*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
2721*53ee8cc1Swenshuai.xi     AESDMA_INIT pArgs;
2722*53ee8cc1Swenshuai.xi 
2723*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
2724*53ee8cc1Swenshuai.xi     {
2725*53ee8cc1Swenshuai.xi         if(UTOPIA_STATUS_FAIL == UtopiaOpen(MODULE_AESDMA, &pu32AesdmaInst, 0x0, NULL))
2726*53ee8cc1Swenshuai.xi         {
2727*53ee8cc1Swenshuai.xi             DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaOpen CIPHER fail");
2728*53ee8cc1Swenshuai.xi             return DRVAESDMA_FAIL;
2729*53ee8cc1Swenshuai.xi         }
2730*53ee8cc1Swenshuai.xi     }
2731*53ee8cc1Swenshuai.xi 
2732*53ee8cc1Swenshuai.xi     pArgs.u32miu0addr = u32miu0addr;
2733*53ee8cc1Swenshuai.xi     pArgs.u32miu1addr = u32miu1addr;
2734*53ee8cc1Swenshuai.xi     pArgs.u32miunum = u32miunum;
2735*53ee8cc1Swenshuai.xi 
2736*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_Init, (void*)&pArgs);
2737*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
2738*53ee8cc1Swenshuai.xi     {
2739*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
2740*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
2741*53ee8cc1Swenshuai.xi     }
2742*53ee8cc1Swenshuai.xi 
2743*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
2744*53ee8cc1Swenshuai.xi #else
2745*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_Init(u32miu0addr, u32miu1addr, u32miunum);
2746*53ee8cc1Swenshuai.xi #endif
2747*53ee8cc1Swenshuai.xi }
2748*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_QueryCipherMode(DrvAESDMA_CipherMode eMode)2749*53ee8cc1Swenshuai.xi DLL_PUBLIC  DRVAESDMA_RESULT MDrv_AESDMA_QueryCipherMode(DrvAESDMA_CipherMode eMode)
2750*53ee8cc1Swenshuai.xi {
2751*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
2752*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
2753*53ee8cc1Swenshuai.xi }
2754*53ee8cc1Swenshuai.xi 
2755*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_SelEng(DrvAESDMA_CipherMode eMode,MS_BOOL bDescrypt)2756*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SelEng(DrvAESDMA_CipherMode eMode, MS_BOOL bDescrypt)
2757*53ee8cc1Swenshuai.xi {
2758*53ee8cc1Swenshuai.xi     //DRV_CIPHER_ALGO stAlgo;
2759*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Cipher mode[%d], Decrypt[%d]!", eMode, bDescrypt);
2760*53ee8cc1Swenshuai.xi 
2761*53ee8cc1Swenshuai.xi     bDES_Key = FALSE;
2762*53ee8cc1Swenshuai.xi     switch(eMode)
2763*53ee8cc1Swenshuai.xi     {
2764*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_ECB:
2765*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_AES;
2766*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_ECB;
2767*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2768*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2769*53ee8cc1Swenshuai.xi             break;
2770*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_CTR:
2771*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_AES;
2772*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_CTR;
2773*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2774*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2775*53ee8cc1Swenshuai.xi             break;
2776*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_CBC:
2777*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_AES;
2778*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_CBC;
2779*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2780*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2781*53ee8cc1Swenshuai.xi             break;
2782*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_DES_ECB:
2783*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_DES;
2784*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_ECB;
2785*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2786*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2787*53ee8cc1Swenshuai.xi             bDES_Key = TRUE;
2788*53ee8cc1Swenshuai.xi             break;
2789*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_DES_CTR:
2790*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_DES;
2791*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_CTR;
2792*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2793*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2794*53ee8cc1Swenshuai.xi             bDES_Key = TRUE;
2795*53ee8cc1Swenshuai.xi             break;
2796*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_DES_CBC:
2797*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_DES;
2798*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_CBC;
2799*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2800*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2801*53ee8cc1Swenshuai.xi             bDES_Key = TRUE;
2802*53ee8cc1Swenshuai.xi             break;
2803*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_TDES_ECB:
2804*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_TDES;
2805*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_ECB;
2806*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2807*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2808*53ee8cc1Swenshuai.xi             break;
2809*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_TDES_CTR:
2810*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_TDES;
2811*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_CTR;
2812*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2813*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2814*53ee8cc1Swenshuai.xi             break;
2815*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_TDES_CBC:
2816*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_TDES;
2817*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_CBC;
2818*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CLR;
2819*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2820*53ee8cc1Swenshuai.xi             break;
2821*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_CTS_CBC:
2822*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_AES;
2823*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_CBC;
2824*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CTS;
2825*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2826*53ee8cc1Swenshuai.xi             break;
2827*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_CTS_ECB:
2828*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_AES;
2829*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_ECB;
2830*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CTS;
2831*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2832*53ee8cc1Swenshuai.xi             break;
2833*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_DES_CTS_CBC:
2834*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_DES;
2835*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_CBC;
2836*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CTS;
2837*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2838*53ee8cc1Swenshuai.xi             bDES_Key = TRUE;
2839*53ee8cc1Swenshuai.xi             break;
2840*53ee8cc1Swenshuai.xi 
2841*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_DES_CTS_ECB:
2842*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_DES;
2843*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_ECB;
2844*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CTS;
2845*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2846*53ee8cc1Swenshuai.xi             bDES_Key = TRUE;
2847*53ee8cc1Swenshuai.xi             break;
2848*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_TDES_CTS_CBC:
2849*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_TDES;
2850*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_CBC;
2851*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CTS;
2852*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2853*53ee8cc1Swenshuai.xi             break;
2854*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_CIPHER_TDES_CTS_ECB:
2855*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = E_CIPHER_MAIN_TDES;
2856*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = E_CIPHER_SUB_ECB;
2857*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = E_CIPHER_RES_CTS;
2858*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = E_CIPHER_SB_CLR;
2859*53ee8cc1Swenshuai.xi             break;
2860*53ee8cc1Swenshuai.xi         default:
2861*53ee8cc1Swenshuai.xi             _stAlgo.eMainAlgo = 0;
2862*53ee8cc1Swenshuai.xi             _stAlgo.eSubAlgo = 0;
2863*53ee8cc1Swenshuai.xi             _stAlgo.eResAlgo = 0;
2864*53ee8cc1Swenshuai.xi             _stAlgo.eSBAlgo = 0;
2865*53ee8cc1Swenshuai.xi             break;
2866*53ee8cc1Swenshuai.xi     }
2867*53ee8cc1Swenshuai.xi 
2868*53ee8cc1Swenshuai.xi     _isDecrypt = bDescrypt;
2869*53ee8cc1Swenshuai.xi 
2870*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Algo 0x%x 0x%x 0x%x 0x%x",
2871*53ee8cc1Swenshuai.xi         _stAlgo.eMainAlgo, _stAlgo.eSubAlgo,_stAlgo.eResAlgo,_stAlgo.eSBAlgo);
2872*53ee8cc1Swenshuai.xi 
2873*53ee8cc1Swenshuai.xi     return 0;
2874*53ee8cc1Swenshuai.xi }
2875*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SelEng(DrvAESDMA_CipherMode eMode,MS_BOOL bDescrypt)2876*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SelEng(DrvAESDMA_CipherMode eMode, MS_BOOL bDescrypt)
2877*53ee8cc1Swenshuai.xi {
2878*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
2879*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
2880*53ee8cc1Swenshuai.xi     AESDMA_SEL_ENG pArgs;
2881*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
2882*53ee8cc1Swenshuai.xi     {
2883*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
2884*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
2885*53ee8cc1Swenshuai.xi     }
2886*53ee8cc1Swenshuai.xi 
2887*53ee8cc1Swenshuai.xi     pArgs.eMode = eMode;
2888*53ee8cc1Swenshuai.xi     pArgs.bDescrypt = bDescrypt;
2889*53ee8cc1Swenshuai.xi 
2890*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SelEng, (void*)&pArgs);
2891*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
2892*53ee8cc1Swenshuai.xi     {
2893*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
2894*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
2895*53ee8cc1Swenshuai.xi     }
2896*53ee8cc1Swenshuai.xi 
2897*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
2898*53ee8cc1Swenshuai.xi #else
2899*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_SelEng(eMode, bDescrypt);
2900*53ee8cc1Swenshuai.xi #endif
2901*53ee8cc1Swenshuai.xi }
2902*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_SetKey_Ex(const MS_U8 * pu8Key,MS_U32 u32Len)2903*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetKey_Ex(const MS_U8 *pu8Key, MS_U32 u32Len)
2904*53ee8cc1Swenshuai.xi {
2905*53ee8cc1Swenshuai.xi 	DRVAESDMA_RESULT ret = DRVAESDMA_OK;
2906*53ee8cc1Swenshuai.xi 	if(pu8Key && (u32Len <= HAL_CRYPTODMA_KEYLEN_MAX) && (u32Len > 0))
2907*53ee8cc1Swenshuai.xi     {
2908*53ee8cc1Swenshuai.xi         // Key from ACPU
2909*53ee8cc1Swenshuai.xi         _CipherKey.eKeySrc = E_CIPHER_KSRC_CPU;
2910*53ee8cc1Swenshuai.xi 
2911*53ee8cc1Swenshuai.xi         memcpy(_u8Key, (MS_U8*)pu8Key, u32Len);
2912*53ee8cc1Swenshuai.xi         _CipherKey.pu8KeyData = _u8Key;
2913*53ee8cc1Swenshuai.xi 
2914*53ee8cc1Swenshuai.xi         _CipherKey.u8KeyLen = u32Len;
2915*53ee8cc1Swenshuai.xi         _CipherKey.u8KeyIdx = 0;
2916*53ee8cc1Swenshuai.xi     }
2917*53ee8cc1Swenshuai.xi     else
2918*53ee8cc1Swenshuai.xi     {
2919*53ee8cc1Swenshuai.xi         //Key from KL
2920*53ee8cc1Swenshuai.xi         _CipherKey.eKeySrc = E_CIPHER_KSRC_KL;
2921*53ee8cc1Swenshuai.xi         _CipherKey.pu8KeyData = 0;
2922*53ee8cc1Swenshuai.xi         _CipherKey.u8KeyLen = 0;
2923*53ee8cc1Swenshuai.xi         _CipherKey.u8KeyIdx = 0;  // always use 0
2924*53ee8cc1Swenshuai.xi     }
2925*53ee8cc1Swenshuai.xi 
2926*53ee8cc1Swenshuai.xi 	if(u32Len > HAL_CRYPTODMA_KEYLEN_MAX)
2927*53ee8cc1Swenshuai.xi     {
2928*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Invalid Key Length!");
2929*53ee8cc1Swenshuai.xi         ret = DRVAESDMA_INVALID_PARAM;
2930*53ee8cc1Swenshuai.xi     }
2931*53ee8cc1Swenshuai.xi 
2932*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Key Source[%d], Key Length[%u], Key Index[%u]",
2933*53ee8cc1Swenshuai.xi         _CipherKey.eKeySrc, _CipherKey.u8KeyLen, _CipherKey.u8KeyIdx);
2934*53ee8cc1Swenshuai.xi 
2935*53ee8cc1Swenshuai.xi     return ret;
2936*53ee8cc1Swenshuai.xi }
2937*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetKey_Ex(const MS_U8 * pu8Key,MS_U32 u32Len)2938*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetKey_Ex(const MS_U8 *pu8Key, MS_U32 u32Len)
2939*53ee8cc1Swenshuai.xi {
2940*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
2941*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
2942*53ee8cc1Swenshuai.xi     AESDMA_SET_KEY_EX pArgs;
2943*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
2944*53ee8cc1Swenshuai.xi     {
2945*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
2946*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
2947*53ee8cc1Swenshuai.xi     }
2948*53ee8cc1Swenshuai.xi 
2949*53ee8cc1Swenshuai.xi     pArgs.pu8Key = pu8Key;
2950*53ee8cc1Swenshuai.xi     pArgs.u32Len = u32Len;
2951*53ee8cc1Swenshuai.xi 
2952*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetKey_Ex, (void*)&pArgs);
2953*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
2954*53ee8cc1Swenshuai.xi     {
2955*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
2956*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
2957*53ee8cc1Swenshuai.xi     }
2958*53ee8cc1Swenshuai.xi 
2959*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
2960*53ee8cc1Swenshuai.xi #else
2961*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_SetKey_Ex(pu8Key, u32Len);
2962*53ee8cc1Swenshuai.xi #endif
2963*53ee8cc1Swenshuai.xi 
2964*53ee8cc1Swenshuai.xi }
2965*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_SetIV_Ex(const MS_U8 * pu8IV,MS_U32 u32Len)2966*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetIV_Ex(const MS_U8 *pu8IV, MS_U32 u32Len)
2967*53ee8cc1Swenshuai.xi {
2968*53ee8cc1Swenshuai.xi    	 DRVAESDMA_RESULT ret = DRVAESDMA_OK;
2969*53ee8cc1Swenshuai.xi 
2970*53ee8cc1Swenshuai.xi 	if(pu8IV && (u32Len <= HAL_CRYPTODMA_KEYLEN_MAX) && (u32Len > 0))
2971*53ee8cc1Swenshuai.xi     {
2972*53ee8cc1Swenshuai.xi         memcpy(_u8IV, pu8IV, u32Len);
2973*53ee8cc1Swenshuai.xi         _CipherKey.pu8IVData = _u8IV;
2974*53ee8cc1Swenshuai.xi         _CipherKey.u8IVLen = u32Len;
2975*53ee8cc1Swenshuai.xi     }
2976*53ee8cc1Swenshuai.xi     else
2977*53ee8cc1Swenshuai.xi     {
2978*53ee8cc1Swenshuai.xi         _CipherKey.pu8IVData = 0;
2979*53ee8cc1Swenshuai.xi         _CipherKey.u8IVLen = 0;
2980*53ee8cc1Swenshuai.xi     }
2981*53ee8cc1Swenshuai.xi 
2982*53ee8cc1Swenshuai.xi 	if(u32Len > HAL_CRYPTODMA_KEYLEN_MAX)
2983*53ee8cc1Swenshuai.xi     {
2984*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Invalid IV Length!");
2985*53ee8cc1Swenshuai.xi         ret = DRVAESDMA_INVALID_PARAM;
2986*53ee8cc1Swenshuai.xi     }
2987*53ee8cc1Swenshuai.xi 
2988*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IV Length[%u]", _CipherKey.u8IVLen);
2989*53ee8cc1Swenshuai.xi 
2990*53ee8cc1Swenshuai.xi     return ret;
2991*53ee8cc1Swenshuai.xi }
2992*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetIV_Ex(const MS_U8 * pu8IV,MS_U32 u32Len)2993*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetIV_Ex(const MS_U8 *pu8IV, MS_U32 u32Len)
2994*53ee8cc1Swenshuai.xi {
2995*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
2996*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
2997*53ee8cc1Swenshuai.xi     AESDMA_SET_IV_EX pArgs;
2998*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
2999*53ee8cc1Swenshuai.xi     {
3000*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3001*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3002*53ee8cc1Swenshuai.xi     }
3003*53ee8cc1Swenshuai.xi 
3004*53ee8cc1Swenshuai.xi     pArgs.pu8IV = pu8IV;
3005*53ee8cc1Swenshuai.xi     pArgs.u32Len = u32Len;
3006*53ee8cc1Swenshuai.xi 
3007*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetIV_Ex, (void*)&pArgs);
3008*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3009*53ee8cc1Swenshuai.xi     {
3010*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3011*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3012*53ee8cc1Swenshuai.xi     }
3013*53ee8cc1Swenshuai.xi 
3014*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3015*53ee8cc1Swenshuai.xi #else
3016*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_SetIV_Ex(pu8IV, u32Len);
3017*53ee8cc1Swenshuai.xi #endif
3018*53ee8cc1Swenshuai.xi }
3019*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_SetKey(MS_U32 * pCipherKey)3020*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetKey(MS_U32 *pCipherKey)
3021*53ee8cc1Swenshuai.xi {
3022*53ee8cc1Swenshuai.xi     if(pCipherKey)
3023*53ee8cc1Swenshuai.xi     {
3024*53ee8cc1Swenshuai.xi         MS_U32 u32Tmp[4] = {0};
3025*53ee8cc1Swenshuai.xi         if(!bDES_Key)
3026*53ee8cc1Swenshuai.xi         {
3027*53ee8cc1Swenshuai.xi 		    u32Tmp[3] = _AESDMA_MSBF2Native((MS_U8 *)pCipherKey);
3028*53ee8cc1Swenshuai.xi             u32Tmp[2] = _AESDMA_MSBF2Native((MS_U8 *)pCipherKey + 4);
3029*53ee8cc1Swenshuai.xi             u32Tmp[1] = _AESDMA_MSBF2Native((MS_U8 *)pCipherKey + 8);
3030*53ee8cc1Swenshuai.xi             u32Tmp[0] = _AESDMA_MSBF2Native((MS_U8 *)pCipherKey + 12);
3031*53ee8cc1Swenshuai.xi         }
3032*53ee8cc1Swenshuai.xi         else
3033*53ee8cc1Swenshuai.xi         {
3034*53ee8cc1Swenshuai.xi             u32Tmp[1] = _AESDMA_MSBF2Native((MS_U8 *)pCipherKey);
3035*53ee8cc1Swenshuai.xi             u32Tmp[0] = _AESDMA_MSBF2Native((MS_U8 *)pCipherKey + 4);
3036*53ee8cc1Swenshuai.xi 
3037*53ee8cc1Swenshuai.xi         }
3038*53ee8cc1Swenshuai.xi 		// Key from ACPU
3039*53ee8cc1Swenshuai.xi         _CipherKey.eKeySrc = E_CIPHER_KSRC_CPU;
3040*53ee8cc1Swenshuai.xi 
3041*53ee8cc1Swenshuai.xi         memcpy(_u8Key,(MS_U8 *)u32Tmp, 16);
3042*53ee8cc1Swenshuai.xi         _CipherKey.pu8KeyData = _u8Key;
3043*53ee8cc1Swenshuai.xi         _CipherKey.u8KeyLen = 16;
3044*53ee8cc1Swenshuai.xi         _CipherKey.u8KeyIdx = 0;
3045*53ee8cc1Swenshuai.xi     }
3046*53ee8cc1Swenshuai.xi     else
3047*53ee8cc1Swenshuai.xi     {
3048*53ee8cc1Swenshuai.xi         //Key from KL
3049*53ee8cc1Swenshuai.xi         memset(_u8Key, 0, 16);
3050*53ee8cc1Swenshuai.xi         _CipherKey.eKeySrc = E_CIPHER_KSRC_KL;
3051*53ee8cc1Swenshuai.xi         _CipherKey.pu8KeyData = 0;
3052*53ee8cc1Swenshuai.xi         _CipherKey.u8KeyLen = 16;
3053*53ee8cc1Swenshuai.xi         _CipherKey.u8KeyIdx = 0;
3054*53ee8cc1Swenshuai.xi     }
3055*53ee8cc1Swenshuai.xi 
3056*53ee8cc1Swenshuai.xi 	DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Key Source[%d], Key Length[%u], Key Index[%u], DES Key[%d]",
3057*53ee8cc1Swenshuai.xi         _CipherKey.eKeySrc, _CipherKey.u8KeyLen, _CipherKey.u8KeyIdx, bDES_Key);
3058*53ee8cc1Swenshuai.xi 
3059*53ee8cc1Swenshuai.xi     return 0;
3060*53ee8cc1Swenshuai.xi }
3061*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetKey(MS_U32 * pCipherKey)3062*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetKey(MS_U32 *pCipherKey)
3063*53ee8cc1Swenshuai.xi {
3064*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3065*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3066*53ee8cc1Swenshuai.xi 
3067*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3068*53ee8cc1Swenshuai.xi     {
3069*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3070*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3071*53ee8cc1Swenshuai.xi     }
3072*53ee8cc1Swenshuai.xi 
3073*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetKey, pCipherKey);
3074*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3075*53ee8cc1Swenshuai.xi     {
3076*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3077*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3078*53ee8cc1Swenshuai.xi     }
3079*53ee8cc1Swenshuai.xi 
3080*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3081*53ee8cc1Swenshuai.xi #else
3082*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_SetKey(pCipherKey);
3083*53ee8cc1Swenshuai.xi #endif
3084*53ee8cc1Swenshuai.xi }
3085*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetKeySel(MS_U32 * pCipherKey,DrvAESDMA_KEY_TYPE stKeyType)3086*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_SetKeySel(MS_U32 *pCipherKey, DrvAESDMA_KEY_TYPE stKeyType)
3087*53ee8cc1Swenshuai.xi {
3088*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3089*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3090*53ee8cc1Swenshuai.xi }
3091*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetOddIV(MS_U32 * pInitVector)3092*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_SetOddIV(MS_U32 *pInitVector)
3093*53ee8cc1Swenshuai.xi {
3094*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3095*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3096*53ee8cc1Swenshuai.xi }
3097*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_SetSecureKey(void)3098*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetSecureKey(void)
3099*53ee8cc1Swenshuai.xi {
3100*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3101*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3102*53ee8cc1Swenshuai.xi }
3103*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetSecureKey(void)3104*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetSecureKey(void)
3105*53ee8cc1Swenshuai.xi {
3106*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3107*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3108*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3109*53ee8cc1Swenshuai.xi     {
3110*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3111*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3112*53ee8cc1Swenshuai.xi     }
3113*53ee8cc1Swenshuai.xi 
3114*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetSecureKey, NULL);
3115*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3116*53ee8cc1Swenshuai.xi     {
3117*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3118*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3119*53ee8cc1Swenshuai.xi     }
3120*53ee8cc1Swenshuai.xi 
3121*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3122*53ee8cc1Swenshuai.xi #else
3123*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_SetSecureKey();
3124*53ee8cc1Swenshuai.xi #endif
3125*53ee8cc1Swenshuai.xi }
3126*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetSecuredKeyIndex(MS_U8 u8KeyIdx)3127*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT SYMBOL_WEAK MDrv_AESDMA_SetSecuredKeyIndex (MS_U8 u8KeyIdx)
3128*53ee8cc1Swenshuai.xi {
3129*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3130*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3131*53ee8cc1Swenshuai.xi }
3132*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_SetIV(MS_U32 * pInitVector)3133*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetIV(MS_U32 *pInitVector)
3134*53ee8cc1Swenshuai.xi {
3135*53ee8cc1Swenshuai.xi     if(pInitVector)
3136*53ee8cc1Swenshuai.xi     {
3137*53ee8cc1Swenshuai.xi 		MS_U32 u32Tmp[4] = {0};
3138*53ee8cc1Swenshuai.xi         if(!bDES_Key)
3139*53ee8cc1Swenshuai.xi         {
3140*53ee8cc1Swenshuai.xi 		    u32Tmp[3] = _AESDMA_MSBF2Native((MS_U8 *)pInitVector);
3141*53ee8cc1Swenshuai.xi             u32Tmp[2] = _AESDMA_MSBF2Native((MS_U8 *)pInitVector + 4);
3142*53ee8cc1Swenshuai.xi             u32Tmp[1] = _AESDMA_MSBF2Native((MS_U8 *)pInitVector + 8);
3143*53ee8cc1Swenshuai.xi             u32Tmp[0] = _AESDMA_MSBF2Native((MS_U8 *)pInitVector + 12);
3144*53ee8cc1Swenshuai.xi         }
3145*53ee8cc1Swenshuai.xi         else
3146*53ee8cc1Swenshuai.xi         {
3147*53ee8cc1Swenshuai.xi             u32Tmp[1] = _AESDMA_MSBF2Native((MS_U8 *)pInitVector);
3148*53ee8cc1Swenshuai.xi             u32Tmp[0] = _AESDMA_MSBF2Native((MS_U8 *)pInitVector + 4);
3149*53ee8cc1Swenshuai.xi         }
3150*53ee8cc1Swenshuai.xi 		memcpy(_u8IV,(MS_U8 *)u32Tmp, 16);
3151*53ee8cc1Swenshuai.xi         _CipherKey.pu8IVData = _u8IV;
3152*53ee8cc1Swenshuai.xi         _CipherKey.u8IVLen = 16;
3153*53ee8cc1Swenshuai.xi     }
3154*53ee8cc1Swenshuai.xi     else
3155*53ee8cc1Swenshuai.xi     {
3156*53ee8cc1Swenshuai.xi         memset(_u8IV, 0, 16);
3157*53ee8cc1Swenshuai.xi         _CipherKey.pu8IVData = 0;
3158*53ee8cc1Swenshuai.xi         _CipherKey.u8IVLen = 0;
3159*53ee8cc1Swenshuai.xi     }
3160*53ee8cc1Swenshuai.xi 
3161*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:IV Length[%u], DES IV[%d]", _CipherKey.u8IVLen, bDES_Key);
3162*53ee8cc1Swenshuai.xi 
3163*53ee8cc1Swenshuai.xi     return 0;
3164*53ee8cc1Swenshuai.xi }
3165*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetIV(MS_U32 * pInitVector)3166*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetIV(MS_U32 *pInitVector)
3167*53ee8cc1Swenshuai.xi {
3168*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3169*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3170*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3171*53ee8cc1Swenshuai.xi     {
3172*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3173*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3174*53ee8cc1Swenshuai.xi     }
3175*53ee8cc1Swenshuai.xi 
3176*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetIV, pInitVector);
3177*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3178*53ee8cc1Swenshuai.xi     {
3179*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3180*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3181*53ee8cc1Swenshuai.xi     }
3182*53ee8cc1Swenshuai.xi 
3183*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3184*53ee8cc1Swenshuai.xi #else
3185*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_SetIV(pInitVector);
3186*53ee8cc1Swenshuai.xi #endif
3187*53ee8cc1Swenshuai.xi 
3188*53ee8cc1Swenshuai.xi }
3189*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_SetPS(MS_U32 u32PTN,MS_U32 u32Mask,MS_BOOL bPSin_Enable,MS_BOOL bPSout_Enable)3190*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetPS(MS_U32 u32PTN, MS_U32 u32Mask, MS_BOOL bPSin_Enable, MS_BOOL bPSout_Enable)
3191*53ee8cc1Swenshuai.xi {
3192*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3193*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3194*53ee8cc1Swenshuai.xi }
3195*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetPS(MS_U32 u32PTN,MS_U32 u32Mask,MS_BOOL bPSin_Enable,MS_BOOL bPSout_Enable)3196*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetPS(MS_U32 u32PTN, MS_U32 u32Mask, MS_BOOL bPSin_Enable, MS_BOOL bPSout_Enable)
3197*53ee8cc1Swenshuai.xi {
3198*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3199*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3200*53ee8cc1Swenshuai.xi     AESDMA_SET_PS pArgs;
3201*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3202*53ee8cc1Swenshuai.xi     {
3203*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3204*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3205*53ee8cc1Swenshuai.xi     }
3206*53ee8cc1Swenshuai.xi 
3207*53ee8cc1Swenshuai.xi     pArgs.u32PTN = u32PTN;
3208*53ee8cc1Swenshuai.xi     pArgs.u32Mask = u32Mask;
3209*53ee8cc1Swenshuai.xi     pArgs.bPSin_Enable = bPSin_Enable;
3210*53ee8cc1Swenshuai.xi     pArgs.bPSout_Enable = bPSout_Enable;
3211*53ee8cc1Swenshuai.xi 
3212*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetPS, (void*)&pArgs);
3213*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3214*53ee8cc1Swenshuai.xi     {
3215*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3216*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3217*53ee8cc1Swenshuai.xi     }
3218*53ee8cc1Swenshuai.xi 
3219*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3220*53ee8cc1Swenshuai.xi #else
3221*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_SetPS(u32PTN, u32Mask, bPSin_Enable, bPSout_Enable);
3222*53ee8cc1Swenshuai.xi #endif
3223*53ee8cc1Swenshuai.xi }
3224*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_SetDefaultCAVid(MS_U32 u32CAVid)3225*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetDefaultCAVid(MS_U32 u32CAVid)
3226*53ee8cc1Swenshuai.xi {
3227*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "Set CAVid [0x%x]",(unsigned int)u32CAVid);
3228*53ee8cc1Swenshuai.xi 
3229*53ee8cc1Swenshuai.xi     if((u32CAVid > HAL_CRYPTODMA_CAVID_MAX) || (u32CAVid == 0))
3230*53ee8cc1Swenshuai.xi     {
3231*53ee8cc1Swenshuai.xi         return DRVAESDMA_INVALID_PARAM;
3232*53ee8cc1Swenshuai.xi     }
3233*53ee8cc1Swenshuai.xi 
3234*53ee8cc1Swenshuai.xi     _u32CAVid = u32CAVid;
3235*53ee8cc1Swenshuai.xi 
3236*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3237*53ee8cc1Swenshuai.xi }
3238*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetDefaultCAVid(MS_U32 u32CAVid)3239*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetDefaultCAVid(MS_U32 u32CAVid)
3240*53ee8cc1Swenshuai.xi {
3241*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3242*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3243*53ee8cc1Swenshuai.xi     AESDMA_CAVID pArgs;
3244*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3245*53ee8cc1Swenshuai.xi     {
3246*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3247*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3248*53ee8cc1Swenshuai.xi     }
3249*53ee8cc1Swenshuai.xi 
3250*53ee8cc1Swenshuai.xi     pArgs.u32CAVid = u32CAVid;
3251*53ee8cc1Swenshuai.xi 
3252*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetDefaultCAVid, (void*)&pArgs);
3253*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3254*53ee8cc1Swenshuai.xi     {
3255*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3256*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3257*53ee8cc1Swenshuai.xi     }
3258*53ee8cc1Swenshuai.xi 
3259*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3260*53ee8cc1Swenshuai.xi #else
3261*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_SetDefaultCAVid(u32CAVid);
3262*53ee8cc1Swenshuai.xi #endif
3263*53ee8cc1Swenshuai.xi }
3264*53ee8cc1Swenshuai.xi 
3265*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_PSRelease(void)3266*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_PSRelease(void)
3267*53ee8cc1Swenshuai.xi {
3268*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3269*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3270*53ee8cc1Swenshuai.xi }
3271*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_PSRelease(void)3272*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_PSRelease(void)
3273*53ee8cc1Swenshuai.xi {
3274*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3275*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3276*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3277*53ee8cc1Swenshuai.xi     {
3278*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3279*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3280*53ee8cc1Swenshuai.xi     }
3281*53ee8cc1Swenshuai.xi 
3282*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_PSRelease, NULL);
3283*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3284*53ee8cc1Swenshuai.xi     {
3285*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3286*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3287*53ee8cc1Swenshuai.xi     }
3288*53ee8cc1Swenshuai.xi 
3289*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3290*53ee8cc1Swenshuai.xi #else
3291*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_PSRelease();
3292*53ee8cc1Swenshuai.xi #endif
3293*53ee8cc1Swenshuai.xi }
3294*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_SetFileInOut(MS_PHY u32FileinAddr,MS_U32 u32FileInNum,MS_PHY u32FileOutSAddr,MS_PHY u32FileOutEAddr)3295*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetFileInOut(MS_PHY u32FileinAddr, MS_U32 u32FileInNum, MS_PHY u32FileOutSAddr, MS_PHY u32FileOutEAddr)
3296*53ee8cc1Swenshuai.xi {
3297*53ee8cc1Swenshuai.xi 
3298*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:FileIn address[0x%x], FileIn num[0x%x], FileOut start address[0x%x], FileOut end address[0x%x]",
3299*53ee8cc1Swenshuai.xi         (unsigned int)u32FileinAddr,
3300*53ee8cc1Swenshuai.xi         (unsigned int)u32FileInNum,
3301*53ee8cc1Swenshuai.xi         (unsigned int)u32FileOutSAddr,
3302*53ee8cc1Swenshuai.xi         (unsigned int)u32FileOutEAddr);
3303*53ee8cc1Swenshuai.xi 
3304*53ee8cc1Swenshuai.xi     _stInput.u32Addr = u32FileinAddr;
3305*53ee8cc1Swenshuai.xi     _stInput.u32Size = u32FileInNum;
3306*53ee8cc1Swenshuai.xi     _stInput.eMemoryType = E_CIPHER_DRAM;
3307*53ee8cc1Swenshuai.xi 
3308*53ee8cc1Swenshuai.xi     _stOutput.u32Addr = u32FileOutSAddr;
3309*53ee8cc1Swenshuai.xi     _stOutput.u32Size = (u32FileOutEAddr - u32FileOutSAddr) + 1;
3310*53ee8cc1Swenshuai.xi     _stOutput.eMemoryType = E_CIPHER_DRAM;
3311*53ee8cc1Swenshuai.xi 
3312*53ee8cc1Swenshuai.xi     return 0;
3313*53ee8cc1Swenshuai.xi }
3314*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetFileInOut(MS_PHY u32FileinAddr,MS_U32 u32FileInNum,MS_PHY u32FileOutSAddr,MS_PHY u32FileOutEAddr)3315*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_SetFileInOut(MS_PHY u32FileinAddr, MS_U32 u32FileInNum, MS_PHY u32FileOutSAddr, MS_PHY u32FileOutEAddr)
3316*53ee8cc1Swenshuai.xi {
3317*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3318*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3319*53ee8cc1Swenshuai.xi     AESDMA_FILE_INOUT pArgs;
3320*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3321*53ee8cc1Swenshuai.xi     {
3322*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3323*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3324*53ee8cc1Swenshuai.xi     }
3325*53ee8cc1Swenshuai.xi 
3326*53ee8cc1Swenshuai.xi     pArgs.u32FileinAddr = u32FileinAddr;
3327*53ee8cc1Swenshuai.xi     pArgs.u32FileInNum  = u32FileInNum;
3328*53ee8cc1Swenshuai.xi     pArgs.u32FileOutSAddr = u32FileOutSAddr;
3329*53ee8cc1Swenshuai.xi     pArgs.u32FileOutEAddr = u32FileOutEAddr;
3330*53ee8cc1Swenshuai.xi 
3331*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_SetFileInOut, (void*)&pArgs);
3332*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3333*53ee8cc1Swenshuai.xi     {
3334*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3335*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3336*53ee8cc1Swenshuai.xi     }
3337*53ee8cc1Swenshuai.xi 
3338*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3339*53ee8cc1Swenshuai.xi #else
3340*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_SetFileInOut(u32FileinAddr, u32FileInNum, u32FileOutSAddr, u32FileOutEAddr);
3341*53ee8cc1Swenshuai.xi #endif
3342*53ee8cc1Swenshuai.xi }
3343*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_Start(MS_BOOL bStart)3344*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_Start(MS_BOOL bStart)
3345*53ee8cc1Swenshuai.xi {
3346*53ee8cc1Swenshuai.xi     DRV_CIPHER_DMACFG stCfg = {{0}};
3347*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret = DRV_CIPHER_OK;
3348*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
3349*53ee8cc1Swenshuai.xi 
3350*53ee8cc1Swenshuai.xi     stCfg.stAlgo   = _stAlgo;
3351*53ee8cc1Swenshuai.xi     stCfg.u32CAVid = _u32CAVid;
3352*53ee8cc1Swenshuai.xi     stCfg.stKey    = _CipherKey;
3353*53ee8cc1Swenshuai.xi     stCfg.stInput  = _stInput;
3354*53ee8cc1Swenshuai.xi     stCfg.stOutput = _stOutput;
3355*53ee8cc1Swenshuai.xi 
3356*53ee8cc1Swenshuai.xi     stCfg.bDecrypt = _isDecrypt;
3357*53ee8cc1Swenshuai.xi 
3358*53ee8cc1Swenshuai.xi     ret = MDrv_CIPHER_DMACalc(stCfg, &_RetId);
3359*53ee8cc1Swenshuai.xi 
3360*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Decrypt[%d], CmdId[%u]!", _isDecrypt, _RetId);
3361*53ee8cc1Swenshuai.xi 
3362*53ee8cc1Swenshuai.xi     return ret;
3363*53ee8cc1Swenshuai.xi }
3364*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Start(MS_BOOL bStart)3365*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Start(MS_BOOL bStart)
3366*53ee8cc1Swenshuai.xi {
3367*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3368*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3369*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3370*53ee8cc1Swenshuai.xi     {
3371*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3372*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3373*53ee8cc1Swenshuai.xi     }
3374*53ee8cc1Swenshuai.xi 
3375*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_Start, &bStart);
3376*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3377*53ee8cc1Swenshuai.xi     {
3378*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3379*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3380*53ee8cc1Swenshuai.xi     }
3381*53ee8cc1Swenshuai.xi 
3382*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3383*53ee8cc1Swenshuai.xi #else
3384*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_Start(bStart);
3385*53ee8cc1Swenshuai.xi #endif
3386*53ee8cc1Swenshuai.xi }
3387*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_Reset(void)3388*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_Reset(void)
3389*53ee8cc1Swenshuai.xi {
3390*53ee8cc1Swenshuai.xi     DRV_CIPHER_RET ret = DRV_CIPHER_OK;
3391*53ee8cc1Swenshuai.xi     ret = MDrv_CIPHER_Reset();
3392*53ee8cc1Swenshuai.xi 
3393*53ee8cc1Swenshuai.xi     if(DRV_CIPHER_OK != ret)
3394*53ee8cc1Swenshuai.xi         return ret;
3395*53ee8cc1Swenshuai.xi 
3396*53ee8cc1Swenshuai.xi     // Default Key from ACPU
3397*53ee8cc1Swenshuai.xi     _CipherKey.eKeySrc = E_CIPHER_KSRC_CPU;
3398*53ee8cc1Swenshuai.xi     _CipherKey.pu8KeyData = _u8ZeroData;
3399*53ee8cc1Swenshuai.xi     _CipherKey.u8KeyLen = 16;
3400*53ee8cc1Swenshuai.xi     _CipherKey.u8KeyIdx = 0;
3401*53ee8cc1Swenshuai.xi 
3402*53ee8cc1Swenshuai.xi     //Clear IV
3403*53ee8cc1Swenshuai.xi     _CipherKey.pu8IVData = _u8ZeroData;
3404*53ee8cc1Swenshuai.xi     _CipherKey.u8IVLen = 16;
3405*53ee8cc1Swenshuai.xi 
3406*53ee8cc1Swenshuai.xi     //Clear Algo
3407*53ee8cc1Swenshuai.xi     _stAlgo.eMainAlgo = 0;
3408*53ee8cc1Swenshuai.xi     _stAlgo.eSubAlgo  = 0;
3409*53ee8cc1Swenshuai.xi     _stAlgo.eResAlgo  = 0;
3410*53ee8cc1Swenshuai.xi     _stAlgo.eSBAlgo   = 0;
3411*53ee8cc1Swenshuai.xi 
3412*53ee8cc1Swenshuai.xi     //Clear Input
3413*53ee8cc1Swenshuai.xi     _stInput.u32Addr = 0;
3414*53ee8cc1Swenshuai.xi     _stInput.u32Size = 0;
3415*53ee8cc1Swenshuai.xi     _stInput.eMemoryType = 0;
3416*53ee8cc1Swenshuai.xi 
3417*53ee8cc1Swenshuai.xi     //Clear Output
3418*53ee8cc1Swenshuai.xi     _stOutput.u32Addr = 0;
3419*53ee8cc1Swenshuai.xi     _stOutput.u32Size = 0;
3420*53ee8cc1Swenshuai.xi     _stOutput.eMemoryType = 0;
3421*53ee8cc1Swenshuai.xi 
3422*53ee8cc1Swenshuai.xi     memset(_u8Key, 0, sizeof(_u8Key));
3423*53ee8cc1Swenshuai.xi     memset(_u8IV, 0, sizeof(_u8IV));
3424*53ee8cc1Swenshuai.xi 
3425*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:AESDMA Reset");
3426*53ee8cc1Swenshuai.xi 
3427*53ee8cc1Swenshuai.xi     return 0;
3428*53ee8cc1Swenshuai.xi }
3429*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Reset(void)3430*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Reset(void)
3431*53ee8cc1Swenshuai.xi {
3432*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3433*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3434*53ee8cc1Swenshuai.xi 
3435*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3436*53ee8cc1Swenshuai.xi     {
3437*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3438*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3439*53ee8cc1Swenshuai.xi     }
3440*53ee8cc1Swenshuai.xi 
3441*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_Reset, NULL);
3442*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3443*53ee8cc1Swenshuai.xi     {
3444*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3445*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3446*53ee8cc1Swenshuai.xi     }
3447*53ee8cc1Swenshuai.xi 
3448*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3449*53ee8cc1Swenshuai.xi #else
3450*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_Reset();
3451*53ee8cc1Swenshuai.xi #endif
3452*53ee8cc1Swenshuai.xi 
3453*53ee8cc1Swenshuai.xi }
3454*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_GetStatus(MS_U32 * u32RetVal)3455*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_GetStatus(MS_U32 *u32RetVal)
3456*53ee8cc1Swenshuai.xi {
3457*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3458*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3459*53ee8cc1Swenshuai.xi }
3460*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_GetStatus(void)3461*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_GetStatus(void)
3462*53ee8cc1Swenshuai.xi {
3463*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3464*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3465*53ee8cc1Swenshuai.xi }
3466*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_IsFinished(MS_U32 * u32RetVal)3467*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_IsFinished(MS_U32 *u32RetVal)
3468*53ee8cc1Swenshuai.xi {
3469*53ee8cc1Swenshuai.xi     MS_BOOL bDone = FALSE;
3470*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = 0;
3471*53ee8cc1Swenshuai.xi 
3472*53ee8cc1Swenshuai.xi     bDone = MDrv_CIPHER_IsDMADone(_RetId, &u32Ret);
3473*53ee8cc1Swenshuai.xi 
3474*53ee8cc1Swenshuai.xi     if(TRUE == bDone)
3475*53ee8cc1Swenshuai.xi     {
3476*53ee8cc1Swenshuai.xi         return DRVAESDMA_OK;
3477*53ee8cc1Swenshuai.xi     }
3478*53ee8cc1Swenshuai.xi     else
3479*53ee8cc1Swenshuai.xi     {
3480*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:CmdId[%u] Not Done!", _RetId);
3481*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3482*53ee8cc1Swenshuai.xi     }
3483*53ee8cc1Swenshuai.xi }
3484*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_IsFinished(void)3485*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_IsFinished(void)
3486*53ee8cc1Swenshuai.xi {
3487*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3488*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3489*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3490*53ee8cc1Swenshuai.xi     {
3491*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3492*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3493*53ee8cc1Swenshuai.xi     }
3494*53ee8cc1Swenshuai.xi 
3495*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_IsFinished, NULL);
3496*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3497*53ee8cc1Swenshuai.xi     {
3498*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3499*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3500*53ee8cc1Swenshuai.xi     }
3501*53ee8cc1Swenshuai.xi 
3502*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3503*53ee8cc1Swenshuai.xi #else
3504*53ee8cc1Swenshuai.xi     MS_U32 u32Tmp = 0;
3505*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_IsFinished(&u32Tmp);
3506*53ee8cc1Swenshuai.xi #endif
3507*53ee8cc1Swenshuai.xi }
3508*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_GetPSMatchedByteCNT(MS_U32 * u32RetVal)3509*53ee8cc1Swenshuai.xi MS_U32 _MDrv_AESDMA_GetPSMatchedByteCNT(MS_U32 *u32RetVal)
3510*53ee8cc1Swenshuai.xi {
3511*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3512*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3513*53ee8cc1Swenshuai.xi }
3514*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_GetPSMatchedByteCNT(void)3515*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_U32 MDrv_AESDMA_GetPSMatchedByteCNT(void)
3516*53ee8cc1Swenshuai.xi {
3517*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3518*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3519*53ee8cc1Swenshuai.xi }
3520*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_GetPSMatchedPTN(void)3521*53ee8cc1Swenshuai.xi MS_U32 _MDrv_AESDMA_GetPSMatchedPTN(void)
3522*53ee8cc1Swenshuai.xi {
3523*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3524*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3525*53ee8cc1Swenshuai.xi }
3526*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_GetPSMatchedPTN(void)3527*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_U32 MDrv_AESDMA_GetPSMatchedPTN(void)
3528*53ee8cc1Swenshuai.xi {
3529*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3530*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3531*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3532*53ee8cc1Swenshuai.xi     {
3533*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3534*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3535*53ee8cc1Swenshuai.xi     }
3536*53ee8cc1Swenshuai.xi 
3537*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_GetPSMatchedPTN, NULL);
3538*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3539*53ee8cc1Swenshuai.xi     {
3540*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3541*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3542*53ee8cc1Swenshuai.xi     }
3543*53ee8cc1Swenshuai.xi 
3544*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3545*53ee8cc1Swenshuai.xi #else
3546*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_GetPSMatchedPTN();
3547*53ee8cc1Swenshuai.xi #endif
3548*53ee8cc1Swenshuai.xi }
3549*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_Notify(DrvAESDMA_Event eEvents,P_DrvAESDMA_EvtCallback pfCallback)3550*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_Notify(DrvAESDMA_Event eEvents, P_DrvAESDMA_EvtCallback pfCallback)
3551*53ee8cc1Swenshuai.xi {
3552*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3553*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3554*53ee8cc1Swenshuai.xi }
3555*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Notify(DrvAESDMA_Event eEvents,P_DrvAESDMA_EvtCallback pfCallback)3556*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Notify(DrvAESDMA_Event eEvents, P_DrvAESDMA_EvtCallback pfCallback)
3557*53ee8cc1Swenshuai.xi {
3558*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3559*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3560*53ee8cc1Swenshuai.xi     AESDMA_NOTIFY pArgs;
3561*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3562*53ee8cc1Swenshuai.xi     {
3563*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3564*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3565*53ee8cc1Swenshuai.xi     }
3566*53ee8cc1Swenshuai.xi 
3567*53ee8cc1Swenshuai.xi     pArgs.eEvents = eEvents;
3568*53ee8cc1Swenshuai.xi     pArgs.pfCallback = pfCallback;
3569*53ee8cc1Swenshuai.xi 
3570*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_Notify, (void*)&pArgs);
3571*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3572*53ee8cc1Swenshuai.xi     {
3573*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3574*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3575*53ee8cc1Swenshuai.xi     }
3576*53ee8cc1Swenshuai.xi 
3577*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3578*53ee8cc1Swenshuai.xi #else
3579*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_Notify(eEvents, pfCallback);
3580*53ee8cc1Swenshuai.xi #endif
3581*53ee8cc1Swenshuai.xi }
3582*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetDbgLevel(DrvAESDMA_DbgLevel DbgLevel)3583*53ee8cc1Swenshuai.xi DLL_PUBLIC  DRVAESDMA_RESULT MDrv_AESDMA_SetDbgLevel(DrvAESDMA_DbgLevel DbgLevel)
3584*53ee8cc1Swenshuai.xi {
3585*53ee8cc1Swenshuai.xi     CIPHER_DBGMSG_LEVEL eDbgLevel = _CIPHER_TransDbgLevel(DbgLevel);
3586*53ee8cc1Swenshuai.xi 
3587*53ee8cc1Swenshuai.xi     MDrv_CIPHER_SetDbgLevel(eDbgLevel);
3588*53ee8cc1Swenshuai.xi 
3589*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3590*53ee8cc1Swenshuai.xi }
3591*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_GetLibVer(const MSIF_Version ** ppVersion)3592*53ee8cc1Swenshuai.xi DLL_PUBLIC  DRVAESDMA_RESULT MDrv_AESDMA_GetLibVer(const MSIF_Version **ppVersion)
3593*53ee8cc1Swenshuai.xi {
3594*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3595*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3596*53ee8cc1Swenshuai.xi }
3597*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_Rand(MS_U32 * u32PABuf,MS_U32 u32Size)3598*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_Rand(MS_U32 *u32PABuf, MS_U32 u32Size)
3599*53ee8cc1Swenshuai.xi {
3600*53ee8cc1Swenshuai.xi     if(NULL == u32PABuf || 0 == u32Size)
3601*53ee8cc1Swenshuai.xi     {
3602*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Buffer or Size is zero!");
3603*53ee8cc1Swenshuai.xi         return DRVAESDMA_INVALID_PARAM;
3604*53ee8cc1Swenshuai.xi     }
3605*53ee8cc1Swenshuai.xi 
3606*53ee8cc1Swenshuai.xi     ptrdiff_t n = (ptrdiff_t)u32PABuf;
3607*53ee8cc1Swenshuai.xi     MS_VIRT u8VABuf = (MS_VIRT)MsOS_PA2KSEG1((MS_PHY)n);
3608*53ee8cc1Swenshuai.xi 
3609*53ee8cc1Swenshuai.xi     if( FALSE == HAL_CIPHER_Misc_Random((MS_U8 *)u8VABuf,u32Size))
3610*53ee8cc1Swenshuai.xi     {
3611*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3612*53ee8cc1Swenshuai.xi     }
3613*53ee8cc1Swenshuai.xi 
3614*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3615*53ee8cc1Swenshuai.xi }
3616*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Rand(MS_U32 * u32PABuf,MS_U32 u32Size)3617*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Rand(MS_U32 *u32PABuf, MS_U32 u32Size)
3618*53ee8cc1Swenshuai.xi {
3619*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3620*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3621*53ee8cc1Swenshuai.xi     AESDMA_RAND pArgs;
3622*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3623*53ee8cc1Swenshuai.xi     {
3624*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3625*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3626*53ee8cc1Swenshuai.xi     }
3627*53ee8cc1Swenshuai.xi 
3628*53ee8cc1Swenshuai.xi     pArgs.u32PABuf = u32PABuf;
3629*53ee8cc1Swenshuai.xi     pArgs.u32Size = u32Size;
3630*53ee8cc1Swenshuai.xi 
3631*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_Rand, (void*)&pArgs);
3632*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3633*53ee8cc1Swenshuai.xi     {
3634*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3635*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3636*53ee8cc1Swenshuai.xi     }
3637*53ee8cc1Swenshuai.xi 
3638*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3639*53ee8cc1Swenshuai.xi #else
3640*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_Rand(u32PABuf, u32Size);
3641*53ee8cc1Swenshuai.xi #endif
3642*53ee8cc1Swenshuai.xi }
3643*53ee8cc1Swenshuai.xi 
3644*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Set_Clk(MS_BOOL benable)3645*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Set_Clk(MS_BOOL benable)
3646*53ee8cc1Swenshuai.xi {
3647*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:Not Support!");
3648*53ee8cc1Swenshuai.xi     return 0;
3649*53ee8cc1Swenshuai.xi }
3650*53ee8cc1Swenshuai.xi 
_MDrv_SHA_Calculate(DrvAESDMA_SHAMode eMode,MS_PHY u32PAInBuf,MS_U32 u32Size,MS_PHY u32PAOutBuf)3651*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_SHA_Calculate(DrvAESDMA_SHAMode eMode, MS_PHY u32PAInBuf, MS_U32 u32Size, MS_PHY u32PAOutBuf)
3652*53ee8cc1Swenshuai.xi {
3653*53ee8cc1Swenshuai.xi     DRV_CIPHER_HASHCFG stCfg = {0};
3654*53ee8cc1Swenshuai.xi     CIPHER_HASH_ALGO eAlgo = E_CIPHER_HASH_ALGO_SHA1;
3655*53ee8cc1Swenshuai.xi     MS_U32 u32DgstSize = 20;
3656*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = 0;
3657*53ee8cc1Swenshuai.xi     MS_U32 u32WaitCnt = 0;
3658*53ee8cc1Swenshuai.xi 
3659*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:eMode[%d], InBuffer[0x%08x], Size[%u], OutBuffer[0x%08x]!",
3660*53ee8cc1Swenshuai.xi         eMode, (unsigned int)u32PAInBuf, u32Size, (unsigned int)u32PAOutBuf);
3661*53ee8cc1Swenshuai.xi 
3662*53ee8cc1Swenshuai.xi     switch(eMode)
3663*53ee8cc1Swenshuai.xi     {
3664*53ee8cc1Swenshuai.xi     case E_DRVAESDMA_SHA1:
3665*53ee8cc1Swenshuai.xi         eAlgo = E_CIPHER_HASH_ALGO_SHA1;
3666*53ee8cc1Swenshuai.xi         u32DgstSize = 20;
3667*53ee8cc1Swenshuai.xi         break;
3668*53ee8cc1Swenshuai.xi     case E_DRVAESDMA_SHA256:
3669*53ee8cc1Swenshuai.xi         eAlgo = E_CIPHER_HASH_ALGO_SHA256;
3670*53ee8cc1Swenshuai.xi         u32DgstSize = 32;
3671*53ee8cc1Swenshuai.xi         break;
3672*53ee8cc1Swenshuai.xi     default:
3673*53ee8cc1Swenshuai.xi         eAlgo = E_CIPHER_HASH_ALGO_SHA1;
3674*53ee8cc1Swenshuai.xi         u32DgstSize = 20;
3675*53ee8cc1Swenshuai.xi     }
3676*53ee8cc1Swenshuai.xi 
3677*53ee8cc1Swenshuai.xi     stCfg.eAlgo              = eAlgo;
3678*53ee8cc1Swenshuai.xi     stCfg.stInput.u32Addr    = u32PAInBuf;
3679*53ee8cc1Swenshuai.xi     stCfg.stInput.u32Size    = u32Size;
3680*53ee8cc1Swenshuai.xi     stCfg.pu8Digest_Buf      = (MS_U8*)(MsOS_PA2KSEG1(u32PAOutBuf));
3681*53ee8cc1Swenshuai.xi     stCfg.u32Digest_Buf_Size = u32DgstSize;
3682*53ee8cc1Swenshuai.xi 
3683*53ee8cc1Swenshuai.xi     if(DRV_CIPHER_OK != MDrv_CIPHER_HASH(stCfg, &_RetId))
3684*53ee8cc1Swenshuai.xi     {
3685*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH Fail!");
3686*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3687*53ee8cc1Swenshuai.xi     }
3688*53ee8cc1Swenshuai.xi 
3689*53ee8cc1Swenshuai.xi     while((FALSE == MDrv_CIPHER_IsHASHDone(_RetId, &u32Ret)) && u32WaitCnt < HASH_TIMEOUT_VALUE)
3690*53ee8cc1Swenshuai.xi     {
3691*53ee8cc1Swenshuai.xi     #ifdef MSOS_TYPE_NUTTX
3692*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(200);
3693*53ee8cc1Swenshuai.xi     #elif defined MSOS_TYPE_OPTEE
3694*53ee8cc1Swenshuai.xi 
3695*53ee8cc1Swenshuai.xi     #else
3696*53ee8cc1Swenshuai.xi         MsOS_DelayTask(20);
3697*53ee8cc1Swenshuai.xi     #endif
3698*53ee8cc1Swenshuai.xi         u32WaitCnt++;
3699*53ee8cc1Swenshuai.xi     }
3700*53ee8cc1Swenshuai.xi 
3701*53ee8cc1Swenshuai.xi     if(u32WaitCnt >= HASH_TIMEOUT_VALUE)
3702*53ee8cc1Swenshuai.xi     {
3703*53ee8cc1Swenshuai.xi        DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning;HASH timeout!");
3704*53ee8cc1Swenshuai.xi        return DRVAESDMA_FAIL;
3705*53ee8cc1Swenshuai.xi     }
3706*53ee8cc1Swenshuai.xi 
3707*53ee8cc1Swenshuai.xi     //Reverse MSB to LSB for old API compatible
3708*53ee8cc1Swenshuai.xi     _ReverseU8Buf((MS_U8 *)stCfg.pu8Digest_Buf, u32DgstSize );
3709*53ee8cc1Swenshuai.xi 
3710*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3711*53ee8cc1Swenshuai.xi }
3712*53ee8cc1Swenshuai.xi 
MDrv_SHA_Calculate(DrvAESDMA_SHAMode eMode,MS_PHY u32PAInBuf,MS_U32 u32Size,MS_PHY u32PAOutBuf)3713*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_SHA_Calculate(DrvAESDMA_SHAMode eMode, MS_PHY u32PAInBuf, MS_U32 u32Size, MS_PHY u32PAOutBuf)
3714*53ee8cc1Swenshuai.xi {
3715*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3716*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3717*53ee8cc1Swenshuai.xi     SHA_CALCULATE pArgs;
3718*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3719*53ee8cc1Swenshuai.xi     {
3720*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3721*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3722*53ee8cc1Swenshuai.xi     }
3723*53ee8cc1Swenshuai.xi 
3724*53ee8cc1Swenshuai.xi     pArgs.eMode = eMode;
3725*53ee8cc1Swenshuai.xi     pArgs.u32PAInBuf = u32PAInBuf;
3726*53ee8cc1Swenshuai.xi     pArgs.u32Size = u32Size;
3727*53ee8cc1Swenshuai.xi     pArgs.u32PAOutBuf = u32PAOutBuf;
3728*53ee8cc1Swenshuai.xi 
3729*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_SHA_Calculate, (void*)&pArgs);
3730*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3731*53ee8cc1Swenshuai.xi     {
3732*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3733*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3734*53ee8cc1Swenshuai.xi     }
3735*53ee8cc1Swenshuai.xi 
3736*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3737*53ee8cc1Swenshuai.xi #else
3738*53ee8cc1Swenshuai.xi     return _MDrv_SHA_Calculate(eMode, u32PAInBuf, u32Size, u32PAOutBuf);
3739*53ee8cc1Swenshuai.xi #endif
3740*53ee8cc1Swenshuai.xi }
3741*53ee8cc1Swenshuai.xi 
_MDrv_SHA_CalculateManual(DrvAESDMA_HASHCFG stCfg,DrvAESDMA_HASH_STAGE eStage,MS_U32 u32DoneBytes,MS_U8 * pu8SetIV)3742*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_SHA_CalculateManual(DrvAESDMA_HASHCFG stCfg, DrvAESDMA_HASH_STAGE eStage, MS_U32 u32DoneBytes, MS_U8 *pu8SetIV)
3743*53ee8cc1Swenshuai.xi {
3744*53ee8cc1Swenshuai.xi     DRV_CIPHER_HASHCFG_MANUAL stCipherCfg = {0};
3745*53ee8cc1Swenshuai.xi     CIPHER_HASH_ALGO eAlgo = E_CIPHER_HASH_ALGO_SHA1;
3746*53ee8cc1Swenshuai.xi     MS_U32 u32DgstSize = 20;
3747*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = 0;
3748*53ee8cc1Swenshuai.xi     MS_U32 u32WaitCnt = 0;
3749*53ee8cc1Swenshuai.xi 
3750*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:eMode[%d], Stage[%d], Done Bytes[%u]!",
3751*53ee8cc1Swenshuai.xi         stCfg.eMode, eStage, u32DoneBytes);
3752*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:InAddress[0x%08x], InSize[%u], OutAddress[0x%08x], OutSize[%u]!",
3753*53ee8cc1Swenshuai.xi         (unsigned int)stCfg.stInput.u32Addr, stCfg.stInput.u32Size, (unsigned int)stCfg.stOutput.u32Addr, stCfg.stOutput.u32Size);
3754*53ee8cc1Swenshuai.xi 
3755*53ee8cc1Swenshuai.xi     switch(stCfg.eMode)
3756*53ee8cc1Swenshuai.xi     {
3757*53ee8cc1Swenshuai.xi     case E_DRVAESDMA_SHA1:
3758*53ee8cc1Swenshuai.xi         eAlgo = E_CIPHER_HASH_ALGO_SHA1;
3759*53ee8cc1Swenshuai.xi         u32DgstSize = 20;
3760*53ee8cc1Swenshuai.xi         break;
3761*53ee8cc1Swenshuai.xi     case E_DRVAESDMA_SHA256:
3762*53ee8cc1Swenshuai.xi         eAlgo = E_CIPHER_HASH_ALGO_SHA256;
3763*53ee8cc1Swenshuai.xi         u32DgstSize = 32;
3764*53ee8cc1Swenshuai.xi         break;
3765*53ee8cc1Swenshuai.xi     default:
3766*53ee8cc1Swenshuai.xi         eAlgo = E_CIPHER_HASH_ALGO_SHA1;
3767*53ee8cc1Swenshuai.xi         u32DgstSize = 20;
3768*53ee8cc1Swenshuai.xi     }
3769*53ee8cc1Swenshuai.xi 
3770*53ee8cc1Swenshuai.xi     //Algo
3771*53ee8cc1Swenshuai.xi     stCipherCfg.eAlgo = eAlgo;
3772*53ee8cc1Swenshuai.xi 
3773*53ee8cc1Swenshuai.xi     //Input
3774*53ee8cc1Swenshuai.xi     stCipherCfg.stInput.u32Addr = stCfg.stInput.u32Addr;
3775*53ee8cc1Swenshuai.xi     stCipherCfg.stInput.u32Size = stCfg.stInput.u32Size;
3776*53ee8cc1Swenshuai.xi 
3777*53ee8cc1Swenshuai.xi     //Output
3778*53ee8cc1Swenshuai.xi     stCipherCfg.pu8Digest_Buf      = (MS_U8*)stCfg.stOutput.u32Addr;
3779*53ee8cc1Swenshuai.xi     stCipherCfg.u32Digest_Buf_Size = stCfg.stOutput.u32Size;
3780*53ee8cc1Swenshuai.xi 
3781*53ee8cc1Swenshuai.xi     //Stage
3782*53ee8cc1Swenshuai.xi     stCipherCfg.eStage = eStage;
3783*53ee8cc1Swenshuai.xi 
3784*53ee8cc1Swenshuai.xi     //StartBytes
3785*53ee8cc1Swenshuai.xi     stCipherCfg.u32StartByte = u32DoneBytes;
3786*53ee8cc1Swenshuai.xi 
3787*53ee8cc1Swenshuai.xi     //IV
3788*53ee8cc1Swenshuai.xi     stCipherCfg.pu8SetIV = pu8SetIV;
3789*53ee8cc1Swenshuai.xi 
3790*53ee8cc1Swenshuai.xi     if(DRV_CIPHER_OK != MDrv_CIPHER_HASHManual(stCipherCfg, &_RetId))
3791*53ee8cc1Swenshuai.xi     {
3792*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:HASH Fail!");
3793*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3794*53ee8cc1Swenshuai.xi     }
3795*53ee8cc1Swenshuai.xi 
3796*53ee8cc1Swenshuai.xi     while((FALSE == MDrv_CIPHER_IsHASHDone(_RetId, &u32Ret)) && u32WaitCnt < HASH_TIMEOUT_VALUE)
3797*53ee8cc1Swenshuai.xi     {
3798*53ee8cc1Swenshuai.xi     #ifdef MSOS_TYPE_NUTTX
3799*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(200);
3800*53ee8cc1Swenshuai.xi     #elif defined MSOS_TYPE_OPTEE
3801*53ee8cc1Swenshuai.xi 
3802*53ee8cc1Swenshuai.xi     #else
3803*53ee8cc1Swenshuai.xi         MsOS_DelayTask(20);
3804*53ee8cc1Swenshuai.xi     #endif
3805*53ee8cc1Swenshuai.xi         u32WaitCnt++;
3806*53ee8cc1Swenshuai.xi     }
3807*53ee8cc1Swenshuai.xi 
3808*53ee8cc1Swenshuai.xi     if(u32WaitCnt >= HASH_TIMEOUT_VALUE)
3809*53ee8cc1Swenshuai.xi     {
3810*53ee8cc1Swenshuai.xi        DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning;HASH timeout!");
3811*53ee8cc1Swenshuai.xi        return DRVAESDMA_FAIL;
3812*53ee8cc1Swenshuai.xi     }
3813*53ee8cc1Swenshuai.xi 
3814*53ee8cc1Swenshuai.xi     //Reverse MSB to LSB for old API compatible
3815*53ee8cc1Swenshuai.xi     if(eStage == E_DRVAESDMA_HASH_STAGE_LAST)
3816*53ee8cc1Swenshuai.xi     {
3817*53ee8cc1Swenshuai.xi         _ReverseU8Buf((MS_U8 *)stCipherCfg.pu8Digest_Buf, u32DgstSize );
3818*53ee8cc1Swenshuai.xi     }
3819*53ee8cc1Swenshuai.xi 
3820*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3821*53ee8cc1Swenshuai.xi }
3822*53ee8cc1Swenshuai.xi 
MDrv_SHA_CalculateManual(DrvAESDMA_HASHCFG stCfg,DrvAESDMA_HASH_STAGE eStage,MS_U32 u32DoneBytes,MS_U8 * pu8SetIV)3823*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_SHA_CalculateManual(DrvAESDMA_HASHCFG stCfg, DrvAESDMA_HASH_STAGE eStage, MS_U32 u32DoneBytes, MS_U8 *pu8SetIV)
3824*53ee8cc1Swenshuai.xi {
3825*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
3826*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3827*53ee8cc1Swenshuai.xi     SHA_CALCULATE_MANUAL pArgs;
3828*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
3829*53ee8cc1Swenshuai.xi     {
3830*53ee8cc1Swenshuai.xi          DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
3831*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3832*53ee8cc1Swenshuai.xi     }
3833*53ee8cc1Swenshuai.xi 
3834*53ee8cc1Swenshuai.xi     if(NULL != stCfg.stInput.u32Addr)
3835*53ee8cc1Swenshuai.xi     {
3836*53ee8cc1Swenshuai.xi         stCfg.stInput.u32Addr = MsOS_VA2PA(stCfg.stInput.u32Addr);
3837*53ee8cc1Swenshuai.xi     }
3838*53ee8cc1Swenshuai.xi     pArgs.stCfg = stCfg;
3839*53ee8cc1Swenshuai.xi     pArgs.eStage = eStage;
3840*53ee8cc1Swenshuai.xi     pArgs.u32DoneBytes = u32DoneBytes;
3841*53ee8cc1Swenshuai.xi     pArgs.pu8SetIV = pu8SetIV;
3842*53ee8cc1Swenshuai.xi 
3843*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_SHA_CalculateManual, (void*)&pArgs);
3844*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3845*53ee8cc1Swenshuai.xi     {
3846*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
3847*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
3848*53ee8cc1Swenshuai.xi     }
3849*53ee8cc1Swenshuai.xi 
3850*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3851*53ee8cc1Swenshuai.xi #else
3852*53ee8cc1Swenshuai.xi 
3853*53ee8cc1Swenshuai.xi     if(NULL != stCfg.stInput.u32Addr)
3854*53ee8cc1Swenshuai.xi     {
3855*53ee8cc1Swenshuai.xi         stCfg.stInput.u32Addr = MsOS_VA2PA(stCfg.stInput.u32Addr);
3856*53ee8cc1Swenshuai.xi     }
3857*53ee8cc1Swenshuai.xi     return _MDrv_SHA_CalculateManual(stCfg, eStage, u32DoneBytes, pu8SetIV);
3858*53ee8cc1Swenshuai.xi #endif
3859*53ee8cc1Swenshuai.xi }
3860*53ee8cc1Swenshuai.xi 
3861*53ee8cc1Swenshuai.xi 
3862*53ee8cc1Swenshuai.xi #ifdef MOBF_ENABLE
MDrv_MOBF_DmaOnly(void)3863*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_MOBF_DmaOnly(void)
3864*53ee8cc1Swenshuai.xi {
3865*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3866*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3867*53ee8cc1Swenshuai.xi }
3868*53ee8cc1Swenshuai.xi 
MDrv_MOBF_Encrypt(MS_U32 u32Key,MS_BOOL bEnable)3869*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_MOBF_Encrypt(MS_U32 u32Key, MS_BOOL bEnable)
3870*53ee8cc1Swenshuai.xi {
3871*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3872*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3873*53ee8cc1Swenshuai.xi }
3874*53ee8cc1Swenshuai.xi 
MDrv_MOBF_Decrypt(MS_U32 u32Key,MS_BOOL bEnable)3875*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_MOBF_Decrypt(MS_U32 u32Key, MS_BOOL bEnable)
3876*53ee8cc1Swenshuai.xi {
3877*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3878*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3879*53ee8cc1Swenshuai.xi }
3880*53ee8cc1Swenshuai.xi 
MDrv_MOBF_OneWay(void)3881*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_MOBF_OneWay(void)
3882*53ee8cc1Swenshuai.xi {
3883*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3884*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3885*53ee8cc1Swenshuai.xi }
3886*53ee8cc1Swenshuai.xi #endif
3887*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Parser_MaskScrmb(MS_BOOL bEnable)3888*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Parser_MaskScrmb(MS_BOOL bEnable)
3889*53ee8cc1Swenshuai.xi {
3890*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3891*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3892*53ee8cc1Swenshuai.xi }
3893*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Parser_SetScrmbPattern(DrvAESDMA_ScrmbPattern ePattern)3894*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Parser_SetScrmbPattern(DrvAESDMA_ScrmbPattern ePattern)
3895*53ee8cc1Swenshuai.xi {
3896*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3897*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3898*53ee8cc1Swenshuai.xi }
3899*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Parser_SetAddedScrmbPattern(DrvAESDMA_ScrmbPattern ePattern)3900*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Parser_SetAddedScrmbPattern(DrvAESDMA_ScrmbPattern ePattern)
3901*53ee8cc1Swenshuai.xi {
3902*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3903*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3904*53ee8cc1Swenshuai.xi }
3905*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Parser_QueryPidCount(void)3906*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_U8 MDrv_AESDMA_Parser_QueryPidCount(void)
3907*53ee8cc1Swenshuai.xi {
3908*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3909*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3910*53ee8cc1Swenshuai.xi }
3911*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Parser_SetPid(MS_U8 u8Index,MS_U16 u16Pid)3912*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Parser_SetPid(MS_U8 u8Index, MS_U16 u16Pid)
3913*53ee8cc1Swenshuai.xi {
3914*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3915*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3916*53ee8cc1Swenshuai.xi }
3917*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Parser_BypassPid(MS_BOOL bEnable)3918*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Parser_BypassPid(MS_BOOL bEnable)
3919*53ee8cc1Swenshuai.xi {
3920*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3921*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3922*53ee8cc1Swenshuai.xi }
3923*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Parser_Encrypt(DrvAESDMA_ParserMode eMode)3924*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Parser_Encrypt(DrvAESDMA_ParserMode eMode)
3925*53ee8cc1Swenshuai.xi {
3926*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3927*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3928*53ee8cc1Swenshuai.xi }
3929*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Parser_Decrypt(DrvAESDMA_ParserMode eMode)3930*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_AESDMA_Parser_Decrypt(DrvAESDMA_ParserMode eMode)
3931*53ee8cc1Swenshuai.xi {
3932*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
3933*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
3934*53ee8cc1Swenshuai.xi }
3935*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Lock(void)3936*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_BOOL MDrv_AESDMA_Lock(void)
3937*53ee8cc1Swenshuai.xi {
3938*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex(_AESDMAMtx, MSOS_WAIT_FOREVER);
3939*53ee8cc1Swenshuai.xi     return TRUE;
3940*53ee8cc1Swenshuai.xi }
3941*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Unlock(void)3942*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_BOOL MDrv_AESDMA_Unlock(void)
3943*53ee8cc1Swenshuai.xi {
3944*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_AESDMAMtx);
3945*53ee8cc1Swenshuai.xi     return TRUE;
3946*53ee8cc1Swenshuai.xi }
3947*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetPowerState(EN_POWER_MODE u16PowerState)3948*53ee8cc1Swenshuai.xi MS_U32 MDrv_AESDMA_SetPowerState(EN_POWER_MODE u16PowerState)
3949*53ee8cc1Swenshuai.xi {
3950*53ee8cc1Swenshuai.xi     static EN_POWER_MODE u16PreAESDMAPowerState = E_POWER_MECHANICAL;
3951*53ee8cc1Swenshuai.xi     MS_U32 u32Return = UTOPIA_STATUS_FAIL;
3952*53ee8cc1Swenshuai.xi 
3953*53ee8cc1Swenshuai.xi     if (u16PowerState == E_POWER_SUSPEND)
3954*53ee8cc1Swenshuai.xi     {
3955*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Go to SUSPEND\n");
3956*53ee8cc1Swenshuai.xi 
3957*53ee8cc1Swenshuai.xi #if !defined (MSOS_TYPE_NOS) && !defined (MCU_AEON) && !defined (MSOS_TYPE_OPTEE)
3958*53ee8cc1Swenshuai.xi         MsOS_DeleteEventGroup(_s32CIPHEREventId);
3959*53ee8cc1Swenshuai.xi #endif
3960*53ee8cc1Swenshuai.xi        // MsOS_DeleteTask(_s32AESDMATaskId);
3961*53ee8cc1Swenshuai.xi         MsOS_DeleteSemaphore(_CipherSemaphore);
3962*53ee8cc1Swenshuai.xi         MsOS_DeleteMutex(_CipherMtx);
3963*53ee8cc1Swenshuai.xi         MsOS_DeleteMutex(_AESDMAMtx);
3964*53ee8cc1Swenshuai.xi 
3965*53ee8cc1Swenshuai.xi         u16PreAESDMAPowerState = u16PowerState;
3966*53ee8cc1Swenshuai.xi         u32Return = UTOPIA_STATUS_SUCCESS;//SUSPEND_OK;
3967*53ee8cc1Swenshuai.xi 
3968*53ee8cc1Swenshuai.xi 		_bCIPHERDrv_Inited = FALSE;
3969*53ee8cc1Swenshuai.xi     }
3970*53ee8cc1Swenshuai.xi     else if (u16PowerState == E_POWER_RESUME)
3971*53ee8cc1Swenshuai.xi     {
3972*53ee8cc1Swenshuai.xi         if (u16PreAESDMAPowerState == E_POWER_SUSPEND)
3973*53ee8cc1Swenshuai.xi         {
3974*53ee8cc1Swenshuai.xi             DEBUG_CIPHER(CIPHER_DBG_WARN, "Go to RESUME\n");
3975*53ee8cc1Swenshuai.xi             _bCIPHERDrv_Inited = FALSE;
3976*53ee8cc1Swenshuai.xi             MDrv_CIPHER_Init();
3977*53ee8cc1Swenshuai.xi 
3978*53ee8cc1Swenshuai.xi 
3979*53ee8cc1Swenshuai.xi             u16PreAESDMAPowerState = u16PowerState;
3980*53ee8cc1Swenshuai.xi             u32Return = UTOPIA_STATUS_SUCCESS;//RESUME_OK;
3981*53ee8cc1Swenshuai.xi         }
3982*53ee8cc1Swenshuai.xi         else
3983*53ee8cc1Swenshuai.xi         {
3984*53ee8cc1Swenshuai.xi             DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s,%5d]It is not suspended yet. We shouldn't resume\n",__FUNCTION__,__LINE__);
3985*53ee8cc1Swenshuai.xi             u32Return = UTOPIA_STATUS_FAIL;//SUSPEND_FAILED;
3986*53ee8cc1Swenshuai.xi         }
3987*53ee8cc1Swenshuai.xi     }
3988*53ee8cc1Swenshuai.xi     else
3989*53ee8cc1Swenshuai.xi     {
3990*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "[%s,%5d]Do Nothing: %d\n",__FUNCTION__,__LINE__,u16PowerState);
3991*53ee8cc1Swenshuai.xi         u32Return = UTOPIA_STATUS_FAIL;
3992*53ee8cc1Swenshuai.xi     }
3993*53ee8cc1Swenshuai.xi 
3994*53ee8cc1Swenshuai.xi     return u32Return;// for success
3995*53ee8cc1Swenshuai.xi 
3996*53ee8cc1Swenshuai.xi }
3997*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_Exit(void)3998*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_Exit(void)
3999*53ee8cc1Swenshuai.xi {
4000*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4001*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4002*53ee8cc1Swenshuai.xi }
4003*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_IsSecretKeyInNormalBank(void)4004*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_IsSecretKeyInNormalBank(void)
4005*53ee8cc1Swenshuai.xi {
4006*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4007*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4008*53ee8cc1Swenshuai.xi }
4009*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_EnableTwoKeys(MS_BOOL bEnable)4010*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_EnableTwoKeys(MS_BOOL bEnable)
4011*53ee8cc1Swenshuai.xi {
4012*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4013*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4014*53ee8cc1Swenshuai.xi }
4015*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetOddKey(MS_U32 * pInitVector)4016*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_SetOddKey(MS_U32 *pInitVector)
4017*53ee8cc1Swenshuai.xi {
4018*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4019*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4020*53ee8cc1Swenshuai.xi }
4021*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_ParserStart(MS_BOOL bStart)4022*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_ParserStart(MS_BOOL bStart)
4023*53ee8cc1Swenshuai.xi {
4024*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4025*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4026*53ee8cc1Swenshuai.xi }
4027*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_NormalReset(void)4028*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_NormalReset(void)
4029*53ee8cc1Swenshuai.xi {
4030*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4031*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4032*53ee8cc1Swenshuai.xi }
4033*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_NormalReset(void)4034*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_NormalReset(void)
4035*53ee8cc1Swenshuai.xi {
4036*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4037*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4038*53ee8cc1Swenshuai.xi }
4039*53ee8cc1Swenshuai.xi 
MDrv_HDCP_ProcessCipher(MS_U8 u8Idx,MS_U8 * pu8Riv,MS_U8 * pu8ContentKey)4040*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_HDCP_ProcessCipher(MS_U8 u8Idx, MS_U8* pu8Riv, MS_U8 *pu8ContentKey)
4041*53ee8cc1Swenshuai.xi {
4042*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4043*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4044*53ee8cc1Swenshuai.xi }
4045*53ee8cc1Swenshuai.xi 
MDrv_HDCP_GetHdcpCipherState(MS_U8 u8Idx,MS_U8 * pu8State)4046*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_HDCP_GetHdcpCipherState(MS_U8 u8Idx, MS_U8 *pu8State)
4047*53ee8cc1Swenshuai.xi {
4048*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4049*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4050*53ee8cc1Swenshuai.xi }
4051*53ee8cc1Swenshuai.xi 
MDrv_HDMI_GetM0(MS_U32 u32InputPortType,MS_U8 * pu8Data)4052*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_HDMI_GetM0(MS_U32 u32InputPortType, MS_U8 *pu8Data)
4053*53ee8cc1Swenshuai.xi {
4054*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4055*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4056*53ee8cc1Swenshuai.xi }
4057*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_SetKeyIndex(MS_U32 u32Index,MS_BOOL bIsOddKey)4058*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_SetKeyIndex (MS_U32 u32Index, MS_BOOL bIsOddKey)
4059*53ee8cc1Swenshuai.xi {
4060*53ee8cc1Swenshuai.xi     DRVAESDMA_RESULT ret = DRVAESDMA_OK;
4061*53ee8cc1Swenshuai.xi 
4062*53ee8cc1Swenshuai.xi     if(HAL_CIPHER_KEYSLOT_BASE > u32Index || (HAL_CIPHER_KEYSLOT_BASE + HAL_CRYPTODMA_DMA_KEY_SLOT - 1) < u32Index)
4063*53ee8cc1Swenshuai.xi     {
4064*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Invalid Key index[0x%04u]!", (unsigned int)u32Index);
4065*53ee8cc1Swenshuai.xi         return DRVAESDMA_INVALID_PARAM;
4066*53ee8cc1Swenshuai.xi     }
4067*53ee8cc1Swenshuai.xi 
4068*53ee8cc1Swenshuai.xi     //Key from KL
4069*53ee8cc1Swenshuai.xi     _CipherKey.eKeySrc = E_CIPHER_KSRC_KL;
4070*53ee8cc1Swenshuai.xi     _CipherKey.pu8KeyData = 0;
4071*53ee8cc1Swenshuai.xi     _CipherKey.u8KeyLen = 0;
4072*53ee8cc1Swenshuai.xi     _CipherKey.u8KeyIdx = u32Index - HAL_CIPHER_KEYSLOT_BASE; //SK0:0x10, SK1:0x11
4073*53ee8cc1Swenshuai.xi 
4074*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:Key Source[%d], Key Length[%u], Key Index[%u]",
4075*53ee8cc1Swenshuai.xi         _CipherKey.eKeySrc, _CipherKey.u8KeyLen, _CipherKey.u8KeyIdx);
4076*53ee8cc1Swenshuai.xi 
4077*53ee8cc1Swenshuai.xi     return ret;
4078*53ee8cc1Swenshuai.xi }
4079*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetKeyIndex(MS_U32 u32Index,MS_BOOL bIsOddKey)4080*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT SYMBOL_WEAK MDrv_AESDMA_SetKeyIndex (MS_U32 u32Index, MS_BOOL bIsOddKey)
4081*53ee8cc1Swenshuai.xi {
4082*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
4083*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4084*53ee8cc1Swenshuai.xi     AESDMA_KEY_INDEX pArgs;
4085*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
4086*53ee8cc1Swenshuai.xi     {
4087*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
4088*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
4089*53ee8cc1Swenshuai.xi     }
4090*53ee8cc1Swenshuai.xi 
4091*53ee8cc1Swenshuai.xi     pArgs.bOddKeyEn = bIsOddKey;
4092*53ee8cc1Swenshuai.xi     pArgs.u32KeyIndex = u32Index;
4093*53ee8cc1Swenshuai.xi 
4094*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_Set_Key_Index, (void*)&pArgs);
4095*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4096*53ee8cc1Swenshuai.xi     {
4097*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
4098*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
4099*53ee8cc1Swenshuai.xi     }
4100*53ee8cc1Swenshuai.xi 
4101*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4102*53ee8cc1Swenshuai.xi #else
4103*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_SetKeyIndex(u32Index, bIsOddKey);
4104*53ee8cc1Swenshuai.xi #endif
4105*53ee8cc1Swenshuai.xi }
4106*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_SetAesCtr64(MS_BOOL bCtr64En)4107*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT SYMBOL_WEAK MDrv_AESDMA_SetAesCtr64 (MS_BOOL bCtr64En)
4108*53ee8cc1Swenshuai.xi {
4109*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4110*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4111*53ee8cc1Swenshuai.xi }
4112*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_AllocKeySlot(MS_U32 * pu32Index)4113*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_AllocKeySlot (MS_U32 *pu32Index)
4114*53ee8cc1Swenshuai.xi {
4115*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
4116*53ee8cc1Swenshuai.xi 
4117*53ee8cc1Swenshuai.xi     if(NULL == pu32Index)
4118*53ee8cc1Swenshuai.xi     {
4119*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:pu32Index is NULL");
4120*53ee8cc1Swenshuai.xi         return DRVAESDMA_INVALID_PARAM;
4121*53ee8cc1Swenshuai.xi     }
4122*53ee8cc1Swenshuai.xi 
4123*53ee8cc1Swenshuai.xi     for(i = 0;i < HAL_CRYPTODMA_DMA_KEY_SLOT;i++)
4124*53ee8cc1Swenshuai.xi     {
4125*53ee8cc1Swenshuai.xi         if(FALSE == _CIPHER_Resource[i].bUsed)
4126*53ee8cc1Swenshuai.xi         {
4127*53ee8cc1Swenshuai.xi             _CIPHER_Resource[i].bUsed = TRUE;
4128*53ee8cc1Swenshuai.xi             *pu32Index = i + HAL_CIPHER_KEYSLOT_BASE;
4129*53ee8cc1Swenshuai.xi             break;
4130*53ee8cc1Swenshuai.xi         }
4131*53ee8cc1Swenshuai.xi     }
4132*53ee8cc1Swenshuai.xi 
4133*53ee8cc1Swenshuai.xi     if(HAL_CRYPTODMA_DMA_KEY_SLOT == i)
4134*53ee8cc1Swenshuai.xi     {
4135*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:No empty key slot");
4136*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
4137*53ee8cc1Swenshuai.xi     }
4138*53ee8cc1Swenshuai.xi 
4139*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4140*53ee8cc1Swenshuai.xi }
4141*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_AllocKeySlot(MS_U32 * pu32Index)4142*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT SYMBOL_WEAK MDrv_AESDMA_AllocKeySlot (MS_U32 *pu32Index)
4143*53ee8cc1Swenshuai.xi {
4144*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
4145*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4146*53ee8cc1Swenshuai.xi     AESDMA_ALLOC_KEY_SLOT pArgs;
4147*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
4148*53ee8cc1Swenshuai.xi     {
4149*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
4150*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
4151*53ee8cc1Swenshuai.xi     }
4152*53ee8cc1Swenshuai.xi 
4153*53ee8cc1Swenshuai.xi     pArgs.pu32KeyIndex = pu32Index;
4154*53ee8cc1Swenshuai.xi 
4155*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_AllocKeySlot, (void*)&pArgs);
4156*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4157*53ee8cc1Swenshuai.xi     {
4158*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
4159*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
4160*53ee8cc1Swenshuai.xi     }
4161*53ee8cc1Swenshuai.xi 
4162*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4163*53ee8cc1Swenshuai.xi #else
4164*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_AllocKeySlot(pu32Index);
4165*53ee8cc1Swenshuai.xi #endif
4166*53ee8cc1Swenshuai.xi 
4167*53ee8cc1Swenshuai.xi }
4168*53ee8cc1Swenshuai.xi 
_MDrv_AESDMA_FreeKeySlot(MS_U32 u32Index)4169*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_AESDMA_FreeKeySlot (MS_U32 u32Index)
4170*53ee8cc1Swenshuai.xi {
4171*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
4172*53ee8cc1Swenshuai.xi 
4173*53ee8cc1Swenshuai.xi     if(HAL_CIPHER_KEYSLOT_BASE > u32Index || (HAL_CIPHER_KEYSLOT_BASE + HAL_CRYPTODMA_DMA_KEY_SLOT - 1) < u32Index)
4174*53ee8cc1Swenshuai.xi     {
4175*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Invalid Key index[0x%04u]!", (unsigned int)u32Index);
4176*53ee8cc1Swenshuai.xi         return DRVAESDMA_INVALID_PARAM;
4177*53ee8cc1Swenshuai.xi     }
4178*53ee8cc1Swenshuai.xi 
4179*53ee8cc1Swenshuai.xi     i = u32Index - HAL_CIPHER_KEYSLOT_BASE;
4180*53ee8cc1Swenshuai.xi 
4181*53ee8cc1Swenshuai.xi     if(DRV_CIPHER_OK != MDrv_CIPHER_ResetKey(_u32CAVid, i))
4182*53ee8cc1Swenshuai.xi     {
4183*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Reset key fail, CAVid=[0x%04u], index=[0x%04u]!", (unsigned int)_u32CAVid, (unsigned int)u32Index);
4184*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
4185*53ee8cc1Swenshuai.xi     }
4186*53ee8cc1Swenshuai.xi 
4187*53ee8cc1Swenshuai.xi     _CIPHER_Resource[i].bUsed = FALSE;
4188*53ee8cc1Swenshuai.xi 
4189*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4190*53ee8cc1Swenshuai.xi }
4191*53ee8cc1Swenshuai.xi 
MDrv_AESDMA_FreeKeySlot(MS_U32 u32Index)4192*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT SYMBOL_WEAK MDrv_AESDMA_FreeKeySlot (MS_U32 u32Index)
4193*53ee8cc1Swenshuai.xi {
4194*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
4195*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4196*53ee8cc1Swenshuai.xi     AESDMA_KEY_INDEX pArgs;
4197*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
4198*53ee8cc1Swenshuai.xi     {
4199*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
4200*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
4201*53ee8cc1Swenshuai.xi     }
4202*53ee8cc1Swenshuai.xi 
4203*53ee8cc1Swenshuai.xi     pArgs.u32KeyIndex = u32Index;
4204*53ee8cc1Swenshuai.xi 
4205*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_AESDMA_FreeKeySlot, (void*)&pArgs);
4206*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4207*53ee8cc1Swenshuai.xi     {
4208*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
4209*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
4210*53ee8cc1Swenshuai.xi     }
4211*53ee8cc1Swenshuai.xi 
4212*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4213*53ee8cc1Swenshuai.xi #else
4214*53ee8cc1Swenshuai.xi     return _MDrv_AESDMA_FreeKeySlot(u32Index);
4215*53ee8cc1Swenshuai.xi #endif
4216*53ee8cc1Swenshuai.xi }
4217*53ee8cc1Swenshuai.xi 
4218*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_NUTTX
MDrv_AESDMA_SetSecurityInfo(DrvAESDMA_SecureInfo * pSecureInfo)4219*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_AESDMA_SetSecurityInfo(DrvAESDMA_SecureInfo *pSecureInfo)
4220*53ee8cc1Swenshuai.xi {
4221*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_ERR, "Not support!");
4222*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4223*53ee8cc1Swenshuai.xi }
4224*53ee8cc1Swenshuai.xi #endif
4225*53ee8cc1Swenshuai.xi 
_MDrv_RSA_Init(void)4226*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_RSA_Init(void)
4227*53ee8cc1Swenshuai.xi {
4228*53ee8cc1Swenshuai.xi     MS_VIRT u32Bank;
4229*53ee8cc1Swenshuai.xi     MS_PHY  u32BankSize;
4230*53ee8cc1Swenshuai.xi 
4231*53ee8cc1Swenshuai.xi     if(_bRSA_Init == FALSE)
4232*53ee8cc1Swenshuai.xi     {
4233*53ee8cc1Swenshuai.xi         if(FALSE == MDrv_MMIO_GetBASE(&u32Bank, &u32BankSize, MS_MODULE_HW))
4234*53ee8cc1Swenshuai.xi         {
4235*53ee8cc1Swenshuai.xi             DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Get MMIO base fail");
4236*53ee8cc1Swenshuai.xi             return FALSE;
4237*53ee8cc1Swenshuai.xi         }
4238*53ee8cc1Swenshuai.xi 
4239*53ee8cc1Swenshuai.xi         HAL_RSA_SetBank(u32Bank);
4240*53ee8cc1Swenshuai.xi 
4241*53ee8cc1Swenshuai.xi         _CipherRSAMtx = MsOS_CreateMutex( E_MSOS_FIFO, (char*)"CIPHER RSA mutex", MSOS_PROCESS_SHARED);
4242*53ee8cc1Swenshuai.xi         _bRSA_Init = TRUE;
4243*53ee8cc1Swenshuai.xi     }
4244*53ee8cc1Swenshuai.xi     return TRUE;
4245*53ee8cc1Swenshuai.xi }
4246*53ee8cc1Swenshuai.xi 
_MDrv_RSA_Calculate(DrvAESDMA_RSASig * pstSign,DrvAESDMA_RSAKey * pstKey,DrvAESDMA_RSAMode eMode)4247*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_RSA_Calculate(DrvAESDMA_RSASig *pstSign, DrvAESDMA_RSAKey *pstKey, DrvAESDMA_RSAMode eMode)
4248*53ee8cc1Swenshuai.xi {
4249*53ee8cc1Swenshuai.xi     MS_U32 ret = DRVAESDMA_OK;
4250*53ee8cc1Swenshuai.xi     MS_U32 u32KeyLen = 0;
4251*53ee8cc1Swenshuai.xi     MS_U8  u8Public = 0;
4252*53ee8cc1Swenshuai.xi     MS_U32 *pu32Sig = NULL;
4253*53ee8cc1Swenshuai.xi 
4254*53ee8cc1Swenshuai.xi     if( pstSign==NULL || pstKey==NULL )
4255*53ee8cc1Swenshuai.xi     {
4256*53ee8cc1Swenshuai.xi         ret = DRVAESDMA_INVALID_PARAM;
4257*53ee8cc1Swenshuai.xi         goto RSA_CAL_FINISH;
4258*53ee8cc1Swenshuai.xi     }
4259*53ee8cc1Swenshuai.xi     pu32Sig = (MS_U32 *)(pstSign);
4260*53ee8cc1Swenshuai.xi 
4261*53ee8cc1Swenshuai.xi     if( _MDrv_RSA_Init()==FALSE )
4262*53ee8cc1Swenshuai.xi     {
4263*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:RSA Init fail");
4264*53ee8cc1Swenshuai.xi         ret = DRVAESDMA_FAIL;
4265*53ee8cc1Swenshuai.xi         goto RSA_CAL_FINISH;
4266*53ee8cc1Swenshuai.xi     }
4267*53ee8cc1Swenshuai.xi 
4268*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex( _CipherRSAMtx, MSOS_WAIT_FOREVER);
4269*53ee8cc1Swenshuai.xi 
4270*53ee8cc1Swenshuai.xi     HAL_RSA_Reset();
4271*53ee8cc1Swenshuai.xi     HAL_RSA_Ind32Ctrl(RAM_WRITE);
4272*53ee8cc1Swenshuai.xi 
4273*53ee8cc1Swenshuai.xi     switch (eMode)
4274*53ee8cc1Swenshuai.xi     {
4275*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA1024_PUBLIC:
4276*53ee8cc1Swenshuai.xi         {
4277*53ee8cc1Swenshuai.xi             u32KeyLen = 128;
4278*53ee8cc1Swenshuai.xi             u8Public = E_RSA_USE_PUB_KEY;
4279*53ee8cc1Swenshuai.xi             break;
4280*53ee8cc1Swenshuai.xi         }
4281*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA1024_PRIVATE:
4282*53ee8cc1Swenshuai.xi         {
4283*53ee8cc1Swenshuai.xi             u32KeyLen = 128;
4284*53ee8cc1Swenshuai.xi             u8Public = E_RSA_USE_PRIV_KEY;
4285*53ee8cc1Swenshuai.xi             break;
4286*53ee8cc1Swenshuai.xi         }
4287*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA2048_PUBLIC:
4288*53ee8cc1Swenshuai.xi         {
4289*53ee8cc1Swenshuai.xi             u32KeyLen = 256;
4290*53ee8cc1Swenshuai.xi             u8Public = E_RSA_USE_PUB_KEY;
4291*53ee8cc1Swenshuai.xi             break;
4292*53ee8cc1Swenshuai.xi         }
4293*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA2048_PRIVATE:
4294*53ee8cc1Swenshuai.xi         {
4295*53ee8cc1Swenshuai.xi             u32KeyLen = 256;
4296*53ee8cc1Swenshuai.xi             u8Public = E_RSA_USE_PRIV_KEY;
4297*53ee8cc1Swenshuai.xi             break;
4298*53ee8cc1Swenshuai.xi         }
4299*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA256_PUBLIC:
4300*53ee8cc1Swenshuai.xi         {
4301*53ee8cc1Swenshuai.xi             u32KeyLen = 32;
4302*53ee8cc1Swenshuai.xi             u8Public = E_RSA_USE_PUB_KEY;
4303*53ee8cc1Swenshuai.xi             break;
4304*53ee8cc1Swenshuai.xi         }
4305*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA256_PRIVATE:
4306*53ee8cc1Swenshuai.xi         {
4307*53ee8cc1Swenshuai.xi             u32KeyLen = 32;
4308*53ee8cc1Swenshuai.xi             u8Public = E_RSA_USE_PRIV_KEY;
4309*53ee8cc1Swenshuai.xi             break;
4310*53ee8cc1Swenshuai.xi         }
4311*53ee8cc1Swenshuai.xi         default:
4312*53ee8cc1Swenshuai.xi         {
4313*53ee8cc1Swenshuai.xi             ret = DRVAESDMA_INVALID_PARAM;
4314*53ee8cc1Swenshuai.xi             goto RSA_CAL_FINISH;
4315*53ee8cc1Swenshuai.xi         }
4316*53ee8cc1Swenshuai.xi     }
4317*53ee8cc1Swenshuai.xi 
4318*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "RSA Mode[%d]", eMode);
4319*53ee8cc1Swenshuai.xi 
4320*53ee8cc1Swenshuai.xi     HAL_RSA_LoadSram((pstKey->u32KeyE), E_RSA_ADDRESS_E);
4321*53ee8cc1Swenshuai.xi     HAL_RSA_LoadSram((pstKey->u32KeyN), E_RSA_ADDRESS_N);
4322*53ee8cc1Swenshuai.xi     HAL_RSA_LoadSram(pu32Sig, E_RSA_ADDRESS_A);
4323*53ee8cc1Swenshuai.xi 
4324*53ee8cc1Swenshuai.xi     HAL_RSA_SetKeyLength((u32KeyLen/RSA_UNIT_SIZE)-1);
4325*53ee8cc1Swenshuai.xi     HAL_RSA_SetKeyType(E_RSA_USE_SW_KEY, u8Public); //sw key, public key
4326*53ee8cc1Swenshuai.xi     HAL_RSA_ExponetialStart();
4327*53ee8cc1Swenshuai.xi 
4328*53ee8cc1Swenshuai.xi RSA_CAL_FINISH:
4329*53ee8cc1Swenshuai.xi     return ret;
4330*53ee8cc1Swenshuai.xi }
4331*53ee8cc1Swenshuai.xi 
MDrv_RSA_Calculate(DrvAESDMA_RSASig * pstSign,DrvAESDMA_RSAKey * pstKey,DrvAESDMA_RSAMode eMode)4332*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_RSA_Calculate(DrvAESDMA_RSASig *pstSign, DrvAESDMA_RSAKey *pstKey, DrvAESDMA_RSAMode eMode)
4333*53ee8cc1Swenshuai.xi {
4334*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
4335*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4336*53ee8cc1Swenshuai.xi     RSA_CALCULATE pArgs;
4337*53ee8cc1Swenshuai.xi 
4338*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
4339*53ee8cc1Swenshuai.xi     {
4340*53ee8cc1Swenshuai.xi         if(UTOPIA_STATUS_FAIL == UtopiaOpen(MODULE_AESDMA, &pu32AesdmaInst, 0x0, NULL))
4341*53ee8cc1Swenshuai.xi         {
4342*53ee8cc1Swenshuai.xi             DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaOpen CIPHER fail");
4343*53ee8cc1Swenshuai.xi             return DRVAESDMA_FAIL;
4344*53ee8cc1Swenshuai.xi         }
4345*53ee8cc1Swenshuai.xi     }
4346*53ee8cc1Swenshuai.xi 
4347*53ee8cc1Swenshuai.xi     pArgs.pstSign = pstSign;
4348*53ee8cc1Swenshuai.xi     pArgs.pstKey = pstKey;
4349*53ee8cc1Swenshuai.xi     pArgs.eMode = eMode;
4350*53ee8cc1Swenshuai.xi 
4351*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_RSA_Calculate, (void*)&pArgs);
4352*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4353*53ee8cc1Swenshuai.xi     {
4354*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
4355*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
4356*53ee8cc1Swenshuai.xi     }
4357*53ee8cc1Swenshuai.xi 
4358*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4359*53ee8cc1Swenshuai.xi #else
4360*53ee8cc1Swenshuai.xi     return _MDrv_RSA_Calculate(pstSign, pstKey, eMode);
4361*53ee8cc1Swenshuai.xi #endif
4362*53ee8cc1Swenshuai.xi }
MDrv_RSA_Calculate_Hw_Key(DrvAESDMA_RSASig * pstSign,DrvAESDMA_RSAHwKeyMode eMode)4363*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT MDrv_RSA_Calculate_Hw_Key(DrvAESDMA_RSASig *pstSign, DrvAESDMA_RSAHwKeyMode eMode)
4364*53ee8cc1Swenshuai.xi {
4365*53ee8cc1Swenshuai.xi     MS_U32 ret = DRVAESDMA_OK;
4366*53ee8cc1Swenshuai.xi     MS_U8  u8KeySrc= 0;
4367*53ee8cc1Swenshuai.xi     MS_U8  u8Public = 0;
4368*53ee8cc1Swenshuai.xi     MS_U32 *pu32Sig = NULL;
4369*53ee8cc1Swenshuai.xi     MS_U32 u32SwitchValue;
4370*53ee8cc1Swenshuai.xi 
4371*53ee8cc1Swenshuai.xi     if( pstSign==NULL )
4372*53ee8cc1Swenshuai.xi     {
4373*53ee8cc1Swenshuai.xi         ret = DRVAESDMA_INVALID_PARAM;
4374*53ee8cc1Swenshuai.xi         goto RSA_CAL_HW_FINISH;
4375*53ee8cc1Swenshuai.xi     }
4376*53ee8cc1Swenshuai.xi     pu32Sig = (MS_U32 *)(pstSign);
4377*53ee8cc1Swenshuai.xi 
4378*53ee8cc1Swenshuai.xi     if( _MDrv_RSA_Init()==FALSE )
4379*53ee8cc1Swenshuai.xi     {
4380*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:RSA Init fail");
4381*53ee8cc1Swenshuai.xi         ret = DRVAESDMA_FAIL;
4382*53ee8cc1Swenshuai.xi         goto RSA_CAL_HW_FINISH;
4383*53ee8cc1Swenshuai.xi     }
4384*53ee8cc1Swenshuai.xi 
4385*53ee8cc1Swenshuai.xi     MsOS_ObtainMutex( _CipherRSAMtx, MSOS_WAIT_FOREVER);
4386*53ee8cc1Swenshuai.xi 
4387*53ee8cc1Swenshuai.xi     HAL_RSA_Reset();
4388*53ee8cc1Swenshuai.xi     HAL_RSA_Ind32Ctrl(RAM_WRITE);
4389*53ee8cc1Swenshuai.xi 
4390*53ee8cc1Swenshuai.xi     switch (eMode)
4391*53ee8cc1Swenshuai.xi     {
4392*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA_HWKEY_PRIVATE:
4393*53ee8cc1Swenshuai.xi         {
4394*53ee8cc1Swenshuai.xi             u8KeySrc = E_RSA_HW_PRI_KEY;
4395*53ee8cc1Swenshuai.xi             u8Public = E_RSA_USE_PRIV_KEY;
4396*53ee8cc1Swenshuai.xi             break;
4397*53ee8cc1Swenshuai.xi         }
4398*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA_HWKEY_PUBLIC1:
4399*53ee8cc1Swenshuai.xi         {
4400*53ee8cc1Swenshuai.xi             u8KeySrc = E_RSA_HW_PUB_KEY1;
4401*53ee8cc1Swenshuai.xi             u8Public = E_RSA_USE_PUB_KEY;
4402*53ee8cc1Swenshuai.xi             break;
4403*53ee8cc1Swenshuai.xi         }
4404*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA_HWKEY_PUBLIC2:
4405*53ee8cc1Swenshuai.xi         {
4406*53ee8cc1Swenshuai.xi             u8KeySrc = E_RSA_HW_PUB_KEY2;
4407*53ee8cc1Swenshuai.xi             u8Public = E_RSA_USE_PUB_KEY;
4408*53ee8cc1Swenshuai.xi             break;
4409*53ee8cc1Swenshuai.xi         }
4410*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA_HWKEY_ROM_PRIVATE:
4411*53ee8cc1Swenshuai.xi         {
4412*53ee8cc1Swenshuai.xi             u8KeySrc = E_RSA_HW_PRI_KEY;
4413*53ee8cc1Swenshuai.xi             u8Public = E_RSA_USE_PRIV_KEY;
4414*53ee8cc1Swenshuai.xi             break;
4415*53ee8cc1Swenshuai.xi         }
4416*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA_HWKEY_ROM_PUBLIC:
4417*53ee8cc1Swenshuai.xi         {
4418*53ee8cc1Swenshuai.xi             u8KeySrc = E_RSA_HW_PUB_KEY1;
4419*53ee8cc1Swenshuai.xi             u8Public = E_RSA_USE_PUB_KEY;
4420*53ee8cc1Swenshuai.xi             break;
4421*53ee8cc1Swenshuai.xi         }
4422*53ee8cc1Swenshuai.xi         default:
4423*53ee8cc1Swenshuai.xi         {
4424*53ee8cc1Swenshuai.xi             ret = DRVAESDMA_INVALID_PARAM;
4425*53ee8cc1Swenshuai.xi             goto RSA_CAL_HW_FINISH;
4426*53ee8cc1Swenshuai.xi         }
4427*53ee8cc1Swenshuai.xi     }
4428*53ee8cc1Swenshuai.xi 
4429*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:RSA Mode[%d], Key Source[%u], Public[%u]",
4430*53ee8cc1Swenshuai.xi         eMode, u8KeySrc, u8Public);
4431*53ee8cc1Swenshuai.xi 
4432*53ee8cc1Swenshuai.xi     if(eMode == E_DRVAESDMA_RSA_HWKEY_ROM_PRIVATE || eMode == E_DRVAESDMA_RSA_HWKEY_ROM_PUBLIC)
4433*53ee8cc1Swenshuai.xi     {
4434*53ee8cc1Swenshuai.xi         HAL_RSA_Hwkey_Switch();
4435*53ee8cc1Swenshuai.xi 
4436*53ee8cc1Swenshuai.xi         u32SwitchValue = HAL_RSA_Read_Hwkey_Switch();
4437*53ee8cc1Swenshuai.xi 
4438*53ee8cc1Swenshuai.xi         if( u32SwitchValue != 1 )
4439*53ee8cc1Swenshuai.xi         {
4440*53ee8cc1Swenshuai.xi             DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:RSA Hwkey Switch fail");
4441*53ee8cc1Swenshuai.xi             ret = DRVAESDMA_FAIL;
4442*53ee8cc1Swenshuai.xi             goto RSA_CAL_HW_FINISH;
4443*53ee8cc1Swenshuai.xi         }
4444*53ee8cc1Swenshuai.xi     }
4445*53ee8cc1Swenshuai.xi 
4446*53ee8cc1Swenshuai.xi     HAL_RSA_LoadSram(pu32Sig, E_RSA_ADDRESS_A);
4447*53ee8cc1Swenshuai.xi 
4448*53ee8cc1Swenshuai.xi     HAL_RSA_SetKeyType(E_RSA_USE_HW_KEY, u8Public);
4449*53ee8cc1Swenshuai.xi     HAL_RSA_Rootkey_Sel(u8KeySrc);
4450*53ee8cc1Swenshuai.xi     HAL_RSA_ExponetialStart();
4451*53ee8cc1Swenshuai.xi 
4452*53ee8cc1Swenshuai.xi RSA_CAL_HW_FINISH:
4453*53ee8cc1Swenshuai.xi     return ret;
4454*53ee8cc1Swenshuai.xi }
4455*53ee8cc1Swenshuai.xi 
_MDrv_RSA_IsFinished(void)4456*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_RSA_IsFinished(void)
4457*53ee8cc1Swenshuai.xi {
4458*53ee8cc1Swenshuai.xi     RSAInitChk();
4459*53ee8cc1Swenshuai.xi 
4460*53ee8cc1Swenshuai.xi     if(HAL_RSA_Get_RSA_IsFinished()==0)
4461*53ee8cc1Swenshuai.xi     {
4462*53ee8cc1Swenshuai.xi         return DRVAESDMA_OK;
4463*53ee8cc1Swenshuai.xi     }
4464*53ee8cc1Swenshuai.xi     else
4465*53ee8cc1Swenshuai.xi     {
4466*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:RSA Not Done!");
4467*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
4468*53ee8cc1Swenshuai.xi     }
4469*53ee8cc1Swenshuai.xi }
4470*53ee8cc1Swenshuai.xi 
MDrv_RSA_IsFinished(void)4471*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_RSA_IsFinished(void)
4472*53ee8cc1Swenshuai.xi {
4473*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
4474*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4475*53ee8cc1Swenshuai.xi     MS_U32 u32TimeOut = RSA_DEFAULT_TIMEOUT_VALUE;
4476*53ee8cc1Swenshuai.xi 
4477*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
4478*53ee8cc1Swenshuai.xi     {
4479*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
4480*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
4481*53ee8cc1Swenshuai.xi     }
4482*53ee8cc1Swenshuai.xi 
4483*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_RSA_IsFinished, (void*)&u32TimeOut);
4484*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4485*53ee8cc1Swenshuai.xi     {
4486*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_WARN, "Warning:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
4487*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
4488*53ee8cc1Swenshuai.xi     }
4489*53ee8cc1Swenshuai.xi 
4490*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4491*53ee8cc1Swenshuai.xi #else
4492*53ee8cc1Swenshuai.xi     return _MDrv_RSA_IsFinished();
4493*53ee8cc1Swenshuai.xi #endif
4494*53ee8cc1Swenshuai.xi }
4495*53ee8cc1Swenshuai.xi 
_MDrv_RSA_Output(DrvAESDMA_RSAMode eMode,DrvAESDMA_RSAOut * pstRSAOut)4496*53ee8cc1Swenshuai.xi DRVAESDMA_RESULT _MDrv_RSA_Output(DrvAESDMA_RSAMode eMode, DrvAESDMA_RSAOut *pstRSAOut)
4497*53ee8cc1Swenshuai.xi {
4498*53ee8cc1Swenshuai.xi     MS_U32 ret = DRVAESDMA_OK;
4499*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
4500*53ee8cc1Swenshuai.xi     MS_U32 u32KeyLen = 0;
4501*53ee8cc1Swenshuai.xi     MS_U32 *pu32RSAOut = (MS_U32 *)(pstRSAOut->u32RSAOut);
4502*53ee8cc1Swenshuai.xi 
4503*53ee8cc1Swenshuai.xi     RSAInitChk();
4504*53ee8cc1Swenshuai.xi 
4505*53ee8cc1Swenshuai.xi     switch (eMode)
4506*53ee8cc1Swenshuai.xi     {
4507*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA1024_PUBLIC:
4508*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA1024_PRIVATE:
4509*53ee8cc1Swenshuai.xi         {
4510*53ee8cc1Swenshuai.xi             u32KeyLen = 128;
4511*53ee8cc1Swenshuai.xi             break;
4512*53ee8cc1Swenshuai.xi         }
4513*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA2048_PUBLIC:
4514*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA2048_PRIVATE:
4515*53ee8cc1Swenshuai.xi         {
4516*53ee8cc1Swenshuai.xi             u32KeyLen = 256;
4517*53ee8cc1Swenshuai.xi             break;
4518*53ee8cc1Swenshuai.xi         }
4519*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA256_PUBLIC:
4520*53ee8cc1Swenshuai.xi         case E_DRVAESDMA_RSA256_PRIVATE:
4521*53ee8cc1Swenshuai.xi         {
4522*53ee8cc1Swenshuai.xi             u32KeyLen = 32;
4523*53ee8cc1Swenshuai.xi             break;
4524*53ee8cc1Swenshuai.xi         }
4525*53ee8cc1Swenshuai.xi         default:
4526*53ee8cc1Swenshuai.xi         {
4527*53ee8cc1Swenshuai.xi             ret = DRVAESDMA_INVALID_PARAM;
4528*53ee8cc1Swenshuai.xi             goto RSA_OUTPUT_FINISH;
4529*53ee8cc1Swenshuai.xi         }
4530*53ee8cc1Swenshuai.xi     }
4531*53ee8cc1Swenshuai.xi 
4532*53ee8cc1Swenshuai.xi     DEBUG_CIPHER(CIPHER_DBG_INFO, "INFO:RSA Mode[%d], Key length[%u]", eMode, u32KeyLen);
4533*53ee8cc1Swenshuai.xi 
4534*53ee8cc1Swenshuai.xi     HAL_RSA_SetFileOutAddr(64-(u32KeyLen/sizeof(MS_U32)));
4535*53ee8cc1Swenshuai.xi     HAL_RSA_Ind32Ctrl(RAM_READ);
4536*53ee8cc1Swenshuai.xi     HAL_RSA_FileOutStart();
4537*53ee8cc1Swenshuai.xi 	for( i = 0; i<(u32KeyLen/RSA_UNIT_SIZE); i++)
4538*53ee8cc1Swenshuai.xi 	{
4539*53ee8cc1Swenshuai.xi 		pu32RSAOut[(u32KeyLen/RSA_UNIT_SIZE)-1-i] = HAL_RSA_FileOut();
4540*53ee8cc1Swenshuai.xi 	}
4541*53ee8cc1Swenshuai.xi 
4542*53ee8cc1Swenshuai.xi RSA_OUTPUT_FINISH:
4543*53ee8cc1Swenshuai.xi     MsOS_ReleaseMutex(_CipherRSAMtx);
4544*53ee8cc1Swenshuai.xi     return ret;
4545*53ee8cc1Swenshuai.xi }
MDrv_RSA_Output(DrvAESDMA_RSAMode eMode,DrvAESDMA_RSAOut * pstRSAOut)4546*53ee8cc1Swenshuai.xi DLL_PUBLIC DRVAESDMA_RESULT MDrv_RSA_Output(DrvAESDMA_RSAMode eMode, DrvAESDMA_RSAOut *pstRSAOut)
4547*53ee8cc1Swenshuai.xi {
4548*53ee8cc1Swenshuai.xi #if CIPHER_UTOPIA2
4549*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4550*53ee8cc1Swenshuai.xi     RSA_OUTPUT pArgs;
4551*53ee8cc1Swenshuai.xi     if(pu32AesdmaInst == NULL)
4552*53ee8cc1Swenshuai.xi     {
4553*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:Cipher instance NULL");
4554*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
4555*53ee8cc1Swenshuai.xi     }
4556*53ee8cc1Swenshuai.xi 
4557*53ee8cc1Swenshuai.xi     pArgs.eMode = eMode;
4558*53ee8cc1Swenshuai.xi     pArgs.pstRSAOut = pstRSAOut;
4559*53ee8cc1Swenshuai.xi 
4560*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32AesdmaInst, MDrv_CMD_RSA_Output, (void*)&pArgs);
4561*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4562*53ee8cc1Swenshuai.xi     {
4563*53ee8cc1Swenshuai.xi         DEBUG_CIPHER(CIPHER_DBG_ERR, "Error:UtopiaIoctl return value 0x%x", (unsigned int)u32Ret);
4564*53ee8cc1Swenshuai.xi         return DRVAESDMA_FAIL;
4565*53ee8cc1Swenshuai.xi     }
4566*53ee8cc1Swenshuai.xi 
4567*53ee8cc1Swenshuai.xi     return DRVAESDMA_OK;
4568*53ee8cc1Swenshuai.xi #else
4569*53ee8cc1Swenshuai.xi     return _MDrv_RSA_Output(eMode, pstRSAOut);
4570*53ee8cc1Swenshuai.xi #endif
4571*53ee8cc1Swenshuai.xi }
4572*53ee8cc1Swenshuai.xi 
4573*53ee8cc1Swenshuai.xi 
4574