xref: /utopia/UTPA2-700.0.x/modules/security/hal/k7u/cipher/halCIPHER.h (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2006-2009 MStar Semiconductor, Inc.
4 // All rights reserved.
5 //
6 // Unless otherwise stipulated in writing, any and all information contained
7 // herein regardless in any format shall remain the sole proprietary of
8 // MStar Semiconductor Inc. and be kept in strict confidence
9 // ("MStar Confidential Information") by the recipient.
10 // Any unauthorized act including without limitation unauthorized disclosure,
11 // copying, use, reproduction, sale, distribution, modification, disassembling,
12 // reverse engineering and compiling of the contents of MStar Confidential
13 // Information is unlawful and strictly prohibited. MStar hereby reserves the
14 // rights to any and all damages, losses, costs and expenses resulting therefrom.
15 //
16 ////////////////////////////////////////////////////////////////////////////////
17 
18 ////////////////////////////////////////////////////////////////////////////////////////////////////
19 // file   halCIPHER.h
20 // @brief  CIPHER HAL
21 // @author MStar Semiconductor,Inc.
22 ////////////////////////////////////////////////////////////////////////////////////////////////////
23 #ifndef __HAL_CIPHER_H__
24 #define __HAL_CIPHER_H__
25 
26 #include "regCIPHER.h"
27 #include "drvCIPHER.h"
28 
29 //--------------------------------------------------------------------------------------------------
30 //  Driver Compiler Option
31 //--------------------------------------------------------------------------------------------------
32 
33 //--------------------------------------------------------------------------------------------------
34 //  CIPHER Software Define
35 //--------------------------------------------------------------------------------------------------
36 #define HAL_CIPHER_RESETKEY_TIMEOUT_VALUE (1000UL)
37 
38 //--------------------------------------------------------------------------------------------------
39 //  CIPHER Hardware Abstraction Layer
40 //--------------------------------------------------------------------------------------------------
41 
42 #define HAL_CRYPTODMA_KEYLEN_MAX    32UL
43 #define HAL_CRYPTODMA_DIRDATA_MAX   16UL
44 #define HAL_CRYPTODMA_OTPHASH_UNIT  16UL
45 #define HAL_CRYPTODMA_OTPHASH_SIZE_MIN  32UL
46 #define HAL_CRYPTODMA_THREAD_ID_MAX 0xFFFFUL
47 #define HAL_CRYPTODMA_DMA_KEY_SLOT  4UL
48 #define HAL_CRYPTODMA_OTP_SCK_NUM   4UL
49 #define HAL_CRYPTODMA_CAVID_MAX     0x1FUL
50 //--------------------------------------------------------------------------------------------------
51 //  Macro of bit operations
52 //--------------------------------------------------------------------------------------------------
53 #define HAS_FLAG(flag, bit)        ((flag) & (bit))
54 #define SET_FLAG(flag, bit)        ((flag)|= (bit))
55 #define RESET_FLAG(flag, bit)      ((flag)&= (~(bit)))
56 #define SET_FLAG1(flag, bit)       ((flag)|  (bit))
57 #define RESET_FLAG1(flag, bit)     ((flag)&  (~(bit)))
58 
59 ////////////////////////////////////////////////////////////////////////////////////////////////
60 // QMEM base address
61 ////////////////////////////////////////////////////////////////////////////////////////////////
62 #define HAL_CIPHER_BASE_IQMEM            0x00000000UL
63 #define HAL_CIPHER_BASE_DQMEM            0x80000000UL
64 #define HAL_CIPHER_BASE_LUT              0x00000010
65 #define HAL_CIPHER_SIZE_LUT              256
66 #define HAL_CIPHER_BASE_M                0x00000110
67 #define HAL_CIPHER_SIZE_M                128
68 #define HAL_CIPHER_BASE_BC               0x00000190
69 #define HAL_CIPHER_SIZE_BC               16
70 
71 ////////////////////////////////////////////////////////////////////////////////////////////////
72 // IRQ
73 ////////////////////////////////////////////////////////////////////////////////////////////////
74 #define CRYPTODMA_IRQ       E_INT_FIQ_CA_CRYPTO_DMA  //halIRQTBL.h CryptoDMA FIQ 56
75 
76 ////////////////////////////////////////////////////////////////////////////////////////////////
77 // Except
78 ////////////////////////////////////////////////////////////////////////////////////////////////
79 #define HAL_CIPHER_EXCEPT_CAVID     0x0001UL
80 #define HAL_CIPHER_EXCEPT_DATA      0x0002UL
81 #define HAL_CIPHER_EXCEPT_ALGO      0x0004UL
82 #define HAL_CIPHER_EXCEPT_DMA_KEY   0x0008UL
83 #define HAL_CIPHER_EXCEPT_HMAC_KEY  0x0010UL
84 
85 ////////////////////////////////////////////////////////////////////////////////////////////////
86 // AESDMA Compatible
87 ////////////////////////////////////////////////////////////////////////////////////////////////
88 #define HAL_CIPHER_KEYSLOT_BASE     0x10UL
89 
90 typedef enum
91 {
92     E_CIPHER_CAVID1 = 0x0001,
93     E_CIPHER_CAVID2 = 0x0002,
94     E_CIPHER_CAVID3 = 0x0003,
95     E_CIPHER_CAVID4 = 0x0004,
96     E_CIPHER_CAVID5 = 0x0005,
97     E_CIPHER_CAVID6 = 0x0006,
98 }HAL_CIPHER_CAVID;
99 
100 /// SHA Mode
101 typedef enum
102 {
103     E_HASH_SHA1 = 0,
104     E_HASH_SHA256,
105     E_HASH_MD5,
106     E_HASH_SM3,
107 }HAL_CIPHER_HASHMODE;
108 
109 typedef enum
110 {
111     E_DMA_ALGO_NONE = 0,
112     E_DMA_ALGO_AES = 1,
113     E_DMA_ALGO_DES = 2,
114     E_DMA_ALGO_TDES = 3,
115     E_DMA_ALGO_M6_S56_CCBC = 4 ,
116     E_DMA_ALGO_M6_S56 =5 ,
117     E_DMA_ALGO_M6_KE56 = 7 ,
118     E_DMA_ALGO_RC4 = 8,
119     E_DMA_ALGO_RC4_128 = 9,
120     E_DMA_ALGO_SM4 = 10,
121 }HAL_CIPHER_ALGO;
122 
123 typedef enum
124 {
125     E_DMA_MODE_NONE = 0,
126     E_DMA_MODE_ECB = 0,
127     E_DMA_MODE_CBC,
128     E_DMA_MODE_CTR,
129     E_DMA_MODE_CBC_MAC,
130     E_DMA_MODE_CTR_64,
131 	E_DMA_MODE_CMAC_Key,
132     E_DMA_MODE_CMAC_Algo,
133     E_DMA_MODE_PCBC_ADD,
134     E_DMA_MODE_PCBC_XOR,
135     E_DMA_MODE_OTPHASH,
136     E_DMA_MODE_NUM,
137 
138 }HAL_CIPHER_MODE;
139 
140 typedef enum
141 {
142     // From KL
143     E_DMA_KSEL_SK0       = 0 ,
144     E_DMA_KSEL_SK1       = 1 ,
145     E_DMA_KSEL_SK2       = 2 ,
146     E_DMA_KSEL_SK3       = 3 ,
147 
148     // From OTP
149     E_DMA_KSEL_MK0       = 4 ,
150     E_DMA_KSEL_MK1       = 5 ,
151     E_DMA_KSEL_CCCK      = 6 ,
152     E_DMA_KSEL_STRN      = 7 ,
153 
154     // From CPU
155     E_DMA_KSEL_REGKEY,
156 
157 	//From NSK
158     E_DMA_KSEL_CAIP,
159 
160 }HAL_CIPHER_KEYSRC;
161 
162 typedef enum
163 {
164     E_DMA_AES_KEY128       = 16 ,
165     E_DMA_AES_KEY192       = 24 ,
166     E_DMA_AES_KEY256       = 32 ,
167 }HAL_CIPHER_AES_KEYLEN;
168 
169 typedef enum
170 {
171     E_DMA_SRC_DIRECT   = 0 ,
172     E_DMA_SRC_DRAM     = 1 ,
173     E_DMA_SRC_IQMEM    = 2 ,
174     E_DMA_SRC_DQMEM    = 2 ,
175     E_DMA_SRC_HW_INPUT = 3
176 }HAL_CIPHER_DATASRC;
177 
178 typedef enum
179 {
180     E_DMA_DST_DRAM     = 0 ,
181     E_DMA_DST_REGFILE  = 1 ,
182     E_DMA_DST_IQMEM    = 1 ,
183     E_DMA_DST_DQMEM    = 1 ,
184 }HAL_CIPHER_DATADST;
185 
186 typedef enum
187 {
188     E_DMA_RESIDUE_NONE   = 0 ,
189     E_DMA_RESIDUE_CLR    = 0 ,
190     E_DMA_RESIDUE_CTS    = 1 ,
191     E_DMA_RESIDUE_SCTE52 = 2 ,
192     E_DMA_RESIDUE_NUM ,
193 
194 }HAL_CIPHER_RESIDUE;
195 
196 typedef enum
197 {
198     E_DMA_SB_NONE   = 0 ,
199     E_DMA_SB_CLR    = 0 ,
200     E_DMA_SB_IV1   ,
201     E_DMA_SB_IV2  ,
202     E_DMA_SB_NUM  ,
203 
204 }HAL_CIPHER_SHORTBLOCK;
205 
206 typedef enum
207 {
208     E_DMA_INT_NONE    = 0 ,
209     E_DMA_INT_ENABLE  = 1 ,
210     E_DMA_INT_EN_WAIT = 2 ,
211 
212 }HAL_CIPHER_INTMODE;
213 
214 typedef enum
215 {
216     E_CIPHER_HASH_IWC_PRV = 0,
217     E_CIPHER_HASH_IWC_MANUAL,
218 }HAL_CIPHER_IWCTYPE;
219 
220 typedef enum
221 {
222     E_CIPHER_TYPE_DMA    = 0 ,
223     E_CIPHER_TYPE_SHA        ,
224     E_CIPHER_TYPE_OTPHASH    ,
225 
226 }HAL_CIPHER_CMDTYPE;
227 
228 typedef enum
229 {
230     E_PARSER_HDCPMODE_NONE = 0,
231     E_PARSER_HDCPMODE_HDCP20,
232 
233 }HAL_CIPHER_PARSER_HDCPMODE;
234 
235 typedef enum
236 {
237     E_PARSER_TSMODE_PES = 0,
238     E_PARSER_TSMODE_TS,
239 
240 }HAL_CIPHER_PARSER_TSMODE;
241 
242 typedef enum
243 {
244     E_PARSER_PKTMODE_188 = 0,
245     E_PARSER_PKTMODE_192,
246 
247 }HAL_CIPHER_PARSER_PKTMODE;
248 
249 typedef enum
250 {
251     E_PARSER_AUTOMODE_NONE = 0,
252     E_PARSER_AUTOMODE_EN,
253 
254 }HAL_CIPHER_PARSER_AUTOMODE;
255 
256 typedef enum
257 {
258     E_PARSER_ITMODE_NONE = 0,
259     E_PARSER_ITMODE_EN,
260 
261 }HAL_CIPHER_PARSER_ITMODE;  //Init trust
262 
263 typedef enum
264 {
265     E_PARSER_CLEARMODE_NONE = 0,
266     E_PARSER_CLEARMODE_EN,
267 
268 }HAL_CIPHER_PARSER_CLEARMODE;
269 
270 //Tmp area, open to drv level latter
271 typedef struct
272 {
273 	MS_U32 u32ObfIdxR;
274 	MS_U32 u32ObfIdxW;
275 }DRV_CIPHER_OBF;
276 
277 typedef enum
278 {
279     E_CIPHER_PARSER_TS_PKT192 = 0,
280     E_CIPHER_PARSER_TS_PKT192_CLEAR,
281     E_CIPHER_PARSER_TS_PKT188,
282     E_CIPHER_PARSER_TS_PKT188_CLEAR,
283     E_CIPHER_PARSER_HDCP20_PKT192,
284     E_CIPHER_PARSER_HDCP20_PKT192_CLEAR,
285     E_CIPHER_PARSER_HDCP20_PKT188,
286     E_CIPHER_PARSER_HDCP20_PKT188_CLEAR,
287 } CIPHER_PARSER_MODE;
288 
289 typedef struct
290 {
291     MS_U8           *pu8PID0;
292     MS_U8           *pu8PID1;
293 }CIPHER_PARSER_PID;
294 
295 typedef enum
296 {
297     E_CIPHER_PARSER_SCB_NONE = 0,
298     E_CIPHER_PARSER_SCB_10,
299     E_CIPHER_PARSER_SCB_11,
300 } CIPHER_PARSER_SCB;
301 
302 typedef struct
303 {
304     CIPHER_PARSER_SCB  eSCB; //Transport Stream Scramble Pattern, decide 10 or 11 or 1x need to scrambled (TS layer)
305     CIPHER_PARSER_SCB  eFSCB;
306     MS_BOOL bTsScrbMask; //Transport Stream Mask
307     MS_BOOL bRmvScrb; //Remove Scramble
308     MS_BOOL bInScrb; //Insert Scramble
309 } CIPHER_PARSER_TSCFG;
310 
311 
312 typedef struct
313 {
314     DRV_CIPHER_ALGO stAlgo;
315     DRV_CIPHER_KEY  stKey;
316     DRV_CIPHER_DATA stInput;
317     DRV_CIPHER_DATA stOutput;
318     MS_BOOL         bDecrypt;
319     CIPHER_PARSER_MODE  eParserMode;
320     CIPHER_PARSER_TSCFG stTSCfg;
321     CIPHER_PARSER_PID   stPID;
322     DRV_CIPHER_KEY  stKey2;
323     MS_U32 u32CAVid;
324     MS_BOOL bClearHead;
325     P_DrvCIPHER_EvtCallback pfCallback;
326 }CIPHER_PARSERCFG;
327 
328 ////////////////////////////////////////////////
329 // HAL API
330 ////////////////////////////////////////////////
331 void HAL_CIPHER_SetBank(MS_VIRT u32BankAddr) ;
332 void HAL_CIPHER_ResetStatus(MS_BOOL RstDma , MS_BOOL RstSha);
333 void HAL_CIPHER_ResetException(void);
334 MS_BOOL HAL_CIPHER_ResetKey(MS_U32 u32KeyIdx);
335 void HAL_CIPHER_SetDbgLevel(CIPHER_DBGMSG_LEVEL eDBGMsgLevel);
336 
337 void HAL_CIPHER_SWReset(void);
338 
339 void HAL_CIPHER_DMA_Set_InputSrcFrom(CIPHER_MEM_TYPE InputSrcFrom, MS_U8* pu8Data, MS_U32 u32Size);
340 MS_BOOL HAL_CIPHER_DMA_Set_OutputDstTo(CIPHER_MEM_TYPE OutputDstTo, MS_U8* pu8Data, MS_U32 u32Size);
341 void HAL_CIPHER_DMA_Set_OutputDstKL(MS_BOOL bDstKL);
342 
343 
344 void HAL_CIPHER_DMA_Set_FileinDesc(MS_PHY FileinAddr, MS_U32 u32FileinNum);
345 void HAL_CIPHER_DMA_Set_FileoutDesc(MS_PHY FileoutSAddr, MS_PHY phyFileoutEAddr);
346 void HAL_CIPHER_OTPHash_Set_FileinDesc(MS_PHY u32FileinAddr, MS_U32 u32FileinNum, MS_U32 u32CurrentRound, CIPHER_MEM_TYPE eInputSrcFrom);
347 
348 MS_BOOL HAL_CIPHER_DMA_Set_Key(DRV_CIPHER_KEY stKey);
349 void HAL_CIPHER_DMA_Set_IV(MS_U8* pu8IV, MS_U32 u32Size);
350 
351 MS_BOOL HAL_CIPHER_DMA_Set_Data(MS_U8* pu8Data, MS_U32 u32Size);
352 void HAL_CIPHER_DMA_Set_Config(MS_BOOL OutputReg);
353 void HAL_CIPHER_DMA_Set_ReportMode(MS_BOOL RptInDram, MS_PHY u32DramAddr);
354 
355 void HAL_CIPHER_DMA_Set_DataSwap(MS_BOOL InDataSwap , MS_BOOL OutDataSwap,
356                                 MS_BOOL DInByteSwap, MS_BOOL DOutByteSwap );
357 
358 void HAL_CIPHER_DMA_Set_Algo(DRV_CIPHER_ALGO stAlgo);
359 
360 void HAL_CIPHER_DMA_Set_OTPHash(MS_U32 u32CurrentRound, MS_U32 u32OTPHashRound);
361 
362 MS_BOOL HAL_CIPHER_DMA_Start(MS_BOOL Decrypt , HAL_CIPHER_INTMODE IntMode , MS_BOOL bWaitCmdQ, MS_U16 u16CmdID);
363 MS_BOOL HAL_CIPHER_OTPHash_Start(HAL_CIPHER_INTMODE IntMode , MS_BOOL bWaitCmdQ, MS_U16 u16CmdID);
364 MS_BOOL HAL_CIPHER_DMA_CmdDone(MS_U32 u32CmdID, MS_U32 *u32Ret);
365 
366 void HAL_CIPHER_DMA_WriteCMDQ(MS_U32 u32Cmd);
367 
368 MS_BOOL HAL_CIPHER_DMA_Set_CaVid(MS_U32 u32CAVid);
369 
370 void HAL_CIPHER_DMA_GetRpt(MS_U32 *DmaRpt);
371 void HAL_CIPHER_DMA_GetData(MS_U8 *u8Data) ;
372 void HAL_CIPHER_DMA_AlgoTable_Init(void);
373 MS_BOOL HAL_CIPHER_DMA_CheckAlgo(HAL_CIPHER_ALGO eAlgo, HAL_CIPHER_MODE eMode, HAL_CIPHER_RESIDUE eRes, HAL_CIPHER_SHORTBLOCK eSB);
374 void HAL_CIPHER_Hash_SetMsgLength( MS_U32 u32Size );
375 MS_BOOL HAL_CIPHER_Hash_SetMsg(MS_PHY u32MsgPAddr, MS_U32 u32Size ,MS_U32 u32SrcSel );
376 void HAL_CIPHER_Hash_SetHOS(MS_BOOL bHos);
377 MS_BOOL HAL_CIPHER_Hash_Start(HAL_CIPHER_INTMODE IntMode , MS_BOOL bWaitCmdQ , MS_BOOL bRst, MS_U16 u16CmdID);
378 MS_BOOL HAL_CIPHER_Hash_Set_OuputAddr(MS_PHY u32OutputPAddr, MS_U32 u32DstSel);
379 MS_BOOL HAL_CIPHER_Hash_Set_InitWordCnt(HAL_CIPHER_IWCTYPE eIWCType, MS_U32 u32StartBytes);
380 MS_BOOL HAL_CIPHER_Hash_Set_IV(MS_U8* pu8IV, MS_U32 u32IVSize ,MS_U32 u32IVSel);
381 MS_BOOL HAL_CIPHER_Hash_Set_CaVid(MS_U32 u32CAVid);
382 void HAL_CIPHER_Hash_Set_Config(CIPHER_HASH_ALGO algo , MS_BOOL bAutoPad , MS_BOOL bInv16);
383 void HAL_CIPHER_Hash_GetRpt(MS_U32 *HashRpt, MS_U32 u32Size);
384 MS_BOOL HAL_CIPHER_Hash_SetHMACKey(DRV_CIPHER_HMAC_KEY stHMACKey, CIPHER_HMAC_KPAD eKpad, MS_BOOL bClear);
385 MS_BOOL HAL_CIPHER_Hash_CmdDone(MS_U32 u32CmdID, MS_U32 *u32Ret);
386 MS_BOOL HAL_CIPHER_Hash_Set_MsgSrcFrom(CIPHER_MEM_TYPE eMemType, MS_U32 *u32HashSrc);
387 MS_BOOL HAL_CIPHER_Hash_Set_OutputDstTo(CIPHER_MEM_TYPE eMemType, MS_U32 *u32HashDst);
388 void HAL_CIPHER_Hash_Set_ReportMode(MS_BOOL RptInDram, MS_U32 u32DramAddr);
389 void HAL_CIPHER_Hash_ExceptFilter(MS_U32 *pu32Exception, CIPHER_KEY_SRC eKeySrc, MS_U8 u8KeyIdx);
390 
391 MS_U32 HAL_CIPHER_ReadException(MS_U32 u32ExcTmp);
392 void HAL_CIPHER_GetException(MS_U32 *pu32ExcFlag);
393 
394 void HAL_CIPHER_IntEnable(void);
395 void HAL_CIPHER_IntClear(void);
396 
397 //=============PARSER=================================
398 void HAL_CIPHER_PARSER_Set_Mode(CIPHER_PARSER_MODE eMode);
399 void HAL_CIPHER_PARSER_Set_PID(CIPHER_PARSER_PID stPID);
400 void HAL_CIPHER_PARSER_Set_SCB(CIPHER_PARSER_SCB eSCB);
401 void HAL_CIPHER_PARSER_Set_ForceSCB(MS_BOOL bInsert, CIPHER_PARSER_SCB eSCB);
402 MS_BOOL HAL_CIPHER_PARSER_Set_IV2(MS_U8 *pu8IV2, MS_U8 u8IVLen);
403 MS_BOOL HAL_CIPHER_PARSER_Set_Key2(DRV_CIPHER_KEY stKey);
404 void HAL_CIPHER_PARSER_Set_MaskSCB(MS_BOOL bEnable);
405 void HAL_CIPHER_PARSER_Rmv_SCB(MS_BOOL bRemove);
406 void HAL_CIPHER_PARSER_BypassPid(MS_BOOL bEnable);
407 void HAL_CIPHER_PARSER_Set_ClearStartMode(MS_BOOL bEnable);
408 //MISC Function
409 MS_BOOL HAL_CIPHER_Misc_Random(MS_U8 *pu8Buf, MS_U32 u32Size);
410 MS_BOOL HAL_CIPHER_Set_OBFIdx(MS_BOOL bDMA, MS_U8 u8ReadIdx, MS_U8 u8WriteIdx);
411 
412 #endif // #ifndef __HAL_CIPHER_H__
413 
414