xref: /utopia/UTPA2-700.0.x/modules/security/hal/curry/cipher/halCIPHER.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
2*53ee8cc1Swenshuai.xi //
3*53ee8cc1Swenshuai.xi // Copyright (c) 2006-2013 MStar Semiconductor, Inc.
4*53ee8cc1Swenshuai.xi // All rights reserved.
5*53ee8cc1Swenshuai.xi //
6*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
7*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
8*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
9*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
10*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
11*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
12*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
13*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
14*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
17*53ee8cc1Swenshuai.xi 
18*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////////////////
19*53ee8cc1Swenshuai.xi // file   halCIPHER.c
20*53ee8cc1Swenshuai.xi // @brief  CIPHER HAL
21*53ee8cc1Swenshuai.xi // @author MStar Semiconductor,Inc.
22*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////////////////
23*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
24*53ee8cc1Swenshuai.xi #include <linux/string.h>
25*53ee8cc1Swenshuai.xi #include <linux/uaccess.h>
26*53ee8cc1Swenshuai.xi #include <linux/compat.h>
27*53ee8cc1Swenshuai.xi #else
28*53ee8cc1Swenshuai.xi #include <stdio.h>
29*53ee8cc1Swenshuai.xi #include <string.h>
30*53ee8cc1Swenshuai.xi #endif
31*53ee8cc1Swenshuai.xi 
32*53ee8cc1Swenshuai.xi 
33*53ee8cc1Swenshuai.xi #include "MsCommon.h"
34*53ee8cc1Swenshuai.xi #include "regCIPHER.h"
35*53ee8cc1Swenshuai.xi #include "halCIPHER.h"
36*53ee8cc1Swenshuai.xi #include "drvCIPHER.h"
37*53ee8cc1Swenshuai.xi #include "halCHIP.h"
38*53ee8cc1Swenshuai.xi 
39*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
40*53ee8cc1Swenshuai.xi extern void * memset ( void * ptr, int value, size_t num );
41*53ee8cc1Swenshuai.xi extern void * memcpy ( void * destination, const void * source, size_t num );
42*53ee8cc1Swenshuai.xi extern int printf ( const char * format, ... );
43*53ee8cc1Swenshuai.xi #endif
44*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
45*53ee8cc1Swenshuai.xi //  Driver Compiler Option
46*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
47*53ee8cc1Swenshuai.xi 
48*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
49*53ee8cc1Swenshuai.xi //  Macro of bit operations
50*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
51*53ee8cc1Swenshuai.xi #define     DELAY_WAITING           1UL
52*53ee8cc1Swenshuai.xi #define     DELAY_RESCHEDULE        10UL
53*53ee8cc1Swenshuai.xi #define     COMQ_AVALIABLE          0x10UL
54*53ee8cc1Swenshuai.xi #define     CIPHER_KEY_SIZE         16UL
55*53ee8cc1Swenshuai.xi #define     CRYPTODMA_DEBUG_SIZE    32UL
56*53ee8cc1Swenshuai.xi #define     HASH_MANUAL_BLOCK_SIZE  64UL
57*53ee8cc1Swenshuai.xi #define     PID_SIZE                2UL
58*53ee8cc1Swenshuai.xi #define     MIU_SELECT_BIT          0x80000000UL
59*53ee8cc1Swenshuai.xi 
60*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
61*53ee8cc1Swenshuai.xi //  TSP Hardware Abstraction Layer
62*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
63*53ee8cc1Swenshuai.xi static  MS_VIRT               _u32RegBase = 0;
64*53ee8cc1Swenshuai.xi static REG_AESDMACtrl        *_AESDMACtrl  = 0 ;
65*53ee8cc1Swenshuai.xi static CIPHER_DBGMSG_LEVEL _HAL_CIPHERDBGLevel = CIPHER_DBG_ERR;
66*53ee8cc1Swenshuai.xi 
67*53ee8cc1Swenshuai.xi // Algorithm Table for AES/TDES/DES
68*53ee8cc1Swenshuai.xi static MS_BOOL _CryptodMA_AlgoTable[4][E_DMA_MODE_NUM][E_DMA_RESIDUE_NUM][E_DMA_SB_NUM];
69*53ee8cc1Swenshuai.xi 
70*53ee8cc1Swenshuai.xi #define REG_READ 0
71*53ee8cc1Swenshuai.xi #define REG_WRITE 1
72*53ee8cc1Swenshuai.xi #define REG32_R(Addr)    _REG32_R((MS_VIRT)Addr)
73*53ee8cc1Swenshuai.xi #define REG32_W(Addr, Value)    _REG32_W((MS_VIRT)Addr, Value)
74*53ee8cc1Swenshuai.xi #define REG16_R(Addr)    _REG16_R((MS_VIRT)Addr)
75*53ee8cc1Swenshuai.xi #define REG16_W(Addr, Value)    _REG16_W((MS_VIRT)Addr, Value)
76*53ee8cc1Swenshuai.xi 
77*53ee8cc1Swenshuai.xi #ifdef CIPHER_NO_PRINTF
78*53ee8cc1Swenshuai.xi #define HAL_DEBUG_CIPHER(debug_level, x)
79*53ee8cc1Swenshuai.xi #else
80*53ee8cc1Swenshuai.xi #define HAL_DEBUG_CIPHER(debug_level, x)     do { if (_HAL_CIPHERDBGLevel >= (debug_level)) (x); } while(0)
81*53ee8cc1Swenshuai.xi #endif
82*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
83*53ee8cc1Swenshuai.xi //   Local Variable
84*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
85*53ee8cc1Swenshuai.xi 
86*53ee8cc1Swenshuai.xi MS_PHY _u32DmaInAddr;
87*53ee8cc1Swenshuai.xi MS_U32 _u32DmaInNum;
88*53ee8cc1Swenshuai.xi MS_PHY _u32DmaOut_StartAddr;
89*53ee8cc1Swenshuai.xi MS_PHY _u32DmaOut_EndAddr;
90*53ee8cc1Swenshuai.xi MS_PHY _u32ReportAddr;
91*53ee8cc1Swenshuai.xi MS_U32 _u32OTPHashLengthPadding;
92*53ee8cc1Swenshuai.xi 
93*53ee8cc1Swenshuai.xi MS_U8 _pu8CipherKey[CIPHER_KEY_SIZE];
94*53ee8cc1Swenshuai.xi MS_U8 _pu8CipherKey2[CIPHER_KEY_SIZE];
95*53ee8cc1Swenshuai.xi MS_U8 _pu8IV[CIPHER_KEY_SIZE];
96*53ee8cc1Swenshuai.xi MS_U8 _pu8IV2[CIPHER_KEY_SIZE];
97*53ee8cc1Swenshuai.xi MS_U8 _pu8Data[CIPHER_KEY_SIZE];
98*53ee8cc1Swenshuai.xi MS_U8 _pu8PID0[PID_SIZE];
99*53ee8cc1Swenshuai.xi MS_U8 _pu8PID1[PID_SIZE];
100*53ee8cc1Swenshuai.xi 
101*53ee8cc1Swenshuai.xi MS_U32 _u32CmdLen = 0 ;
102*53ee8cc1Swenshuai.xi 
103*53ee8cc1Swenshuai.xi // [NOTE] Solve Strict-Aliasing //
104*53ee8cc1Swenshuai.xi union {
105*53ee8cc1Swenshuai.xi     CMD_DmaFormat0  DmaCtrl0;
106*53ee8cc1Swenshuai.xi     MS_U32 u32DmaCtrl0;
107*53ee8cc1Swenshuai.xi }_uDmaCtrl0;
108*53ee8cc1Swenshuai.xi 
109*53ee8cc1Swenshuai.xi union{
110*53ee8cc1Swenshuai.xi     CMD_DmaFormat1  DmaCtrl1;
111*53ee8cc1Swenshuai.xi     MS_U32 u32DmaCtrl1;
112*53ee8cc1Swenshuai.xi }_uDmaCtrl1;
113*53ee8cc1Swenshuai.xi 
114*53ee8cc1Swenshuai.xi union{
115*53ee8cc1Swenshuai.xi     CMD_DmaFormat2  DmaCtrl2;
116*53ee8cc1Swenshuai.xi     MS_U32 u32DmaCtrl2;
117*53ee8cc1Swenshuai.xi }_uDmaCtrl2;
118*53ee8cc1Swenshuai.xi 
119*53ee8cc1Swenshuai.xi union{
120*53ee8cc1Swenshuai.xi     CMD_DmaFormat3  DmaCtrl3;
121*53ee8cc1Swenshuai.xi     MS_U32 u32DmaCtrl3;
122*53ee8cc1Swenshuai.xi }_uDmaCtrl3;
123*53ee8cc1Swenshuai.xi 
124*53ee8cc1Swenshuai.xi union{
125*53ee8cc1Swenshuai.xi     Hash_DmaFormat0  HashCtrl0;
126*53ee8cc1Swenshuai.xi     MS_U32 u32HashCtrl0;
127*53ee8cc1Swenshuai.xi }_uHashCtrl0;
128*53ee8cc1Swenshuai.xi 
129*53ee8cc1Swenshuai.xi union{
130*53ee8cc1Swenshuai.xi     Hash_DmaFormat1  HashCtrl1;
131*53ee8cc1Swenshuai.xi     MS_U32 u32HashCtrl1;
132*53ee8cc1Swenshuai.xi }_uHashCtrl1;
133*53ee8cc1Swenshuai.xi 
134*53ee8cc1Swenshuai.xi union{
135*53ee8cc1Swenshuai.xi     CMD_HashFormat2  HashCtrl2;
136*53ee8cc1Swenshuai.xi     MS_U32 u32HashCtrl2;
137*53ee8cc1Swenshuai.xi }_uHashCtrl2;
138*53ee8cc1Swenshuai.xi 
139*53ee8cc1Swenshuai.xi MS_PHY _u32HashSrcAddr;
140*53ee8cc1Swenshuai.xi MS_PHY _u32HashDestAddr;
141*53ee8cc1Swenshuai.xi MS_U32 _u32InitWordCnt;
142*53ee8cc1Swenshuai.xi MS_U32 _u32HashMsgLen;
143*53ee8cc1Swenshuai.xi 
144*53ee8cc1Swenshuai.xi MS_U8  _pu8HashIV[HASH_CMD_IV_SIZE];
145*53ee8cc1Swenshuai.xi MS_U8  _pu8HashMsg[HASH_CMD_MSG_SIZE];
146*53ee8cc1Swenshuai.xi MS_U8  _pu8HashHMACHostKey[HASH_CMD_HMAC_HOSTKEY_SIZE];
147*53ee8cc1Swenshuai.xi 
148*53ee8cc1Swenshuai.xi static MS_U32 _CIPHER_CAVid = 0x0F;
149*53ee8cc1Swenshuai.xi 
150*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
151*53ee8cc1Swenshuai.xi //  Inline Function
152*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
153*53ee8cc1Swenshuai.xi #ifdef CIPHER_SMC_MODE
REG_REE2ATF(MS_U64 u64Addr,MS_U64 u64Value,MS_U64 u64Status)154*53ee8cc1Swenshuai.xi static MS_U64 REG_REE2ATF(MS_U64 u64Addr, MS_U64 u64Value, MS_U64 u64Status)
155*53ee8cc1Swenshuai.xi {
156*53ee8cc1Swenshuai.xi     MS_U64 u64Tmp = 0;
157*53ee8cc1Swenshuai.xi 
158*53ee8cc1Swenshuai.xi     asm volatile(
159*53ee8cc1Swenshuai.xi         "ldr x0, =0x8400ee01\n\t"
160*53ee8cc1Swenshuai.xi         "ldr x1, %1\n\t"
161*53ee8cc1Swenshuai.xi         "ldr x2, %2\n\t"
162*53ee8cc1Swenshuai.xi         "ldr x3, %3\n\t"
163*53ee8cc1Swenshuai.xi         "smc #0\n\t"
164*53ee8cc1Swenshuai.xi         "mov %0, x0\n\t"
165*53ee8cc1Swenshuai.xi         : "=r" (u64Tmp)
166*53ee8cc1Swenshuai.xi         : "m" (u64Addr), "m" (u64Value), "m" (u64Status):"x0", "x1", "x2", "x3"
167*53ee8cc1Swenshuai.xi     );
168*53ee8cc1Swenshuai.xi 
169*53ee8cc1Swenshuai.xi     return u64Tmp;
170*53ee8cc1Swenshuai.xi }
171*53ee8cc1Swenshuai.xi #endif
172*53ee8cc1Swenshuai.xi 
_REG32_R(MS_VIRT u32Reg)173*53ee8cc1Swenshuai.xi static MS_U32 _REG32_R(MS_VIRT u32Reg)
174*53ee8cc1Swenshuai.xi {
175*53ee8cc1Swenshuai.xi #ifdef CIPHER_SMC_MODE
176*53ee8cc1Swenshuai.xi     return REG_REE2ATF(u32Reg, 0, REG_READ) ;
177*53ee8cc1Swenshuai.xi #else
178*53ee8cc1Swenshuai.xi     return *((volatile MS_U32*)u32Reg);
179*53ee8cc1Swenshuai.xi #endif
180*53ee8cc1Swenshuai.xi }
181*53ee8cc1Swenshuai.xi 
_REG32_W(MS_VIRT u32Reg,MS_U32 u32Value)182*53ee8cc1Swenshuai.xi static void _REG32_W(MS_VIRT u32Reg, MS_U32 u32Value)
183*53ee8cc1Swenshuai.xi {
184*53ee8cc1Swenshuai.xi #ifdef CIPHER_SMC_MODE
185*53ee8cc1Swenshuai.xi     REG_REE2ATF(u32Reg, u32Value, REG_WRITE);
186*53ee8cc1Swenshuai.xi #else
187*53ee8cc1Swenshuai.xi     *((volatile MS_U32*)u32Reg) = u32Value;
188*53ee8cc1Swenshuai.xi #endif
189*53ee8cc1Swenshuai.xi }
190*53ee8cc1Swenshuai.xi 
_REG16_R(MS_VIRT u32Reg)191*53ee8cc1Swenshuai.xi static MS_U16 _REG16_R(MS_VIRT u32Reg)
192*53ee8cc1Swenshuai.xi {
193*53ee8cc1Swenshuai.xi     return REG32_R(u32Reg) & 0x0000FFFFUL;
194*53ee8cc1Swenshuai.xi }
195*53ee8cc1Swenshuai.xi 
_REG16_W(MS_VIRT u32Reg,MS_U16 u16Value)196*53ee8cc1Swenshuai.xi static void _REG16_W(MS_VIRT u32Reg, MS_U16 u16Value)
197*53ee8cc1Swenshuai.xi {
198*53ee8cc1Swenshuai.xi     MS_U32 u32Value = (REG32_R(u32Reg) & 0xFFFF0000UL) | (u16Value & 0x0000FFFFUL);
199*53ee8cc1Swenshuai.xi     REG32_W(u32Reg, u32Value);
200*53ee8cc1Swenshuai.xi }
201*53ee8cc1Swenshuai.xi 
WRITE_CMDQ(MS_U32 u32Value)202*53ee8cc1Swenshuai.xi void WRITE_CMDQ(MS_U32 u32Value)
203*53ee8cc1Swenshuai.xi {
204*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s] = 0x%08X \n",__func__, (unsigned int)(u32Value)));
205*53ee8cc1Swenshuai.xi     REG32_W(&_AESDMACtrl->Cmd_Queue, u32Value) ;
206*53ee8cc1Swenshuai.xi }
207*53ee8cc1Swenshuai.xi 
_HAL_CIPHER_TransMIUAddr(MS_PHY * phyAddr)208*53ee8cc1Swenshuai.xi MS_BOOL _HAL_CIPHER_TransMIUAddr(MS_PHY* phyAddr)
209*53ee8cc1Swenshuai.xi {
210*53ee8cc1Swenshuai.xi     CHIP_MIU_ID eMIUSel;
211*53ee8cc1Swenshuai.xi     MS_PHY phyOffset;
212*53ee8cc1Swenshuai.xi 
213*53ee8cc1Swenshuai.xi     if(NULL == phyAddr)
214*53ee8cc1Swenshuai.xi     {
215*53ee8cc1Swenshuai.xi         HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d]NULL Address!\n",__func__, __LINE__));
216*53ee8cc1Swenshuai.xi         return FALSE;
217*53ee8cc1Swenshuai.xi     }
218*53ee8cc1Swenshuai.xi 
219*53ee8cc1Swenshuai.xi     _phy_to_miu_offset(eMIUSel,phyOffset,*phyAddr);
220*53ee8cc1Swenshuai.xi 
221*53ee8cc1Swenshuai.xi     if(E_CHIP_MIU_0 == eMIUSel)
222*53ee8cc1Swenshuai.xi     {
223*53ee8cc1Swenshuai.xi         *phyAddr = phyOffset;
224*53ee8cc1Swenshuai.xi         HAL_DEBUG_CIPHER(CIPHER_DBG_WARN, printf("[%s][%d]Physical address trans to MIU0\n",__func__, __LINE__));
225*53ee8cc1Swenshuai.xi     }
226*53ee8cc1Swenshuai.xi     else
227*53ee8cc1Swenshuai.xi     {
228*53ee8cc1Swenshuai.xi         *phyAddr = (phyOffset | MIU_SELECT_BIT);
229*53ee8cc1Swenshuai.xi         HAL_DEBUG_CIPHER(CIPHER_DBG_WARN, printf("[%s][%d]Physical address trans to MIU1\n",__func__, __LINE__));
230*53ee8cc1Swenshuai.xi     }
231*53ee8cc1Swenshuai.xi 
232*53ee8cc1Swenshuai.xi     return TRUE;
233*53ee8cc1Swenshuai.xi }
234*53ee8cc1Swenshuai.xi 
_HAL_CIPHER_GetCmdLen(HAL_CIPHER_CMDTYPE CmdType)235*53ee8cc1Swenshuai.xi MS_U32 _HAL_CIPHER_GetCmdLen(HAL_CIPHER_CMDTYPE CmdType)
236*53ee8cc1Swenshuai.xi {
237*53ee8cc1Swenshuai.xi 
238*53ee8cc1Swenshuai.xi     MS_U32 u32CmdLen = 0 ;
239*53ee8cc1Swenshuai.xi 
240*53ee8cc1Swenshuai.xi 
241*53ee8cc1Swenshuai.xi     if ( E_CIPHER_TYPE_DMA == CmdType )
242*53ee8cc1Swenshuai.xi     {
243*53ee8cc1Swenshuai.xi         u32CmdLen = 7;
244*53ee8cc1Swenshuai.xi 
245*53ee8cc1Swenshuai.xi         if ( _uDmaCtrl1.DmaCtrl1.RR == TRUE )
246*53ee8cc1Swenshuai.xi         {
247*53ee8cc1Swenshuai.xi             u32CmdLen += 1 ;
248*53ee8cc1Swenshuai.xi         }
249*53ee8cc1Swenshuai.xi         if ( _uDmaCtrl0.DmaCtrl0.DIV == TRUE )
250*53ee8cc1Swenshuai.xi         {
251*53ee8cc1Swenshuai.xi             u32CmdLen += 4 ;
252*53ee8cc1Swenshuai.xi         }
253*53ee8cc1Swenshuai.xi         if ( _uDmaCtrl1.DmaCtrl1.SD == E_DMA_SRC_DIRECT )
254*53ee8cc1Swenshuai.xi         {
255*53ee8cc1Swenshuai.xi             u32CmdLen += 4 ;
256*53ee8cc1Swenshuai.xi         }
257*53ee8cc1Swenshuai.xi         if ( _uDmaCtrl0.DmaCtrl0.DK == TRUE )
258*53ee8cc1Swenshuai.xi         {
259*53ee8cc1Swenshuai.xi             u32CmdLen += 4 ;
260*53ee8cc1Swenshuai.xi         }
261*53ee8cc1Swenshuai.xi 		if ( _uDmaCtrl2.DmaCtrl2.HP == TRUE )
262*53ee8cc1Swenshuai.xi         {
263*53ee8cc1Swenshuai.xi             u32CmdLen += 1 ;
264*53ee8cc1Swenshuai.xi         }
265*53ee8cc1Swenshuai.xi         if ( _uDmaCtrl3.DmaCtrl3.DK2 == TRUE )
266*53ee8cc1Swenshuai.xi         {
267*53ee8cc1Swenshuai.xi             u32CmdLen += 4 ;
268*53ee8cc1Swenshuai.xi         }
269*53ee8cc1Swenshuai.xi         if ( _uDmaCtrl3.DmaCtrl3.DIV2 == TRUE )
270*53ee8cc1Swenshuai.xi         {
271*53ee8cc1Swenshuai.xi             u32CmdLen += 4 ;
272*53ee8cc1Swenshuai.xi         }
273*53ee8cc1Swenshuai.xi 
274*53ee8cc1Swenshuai.xi         return u32CmdLen ;
275*53ee8cc1Swenshuai.xi     }
276*53ee8cc1Swenshuai.xi 
277*53ee8cc1Swenshuai.xi 
278*53ee8cc1Swenshuai.xi     if ( E_CIPHER_TYPE_SHA == CmdType )
279*53ee8cc1Swenshuai.xi     {
280*53ee8cc1Swenshuai.xi 
281*53ee8cc1Swenshuai.xi         u32CmdLen = 3 ;
282*53ee8cc1Swenshuai.xi 
283*53ee8cc1Swenshuai.xi 	    if (_uHashCtrl0.HashCtrl0.CMD == CMD_HASH_START_RR )
284*53ee8cc1Swenshuai.xi         {
285*53ee8cc1Swenshuai.xi             u32CmdLen += 1 ;
286*53ee8cc1Swenshuai.xi         }
287*53ee8cc1Swenshuai.xi 
288*53ee8cc1Swenshuai.xi         if (_uHashCtrl0.HashCtrl0.Src != CMD_HASH_SRC_REG )
289*53ee8cc1Swenshuai.xi         {
290*53ee8cc1Swenshuai.xi             u32CmdLen += 1 ;
291*53ee8cc1Swenshuai.xi         }
292*53ee8cc1Swenshuai.xi 
293*53ee8cc1Swenshuai.xi 		if(_uHashCtrl2.HashCtrl2.RR == TRUE)
294*53ee8cc1Swenshuai.xi         {
295*53ee8cc1Swenshuai.xi             u32CmdLen += 1 ;
296*53ee8cc1Swenshuai.xi         }
297*53ee8cc1Swenshuai.xi 
298*53ee8cc1Swenshuai.xi         if (_uHashCtrl0.HashCtrl0.IWC_Sel == CMD_HASH_IWC_CMDQ )
299*53ee8cc1Swenshuai.xi         {
300*53ee8cc1Swenshuai.xi             u32CmdLen += 1 ;
301*53ee8cc1Swenshuai.xi         }
302*53ee8cc1Swenshuai.xi 
303*53ee8cc1Swenshuai.xi         if ((_uHashCtrl0.HashCtrl0.Dest == CMD_HASH_OUTPUT_DRAM ) || (_uHashCtrl0.HashCtrl0.Dest == CMD_HASH_OUTPUT_R2 ))
304*53ee8cc1Swenshuai.xi         {
305*53ee8cc1Swenshuai.xi             u32CmdLen += 1 ;
306*53ee8cc1Swenshuai.xi         }
307*53ee8cc1Swenshuai.xi 
308*53ee8cc1Swenshuai.xi         if (_uHashCtrl0.HashCtrl0.InitHashSel == CMD_HASH_IV_CMD )
309*53ee8cc1Swenshuai.xi         {
310*53ee8cc1Swenshuai.xi             u32CmdLen += 8 ;
311*53ee8cc1Swenshuai.xi         }
312*53ee8cc1Swenshuai.xi 
313*53ee8cc1Swenshuai.xi         if (_uHashCtrl0.HashCtrl0.Src == CMD_HASH_SRC_REG )
314*53ee8cc1Swenshuai.xi         {
315*53ee8cc1Swenshuai.xi             u32CmdLen += 16 ;
316*53ee8cc1Swenshuai.xi         }
317*53ee8cc1Swenshuai.xi 
318*53ee8cc1Swenshuai.xi 		if((_uHashCtrl0.HashCtrl0.HMAC_KeySel == CMD_HMAC_KSEL_HK) && (_uHashCtrl0.HashCtrl0.DK == CMD_HMAC_KSEL_DIR_HK))
319*53ee8cc1Swenshuai.xi         {
320*53ee8cc1Swenshuai.xi             u32CmdLen += 4 ;
321*53ee8cc1Swenshuai.xi         }
322*53ee8cc1Swenshuai.xi 
323*53ee8cc1Swenshuai.xi         return u32CmdLen ;
324*53ee8cc1Swenshuai.xi 
325*53ee8cc1Swenshuai.xi     }
326*53ee8cc1Swenshuai.xi 
327*53ee8cc1Swenshuai.xi     if ( E_CIPHER_TYPE_OTPHASH == CmdType )
328*53ee8cc1Swenshuai.xi     {
329*53ee8cc1Swenshuai.xi         u32CmdLen = 7 ;
330*53ee8cc1Swenshuai.xi 
331*53ee8cc1Swenshuai.xi         if ( _uDmaCtrl1.DmaCtrl1.NL == TRUE )
332*53ee8cc1Swenshuai.xi         {
333*53ee8cc1Swenshuai.xi             u32CmdLen += 1 ;
334*53ee8cc1Swenshuai.xi         }
335*53ee8cc1Swenshuai.xi         if ( _uDmaCtrl1.DmaCtrl1.RR == TRUE )
336*53ee8cc1Swenshuai.xi         {
337*53ee8cc1Swenshuai.xi             u32CmdLen += 1 ;
338*53ee8cc1Swenshuai.xi         }
339*53ee8cc1Swenshuai.xi         if ( _uDmaCtrl3.DmaCtrl3.AP == TRUE && _uDmaCtrl3.DmaCtrl3.IK == FALSE)
340*53ee8cc1Swenshuai.xi         {
341*53ee8cc1Swenshuai.xi             u32CmdLen += 1 ;
342*53ee8cc1Swenshuai.xi         }
343*53ee8cc1Swenshuai.xi 
344*53ee8cc1Swenshuai.xi         return u32CmdLen ;
345*53ee8cc1Swenshuai.xi     }
346*53ee8cc1Swenshuai.xi 
347*53ee8cc1Swenshuai.xi 
348*53ee8cc1Swenshuai.xi     return 0 ;
349*53ee8cc1Swenshuai.xi 
350*53ee8cc1Swenshuai.xi }
351*53ee8cc1Swenshuai.xi 
_HAL_CIPHER_TransKey(CIPHER_KEY_SRC src,MS_U32 idx)352*53ee8cc1Swenshuai.xi HAL_CIPHER_KEYSRC _HAL_CIPHER_TransKey(CIPHER_KEY_SRC src, MS_U32 idx)
353*53ee8cc1Swenshuai.xi {
354*53ee8cc1Swenshuai.xi     HAL_CIPHER_KEYSRC KeySrc = E_DMA_KSEL_REGKEY;
355*53ee8cc1Swenshuai.xi 
356*53ee8cc1Swenshuai.xi     switch(src){
357*53ee8cc1Swenshuai.xi         case E_CIPHER_KSRC_KL:
358*53ee8cc1Swenshuai.xi             KeySrc = E_DMA_KSEL_SK0 + idx;
359*53ee8cc1Swenshuai.xi             break;
360*53ee8cc1Swenshuai.xi 
361*53ee8cc1Swenshuai.xi         case E_CIPHER_KSRC_OTP:
362*53ee8cc1Swenshuai.xi             KeySrc = E_DMA_KSEL_MK0 + idx;
363*53ee8cc1Swenshuai.xi             break;
364*53ee8cc1Swenshuai.xi 
365*53ee8cc1Swenshuai.xi         case E_CIPHER_KSRC_CPU:
366*53ee8cc1Swenshuai.xi             KeySrc = E_DMA_KSEL_REGKEY;
367*53ee8cc1Swenshuai.xi             break;
368*53ee8cc1Swenshuai.xi 
369*53ee8cc1Swenshuai.xi         case E_CIPHER_KSRC_CAIP:
370*53ee8cc1Swenshuai.xi             KeySrc = E_DMA_KSEL_CAIP;
371*53ee8cc1Swenshuai.xi             break;
372*53ee8cc1Swenshuai.xi 
373*53ee8cc1Swenshuai.xi         //case E_CIPHER_KSRC_STR:
374*53ee8cc1Swenshuai.xi         //    KeySrc = E_DMA_KSEL_STRN;
375*53ee8cc1Swenshuai.xi         //    break;
376*53ee8cc1Swenshuai.xi 
377*53ee8cc1Swenshuai.xi         default:
378*53ee8cc1Swenshuai.xi             break;
379*53ee8cc1Swenshuai.xi     }
380*53ee8cc1Swenshuai.xi 
381*53ee8cc1Swenshuai.xi     return KeySrc;
382*53ee8cc1Swenshuai.xi }
383*53ee8cc1Swenshuai.xi 
_HAL_CIPHER_TransMainAlgo(CIPHER_MAIN_ALGO algo)384*53ee8cc1Swenshuai.xi HAL_CIPHER_ALGO _HAL_CIPHER_TransMainAlgo(CIPHER_MAIN_ALGO algo)
385*53ee8cc1Swenshuai.xi {
386*53ee8cc1Swenshuai.xi     HAL_CIPHER_ALGO hal_algo;
387*53ee8cc1Swenshuai.xi     switch(algo)
388*53ee8cc1Swenshuai.xi     {
389*53ee8cc1Swenshuai.xi     case E_CIPHER_MAIN_AES:
390*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_ALGO_AES;
391*53ee8cc1Swenshuai.xi         break;
392*53ee8cc1Swenshuai.xi     case E_CIPHER_MAIN_DES:
393*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_ALGO_DES;
394*53ee8cc1Swenshuai.xi         break;
395*53ee8cc1Swenshuai.xi     case E_CIPHER_MAIN_TDES:
396*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_ALGO_TDES;
397*53ee8cc1Swenshuai.xi         break;
398*53ee8cc1Swenshuai.xi     case E_CIPHER_MAIN_M6_S56_CCBC:
399*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_ALGO_M6_S56_CCBC;
400*53ee8cc1Swenshuai.xi         break;
401*53ee8cc1Swenshuai.xi     case E_CIPHER_MAIN_M6_S56:
402*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_ALGO_M6_S56;
403*53ee8cc1Swenshuai.xi         break;
404*53ee8cc1Swenshuai.xi     case E_CIPHER_MAIN_M6_KE56:
405*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_ALGO_M6_KE56;
406*53ee8cc1Swenshuai.xi         break;
407*53ee8cc1Swenshuai.xi     case E_CIPHER_MAIN_RC4:
408*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_ALGO_RC4;
409*53ee8cc1Swenshuai.xi         break;
410*53ee8cc1Swenshuai.xi     case E_CIPHER_MAIN_RC4_128:
411*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_ALGO_RC4_128;
412*53ee8cc1Swenshuai.xi         break;
413*53ee8cc1Swenshuai.xi     default:
414*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_ALGO_NONE;
415*53ee8cc1Swenshuai.xi     }
416*53ee8cc1Swenshuai.xi 
417*53ee8cc1Swenshuai.xi     return hal_algo;
418*53ee8cc1Swenshuai.xi }
419*53ee8cc1Swenshuai.xi 
_HAL_CIPHER_TransSubAlgo(CIPHER_SUB_ALGO algo)420*53ee8cc1Swenshuai.xi HAL_CIPHER_MODE _HAL_CIPHER_TransSubAlgo(CIPHER_SUB_ALGO algo)
421*53ee8cc1Swenshuai.xi {
422*53ee8cc1Swenshuai.xi     HAL_CIPHER_MODE hal_algo;
423*53ee8cc1Swenshuai.xi     switch(algo)
424*53ee8cc1Swenshuai.xi     {
425*53ee8cc1Swenshuai.xi     case E_CIPHER_SUB_ECB:
426*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_MODE_ECB;
427*53ee8cc1Swenshuai.xi         break;
428*53ee8cc1Swenshuai.xi     case E_CIPHER_SUB_CBC:
429*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_MODE_CBC;
430*53ee8cc1Swenshuai.xi         break;
431*53ee8cc1Swenshuai.xi     case E_CIPHER_SUB_CTR:
432*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_MODE_CTR;
433*53ee8cc1Swenshuai.xi         break;
434*53ee8cc1Swenshuai.xi     case E_CIPHER_SUB_CBC_MAC:
435*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_MODE_CBC_MAC;
436*53ee8cc1Swenshuai.xi         break;
437*53ee8cc1Swenshuai.xi     case E_CIPHER_SUB_CTR_64:
438*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_MODE_CTR_64;
439*53ee8cc1Swenshuai.xi         break;
440*53ee8cc1Swenshuai.xi 	case E_CIPHER_SUB_CMAC_Key:
441*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_MODE_CMAC_Key;
442*53ee8cc1Swenshuai.xi         break;
443*53ee8cc1Swenshuai.xi     case E_CIPHER_SUB_CMAC_Algo:
444*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_MODE_CMAC_Algo;
445*53ee8cc1Swenshuai.xi         break;
446*53ee8cc1Swenshuai.xi     case E_CIPHER_SUB_PCBC_ADD:
447*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_MODE_PCBC_ADD;
448*53ee8cc1Swenshuai.xi         break;
449*53ee8cc1Swenshuai.xi     case E_CIPHER_SUB_PCBC_XOR:
450*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_MODE_PCBC_XOR;
451*53ee8cc1Swenshuai.xi         break;
452*53ee8cc1Swenshuai.xi     case E_CIPHER_SUB_OTPHASH:
453*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_MODE_OTPHASH;
454*53ee8cc1Swenshuai.xi         break;
455*53ee8cc1Swenshuai.xi     default:
456*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_MODE_NONE;
457*53ee8cc1Swenshuai.xi     }
458*53ee8cc1Swenshuai.xi 
459*53ee8cc1Swenshuai.xi     return hal_algo;
460*53ee8cc1Swenshuai.xi 
461*53ee8cc1Swenshuai.xi }
462*53ee8cc1Swenshuai.xi 
_HAL_CIPHER_TransResAlgo(CIPHER_RES_ALGO algo)463*53ee8cc1Swenshuai.xi HAL_CIPHER_RESIDUE _HAL_CIPHER_TransResAlgo(CIPHER_RES_ALGO algo)
464*53ee8cc1Swenshuai.xi {
465*53ee8cc1Swenshuai.xi     HAL_CIPHER_RESIDUE hal_algo;
466*53ee8cc1Swenshuai.xi     switch(algo)
467*53ee8cc1Swenshuai.xi     {
468*53ee8cc1Swenshuai.xi     case E_CIPHER_RES_CLR:
469*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_RESIDUE_CLR;
470*53ee8cc1Swenshuai.xi         break;
471*53ee8cc1Swenshuai.xi     case E_CIPHER_RES_CTS:
472*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_RESIDUE_CTS;
473*53ee8cc1Swenshuai.xi         break;
474*53ee8cc1Swenshuai.xi     case E_CIPHER_RES_SCTE52:
475*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_RESIDUE_SCTE52;
476*53ee8cc1Swenshuai.xi         break;
477*53ee8cc1Swenshuai.xi     default:
478*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_RESIDUE_NONE;
479*53ee8cc1Swenshuai.xi     }
480*53ee8cc1Swenshuai.xi 
481*53ee8cc1Swenshuai.xi     return hal_algo;
482*53ee8cc1Swenshuai.xi }
483*53ee8cc1Swenshuai.xi 
_HAL_CIPHER_TransSBAlgo(CIPHER_SB_ALGO algo)484*53ee8cc1Swenshuai.xi HAL_CIPHER_SHORTBLOCK _HAL_CIPHER_TransSBAlgo(CIPHER_SB_ALGO algo)
485*53ee8cc1Swenshuai.xi {
486*53ee8cc1Swenshuai.xi     HAL_CIPHER_SHORTBLOCK hal_algo;
487*53ee8cc1Swenshuai.xi     switch(algo)
488*53ee8cc1Swenshuai.xi     {
489*53ee8cc1Swenshuai.xi     case E_CIPHER_SB_CLR:
490*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_SB_CLR;
491*53ee8cc1Swenshuai.xi         break;
492*53ee8cc1Swenshuai.xi     case E_CIPHER_SB_IV1:
493*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_SB_IV1;
494*53ee8cc1Swenshuai.xi         break;
495*53ee8cc1Swenshuai.xi     case E_CIPHER_SB_IV2:
496*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_SB_IV2;
497*53ee8cc1Swenshuai.xi         break;
498*53ee8cc1Swenshuai.xi     default:
499*53ee8cc1Swenshuai.xi         hal_algo = E_DMA_SB_NONE;
500*53ee8cc1Swenshuai.xi     }
501*53ee8cc1Swenshuai.xi 
502*53ee8cc1Swenshuai.xi     return hal_algo;
503*53ee8cc1Swenshuai.xi 
504*53ee8cc1Swenshuai.xi }
505*53ee8cc1Swenshuai.xi 
_HAL_CIPHER_TransHASHAlgo(CIPHER_HASH_ALGO algo)506*53ee8cc1Swenshuai.xi HAL_CIPHER_HASHMODE _HAL_CIPHER_TransHASHAlgo(CIPHER_HASH_ALGO algo)
507*53ee8cc1Swenshuai.xi {
508*53ee8cc1Swenshuai.xi     HAL_CIPHER_HASHMODE hal_algo;
509*53ee8cc1Swenshuai.xi     switch(algo)
510*53ee8cc1Swenshuai.xi     {
511*53ee8cc1Swenshuai.xi     case E_CIPHER_HASH_ALGO_SHA1:
512*53ee8cc1Swenshuai.xi         hal_algo = E_HASH_SHA1;
513*53ee8cc1Swenshuai.xi         break;
514*53ee8cc1Swenshuai.xi     case E_CIPHER_HASH_ALGO_SHA256:
515*53ee8cc1Swenshuai.xi         hal_algo = E_HASH_SHA256;
516*53ee8cc1Swenshuai.xi         break;
517*53ee8cc1Swenshuai.xi     case E_CIPHER_HASH_ALGO_MD5:
518*53ee8cc1Swenshuai.xi         hal_algo = E_HASH_MD5;
519*53ee8cc1Swenshuai.xi         break;
520*53ee8cc1Swenshuai.xi     default:
521*53ee8cc1Swenshuai.xi         hal_algo = E_HASH_SHA256;
522*53ee8cc1Swenshuai.xi     }
523*53ee8cc1Swenshuai.xi 
524*53ee8cc1Swenshuai.xi     return hal_algo;
525*53ee8cc1Swenshuai.xi }
526*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_AlgoTable_Init(void)527*53ee8cc1Swenshuai.xi void HAL_CIPHER_DMA_AlgoTable_Init(void)
528*53ee8cc1Swenshuai.xi {
529*53ee8cc1Swenshuai.xi 
530*53ee8cc1Swenshuai.xi     memset(_CryptodMA_AlgoTable , 0x0 , sizeof(_CryptodMA_AlgoTable));
531*53ee8cc1Swenshuai.xi 
532*53ee8cc1Swenshuai.xi     // AES algorithms //
533*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_AES][E_DMA_MODE_ECB][E_DMA_RESIDUE_CLR][E_DMA_SB_CLR] = TRUE ;
534*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_AES][E_DMA_MODE_ECB][E_DMA_RESIDUE_CTS][E_DMA_SB_CLR] = TRUE ;
535*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_AES][E_DMA_MODE_CBC][E_DMA_RESIDUE_CLR][E_DMA_SB_CLR] = TRUE ;
536*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_AES][E_DMA_MODE_CBC][E_DMA_RESIDUE_CTS][E_DMA_SB_CLR] = TRUE ;
537*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_AES][E_DMA_MODE_CBC][E_DMA_RESIDUE_CTS][E_DMA_SB_IV1] = TRUE ;
538*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_AES][E_DMA_MODE_CBC][E_DMA_RESIDUE_SCTE52][E_DMA_SB_IV1] = TRUE ;
539*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_AES][E_DMA_MODE_CBC][E_DMA_RESIDUE_SCTE52][E_DMA_SB_CLR] = TRUE ;
540*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_AES][E_DMA_MODE_CBC_MAC][E_DMA_RESIDUE_CLR][E_DMA_RESIDUE_CLR] = TRUE ;
541*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_AES][E_DMA_MODE_CTR][E_DMA_RESIDUE_NONE][E_DMA_SB_NONE] = TRUE ; // residue & sb don't care
542*53ee8cc1Swenshuai.xi 
543*53ee8cc1Swenshuai.xi     // DES Algorithms //
544*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_DES][E_DMA_MODE_ECB][E_DMA_RESIDUE_CLR][E_DMA_SB_CLR] = TRUE ;
545*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_DES][E_DMA_MODE_ECB][E_DMA_RESIDUE_CTS][E_DMA_SB_CLR] = TRUE ;
546*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_DES][E_DMA_MODE_CBC][E_DMA_RESIDUE_CLR][E_DMA_SB_CLR] = TRUE ;
547*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_DES][E_DMA_MODE_CBC][E_DMA_RESIDUE_CTS][E_DMA_SB_CLR] = TRUE ;
548*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_DES][E_DMA_MODE_CBC][E_DMA_RESIDUE_CTS][E_DMA_SB_IV1] = TRUE ;
549*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_DES][E_DMA_MODE_CBC][E_DMA_RESIDUE_SCTE52][E_DMA_SB_IV1] = TRUE ;
550*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_DES][E_DMA_MODE_CBC][E_DMA_RESIDUE_SCTE52][E_DMA_SB_IV2] = TRUE ;
551*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_DES][E_DMA_MODE_CBC][E_DMA_RESIDUE_SCTE52][E_DMA_SB_CLR] = TRUE ;
552*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_DES][E_DMA_MODE_CTR][E_DMA_RESIDUE_NONE][E_DMA_SB_NONE] = TRUE ; // residue & sb don't care
553*53ee8cc1Swenshuai.xi 
554*53ee8cc1Swenshuai.xi     // TDES Algorithm //
555*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_TDES][E_DMA_MODE_ECB][E_DMA_RESIDUE_CLR][E_DMA_SB_CLR] = TRUE ;
556*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_TDES][E_DMA_MODE_ECB][E_DMA_RESIDUE_CTS][E_DMA_SB_CLR] = TRUE ;
557*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_TDES][E_DMA_MODE_CTR][E_DMA_RESIDUE_CLR][E_DMA_SB_CLR] = TRUE ;
558*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_TDES][E_DMA_MODE_CBC][E_DMA_RESIDUE_CTS][E_DMA_SB_CLR] = TRUE ;
559*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_TDES][E_DMA_MODE_CBC][E_DMA_RESIDUE_CTS][E_DMA_SB_IV1] = TRUE ;
560*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_TDES][E_DMA_MODE_CBC][E_DMA_RESIDUE_CLR][E_DMA_SB_CLR] = TRUE ;
561*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_TDES][E_DMA_MODE_CBC][E_DMA_RESIDUE_SCTE52][E_DMA_SB_IV1] = TRUE ;
562*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_TDES][E_DMA_MODE_CBC][E_DMA_RESIDUE_SCTE52][E_DMA_SB_IV2] = TRUE ;
563*53ee8cc1Swenshuai.xi     _CryptodMA_AlgoTable[E_DMA_ALGO_TDES][E_DMA_MODE_CBC][E_DMA_RESIDUE_SCTE52][E_DMA_SB_CLR] = TRUE ;
564*53ee8cc1Swenshuai.xi 
565*53ee8cc1Swenshuai.xi }
566*53ee8cc1Swenshuai.xi 
567*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_CheckAlgo(HAL_CIPHER_ALGO eAlgo,HAL_CIPHER_MODE eMode,HAL_CIPHER_RESIDUE eRes,HAL_CIPHER_SHORTBLOCK eSB)568*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_DMA_CheckAlgo(HAL_CIPHER_ALGO eAlgo, HAL_CIPHER_MODE eMode, HAL_CIPHER_RESIDUE eRes, HAL_CIPHER_SHORTBLOCK eSB)
569*53ee8cc1Swenshuai.xi {
570*53ee8cc1Swenshuai.xi     // Special Cases //
571*53ee8cc1Swenshuai.xi     if (eAlgo > E_DMA_ALGO_TDES )
572*53ee8cc1Swenshuai.xi     {
573*53ee8cc1Swenshuai.xi         if ((E_DMA_ALGO_RC4==eAlgo)&&(E_DMA_RESIDUE_NONE==eRes)&&(E_DMA_SB_CLR == eSB)&&(E_DMA_MODE_NONE==eMode))
574*53ee8cc1Swenshuai.xi         {   //RC4/none/none/none
575*53ee8cc1Swenshuai.xi             return TRUE ;
576*53ee8cc1Swenshuai.xi         }
577*53ee8cc1Swenshuai.xi         if ((E_DMA_ALGO_M6_KE56==eAlgo)&&(E_DMA_MODE_ECB==eMode)&&(E_DMA_RESIDUE_NONE==eRes)&&(E_DMA_SB_CLR==eSB))
578*53ee8cc1Swenshuai.xi         {   //M6_KE56/ecb/none/clr
579*53ee8cc1Swenshuai.xi             return TRUE;
580*53ee8cc1Swenshuai.xi         }
581*53ee8cc1Swenshuai.xi         if ((E_DMA_ALGO_M6_S56==eAlgo)&&(E_DMA_MODE_ECB==eMode)&&(E_DMA_RESIDUE_NONE==eRes)&&(E_DMA_SB_CLR==eSB))
582*53ee8cc1Swenshuai.xi         {   //M6_S56/ecb/none/clr
583*53ee8cc1Swenshuai.xi             return TRUE;
584*53ee8cc1Swenshuai.xi         }
585*53ee8cc1Swenshuai.xi         if ((E_DMA_ALGO_M6_S56_CCBC==eAlgo)&&(E_DMA_MODE_NONE==eMode)&&(E_DMA_RESIDUE_NONE==eRes)&&(E_DMA_SB_CLR==eSB))
586*53ee8cc1Swenshuai.xi         {   //M6_S56_CCBC/none/none/clr
587*53ee8cc1Swenshuai.xi             return TRUE;
588*53ee8cc1Swenshuai.xi         }
589*53ee8cc1Swenshuai.xi         return FALSE ;
590*53ee8cc1Swenshuai.xi     }
591*53ee8cc1Swenshuai.xi 
592*53ee8cc1Swenshuai.xi     // Reference table for Algorithm AES/TDES/DES //
593*53ee8cc1Swenshuai.xi     return _CryptodMA_AlgoTable[eAlgo][eMode][eRes][eSB] ;
594*53ee8cc1Swenshuai.xi }
595*53ee8cc1Swenshuai.xi 
HAL_CIPHER_SetBank(MS_VIRT u32BankAddr)596*53ee8cc1Swenshuai.xi void HAL_CIPHER_SetBank(MS_VIRT u32BankAddr)
597*53ee8cc1Swenshuai.xi {
598*53ee8cc1Swenshuai.xi     _u32RegBase = u32BankAddr;
599*53ee8cc1Swenshuai.xi     _AESDMACtrl = (REG_AESDMACtrl*)(_u32RegBase + REG_CIPHERCTRL_BASE);
600*53ee8cc1Swenshuai.xi }
601*53ee8cc1Swenshuai.xi 
HAL_CIPHER_SetDbgLevel(CIPHER_DBGMSG_LEVEL eDBGMsgLevel)602*53ee8cc1Swenshuai.xi void HAL_CIPHER_SetDbgLevel(CIPHER_DBGMSG_LEVEL eDBGMsgLevel)
603*53ee8cc1Swenshuai.xi {
604*53ee8cc1Swenshuai.xi     _HAL_CIPHERDBGLevel = eDBGMsgLevel;
605*53ee8cc1Swenshuai.xi }
606*53ee8cc1Swenshuai.xi 
HAL_CIPHER_ResetStatus(MS_BOOL RstDma,MS_BOOL RstHash)607*53ee8cc1Swenshuai.xi void HAL_CIPHER_ResetStatus(MS_BOOL RstDma , MS_BOOL RstHash)
608*53ee8cc1Swenshuai.xi {
609*53ee8cc1Swenshuai.xi     if (RstDma)
610*53ee8cc1Swenshuai.xi     {
611*53ee8cc1Swenshuai.xi         _uDmaCtrl0.u32DmaCtrl0 = 0 ;
612*53ee8cc1Swenshuai.xi         _uDmaCtrl1.u32DmaCtrl1 = 0 ;
613*53ee8cc1Swenshuai.xi         _uDmaCtrl2.u32DmaCtrl2 = 0 ;
614*53ee8cc1Swenshuai.xi         _uDmaCtrl3.u32DmaCtrl3 = 0 ;
615*53ee8cc1Swenshuai.xi 
616*53ee8cc1Swenshuai.xi         _u32DmaInAddr = 0;
617*53ee8cc1Swenshuai.xi         _u32DmaInNum  = 0 ;
618*53ee8cc1Swenshuai.xi         _u32OTPHashLengthPadding = 0;
619*53ee8cc1Swenshuai.xi         _u32DmaOut_StartAddr = 0;
620*53ee8cc1Swenshuai.xi         _u32DmaOut_EndAddr   = 0;
621*53ee8cc1Swenshuai.xi         _u32ReportAddr = 0 ;
622*53ee8cc1Swenshuai.xi         memset(&_pu8CipherKey ,   0x0, CIPHER_KEY_SIZE );
623*53ee8cc1Swenshuai.xi         memset(&_pu8IV        ,   0x0, CIPHER_KEY_SIZE );
624*53ee8cc1Swenshuai.xi 		memset(&_pu8CipherKey2 ,   0x0, CIPHER_KEY_SIZE );
625*53ee8cc1Swenshuai.xi         memset(&_pu8IV2        ,   0x0, CIPHER_KEY_SIZE );
626*53ee8cc1Swenshuai.xi         memset(&_pu8Data      ,   0x0, CIPHER_KEY_SIZE );
627*53ee8cc1Swenshuai.xi         HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Reset DMA value\n", __FUNCTION__, __LINE__));
628*53ee8cc1Swenshuai.xi 
629*53ee8cc1Swenshuai.xi     }
630*53ee8cc1Swenshuai.xi 
631*53ee8cc1Swenshuai.xi     if (RstHash)
632*53ee8cc1Swenshuai.xi     {
633*53ee8cc1Swenshuai.xi         (_uHashCtrl0.u32HashCtrl0) = 0 ;
634*53ee8cc1Swenshuai.xi 		(_uHashCtrl1.u32HashCtrl1) = 0 ;
635*53ee8cc1Swenshuai.xi 		(_uHashCtrl2.u32HashCtrl2) = 0 ;
636*53ee8cc1Swenshuai.xi 
637*53ee8cc1Swenshuai.xi         _u32HashSrcAddr  = 0 ;
638*53ee8cc1Swenshuai.xi         _u32InitWordCnt  = 0 ;
639*53ee8cc1Swenshuai.xi         _u32HashDestAddr = 0 ;
640*53ee8cc1Swenshuai.xi         _u32HashMsgLen   = 0 ;
641*53ee8cc1Swenshuai.xi 
642*53ee8cc1Swenshuai.xi         memset(_pu8HashIV, 0x0 ,HASH_CMD_IV_SIZE);
643*53ee8cc1Swenshuai.xi         memset(_pu8HashMsg, 0x0 , HASH_CMD_MSG_SIZE);
644*53ee8cc1Swenshuai.xi         HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Reset HASH value\n", __FUNCTION__, __LINE__));
645*53ee8cc1Swenshuai.xi     }
646*53ee8cc1Swenshuai.xi 
647*53ee8cc1Swenshuai.xi }
648*53ee8cc1Swenshuai.xi 
HAL_CIPHER_ResetException(void)649*53ee8cc1Swenshuai.xi void HAL_CIPHER_ResetException(void)
650*53ee8cc1Swenshuai.xi {
651*53ee8cc1Swenshuai.xi     MS_U32 u32DMACtrl = REG32_R(&_AESDMACtrl->Dma_Ctrl[REG_DMA_CTRL]);
652*53ee8cc1Swenshuai.xi     REG32_W(&_AESDMACtrl->Dma_Ctrl[REG_DMA_CTRL], u32DMACtrl | REG_EXCEPT_FLAG_CLEAR);  //clear all except flag
653*53ee8cc1Swenshuai.xi     REG32_W(&_AESDMACtrl->Dma_Ctrl[REG_DMA_CTRL], u32DMACtrl & ~REG_EXCEPT_FLAG_CLEAR);  //enable acpu except flag
654*53ee8cc1Swenshuai.xi }
655*53ee8cc1Swenshuai.xi 
HAL_CIPHER_ResetKey(MS_U32 u32KeyIdx)656*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_ResetKey(MS_U32 u32KeyIdx)
657*53ee8cc1Swenshuai.xi {
658*53ee8cc1Swenshuai.xi     HAL_CIPHER_KEYSRC KeySrc;
659*53ee8cc1Swenshuai.xi 
660*53ee8cc1Swenshuai.xi     //Check Key Index
661*53ee8cc1Swenshuai.xi     if(u32KeyIdx > HAL_CRYPTODMA_DMA_KEY_SLOT-1)
662*53ee8cc1Swenshuai.xi     {
663*53ee8cc1Swenshuai.xi         HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d]Invalid Key Index[%u]\n",
664*53ee8cc1Swenshuai.xi             __func__, __LINE__, u32KeyIdx));
665*53ee8cc1Swenshuai.xi         return FALSE;
666*53ee8cc1Swenshuai.xi     }
667*53ee8cc1Swenshuai.xi 
668*53ee8cc1Swenshuai.xi     KeySrc = _HAL_CIPHER_TransKey(E_CIPHER_KSRC_KL, u32KeyIdx);
669*53ee8cc1Swenshuai.xi 
670*53ee8cc1Swenshuai.xi     _uDmaCtrl0.DmaCtrl0.DK = FALSE;
671*53ee8cc1Swenshuai.xi     _uDmaCtrl0.DmaCtrl0.KeySel = KeySrc|CMD_DMA_KSEL_CLR_SK;
672*53ee8cc1Swenshuai.xi 
673*53ee8cc1Swenshuai.xi     return TRUE;
674*53ee8cc1Swenshuai.xi 
675*53ee8cc1Swenshuai.xi }
HAL_CIPHER_SWReset(void)676*53ee8cc1Swenshuai.xi void HAL_CIPHER_SWReset(void)
677*53ee8cc1Swenshuai.xi {
678*53ee8cc1Swenshuai.xi     MS_U32 DMA_CTRL = REG32_R(&_AESDMACtrl->Dma_Ctrl[REG_DMA_CTRL]);
679*53ee8cc1Swenshuai.xi     REG32_W(&_AESDMACtrl->Dma_Ctrl[REG_DMA_CTRL], DMA_CTRL | REG_DMA_SW_RESET);  //reset CryptoDMA
680*53ee8cc1Swenshuai.xi     REG32_W(&_AESDMACtrl->Dma_Ctrl[REG_DMA_CTRL], DMA_CTRL & ~REG_DMA_SW_RESET); //enable CryptoDMA
681*53ee8cc1Swenshuai.xi 
682*53ee8cc1Swenshuai.xi }
683*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Set_OBFIdx(MS_BOOL bDMA,MS_U8 u8ReadIdx,MS_U8 u8WriteIdx)684*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_Set_OBFIdx(MS_BOOL bDMA, MS_U8 u8ReadIdx, MS_U8 u8WriteIdx)
685*53ee8cc1Swenshuai.xi {
686*53ee8cc1Swenshuai.xi     if(bDMA)
687*53ee8cc1Swenshuai.xi     {
688*53ee8cc1Swenshuai.xi         _uDmaCtrl2.DmaCtrl2.OBF_IDX_READ = u8ReadIdx;
689*53ee8cc1Swenshuai.xi         _uDmaCtrl2.DmaCtrl2.OBF_IDX_WRITE = u8WriteIdx;
690*53ee8cc1Swenshuai.xi         HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d]Set DMA Obf Index Read:[%u], Write:[%u]\n",
691*53ee8cc1Swenshuai.xi             __func__, __LINE__, u8ReadIdx, u8WriteIdx));
692*53ee8cc1Swenshuai.xi     }
693*53ee8cc1Swenshuai.xi     else
694*53ee8cc1Swenshuai.xi     {
695*53ee8cc1Swenshuai.xi         _uHashCtrl1.HashCtrl1.OBF_IDX_READ  =  u8ReadIdx;
696*53ee8cc1Swenshuai.xi         _uHashCtrl1.HashCtrl1.OBF_IDX_WRITE =  u8WriteIdx;
697*53ee8cc1Swenshuai.xi         HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d]Set HASH Obf Index Read:[%u], Write:[%u]\n",
698*53ee8cc1Swenshuai.xi             __func__, __LINE__, u8ReadIdx, u8WriteIdx));
699*53ee8cc1Swenshuai.xi     }
700*53ee8cc1Swenshuai.xi 
701*53ee8cc1Swenshuai.xi     return TRUE;
702*53ee8cc1Swenshuai.xi }
703*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_Set_InputSrcFrom(CIPHER_MEM_TYPE InputSrcFrom,MS_U8 * pu8Data,MS_U32 u32Size)704*53ee8cc1Swenshuai.xi void HAL_CIPHER_DMA_Set_InputSrcFrom(CIPHER_MEM_TYPE InputSrcFrom, MS_U8* pu8Data, MS_U32 u32Size)
705*53ee8cc1Swenshuai.xi {
706*53ee8cc1Swenshuai.xi 	HAL_CIPHER_DATASRC src = E_DMA_SRC_DRAM;
707*53ee8cc1Swenshuai.xi 
708*53ee8cc1Swenshuai.xi 	switch(InputSrcFrom)
709*53ee8cc1Swenshuai.xi 	{
710*53ee8cc1Swenshuai.xi 		case E_CIPHER_DRAM:
711*53ee8cc1Swenshuai.xi             _u32DmaInAddr = 0;
712*53ee8cc1Swenshuai.xi 			src = E_DMA_SRC_DRAM;
713*53ee8cc1Swenshuai.xi 			break;
714*53ee8cc1Swenshuai.xi 
715*53ee8cc1Swenshuai.xi 		case E_CIPHER_DQMEM://only for R2
716*53ee8cc1Swenshuai.xi 			_u32DmaInAddr = HAL_CIPHER_BASE_DQMEM;
717*53ee8cc1Swenshuai.xi 			src = E_DMA_SRC_DQMEM;
718*53ee8cc1Swenshuai.xi 			break;
719*53ee8cc1Swenshuai.xi 
720*53ee8cc1Swenshuai.xi 		case E_CIPHER_IQMEM://only for R2
721*53ee8cc1Swenshuai.xi 			_u32DmaInAddr = HAL_CIPHER_BASE_IQMEM;
722*53ee8cc1Swenshuai.xi 			src = E_DMA_SRC_IQMEM;
723*53ee8cc1Swenshuai.xi 			break;
724*53ee8cc1Swenshuai.xi 
725*53ee8cc1Swenshuai.xi 		// TODO: future work, DIRECT data from pu8Data
726*53ee8cc1Swenshuai.xi 		#if 0
727*53ee8cc1Swenshuai.xi 		case E_CIPHER_DIRECT:
728*53ee8cc1Swenshuai.xi 			HAL_CIPHER_DMA_Set_Data(pu8Data, u32Size);
729*53ee8cc1Swenshuai.xi 			src = E_DMA_SRC_DIRECT;
730*53ee8cc1Swenshuai.xi 			break;
731*53ee8cc1Swenshuai.xi 		#endif
732*53ee8cc1Swenshuai.xi 
733*53ee8cc1Swenshuai.xi         case E_CIPHER_OTP: //only for OTPHASH
734*53ee8cc1Swenshuai.xi 			_u32DmaInAddr = 0;
735*53ee8cc1Swenshuai.xi 			src = E_DMA_SRC_HW_INPUT;
736*53ee8cc1Swenshuai.xi 			break;
737*53ee8cc1Swenshuai.xi 
738*53ee8cc1Swenshuai.xi 		default:
739*53ee8cc1Swenshuai.xi     		_u32DmaInAddr = 0;
740*53ee8cc1Swenshuai.xi 			src = E_DMA_SRC_DRAM;
741*53ee8cc1Swenshuai.xi 			break;
742*53ee8cc1Swenshuai.xi 	}
743*53ee8cc1Swenshuai.xi 
744*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.SD = (MS_U32)src;
745*53ee8cc1Swenshuai.xi 
746*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set input source from [%d]\n", __func__, __LINE__, src));
747*53ee8cc1Swenshuai.xi }
748*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_Set_OutputDstTo(CIPHER_MEM_TYPE OutputDstTo,MS_U8 * pu8Data,MS_U32 u32Size)749*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_DMA_Set_OutputDstTo(CIPHER_MEM_TYPE OutputDstTo, MS_U8* pu8Data, MS_U32 u32Size)
750*53ee8cc1Swenshuai.xi {
751*53ee8cc1Swenshuai.xi 	HAL_CIPHER_DATADST dst = E_DMA_DST_DRAM;
752*53ee8cc1Swenshuai.xi 
753*53ee8cc1Swenshuai.xi 	switch(OutputDstTo)
754*53ee8cc1Swenshuai.xi 	{
755*53ee8cc1Swenshuai.xi 		case E_CIPHER_DRAM:
756*53ee8cc1Swenshuai.xi             _u32DmaOut_StartAddr = 0;
757*53ee8cc1Swenshuai.xi             _u32DmaOut_EndAddr 	 = 0;
758*53ee8cc1Swenshuai.xi 			dst = E_DMA_DST_DRAM;
759*53ee8cc1Swenshuai.xi 			break;
760*53ee8cc1Swenshuai.xi 
761*53ee8cc1Swenshuai.xi 		case E_CIPHER_DQMEM: //only for R2
762*53ee8cc1Swenshuai.xi 			_u32DmaOut_StartAddr = HAL_CIPHER_BASE_DQMEM;
763*53ee8cc1Swenshuai.xi 			_u32DmaOut_EndAddr   = HAL_CIPHER_BASE_DQMEM;
764*53ee8cc1Swenshuai.xi 			dst = E_DMA_DST_DQMEM;
765*53ee8cc1Swenshuai.xi 			break;
766*53ee8cc1Swenshuai.xi 
767*53ee8cc1Swenshuai.xi 		case E_CIPHER_IQMEM: //only for R2
768*53ee8cc1Swenshuai.xi 			_u32DmaOut_StartAddr = HAL_CIPHER_BASE_IQMEM;
769*53ee8cc1Swenshuai.xi 			_u32DmaOut_EndAddr	 = HAL_CIPHER_BASE_IQMEM;
770*53ee8cc1Swenshuai.xi 			dst = E_DMA_DST_IQMEM;
771*53ee8cc1Swenshuai.xi 			break;
772*53ee8cc1Swenshuai.xi 
773*53ee8cc1Swenshuai.xi 		case E_CIPHER_DIRECT: //for ACPU, OTPHASH
774*53ee8cc1Swenshuai.xi 			dst = E_DMA_DST_REGFILE;
775*53ee8cc1Swenshuai.xi 			break;
776*53ee8cc1Swenshuai.xi 
777*53ee8cc1Swenshuai.xi 		case E_CIPHER_KL_LUT:     //for KL transform algorithm
778*53ee8cc1Swenshuai.xi 		case E_CIPHER_KL_M:
779*53ee8cc1Swenshuai.xi 		case E_CIPHER_KL_BC:
780*53ee8cc1Swenshuai.xi             HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d]Not support output destination to Keyladder\n", __func__, __LINE__));
781*53ee8cc1Swenshuai.xi             return FALSE;
782*53ee8cc1Swenshuai.xi 
783*53ee8cc1Swenshuai.xi 		default:
784*53ee8cc1Swenshuai.xi 		    _u32DmaOut_StartAddr = 0;
785*53ee8cc1Swenshuai.xi             _u32DmaOut_EndAddr   = 0;
786*53ee8cc1Swenshuai.xi 			dst = E_DMA_DST_DRAM;
787*53ee8cc1Swenshuai.xi 			break;
788*53ee8cc1Swenshuai.xi 	}
789*53ee8cc1Swenshuai.xi 
790*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.Dest= (MS_U32)dst;
791*53ee8cc1Swenshuai.xi 
792*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set output destination to [%d]\n", __func__, __LINE__, dst));
793*53ee8cc1Swenshuai.xi 
794*53ee8cc1Swenshuai.xi     return TRUE;
795*53ee8cc1Swenshuai.xi }
796*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_Set_OutputDstKL(MS_BOOL bDstKL)797*53ee8cc1Swenshuai.xi void HAL_CIPHER_DMA_Set_OutputDstKL(MS_BOOL bDstKL)
798*53ee8cc1Swenshuai.xi {
799*53ee8cc1Swenshuai.xi     if(bDstKL)
800*53ee8cc1Swenshuai.xi     {
801*53ee8cc1Swenshuai.xi         _uDmaCtrl1.DmaCtrl1.DestKL = CMD_DMA_OUTPUT_SRAM_KL;
802*53ee8cc1Swenshuai.xi         _uDmaCtrl0.DmaCtrl0.DK = TRUE;
803*53ee8cc1Swenshuai.xi     }
804*53ee8cc1Swenshuai.xi     else
805*53ee8cc1Swenshuai.xi     {
806*53ee8cc1Swenshuai.xi         _uDmaCtrl1.DmaCtrl1.DestKL = CMD_DMA_OUTPUT_DEST;
807*53ee8cc1Swenshuai.xi     }
808*53ee8cc1Swenshuai.xi }
809*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_Set_FileinDesc(MS_PHY u32FileinAddr,MS_U32 u32FileinNum)810*53ee8cc1Swenshuai.xi void HAL_CIPHER_DMA_Set_FileinDesc(MS_PHY u32FileinAddr, MS_U32 u32FileinNum)
811*53ee8cc1Swenshuai.xi {
812*53ee8cc1Swenshuai.xi 
813*53ee8cc1Swenshuai.xi      _u32DmaInAddr += u32FileinAddr;
814*53ee8cc1Swenshuai.xi      _u32DmaInNum = u32FileinNum ;
815*53ee8cc1Swenshuai.xi }
816*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_Set_FileoutDesc(MS_PHY u32FileoutSAddr,MS_PHY u32phyFileoutEAddr)817*53ee8cc1Swenshuai.xi void HAL_CIPHER_DMA_Set_FileoutDesc(MS_PHY u32FileoutSAddr, MS_PHY u32phyFileoutEAddr)
818*53ee8cc1Swenshuai.xi {
819*53ee8cc1Swenshuai.xi     _u32DmaOut_StartAddr += u32FileoutSAddr;
820*53ee8cc1Swenshuai.xi     _u32DmaOut_EndAddr   += u32phyFileoutEAddr;
821*53ee8cc1Swenshuai.xi 
822*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d] _u32DmaOut_StartAddr = %x _u32DmaOut_EndAddr = %x\n", __func__, __LINE__, (unsigned int)_u32DmaOut_StartAddr, (unsigned int)_u32DmaOut_EndAddr));
823*53ee8cc1Swenshuai.xi }
824*53ee8cc1Swenshuai.xi 
HAL_CIPHER_OTPHash_Set_FileinDesc(MS_PHY u32FileinAddr,MS_U32 u32FileinNum,MS_U32 u32CurrentRound,CIPHER_MEM_TYPE eInputSrcFrom)825*53ee8cc1Swenshuai.xi void HAL_CIPHER_OTPHash_Set_FileinDesc(MS_PHY u32FileinAddr, MS_U32 u32FileinNum, MS_U32 u32CurrentRound, CIPHER_MEM_TYPE eInputSrcFrom)
826*53ee8cc1Swenshuai.xi {
827*53ee8cc1Swenshuai.xi     if(E_CIPHER_OTP == eInputSrcFrom)
828*53ee8cc1Swenshuai.xi     {
829*53ee8cc1Swenshuai.xi         _u32DmaInAddr = u32CurrentRound;
830*53ee8cc1Swenshuai.xi     }
831*53ee8cc1Swenshuai.xi     else
832*53ee8cc1Swenshuai.xi     {
833*53ee8cc1Swenshuai.xi     _u32DmaInAddr = u32FileinAddr + u32CurrentRound*HAL_CRYPTODMA_OTPHASH_UNIT;
834*53ee8cc1Swenshuai.xi     }
835*53ee8cc1Swenshuai.xi 
836*53ee8cc1Swenshuai.xi     _u32OTPHashLengthPadding = u32FileinNum;
837*53ee8cc1Swenshuai.xi     if((u32FileinNum - u32CurrentRound*HAL_CRYPTODMA_OTPHASH_UNIT) >= HAL_CRYPTODMA_OTPHASH_UNIT)
838*53ee8cc1Swenshuai.xi     {
839*53ee8cc1Swenshuai.xi         _u32DmaInNum = HAL_CRYPTODMA_OTPHASH_UNIT;
840*53ee8cc1Swenshuai.xi     }
841*53ee8cc1Swenshuai.xi      else
842*53ee8cc1Swenshuai.xi     {
843*53ee8cc1Swenshuai.xi         _u32DmaInNum = u32FileinNum - u32CurrentRound*HAL_CRYPTODMA_OTPHASH_UNIT;
844*53ee8cc1Swenshuai.xi     }
845*53ee8cc1Swenshuai.xi 
846*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d] _u32DmaInAddr = %x _u32DmaInNum = %x _u32OTPHashLengthPadding = %x\n", __func__, __LINE__, (unsigned int)_u32DmaInAddr, (unsigned int)_u32DmaInNum, (unsigned int)_u32OTPHashLengthPadding));
847*53ee8cc1Swenshuai.xi }
848*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_Set_Key(DRV_CIPHER_KEY stKey)849*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_DMA_Set_Key(DRV_CIPHER_KEY stKey)
850*53ee8cc1Swenshuai.xi {
851*53ee8cc1Swenshuai.xi     HAL_CIPHER_KEYSRC KeySrc = 0;
852*53ee8cc1Swenshuai.xi     HAL_CIPHER_ALGO algo = 0;
853*53ee8cc1Swenshuai.xi     MS_BOOL bDK = FALSE;
854*53ee8cc1Swenshuai.xi 
855*53ee8cc1Swenshuai.xi 	algo = _uDmaCtrl0.DmaCtrl0.Algo;
856*53ee8cc1Swenshuai.xi 
857*53ee8cc1Swenshuai.xi     if(E_DMA_ALGO_NONE == algo)
858*53ee8cc1Swenshuai.xi     {
859*53ee8cc1Swenshuai.xi         //No key
860*53ee8cc1Swenshuai.xi         bDK = TRUE;
861*53ee8cc1Swenshuai.xi         memset(_pu8CipherKey, 0x0 , HAL_CRYPTODMA_KEYLEN_MAX);
862*53ee8cc1Swenshuai.xi         goto SET_KEY_DONE;
863*53ee8cc1Swenshuai.xi     }
864*53ee8cc1Swenshuai.xi     //Check Key Source, Index
865*53ee8cc1Swenshuai.xi     if(((E_CIPHER_KSRC_KL == stKey.eKeySrc) && (stKey.u8KeyIdx > HAL_CRYPTODMA_DMA_KEY_SLOT-1)) ||
866*53ee8cc1Swenshuai.xi        ((E_CIPHER_KSRC_OTP == stKey.eKeySrc) && (stKey.u8KeyIdx > HAL_CRYPTODMA_OTP_SCK_NUM-1)))
867*53ee8cc1Swenshuai.xi     {
868*53ee8cc1Swenshuai.xi        HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d]Invalid KeySrc[%d], Index[%d]\n",
869*53ee8cc1Swenshuai.xi            __func__, __LINE__, stKey.eKeySrc, stKey.u8KeyIdx));
870*53ee8cc1Swenshuai.xi        return FALSE;
871*53ee8cc1Swenshuai.xi     }
872*53ee8cc1Swenshuai.xi 
873*53ee8cc1Swenshuai.xi     //DRV to HAL Type transfer
874*53ee8cc1Swenshuai.xi     KeySrc = _HAL_CIPHER_TransKey(stKey.eKeySrc, stKey.u8KeyIdx);
875*53ee8cc1Swenshuai.xi 
876*53ee8cc1Swenshuai.xi     // key from CPU
877*53ee8cc1Swenshuai.xi     if(E_DMA_KSEL_REGKEY == KeySrc)
878*53ee8cc1Swenshuai.xi     {
879*53ee8cc1Swenshuai.xi         if ((NULL != stKey.pu8KeyData) && (stKey.u8KeyLen != 0) && (stKey.u8KeyLen <= HAL_CRYPTODMA_KEYLEN_MAX) )
880*53ee8cc1Swenshuai.xi         {
881*53ee8cc1Swenshuai.xi             memset(_pu8CipherKey, 0x0 , HAL_CRYPTODMA_KEYLEN_MAX );
882*53ee8cc1Swenshuai.xi             memcpy(_pu8CipherKey, (MS_U8 *)stKey.pu8KeyData , stKey.u8KeyLen);
883*53ee8cc1Swenshuai.xi             bDK = TRUE ;
884*53ee8cc1Swenshuai.xi 			KeySrc = 0;
885*53ee8cc1Swenshuai.xi         }
886*53ee8cc1Swenshuai.xi         else
887*53ee8cc1Swenshuai.xi         {
888*53ee8cc1Swenshuai.xi 			return FALSE ;
889*53ee8cc1Swenshuai.xi         }
890*53ee8cc1Swenshuai.xi 
891*53ee8cc1Swenshuai.xi     }
892*53ee8cc1Swenshuai.xi     else if(E_DMA_KSEL_CAIP == KeySrc)
893*53ee8cc1Swenshuai.xi     {
894*53ee8cc1Swenshuai.xi         bDK = FALSE ;
895*53ee8cc1Swenshuai.xi         KeySrc = 0 ;
896*53ee8cc1Swenshuai.xi     }
897*53ee8cc1Swenshuai.xi     else// key from KL or OTP or STR
898*53ee8cc1Swenshuai.xi     {
899*53ee8cc1Swenshuai.xi         bDK = FALSE;
900*53ee8cc1Swenshuai.xi     }
901*53ee8cc1Swenshuai.xi 
902*53ee8cc1Swenshuai.xi SET_KEY_DONE:
903*53ee8cc1Swenshuai.xi 
904*53ee8cc1Swenshuai.xi 	_uDmaCtrl0.DmaCtrl0.DK = bDK;
905*53ee8cc1Swenshuai.xi     _uDmaCtrl0.DmaCtrl0.KeySel = KeySrc;
906*53ee8cc1Swenshuai.xi 
907*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set DK[%d], KeySel[%d]\n",
908*53ee8cc1Swenshuai.xi         __func__, __LINE__, bDK, KeySrc));
909*53ee8cc1Swenshuai.xi 
910*53ee8cc1Swenshuai.xi     return TRUE ;
911*53ee8cc1Swenshuai.xi }
912*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_Set_IV(MS_U8 * pu8IV,MS_U32 u32Size)913*53ee8cc1Swenshuai.xi void HAL_CIPHER_DMA_Set_IV(MS_U8* pu8IV, MS_U32 u32Size)
914*53ee8cc1Swenshuai.xi {
915*53ee8cc1Swenshuai.xi     MS_BOOL bDIV = FALSE;
916*53ee8cc1Swenshuai.xi 
917*53ee8cc1Swenshuai.xi     if ((NULL != pu8IV) && (u32Size != 0) && (u32Size <= HAL_CRYPTODMA_KEYLEN_MAX) )
918*53ee8cc1Swenshuai.xi     {
919*53ee8cc1Swenshuai.xi         memset(_pu8IV, 0x0 , HAL_CRYPTODMA_KEYLEN_MAX);
920*53ee8cc1Swenshuai.xi         memcpy(_pu8IV, (MS_U8 *)pu8IV, u32Size);
921*53ee8cc1Swenshuai.xi         bDIV = TRUE;
922*53ee8cc1Swenshuai.xi     }
923*53ee8cc1Swenshuai.xi     else // Data from Dram
924*53ee8cc1Swenshuai.xi     {
925*53ee8cc1Swenshuai.xi         memset(_pu8IV, 0x0 , HAL_CRYPTODMA_KEYLEN_MAX);
926*53ee8cc1Swenshuai.xi         bDIV = FALSE;
927*53ee8cc1Swenshuai.xi     }
928*53ee8cc1Swenshuai.xi 
929*53ee8cc1Swenshuai.xi     _uDmaCtrl0.DmaCtrl0.DIV = bDIV ;
930*53ee8cc1Swenshuai.xi 
931*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set DIV[%d]\n",
932*53ee8cc1Swenshuai.xi         __func__, __LINE__, bDIV));
933*53ee8cc1Swenshuai.xi }
934*53ee8cc1Swenshuai.xi 
935*53ee8cc1Swenshuai.xi 
936*53ee8cc1Swenshuai.xi // Set Direct Data to Register Input, if Dram input, set pu8Data = NULL ;
HAL_CIPHER_DMA_Set_Data(MS_U8 * pu8Data,MS_U32 u32Size)937*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_DMA_Set_Data(MS_U8* pu8Data, MS_U32 u32Size)
938*53ee8cc1Swenshuai.xi {
939*53ee8cc1Swenshuai.xi     HAL_CIPHER_DATASRC eDataSrc = E_DMA_SRC_DRAM;
940*53ee8cc1Swenshuai.xi 
941*53ee8cc1Swenshuai.xi     // Data size can't be zero //
942*53ee8cc1Swenshuai.xi     if (( 0 == u32Size ) && (NULL != pu8Data ))
943*53ee8cc1Swenshuai.xi     {
944*53ee8cc1Swenshuai.xi         return FALSE ;
945*53ee8cc1Swenshuai.xi     }
946*53ee8cc1Swenshuai.xi 
947*53ee8cc1Swenshuai.xi     if (NULL != pu8Data )  // Data from CMDQ
948*53ee8cc1Swenshuai.xi     {
949*53ee8cc1Swenshuai.xi         _u32DmaInNum = u32Size ;
950*53ee8cc1Swenshuai.xi         memset(_pu8Data, 0x0, HAL_CRYPTODMA_DIRDATA_MAX);
951*53ee8cc1Swenshuai.xi         memcpy(_pu8Data, (MS_U8 *)pu8Data, u32Size);
952*53ee8cc1Swenshuai.xi         eDataSrc = E_DMA_SRC_DIRECT ;
953*53ee8cc1Swenshuai.xi     }
954*53ee8cc1Swenshuai.xi     else // Data from Dram
955*53ee8cc1Swenshuai.xi     {
956*53ee8cc1Swenshuai.xi         memset(_pu8Data, 0x0 , HAL_CRYPTODMA_DIRDATA_MAX );
957*53ee8cc1Swenshuai.xi         eDataSrc = E_DMA_SRC_DRAM ;
958*53ee8cc1Swenshuai.xi     }
959*53ee8cc1Swenshuai.xi 
960*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.SD = (MS_U32)eDataSrc ;
961*53ee8cc1Swenshuai.xi 
962*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set SD[%d]\n",
963*53ee8cc1Swenshuai.xi         __func__, __LINE__, eDataSrc));
964*53ee8cc1Swenshuai.xi 
965*53ee8cc1Swenshuai.xi     return TRUE ;
966*53ee8cc1Swenshuai.xi }
967*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_Set_CaVid(MS_U32 u32CAVid)968*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_DMA_Set_CaVid(MS_U32 u32CAVid)
969*53ee8cc1Swenshuai.xi {
970*53ee8cc1Swenshuai.xi     MS_U32 u32Tmp = u32CAVid;
971*53ee8cc1Swenshuai.xi 
972*53ee8cc1Swenshuai.xi     if(u32Tmp > HAL_CRYPTODMA_CAVID_MAX)
973*53ee8cc1Swenshuai.xi     {
974*53ee8cc1Swenshuai.xi         return FALSE;
975*53ee8cc1Swenshuai.xi     }
976*53ee8cc1Swenshuai.xi 
977*53ee8cc1Swenshuai.xi     if(u32Tmp == 0)
978*53ee8cc1Swenshuai.xi     {
979*53ee8cc1Swenshuai.xi         u32Tmp = _CIPHER_CAVid ;
980*53ee8cc1Swenshuai.xi     }
981*53ee8cc1Swenshuai.xi     else
982*53ee8cc1Swenshuai.xi     {
983*53ee8cc1Swenshuai.xi         u32Tmp = u32CAVid ;
984*53ee8cc1Swenshuai.xi     }
985*53ee8cc1Swenshuai.xi 
986*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.CaVid = u32Tmp ;
987*53ee8cc1Swenshuai.xi 
988*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set CAVid [0x%x]\n",
989*53ee8cc1Swenshuai.xi         __func__, __LINE__, (unsigned int)u32Tmp));
990*53ee8cc1Swenshuai.xi 
991*53ee8cc1Swenshuai.xi     return TRUE;
992*53ee8cc1Swenshuai.xi }
993*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_Set_Config(MS_BOOL OutputReg)994*53ee8cc1Swenshuai.xi void HAL_CIPHER_DMA_Set_Config(MS_BOOL OutputReg)
995*53ee8cc1Swenshuai.xi {
996*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.Dest= OutputReg ;
997*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set dest[%d]\n",
998*53ee8cc1Swenshuai.xi         __func__, __LINE__, OutputReg));
999*53ee8cc1Swenshuai.xi }
1000*53ee8cc1Swenshuai.xi 
1001*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_Set_ReportMode(MS_BOOL RptInDram,MS_PHY u32DramAddr)1002*53ee8cc1Swenshuai.xi void HAL_CIPHER_DMA_Set_ReportMode(MS_BOOL RptInDram, MS_PHY u32DramAddr)
1003*53ee8cc1Swenshuai.xi {
1004*53ee8cc1Swenshuai.xi     MS_BOOL bRR = FALSE;
1005*53ee8cc1Swenshuai.xi 
1006*53ee8cc1Swenshuai.xi     if (RptInDram)
1007*53ee8cc1Swenshuai.xi     {
1008*53ee8cc1Swenshuai.xi         bRR = TRUE ;
1009*53ee8cc1Swenshuai.xi         _u32ReportAddr = u32DramAddr;
1010*53ee8cc1Swenshuai.xi 
1011*53ee8cc1Swenshuai.xi     }
1012*53ee8cc1Swenshuai.xi     else
1013*53ee8cc1Swenshuai.xi     {
1014*53ee8cc1Swenshuai.xi         bRR = FALSE ;
1015*53ee8cc1Swenshuai.xi         _u32ReportAddr = 0;
1016*53ee8cc1Swenshuai.xi 
1017*53ee8cc1Swenshuai.xi     }
1018*53ee8cc1Swenshuai.xi 
1019*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.RR = bRR;
1020*53ee8cc1Swenshuai.xi 
1021*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set report mode[%d], report address[0x%08x]\n",
1022*53ee8cc1Swenshuai.xi         __func__, __LINE__, bRR, (unsigned int)_u32ReportAddr));
1023*53ee8cc1Swenshuai.xi }
1024*53ee8cc1Swenshuai.xi 
1025*53ee8cc1Swenshuai.xi // [NOTE] HW Bug, the DMA can't support DRAM Data Swap, Data Error for input and output
HAL_CIPHER_DMA_Set_DataSwap(MS_BOOL InDataSwap,MS_BOOL OutDataSwap,MS_BOOL DInByteSwap,MS_BOOL DOutByteSwap)1026*53ee8cc1Swenshuai.xi void HAL_CIPHER_DMA_Set_DataSwap(MS_BOOL InDataSwap , MS_BOOL OutDataSwap,
1027*53ee8cc1Swenshuai.xi                                 MS_BOOL DInByteSwap, MS_BOOL DOutByteSwap )
1028*53ee8cc1Swenshuai.xi {
1029*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.CIS = InDataSwap ;
1030*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.COS = OutDataSwap ;
1031*53ee8cc1Swenshuai.xi     //_uDmaCtrl1.DmaCtrl1.DODS = DOutBitSwap ;
1032*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.DOBS = DOutByteSwap ;
1033*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.DIBS = DInByteSwap;
1034*53ee8cc1Swenshuai.xi 
1035*53ee8cc1Swenshuai.xi }
1036*53ee8cc1Swenshuai.xi 
1037*53ee8cc1Swenshuai.xi 
1038*53ee8cc1Swenshuai.xi //void HAL_CIPHER_DMA_Set_Algo(CipherAlgo algo , CipherMode subalgo , Cipher_Residue eRes , Cipher_ShortBlock eSB )
HAL_CIPHER_DMA_Set_Algo(DRV_CIPHER_ALGO stAlgo)1039*53ee8cc1Swenshuai.xi void HAL_CIPHER_DMA_Set_Algo(DRV_CIPHER_ALGO stAlgo)
1040*53ee8cc1Swenshuai.xi {
1041*53ee8cc1Swenshuai.xi     HAL_CIPHER_ALGO algo;
1042*53ee8cc1Swenshuai.xi     HAL_CIPHER_MODE subalgo;
1043*53ee8cc1Swenshuai.xi     HAL_CIPHER_RESIDUE eRes;
1044*53ee8cc1Swenshuai.xi     HAL_CIPHER_SHORTBLOCK eSB;
1045*53ee8cc1Swenshuai.xi 
1046*53ee8cc1Swenshuai.xi     if(_uDmaCtrl1.DmaCtrl1.CaVid == E_CIPHER_CAVID1)
1047*53ee8cc1Swenshuai.xi     {
1048*53ee8cc1Swenshuai.xi         algo    = (HAL_CIPHER_ALGO)stAlgo.eMainAlgo;
1049*53ee8cc1Swenshuai.xi         subalgo = (HAL_CIPHER_MODE)stAlgo.eSubAlgo;
1050*53ee8cc1Swenshuai.xi 
1051*53ee8cc1Swenshuai.xi         // For OTPHASH in E_CIPHER_CAVID1
1052*53ee8cc1Swenshuai.xi         if(stAlgo.eSubAlgo == E_CIPHER_SUB_OTPHASH)
1053*53ee8cc1Swenshuai.xi             subalgo = E_DMA_MODE_OTPHASH;
1054*53ee8cc1Swenshuai.xi     }
1055*53ee8cc1Swenshuai.xi     else
1056*53ee8cc1Swenshuai.xi     {
1057*53ee8cc1Swenshuai.xi         algo    = _HAL_CIPHER_TransMainAlgo(stAlgo.eMainAlgo);
1058*53ee8cc1Swenshuai.xi         subalgo = _HAL_CIPHER_TransSubAlgo(stAlgo.eSubAlgo);
1059*53ee8cc1Swenshuai.xi     }
1060*53ee8cc1Swenshuai.xi 
1061*53ee8cc1Swenshuai.xi     eRes    = _HAL_CIPHER_TransResAlgo(stAlgo.eResAlgo);
1062*53ee8cc1Swenshuai.xi     eSB     = _HAL_CIPHER_TransSBAlgo(stAlgo.eSBAlgo);
1063*53ee8cc1Swenshuai.xi 
1064*53ee8cc1Swenshuai.xi     _uDmaCtrl0.DmaCtrl0.Algo= algo ;
1065*53ee8cc1Swenshuai.xi     _uDmaCtrl0.DmaCtrl0.SubAlgo= subalgo ;
1066*53ee8cc1Swenshuai.xi     _uDmaCtrl0.DmaCtrl0.Residue = eRes ;
1067*53ee8cc1Swenshuai.xi     _uDmaCtrl0.DmaCtrl0.SB = eSB ;
1068*53ee8cc1Swenshuai.xi 
1069*53ee8cc1Swenshuai.xi      HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set algorithm, MAIN[%d], SUB[%d], RES[%d], SB[%d]\n",
1070*53ee8cc1Swenshuai.xi         __func__, __LINE__, algo, subalgo, eRes, eSB));
1071*53ee8cc1Swenshuai.xi }
1072*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_Set_OTPHash(MS_U32 u32CurrentRound,MS_U32 u32OTPHashRound)1073*53ee8cc1Swenshuai.xi void HAL_CIPHER_DMA_Set_OTPHash(MS_U32 u32CurrentRound, MS_U32 u32OTPHashRound)
1074*53ee8cc1Swenshuai.xi {
1075*53ee8cc1Swenshuai.xi     _uDmaCtrl3.DmaCtrl3.AP = 0;
1076*53ee8cc1Swenshuai.xi     _uDmaCtrl3.DmaCtrl3.IK = 0;
1077*53ee8cc1Swenshuai.xi     // First OTPHASH enable IK, other disable IK
1078*53ee8cc1Swenshuai.xi     if(u32CurrentRound == 0)
1079*53ee8cc1Swenshuai.xi     {
1080*53ee8cc1Swenshuai.xi         _uDmaCtrl3.DmaCtrl3.IK = 1;
1081*53ee8cc1Swenshuai.xi     }
1082*53ee8cc1Swenshuai.xi     // Final OTPHASH enable AP, other disable AP
1083*53ee8cc1Swenshuai.xi     if(u32CurrentRound == u32OTPHashRound)
1084*53ee8cc1Swenshuai.xi     {
1085*53ee8cc1Swenshuai.xi         _uDmaCtrl3.DmaCtrl3.AP = 1;
1086*53ee8cc1Swenshuai.xi     }
1087*53ee8cc1Swenshuai.xi 
1088*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set OTPHASH, AP[%d], IK[%d]\n",
1089*53ee8cc1Swenshuai.xi         __func__, __LINE__, _uDmaCtrl3.DmaCtrl3.AP, _uDmaCtrl3.DmaCtrl3.IK));
1090*53ee8cc1Swenshuai.xi }
1091*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_WriteCMDQ(MS_U32 u32Cmd)1092*53ee8cc1Swenshuai.xi void HAL_CIPHER_DMA_WriteCMDQ(MS_U32 u32Cmd)
1093*53ee8cc1Swenshuai.xi {
1094*53ee8cc1Swenshuai.xi     WRITE_CMDQ(u32Cmd) ;
1095*53ee8cc1Swenshuai.xi }
1096*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_GetData(MS_U8 * u8Data)1097*53ee8cc1Swenshuai.xi void HAL_CIPHER_DMA_GetData(MS_U8 *u8Data)
1098*53ee8cc1Swenshuai.xi {
1099*53ee8cc1Swenshuai.xi 
1100*53ee8cc1Swenshuai.xi     MS_U32 tmp ;
1101*53ee8cc1Swenshuai.xi 
1102*53ee8cc1Swenshuai.xi     // [Note] for u8Data is not always 4 bytes alignment.
1103*53ee8cc1Swenshuai.xi     tmp = REG32_R(&_AESDMACtrl->Dma_Out[0]);
1104*53ee8cc1Swenshuai.xi     u8Data[0] = (tmp >> 0)  & 0xFF ;
1105*53ee8cc1Swenshuai.xi     u8Data[1] = (tmp >> 8)  & 0xFF ;
1106*53ee8cc1Swenshuai.xi     u8Data[2] = (tmp >> 16) & 0xFF ;
1107*53ee8cc1Swenshuai.xi     u8Data[3] = (tmp >> 24) & 0xFF ;
1108*53ee8cc1Swenshuai.xi 
1109*53ee8cc1Swenshuai.xi     tmp = REG32_R(&_AESDMACtrl->Dma_Out[1]);
1110*53ee8cc1Swenshuai.xi     u8Data[4] = (tmp >> 0)  & 0xFF ;
1111*53ee8cc1Swenshuai.xi     u8Data[5] = (tmp >> 8)  & 0xFF ;
1112*53ee8cc1Swenshuai.xi     u8Data[6] = (tmp >> 16) & 0xFF ;
1113*53ee8cc1Swenshuai.xi     u8Data[7] = (tmp >> 24) & 0xFF ;
1114*53ee8cc1Swenshuai.xi 
1115*53ee8cc1Swenshuai.xi     tmp = REG32_R(&_AESDMACtrl->Dma_Out[2]);
1116*53ee8cc1Swenshuai.xi     u8Data[8] = (tmp >> 0)  & 0xFF ;
1117*53ee8cc1Swenshuai.xi     u8Data[9] = (tmp >> 8)  & 0xFF ;
1118*53ee8cc1Swenshuai.xi     u8Data[10] = (tmp >> 16) & 0xFF ;
1119*53ee8cc1Swenshuai.xi     u8Data[11] = (tmp >> 24) & 0xFF ;
1120*53ee8cc1Swenshuai.xi 
1121*53ee8cc1Swenshuai.xi     tmp = REG32_R(&_AESDMACtrl->Dma_Out[3]);
1122*53ee8cc1Swenshuai.xi     u8Data[12] = (tmp >> 0)  & 0xFF ;
1123*53ee8cc1Swenshuai.xi     u8Data[13] = (tmp >> 8)  & 0xFF ;
1124*53ee8cc1Swenshuai.xi     u8Data[14] = (tmp >> 16) & 0xFF ;
1125*53ee8cc1Swenshuai.xi     u8Data[15] = (tmp >> 24) & 0xFF ;
1126*53ee8cc1Swenshuai.xi 
1127*53ee8cc1Swenshuai.xi }
1128*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_GetRpt(MS_U32 * DmaRpt)1129*53ee8cc1Swenshuai.xi void HAL_CIPHER_DMA_GetRpt(MS_U32 *DmaRpt)
1130*53ee8cc1Swenshuai.xi {
1131*53ee8cc1Swenshuai.xi     MS_U32 i ;
1132*53ee8cc1Swenshuai.xi 
1133*53ee8cc1Swenshuai.xi     for (i = 0 ; i < DMA_RPT_REG_SIZE ; i++)
1134*53ee8cc1Swenshuai.xi     {
1135*53ee8cc1Swenshuai.xi         DmaRpt[i] = REG32_R(&_AESDMACtrl->Dma_Reportp[i]);
1136*53ee8cc1Swenshuai.xi     }
1137*53ee8cc1Swenshuai.xi }
1138*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_Start(MS_BOOL Decrypt,HAL_CIPHER_INTMODE IntMode,MS_BOOL bWaitCmdQ,MS_U16 u16CmdID)1139*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_DMA_Start(MS_BOOL Decrypt, HAL_CIPHER_INTMODE IntMode, MS_BOOL bWaitCmdQ, MS_U16 u16CmdID)
1140*53ee8cc1Swenshuai.xi {
1141*53ee8cc1Swenshuai.xi     MS_U32 u32SpareCnt = 0 , CmdLen = 0 ;
1142*53ee8cc1Swenshuai.xi 
1143*53ee8cc1Swenshuai.xi     _uDmaCtrl0.DmaCtrl0.OVT = FALSE ;
1144*53ee8cc1Swenshuai.xi 
1145*53ee8cc1Swenshuai.xi     //Set Thread Id
1146*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.TID  = u16CmdID ;
1147*53ee8cc1Swenshuai.xi 
1148*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.IntM = IntMode ;
1149*53ee8cc1Swenshuai.xi 
1150*53ee8cc1Swenshuai.xi     CmdLen = _HAL_CIPHER_GetCmdLen(E_CIPHER_TYPE_DMA);
1151*53ee8cc1Swenshuai.xi 
1152*53ee8cc1Swenshuai.xi     _uDmaCtrl0.DmaCtrl0.CL  = CmdLen & CMD_LEN_MASK ;
1153*53ee8cc1Swenshuai.xi     _uDmaCtrl0.DmaCtrl0.CMD = ((Decrypt?0x3:0x2) & 0xF);
1154*53ee8cc1Swenshuai.xi 
1155*53ee8cc1Swenshuai.xi 	_uDmaCtrl2.DmaCtrl2.NS = 0;
1156*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.NL = CMD_NEW_LINE;
1157*53ee8cc1Swenshuai.xi 
1158*53ee8cc1Swenshuai.xi     //Parser patch
1159*53ee8cc1Swenshuai.xi     if(TRUE == _uDmaCtrl2.DmaCtrl2.HP)
1160*53ee8cc1Swenshuai.xi     {
1161*53ee8cc1Swenshuai.xi         MS_U32 u32Tmp = 0;
1162*53ee8cc1Swenshuai.xi         u32Tmp = _AESDMACtrl->Dma_Ctrl[1];
1163*53ee8cc1Swenshuai.xi         u32Tmp |= REG_PARSER_LG_PATH_EN;
1164*53ee8cc1Swenshuai.xi         _AESDMACtrl->Dma_Ctrl[1] = u32Tmp;
1165*53ee8cc1Swenshuai.xi     }
1166*53ee8cc1Swenshuai.xi 
1167*53ee8cc1Swenshuai.xi 	//Check STR key valid
1168*53ee8cc1Swenshuai.xi     if(CMD_DMA_KSEL_TRNG == _uDmaCtrl0.DmaCtrl0.KeySel)
1169*53ee8cc1Swenshuai.xi     {
1170*53ee8cc1Swenshuai.xi         MS_U32 u32DMACtrl = REG32_R(&_AESDMACtrl->Dma_Ctrl[REG_DMA_CTRL]);
1171*53ee8cc1Swenshuai.xi         if(0 == (REG_DMA_STR_KEY_VALID & u32DMACtrl))
1172*53ee8cc1Swenshuai.xi         {
1173*53ee8cc1Swenshuai.xi             HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d]STR Key invalid!\n",__func__, __LINE__));
1174*53ee8cc1Swenshuai.xi             return FALSE;
1175*53ee8cc1Swenshuai.xi         }
1176*53ee8cc1Swenshuai.xi     }
1177*53ee8cc1Swenshuai.xi 
1178*53ee8cc1Swenshuai.xi     MS_U32 MIUCrossBar = REG32_R(_u32RegBase + REG_MIU_CROSSBAR);  //MIU CrossBar Bank 0x1613
1179*53ee8cc1Swenshuai.xi     REG32_W(_u32RegBase + REG_MIU_CROSSBAR, MIUCrossBar | 0xf);  //enable MIU crossbar
1180*53ee8cc1Swenshuai.xi 
1181*53ee8cc1Swenshuai.xi 
1182*53ee8cc1Swenshuai.xi     if(_uDmaCtrl1.DmaCtrl1.SD == CMD_DMA_DATA_DRAM)
1183*53ee8cc1Swenshuai.xi     {
1184*53ee8cc1Swenshuai.xi         if(_HAL_CIPHER_TransMIUAddr(&_u32DmaInAddr) == FALSE)
1185*53ee8cc1Swenshuai.xi         {
1186*53ee8cc1Swenshuai.xi             return FALSE;
1187*53ee8cc1Swenshuai.xi         }
1188*53ee8cc1Swenshuai.xi     }
1189*53ee8cc1Swenshuai.xi 
1190*53ee8cc1Swenshuai.xi     if(_uDmaCtrl1.DmaCtrl1.Dest == CMD_DMA_OUTPUT_DRAM)
1191*53ee8cc1Swenshuai.xi     {
1192*53ee8cc1Swenshuai.xi         if(_HAL_CIPHER_TransMIUAddr(&_u32DmaOut_StartAddr) == FALSE)
1193*53ee8cc1Swenshuai.xi         {
1194*53ee8cc1Swenshuai.xi             return FALSE;
1195*53ee8cc1Swenshuai.xi         }
1196*53ee8cc1Swenshuai.xi         if(_HAL_CIPHER_TransMIUAddr(&_u32DmaOut_EndAddr) == FALSE)
1197*53ee8cc1Swenshuai.xi         {
1198*53ee8cc1Swenshuai.xi             return FALSE;
1199*53ee8cc1Swenshuai.xi         }
1200*53ee8cc1Swenshuai.xi     }
1201*53ee8cc1Swenshuai.xi 
1202*53ee8cc1Swenshuai.xi DMA_RETRY:
1203*53ee8cc1Swenshuai.xi     // [HW] Hardware will check Current spare count first, and others read spare count will be zero!
1204*53ee8cc1Swenshuai.xi     u32SpareCnt = REG32_R(&_AESDMACtrl->SpareCnt) ;
1205*53ee8cc1Swenshuai.xi 
1206*53ee8cc1Swenshuai.xi     if (u32SpareCnt > CmdLen)
1207*53ee8cc1Swenshuai.xi     {
1208*53ee8cc1Swenshuai.xi         u32SpareCnt -= CmdLen ;
1209*53ee8cc1Swenshuai.xi 
1210*53ee8cc1Swenshuai.xi         WRITE_CMDQ( (_uDmaCtrl0.u32DmaCtrl0)) ;
1211*53ee8cc1Swenshuai.xi         WRITE_CMDQ( (_uDmaCtrl1.u32DmaCtrl1)) ;
1212*53ee8cc1Swenshuai.xi 		WRITE_CMDQ( (_uDmaCtrl2.u32DmaCtrl2)) ;
1213*53ee8cc1Swenshuai.xi         WRITE_CMDQ( (_uDmaCtrl3.u32DmaCtrl3)) ;
1214*53ee8cc1Swenshuai.xi 
1215*53ee8cc1Swenshuai.xi         WRITE_CMDQ((MS_U32)_u32DmaInAddr) ;
1216*53ee8cc1Swenshuai.xi         WRITE_CMDQ(_u32DmaInNum) ;
1217*53ee8cc1Swenshuai.xi         WRITE_CMDQ((MS_U32)_u32DmaOut_StartAddr);
1218*53ee8cc1Swenshuai.xi         WRITE_CMDQ((MS_U32)_u32DmaOut_EndAddr);
1219*53ee8cc1Swenshuai.xi 
1220*53ee8cc1Swenshuai.xi         if (_uDmaCtrl1.DmaCtrl1.RR == TRUE )
1221*53ee8cc1Swenshuai.xi         {
1222*53ee8cc1Swenshuai.xi            WRITE_CMDQ((MS_U32)_u32ReportAddr);
1223*53ee8cc1Swenshuai.xi         }
1224*53ee8cc1Swenshuai.xi 
1225*53ee8cc1Swenshuai.xi         // DMA Initial Vector from CmdQ
1226*53ee8cc1Swenshuai.xi         if (_uDmaCtrl0.DmaCtrl0.DIV == TRUE )
1227*53ee8cc1Swenshuai.xi         {
1228*53ee8cc1Swenshuai.xi             #if 0
1229*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8IV[15]<<24 |_pu8IV[14]<<16 | _pu8IV[13]<<8 | _pu8IV[12]);
1230*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8IV[11]<<24 |_pu8IV[10]<<16 | _pu8IV[ 9]<<8 | _pu8IV[ 8]);
1231*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8IV[ 3]<<24 |_pu8IV[ 2]<<16 | _pu8IV[ 1]<<8 | _pu8IV[ 0]);
1232*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8IV[ 7]<<24 |_pu8IV[ 6]<<16 | _pu8IV[ 5]<<8 | _pu8IV[ 4]);
1233*53ee8cc1Swenshuai.xi             #else
1234*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8IV[ 0]<<24 |_pu8IV[ 1]<<16 | _pu8IV[ 2]<<8 | _pu8IV[ 3]);
1235*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8IV[ 4]<<24 |_pu8IV[ 5]<<16 | _pu8IV[ 6]<<8 | _pu8IV[ 7]);
1236*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8IV[ 8]<<24 |_pu8IV[ 9]<<16 | _pu8IV[10]<<8 | _pu8IV[11]);
1237*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8IV[12]<<24 |_pu8IV[13]<<16 | _pu8IV[14]<<8 | _pu8IV[15]);
1238*53ee8cc1Swenshuai.xi             #endif
1239*53ee8cc1Swenshuai.xi         }
1240*53ee8cc1Swenshuai.xi 
1241*53ee8cc1Swenshuai.xi         // DMA Data from CmdQ
1242*53ee8cc1Swenshuai.xi         if (_uDmaCtrl1.DmaCtrl1.SD == CMD_DMA_DATA_REG )
1243*53ee8cc1Swenshuai.xi         {
1244*53ee8cc1Swenshuai.xi 			#if 0
1245*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8Data[15]<<24 |_pu8Data[14]<<16 | _pu8Data[13]<<8 | _pu8Data[12]);
1246*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8Data[11]<<24 |_pu8Data[10]<<16 | _pu8Data[ 9]<<8 | _pu8Data[ 8]);
1247*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8Data[ 7]<<24 |_pu8Data[ 6]<<16 | _pu8Data[ 5]<<8 | _pu8Data[ 4]);
1248*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8Data[ 3]<<24 |_pu8Data[ 2]<<16 | _pu8Data[ 1]<<8 | _pu8Data[ 0]);
1249*53ee8cc1Swenshuai.xi             #else
1250*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8Data[ 0]<<24 |_pu8Data[ 1]<<16 | _pu8Data[ 2]<<8 | _pu8Data[ 3]);
1251*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8Data[ 4]<<24 |_pu8Data[ 5]<<16 | _pu8Data[ 6]<<8 | _pu8Data[ 7]);
1252*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8Data[ 8]<<24 |_pu8Data[ 9]<<16 | _pu8Data[10]<<8 | _pu8Data[11]);
1253*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8Data[12]<<24 |_pu8Data[13]<<16 | _pu8Data[14]<<8 | _pu8Data[15]);
1254*53ee8cc1Swenshuai.xi             #endif
1255*53ee8cc1Swenshuai.xi         }
1256*53ee8cc1Swenshuai.xi 
1257*53ee8cc1Swenshuai.xi         // DMA Key from CmdQ
1258*53ee8cc1Swenshuai.xi         if (_uDmaCtrl0.DmaCtrl0.DK == TRUE )
1259*53ee8cc1Swenshuai.xi         {
1260*53ee8cc1Swenshuai.xi             #if 0
1261*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8CipherKey[15]<<24 |_pu8CipherKey[14]<<16 | _pu8CipherKey[13]<<8 | _pu8CipherKey[12]);
1262*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8CipherKey[11]<<24 |_pu8CipherKey[10]<<16 | _pu8CipherKey[ 9]<<8 | _pu8CipherKey[ 8]);
1263*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8CipherKey[ 7]<<24 |_pu8CipherKey[ 6]<<16 | _pu8CipherKey[ 5]<<8 | _pu8CipherKey[ 4]);
1264*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8CipherKey[ 3]<<24 |_pu8CipherKey[ 2]<<16 | _pu8CipherKey[ 1]<<8 | _pu8CipherKey[ 0]);
1265*53ee8cc1Swenshuai.xi             #else
1266*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8CipherKey[ 0]<<24 |_pu8CipherKey[ 1]<<16 | _pu8CipherKey[ 2]<<8 | _pu8CipherKey[ 3]);
1267*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8CipherKey[ 4]<<24 |_pu8CipherKey[ 5]<<16 | _pu8CipherKey[ 6]<<8 | _pu8CipherKey[ 7]);
1268*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8CipherKey[ 8]<<24 |_pu8CipherKey[ 9]<<16 | _pu8CipherKey[10]<<8 | _pu8CipherKey[11]);
1269*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8CipherKey[12]<<24 |_pu8CipherKey[13]<<16 | _pu8CipherKey[14]<<8 | _pu8CipherKey[15]);
1270*53ee8cc1Swenshuai.xi             #endif
1271*53ee8cc1Swenshuai.xi         }
1272*53ee8cc1Swenshuai.xi 
1273*53ee8cc1Swenshuai.xi 		// PID for HW parser
1274*53ee8cc1Swenshuai.xi         if (_uDmaCtrl2.DmaCtrl2.HP == TRUE )
1275*53ee8cc1Swenshuai.xi         {
1276*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8PID0[ 0]<<27 |_pu8PID0[ 1]<<19 | _pu8PID1[ 0]<<14 | _pu8PID1[ 1]<<6);
1277*53ee8cc1Swenshuai.xi 
1278*53ee8cc1Swenshuai.xi         }
1279*53ee8cc1Swenshuai.xi 
1280*53ee8cc1Swenshuai.xi         if (_uDmaCtrl3.DmaCtrl3.DIV2 == TRUE )
1281*53ee8cc1Swenshuai.xi         {
1282*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8IV2[ 0]<<24 |_pu8IV2[ 1]<<16 | _pu8IV2[ 2]<<8 | _pu8IV2[ 3]);
1283*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8IV2[ 4]<<24 |_pu8IV2[ 5]<<16 | _pu8IV2[ 6]<<8 | _pu8IV2[ 7]);
1284*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8IV2[ 8]<<24 |_pu8IV2[ 9]<<16 | _pu8IV2[10]<<8 | _pu8IV2[11]);
1285*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8IV2[12]<<24 |_pu8IV2[13]<<16 | _pu8IV2[14]<<8 | _pu8IV2[15]);
1286*53ee8cc1Swenshuai.xi         }
1287*53ee8cc1Swenshuai.xi 
1288*53ee8cc1Swenshuai.xi         if (_uDmaCtrl3.DmaCtrl3.DK2 == TRUE )
1289*53ee8cc1Swenshuai.xi         {
1290*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8CipherKey2[ 0]<<24 |_pu8CipherKey2[ 1]<<16 | _pu8CipherKey2[ 2]<<8 | _pu8CipherKey2[ 3]);
1291*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8CipherKey2[ 4]<<24 |_pu8CipherKey2[ 5]<<16 | _pu8CipherKey2[ 6]<<8 | _pu8CipherKey2[ 7]);
1292*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8CipherKey2[ 8]<<24 |_pu8CipherKey2[ 9]<<16 | _pu8CipherKey2[10]<<8 | _pu8CipherKey2[11]);
1293*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_pu8CipherKey2[12]<<24 |_pu8CipherKey2[13]<<16 | _pu8CipherKey2[14]<<8 | _pu8CipherKey2[15]);
1294*53ee8cc1Swenshuai.xi         }
1295*53ee8cc1Swenshuai.xi 
1296*53ee8cc1Swenshuai.xi         // [HW] Hardware will check Current spare count != Write back Spare count to start operation.
1297*53ee8cc1Swenshuai.xi         REG32_W(&_AESDMACtrl->SpareCnt, u32SpareCnt) ;
1298*53ee8cc1Swenshuai.xi         return TRUE ;
1299*53ee8cc1Swenshuai.xi 
1300*53ee8cc1Swenshuai.xi     }
1301*53ee8cc1Swenshuai.xi     else
1302*53ee8cc1Swenshuai.xi     {
1303*53ee8cc1Swenshuai.xi         // [HW] Check Current spare count == Write back Spare count to start wait cmd
1304*53ee8cc1Swenshuai.xi         REG32_W(&_AESDMACtrl->SpareCnt, u32SpareCnt) ;
1305*53ee8cc1Swenshuai.xi         if (bWaitCmdQ)
1306*53ee8cc1Swenshuai.xi         {
1307*53ee8cc1Swenshuai.xi             //  Retry until CMDQ avaliable
1308*53ee8cc1Swenshuai.xi             HAL_DEBUG_CIPHER(CIPHER_DBG_WARN, printf("[%s][%d]DMA retry!\n",__func__, __LINE__));
1309*53ee8cc1Swenshuai.xi             goto DMA_RETRY;
1310*53ee8cc1Swenshuai.xi         }
1311*53ee8cc1Swenshuai.xi         else
1312*53ee8cc1Swenshuai.xi         {
1313*53ee8cc1Swenshuai.xi             HAL_DEBUG_CIPHER(CIPHER_DBG_WARN, printf("[%s][%d]DMA Fail!\n",__func__, __LINE__));
1314*53ee8cc1Swenshuai.xi             //  Return Fail, Command abort
1315*53ee8cc1Swenshuai.xi             return FALSE ;
1316*53ee8cc1Swenshuai.xi         }
1317*53ee8cc1Swenshuai.xi     }
1318*53ee8cc1Swenshuai.xi //DMA_FAIL:
1319*53ee8cc1Swenshuai.xi 
1320*53ee8cc1Swenshuai.xi }
1321*53ee8cc1Swenshuai.xi 
HAL_CIPHER_OTPHash_Start(HAL_CIPHER_INTMODE IntMode,MS_BOOL bWaitCmdQ,MS_U16 u16CmdID)1322*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_OTPHash_Start(HAL_CIPHER_INTMODE IntMode, MS_BOOL bWaitCmdQ, MS_U16 u16CmdID)
1323*53ee8cc1Swenshuai.xi {
1324*53ee8cc1Swenshuai.xi     MS_U32 u32SpareCnt = 0 , CmdLen = 0 ;
1325*53ee8cc1Swenshuai.xi 
1326*53ee8cc1Swenshuai.xi     _uDmaCtrl0.DmaCtrl0.OVT = FALSE ;
1327*53ee8cc1Swenshuai.xi 
1328*53ee8cc1Swenshuai.xi     //Set Thread Id
1329*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.TID  = u16CmdID ;
1330*53ee8cc1Swenshuai.xi 
1331*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.IntM = IntMode ;
1332*53ee8cc1Swenshuai.xi 
1333*53ee8cc1Swenshuai.xi     _uDmaCtrl1.DmaCtrl1.NL = CMD_NEW_LINE;
1334*53ee8cc1Swenshuai.xi 
1335*53ee8cc1Swenshuai.xi     CmdLen = _HAL_CIPHER_GetCmdLen(E_CIPHER_TYPE_OTPHASH);
1336*53ee8cc1Swenshuai.xi 
1337*53ee8cc1Swenshuai.xi     _uDmaCtrl0.DmaCtrl0.CL  = CmdLen & CMD_LEN_MASK ;
1338*53ee8cc1Swenshuai.xi     _uDmaCtrl0.DmaCtrl0.CMD = CMD_DMA_ENCRYPT;
1339*53ee8cc1Swenshuai.xi 
1340*53ee8cc1Swenshuai.xi 	_uDmaCtrl2.DmaCtrl2.NS = 0;
1341*53ee8cc1Swenshuai.xi 
1342*53ee8cc1Swenshuai.xi     MS_U32 MIUCrossBar = REG32_R(_u32RegBase + REG_MIU_CROSSBAR);  //MIU CrossBar Bank 0x1613
1343*53ee8cc1Swenshuai.xi     REG32_W(_u32RegBase + REG_MIU_CROSSBAR, MIUCrossBar | 0xf);  //enable MIU crossbar
1344*53ee8cc1Swenshuai.xi 
1345*53ee8cc1Swenshuai.xi DMA_RETRY:
1346*53ee8cc1Swenshuai.xi     // [HW] Hardware will check Current spare count first, and others read spare count will be zero!
1347*53ee8cc1Swenshuai.xi     u32SpareCnt = REG32_R(&_AESDMACtrl->SpareCnt) ;
1348*53ee8cc1Swenshuai.xi 
1349*53ee8cc1Swenshuai.xi     if (u32SpareCnt > CmdLen)
1350*53ee8cc1Swenshuai.xi     {
1351*53ee8cc1Swenshuai.xi         u32SpareCnt -= CmdLen ;
1352*53ee8cc1Swenshuai.xi 
1353*53ee8cc1Swenshuai.xi         WRITE_CMDQ( (_uDmaCtrl0.u32DmaCtrl0)) ;
1354*53ee8cc1Swenshuai.xi         WRITE_CMDQ( (_uDmaCtrl1.u32DmaCtrl1)) ;
1355*53ee8cc1Swenshuai.xi 		WRITE_CMDQ( (_uDmaCtrl2.u32DmaCtrl2)) ;
1356*53ee8cc1Swenshuai.xi         WRITE_CMDQ( (_uDmaCtrl3.u32DmaCtrl3)) ;
1357*53ee8cc1Swenshuai.xi 
1358*53ee8cc1Swenshuai.xi         WRITE_CMDQ((MS_U32)_u32DmaInAddr) ;
1359*53ee8cc1Swenshuai.xi         WRITE_CMDQ(_u32DmaInNum) ;
1360*53ee8cc1Swenshuai.xi         WRITE_CMDQ((MS_U32)_u32DmaOut_StartAddr);
1361*53ee8cc1Swenshuai.xi         WRITE_CMDQ((MS_U32)_u32DmaOut_EndAddr);
1362*53ee8cc1Swenshuai.xi 
1363*53ee8cc1Swenshuai.xi         if(_uDmaCtrl3.DmaCtrl3.AP == TRUE && _uDmaCtrl3.DmaCtrl3.IK == FALSE)
1364*53ee8cc1Swenshuai.xi         {
1365*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_u32OTPHashLengthPadding);
1366*53ee8cc1Swenshuai.xi         }
1367*53ee8cc1Swenshuai.xi 
1368*53ee8cc1Swenshuai.xi         if (_uDmaCtrl1.DmaCtrl1.RR == TRUE )
1369*53ee8cc1Swenshuai.xi         {
1370*53ee8cc1Swenshuai.xi            WRITE_CMDQ((MS_U32)_u32ReportAddr);
1371*53ee8cc1Swenshuai.xi         }
1372*53ee8cc1Swenshuai.xi 
1373*53ee8cc1Swenshuai.xi         // [HW] Hardware will check Current spare count != Write back Spare count to start operation.
1374*53ee8cc1Swenshuai.xi         REG32_W(&_AESDMACtrl->SpareCnt,u32SpareCnt);
1375*53ee8cc1Swenshuai.xi         return TRUE ;
1376*53ee8cc1Swenshuai.xi     }
1377*53ee8cc1Swenshuai.xi     else
1378*53ee8cc1Swenshuai.xi     {
1379*53ee8cc1Swenshuai.xi         // [HW] Check Current spare count == Write back Spare count to start wait cmd
1380*53ee8cc1Swenshuai.xi         REG32_W(&_AESDMACtrl->SpareCnt, u32SpareCnt) ;
1381*53ee8cc1Swenshuai.xi         if (bWaitCmdQ)
1382*53ee8cc1Swenshuai.xi         {
1383*53ee8cc1Swenshuai.xi             //  Retry until CMDQ avaliable
1384*53ee8cc1Swenshuai.xi             HAL_DEBUG_CIPHER(CIPHER_DBG_WARN, printf("[%s][%d]DMA retry!\n",__func__, __LINE__));
1385*53ee8cc1Swenshuai.xi             goto DMA_RETRY;
1386*53ee8cc1Swenshuai.xi         }
1387*53ee8cc1Swenshuai.xi         else
1388*53ee8cc1Swenshuai.xi         {
1389*53ee8cc1Swenshuai.xi             HAL_DEBUG_CIPHER(CIPHER_DBG_WARN, printf("[%s][%d]DMA Fail!\n",__func__, __LINE__));
1390*53ee8cc1Swenshuai.xi             //  Return Fail, Command abort
1391*53ee8cc1Swenshuai.xi             return FALSE ;
1392*53ee8cc1Swenshuai.xi         }
1393*53ee8cc1Swenshuai.xi     }
1394*53ee8cc1Swenshuai.xi 
1395*53ee8cc1Swenshuai.xi }
1396*53ee8cc1Swenshuai.xi 
HAL_CIPHER_DMA_CmdDone(MS_U32 u32CmdID,MS_U32 * u32Ret)1397*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_DMA_CmdDone(MS_U32 u32CmdID, MS_U32 *u32Ret)
1398*53ee8cc1Swenshuai.xi {
1399*53ee8cc1Swenshuai.xi 	MS_U32 u32ExcTmp = 0;
1400*53ee8cc1Swenshuai.xi     MS_U32 u32Rpt   = REG32_R(&_AESDMACtrl->Dma_Reportp[0]) ;
1401*53ee8cc1Swenshuai.xi     MS_U32 u32RptId = u32Rpt & REG_CIPHER_RPT_THREAD_MSK;
1402*53ee8cc1Swenshuai.xi 
1403*53ee8cc1Swenshuai.xi     if(u32RptId == u32CmdID)
1404*53ee8cc1Swenshuai.xi     {
1405*53ee8cc1Swenshuai.xi         u32ExcTmp = (MS_U32) REG32_R(&_AESDMACtrl->Dma_Ctrl[REG_EXCEPT_FLAG]);
1406*53ee8cc1Swenshuai.xi         *u32Ret = u32ExcTmp;
1407*53ee8cc1Swenshuai.xi     }
1408*53ee8cc1Swenshuai.xi     else
1409*53ee8cc1Swenshuai.xi     {
1410*53ee8cc1Swenshuai.xi         HAL_DEBUG_CIPHER(CIPHER_DBG_WARN, printf("[%s][%d]DMA Cmd[%u] Not done!ReportId[%u]\n",
1411*53ee8cc1Swenshuai.xi             __func__, __LINE__, u32CmdID, u32RptId));
1412*53ee8cc1Swenshuai.xi         return FALSE;
1413*53ee8cc1Swenshuai.xi     }
1414*53ee8cc1Swenshuai.xi 
1415*53ee8cc1Swenshuai.xi     return TRUE;
1416*53ee8cc1Swenshuai.xi 
1417*53ee8cc1Swenshuai.xi }
1418*53ee8cc1Swenshuai.xi 
HAL_CIPHER_GetException(MS_U32 * pu32ExcFlag)1419*53ee8cc1Swenshuai.xi void HAL_CIPHER_GetException(MS_U32 *pu32ExcFlag)
1420*53ee8cc1Swenshuai.xi {
1421*53ee8cc1Swenshuai.xi     MS_U32 u32ExcTmp = (MS_U32) REG32_R(&_AESDMACtrl->Dma_Ctrl[REG_EXCEPT_FLAG]);
1422*53ee8cc1Swenshuai.xi     *pu32ExcFlag = u32ExcTmp;
1423*53ee8cc1Swenshuai.xi }
1424*53ee8cc1Swenshuai.xi 
HAL_CIPHER_ReadException(MS_U32 u32ExcTmp)1425*53ee8cc1Swenshuai.xi MS_U32 HAL_CIPHER_ReadException(MS_U32 u32ExcTmp)
1426*53ee8cc1Swenshuai.xi {
1427*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
1428*53ee8cc1Swenshuai.xi     MS_U32 u32ExcOut = 0;
1429*53ee8cc1Swenshuai.xi 
1430*53ee8cc1Swenshuai.xi     for(i = 0;i<CRYPTODMA_DEBUG_SIZE;i++) //check each error flag
1431*53ee8cc1Swenshuai.xi     {
1432*53ee8cc1Swenshuai.xi         if((u32ExcTmp & (1 << i)) >> i)
1433*53ee8cc1Swenshuai.xi         {
1434*53ee8cc1Swenshuai.xi             switch(i)
1435*53ee8cc1Swenshuai.xi             {
1436*53ee8cc1Swenshuai.xi                 case E_CIPHER_NDS_Region_fail:
1437*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_NDS_Region_fail\n", __func__, __LINE__));
1438*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DATA;
1439*53ee8cc1Swenshuai.xi                     break;
1440*53ee8cc1Swenshuai.xi                 case E_CIPHER_NDS_keyoff:
1441*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_NDS_keyoff\n", __func__, __LINE__));
1442*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DMA_KEY;
1443*53ee8cc1Swenshuai.xi                     break;
1444*53ee8cc1Swenshuai.xi                 case E_CIPHER_sha_write_scr:
1445*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_sha_write_scr\n", __func__, __LINE__));
1446*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DATA;
1447*53ee8cc1Swenshuai.xi                     break;
1448*53ee8cc1Swenshuai.xi                 case E_CIPHER_sha_read_scr:
1449*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_sha_read_scr\n", __func__, __LINE__));
1450*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DATA;
1451*53ee8cc1Swenshuai.xi                     break;
1452*53ee8cc1Swenshuai.xi                 case E_CIPHER_sha_error_flag:
1453*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_sha_error_flag\n", __func__, __LINE__));
1454*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DATA;
1455*53ee8cc1Swenshuai.xi                     break;
1456*53ee8cc1Swenshuai.xi                 case E_CIPHER_except_read_scr:
1457*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_except_read_scr\n", __func__, __LINE__));
1458*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DATA;
1459*53ee8cc1Swenshuai.xi                     break;
1460*53ee8cc1Swenshuai.xi                 case E_CIPHER_except_key:
1461*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_except_key\n", __func__, __LINE__));
1462*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DMA_KEY;
1463*53ee8cc1Swenshuai.xi                     break;
1464*53ee8cc1Swenshuai.xi                 case E_CIPHER_except_CAVid:
1465*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_except_CAVid\n", __func__, __LINE__));
1466*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_CAVID;
1467*53ee8cc1Swenshuai.xi                     break;
1468*53ee8cc1Swenshuai.xi                 case E_CIPHER_except_des:
1469*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_except_des\n", __func__, __LINE__));
1470*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_ALGO;
1471*53ee8cc1Swenshuai.xi                     break;
1472*53ee8cc1Swenshuai.xi                 case E_CIPHER_except_NDS:
1473*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_except_NDS\n", __func__, __LINE__));
1474*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_ALGO;
1475*53ee8cc1Swenshuai.xi                     break;
1476*53ee8cc1Swenshuai.xi                 case E_CIPHER_except_chain:
1477*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_except_chain\n", __func__, __LINE__));
1478*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_ALGO;
1479*53ee8cc1Swenshuai.xi                     break;
1480*53ee8cc1Swenshuai.xi                 case E_CIPHER_except_algo:
1481*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_except_algo\n", __func__, __LINE__));
1482*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_ALGO;
1483*53ee8cc1Swenshuai.xi                     break;
1484*53ee8cc1Swenshuai.xi                 case E_CIPHER_except_key_HID:
1485*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_except_key_HID\n", __func__, __LINE__));
1486*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DMA_KEY;
1487*53ee8cc1Swenshuai.xi                     break;
1488*53ee8cc1Swenshuai.xi                 case E_CIPHER_except_key_cbc_mac:
1489*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_except_key_cbc_mac\n", __func__, __LINE__));
1490*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DMA_KEY;
1491*53ee8cc1Swenshuai.xi                     break;
1492*53ee8cc1Swenshuai.xi                 case E_CIPHER_except_file_dqmem:
1493*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_except_file_dqmem\n", __func__, __LINE__));
1494*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DATA;
1495*53ee8cc1Swenshuai.xi                     break;
1496*53ee8cc1Swenshuai.xi                 case E_CIPHER_except_hash_dqmem:
1497*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_except_hash_dqmem\n", __func__, __LINE__));
1498*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DATA;
1499*53ee8cc1Swenshuai.xi                     break;
1500*53ee8cc1Swenshuai.xi 				case E_CIPHER_disable_masterkey0:
1501*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_disable_masterkey0\n", __func__, __LINE__));
1502*53ee8cc1Swenshuai.xi 	                u32ExcOut |= HAL_CIPHER_EXCEPT_HMAC_KEY;
1503*53ee8cc1Swenshuai.xi 					break;
1504*53ee8cc1Swenshuai.xi                 case E_CIPHER_disable_masterkey1:
1505*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_disable_masterkey1\n", __func__, __LINE__));
1506*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_HMAC_KEY;
1507*53ee8cc1Swenshuai.xi 					break;
1508*53ee8cc1Swenshuai.xi                 case E_CIPHER_disable_cck:
1509*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_disable_cck\n", __func__, __LINE__));
1510*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_HMAC_KEY;
1511*53ee8cc1Swenshuai.xi 					break;
1512*53ee8cc1Swenshuai.xi                 case E_CIPHER_disable_reg_key_0:
1513*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_disable_reg_key_0\n", __func__, __LINE__));
1514*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_HMAC_KEY;
1515*53ee8cc1Swenshuai.xi 					break;
1516*53ee8cc1Swenshuai.xi                 case E_CIPHER_disable_reg_key_1:
1517*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_disable_reg_key_1\n", __func__, __LINE__));
1518*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_HMAC_KEY;
1519*53ee8cc1Swenshuai.xi 					break;
1520*53ee8cc1Swenshuai.xi                 case E_CIPHER_disable_reg_key_2:
1521*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_disable_reg_key_2\n", __func__, __LINE__));
1522*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_HMAC_KEY;
1523*53ee8cc1Swenshuai.xi 					break;
1524*53ee8cc1Swenshuai.xi                 case E_CIPHER_disable_reg_key_3:
1525*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_disable_reg_key_3\n", __func__, __LINE__));
1526*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_HMAC_KEY;
1527*53ee8cc1Swenshuai.xi                     break;
1528*53ee8cc1Swenshuai.xi                 case E_CIPHER_dma_forbid_qmem2dram:
1529*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_dma_forbid_qmem2dram\n", __func__, __LINE__));
1530*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DATA;
1531*53ee8cc1Swenshuai.xi                     break;
1532*53ee8cc1Swenshuai.xi                 case E_CIPHER_dma_forbid_cryptodma_keyslot_qmem:
1533*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_dma_forbid_cryptodma_keyslot_qmem\n", __func__, __LINE__));
1534*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DMA_KEY;
1535*53ee8cc1Swenshuai.xi                     break;
1536*53ee8cc1Swenshuai.xi                 case E_CIPHER_sha_forbid_qmem2dram:
1537*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_sha_forbid_qmem2dram\n", __func__, __LINE__));
1538*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DATA;
1539*53ee8cc1Swenshuai.xi                     break;
1540*53ee8cc1Swenshuai.xi                 case E_CIPHER_sha_forbid_cryptodma_keyslot_qmem:
1541*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_sha_forbid_cryptodma_keyslot_qmem\n", __func__, __LINE__));
1542*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DMA_KEY;
1543*53ee8cc1Swenshuai.xi                     break;
1544*53ee8cc1Swenshuai.xi 				case E_CIPHER_tdes_key_error:
1545*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_tdes_key_error\n", __func__, __LINE__));
1546*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DMA_KEY;
1547*53ee8cc1Swenshuai.xi                     break;
1548*53ee8cc1Swenshuai.xi 				case E_CIPHER_write_address_error:
1549*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_write_address_error\n", __func__, __LINE__));
1550*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DATA;
1551*53ee8cc1Swenshuai.xi                     break;
1552*53ee8cc1Swenshuai.xi 				case E_CIPHER_except_str:
1553*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_except_str\n", __func__, __LINE__));
1554*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DMA_KEY;
1555*53ee8cc1Swenshuai.xi                     break;
1556*53ee8cc1Swenshuai.xi 				case E_CIPHER_except_sha_str:
1557*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] E_CIPHER_except_sha_str\n", __func__, __LINE__));
1558*53ee8cc1Swenshuai.xi                     u32ExcOut |= HAL_CIPHER_EXCEPT_DMA_KEY;
1559*53ee8cc1Swenshuai.xi                     break;
1560*53ee8cc1Swenshuai.xi                 default:
1561*53ee8cc1Swenshuai.xi                     HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d] Unknown error \n", __func__, __LINE__));
1562*53ee8cc1Swenshuai.xi                     break;
1563*53ee8cc1Swenshuai.xi 
1564*53ee8cc1Swenshuai.xi             }
1565*53ee8cc1Swenshuai.xi 
1566*53ee8cc1Swenshuai.xi         }
1567*53ee8cc1Swenshuai.xi 
1568*53ee8cc1Swenshuai.xi     }
1569*53ee8cc1Swenshuai.xi 
1570*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_WARN, printf("[%s][%d]Exception out [0x%08x]\n", __func__, __LINE__, (unsigned int)u32ExcOut));
1571*53ee8cc1Swenshuai.xi 
1572*53ee8cc1Swenshuai.xi     return u32ExcOut;
1573*53ee8cc1Swenshuai.xi 
1574*53ee8cc1Swenshuai.xi }
1575*53ee8cc1Swenshuai.xi 
HAL_CIPHER_IntEnable(void)1576*53ee8cc1Swenshuai.xi void HAL_CIPHER_IntEnable(void)
1577*53ee8cc1Swenshuai.xi {
1578*53ee8cc1Swenshuai.xi     MS_U16 u16MaskTmp = REG16_R(_u32RegBase + REG_HST0_FIQ_MASK_63_48);
1579*53ee8cc1Swenshuai.xi     u16MaskTmp &= REG_HTS0_FIQ_MASK_CRYPTODMA;  //FIQ 56 in reg_hst0_fiq_mask_63_48_
1580*53ee8cc1Swenshuai.xi     REG16_W(_u32RegBase + REG_HST0_FIQ_MASK_63_48, u16MaskTmp);
1581*53ee8cc1Swenshuai.xi }
1582*53ee8cc1Swenshuai.xi 
HAL_CIPHER_IntClear(void)1583*53ee8cc1Swenshuai.xi void HAL_CIPHER_IntClear(void)
1584*53ee8cc1Swenshuai.xi {
1585*53ee8cc1Swenshuai.xi     REG16_W(_u32RegBase + REG_HST0_FIQ_STATUS_63_48, REG_HTS0_FIQ_CRYPTODMA); //set 1 to clear interrupt
1586*53ee8cc1Swenshuai.xi }
1587*53ee8cc1Swenshuai.xi 
1588*53ee8cc1Swenshuai.xi //======================================================================
1589*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_GetRpt(MS_U32 * HashRpt,MS_U32 u32Size)1590*53ee8cc1Swenshuai.xi void HAL_CIPHER_Hash_GetRpt(MS_U32 *HashRpt, MS_U32 u32Size)
1591*53ee8cc1Swenshuai.xi {
1592*53ee8cc1Swenshuai.xi     MS_U32 i , tmp;
1593*53ee8cc1Swenshuai.xi 
1594*53ee8cc1Swenshuai.xi     if (u32Size < HASH_RPT_REG_SIZE )
1595*53ee8cc1Swenshuai.xi     {
1596*53ee8cc1Swenshuai.xi         tmp = u32Size ;
1597*53ee8cc1Swenshuai.xi     }
1598*53ee8cc1Swenshuai.xi     else
1599*53ee8cc1Swenshuai.xi     {
1600*53ee8cc1Swenshuai.xi         tmp = HASH_RPT_REG_SIZE ;
1601*53ee8cc1Swenshuai.xi     }
1602*53ee8cc1Swenshuai.xi 
1603*53ee8cc1Swenshuai.xi     for (i = 0 ; i < tmp ; i++)
1604*53ee8cc1Swenshuai.xi     {
1605*53ee8cc1Swenshuai.xi         HashRpt[i] = REG32_R(&_AESDMACtrl->Hash_Reportp[i]);
1606*53ee8cc1Swenshuai.xi     }
1607*53ee8cc1Swenshuai.xi }
1608*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_Set_Config(CIPHER_HASH_ALGO algo,MS_BOOL bAutoPad,MS_BOOL bInv16)1609*53ee8cc1Swenshuai.xi void HAL_CIPHER_Hash_Set_Config(CIPHER_HASH_ALGO algo , MS_BOOL bAutoPad , MS_BOOL bInv16)
1610*53ee8cc1Swenshuai.xi {
1611*53ee8cc1Swenshuai.xi     HAL_CIPHER_HASHMODE hash_mode = E_HASH_SHA1;
1612*53ee8cc1Swenshuai.xi     hash_mode = _HAL_CIPHER_TransHASHAlgo(algo);
1613*53ee8cc1Swenshuai.xi 
1614*53ee8cc1Swenshuai.xi     _uHashCtrl0.HashCtrl0.HashSel = hash_mode ;
1615*53ee8cc1Swenshuai.xi     _uHashCtrl0.HashCtrl0.AutoPad = bAutoPad ;
1616*53ee8cc1Swenshuai.xi     _uHashCtrl0.HashCtrl0.Inv16 = bInv16; //Inverse the byte order per 16 bytes
1617*53ee8cc1Swenshuai.xi 
1618*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set HASH Mode[%d], AutoPad[%d], Inverse16[%d]!\n",
1619*53ee8cc1Swenshuai.xi         __func__, __LINE__, hash_mode, bAutoPad, bInv16));
1620*53ee8cc1Swenshuai.xi }
1621*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_Set_ReportMode(MS_BOOL RptInDram,MS_U32 u32DramAddr)1622*53ee8cc1Swenshuai.xi void HAL_CIPHER_Hash_Set_ReportMode(MS_BOOL RptInDram, MS_U32 u32DramAddr)
1623*53ee8cc1Swenshuai.xi {
1624*53ee8cc1Swenshuai.xi     if (RptInDram)
1625*53ee8cc1Swenshuai.xi     {
1626*53ee8cc1Swenshuai.xi         _u32ReportAddr = u32DramAddr;
1627*53ee8cc1Swenshuai.xi 
1628*53ee8cc1Swenshuai.xi     }
1629*53ee8cc1Swenshuai.xi     else
1630*53ee8cc1Swenshuai.xi     {
1631*53ee8cc1Swenshuai.xi         _u32ReportAddr = 0;
1632*53ee8cc1Swenshuai.xi     }
1633*53ee8cc1Swenshuai.xi 
1634*53ee8cc1Swenshuai.xi     _uHashCtrl2.HashCtrl2.RR = RptInDram ;
1635*53ee8cc1Swenshuai.xi 
1636*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set report mode[%d], report address[0x%08x]\n",
1637*53ee8cc1Swenshuai.xi         __func__, __LINE__, RptInDram, (unsigned int)_u32ReportAddr));
1638*53ee8cc1Swenshuai.xi }
1639*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_SetHMACKey(DRV_CIPHER_HMAC_KEY stHMACKey,CIPHER_HMAC_KPAD eKpad,MS_BOOL bClear)1640*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_Hash_SetHMACKey(DRV_CIPHER_HMAC_KEY stHMACKey, CIPHER_HMAC_KPAD eKpad, MS_BOOL bClear)
1641*53ee8cc1Swenshuai.xi {
1642*53ee8cc1Swenshuai.xi 	MS_BOOL bHMAC = TRUE;
1643*53ee8cc1Swenshuai.xi     MS_U32 u32HMACKeySel = 0;
1644*53ee8cc1Swenshuai.xi     MS_U32 u32Kpad = CMD_HASH_IKP;
1645*53ee8cc1Swenshuai.xi     HAL_CIPHER_KEYSRC KeySrc;
1646*53ee8cc1Swenshuai.xi 
1647*53ee8cc1Swenshuai.xi 	 //Check Key Source, Index
1648*53ee8cc1Swenshuai.xi     if(((E_CIPHER_KSRC_KL == stHMACKey.eKeySrc) && (stHMACKey.u8KeyIdx > HAL_CRYPTODMA_DMA_KEY_SLOT-1)) ||
1649*53ee8cc1Swenshuai.xi        ((E_CIPHER_KSRC_OTP == stHMACKey.eKeySrc) && (stHMACKey.u8KeyIdx > HAL_CRYPTODMA_OTP_SCK_NUM-1)))
1650*53ee8cc1Swenshuai.xi     {
1651*53ee8cc1Swenshuai.xi        HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d]Invalid KeySrc[%d], Index[%d]\n",
1652*53ee8cc1Swenshuai.xi            __func__, __LINE__, stHMACKey.eKeySrc, stHMACKey.u8KeyIdx));
1653*53ee8cc1Swenshuai.xi        return FALSE;
1654*53ee8cc1Swenshuai.xi     }
1655*53ee8cc1Swenshuai.xi 
1656*53ee8cc1Swenshuai.xi     //DRV to HAL Type transfer
1657*53ee8cc1Swenshuai.xi     KeySrc = _HAL_CIPHER_TransKey(stHMACKey.eKeySrc, stHMACKey.u8KeyIdx);
1658*53ee8cc1Swenshuai.xi 
1659*53ee8cc1Swenshuai.xi     switch(KeySrc)
1660*53ee8cc1Swenshuai.xi     {
1661*53ee8cc1Swenshuai.xi         case E_DMA_KSEL_REGKEY:
1662*53ee8cc1Swenshuai.xi             u32HMACKeySel = CMD_HMAC_KSEL_HK;
1663*53ee8cc1Swenshuai.xi             break;
1664*53ee8cc1Swenshuai.xi         case E_DMA_KSEL_STRN:
1665*53ee8cc1Swenshuai.xi             u32HMACKeySel = CMD_HMAC_KSEL_STRN;
1666*53ee8cc1Swenshuai.xi             break;
1667*53ee8cc1Swenshuai.xi         case E_DMA_KSEL_MK0:
1668*53ee8cc1Swenshuai.xi             u32HMACKeySel = CMD_HMAC_KSEL_MK0;
1669*53ee8cc1Swenshuai.xi             break;
1670*53ee8cc1Swenshuai.xi         case E_DMA_KSEL_MK1:
1671*53ee8cc1Swenshuai.xi             u32HMACKeySel = CMD_HMAC_KSEL_MK1;
1672*53ee8cc1Swenshuai.xi             break;
1673*53ee8cc1Swenshuai.xi         case E_DMA_KSEL_CCCK:
1674*53ee8cc1Swenshuai.xi             u32HMACKeySel = CMD_HMAC_KSEL_CCCK;
1675*53ee8cc1Swenshuai.xi             break;
1676*53ee8cc1Swenshuai.xi         case E_DMA_KSEL_SK0:
1677*53ee8cc1Swenshuai.xi             u32HMACKeySel = CMD_HMAC_KSEL_SK0;
1678*53ee8cc1Swenshuai.xi             break;
1679*53ee8cc1Swenshuai.xi         case E_DMA_KSEL_SK1:
1680*53ee8cc1Swenshuai.xi             u32HMACKeySel = CMD_HMAC_KSEL_SK1;
1681*53ee8cc1Swenshuai.xi             break;
1682*53ee8cc1Swenshuai.xi         case E_DMA_KSEL_SK2:
1683*53ee8cc1Swenshuai.xi             u32HMACKeySel = CMD_HMAC_KSEL_SK2;
1684*53ee8cc1Swenshuai.xi             break;
1685*53ee8cc1Swenshuai.xi         case E_DMA_KSEL_SK3:
1686*53ee8cc1Swenshuai.xi             u32HMACKeySel = CMD_HMAC_KSEL_SK3;
1687*53ee8cc1Swenshuai.xi             break;
1688*53ee8cc1Swenshuai.xi         default:
1689*53ee8cc1Swenshuai.xi             u32HMACKeySel = 0;
1690*53ee8cc1Swenshuai.xi             break;
1691*53ee8cc1Swenshuai.xi     }
1692*53ee8cc1Swenshuai.xi 
1693*53ee8cc1Swenshuai.xi     if(eKpad == E_CIPHER_HMAC_OKPAD)
1694*53ee8cc1Swenshuai.xi     {
1695*53ee8cc1Swenshuai.xi         u32Kpad = CMD_HASH_OKP;
1696*53ee8cc1Swenshuai.xi     }
1697*53ee8cc1Swenshuai.xi 
1698*53ee8cc1Swenshuai.xi     if(bClear)
1699*53ee8cc1Swenshuai.xi     {
1700*53ee8cc1Swenshuai.xi         u32HMACKeySel += (MS_U32)CMD_HMAC_KSEL_CLR_SK;
1701*53ee8cc1Swenshuai.xi     }
1702*53ee8cc1Swenshuai.xi 
1703*53ee8cc1Swenshuai.xi     if(KeySrc == E_DMA_KSEL_REGKEY)
1704*53ee8cc1Swenshuai.xi     {
1705*53ee8cc1Swenshuai.xi 		//command mode
1706*53ee8cc1Swenshuai.xi         if (0 != stHMACKey.pu8KeyData)
1707*53ee8cc1Swenshuai.xi         {
1708*53ee8cc1Swenshuai.xi             memset(_pu8HashHMACHostKey, 0x0 , HAL_CRYPTODMA_KEYLEN_MAX );
1709*53ee8cc1Swenshuai.xi             memcpy(_pu8HashHMACHostKey, (MS_U8 *)stHMACKey.pu8KeyData , stHMACKey.u8KeyLen);
1710*53ee8cc1Swenshuai.xi             _uHashCtrl0.HashCtrl0.DK = CMD_HMAC_KSEL_DIR_HK;
1711*53ee8cc1Swenshuai.xi         }
1712*53ee8cc1Swenshuai.xi         else
1713*53ee8cc1Swenshuai.xi         {
1714*53ee8cc1Swenshuai.xi             memset(_pu8HashHMACHostKey, 0x0 , HAL_CRYPTODMA_KEYLEN_MAX );
1715*53ee8cc1Swenshuai.xi             bHMAC = FALSE;
1716*53ee8cc1Swenshuai.xi         }
1717*53ee8cc1Swenshuai.xi     }
1718*53ee8cc1Swenshuai.xi 
1719*53ee8cc1Swenshuai.xi     _uHashCtrl0.HashCtrl0.HMAC = bHMAC;
1720*53ee8cc1Swenshuai.xi     _uHashCtrl0.HashCtrl0.KPAD = u32Kpad;
1721*53ee8cc1Swenshuai.xi     _uHashCtrl0.HashCtrl0.HMAC_KeySel = u32HMACKeySel;
1722*53ee8cc1Swenshuai.xi 
1723*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set HMAC[%d], HMAC KPAD[%u] HMAC KeySel[%u]!\n",
1724*53ee8cc1Swenshuai.xi         __func__, __LINE__, bHMAC, u32Kpad, u32HMACKeySel));
1725*53ee8cc1Swenshuai.xi 
1726*53ee8cc1Swenshuai.xi 	return TRUE;
1727*53ee8cc1Swenshuai.xi }
1728*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_Set_CaVid(MS_U32 u32CAVid)1729*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_Hash_Set_CaVid(MS_U32 u32CAVid)
1730*53ee8cc1Swenshuai.xi {
1731*53ee8cc1Swenshuai.xi     MS_U32 u32Tmp = u32CAVid;
1732*53ee8cc1Swenshuai.xi 
1733*53ee8cc1Swenshuai.xi     if(u32Tmp > HAL_CRYPTODMA_CAVID_MAX)
1734*53ee8cc1Swenshuai.xi     {
1735*53ee8cc1Swenshuai.xi         return FALSE;
1736*53ee8cc1Swenshuai.xi     }
1737*53ee8cc1Swenshuai.xi 
1738*53ee8cc1Swenshuai.xi     if(u32Tmp == 0)
1739*53ee8cc1Swenshuai.xi     {
1740*53ee8cc1Swenshuai.xi         u32Tmp = _CIPHER_CAVid ;
1741*53ee8cc1Swenshuai.xi     }
1742*53ee8cc1Swenshuai.xi     else
1743*53ee8cc1Swenshuai.xi     {
1744*53ee8cc1Swenshuai.xi         u32Tmp = u32CAVid;
1745*53ee8cc1Swenshuai.xi     }
1746*53ee8cc1Swenshuai.xi 
1747*53ee8cc1Swenshuai.xi     _uHashCtrl1.HashCtrl1.CaVid = u32Tmp;
1748*53ee8cc1Swenshuai.xi 
1749*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set CAVid [0x%x]\n",
1750*53ee8cc1Swenshuai.xi         __func__, __LINE__, (unsigned int)u32Tmp));
1751*53ee8cc1Swenshuai.xi 
1752*53ee8cc1Swenshuai.xi     return TRUE;
1753*53ee8cc1Swenshuai.xi }
1754*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_Set_IV(MS_U8 * pu8IV,MS_U32 u32IVSize,MS_U32 u32IVSel)1755*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_Hash_Set_IV(MS_U8* pu8IV, MS_U32 u32IVSize ,MS_U32 u32IVSel)
1756*53ee8cc1Swenshuai.xi {
1757*53ee8cc1Swenshuai.xi     // 256 bits for sha256 , 160 bits for sha1
1758*53ee8cc1Swenshuai.xi     _uHashCtrl0.HashCtrl0.InitHashSel = u32IVSel ;
1759*53ee8cc1Swenshuai.xi 
1760*53ee8cc1Swenshuai.xi 	HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set HASH IVSel [%u]\n",
1761*53ee8cc1Swenshuai.xi         __func__, __LINE__, u32IVSel));
1762*53ee8cc1Swenshuai.xi 
1763*53ee8cc1Swenshuai.xi     if(u32IVSel == CMD_HASH_IV_CMD)
1764*53ee8cc1Swenshuai.xi     {
1765*53ee8cc1Swenshuai.xi         if((pu8IV != NULL) && (u32IVSize > 0))
1766*53ee8cc1Swenshuai.xi         {
1767*53ee8cc1Swenshuai.xi             memset(_pu8HashIV, 0x0, HASH_CMD_IV_SIZE);
1768*53ee8cc1Swenshuai.xi             memcpy(_pu8HashIV, (MS_U8 *)pu8IV , u32IVSize);
1769*53ee8cc1Swenshuai.xi 
1770*53ee8cc1Swenshuai.xi             return TRUE;
1771*53ee8cc1Swenshuai.xi         }
1772*53ee8cc1Swenshuai.xi         else
1773*53ee8cc1Swenshuai.xi         {
1774*53ee8cc1Swenshuai.xi             return FALSE;
1775*53ee8cc1Swenshuai.xi         }
1776*53ee8cc1Swenshuai.xi     }
1777*53ee8cc1Swenshuai.xi 
1778*53ee8cc1Swenshuai.xi     return TRUE;
1779*53ee8cc1Swenshuai.xi }
1780*53ee8cc1Swenshuai.xi 
1781*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_Set_InitWordCnt(HAL_CIPHER_IWCTYPE eIWCType,MS_U32 u32StartBytes)1782*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_Hash_Set_InitWordCnt(HAL_CIPHER_IWCTYPE eIWCType, MS_U32 u32StartBytes)
1783*53ee8cc1Swenshuai.xi {
1784*53ee8cc1Swenshuai.xi 	MS_U32 u32IWCType = 0;
1785*53ee8cc1Swenshuai.xi     MS_U32 u32IWC = 0;
1786*53ee8cc1Swenshuai.xi     MS_U32 Rpt[2] = {0};
1787*53ee8cc1Swenshuai.xi 
1788*53ee8cc1Swenshuai.xi     if(eIWCType == E_CIPHER_HASH_IWC_PRV) //Init Word Count from report
1789*53ee8cc1Swenshuai.xi     {
1790*53ee8cc1Swenshuai.xi         u32IWCType = CMD_HASH_IWC_RPT;
1791*53ee8cc1Swenshuai.xi         HAL_CIPHER_Hash_GetRpt(Rpt, 2); //For debug
1792*53ee8cc1Swenshuai.xi         HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set IWC from report is [%u]\n",
1793*53ee8cc1Swenshuai.xi         __func__, __LINE__, Rpt[1]>>2));
1794*53ee8cc1Swenshuai.xi 	}
1795*53ee8cc1Swenshuai.xi     else
1796*53ee8cc1Swenshuai.xi     {
1797*53ee8cc1Swenshuai.xi         u32IWCType = CMD_HASH_IWC_CMDQ;
1798*53ee8cc1Swenshuai.xi         if((u32StartBytes % HASH_MANUAL_BLOCK_SIZE) != 0)
1799*53ee8cc1Swenshuai.xi         {
1800*53ee8cc1Swenshuai.xi             HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d]Error:Init word count is 64 bytes alignment!\n",
1801*53ee8cc1Swenshuai.xi                 __func__, __LINE__));
1802*53ee8cc1Swenshuai.xi             return FALSE;
1803*53ee8cc1Swenshuai.xi         }
1804*53ee8cc1Swenshuai.xi 
1805*53ee8cc1Swenshuai.xi         if(u32StartBytes != 0)
1806*53ee8cc1Swenshuai.xi         {
1807*53ee8cc1Swenshuai.xi             u32IWC = u32StartBytes/4; //Init Word Count
1808*53ee8cc1Swenshuai.xi         }
1809*53ee8cc1Swenshuai.xi         else
1810*53ee8cc1Swenshuai.xi         {
1811*53ee8cc1Swenshuai.xi             u32IWC = 0;
1812*53ee8cc1Swenshuai.xi         }
1813*53ee8cc1Swenshuai.xi     }
1814*53ee8cc1Swenshuai.xi 
1815*53ee8cc1Swenshuai.xi     _u32InitWordCnt = u32IWC;
1816*53ee8cc1Swenshuai.xi     _uHashCtrl0.HashCtrl0.IWC_Sel = u32IWCType;
1817*53ee8cc1Swenshuai.xi 
1818*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set IWC type[%u], IWC[%u]\n",
1819*53ee8cc1Swenshuai.xi         __func__, __LINE__, u32IWCType, _u32InitWordCnt));
1820*53ee8cc1Swenshuai.xi 
1821*53ee8cc1Swenshuai.xi     return TRUE;
1822*53ee8cc1Swenshuai.xi }
1823*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_Set_MsgSrcFrom(CIPHER_MEM_TYPE eMemType,MS_U32 * u32HashSrc)1824*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_Hash_Set_MsgSrcFrom(CIPHER_MEM_TYPE eMemType, MS_U32 *u32HashSrc)
1825*53ee8cc1Swenshuai.xi {
1826*53ee8cc1Swenshuai.xi     MS_U32 u32SrcTmp = 0;
1827*53ee8cc1Swenshuai.xi     switch(eMemType)
1828*53ee8cc1Swenshuai.xi     {
1829*53ee8cc1Swenshuai.xi     	case E_CIPHER_DRAM:
1830*53ee8cc1Swenshuai.xi     		u32SrcTmp = CMD_HASH_SRC_DRAM;
1831*53ee8cc1Swenshuai.xi             _u32HashSrcAddr = 0;
1832*53ee8cc1Swenshuai.xi     		break;
1833*53ee8cc1Swenshuai.xi         case E_CIPHER_DQMEM:
1834*53ee8cc1Swenshuai.xi             u32SrcTmp = CMD_HASH_SRC_R2;
1835*53ee8cc1Swenshuai.xi             _u32HashSrcAddr = HAL_CIPHER_BASE_DQMEM;
1836*53ee8cc1Swenshuai.xi             break;
1837*53ee8cc1Swenshuai.xi         case E_CIPHER_IQMEM:
1838*53ee8cc1Swenshuai.xi             u32SrcTmp = CMD_HASH_SRC_R2;
1839*53ee8cc1Swenshuai.xi             _u32HashSrcAddr = HAL_CIPHER_BASE_IQMEM;
1840*53ee8cc1Swenshuai.xi             break;
1841*53ee8cc1Swenshuai.xi         case E_CIPHER_DIRECT:
1842*53ee8cc1Swenshuai.xi             u32SrcTmp = CMD_HASH_SRC_REG;
1843*53ee8cc1Swenshuai.xi             _u32HashSrcAddr = 0;
1844*53ee8cc1Swenshuai.xi             break;
1845*53ee8cc1Swenshuai.xi         default:
1846*53ee8cc1Swenshuai.xi             u32SrcTmp = CMD_HASH_SRC_DRAM;
1847*53ee8cc1Swenshuai.xi             _u32HashSrcAddr = 0;
1848*53ee8cc1Swenshuai.xi             break;
1849*53ee8cc1Swenshuai.xi     }
1850*53ee8cc1Swenshuai.xi 
1851*53ee8cc1Swenshuai.xi     *u32HashSrc = u32SrcTmp;
1852*53ee8cc1Swenshuai.xi 
1853*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set HASH source from [%u]\n",
1854*53ee8cc1Swenshuai.xi         __func__, __LINE__, u32SrcTmp));
1855*53ee8cc1Swenshuai.xi 
1856*53ee8cc1Swenshuai.xi 	return TRUE;
1857*53ee8cc1Swenshuai.xi }
1858*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_Set_OutputDstTo(CIPHER_MEM_TYPE eMemType,MS_U32 * u32HashDst)1859*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_Hash_Set_OutputDstTo(CIPHER_MEM_TYPE eMemType, MS_U32 *u32HashDst)
1860*53ee8cc1Swenshuai.xi {
1861*53ee8cc1Swenshuai.xi     MS_U32 u32DstTmp = 0;
1862*53ee8cc1Swenshuai.xi     switch(eMemType)
1863*53ee8cc1Swenshuai.xi     {
1864*53ee8cc1Swenshuai.xi         case E_CIPHER_DRAM:
1865*53ee8cc1Swenshuai.xi     		u32DstTmp = CMD_HASH_OUTPUT_DRAM;
1866*53ee8cc1Swenshuai.xi             _u32HashDestAddr = 0;
1867*53ee8cc1Swenshuai.xi     		break;
1868*53ee8cc1Swenshuai.xi         case E_CIPHER_DQMEM:
1869*53ee8cc1Swenshuai.xi             u32DstTmp = CMD_HASH_OUTPUT_R2;
1870*53ee8cc1Swenshuai.xi             _u32HashDestAddr = HAL_CIPHER_BASE_DQMEM;
1871*53ee8cc1Swenshuai.xi             break;
1872*53ee8cc1Swenshuai.xi         case E_CIPHER_IQMEM:
1873*53ee8cc1Swenshuai.xi             u32DstTmp = CMD_HASH_OUTPUT_R2;
1874*53ee8cc1Swenshuai.xi             _u32HashDestAddr = HAL_CIPHER_BASE_IQMEM;
1875*53ee8cc1Swenshuai.xi             break;
1876*53ee8cc1Swenshuai.xi         case E_CIPHER_DIRECT:
1877*53ee8cc1Swenshuai.xi             u32DstTmp = CMD_HASH_OUTPUT_RPT;
1878*53ee8cc1Swenshuai.xi             _u32HashDestAddr = 0;
1879*53ee8cc1Swenshuai.xi             break;
1880*53ee8cc1Swenshuai.xi         default:
1881*53ee8cc1Swenshuai.xi             u32DstTmp = CMD_HASH_OUTPUT_RPT;
1882*53ee8cc1Swenshuai.xi             _u32HashDestAddr = 0;
1883*53ee8cc1Swenshuai.xi             break;
1884*53ee8cc1Swenshuai.xi     }
1885*53ee8cc1Swenshuai.xi 
1886*53ee8cc1Swenshuai.xi     *u32HashDst = u32DstTmp;
1887*53ee8cc1Swenshuai.xi     _uHashCtrl0.HashCtrl0.Dest = u32DstTmp;
1888*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set HASH destination[%u]\n",
1889*53ee8cc1Swenshuai.xi         __func__, __LINE__, u32DstTmp));
1890*53ee8cc1Swenshuai.xi 
1891*53ee8cc1Swenshuai.xi 	return TRUE;
1892*53ee8cc1Swenshuai.xi }
1893*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_Set_OuputAddr(MS_PHY u32OutputPAddr,MS_U32 u32DstSel)1894*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_Hash_Set_OuputAddr(MS_PHY u32OutputPAddr, MS_U32 u32DstSel)
1895*53ee8cc1Swenshuai.xi {
1896*53ee8cc1Swenshuai.xi     if ((CMD_HASH_OUTPUT_DRAM == u32DstSel) || (CMD_HASH_OUTPUT_R2 == u32DstSel))
1897*53ee8cc1Swenshuai.xi     {
1898*53ee8cc1Swenshuai.xi         if (0 != u32OutputPAddr)
1899*53ee8cc1Swenshuai.xi         {
1900*53ee8cc1Swenshuai.xi             _u32HashDestAddr += u32OutputPAddr;
1901*53ee8cc1Swenshuai.xi         }
1902*53ee8cc1Swenshuai.xi         else
1903*53ee8cc1Swenshuai.xi         {
1904*53ee8cc1Swenshuai.xi             HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d]Error:Hash output address is NULL\n",__func__, __LINE__));
1905*53ee8cc1Swenshuai.xi             return FALSE;
1906*53ee8cc1Swenshuai.xi         }
1907*53ee8cc1Swenshuai.xi     }
1908*53ee8cc1Swenshuai.xi     return TRUE;
1909*53ee8cc1Swenshuai.xi }
1910*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_SetMsgLength(MS_U32 u32Size)1911*53ee8cc1Swenshuai.xi void HAL_CIPHER_Hash_SetMsgLength( MS_U32 u32Size )
1912*53ee8cc1Swenshuai.xi {
1913*53ee8cc1Swenshuai.xi 	_u32HashMsgLen = u32Size;
1914*53ee8cc1Swenshuai.xi 
1915*53ee8cc1Swenshuai.xi 	HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set HASH message length[%u]\n",
1916*53ee8cc1Swenshuai.xi         __func__, __LINE__, u32Size));
1917*53ee8cc1Swenshuai.xi 
1918*53ee8cc1Swenshuai.xi 	return ;
1919*53ee8cc1Swenshuai.xi }
1920*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_SetHOS(MS_BOOL bHos)1921*53ee8cc1Swenshuai.xi void HAL_CIPHER_Hash_SetHOS(MS_BOOL bHos)
1922*53ee8cc1Swenshuai.xi {
1923*53ee8cc1Swenshuai.xi 	_uHashCtrl0.HashCtrl0.HOS = bHos;
1924*53ee8cc1Swenshuai.xi 
1925*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set HOS[%d]\n",
1926*53ee8cc1Swenshuai.xi         __func__, __LINE__, bHos));
1927*53ee8cc1Swenshuai.xi 
1928*53ee8cc1Swenshuai.xi 	return ;
1929*53ee8cc1Swenshuai.xi }
1930*53ee8cc1Swenshuai.xi 
1931*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_SetMsg(MS_PHY u32MsgPAddr,MS_U32 u32Size,MS_U32 u32SrcSel)1932*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_Hash_SetMsg(MS_PHY u32MsgPAddr, MS_U32 u32Size ,MS_U32 u32SrcSel )
1933*53ee8cc1Swenshuai.xi {
1934*53ee8cc1Swenshuai.xi     _uHashCtrl0.HashCtrl0.Src = u32SrcSel;
1935*53ee8cc1Swenshuai.xi     _u32HashMsgLen = u32Size;
1936*53ee8cc1Swenshuai.xi 
1937*53ee8cc1Swenshuai.xi     if ((CMD_HASH_SRC_DRAM == u32SrcSel) || (CMD_HASH_SRC_R2 == u32SrcSel))
1938*53ee8cc1Swenshuai.xi     {
1939*53ee8cc1Swenshuai.xi         if (0 != u32MsgPAddr)
1940*53ee8cc1Swenshuai.xi         {
1941*53ee8cc1Swenshuai.xi             _u32HashSrcAddr += u32MsgPAddr;
1942*53ee8cc1Swenshuai.xi         }
1943*53ee8cc1Swenshuai.xi         else
1944*53ee8cc1Swenshuai.xi         {
1945*53ee8cc1Swenshuai.xi             return FALSE;
1946*53ee8cc1Swenshuai.xi         }
1947*53ee8cc1Swenshuai.xi     }
1948*53ee8cc1Swenshuai.xi     else if (CMD_HASH_SRC_REG == u32SrcSel)
1949*53ee8cc1Swenshuai.xi     {
1950*53ee8cc1Swenshuai.xi         if((u32MsgPAddr == 0) || (u32Size > HASH_CMD_MSG_SIZE))
1951*53ee8cc1Swenshuai.xi         {
1952*53ee8cc1Swenshuai.xi             HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d]Error:Set HASH direct message size[%u] over 64 bytes\n",
1953*53ee8cc1Swenshuai.xi                 __func__, __LINE__, u32Size));
1954*53ee8cc1Swenshuai.xi             return FALSE;
1955*53ee8cc1Swenshuai.xi         }
1956*53ee8cc1Swenshuai.xi         _u32HashSrcAddr = 0;
1957*53ee8cc1Swenshuai.xi         memset(_pu8HashMsg , 0x0 , HASH_CMD_MSG_SIZE);
1958*53ee8cc1Swenshuai.xi         memcpy(_pu8HashMsg , (MS_U8 *)(MsOS_PA2KSEG1(u32MsgPAddr)) , u32Size);
1959*53ee8cc1Swenshuai.xi     }
1960*53ee8cc1Swenshuai.xi 
1961*53ee8cc1Swenshuai.xi 	HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set HASH message source[%u], size[%u]\n",
1962*53ee8cc1Swenshuai.xi         __func__, __LINE__, u32SrcSel, _u32HashMsgLen));
1963*53ee8cc1Swenshuai.xi 
1964*53ee8cc1Swenshuai.xi     return TRUE;
1965*53ee8cc1Swenshuai.xi 
1966*53ee8cc1Swenshuai.xi }
1967*53ee8cc1Swenshuai.xi 
1968*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_Start(HAL_CIPHER_INTMODE IntMode,MS_BOOL bWaitCmdQ,MS_BOOL bRst,MS_U16 u16CmdID)1969*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_Hash_Start(HAL_CIPHER_INTMODE IntMode , MS_BOOL bWaitCmdQ , MS_BOOL bRst, MS_U16 u16CmdID)
1970*53ee8cc1Swenshuai.xi {
1971*53ee8cc1Swenshuai.xi         MS_U32 u32SpareCnt = 0 , CmdLen = 0 , i = 0 ;
1972*53ee8cc1Swenshuai.xi         MS_U32 u32Tmp;
1973*53ee8cc1Swenshuai.xi 
1974*53ee8cc1Swenshuai.xi         _uHashCtrl1.HashCtrl1.TID = u16CmdID;
1975*53ee8cc1Swenshuai.xi 		_uHashCtrl0.HashCtrl0.CMD =  CMD_HASH_START_RR ;
1976*53ee8cc1Swenshuai.xi 
1977*53ee8cc1Swenshuai.xi         _uHashCtrl0.HashCtrl0.OVT = FALSE ;
1978*53ee8cc1Swenshuai.xi         _uHashCtrl0.HashCtrl0.IntM = IntMode ;
1979*53ee8cc1Swenshuai.xi 
1980*53ee8cc1Swenshuai.xi         CmdLen = _HAL_CIPHER_GetCmdLen(E_CIPHER_TYPE_SHA);
1981*53ee8cc1Swenshuai.xi 
1982*53ee8cc1Swenshuai.xi         _uHashCtrl0.HashCtrl0.CL  = CmdLen & CMD_LEN_MASK ;
1983*53ee8cc1Swenshuai.xi 
1984*53ee8cc1Swenshuai.xi 		_uHashCtrl1.HashCtrl1.NS =  0;
1985*53ee8cc1Swenshuai.xi 
1986*53ee8cc1Swenshuai.xi         MS_U32 MIUCrossBar = REG32_R(_u32RegBase + REG_MIU_CROSSBAR);  //MIU CrossBar Bank 0x1613
1987*53ee8cc1Swenshuai.xi         REG32_W(_u32RegBase + REG_MIU_CROSSBAR, MIUCrossBar | 0xf);  //enable MIU crossbar
1988*53ee8cc1Swenshuai.xi 
1989*53ee8cc1Swenshuai.xi 
1990*53ee8cc1Swenshuai.xi SHA_RETRY:
1991*53ee8cc1Swenshuai.xi         u32SpareCnt = REG32_R(&_AESDMACtrl->SpareCnt) ;
1992*53ee8cc1Swenshuai.xi 
1993*53ee8cc1Swenshuai.xi         if (u32SpareCnt > CmdLen)
1994*53ee8cc1Swenshuai.xi         {
1995*53ee8cc1Swenshuai.xi             u32SpareCnt -= CmdLen ;
1996*53ee8cc1Swenshuai.xi 
1997*53ee8cc1Swenshuai.xi             WRITE_CMDQ( (_uHashCtrl0.u32HashCtrl0)) ;
1998*53ee8cc1Swenshuai.xi 
1999*53ee8cc1Swenshuai.xi             WRITE_CMDQ( (_uHashCtrl1.u32HashCtrl1)) ;
2000*53ee8cc1Swenshuai.xi 
2001*53ee8cc1Swenshuai.xi 			WRITE_CMDQ( (_uHashCtrl2.u32HashCtrl2)) ;
2002*53ee8cc1Swenshuai.xi 
2003*53ee8cc1Swenshuai.xi             WRITE_CMDQ(_u32HashMsgLen) ;
2004*53ee8cc1Swenshuai.xi 
2005*53ee8cc1Swenshuai.xi 			//SRC
2006*53ee8cc1Swenshuai.xi             if (_uHashCtrl0.HashCtrl0.Src != CMD_HASH_SRC_REG)
2007*53ee8cc1Swenshuai.xi             {
2008*53ee8cc1Swenshuai.xi                 WRITE_CMDQ(_u32HashSrcAddr) ;
2009*53ee8cc1Swenshuai.xi             }
2010*53ee8cc1Swenshuai.xi 
2011*53ee8cc1Swenshuai.xi 			//RR address
2012*53ee8cc1Swenshuai.xi             if (_uHashCtrl2.HashCtrl2.RR == TRUE)
2013*53ee8cc1Swenshuai.xi             {
2014*53ee8cc1Swenshuai.xi                 WRITE_CMDQ(_u32ReportAddr) ;
2015*53ee8cc1Swenshuai.xi             }
2016*53ee8cc1Swenshuai.xi 
2017*53ee8cc1Swenshuai.xi 			// IWC
2018*53ee8cc1Swenshuai.xi             if (CMD_HASH_IWC_CMDQ == _uHashCtrl0.HashCtrl0.IWC_Sel)
2019*53ee8cc1Swenshuai.xi             {
2020*53ee8cc1Swenshuai.xi                WRITE_CMDQ(_u32InitWordCnt);
2021*53ee8cc1Swenshuai.xi             }
2022*53ee8cc1Swenshuai.xi             else
2023*53ee8cc1Swenshuai.xi             {
2024*53ee8cc1Swenshuai.xi                 REG32_W(&_AESDMACtrl->Hash_Reportp[1], _u32InitWordCnt);
2025*53ee8cc1Swenshuai.xi             }
2026*53ee8cc1Swenshuai.xi 
2027*53ee8cc1Swenshuai.xi 			// DST
2028*53ee8cc1Swenshuai.xi             if ((CMD_HASH_OUTPUT_DRAM == _uHashCtrl0.HashCtrl0.Dest) || (_uHashCtrl0.HashCtrl0.Dest == CMD_HASH_OUTPUT_R2 ))
2029*53ee8cc1Swenshuai.xi             {
2030*53ee8cc1Swenshuai.xi                 WRITE_CMDQ(_u32HashDestAddr);
2031*53ee8cc1Swenshuai.xi             }
2032*53ee8cc1Swenshuai.xi 
2033*53ee8cc1Swenshuai.xi             // HASH Initial Vector from CmdQ
2034*53ee8cc1Swenshuai.xi             if (CMD_HASH_IV_CMD == _uHashCtrl0.HashCtrl0.InitHashSel )
2035*53ee8cc1Swenshuai.xi             {
2036*53ee8cc1Swenshuai.xi                 for ( i = 0 ; i < (HASH_CMD_IV_SIZE/4) ; i ++  )
2037*53ee8cc1Swenshuai.xi                 {
2038*53ee8cc1Swenshuai.xi                     u32Tmp = ((_pu8HashIV[4*i+0]<<24)|(_pu8HashIV[4*i+1]<<16)|(_pu8HashIV[4*i+2]<<8)|(_pu8HashIV[4*i+3]) );
2039*53ee8cc1Swenshuai.xi 
2040*53ee8cc1Swenshuai.xi                     WRITE_CMDQ(u32Tmp);
2041*53ee8cc1Swenshuai.xi                 }
2042*53ee8cc1Swenshuai.xi             }
2043*53ee8cc1Swenshuai.xi 
2044*53ee8cc1Swenshuai.xi             // HASH Data from CmdQ
2045*53ee8cc1Swenshuai.xi             if ( CMD_HASH_SRC_REG == _uHashCtrl0.HashCtrl0.Src )
2046*53ee8cc1Swenshuai.xi             {
2047*53ee8cc1Swenshuai.xi                 for ( i = 0 ; i < (HASH_CMD_MSG_SIZE/4) ; i ++  )
2048*53ee8cc1Swenshuai.xi                 {
2049*53ee8cc1Swenshuai.xi 					 u32Tmp = (  (_pu8HashMsg[i*4+0]<<24)
2050*53ee8cc1Swenshuai.xi 					 			|(_pu8HashMsg[i*4+1]<<16)
2051*53ee8cc1Swenshuai.xi 					 			|(_pu8HashMsg[i*4+2]<<8)
2052*53ee8cc1Swenshuai.xi 					 			|(_pu8HashMsg[i*4+3]<<0)
2053*53ee8cc1Swenshuai.xi 					 		  );
2054*53ee8cc1Swenshuai.xi 
2055*53ee8cc1Swenshuai.xi                      WRITE_CMDQ(u32Tmp);
2056*53ee8cc1Swenshuai.xi 				}
2057*53ee8cc1Swenshuai.xi             }
2058*53ee8cc1Swenshuai.xi 
2059*53ee8cc1Swenshuai.xi 			if((CMD_HMAC_KSEL_HK == _uHashCtrl0.HashCtrl0.HMAC_KeySel) && (CMD_HMAC_KSEL_DIR_HK == _uHashCtrl0.HashCtrl0.DK))
2060*53ee8cc1Swenshuai.xi             {
2061*53ee8cc1Swenshuai.xi                 for ( i = 0 ; i < (HASH_CMD_HMAC_HOSTKEY_SIZE/4) ; i ++  )
2062*53ee8cc1Swenshuai.xi                 {
2063*53ee8cc1Swenshuai.xi                     u32Tmp = ((_pu8HashHMACHostKey[4*i+0]<<24)|(_pu8HashHMACHostKey[4*i+1]<<16)|(_pu8HashHMACHostKey[4*i+2]<<8)|(_pu8HashHMACHostKey[4*i+3]) );
2064*53ee8cc1Swenshuai.xi 
2065*53ee8cc1Swenshuai.xi                     WRITE_CMDQ(u32Tmp);
2066*53ee8cc1Swenshuai.xi                 }
2067*53ee8cc1Swenshuai.xi             }
2068*53ee8cc1Swenshuai.xi             // [HW] Hardware will check Current spare count != Write back Spare count to start operation.
2069*53ee8cc1Swenshuai.xi             REG32_W(&_AESDMACtrl->SpareCnt, u32SpareCnt) ;
2070*53ee8cc1Swenshuai.xi             return TRUE ;
2071*53ee8cc1Swenshuai.xi 
2072*53ee8cc1Swenshuai.xi         }
2073*53ee8cc1Swenshuai.xi         else
2074*53ee8cc1Swenshuai.xi         {
2075*53ee8cc1Swenshuai.xi             // [HW] Check Current spare count == Write back Spare count to start wait cmd
2076*53ee8cc1Swenshuai.xi             REG32_W(&_AESDMACtrl->SpareCnt, u32SpareCnt) ;
2077*53ee8cc1Swenshuai.xi 
2078*53ee8cc1Swenshuai.xi             if (bWaitCmdQ)
2079*53ee8cc1Swenshuai.xi             {
2080*53ee8cc1Swenshuai.xi                 //  Retry until CMDQ avaliable
2081*53ee8cc1Swenshuai.xi                 HAL_DEBUG_CIPHER(CIPHER_DBG_WARN, printf("[%s][%d]HASH cmd retry!\n",
2082*53ee8cc1Swenshuai.xi                     __func__, __LINE__));
2083*53ee8cc1Swenshuai.xi                 goto SHA_RETRY;
2084*53ee8cc1Swenshuai.xi             }
2085*53ee8cc1Swenshuai.xi             else
2086*53ee8cc1Swenshuai.xi             {
2087*53ee8cc1Swenshuai.xi                 //  Return Fail, Command abort
2088*53ee8cc1Swenshuai.xi                 return FALSE ;
2089*53ee8cc1Swenshuai.xi             }
2090*53ee8cc1Swenshuai.xi         }
2091*53ee8cc1Swenshuai.xi }
2092*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_CmdDone(MS_U32 u32CmdID,MS_U32 * u32Ret)2093*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_Hash_CmdDone(MS_U32 u32CmdID, MS_U32 *u32Ret)
2094*53ee8cc1Swenshuai.xi {
2095*53ee8cc1Swenshuai.xi     MS_U32 u32ExcTmp = 0;
2096*53ee8cc1Swenshuai.xi 
2097*53ee8cc1Swenshuai.xi     MS_U32 u32Tmp = REG32_R(&_AESDMACtrl->Hash_Reportp[0]) ;
2098*53ee8cc1Swenshuai.xi     MS_U32 u32RptId = u32Tmp & REG_CIPHER_RPT_THREAD_MSK;
2099*53ee8cc1Swenshuai.xi 
2100*53ee8cc1Swenshuai.xi     if(u32RptId == u32CmdID)
2101*53ee8cc1Swenshuai.xi     {
2102*53ee8cc1Swenshuai.xi     	u32ExcTmp = (MS_U32)REG32_R(&_AESDMACtrl->Dma_Ctrl[REG_EXCEPT_FLAG]);
2103*53ee8cc1Swenshuai.xi         *u32Ret = u32ExcTmp;
2104*53ee8cc1Swenshuai.xi     }
2105*53ee8cc1Swenshuai.xi     else
2106*53ee8cc1Swenshuai.xi     {
2107*53ee8cc1Swenshuai.xi         HAL_DEBUG_CIPHER(CIPHER_DBG_WARN, printf("[%s][%d]HASH Cmd[%u] Not done!ReportId[%u]\n",
2108*53ee8cc1Swenshuai.xi                     __func__, __LINE__, u32CmdID, u32RptId));
2109*53ee8cc1Swenshuai.xi         return FALSE;
2110*53ee8cc1Swenshuai.xi     }
2111*53ee8cc1Swenshuai.xi 
2112*53ee8cc1Swenshuai.xi     return TRUE;
2113*53ee8cc1Swenshuai.xi }
2114*53ee8cc1Swenshuai.xi 
HAL_CIPHER_Hash_ExceptFilter(MS_U32 * pu32Exception,CIPHER_KEY_SRC eKeySrc,MS_U8 u8KeyIdx)2115*53ee8cc1Swenshuai.xi void HAL_CIPHER_Hash_ExceptFilter(MS_U32 *pu32Exception, CIPHER_KEY_SRC eKeySrc, MS_U8 u8KeyIdx)
2116*53ee8cc1Swenshuai.xi {
2117*53ee8cc1Swenshuai.xi     //Because CryptoDMA will check every key slot usage for HMAC
2118*53ee8cc1Swenshuai.xi     //We need to filter out the correct key exception
2119*53ee8cc1Swenshuai.xi     MS_U32 u32ExcTmp = 0;
2120*53ee8cc1Swenshuai.xi     HAL_CIPHER_KEYSRC KeySrc = 0;
2121*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
2122*53ee8cc1Swenshuai.xi 
2123*53ee8cc1Swenshuai.xi     u32ExcTmp = *pu32Exception;
2124*53ee8cc1Swenshuai.xi 
2125*53ee8cc1Swenshuai.xi     //DRV to HAL Type transfer
2126*53ee8cc1Swenshuai.xi     KeySrc = _HAL_CIPHER_TransKey(eKeySrc, u8KeyIdx);
2127*53ee8cc1Swenshuai.xi 
2128*53ee8cc1Swenshuai.xi     //Only check HMAC key exception
2129*53ee8cc1Swenshuai.xi     for(i = E_CIPHER_disable_masterkey0;i<=E_CIPHER_disable_reg_key_3;i++) //check each error flag
2130*53ee8cc1Swenshuai.xi     {
2131*53ee8cc1Swenshuai.xi         if((u32ExcTmp & (1 << i)) >> i)
2132*53ee8cc1Swenshuai.xi         {
2133*53ee8cc1Swenshuai.xi             switch(i)
2134*53ee8cc1Swenshuai.xi             {
2135*53ee8cc1Swenshuai.xi                 case E_CIPHER_disable_masterkey0:
2136*53ee8cc1Swenshuai.xi                     if(E_DMA_KSEL_MK0 != KeySrc)
2137*53ee8cc1Swenshuai.xi 	                    u32ExcTmp &= (~(1 << E_CIPHER_disable_masterkey0));
2138*53ee8cc1Swenshuai.xi 					break;
2139*53ee8cc1Swenshuai.xi 
2140*53ee8cc1Swenshuai.xi                 case E_CIPHER_disable_masterkey1:
2141*53ee8cc1Swenshuai.xi                     if(E_DMA_KSEL_MK1 != KeySrc)
2142*53ee8cc1Swenshuai.xi 	                    u32ExcTmp &= (~(1 << E_CIPHER_disable_masterkey1));
2143*53ee8cc1Swenshuai.xi 					break;
2144*53ee8cc1Swenshuai.xi 
2145*53ee8cc1Swenshuai.xi                 case E_CIPHER_disable_cck:
2146*53ee8cc1Swenshuai.xi                     if(E_DMA_KSEL_CCCK != KeySrc)
2147*53ee8cc1Swenshuai.xi 	                    u32ExcTmp &= (~(1 << E_CIPHER_disable_cck));
2148*53ee8cc1Swenshuai.xi 					break;
2149*53ee8cc1Swenshuai.xi 
2150*53ee8cc1Swenshuai.xi                  case E_CIPHER_disable_reg_key_0:
2151*53ee8cc1Swenshuai.xi                     if(E_DMA_KSEL_SK0 != KeySrc)
2152*53ee8cc1Swenshuai.xi 	                    u32ExcTmp &= (~(1 << E_CIPHER_disable_reg_key_0));
2153*53ee8cc1Swenshuai.xi 					break;
2154*53ee8cc1Swenshuai.xi 
2155*53ee8cc1Swenshuai.xi                 case E_CIPHER_disable_reg_key_1:
2156*53ee8cc1Swenshuai.xi                     if(E_DMA_KSEL_SK1 != KeySrc)
2157*53ee8cc1Swenshuai.xi 	                    u32ExcTmp &= (~(1 << E_CIPHER_disable_reg_key_1));
2158*53ee8cc1Swenshuai.xi 					break;
2159*53ee8cc1Swenshuai.xi 
2160*53ee8cc1Swenshuai.xi                 case E_CIPHER_disable_reg_key_2:
2161*53ee8cc1Swenshuai.xi                     if(E_DMA_KSEL_SK2 != KeySrc)
2162*53ee8cc1Swenshuai.xi 	                    u32ExcTmp &= (~(1 << E_CIPHER_disable_reg_key_2));
2163*53ee8cc1Swenshuai.xi 					break;
2164*53ee8cc1Swenshuai.xi 
2165*53ee8cc1Swenshuai.xi                 case E_CIPHER_disable_reg_key_3:
2166*53ee8cc1Swenshuai.xi                     if(E_DMA_KSEL_SK3 != KeySrc)
2167*53ee8cc1Swenshuai.xi 	                    u32ExcTmp &= (~(1 << E_CIPHER_disable_reg_key_3));
2168*53ee8cc1Swenshuai.xi                     break;
2169*53ee8cc1Swenshuai.xi 
2170*53ee8cc1Swenshuai.xi                 default:
2171*53ee8cc1Swenshuai.xi                     break;
2172*53ee8cc1Swenshuai.xi             }
2173*53ee8cc1Swenshuai.xi         }
2174*53ee8cc1Swenshuai.xi     }
2175*53ee8cc1Swenshuai.xi 
2176*53ee8cc1Swenshuai.xi     *pu32Exception = u32ExcTmp;
2177*53ee8cc1Swenshuai.xi 
2178*53ee8cc1Swenshuai.xi     return;
2179*53ee8cc1Swenshuai.xi 
2180*53ee8cc1Swenshuai.xi }
2181*53ee8cc1Swenshuai.xi // =====================================
2182*53ee8cc1Swenshuai.xi //  Parser function implementation
2183*53ee8cc1Swenshuai.xi // =====================================
HAL_CIPHER_PARSER_Set_Mode(CIPHER_PARSER_MODE eMode)2184*53ee8cc1Swenshuai.xi void HAL_CIPHER_PARSER_Set_Mode(CIPHER_PARSER_MODE eMode)
2185*53ee8cc1Swenshuai.xi 
2186*53ee8cc1Swenshuai.xi {
2187*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_HDCPMODE eHDCPMode = 0;
2188*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_TSMODE eTSMode = 0;
2189*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_PKTMODE ePKTMode = 0;
2190*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_AUTOMODE eAutoMode = 0;
2191*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_ITMODE eITMode = 0;
2192*53ee8cc1Swenshuai.xi     HAL_CIPHER_PARSER_CLEARMODE eClearMode = 0;
2193*53ee8cc1Swenshuai.xi 
2194*53ee8cc1Swenshuai.xi     switch(eMode)
2195*53ee8cc1Swenshuai.xi     {
2196*53ee8cc1Swenshuai.xi         case E_CIPHER_PARSER_TS_PKT192:
2197*53ee8cc1Swenshuai.xi             eHDCPMode = E_PARSER_HDCPMODE_NONE;
2198*53ee8cc1Swenshuai.xi             eTSMode = E_PARSER_TSMODE_TS;
2199*53ee8cc1Swenshuai.xi             ePKTMode = E_PARSER_PKTMODE_192;
2200*53ee8cc1Swenshuai.xi             eAutoMode = E_PARSER_AUTOMODE_EN;
2201*53ee8cc1Swenshuai.xi             eITMode = E_PARSER_ITMODE_EN;
2202*53ee8cc1Swenshuai.xi             eClearMode = E_PARSER_CLEARMODE_NONE;
2203*53ee8cc1Swenshuai.xi             break;
2204*53ee8cc1Swenshuai.xi         case E_CIPHER_PARSER_TS_PKT192_CLEAR:
2205*53ee8cc1Swenshuai.xi             eHDCPMode = E_PARSER_HDCPMODE_NONE;
2206*53ee8cc1Swenshuai.xi             eTSMode = E_PARSER_TSMODE_TS;
2207*53ee8cc1Swenshuai.xi             ePKTMode = E_PARSER_PKTMODE_192;
2208*53ee8cc1Swenshuai.xi             eAutoMode = E_PARSER_AUTOMODE_EN;
2209*53ee8cc1Swenshuai.xi             eITMode = E_PARSER_ITMODE_EN;
2210*53ee8cc1Swenshuai.xi             eClearMode = E_PARSER_CLEARMODE_EN;
2211*53ee8cc1Swenshuai.xi             break;
2212*53ee8cc1Swenshuai.xi         case E_CIPHER_PARSER_TS_PKT188:
2213*53ee8cc1Swenshuai.xi             eHDCPMode = E_PARSER_HDCPMODE_NONE;
2214*53ee8cc1Swenshuai.xi             eTSMode = E_PARSER_TSMODE_TS;
2215*53ee8cc1Swenshuai.xi             ePKTMode = E_PARSER_PKTMODE_188;
2216*53ee8cc1Swenshuai.xi             eAutoMode = E_PARSER_AUTOMODE_EN;
2217*53ee8cc1Swenshuai.xi             eITMode = E_PARSER_ITMODE_EN;
2218*53ee8cc1Swenshuai.xi             eClearMode = E_PARSER_CLEARMODE_NONE;
2219*53ee8cc1Swenshuai.xi             break;
2220*53ee8cc1Swenshuai.xi         case E_CIPHER_PARSER_TS_PKT188_CLEAR:
2221*53ee8cc1Swenshuai.xi             eHDCPMode = E_PARSER_HDCPMODE_NONE;
2222*53ee8cc1Swenshuai.xi             eTSMode = E_PARSER_TSMODE_TS;
2223*53ee8cc1Swenshuai.xi             ePKTMode = E_PARSER_PKTMODE_188;
2224*53ee8cc1Swenshuai.xi             eAutoMode = E_PARSER_AUTOMODE_EN;
2225*53ee8cc1Swenshuai.xi             eITMode = E_PARSER_ITMODE_EN;
2226*53ee8cc1Swenshuai.xi             eClearMode = E_PARSER_CLEARMODE_EN;
2227*53ee8cc1Swenshuai.xi             break;
2228*53ee8cc1Swenshuai.xi         case E_CIPHER_PARSER_HDCP20_PKT192:
2229*53ee8cc1Swenshuai.xi             eHDCPMode = E_PARSER_HDCPMODE_HDCP20;
2230*53ee8cc1Swenshuai.xi             eTSMode = E_PARSER_TSMODE_PES;
2231*53ee8cc1Swenshuai.xi             ePKTMode = E_PARSER_PKTMODE_192;
2232*53ee8cc1Swenshuai.xi             eAutoMode = E_PARSER_AUTOMODE_EN;
2233*53ee8cc1Swenshuai.xi             eITMode = E_PARSER_ITMODE_EN;
2234*53ee8cc1Swenshuai.xi             eClearMode = E_PARSER_CLEARMODE_NONE;
2235*53ee8cc1Swenshuai.xi             break;
2236*53ee8cc1Swenshuai.xi         case E_CIPHER_PARSER_HDCP20_PKT192_CLEAR:
2237*53ee8cc1Swenshuai.xi             eHDCPMode = E_PARSER_HDCPMODE_HDCP20;
2238*53ee8cc1Swenshuai.xi             eTSMode = E_PARSER_TSMODE_PES;
2239*53ee8cc1Swenshuai.xi             ePKTMode = E_PARSER_PKTMODE_192;
2240*53ee8cc1Swenshuai.xi             eAutoMode = E_PARSER_AUTOMODE_EN;
2241*53ee8cc1Swenshuai.xi             eITMode = E_PARSER_ITMODE_NONE;
2242*53ee8cc1Swenshuai.xi             eClearMode = E_PARSER_CLEARMODE_EN;
2243*53ee8cc1Swenshuai.xi             break;
2244*53ee8cc1Swenshuai.xi         case E_CIPHER_PARSER_HDCP20_PKT188:
2245*53ee8cc1Swenshuai.xi             eHDCPMode = E_PARSER_HDCPMODE_HDCP20;
2246*53ee8cc1Swenshuai.xi             eTSMode = E_PARSER_TSMODE_PES;
2247*53ee8cc1Swenshuai.xi             ePKTMode = E_PARSER_PKTMODE_188;
2248*53ee8cc1Swenshuai.xi             eAutoMode = E_PARSER_AUTOMODE_EN;
2249*53ee8cc1Swenshuai.xi             eITMode = E_PARSER_ITMODE_EN;
2250*53ee8cc1Swenshuai.xi             eClearMode = E_PARSER_CLEARMODE_NONE;
2251*53ee8cc1Swenshuai.xi             break;
2252*53ee8cc1Swenshuai.xi         case E_CIPHER_PARSER_HDCP20_PKT188_CLEAR:
2253*53ee8cc1Swenshuai.xi             eHDCPMode = E_PARSER_HDCPMODE_HDCP20;
2254*53ee8cc1Swenshuai.xi             eTSMode = E_PARSER_TSMODE_PES;
2255*53ee8cc1Swenshuai.xi             ePKTMode = E_PARSER_PKTMODE_188;
2256*53ee8cc1Swenshuai.xi             eAutoMode = E_PARSER_AUTOMODE_EN;
2257*53ee8cc1Swenshuai.xi             eITMode = E_PARSER_ITMODE_NONE;
2258*53ee8cc1Swenshuai.xi             eClearMode = E_PARSER_CLEARMODE_EN;
2259*53ee8cc1Swenshuai.xi             break;
2260*53ee8cc1Swenshuai.xi         default:
2261*53ee8cc1Swenshuai.xi             printf("Error: Not suport parser mode!\n");
2262*53ee8cc1Swenshuai.xi             break;
2263*53ee8cc1Swenshuai.xi     }
2264*53ee8cc1Swenshuai.xi 
2265*53ee8cc1Swenshuai.xi     _uDmaCtrl2.DmaCtrl2.HP   = TRUE;
2266*53ee8cc1Swenshuai.xi     _uDmaCtrl2.DmaCtrl2.HDCP = eHDCPMode;
2267*53ee8cc1Swenshuai.xi     _uDmaCtrl2.DmaCtrl2.TS   = eTSMode;
2268*53ee8cc1Swenshuai.xi     _uDmaCtrl2.DmaCtrl2.P192 = ePKTMode;
2269*53ee8cc1Swenshuai.xi     _uDmaCtrl2.DmaCtrl2.AT   = eAutoMode;
2270*53ee8cc1Swenshuai.xi     _uDmaCtrl2.DmaCtrl2.IT   = eITMode;
2271*53ee8cc1Swenshuai.xi     _uDmaCtrl2.DmaCtrl2.CR   = eClearMode;
2272*53ee8cc1Swenshuai.xi 
2273*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Parser config:HDCP[%d], TS[%d], P192[%d], AT[%d], IT[%d], ClearMode[%d]\n",
2274*53ee8cc1Swenshuai.xi         __func__, __LINE__, eHDCPMode, eTSMode, ePKTMode, eAutoMode, eITMode, eClearMode));
2275*53ee8cc1Swenshuai.xi 
2276*53ee8cc1Swenshuai.xi 
2277*53ee8cc1Swenshuai.xi }
2278*53ee8cc1Swenshuai.xi 
HAL_CIPHER_PARSER_Set_MaskSCB(MS_BOOL bEnable)2279*53ee8cc1Swenshuai.xi void HAL_CIPHER_PARSER_Set_MaskSCB(MS_BOOL bEnable)
2280*53ee8cc1Swenshuai.xi {
2281*53ee8cc1Swenshuai.xi     _uDmaCtrl2.DmaCtrl2.TsSbMk = bEnable;
2282*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Enable MaskSCB[%d]!\n",
2283*53ee8cc1Swenshuai.xi                 __func__, __LINE__, bEnable));
2284*53ee8cc1Swenshuai.xi }
2285*53ee8cc1Swenshuai.xi 
HAL_CIPHER_PARSER_Set_SCB(CIPHER_PARSER_SCB eSCB)2286*53ee8cc1Swenshuai.xi void HAL_CIPHER_PARSER_Set_SCB(CIPHER_PARSER_SCB eSCB)
2287*53ee8cc1Swenshuai.xi {
2288*53ee8cc1Swenshuai.xi     MS_U8 u8SCB = 0;
2289*53ee8cc1Swenshuai.xi 
2290*53ee8cc1Swenshuai.xi     if(eSCB == E_CIPHER_PARSER_SCB_10)
2291*53ee8cc1Swenshuai.xi     {
2292*53ee8cc1Swenshuai.xi         u8SCB = CMD_PARSER_SCB10;
2293*53ee8cc1Swenshuai.xi     }
2294*53ee8cc1Swenshuai.xi     else if(eSCB == E_CIPHER_PARSER_SCB_11)
2295*53ee8cc1Swenshuai.xi     {
2296*53ee8cc1Swenshuai.xi         u8SCB = CMD_PARSER_SCB11;
2297*53ee8cc1Swenshuai.xi     }
2298*53ee8cc1Swenshuai.xi     else
2299*53ee8cc1Swenshuai.xi     {
2300*53ee8cc1Swenshuai.xi         u8SCB = 0;
2301*53ee8cc1Swenshuai.xi     }
2302*53ee8cc1Swenshuai.xi     _uDmaCtrl2.DmaCtrl2.TsSbPn = u8SCB;
2303*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set SCB[%u]!\n",
2304*53ee8cc1Swenshuai.xi                 __func__, __LINE__, u8SCB));
2305*53ee8cc1Swenshuai.xi }
2306*53ee8cc1Swenshuai.xi 
HAL_CIPHER_PARSER_Set_ForceSCB(MS_BOOL bInsert,CIPHER_PARSER_SCB eSCB)2307*53ee8cc1Swenshuai.xi void HAL_CIPHER_PARSER_Set_ForceSCB(MS_BOOL bInsert, CIPHER_PARSER_SCB eSCB)
2308*53ee8cc1Swenshuai.xi {
2309*53ee8cc1Swenshuai.xi     MS_U8 u8SCB = 0;
2310*53ee8cc1Swenshuai.xi 
2311*53ee8cc1Swenshuai.xi     if(bInsert)
2312*53ee8cc1Swenshuai.xi     {
2313*53ee8cc1Swenshuai.xi         if(eSCB == E_CIPHER_PARSER_SCB_10)
2314*53ee8cc1Swenshuai.xi         {
2315*53ee8cc1Swenshuai.xi             u8SCB = CMD_PARSER_SCB10;
2316*53ee8cc1Swenshuai.xi         }
2317*53ee8cc1Swenshuai.xi         else if(eSCB == E_CIPHER_PARSER_SCB_11)
2318*53ee8cc1Swenshuai.xi         {
2319*53ee8cc1Swenshuai.xi             u8SCB = CMD_PARSER_SCB11;
2320*53ee8cc1Swenshuai.xi         }
2321*53ee8cc1Swenshuai.xi         else
2322*53ee8cc1Swenshuai.xi         {
2323*53ee8cc1Swenshuai.xi             u8SCB = 0;
2324*53ee8cc1Swenshuai.xi         }
2325*53ee8cc1Swenshuai.xi     }
2326*53ee8cc1Swenshuai.xi 
2327*53ee8cc1Swenshuai.xi     _uDmaCtrl2.DmaCtrl2.InSb = bInsert;
2328*53ee8cc1Swenshuai.xi     _uDmaCtrl2.DmaCtrl2.TsInSb = u8SCB;
2329*53ee8cc1Swenshuai.xi 
2330*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set Insert Enable[%d], SCB[%u]!\n",
2331*53ee8cc1Swenshuai.xi                 __func__, __LINE__, bInsert, u8SCB));
2332*53ee8cc1Swenshuai.xi 
2333*53ee8cc1Swenshuai.xi }
2334*53ee8cc1Swenshuai.xi 
HAL_CIPHER_PARSER_Rmv_SCB(MS_BOOL bRemove)2335*53ee8cc1Swenshuai.xi void HAL_CIPHER_PARSER_Rmv_SCB(MS_BOOL bRemove)
2336*53ee8cc1Swenshuai.xi {
2337*53ee8cc1Swenshuai.xi     _uDmaCtrl2.DmaCtrl2.RmSb = bRemove;
2338*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Remove SCB[%d]!\n",
2339*53ee8cc1Swenshuai.xi                 __func__, __LINE__, bRemove));
2340*53ee8cc1Swenshuai.xi }
2341*53ee8cc1Swenshuai.xi 
HAL_CIPHER_PARSER_BypassPid(MS_BOOL bEnable)2342*53ee8cc1Swenshuai.xi void HAL_CIPHER_PARSER_BypassPid(MS_BOOL bEnable)
2343*53ee8cc1Swenshuai.xi {
2344*53ee8cc1Swenshuai.xi     _uDmaCtrl2.DmaCtrl2.BPS = bEnable;
2345*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Bypass PID[%d]!\n",
2346*53ee8cc1Swenshuai.xi                 __func__, __LINE__, bEnable));
2347*53ee8cc1Swenshuai.xi }
2348*53ee8cc1Swenshuai.xi 
HAL_CIPHER_PARSER_Set_PID(CIPHER_PARSER_PID stPID)2349*53ee8cc1Swenshuai.xi void HAL_CIPHER_PARSER_Set_PID(CIPHER_PARSER_PID stPID)
2350*53ee8cc1Swenshuai.xi {
2351*53ee8cc1Swenshuai.xi     if(stPID.pu8PID0 != NULL)
2352*53ee8cc1Swenshuai.xi     {
2353*53ee8cc1Swenshuai.xi         memset(_pu8PID0, 0x0 , PID_SIZE );
2354*53ee8cc1Swenshuai.xi         memcpy(_pu8PID0, stPID.pu8PID0, PID_SIZE);
2355*53ee8cc1Swenshuai.xi     }
2356*53ee8cc1Swenshuai.xi     else
2357*53ee8cc1Swenshuai.xi     {
2358*53ee8cc1Swenshuai.xi         HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set PID0 NULL!\n",
2359*53ee8cc1Swenshuai.xi                     __func__, __LINE__));
2360*53ee8cc1Swenshuai.xi     }
2361*53ee8cc1Swenshuai.xi 
2362*53ee8cc1Swenshuai.xi     if(stPID.pu8PID1 != NULL)
2363*53ee8cc1Swenshuai.xi     {
2364*53ee8cc1Swenshuai.xi         memset(_pu8PID1, 0x0 , PID_SIZE );
2365*53ee8cc1Swenshuai.xi         memcpy(_pu8PID1, stPID.pu8PID1 , PID_SIZE);
2366*53ee8cc1Swenshuai.xi     }
2367*53ee8cc1Swenshuai.xi     else
2368*53ee8cc1Swenshuai.xi     {
2369*53ee8cc1Swenshuai.xi         HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set PID1 NULL!\n",
2370*53ee8cc1Swenshuai.xi                     __func__, __LINE__));
2371*53ee8cc1Swenshuai.xi     }
2372*53ee8cc1Swenshuai.xi }
2373*53ee8cc1Swenshuai.xi 
HAL_CIPHER_PARSER_Set_Key2(DRV_CIPHER_KEY stKey)2374*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_PARSER_Set_Key2(DRV_CIPHER_KEY stKey)
2375*53ee8cc1Swenshuai.xi {
2376*53ee8cc1Swenshuai.xi     HAL_CIPHER_KEYSRC KeySrc = 0;
2377*53ee8cc1Swenshuai.xi     HAL_CIPHER_ALGO algo = 0;
2378*53ee8cc1Swenshuai.xi     MS_BOOL bDK2 = FALSE;
2379*53ee8cc1Swenshuai.xi     MS_BOOL bTwoKey = FALSE;
2380*53ee8cc1Swenshuai.xi 
2381*53ee8cc1Swenshuai.xi     algo = _uDmaCtrl0.DmaCtrl0.Algo;
2382*53ee8cc1Swenshuai.xi 
2383*53ee8cc1Swenshuai.xi     if(E_DMA_ALGO_NONE == algo)
2384*53ee8cc1Swenshuai.xi     {
2385*53ee8cc1Swenshuai.xi         //No key
2386*53ee8cc1Swenshuai.xi         bDK2 = FALSE;
2387*53ee8cc1Swenshuai.xi         bTwoKey = FALSE;
2388*53ee8cc1Swenshuai.xi         memset(_pu8CipherKey2, 0x0 , HAL_CRYPTODMA_KEYLEN_MAX);
2389*53ee8cc1Swenshuai.xi         goto SET_KEY_DONE;
2390*53ee8cc1Swenshuai.xi     }
2391*53ee8cc1Swenshuai.xi 
2392*53ee8cc1Swenshuai.xi     //Check Key Source, Index
2393*53ee8cc1Swenshuai.xi     if(((E_CIPHER_KSRC_KL == stKey.eKeySrc) && (stKey.u8KeyIdx > HAL_CRYPTODMA_DMA_KEY_SLOT-1)) ||
2394*53ee8cc1Swenshuai.xi        ((E_CIPHER_KSRC_OTP == stKey.eKeySrc) && (stKey.u8KeyIdx > HAL_CRYPTODMA_OTP_SCK_NUM-1)))
2395*53ee8cc1Swenshuai.xi     {
2396*53ee8cc1Swenshuai.xi        HAL_DEBUG_CIPHER(CIPHER_DBG_ERR, printf("[%s][%d]Invalid KeySrc[%d], Index[%d]\n",
2397*53ee8cc1Swenshuai.xi            __func__, __LINE__, stKey.eKeySrc, stKey.u8KeyIdx));
2398*53ee8cc1Swenshuai.xi        return FALSE;
2399*53ee8cc1Swenshuai.xi     }
2400*53ee8cc1Swenshuai.xi 
2401*53ee8cc1Swenshuai.xi     //DRV to HAL Type transfer
2402*53ee8cc1Swenshuai.xi     KeySrc = _HAL_CIPHER_TransKey(stKey.eKeySrc, stKey.u8KeyIdx);
2403*53ee8cc1Swenshuai.xi 
2404*53ee8cc1Swenshuai.xi     // key from CPU
2405*53ee8cc1Swenshuai.xi     if(E_DMA_KSEL_REGKEY == KeySrc)
2406*53ee8cc1Swenshuai.xi     {
2407*53ee8cc1Swenshuai.xi         if ((0 != stKey.pu8KeyData) && (stKey.u8KeyLen != 0) && (stKey.u8KeyLen <= HAL_CRYPTODMA_KEYLEN_MAX) )
2408*53ee8cc1Swenshuai.xi         {
2409*53ee8cc1Swenshuai.xi             memset(_pu8CipherKey2, 0x0 , HAL_CRYPTODMA_KEYLEN_MAX );
2410*53ee8cc1Swenshuai.xi             memcpy(_pu8CipherKey2, (MS_U8 *)stKey.pu8KeyData , stKey.u8KeyLen);
2411*53ee8cc1Swenshuai.xi             bDK2 = TRUE;
2412*53ee8cc1Swenshuai.xi             KeySrc = 0;
2413*53ee8cc1Swenshuai.xi         }
2414*53ee8cc1Swenshuai.xi         else
2415*53ee8cc1Swenshuai.xi         {
2416*53ee8cc1Swenshuai.xi             return FALSE ;
2417*53ee8cc1Swenshuai.xi         }
2418*53ee8cc1Swenshuai.xi     }
2419*53ee8cc1Swenshuai.xi     else if(E_DMA_KSEL_CAIP == KeySrc)
2420*53ee8cc1Swenshuai.xi     {
2421*53ee8cc1Swenshuai.xi         bDK2 = FALSE ;
2422*53ee8cc1Swenshuai.xi         KeySrc = 0 ;
2423*53ee8cc1Swenshuai.xi     }
2424*53ee8cc1Swenshuai.xi     else// key from KL or OTP
2425*53ee8cc1Swenshuai.xi     {
2426*53ee8cc1Swenshuai.xi         bDK2 = FALSE;
2427*53ee8cc1Swenshuai.xi     }
2428*53ee8cc1Swenshuai.xi 
2429*53ee8cc1Swenshuai.xi     bTwoKey = TRUE;
2430*53ee8cc1Swenshuai.xi 
2431*53ee8cc1Swenshuai.xi SET_KEY_DONE:
2432*53ee8cc1Swenshuai.xi 
2433*53ee8cc1Swenshuai.xi 	_uDmaCtrl3.DmaCtrl3.DK2 = bDK2;
2434*53ee8cc1Swenshuai.xi     _uDmaCtrl3.DmaCtrl3.KeySel2 = KeySrc;
2435*53ee8cc1Swenshuai.xi     _uDmaCtrl2.DmaCtrl2.TK = bTwoKey;
2436*53ee8cc1Swenshuai.xi 
2437*53ee8cc1Swenshuai.xi     HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set DK2[%d], KeySel2[%d]\n",
2438*53ee8cc1Swenshuai.xi         __func__, __LINE__, bDK2, KeySrc));
2439*53ee8cc1Swenshuai.xi 
2440*53ee8cc1Swenshuai.xi     return TRUE ;
2441*53ee8cc1Swenshuai.xi 
2442*53ee8cc1Swenshuai.xi }
2443*53ee8cc1Swenshuai.xi 
HAL_CIPHER_PARSER_Set_IV2(MS_U8 * pu8IV2,MS_U8 u8IVLen)2444*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_PARSER_Set_IV2(MS_U8 *pu8IV2, MS_U8 u8IVLen)
2445*53ee8cc1Swenshuai.xi {
2446*53ee8cc1Swenshuai.xi     if((pu8IV2 != NULL) && (u8IVLen != 0))
2447*53ee8cc1Swenshuai.xi     {
2448*53ee8cc1Swenshuai.xi         memset(_pu8IV2, 0, CIPHER_KEY_SIZE);
2449*53ee8cc1Swenshuai.xi         memcpy(_pu8IV2, pu8IV2, u8IVLen);
2450*53ee8cc1Swenshuai.xi         _uDmaCtrl3.DmaCtrl3.DIV2 = TRUE;
2451*53ee8cc1Swenshuai.xi 
2452*53ee8cc1Swenshuai.xi         return TRUE;
2453*53ee8cc1Swenshuai.xi     }
2454*53ee8cc1Swenshuai.xi     else
2455*53ee8cc1Swenshuai.xi     {
2456*53ee8cc1Swenshuai.xi         HAL_DEBUG_CIPHER(CIPHER_DBG_INFO, printf("[%s][%d]Set IV2 NULL!\n",
2457*53ee8cc1Swenshuai.xi                         __func__, __LINE__));
2458*53ee8cc1Swenshuai.xi         return FALSE;
2459*53ee8cc1Swenshuai.xi     }
2460*53ee8cc1Swenshuai.xi 
2461*53ee8cc1Swenshuai.xi }
2462*53ee8cc1Swenshuai.xi 
HAL_CIPHER_PARSER_Set_ClearStartMode(MS_BOOL bEnable)2463*53ee8cc1Swenshuai.xi void HAL_CIPHER_PARSER_Set_ClearStartMode(MS_BOOL bEnable)
2464*53ee8cc1Swenshuai.xi {
2465*53ee8cc1Swenshuai.xi     _uDmaCtrl3.DmaCtrl3.CRS = bEnable;
2466*53ee8cc1Swenshuai.xi }
2467*53ee8cc1Swenshuai.xi 
2468*53ee8cc1Swenshuai.xi // =====================================
2469*53ee8cc1Swenshuai.xi //  MISC function implementation
2470*53ee8cc1Swenshuai.xi // =====================================
HAL_CIPHER_Misc_Random(MS_U8 * pu8Buf,MS_U32 u32Size)2471*53ee8cc1Swenshuai.xi MS_BOOL HAL_CIPHER_Misc_Random(MS_U8 *pu8Buf, MS_U32 u32Size)
2472*53ee8cc1Swenshuai.xi {
2473*53ee8cc1Swenshuai.xi     MS_U16 u16TRN = 0;
2474*53ee8cc1Swenshuai.xi     MS_U16 u16PreTRN = 0;
2475*53ee8cc1Swenshuai.xi     MS_U32 u32Count = 0;
2476*53ee8cc1Swenshuai.xi 
2477*53ee8cc1Swenshuai.xi     if(NULL == pu8Buf || 0 == u32Size)
2478*53ee8cc1Swenshuai.xi         return FALSE;
2479*53ee8cc1Swenshuai.xi 
2480*53ee8cc1Swenshuai.xi #if defined (MCU_AEON)
2481*53ee8cc1Swenshuai.xi 
2482*53ee8cc1Swenshuai.xi     while(u32Count < u32Size)
2483*53ee8cc1Swenshuai.xi     {
2484*53ee8cc1Swenshuai.xi         do{
2485*53ee8cc1Swenshuai.xi             do{
2486*53ee8cc1Swenshuai.xi                 //Toggle random number bit
2487*53ee8cc1Swenshuai.xi                 MS_U32 u32Tmp=REG32_R(_u32RegBase+REG_RNG_TRNG_SCPU);
2488*53ee8cc1Swenshuai.xi                 u32Tmp^= REG_RNG_TRNG_ACK_SCPU;
2489*53ee8cc1Swenshuai.xi                 REG32_W(_u32RegBase+REG_RNG_TRNG_SCPU, u32Tmp);
2490*53ee8cc1Swenshuai.xi             }//Read random number valid
2491*53ee8cc1Swenshuai.xi             while( !(REG32_R(_u32RegBase+REG_RNG_TRNG_SCPU) & REG_RNG_TRNG_VALID_SCPU_MASK) );
2492*53ee8cc1Swenshuai.xi         }
2493*53ee8cc1Swenshuai.xi         while( (u16TRN = (REG32_R(_u32RegBase+REG_RNG_TRNG_SCPU) & REG_RNG_TRNG_OUT_SCPU_MASK))==u16PreTRN );
2494*53ee8cc1Swenshuai.xi         u16PreTRN = u16TRN;
2495*53ee8cc1Swenshuai.xi 
2496*53ee8cc1Swenshuai.xi         if(0 == ((u32Size - u32Count)%2UL))
2497*53ee8cc1Swenshuai.xi         {
2498*53ee8cc1Swenshuai.xi             *(pu8Buf+u32Count)   = u16TRN & 0xFFUL;
2499*53ee8cc1Swenshuai.xi             *(pu8Buf+u32Count+1) = (u16TRN & 0xFF00UL) >> 8;
2500*53ee8cc1Swenshuai.xi             u32Count += 2;
2501*53ee8cc1Swenshuai.xi         }
2502*53ee8cc1Swenshuai.xi         else
2503*53ee8cc1Swenshuai.xi         {
2504*53ee8cc1Swenshuai.xi             *(pu8Buf+u32Count) = u16TRN & 0xFFUL;
2505*53ee8cc1Swenshuai.xi             u32Count += 1;
2506*53ee8cc1Swenshuai.xi         }
2507*53ee8cc1Swenshuai.xi     }
2508*53ee8cc1Swenshuai.xi 
2509*53ee8cc1Swenshuai.xi #else
2510*53ee8cc1Swenshuai.xi 
2511*53ee8cc1Swenshuai.xi     while(u32Count < u32Size)
2512*53ee8cc1Swenshuai.xi     {
2513*53ee8cc1Swenshuai.xi         do{
2514*53ee8cc1Swenshuai.xi             do{
2515*53ee8cc1Swenshuai.xi                 //Toggle random number bit
2516*53ee8cc1Swenshuai.xi                 MS_U32 u32Tmp=REG32_R(_u32RegBase+REG_RNG_TRNG_ACPU);
2517*53ee8cc1Swenshuai.xi                 u32Tmp^= REG_RNG_TRNG_ACK_ACPU;
2518*53ee8cc1Swenshuai.xi                 REG32_W(_u32RegBase+REG_RNG_TRNG_ACPU, u32Tmp);
2519*53ee8cc1Swenshuai.xi             }//Read random number valid
2520*53ee8cc1Swenshuai.xi             while( !(REG32_R(_u32RegBase+REG_RNG_TRNG_ACPU) & REG_RNG_TRNG_VALID_ACPU_MASK) );
2521*53ee8cc1Swenshuai.xi         }
2522*53ee8cc1Swenshuai.xi         while( (u16TRN = (REG32_R(_u32RegBase+REG_RNG_TRNG_ACPU) & REG_RNG_TRNG_OUT_ACPU_MASK))==u16PreTRN );
2523*53ee8cc1Swenshuai.xi         u16PreTRN = u16TRN;
2524*53ee8cc1Swenshuai.xi 
2525*53ee8cc1Swenshuai.xi         if(0 == ((u32Size - u32Count)%2UL))
2526*53ee8cc1Swenshuai.xi         {
2527*53ee8cc1Swenshuai.xi             *(pu8Buf+u32Count)   = u16TRN & 0xFFUL;
2528*53ee8cc1Swenshuai.xi             *(pu8Buf+u32Count+1) = (u16TRN & 0xFF00UL) >> 8;
2529*53ee8cc1Swenshuai.xi             u32Count += 2;
2530*53ee8cc1Swenshuai.xi         }
2531*53ee8cc1Swenshuai.xi         else
2532*53ee8cc1Swenshuai.xi         {
2533*53ee8cc1Swenshuai.xi             *(pu8Buf+u32Count) = u16TRN & 0xFFUL;
2534*53ee8cc1Swenshuai.xi             u32Count += 1;
2535*53ee8cc1Swenshuai.xi         }
2536*53ee8cc1Swenshuai.xi     }
2537*53ee8cc1Swenshuai.xi #endif
2538*53ee8cc1Swenshuai.xi 
2539*53ee8cc1Swenshuai.xi     return TRUE;
2540*53ee8cc1Swenshuai.xi }
2541*53ee8cc1Swenshuai.xi 
2542*53ee8cc1Swenshuai.xi 
2543