1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 // Software and any modification/derivatives thereof.
18 // No right, ownership, or interest to MStar Software and any
19 // modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 // supplied together with third party`s software and the use of MStar
23 // Software may require additional licenses from third parties.
24 // Therefore, you hereby agree it is your sole responsibility to separately
25 // obtain any and all third party right and license necessary for your use of
26 // such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 // MStar`s confidential information and you agree to keep MStar`s
30 // confidential information in strictest confidence and not disclose to any
31 // third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 // kind. Any warranties are hereby expressly disclaimed by MStar, including
35 // without limitation, any warranties of merchantability, non-infringement of
36 // intellectual property rights, fitness for a particular purpose, error free
37 // and in conformity with any international standard. You agree to waive any
38 // claim against MStar for any loss, damage, cost or expense that you may
39 // incur related to your use of MStar Software.
40 // In no event shall MStar be liable for any direct, indirect, incidental or
41 // consequential damages, including without limitation, lost of profit or
42 // revenues, lost or damage of data, and unauthorized system use.
43 // You agree that this Section 4 shall still apply without being affected
44 // even if MStar Software has been modified by MStar in accordance with your
45 // request or instruction for your use, except otherwise agreed by both
46 // parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 // services in relation with MStar Software to you for your use of
50 // MStar Software in conjunction with your or your customer`s product
51 // ("Services").
52 // You understand and agree that, except otherwise agreed by both parties in
53 // writing, Services are provided on an "AS IS" basis and the warranty
54 // disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 // or otherwise:
58 // (a) conferring any license or right to use MStar name, trademark, service
59 // mark, symbol or any other identification;
60 // (b) obligating MStar or any of its affiliates to furnish any person,
61 // including without limitation, you and your customers, any assistance
62 // of any kind whatsoever, or any information; or
63 // (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 // of Taiwan, R.O.C., excluding its conflict of law rules.
67 // Any and all dispute arising out hereof or related hereto shall be finally
68 // settled by arbitration referred to the Chinese Arbitration Association,
69 // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 // Rules of the Association by three (3) arbitrators appointed in accordance
71 // with the said Rules.
72 // The place of arbitration shall be in Taipei, Taiwan and the language shall
73 // be English.
74 // The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2006-2009 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94
95 ////////////////////////////////////////////////////////////////////////////////////////////////////
96 // file halAESDMA.c
97 // @brief AESDMA HAL
98 // @author MStar Semiconductor,Inc.
99 ////////////////////////////////////////////////////////////////////////////////////////////////////
100
101 #include "MsCommon.h"
102 #include "regAESDMA.h"
103 #include "halAESDMA.h"
104 #include "halCHIP.h"
105
106 static int _gSealLocalDelayVar;
107 #define __delay() {int i=0; for (i=0; i<1000; i+=2) {i=i-1; _gSealLocalDelayVar+=i;}}
108
109 //--------------------------------------------------------------------------------------------------
110 // Driver Compiler Option
111 //--------------------------------------------------------------------------------------------------
112 #define AESDMS_SECURED_BANK_EN 0
113
114 //--------------------------------------------------------------------------------------------------
115 // TSP Hardware Abstraction Layer
116 //--------------------------------------------------------------------------------------------------
117 static MS_VIRT _u32RegBase = NULL;
118 static MS_VIRT _u32PmRegBase = NULL;
119 static REG_AESDMACtrl *_AESDMACtrl = (REG_AESDMACtrl*)REG_AESDMACTRL_BASE;
120 static REG_SHARNGCtrl *_SHARNGCtrl = (REG_SHARNGCtrl*)REG_SHARNGCTRL_BASE;
121 static REG_AESDMAClk *_AESDMAClk = (REG_AESDMAClk*)REG_AESDMACLK_BASE;
122 static REG_AESDMAMbx *_AESDMAMbx = (REG_AESDMAMbx*)REG_AESDMAMBX_BASE;
123 static REG_PARSERCtrl *_PARSERCtrl = (REG_PARSERCtrl*)REG_PARSERCTRL_BASE;
124 static REG_CIPHERCtrl *_CIPHERCtrl = (REG_CIPHERCtrl*)REG_CIPHERCTRL_BASE;
125 static REG_DMASECURECtrl *_DMASECURECtrl = (REG_DMASECURECtrl*)REG_DMASECURE_BASE;
126 static REG_SECUREBASECtrl *_SECUREBASECtrl = (REG_SECUREBASECtrl*)REG_DMASECURE_CTRL_BASE;
127 static REG_AESDMACtrlEx *_AESDMACtrlEx = (REG_AESDMACtrlEx*)REG_AESDMAEXT_BASE;
128 static REG_TZPCCtrl *_TZPCCtrl = (REG_TZPCCtrl*)REG_TZPC_NONPM_BASE;
129 static REG_HDCP22Data *_HDCP22Data = (REG_HDCP22Data*)REG_HDCP22_BASE;
130 static REG_HDCP22SEKCtrl *_HDCP22SekCtrl = (REG_HDCP22SEKCtrl*)REG_HDCP22_SEK;
131 static REG_ANAMISCBASECtrl *_ANAMISCCtrl = (REG_ANAMISCBASECtrl*)REG_ANA_MISC_BASE;
132 static REG_AES_DSCMB6Ctrl *_AESDSCMB6Ctrl = (REG_AES_DSCMB6Ctrl*)REG_AES_DSCMB6_BASE;
133 static REG_AES_DSCMB7Ctrl *_AESDSCMB7Ctrl = (REG_AES_DSCMB7Ctrl*)REG_AES_DSCMB7_BASE;
134
135 #define REG32_W(reg, value) do { \
136 (reg)->H = ((value) >> 16); \
137 (reg)->L = ((value) & 0x0000FFFF); \
138 } while(0)
139
140 //--------------------------------------------------------------------------------------------------
141 // Macro of bit operations
142 //--------------------------------------------------------------------------------------------------
143
_AESDMA_REG32_R(REG32 * reg)144 MS_U32 _AESDMA_REG32_R(REG32 *reg)
145 {
146 MS_U32 value;
147
148 value = (reg)->H << 16;
149 value |= (reg)->L;
150
151 return value;
152 }
153
154 //--------------------------------------------------------------------------------------------------
155 // Inline Function
156 //--------------------------------------------------------------------------------------------------
HAL_AESDMA_SetBank(MS_VIRT u32NonPmBankAddr,MS_VIRT u32PmBankAddr)157 void HAL_AESDMA_SetBank(MS_VIRT u32NonPmBankAddr, MS_VIRT u32PmBankAddr)
158 {
159 _u32RegBase = u32NonPmBankAddr;
160 _u32PmRegBase = u32PmBankAddr;
161 _AESDMACtrl = (REG_AESDMACtrl*)(_u32RegBase + REG_AESDMACTRL_BASE);
162 _SHARNGCtrl = (REG_SHARNGCtrl*)(_u32RegBase + REG_SHARNGCTRL_BASE);
163 _AESDMAClk = (REG_AESDMAClk*)(_u32RegBase + REG_AESDMACLK_BASE);
164 _AESDMAMbx = (REG_AESDMAMbx*)(_u32PmRegBase + REG_AESDMAMBX_BASE);
165 _PARSERCtrl = (REG_PARSERCtrl*)(_u32RegBase + REG_PARSERCTRL_BASE);
166 _CIPHERCtrl = (REG_CIPHERCtrl*)(_u32RegBase + REG_CIPHERCTRL_BASE);
167 _DMASECURECtrl = (REG_DMASECURECtrl*)(_u32RegBase + REG_DMASECURE_BASE);
168 _SECUREBASECtrl = (REG_SECUREBASECtrl*)(_u32RegBase + REG_DMASECURE_CTRL_BASE);
169 _AESDMACtrlEx = (REG_AESDMACtrlEx*)(_u32RegBase + REG_AESDMAEXT_BASE);
170 _TZPCCtrl = (REG_TZPCCtrl*)(_u32RegBase + REG_TZPC_NONPM_BASE);
171 _HDCP22Data = (REG_HDCP22Data*)(_u32RegBase + REG_HDCP22_BASE);
172 _HDCP22SekCtrl = (REG_HDCP22SEKCtrl*)(_u32RegBase + REG_HDCP22_SEK);
173 _ANAMISCCtrl = (REG_ANAMISCBASECtrl*)(_u32RegBase + REG_ANA_MISC_BASE);
174 _AESDSCMB6Ctrl = (REG_AES_DSCMB6Ctrl*)(_u32RegBase + REG_AES_DSCMB6_BASE);
175 _AESDSCMB7Ctrl = (REG_AES_DSCMB7Ctrl*)(_u32RegBase + REG_AES_DSCMB7_BASE);
176 }
177
AESDMA_GetMIU1Base(void)178 MS_PHY AESDMA_GetMIU1Base(void)
179 {
180 return HAL_MIU1_BASE;
181 }
182
AESDMA_GetMIU2Base(void)183 MS_PHY AESDMA_GetMIU2Base(void)
184 {
185 //not support
186 return FALSE;
187 }
188
AESDMA_Reset(void)189 void AESDMA_Reset(void)
190 {
191 MS_VIRT Reg_AESDMA;
192 MS_U32 i = 0;
193 Reg_AESDMA = (MS_VIRT)(&_AESDMACtrl[0].Dma_Ctrl);
194
195 REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , 0x00000000); // clear ctrl register
196 REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl)|(AESDMA_CTRL_SW_RST)); // sw rst
197 REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl)&~(AESDMA_CTRL_SW_RST));
198
199 // reset all AESdma register
200 for (i = 0 ; i < 19 ; i++)
201 {
202 REG32_W((REG32 *)(Reg_AESDMA+(i*8)), 0x00000000);
203 }
204 // reset secure_dma3_ctrl register
205 REG32_W((&_DMASECURECtrl[0].Secure_dma3_ctrl), 0x00000000);
206
207 // reset hw_parser_ctrl register
208 REG32_W((&_PARSERCtrl[0].Parser_Pid1),0x00000000);
209 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),0x00000000);
210 }
211
AESDMA_Set_CipherKey(MS_U32 * cipherkey)212 void AESDMA_Set_CipherKey(MS_U32 *cipherkey)
213 {
214 REG32_W((&_AESDMACtrl[0].Dma_CipherKey_L.Key_L) , cipherkey[0]);
215 REG32_W((&_AESDMACtrl[0].Dma_CipherKey_L.Key_H) , cipherkey[1]);
216 REG32_W((&_AESDMACtrl[0].Dma_CipherKey_H.Key_L) , cipherkey[2]);
217 REG32_W((&_AESDMACtrl[0].Dma_CipherKey_H.Key_H) , cipherkey[3]);
218 }
219
AESDMA_Set_InitVector(MS_U32 * pInitVector)220 void AESDMA_Set_InitVector(MS_U32 *pInitVector)
221 {
222 REG32_W((&_AESDMACtrl[0].Dma_InitVector_L.IV_L), pInitVector[0]);
223 REG32_W((&_AESDMACtrl[0].Dma_InitVector_L.IV_H), pInitVector[1]);
224 REG32_W((&_AESDMACtrl[0].Dma_InitVector_H.IV_L), pInitVector[2]);
225 REG32_W((&_AESDMACtrl[0].Dma_InitVector_H.IV_H), pInitVector[3]);
226 }
227
AESDMA_Sel_Key(MS_BOOL keysel)228 void AESDMA_Sel_Key(MS_BOOL keysel)
229 {
230 }
231
AESDMA_Sel_SecureKey(void)232 void AESDMA_Sel_SecureKey(void)
233 {
234 MS_U32 u32Ctrl = _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2);
235 u32Ctrl |= AESDMA_USE_SECRET_KEY;
236 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2), u32Ctrl);
237 }
238
AESDMA_Set_FileinDesc(MS_PHY FileinAddr,MS_PHY FileinNum)239 void AESDMA_Set_FileinDesc(MS_PHY FileinAddr , MS_PHY FileinNum)
240 {
241 REG32_W((&_AESDMACtrl[0].Dma_Filein_Addr), FileinAddr);
242 REG32_W((&_AESDMACtrl[0].Dma_Filein_Num), FileinNum);
243 }
244
AESDMA_Set_FileoutDesc(MS_PHY FileoutSAddr,MS_PHY FileoutEAddr)245 void AESDMA_Set_FileoutDesc(MS_PHY FileoutSAddr , MS_PHY FileoutEAddr)
246 {
247 REG32_W((&_AESDMACtrl[0].Dma_Fileout_SAddr), FileoutSAddr);
248 REG32_W((&_AESDMACtrl[0].Dma_Fileout_EAddr), FileoutEAddr);
249 }
250
AESDMA_Start(MS_BOOL AESDMAStart)251 void AESDMA_Start(MS_BOOL AESDMAStart)
252 {
253 if (AESDMAStart)
254 {
255 REG32_W((&_AESDMACtrl[0].Dma_Ctrl), (_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl) &~ AESDMA_CTRL_FILEOUT_START &~ AESDMA_CTRL_FILEIN_START));
256 REG32_W((&_AESDMACtrl[0].Dma_Ctrl), (_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl) | AESDMA_CTRL_FILEOUT_START | AESDMA_CTRL_FILEIN_START));
257 }
258 else
259 {
260 REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl)&~(AESDMA_CTRL_FILEOUT_START|AESDMA_CTRL_FILEIN_START));
261 }
262 }
263
AESDMA_Set_PS_PTN(MS_U32 MatchPTN)264 void AESDMA_Set_PS_PTN(MS_U32 MatchPTN)
265 {
266 REG32_W((&_AESDMACtrl[0].Dma_PS_Pattern) , MatchPTN);
267 }
268
AESDMA_Set_PS_Mask(MS_U32 MatchMask)269 void AESDMA_Set_PS_Mask(MS_U32 MatchMask)
270 {
271 REG32_W((&_AESDMACtrl[0].Dma_PS_Pattern_Mask) , MatchMask);
272 }
273
AESDMA_Set_PS_ENG(MS_BOOL PSin_en,MS_BOOL PSout_en)274 void AESDMA_Set_PS_ENG(MS_BOOL PSin_en, MS_BOOL PSout_en)
275 {
276 MS_U32 u32PSin, u32PSout;
277
278 u32PSin = AESDMA_ENG_PS_IN_EN & (PSin_en<<20);
279 u32PSout = AESDMA_ENG_PS_OUT_EN & (PSout_en<<21);
280
281 REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl)|(u32PSin|u32PSout));
282 }
283
AESDMA_Get_PS_MatchedBytecnt(void)284 MS_U32 AESDMA_Get_PS_MatchedBytecnt(void)
285 {
286 return _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Matched_Btyecnt);
287 }
288
AESDMA_Get_PS_MatchedPTN(void)289 MS_U32 AESDMA_Get_PS_MatchedPTN(void)
290 {
291 return _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Matched_Pat);
292 }
293
AESDMA_Set_PS_Release(void)294 void AESDMA_Set_PS_Release(void)
295 {
296 REG32_W((&_AESDMACtrl[0].Dma_Ctrl), _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl)|AESDMA_ENG_PS_RELEASE);
297 REG32_W((&_AESDMACtrl[0].Dma_Ctrl), _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl) & ~AESDMA_ENG_PS_RELEASE);
298 }
299
AESDMA_Get_AESDMA_Status(void)300 MS_U32 AESDMA_Get_AESDMA_Status(void)
301 {
302 return _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_PVR_Status);
303 }
304
AESDMA_Get_AESDMA_IsFinished(void)305 MS_U32 AESDMA_Get_AESDMA_IsFinished(void)
306 {
307 return (_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_PVR_Status) & AESDMA_IS_FINISHED);
308 }
309
AESDMA_Set_CIPHER_ENG(AESDMA_CipherMode eMode,MS_BOOL Descrypt)310 void AESDMA_Set_CIPHER_ENG(AESDMA_CipherMode eMode, MS_BOOL Descrypt)
311 {
312 MS_U32 u32Cmd = 0;
313
314 switch (eMode)
315 {
316 case E_AESDMA_CIPHER_ECB:
317 u32Cmd |= AESDMA_ENG_AES_EN;
318 break;
319
320 case E_AESDMA_CIPHER_CTR:
321 u32Cmd |= (AESDMA_ENG_AES_EN | AESDMA_ENG_CTR_MODE);
322 break;
323
324 case E_AESDMA_CIPHER_CBC:
325 u32Cmd |= (AESDMA_ENG_AES_EN | AESDMA_ENG_CBC_MODE);
326 break;
327
328 case E_AESDMA_CIPHER_DES_ECB:
329 u32Cmd |= AESDMA_ENG_DES_EN;
330 break;
331
332 case E_AESDMA_CIPHER_DES_CTR:
333 u32Cmd |= (AESDMA_ENG_DES_EN | AESDMA_ENG_CTR_MODE);
334 break;
335
336 case E_AESDMA_CIPHER_DES_CBC:
337 u32Cmd |= (AESDMA_ENG_DES_EN | AESDMA_ENG_CBC_MODE);
338 break;
339
340 case E_AESDMA_CIPHER_TDES_ECB:
341 u32Cmd |= AESDMA_ENG_TDES_EN;
342 break;
343
344 case E_AESDMA_CIPHER_TDES_CTR:
345 u32Cmd |= (AESDMA_ENG_TDES_EN | AESDMA_ENG_CTR_MODE);
346 break;
347
348 case E_AESDMA_CIPHER_TDES_CBC:
349 u32Cmd |= (AESDMA_ENG_TDES_EN | AESDMA_ENG_CBC_MODE);
350 break;
351
352 case E_AESDMA_CIPHER_CTS_CBC:
353 u32Cmd |= (AESDMA_ENG_AES_EN | AESDMA_ENG_CTS_CBC_MODE);
354 break;
355
356 case E_AESDMA_CIPHER_CTS_ECB:
357 u32Cmd |= (AESDMA_ENG_AES_EN | AESDMA_ENG_CTS_ECB_MODE);
358 break;
359
360 case E_AESDMA_CIPHER_DES_CTS_CBC:
361 u32Cmd |= (AESDMA_ENG_DES_EN | AESDMA_ENG_CTS_CBC_MODE);
362 break;
363
364 case E_AESDMA_CIPHER_DES_CTS_ECB:
365 u32Cmd |= (AESDMA_ENG_DES_EN | AESDMA_ENG_CTS_ECB_MODE);
366 break;
367
368 case E_AESDMA_CIPHER_TDES_CTS_CBC:
369 u32Cmd |= (AESDMA_ENG_TDES_EN | AESDMA_ENG_CTS_CBC_MODE);
370 break;
371
372 case E_AESDMA_CIPHER_TDES_CTS_ECB:
373 u32Cmd |= (AESDMA_ENG_TDES_EN | AESDMA_ENG_CTS_ECB_MODE);
374 break;
375 default:
376 return;
377 }
378
379 if( eMode >= E_AESDMA_CIPHER_DES_ECB )
380 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2),_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2) | AESDMA_DMA_USE_TDES_EN);
381
382 u32Cmd |= AESDMA_ENG_DESCRYPT & (Descrypt<<25);
383 REG32_W((&_AESDMACtrl[0].Dma_Ctrl),(( _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl) & (~DmaCtrlSet)) | u32Cmd ) );
384 }
385
AESDMA_QueryCipherMode(AESDMA_CipherMode eMode)386 MS_U32 AESDMA_QueryCipherMode(AESDMA_CipherMode eMode)
387 {
388 MS_U32 u32Result = 1;
389
390 switch (eMode)
391 {
392 case E_AESDMA_CIPHER_ECB:
393 case E_AESDMA_CIPHER_CTR:
394 case E_AESDMA_CIPHER_CBC:
395 case E_AESDMA_CIPHER_DES_ECB:
396 case E_AESDMA_CIPHER_DES_CTR:
397 case E_AESDMA_CIPHER_DES_CBC:
398 case E_AESDMA_CIPHER_TDES_ECB:
399 case E_AESDMA_CIPHER_TDES_CTR:
400 case E_AESDMA_CIPHER_TDES_CBC:
401 case E_AESDMA_CIPHER_CTS_CBC:
402 case E_AESDMA_CIPHER_CTS_ECB:
403 case E_AESDMA_CIPHER_DES_CTS_CBC:
404 case E_AESDMA_CIPHER_DES_CTS_ECB:
405 case E_AESDMA_CIPHER_TDES_CTS_CBC:
406 case E_AESDMA_CIPHER_TDES_CTS_ECB:
407 u32Result = 0;
408 break;
409 default:
410 break;
411 }
412 return u32Result;
413
414 }
415
AESDMA_Set_MIU_Path(MS_BOOL MIU_R,MS_BOOL MIU_W)416 void AESDMA_Set_MIU_Path(MS_BOOL MIU_R, MS_BOOL MIU_W)
417 {
418 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2), RESET_FLAG1(_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2), AESDMA_CTRL_BANK_R));
419 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2), RESET_FLAG1(_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2), AESDMA_CTRL_BANK_W));
420
421 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2), SET_FLAG1(_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2), (AESDMA_CTRL_BANK_R & ((MS_U32)MIU_R << 4))));
422 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2), SET_FLAG1(_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2), (AESDMA_CTRL_BANK_W & ((MS_U32)MIU_W << 5))));
423 }
424
AESDMA_Set_MIU2_Path(MS_BOOL MIU_R,MS_BOOL MIU_W)425 void AESDMA_Set_MIU2_Path(MS_BOOL MIU_R, MS_BOOL MIU_W)
426 {
427 // Not support
428 }
429
AESDMA_Enable_Int(void)430 void AESDMA_Enable_Int(void)
431 {
432 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2)|AESDMA_INT_EN);
433 }
434
AESDMA_Disable_Int(void)435 void AESDMA_Disable_Int(void)
436 {
437 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2)&~AESDMA_INT_EN);
438 }
439
AESDMA_Clear_Int(void)440 void AESDMA_Clear_Int(void)
441 {
442 //
443 // Since ISR Clear bit for Normal and Secured bank is independently, it must be reset individually
444 //
445
446 #if AESDMS_SECURED_BANK_EN
447 //
448 // For Secured Bank
449 //
450 REG32_W((&_AESDSCMB6Ctrl[0].Reg0001) , _AESDMA_REG32_R(&_AESDSCMB6Ctrl[0].Reg0001)|AESDMA_ISR_CLR);
451 REG32_W((&_AESDSCMB6Ctrl[0].Reg0001) , _AESDMA_REG32_R(&_AESDSCMB6Ctrl[0].Reg0001)&~AESDMA_ISR_CLR);
452 #else
453 //
454 // For Normal Bank
455 //
456 REG32_W((&_AESDSCMB7Ctrl[0].Reg0001) , _AESDMA_REG32_R(&_AESDSCMB7Ctrl[0].Reg0001)|AESDMA_ISR_CLR);
457 REG32_W((&_AESDSCMB7Ctrl[0].Reg0001) , _AESDMA_REG32_R(&_AESDSCMB7Ctrl[0].Reg0001)&~AESDMA_ISR_CLR);
458 #endif //#if AESDMS_SECURED_BANK_EN
459 }
460
AESDMA_HW_Patch(void)461 void AESDMA_HW_Patch(void)
462 {
463 REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl)|AESDMA_ECO_FIX_LAST_BYTE);
464 //REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl)|AESDMA_CTRL_BURST_LENGTH);
465 //REG32_W((&_AESDMACtrl[0].Dma_Eng3_Ctrl) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Eng3_Ctrl)|AESDMA_ENG_SPEEDUP);
466 }
467
AESDMA_Enable_Clk(void)468 void AESDMA_Enable_Clk(void)
469 {
470 MS_U32 u32Val;
471
472 //1. clk_aesdma, 0x100A_19[3:0] = 0
473 u32Val = _AESDMA_REG32_R(&_AESDMAClk[0].Reg_Gate_Clk_AESDMA);
474 u32Val &= ~AESDMA_CLK_XTAL; //Clear Clk setting.
475 u32Val |= AESDMA_CLK_172M; //Set Clk to 172M
476 u32Val &= ~AESDMA_CLK_OFF_EN;//Enable Clk
477 REG32_W((&_AESDMAClk[0].Reg_Gate_Clk_AESDMA) , u32Val);
478
479 #if 0
480 //
481 // Due to the security concern
482 // Set this CLK at SBOOT
483 //
484 #if defined (__aarch64__)
485 //Enable clk_rc: 0x1239_0x03 = 0x004F
486 #else
487 //2. clk_rc
488 u32Val = _AESDMA_REG32_R(&_TZPCCtrl[0].Reg0203);
489 u32Val &= 0x0000FFFF; //Clear 0x3
490 u32Val |= 0x004F0000; //0x1239_0x03 = 0x004F
491 REG32_W((&_TZPCCtrl[0].Reg0203) , u32Val);
492 #endif
493 #endif
494
495 //3. Enable Rng
496 u32Val = _AESDMA_REG32_R(&_SECUREBASECtrl[0].Reg0001);
497 u32Val |= REG_RNG_EN;
498 REG32_W((&_SECUREBASECtrl[0].Reg0001) , u32Val);
499
500 //4. 0x110C_11[9], reg_mipspll_occclk2_en, For Random number Gen, Manhattan only
501 u32Val = _AESDMA_REG32_R(&_ANAMISCCtrl[0].Reg0001);
502 u32Val |= REG_MIPSPLL_OCCCLK2_EN;
503 REG32_W((&_ANAMISCCtrl[0].Reg0001) , u32Val);
504 }
505
AESDMA_Disable_Clk(void)506 void AESDMA_Disable_Clk(void)
507 {
508 REG32_W((&_AESDMAClk[0].Reg_Gate_Clk_AESDMA) , _AESDMA_REG32_R(&_AESDMAClk[0].Reg_Gate_Clk_AESDMA) | AESDMA_CLK_OFF_EN);
509 }
510
AESDMA_Rand(void)511 MS_U8 AESDMA_Rand(void)
512 {
513 MS_U8 u8RN = 0x00;
514 int retryCount = 5000;
515
516 __delay(); // delay a short time to prevent CPU accessing too quick and get same register value
517 while(retryCount-- && !(_AESDMA_REG32_R(&_SECUREBASECtrl[0].Reg0203)®_RNG_READY));
518
519 u8RN = (MS_U8)_AESDMA_REG32_R(&_SECUREBASECtrl[0].Reg0203)&0xFF;
520
521 return u8RN;
522 }
523
SHA_Reset(void)524 void SHA_Reset(void)
525 {
526 MS_VIRT Reg_SHARNG;
527 MS_U32 i = 0;
528 Reg_SHARNG = (MS_VIRT)(&_SHARNGCtrl[0].Sha_Ctrl);
529 REG32_W((&_SHARNGCtrl[0].Sha_Ctrl) , SHARNG_CTRL_SHA_RST); // 0->1
530 REG32_W((&_SHARNGCtrl[0].Sha_Ctrl) , (_AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Ctrl)&(~SHARNG_CTRL_SHA_RST))); // 1->0
531
532 // reset all SHA & RNG register
533 for (i = 0 ; i < 7 ; i++)
534 {
535 REG32_W((REG32 *)(Reg_SHARNG+(i*8)), 0x00000000);
536 }
537 }
538
SHA_Get_Status(void)539 MS_U32 SHA_Get_Status(void)
540 {
541 return _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Status);
542 }
543
SHA_SelMode(AESDMA_SHAMode eMode)544 void SHA_SelMode(AESDMA_SHAMode eMode)
545 {
546 MS_U32 u32Cmd = 0;
547
548 switch (eMode)
549 {
550 case E_AESDMA_SHA1:
551 u32Cmd |= (SHARNG_CTRL_SHA_MSG_BLOCK_NUM);
552 break;
553
554 case E_AESDMA_SHA256:
555 u32Cmd |= (SHARNG_CTRL_SHA_SEL_SHA256 | SHARNG_CTRL_SHA_MSG_BLOCK_NUM);
556 break;
557
558 default:
559 return;
560 }
561
562 //Turn off speedup mode
563 //u32Cmd |= SHARNG_CTRL_SPEED_MODE_N;
564
565 REG32_W((&_SHARNGCtrl[0].Sha_Ctrl), _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Ctrl) | u32Cmd);
566 }
567
SHA_SetAddress(MS_PHY u32Addr)568 void SHA_SetAddress(MS_PHY u32Addr)
569 {
570 REG32_W((&_SHARNGCtrl[0].Sha_Start), u32Addr);
571 }
572
SHA_SetLength(MS_U32 u32Size)573 void SHA_SetLength(MS_U32 u32Size)
574 {
575 REG32_W((&_SHARNGCtrl[0].Sha_Length), u32Size);
576 }
577
SHA_Start(MS_BOOL SHAStart)578 void SHA_Start(MS_BOOL SHAStart)
579 {
580 if(SHAStart)
581 {
582 REG32_W((&_SHARNGCtrl[0].Sha_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Ctrl)&~(SHARNG_CTRL_SHA_FIRE_ONCE));
583 REG32_W((&_SHARNGCtrl[0].Sha_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Ctrl)|(SHARNG_CTRL_SHA_FIRE_ONCE));
584 }
585 else
586 {
587 REG32_W((&_SHARNGCtrl[0].Sha_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Ctrl)&~(SHARNG_CTRL_SHA_FIRE_ONCE));
588 }
589 }
590
SHA_Out(MS_VIRT u32Buf)591 void SHA_Out(MS_VIRT u32Buf)
592 {
593 MS_U32 Index, u32Size, u32offset;
594 MS_U32 eMode = _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Ctrl)&SHARNG_CTRL_SHA_SEL_SHA256;
595
596 if(eMode == SHARNG_CTRL_SHA_SEL_SHA256)
597 {
598 u32Size = DIGEST_SIZE_SHA256;
599 u32offset = 0;
600 }
601 else
602 {
603 u32Size = DIGEST_SIZE_SHA1;
604 u32offset = 3;
605 }
606
607 for( Index = 0; Index < u32Size; Index++ )
608 {
609 *((MS_U32 *)u32Buf + Index) = _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Out[Index + u32offset]);
610 }
611 //Set "1" to idle state after reg_read_sha_ready = 1
612 REG32_W((&_SHARNGCtrl[0].Sha_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Ctrl)|(SHARNG_CTRL_SHA_CLR));
613 }
614
615
616 //-------------------------------------------------------------------------------------------------
617 /// Enable mobf one way function
618 /// @param NULL
619
620 /// @note : disable read mobf key, and could not enable read mobf key anymore
621 //-------------------------------------------------------------------------------------------------
MOBF_OneWay(void)622 void MOBF_OneWay(void)
623 {
624 REG32_W((&_SHARNGCtrl[0].Rng_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl)|(MOBF_ONEWAY_EN));
625 }
626
627 //-------------------------------------------------------------------------------------------------
628 /// Set MOBF encrypt key
629 /// @param u32WriteKey \b IN: Encrypt Key
630
631 /// @note
632 //-------------------------------------------------------------------------------------------------
MOBF_WriteKey(MS_U32 u32WriteKey)633 void MOBF_WriteKey(MS_U32 u32WriteKey)
634 {
635 REG32_W((&_SHARNGCtrl[0].MOBF_KeyW) , u32WriteKey);
636 }
637
638 //-------------------------------------------------------------------------------------------------
639 /// Set MOBF decrypt key
640 /// @param u32ReadKey \b IN: Decrypt Key
641
642 /// @note
643 //-------------------------------------------------------------------------------------------------
MOBF_ReadKey(MS_U32 u32ReadKey)644 void MOBF_ReadKey(MS_U32 u32ReadKey)
645 {
646 REG32_W((&_SHARNGCtrl[0].MOBF_KeyR) , u32ReadKey);
647 }
648
649 //-------------------------------------------------------------------------------------------------
650 /// Enable MOBF in MIU write port
651 /// @param bEnable \b IN: Enable/Disable
652
653 /// @note : MOBF Encrypt
654 //-------------------------------------------------------------------------------------------------
MOBF_WriteEnable(MS_BOOL bEnable)655 void MOBF_WriteEnable(MS_BOOL bEnable)
656 {
657 if(bEnable)
658 {
659 REG32_W((&_SHARNGCtrl[0].Rng_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl)&(~MOBF_IN_MIU_WRITE_EN));
660 }
661 else
662 {
663 REG32_W((&_SHARNGCtrl[0].Rng_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl)&(~MOBF_IN_MIU_WRITE_EN));
664 REG32_W((&_SHARNGCtrl[0].Rng_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl)|(MOBF_IN_MIU_WRITE_EN));
665 }
666 }
667
668 //-------------------------------------------------------------------------------------------------
669 /// Enable MOBF in MIU read port
670 /// @param bEnable \b IN: Enable/Disable
671
672 /// @note : MOBF Decrypt
673 //-------------------------------------------------------------------------------------------------
MOBF_ReadEnable(MS_BOOL bEnable)674 void MOBF_ReadEnable(MS_BOOL bEnable)
675 {
676 if(bEnable)
677 {
678 REG32_W((&_SHARNGCtrl[0].Rng_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl)&(~MOBF_IN_MIU_READ_EN));
679 }
680 else
681 {
682 REG32_W((&_SHARNGCtrl[0].Rng_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl)&(~MOBF_IN_MIU_READ_EN));
683 REG32_W((&_SHARNGCtrl[0].Rng_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl)|(MOBF_IN_MIU_READ_EN));
684 }
685 }
686
687 //-------------------------------------------------------------------------------------------------
688 /// Disable TDES
689 ///
690
691 /// @note : MOBF Decrypt
692 //-------------------------------------------------------------------------------------------------
MOBF_DisableTDES(void)693 void MOBF_DisableTDES(void)
694 {
695 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2),_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2) & (~AESDMA_DMA_USE_TDES_EN));
696 }
697
AESDMA_Parser_Set_Mode(AESDMA_ParserMode eMode)698 void AESDMA_Parser_Set_Mode(AESDMA_ParserMode eMode)
699 {
700 MS_U32 u32Cmd = 0;
701
702 switch (eMode)
703 {
704 case E_AESDMA_PARSER_TS_PKT192:
705 u32Cmd |= (TS_MODE | PKT192_MODE);
706 break;
707
708 case E_AESDMA_PARSER_TS_PKT192_CLEAR:
709 u32Cmd |= (TS_MODE | PKT192_MODE | CLEAR_MODE);
710 break;
711
712 case E_AESDMA_PARSER_TS_PKT188:
713 u32Cmd |= (TS_MODE);
714 u32Cmd &= (~PKT192_MODE);
715 break;
716
717 case E_AESDMA_PARSER_TS_PKT188_CLEAR:
718 u32Cmd |= (TS_MODE | CLEAR_MODE);
719 u32Cmd &= (~PKT192_MODE);
720 break;
721
722 case E_AESDMA_PARSER_HDCP20_PKT192:
723 u32Cmd |= (HDCP20_MODE | PKT192_MODE);
724 break;
725
726 case E_AESDMA_PARSER_HDCP20_PKT192_CLEAR:
727 u32Cmd |= (HDCP20_MODE | PKT192_MODE | CLEAR_MODE);
728 break;
729
730 case E_AESDMA_PARSER_HDCP20_PKT188:
731 u32Cmd |= (HDCP20_MODE);
732 u32Cmd &= (~PKT192_MODE);
733 break;
734
735 case E_AESDMA_PARSER_HDCP20_PKT188_CLEAR:
736 u32Cmd |= (HDCP20_MODE | CLEAR_MODE);
737 u32Cmd &= (~PKT192_MODE);
738 break;
739
740 default:
741 return;
742 }
743
744 u32Cmd |= (AUTO_MODE | INIT_TRUST);
745 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),(( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~ParserCtrlSet)) | u32Cmd ) );
746 }
747
748
AESDMA_Parser_Insert_Scrmb(MS_BOOL bEnable)749 void AESDMA_Parser_Insert_Scrmb(MS_BOOL bEnable)
750 {
751 if(bEnable)
752 {
753 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~INSERT_SCRMB)) );
754 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) | (INSERT_SCRMB)) );
755 }
756 else
757 {
758 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~INSERT_SCRMB)) );
759 }
760 }
761
AESDMA_Parser_Remove_Scrmb(MS_BOOL bEnable)762 void AESDMA_Parser_Remove_Scrmb(MS_BOOL bEnable)
763 {
764 if(bEnable)
765 {
766 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~REMOVE_SCRMB)) );
767 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) | (REMOVE_SCRMB)) );
768 }
769 else
770 {
771 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~REMOVE_SCRMB)) );
772 }
773 }
774
AESDMA_Parser_Mask_Scrmb(MS_BOOL bEnable)775 void AESDMA_Parser_Mask_Scrmb(MS_BOOL bEnable)
776 {
777 if(bEnable)
778 {
779 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~TS_SCRMB_MASK)) );
780 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) | (TS_SCRMB_MASK)) );
781 }
782 else
783 {
784 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~TS_SCRMB_MASK)) );
785 }
786 }
787
AESDMA_Parser_Bypass_Pid(MS_BOOL bEnable)788 void AESDMA_Parser_Bypass_Pid(MS_BOOL bEnable)
789 {
790 if(bEnable)
791 {
792 REG32_W((&_PARSERCtrl[0].Parser_Pid1),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) & (~BYPASS_PID)) );
793 REG32_W((&_PARSERCtrl[0].Parser_Pid1),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) | (BYPASS_PID)) );
794 }
795 else
796 {
797 REG32_W((&_PARSERCtrl[0].Parser_Pid1),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) & (~BYPASS_PID)) );
798 }
799 }
800
AESDMA_Parser_Set_ScrmbPattern(AESDMA_ScrmbPattern ePattern)801 void AESDMA_Parser_Set_ScrmbPattern(AESDMA_ScrmbPattern ePattern)
802 {
803 MS_U32 u32Cmd = 0;
804
805 switch (ePattern)
806 {
807 case E_AESDMA_PARSER_SCRMB_10:
808 u32Cmd |= (SCRMB_PATTERN10);
809 break;
810
811 case E_AESDMA_PARSER_SCRMB_11:
812 u32Cmd |= (SCRMB_PATTERN11);
813 break;
814
815 default:
816 u32Cmd &= ~(SCRMB_PATTERN11);
817 break;
818 }
819
820 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),(( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~SCRMB_INITVALUE)) | u32Cmd ) );
821
822 }
823
AESDMA_Parser_Set_AddedScrmbPattern(AESDMA_ScrmbPattern ePattern)824 void AESDMA_Parser_Set_AddedScrmbPattern(AESDMA_ScrmbPattern ePattern)
825 {
826 MS_U32 u32Cmd = 0;
827
828 switch (ePattern)
829 {
830 case E_AESDMA_PARSER_SCRMB_10:
831 u32Cmd |= (SCRMB_PATTERN10_ADD);
832 break;
833
834 case E_AESDMA_PARSER_SCRMB_11:
835 u32Cmd |= (SCRMB_PATTERN11_ADD);
836 break;
837
838 default:
839 return;
840 }
841
842 REG32_W((&_PARSERCtrl[0].Parser_Pid1),(( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) & (~SCRMB_INITVALUE_ADD)) | u32Cmd ) );
843
844 }
845
AESDMA_Parser_Set_Pid(MS_U8 u8Index,MS_U16 u16Pid)846 void AESDMA_Parser_Set_Pid(MS_U8 u8Index, MS_U16 u16Pid)
847 {
848 if(u8Index==0)
849 {
850 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),(( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~PARSER_PID0_MASK)) | (u16Pid<<16) ) );
851 }
852 else if(u8Index==1)
853 {
854 REG32_W((&_PARSERCtrl[0].Parser_Pid1),(( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) & (~PARSER_PID1_MASK)) | u16Pid ) );
855 }
856 else
857 {
858 printf("Edison do not support other PID\n");
859 }
860 }
861
AESDMA_Parser_Query_PidCount(void)862 MS_U8 AESDMA_Parser_Query_PidCount(void)
863 {
864 return PARSER_PID_COUNT;
865 }
866
AESDMA_Parser_Enable_HWParser(MS_BOOL bEnable)867 void AESDMA_Parser_Enable_HWParser(MS_BOOL bEnable)
868 {
869 if(bEnable)
870 {
871 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~HW_PARSER_MODE)) );
872 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) | (HW_PARSER_MODE)) );
873 REG32_W((&_PARSERCtrl[0].Parser_Pid1),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) | (ENABLE_LG_PATCH)) );
874 }
875 else
876 {
877 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~HW_PARSER_MODE)) );
878 REG32_W((&_PARSERCtrl[0].Parser_Pid1),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) & (~ENABLE_LG_PATCH)) );
879 }
880
881 //make sure CC_CTRL_BY_ACPU is set 0
882 REG32_W((&_CIPHERCtrl[0].Cipher_Ctrl),( _AESDMA_REG32_R(&_CIPHERCtrl[0].Cipher_Ctrl) & (~CC_CTRL_BY_ACPU)) );
883 }
884
RSA_ClearInt(void)885 void RSA_ClearInt(void)
886 {
887 //RSA interrupt clear
888 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_RData) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_RData)|(RSA_INT_CLR));
889 }
890
RSA_Reset(void)891 void RSA_Reset(void)
892 {
893 //RSA Rst
894 REG32_W((&_SHARNGCtrl[0].Rsa_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl)|(RSA_CTRL_RSA_RST));
895 REG32_W((&_SHARNGCtrl[0].Rsa_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl)&(~RSA_CTRL_RSA_RST));
896
897 //add polling RSA status before load data to SRAM
898 while (( RSA_GetStatus() & RSA_STATUS_RSA_BUSY ) != 0);
899 }
900
RSA_Ind32Ctrl(MS_U8 u8dirction)901 void RSA_Ind32Ctrl(MS_U8 u8dirction)
902 {
903 //[1] reg_ind32_direction 0: Read. 1: Write
904 if(u8dirction==1)
905 {
906 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Start) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Start)|(RSA_IND32_CTRL_DIRECTION_WRITE));
907 }
908 else
909 {
910 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Start) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Start)&(~RSA_IND32_CTRL_DIRECTION_WRITE));
911 }
912
913 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Start) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Start)|(RSA_IND32_CTRL_ADDR_AUTO_INC|RSA_IND32_CTRL_ACCESS_AUTO_START));
914
915 }
916
RSA_LoadSram(MS_U32 * u32Buf,RSA_IND32Address eMode)917 void RSA_LoadSram(MS_U32 *u32Buf, RSA_IND32Address eMode)
918 {
919 MS_U32 u32Cmd = 0;
920 MS_U32 i = 0;
921 MS_U32 WData_H = 0;
922 MS_U32 WData_L = 0;
923
924 switch (eMode)
925 {
926 case E_RSA_ADDRESS_E:
927 u32Cmd |= (RSA_E_BASE_ADDR);
928 break;
929
930 case E_RSA_ADDRESS_N:
931 u32Cmd |= (RSA_N_BASE_ADDR);
932 break;
933
934 case E_RSA_ADDRESS_A:
935 u32Cmd |= (RSA_A_BASE_ADDR);
936 break;
937
938 default:
939 return;
940 }
941
942 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Addr) , ((_AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Addr)&(~RSA_ADDRESS_MASK))|u32Cmd));
943 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Start) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Start)|(RSA_INDIRECT_START));
944
945 for( i = 0; i < 64; i++ )
946 {
947 if( eMode == E_RSA_ADDRESS_E )
948 {
949 WData_L = (((*(u32Buf+i))>>8)&0xFF00)|(((*(u32Buf+i))>>24)&0xFF);
950 WData_H = (((*(u32Buf+i))>>8)&0xFF)|(((*(u32Buf+i))<<8)&0xFF00);
951 }
952 else
953 {
954 WData_L = (((*(u32Buf-i))>>8)&0xFF00)|(((*(u32Buf-i))>>24)&0xFF);
955 WData_H = (((*(u32Buf-i))>>8)&0xFF)|(((*(u32Buf-i))<<8)&0xFF00);
956 }
957
958 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Addr) , ((_AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Addr)&(~RSA_WDATA_MASK_L))|(WData_L<<16)));
959 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_WData) , ((_AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_WData)&(~RSA_WDATA_MASK_H))|WData_H));
960 }
961
962 }
963
RSA_SetKeyLength(MS_U32 u32keylen)964 void RSA_SetKeyLength(MS_U32 u32keylen)
965 {
966 //[13:8] n_len_e: key length
967 REG32_W((&_SHARNGCtrl[0].Rsa_Ctrl) , (_AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl)&(~RSA_CTRL_KEY_LENGTH_MASK))|(u32keylen<<8));
968 }
969
RSA_SetKeyType(MS_U8 u8hwkey,MS_U8 u8pubkey)970 void RSA_SetKeyType(MS_U8 u8hwkey, MS_U8 u8pubkey)
971 {
972 //[1] hw_key_e : 0 : software key, 1: hardware key
973 //[2] e_pub_e : 0: pvivate key, 1: public key
974 if(u8hwkey==1)
975 {
976 REG32_W((&_SHARNGCtrl[0].Rsa_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl)|(RSA_CTRL_SEL_HW_KEY));
977 }
978 else
979 {
980 REG32_W((&_SHARNGCtrl[0].Rsa_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl)&(~RSA_CTRL_SEL_HW_KEY));
981 }
982
983 if(u8pubkey==1)
984 {
985 REG32_W((&_SHARNGCtrl[0].Rsa_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl)|(RSA_CTRL_SEL_PUBLIC_KEY));
986 }
987 else
988 {
989 REG32_W((&_SHARNGCtrl[0].Rsa_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl)&(~RSA_CTRL_SEL_PUBLIC_KEY));
990 }
991
992 }
993
RSA_ExponetialStart(void)994 void RSA_ExponetialStart(void)
995 {
996 //RSA exp start
997 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_RData) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_RData)|(RSA_EXP_START));
998 }
999
RSA_GetStatus(void)1000 MS_U32 RSA_GetStatus(void)
1001 {
1002 return _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl) & RSA_STATUS_MASK;
1003 }
1004
RSA_FileOutStart(void)1005 void RSA_FileOutStart(void)
1006 {
1007 //RSA ind32_start
1008 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Start) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Start)|(RSA_INDIRECT_START));
1009 }
1010
RSA_SetFileOutAddr(MS_U32 u32offset)1011 void RSA_SetFileOutAddr(MS_U32 u32offset)
1012 {
1013 MS_PHY u32Addr = 0;
1014 u32Addr = RSA_Z_BASE_ADDR + u32offset;
1015
1016 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Addr) , ((_AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Addr)&(~RSA_ADDRESS_MASK))|u32Addr));
1017 }
1018
RSA_FileOut(void)1019 MS_U32 RSA_FileOut(void)
1020 {
1021 MS_U32 u32out_L = 0;
1022 MS_U32 u32out_H = 0;
1023
1024 u32out_L = (_AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_WData)&RSA_RDATA_MASK_L)>>16;
1025 u32out_H = (_AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_RData)&RSA_RDATA_MASK_H)<<16;
1026
1027 return (u32out_H|u32out_L);
1028 }
1029
RSA_Get_RSA_IsFinished(void)1030 MS_U32 RSA_Get_RSA_IsFinished(void)
1031 {
1032 return (RSA_GetStatus()&RSA_STATUS_RSA_BUSY);
1033 }
1034
1035 //reserved for secure protect function
1036 /*
1037 void AESDMA_Secure_SetCipherKey(MS_U32 *cipherkey)
1038 {
1039 REG32_W((&_DMASECURECtrl[0].Secure_CipherKey_L.Key_L) , cipherkey[0]);
1040 REG32_W((&_DMASECURECtrl[0].Secure_CipherKey_L.Key_H) , cipherkey[1]);
1041 REG32_W((&_DMASECURECtrl[0].Secure_CipherKey_H.Key_L) , cipherkey[2]);
1042 REG32_W((&_DMASECURECtrl[0].Secure_CipherKey_H.Key_H) , cipherkey[3]);
1043 }
1044
1045 void AESDMA_Secure_SetInitVector(MS_U32 *pInitVector)
1046 {
1047 REG32_W((&_DMASECURECtrl[0].Secure_InitVector_L.IV_L), pInitVector[0]);
1048 REG32_W((&_DMASECURECtrl[0].Secure_InitVector_L.IV_H), pInitVector[1]);
1049 REG32_W((&_DMASECURECtrl[0].Secure_InitVector_H.IV_L), pInitVector[2]);
1050 REG32_W((&_DMASECURECtrl[0].Secure_InitVector_H.IV_H), pInitVector[3]);
1051 }
1052
1053 void AESDMA_SecureProtect(MS_BOOL bEnable)
1054 {
1055 if(bEnable)
1056 {
1057 REG32_W((&_DMASECURECtrl[0].Secure_dma3_ctrl) , _AESDMA_REG32_R(&_DMASECURECtrl[0].Secure_dma3_ctrl)|(AESDMA_SECURE_PROTECT_S));
1058 }
1059 else
1060 {
1061 REG32_W((&_DMASECURECtrl[0].Secure_dma3_ctrl) , _AESDMA_REG32_R(&_DMASECURECtrl[0].Secure_dma3_ctrl)&(~AESDMA_SECURE_PROTECT_S));
1062 }
1063 }
1064
1065 void AESDMA_Set_FileOutEnable(MS_BOOL bEnable)
1066 {
1067 if (bEnable)
1068 {
1069 REG32_W((&_AESDMACtrl[0].Dma_Ctrl), (_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl) |AESDMA_CTRL_FILEIN_START));
1070 }
1071 else
1072 {
1073 REG32_W((&_AESDMACtrl[0].Dma_Ctrl), (_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl) &~AESDMA_CTRL_FILEIN_START));
1074 }
1075 }
1076
1077 void AESDMA_Secure_Start(MS_BOOL AESDMAStart)
1078 {
1079 if (AESDMAStart)
1080 {
1081 REG32_W((&_DMASECURECtrl[0].Secure_file_st), (_AESDMA_REG32_R(&_DMASECURECtrl[0].Secure_file_st) &~AESDMA_SECURE_FILEIN_START));
1082 REG32_W((&_DMASECURECtrl[0].Secure_file_st), (_AESDMA_REG32_R(&_DMASECURECtrl[0].Secure_file_st) | AESDMA_SECURE_FILEIN_START));
1083 }
1084 else
1085 {
1086 REG32_W((&_DMASECURECtrl[0].Secure_file_st), (_AESDMA_REG32_R(&_DMASECURECtrl[0].Secure_file_st) &~AESDMA_SECURE_FILEIN_START));
1087 }
1088 }
1089
1090 MS_U32 AESDMA_Get_AESDMA_SecureIsFinished(void)
1091 {
1092 return (_AESDMA_REG32_R(&_DMASECURECtrl[0].Secure_dma3_status) & AESDMA_DONE_S);
1093 }
1094
1095 */
1096
1097 //-------------------------------------------------------------------------------------------------
1098 /// Get status of Secret Key in Normal bank
1099 /// @param N/A
1100 /// @note : Get Status
1101 //-------------------------------------------------------------------------------------------------
AESDMA_IsSecretKeyInNormalBank(void)1102 MS_U32 AESDMA_IsSecretKeyInNormalBank(void)
1103 {
1104 return (_AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl) & (SECRET_KEY_IN_NORMAL_BANK));
1105 }
1106
1107 //-------------------------------------------------------------------------------------------------
1108 /// Enable Two keys (Odd/Even) in using HW auto select key.
1109 /// @param bEnable \b IN: Enable/Disable
1110
1111 /// @note : Hardware Parser Decrypt
1112 //-------------------------------------------------------------------------------------------------
AESDMA_Parser_Enable_Two_Keys(MS_BOOL bEnable)1113 void AESDMA_Parser_Enable_Two_Keys(MS_BOOL bEnable)
1114 {
1115 if(bEnable)
1116 {
1117 REG32_W((&_PARSERCtrl[0].Parser_Pid1), _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) | (SCRMB_ENABLE_TWO_KEY) );
1118 }
1119 else
1120 {
1121 REG32_W((&_PARSERCtrl[0].Parser_Pid1), _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) & (~SCRMB_ENABLE_TWO_KEY) );
1122 }
1123 }
1124
1125 //-------------------------------------------------------------------------------------------------
1126 /// Set Odd keys in using HW auto select key.
1127 /// @param cipherkey
1128 /// @note : Hardware Parser Decrypt
1129 //-------------------------------------------------------------------------------------------------
AESDMA_Set_CipherOddKey(MS_U32 * cipherkey)1130 void AESDMA_Set_CipherOddKey(MS_U32 *cipherkey)
1131 {
1132 REG32_W((&_AESDMACtrlEx[0].Dma_CipherKey_L.Key_L) , cipherkey[0]);
1133 REG32_W((&_AESDMACtrlEx[0].Dma_CipherKey_L.Key_H) , cipherkey[1]);
1134 REG32_W((&_AESDMACtrlEx[0].Dma_CipherKey_H.Key_L) , cipherkey[2]);
1135 REG32_W((&_AESDMACtrlEx[0].Dma_CipherKey_H.Key_H) , cipherkey[3]);
1136 }
1137
1138 //-------------------------------------------------------------------------------------------------
1139 /// Set Odd IVs in using HW auto select key.
1140 /// @param cipherkey
1141 /// @note : Hardware Parser Decrypt
1142 //-------------------------------------------------------------------------------------------------
AESDMA_Set_OddInitVector(MS_U32 * pInitVector)1143 void AESDMA_Set_OddInitVector(MS_U32 *pInitVector)
1144 {
1145 REG32_W((&_AESDMACtrlEx[0].Dma_InitVector_L.IV_L), pInitVector[0]);
1146 REG32_W((&_AESDMACtrlEx[0].Dma_InitVector_L.IV_H), pInitVector[1]);
1147 REG32_W((&_AESDMACtrlEx[0].Dma_InitVector_H.IV_L), pInitVector[2]);
1148 REG32_W((&_AESDMACtrlEx[0].Dma_InitVector_H.IV_H), pInitVector[3]);
1149 }
1150
1151 //-------------------------------------------------------------------------------------------------
1152 /// Set Even keys in using HW auto select key.
1153 /// @param cipherkey
1154 /// @note : Hardware Parser Decrypt
1155 //-------------------------------------------------------------------------------------------------
AESDMA_Set_CipherEvenKey(MS_U32 * cipherkey)1156 void AESDMA_Set_CipherEvenKey(MS_U32 *cipherkey)
1157 {
1158 AESDMA_Set_CipherKey(cipherkey);
1159 }
1160
1161 //-------------------------------------------------------------------------------------------------
1162 /// Set Even IVs in using HW auto select key.
1163 /// @param cipherkey
1164 /// @note : Hardware Parser Decrypt
1165 //-------------------------------------------------------------------------------------------------
AESDMA_Set_EvenInitVector(MS_U32 * pInitVector)1166 void AESDMA_Set_EvenInitVector(MS_U32 *pInitVector)
1167 {
1168 AESDMA_Set_InitVector(pInitVector);
1169 }
1170
1171 //-------------------------------------------------------------------------------------------------
1172 /// Set HDCP Data
1173 /// @param u8Idx \b IN: Index
1174 /// @param pu8Data \b IN: Content Keys
1175 /// @param pu8privData \b IN: RIV
1176 /// @note : Set HDCP2.2
1177 //-------------------------------------------------------------------------------------------------
HDCP_ProcessCipher(MS_U8 u8Idx,MS_U8 * pu8Data,MS_U8 * pu8privData)1178 void HDCP_ProcessCipher (MS_U8 u8Idx, MS_U8 *pu8Data, MS_U8* pu8privData)
1179 {
1180 REG_HDCP22Data *pData = NULL;
1181 REG_HDCP22SEKCtrl *pCtrl = NULL;
1182 MS_U16 offset = 0;
1183 MS_U16 BKOffset = 0;
1184
1185 MS_U32 *cipherkey = (MS_U32 *)pu8Data;
1186 MS_U32 *riv = (MS_U32 *)pu8privData;
1187
1188 offset = u8Idx * (sizeof(REG_HDCP22Data) >> 1);
1189 BKOffset = u8Idx * 0x300;
1190
1191 pData = (REG_HDCP22Data*)((MS_U16*)_HDCP22Data + offset);
1192 pCtrl = (REG_HDCP22SEKCtrl*)((MS_U16*)_HDCP22SekCtrl + BKOffset);
1193
1194 //Content Keys
1195 REG32_W((&pData[0].Hdcp22_ContentKey[0]) , cipherkey[0]);
1196 REG32_W((&pData[0].Hdcp22_ContentKey[1]) , cipherkey[1]);
1197 REG32_W((&pData[0].Hdcp22_ContentKey[2]) , cipherkey[2]);
1198 REG32_W((&pData[0].Hdcp22_ContentKey[3]) , cipherkey[3]);
1199
1200 //RIV
1201 REG32_W((&pData[0].Hdcp22_Riv[0]) , riv[0]);
1202 REG32_W((&pData[0].Hdcp22_Riv[1]) , riv[1]);
1203
1204 //Set SKE successful
1205 REG32_W((&pCtrl[0].SEK), (_AESDMA_REG32_R(&pCtrl[0].SEK) | HDCP_SEK_BIT0));
1206 }
1207
1208 //-------------------------------------------------------------------------------------------------
1209 /// Get the status of HW supports HDCP2.2
1210 /// @param N/A
1211 /// @note : Support HDCP2.2
1212 //-------------------------------------------------------------------------------------------------
HDCP_GetHdcpCipherState(MS_U8 u8Idx,MS_U8 * pu8State)1213 void HDCP_GetHdcpCipherState(MS_U8 u8Idx, MS_U8 *pu8State)
1214 {
1215 #define HDCP_SUPPORT_EN 0x00000001
1216 REG_HDCP22SEKCtrl *pCtrl = NULL;
1217 MS_U16 offset = 0;
1218 MS_U16 BKOffset = 0;
1219
1220 offset = u8Idx * (sizeof(REG_HDCP22Data) >> 1);
1221 BKOffset = u8Idx * 0x300;
1222
1223 pCtrl = (REG_HDCP22SEKCtrl*)((MS_U16*)_HDCP22SekCtrl + BKOffset);
1224
1225 *pu8State = (MS_U8)(_AESDMA_REG32_R(&pCtrl[0].SEK) & HDCP_SUPPORT_EN);
1226 }
1227
1228 //-------------------------------------------------------------------------------------------------
1229 /// Reset AESDMA
1230 /// @param N/A
1231 /// @note : Clear Registers, not to do sw reset
1232 //-------------------------------------------------------------------------------------------------
AESDMA_NormalReset(void)1233 void AESDMA_NormalReset(void)
1234 {
1235 MS_VIRT Reg_AESDMA;
1236 MS_U32 i = 0;
1237 Reg_AESDMA = (MS_VIRT)(&_AESDMACtrl[0].Dma_Ctrl);
1238
1239 REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , 0x00000000); // clear ctrl register
1240
1241 // reset all AESdma register
1242 for (i = 0 ; i < 19 ; i++)
1243 {
1244 REG32_W((REG32 *)(Reg_AESDMA+(i*8)), 0x00000000);
1245 }
1246 // reset secure_dma3_ctrl register
1247 REG32_W((&_DMASECURECtrl[0].Secure_dma3_ctrl), 0x00000000);
1248
1249 // reset hw_parser_ctrl register
1250 REG32_W((&_PARSERCtrl[0].Parser_Pid1),0x00000000);
1251 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),0x00000000);
1252 }
1253
AESDMA_Set_SecureBankEnable(MS_BOOL bEnable)1254 void AESDMA_Set_SecureBankEnable (MS_BOOL bEnable)
1255 {
1256 #ifdef MSOS_TYPE_NUTTX
1257 if ( bEnable == TRUE)
1258 {
1259 REG32_W((&_DMASECURECtrl[0].Secure_dma3_ctrl) , _AESDMA_REG32_R(&_DMASECURECtrl[0].Secure_dma3_ctrl) |(AESDMA_SECURE_PROTECT_S | AESDMA_SECURE_PROTECT_SHA_S | AESDMA_SECURE_PROTECT_RSA_S));
1260 }
1261 else
1262 {
1263 REG32_W((&_DMASECURECtrl[0].Secure_dma3_ctrl) , _AESDMA_REG32_R(&_DMASECURECtrl[0].Secure_dma3_ctrl) &~(AESDMA_SECURE_PROTECT_S | AESDMA_SECURE_PROTECT_SHA_S | AESDMA_SECURE_PROTECT_RSA_S));
1264 }
1265 #endif
1266 }
1267