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
107 //--------------------------------------------------------------------------------------------------
108 // Driver Compiler Option
109 //--------------------------------------------------------------------------------------------------
110
111
112 //--------------------------------------------------------------------------------------------------
113 // TSP Hardware Abstraction Layer
114 //--------------------------------------------------------------------------------------------------
115 static MS_VIRT _u32RegBase = NULL;
116 static MS_VIRT _u32PmRegBase = NULL;
117 static REG_AESDMACtrl *_AESDMACtrl = (REG_AESDMACtrl*)REG_AESDMACTRL_BASE;
118 static REG_SHARNGCtrl *_SHARNGCtrl = (REG_SHARNGCtrl*)REG_SHARNGCTRL_BASE;
119 static REG_AESDMAClk *_AESDMAClk = (REG_AESDMAClk*)REG_AESDMACLK_BASE;
120 static REG_AESDMAMbx *_AESDMAMbx = (REG_AESDMAMbx*)REG_AESDMAMBX_BASE;
121 static REG_PARSERCtrl *_PARSERCtrl = (REG_PARSERCtrl*)REG_PARSERCTRL_BASE;
122 static REG_CIPHERCtrl *_CIPHERCtrl = (REG_CIPHERCtrl*)REG_CIPHERCTRL_BASE;
123 static REG_DMASECURECtrl *_DMASECURECtrl = (REG_DMASECURECtrl*)REG_DMASECURE_BASE;
124 static REG_SECUREBASECtrl *_SECUREBASECtrl = (REG_SECUREBASECtrl*)REG_DMASECURE_CTRL_BASE;
125 static REG_AESDMACtrlEx *_AESDMACtrlEx = (REG_AESDMACtrlEx*)REG_AESDMAEXT_BASE;
126 static REG_TZPCCtrl *_TZPCCtrl = (REG_TZPCCtrl*)REG_TZPC_NONPM_BASE;
127 static REG_HDCP22Data *_HDCP22Data = (REG_HDCP22Data*)REG_HDCP22_BASE;
128 static REG_HDCP22SEKCtrl *_HDCP22SekCtrl = (REG_HDCP22SEKCtrl*)REG_HDCP22_SEK;
129
130 #define REG32_W(reg, value) do { \
131 (reg)->H = ((value) >> 16); \
132 (reg)->L = ((value) & 0x0000FFFF); \
133 } while(0)
134
135 //--------------------------------------------------------------------------------------------------
136 // Macro of bit operations
137 //--------------------------------------------------------------------------------------------------
138
_AESDMA_REG32_R(REG32 * reg)139 MS_U32 _AESDMA_REG32_R(REG32 *reg)
140 {
141 MS_U32 value;
142
143 value = (reg)->H << 16;
144 value |= (reg)->L;
145
146 return value;
147 }
148
149 //--------------------------------------------------------------------------------------------------
150 // Inline Function
151 //--------------------------------------------------------------------------------------------------
HAL_AESDMA_SetBank(MS_VIRT u32NonPmBankAddr,MS_VIRT u32PmBankAddr)152 void HAL_AESDMA_SetBank(MS_VIRT u32NonPmBankAddr, MS_VIRT u32PmBankAddr)
153 {
154 _u32RegBase = u32NonPmBankAddr;
155 _u32PmRegBase = u32PmBankAddr;
156 _AESDMACtrl = (REG_AESDMACtrl*)(_u32RegBase + REG_AESDMACTRL_BASE);
157 _SHARNGCtrl = (REG_SHARNGCtrl*)(_u32RegBase + REG_SHARNGCTRL_BASE);
158 _AESDMAClk = (REG_AESDMAClk*)(_u32RegBase + REG_AESDMACLK_BASE);
159 _AESDMAMbx = (REG_AESDMAMbx*)(_u32PmRegBase + REG_AESDMAMBX_BASE);
160 _PARSERCtrl = (REG_PARSERCtrl*)(_u32RegBase + REG_PARSERCTRL_BASE);
161 _CIPHERCtrl = (REG_CIPHERCtrl*)(_u32RegBase + REG_CIPHERCTRL_BASE);
162 _DMASECURECtrl = (REG_DMASECURECtrl*)(_u32RegBase + REG_DMASECURE_BASE);
163 _SECUREBASECtrl = (REG_SECUREBASECtrl*)(_u32RegBase + REG_DMASECURE_CTRL_BASE);
164 _AESDMACtrlEx = (REG_AESDMACtrlEx*)(_u32RegBase + REG_AESDMAEXT_BASE);
165 _TZPCCtrl = (REG_TZPCCtrl*)(_u32RegBase + REG_TZPC_NONPM_BASE);
166 _HDCP22Data = (REG_HDCP22Data*)(_u32RegBase + REG_HDCP22_BASE);
167 _HDCP22SekCtrl = (REG_HDCP22SEKCtrl*)(_u32RegBase + REG_HDCP22_SEK);
168 }
169
AESDMA_GetMIU1Base(void)170 MS_PHY AESDMA_GetMIU1Base(void)
171 {
172 return HAL_MIU1_BASE;
173 }
174
AESDMA_GetMIU2Base(void)175 MS_PHY AESDMA_GetMIU2Base(void)
176 {
177 //not support
178 return FALSE;
179 }
180
AESDMA_Reset(void)181 void AESDMA_Reset(void)
182 {
183 MS_VIRT Reg_AESDMA;
184 MS_U32 i = 0;
185 Reg_AESDMA = (MS_VIRT)(&_AESDMACtrl[0].Dma_Ctrl);
186
187 REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , 0x00000000); // clear ctrl register
188 REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl)|(AESDMA_CTRL_SW_RST)); // sw rst
189 REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl)&~(AESDMA_CTRL_SW_RST));
190
191 // reset all AESdma register
192 for (i = 0 ; i < 19 ; i++)
193 {
194 REG32_W((REG32 *)(Reg_AESDMA+(i*8)), 0x00000000);
195 }
196 // reset secure_dma3_ctrl register
197 REG32_W((&_DMASECURECtrl[0].Secure_dma3_ctrl), 0x00000000);
198
199 // reset hw_parser_ctrl register
200 REG32_W((&_PARSERCtrl[0].Parser_Pid1),0x01000000);
201 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),0x00000000);
202 }
203
AESDMA_Set_CipherKey(MS_U32 * cipherkey)204 void AESDMA_Set_CipherKey(MS_U32 *cipherkey)
205 {
206 REG32_W((&_AESDMACtrl[0].Dma_CipherKey_L.Key_L) , cipherkey[0]);
207 REG32_W((&_AESDMACtrl[0].Dma_CipherKey_L.Key_H) , cipherkey[1]);
208 REG32_W((&_AESDMACtrl[0].Dma_CipherKey_H.Key_L) , cipherkey[2]);
209 REG32_W((&_AESDMACtrl[0].Dma_CipherKey_H.Key_H) , cipherkey[3]);
210 }
211
AESDMA_Set_InitVector(MS_U32 * pInitVector)212 void AESDMA_Set_InitVector(MS_U32 *pInitVector)
213 {
214 REG32_W((&_AESDMACtrl[0].Dma_InitVector_L.IV_L), pInitVector[0]);
215 REG32_W((&_AESDMACtrl[0].Dma_InitVector_L.IV_H), pInitVector[1]);
216 REG32_W((&_AESDMACtrl[0].Dma_InitVector_H.IV_L), pInitVector[2]);
217 REG32_W((&_AESDMACtrl[0].Dma_InitVector_H.IV_H), pInitVector[3]);
218 }
219
AESDMA_Sel_Key(MS_BOOL keysel)220 void AESDMA_Sel_Key(MS_BOOL keysel)
221 {
222 }
223
AESDMA_Sel_SecureKey(void)224 void AESDMA_Sel_SecureKey(void)
225 {
226 MS_U32 u32Ctrl = _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2);
227 u32Ctrl |= AESDMA_USE_SECRET_KEY;
228 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2), u32Ctrl);
229 }
230
AESDMA_Set_FileinDesc(MS_PHY FileinAddr,MS_PHY FileinNum)231 void AESDMA_Set_FileinDesc(MS_PHY FileinAddr , MS_PHY FileinNum)
232 {
233 REG32_W((&_AESDMACtrl[0].Dma_Filein_Addr), FileinAddr);
234 REG32_W((&_AESDMACtrl[0].Dma_Filein_Num), FileinNum);
235 }
236
AESDMA_Set_FileoutDesc(MS_PHY FileoutSAddr,MS_PHY FileoutEAddr)237 void AESDMA_Set_FileoutDesc(MS_PHY FileoutSAddr , MS_PHY FileoutEAddr)
238 {
239 REG32_W((&_AESDMACtrl[0].Dma_Fileout_SAddr), FileoutSAddr);
240 REG32_W((&_AESDMACtrl[0].Dma_Fileout_EAddr), FileoutEAddr);
241 }
242
AESDMA_Start(MS_BOOL AESDMAStart)243 void AESDMA_Start(MS_BOOL AESDMAStart)
244 {
245 if (AESDMAStart)
246 {
247 REG32_W((&_AESDMACtrl[0].Dma_Ctrl), (_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl) &~ AESDMA_CTRL_FILEOUT_START &~ AESDMA_CTRL_FILEIN_START));
248 REG32_W((&_AESDMACtrl[0].Dma_Ctrl), (_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl) | AESDMA_CTRL_FILEOUT_START | AESDMA_CTRL_FILEIN_START));
249 }
250 else
251 {
252 REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl)&~(AESDMA_CTRL_FILEOUT_START|AESDMA_CTRL_FILEIN_START));
253 }
254 }
255
AESDMA_Set_PS_PTN(MS_U32 MatchPTN)256 void AESDMA_Set_PS_PTN(MS_U32 MatchPTN)
257 {
258 REG32_W((&_AESDMACtrl[0].Dma_PS_Pattern) , MatchPTN);
259 }
260
AESDMA_Set_PS_Mask(MS_U32 MatchMask)261 void AESDMA_Set_PS_Mask(MS_U32 MatchMask)
262 {
263 REG32_W((&_AESDMACtrl[0].Dma_PS_Pattern_Mask) , MatchMask);
264 }
265
AESDMA_Set_PS_ENG(MS_BOOL PSin_en,MS_BOOL PSout_en)266 void AESDMA_Set_PS_ENG(MS_BOOL PSin_en, MS_BOOL PSout_en)
267 {
268 MS_U32 u32PSin, u32PSout;
269
270 u32PSin = AESDMA_ENG_PS_IN_EN & (PSin_en<<20);
271 u32PSout = AESDMA_ENG_PS_OUT_EN & (PSout_en<<21);
272
273 REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl)|(u32PSin|u32PSout));
274 }
275
AESDMA_Get_PS_MatchedBytecnt(void)276 MS_U32 AESDMA_Get_PS_MatchedBytecnt(void)
277 {
278 return _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Matched_Btyecnt);
279 }
280
AESDMA_Get_PS_MatchedPTN(void)281 MS_U32 AESDMA_Get_PS_MatchedPTN(void)
282 {
283 return _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Matched_Pat);
284 }
285
AESDMA_Set_PS_Release(void)286 void AESDMA_Set_PS_Release(void)
287 {
288 REG32_W((&_AESDMACtrl[0].Dma_Ctrl), _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl)|AESDMA_ENG_PS_RELEASE);
289 REG32_W((&_AESDMACtrl[0].Dma_Ctrl), _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl) & ~AESDMA_ENG_PS_RELEASE);
290 }
291
AESDMA_Get_AESDMA_Status(void)292 MS_U32 AESDMA_Get_AESDMA_Status(void)
293 {
294 return _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_PVR_Status);
295 }
296
AESDMA_Get_AESDMA_IsFinished(void)297 MS_U32 AESDMA_Get_AESDMA_IsFinished(void)
298 {
299 return (_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_PVR_Status) & AESDMA_IS_FINISHED);
300 }
301
AESDMA_Set_CIPHER_ENG(AESDMA_CipherMode eMode,MS_BOOL Descrypt)302 void AESDMA_Set_CIPHER_ENG(AESDMA_CipherMode eMode, MS_BOOL Descrypt)
303 {
304 MS_U32 u32Cmd = 0;
305
306 switch (eMode)
307 {
308 case E_AESDMA_CIPHER_ECB:
309 u32Cmd |= AESDMA_ENG_AES_EN;
310 break;
311
312 case E_AESDMA_CIPHER_CTR:
313 u32Cmd |= (AESDMA_ENG_AES_EN | AESDMA_ENG_CTR_MODE);
314 break;
315
316 case E_AESDMA_CIPHER_CBC:
317 u32Cmd |= (AESDMA_ENG_AES_EN | AESDMA_ENG_CBC_MODE);
318 break;
319
320 case E_AESDMA_CIPHER_DES_ECB:
321 u32Cmd |= AESDMA_ENG_DES_EN;
322 break;
323
324 case E_AESDMA_CIPHER_DES_CTR:
325 u32Cmd |= (AESDMA_ENG_DES_EN | AESDMA_ENG_CTR_MODE);
326 break;
327
328 case E_AESDMA_CIPHER_DES_CBC:
329 u32Cmd |= (AESDMA_ENG_DES_EN | AESDMA_ENG_CBC_MODE);
330 break;
331
332 case E_AESDMA_CIPHER_TDES_ECB:
333 u32Cmd |= AESDMA_ENG_TDES_EN;
334 break;
335
336 case E_AESDMA_CIPHER_TDES_CTR:
337 u32Cmd |= (AESDMA_ENG_TDES_EN | AESDMA_ENG_CTR_MODE);
338 break;
339
340 case E_AESDMA_CIPHER_TDES_CBC:
341 u32Cmd |= (AESDMA_ENG_TDES_EN | AESDMA_ENG_CBC_MODE);
342 break;
343
344 case E_AESDMA_CIPHER_CTS_CBC:
345 u32Cmd |= (AESDMA_ENG_AES_EN | AESDMA_ENG_CTS_CBC_MODE);
346 break;
347
348 case E_AESDMA_CIPHER_CTS_ECB:
349 u32Cmd |= (AESDMA_ENG_AES_EN | AESDMA_ENG_CTS_ECB_MODE);
350 break;
351
352 case E_AESDMA_CIPHER_DES_CTS_CBC:
353 u32Cmd |= (AESDMA_ENG_DES_EN | AESDMA_ENG_CTS_CBC_MODE);
354 break;
355
356 case E_AESDMA_CIPHER_DES_CTS_ECB:
357 u32Cmd |= (AESDMA_ENG_DES_EN | AESDMA_ENG_CTS_ECB_MODE);
358 break;
359
360 case E_AESDMA_CIPHER_TDES_CTS_CBC:
361 u32Cmd |= (AESDMA_ENG_TDES_EN | AESDMA_ENG_CTS_CBC_MODE);
362 break;
363
364 case E_AESDMA_CIPHER_TDES_CTS_ECB:
365 u32Cmd |= (AESDMA_ENG_TDES_EN | AESDMA_ENG_CTS_ECB_MODE);
366 break;
367 default:
368 return;
369 }
370
371 if( eMode >= E_AESDMA_CIPHER_DES_ECB )
372 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2),_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2) | AESDMA_DMA_USE_TDES_EN);
373
374 u32Cmd |= AESDMA_ENG_DESCRYPT & (Descrypt<<25);
375 REG32_W((&_AESDMACtrl[0].Dma_Ctrl),(( _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl) & (~DmaCtrlSet)) | u32Cmd ) );
376 }
377
AESDMA_QueryCipherMode(AESDMA_CipherMode eMode)378 MS_U32 AESDMA_QueryCipherMode(AESDMA_CipherMode eMode)
379 {
380 MS_U32 u32Result = 1;
381
382 switch (eMode)
383 {
384 case E_AESDMA_CIPHER_ECB:
385 case E_AESDMA_CIPHER_CTR:
386 case E_AESDMA_CIPHER_CBC:
387 case E_AESDMA_CIPHER_DES_ECB:
388 case E_AESDMA_CIPHER_DES_CTR:
389 case E_AESDMA_CIPHER_DES_CBC:
390 case E_AESDMA_CIPHER_TDES_ECB:
391 case E_AESDMA_CIPHER_TDES_CTR:
392 case E_AESDMA_CIPHER_TDES_CBC:
393 case E_AESDMA_CIPHER_CTS_CBC:
394 case E_AESDMA_CIPHER_CTS_ECB:
395 case E_AESDMA_CIPHER_DES_CTS_CBC:
396 case E_AESDMA_CIPHER_DES_CTS_ECB:
397 case E_AESDMA_CIPHER_TDES_CTS_CBC:
398 case E_AESDMA_CIPHER_TDES_CTS_ECB:
399 u32Result = 0;
400 break;
401 default:
402 break;
403 }
404 return u32Result;
405
406 }
407
AESDMA_Set_MIU_Path(MS_BOOL MIU_R,MS_BOOL MIU_W)408 void AESDMA_Set_MIU_Path(MS_BOOL MIU_R, MS_BOOL MIU_W)
409 {
410 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2), RESET_FLAG1(_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2), AESDMA_CTRL_BANK_R));
411 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2), RESET_FLAG1(_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2), AESDMA_CTRL_BANK_W));
412
413 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2), SET_FLAG1(_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2), (AESDMA_CTRL_BANK_R & ((MS_U32)MIU_R << 4))));
414 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2), SET_FLAG1(_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2), (AESDMA_CTRL_BANK_W & ((MS_U32)MIU_W << 5))));
415 }
416
AESDMA_Set_MIU2_Path(MS_BOOL MIU_R,MS_BOOL MIU_W)417 void AESDMA_Set_MIU2_Path(MS_BOOL MIU_R, MS_BOOL MIU_W)
418 {
419 // Not support
420 }
421
AESDMA_Enable_Int(void)422 void AESDMA_Enable_Int(void)
423 {
424 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2)|AESDMA_INT_EN);
425 }
426
AESDMA_Disable_Int(void)427 void AESDMA_Disable_Int(void)
428 {
429 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2)&~AESDMA_INT_EN);
430 }
431
AESDMA_Clear_Int(void)432 void AESDMA_Clear_Int(void)
433 {
434 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2)|AESDMA_WADR_ERR_CLR);
435 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2)&~AESDMA_WADR_ERR_CLR);
436 }
437
AESDMA_HW_Patch(void)438 void AESDMA_HW_Patch(void)
439 {
440 REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl)|AESDMA_ECO_FIX_LAST_BYTE);
441 //REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl)|AESDMA_CTRL_BURST_LENGTH);
442 //REG32_W((&_AESDMACtrl[0].Dma_Eng3_Ctrl) , _AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Eng3_Ctrl)|AESDMA_ENG_SPEEDUP);
443 }
444
AESDMA_Enable_Clk(void)445 void AESDMA_Enable_Clk(void)
446 {
447 MS_U32 u32Val;
448
449 //1. clk_aesdma
450 u32Val = _AESDMA_REG32_R(&_AESDMAClk[0].Reg_Gate_Clk_AESDMA);
451 u32Val &= ~AESDMA_CLK_XTAL; //Clear Clk setting.
452 u32Val |= AESDMA_CLK_172M; //Set Clk to 172M
453 u32Val &= ~AESDMA_CLK_OFF_EN;//Enable Clk
454 REG32_W((&_AESDMAClk[0].Reg_Gate_Clk_AESDMA) , u32Val);
455
456 //
457 // Due to the security concern
458 // Set this CLK at SBOOT
459 //
460
461 //Enable 0x1239_0x03[3:0] = 4b'1111
462
463 //3. Enable Rng
464 u32Val = _AESDMA_REG32_R(&_SECUREBASECtrl[0].Reg0001);
465 u32Val |= REG_RNG_EN;
466 REG32_W((&_SECUREBASECtrl[0].Reg0001) , u32Val);
467
468 }
469
AESDMA_Disable_Clk(void)470 void AESDMA_Disable_Clk(void)
471 {
472 REG32_W((&_AESDMAClk[0].Reg_Gate_Clk_AESDMA) , _AESDMA_REG32_R(&_AESDMAClk[0].Reg_Gate_Clk_AESDMA) | AESDMA_CLK_OFF_EN);
473 }
474
AESDMA_Rand(void)475 MS_U8 AESDMA_Rand(void)
476 {
477 MS_U8 u8RN = 0x00;
478 u8RN = (MS_U8)_AESDMA_REG32_R(&_SECUREBASECtrl[0].Reg0203)&0xFF;
479
480 return u8RN;
481 }
482
SHA_Reset(void)483 void SHA_Reset(void)
484 {
485 MS_VIRT Reg_SHARNG;
486 MS_U32 i = 0;
487 Reg_SHARNG = (MS_VIRT)(&_SHARNGCtrl[0].Sha_Ctrl);
488 REG32_W((&_SHARNGCtrl[0].Sha_Ctrl) , SHARNG_CTRL_SHA_RST); // 0->1
489 REG32_W((&_SHARNGCtrl[0].Sha_Ctrl) , (_AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Ctrl)&(~SHARNG_CTRL_SHA_RST))); // 1->0
490
491 // reset all SHA & RNG register
492 for (i = 0 ; i < 7 ; i++)
493 {
494 REG32_W((REG32 *)(Reg_SHARNG+(i*8)), 0x00000000);
495 }
496 }
497
SHA_Get_Status(void)498 MS_U32 SHA_Get_Status(void)
499 {
500 return _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Status);
501 }
502
SHA_SelMode(AESDMA_SHAMode eMode)503 void SHA_SelMode(AESDMA_SHAMode eMode)
504 {
505 MS_U32 u32Cmd = 0;
506
507 switch (eMode)
508 {
509 case E_AESDMA_SHA1:
510 u32Cmd |= (SHARNG_CTRL_SHA_MSG_BLOCK_NUM);
511 break;
512
513 case E_AESDMA_SHA256:
514 u32Cmd |= (SHARNG_CTRL_SHA_SEL_SHA256 | SHARNG_CTRL_SHA_MSG_BLOCK_NUM);
515 break;
516
517 default:
518 return;
519 }
520
521 //Turn off speedup mode
522 //u32Cmd |= SHARNG_CTRL_SPEED_MODE_N;
523
524 REG32_W((&_SHARNGCtrl[0].Sha_Ctrl), _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Ctrl) | u32Cmd);
525 }
526
SHA_SetAddress(MS_PHY u32Addr)527 void SHA_SetAddress(MS_PHY u32Addr)
528 {
529 REG32_W((&_SHARNGCtrl[0].Sha_Start), u32Addr);
530 }
531
SHA_SetLength(MS_U32 u32Size)532 void SHA_SetLength(MS_U32 u32Size)
533 {
534 REG32_W((&_SHARNGCtrl[0].Sha_Length), u32Size);
535 }
536
SHA_Start(MS_BOOL SHAStart)537 void SHA_Start(MS_BOOL SHAStart)
538 {
539 if(SHAStart)
540 {
541 REG32_W((&_SHARNGCtrl[0].Sha_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Ctrl)&~(SHARNG_CTRL_SHA_FIRE_ONCE));
542 REG32_W((&_SHARNGCtrl[0].Sha_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Ctrl)|(SHARNG_CTRL_SHA_FIRE_ONCE));
543 }
544 else
545 {
546 REG32_W((&_SHARNGCtrl[0].Sha_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Ctrl)&~(SHARNG_CTRL_SHA_FIRE_ONCE));
547 }
548 }
549
SHA_Out(MS_VIRT u32Buf)550 void SHA_Out(MS_VIRT u32Buf)
551 {
552 MS_U32 Index, u32Size, u32offset;
553 MS_U32 eMode = _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Ctrl)&SHARNG_CTRL_SHA_SEL_SHA256;
554
555 if(eMode == SHARNG_CTRL_SHA_SEL_SHA256)
556 {
557 u32Size = DIGEST_SIZE_SHA256;
558 u32offset = 0;
559 }
560 else
561 {
562 u32Size = DIGEST_SIZE_SHA1;
563 u32offset = 3;
564 }
565
566 for( Index = 0; Index < u32Size; Index++ )
567 {
568 *((MS_U32 *)u32Buf + Index) = _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Out[Index + u32offset]);
569 }
570 //Set "1" to idle state after reg_read_sha_ready = 1
571 REG32_W((&_SHARNGCtrl[0].Sha_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Sha_Ctrl)|(SHARNG_CTRL_SHA_CLR));
572 }
573
574
575 //-------------------------------------------------------------------------------------------------
576 /// Enable mobf one way function
577 /// @param NULL
578
579 /// @note : disable read mobf key, and could not enable read mobf key anymore
580 //-------------------------------------------------------------------------------------------------
MOBF_OneWay(void)581 void MOBF_OneWay(void)
582 {
583 REG32_W((&_SHARNGCtrl[0].Rng_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl)|(MOBF_ONEWAY_EN));
584 }
585
586 //-------------------------------------------------------------------------------------------------
587 /// Set MOBF encrypt key
588 /// @param u32WriteKey \b IN: Encrypt Key
589
590 /// @note
591 //-------------------------------------------------------------------------------------------------
MOBF_WriteKey(MS_U32 u32WriteKey)592 void MOBF_WriteKey(MS_U32 u32WriteKey)
593 {
594 REG32_W((&_SHARNGCtrl[0].MOBF_KeyW) , u32WriteKey);
595 }
596
597 //-------------------------------------------------------------------------------------------------
598 /// Set MOBF decrypt key
599 /// @param u32ReadKey \b IN: Decrypt Key
600
601 /// @note
602 //-------------------------------------------------------------------------------------------------
MOBF_ReadKey(MS_U32 u32ReadKey)603 void MOBF_ReadKey(MS_U32 u32ReadKey)
604 {
605 REG32_W((&_SHARNGCtrl[0].MOBF_KeyR) , u32ReadKey);
606 }
607
608 //-------------------------------------------------------------------------------------------------
609 /// Enable MOBF in MIU write port
610 /// @param bEnable \b IN: Enable/Disable
611
612 /// @note : MOBF Encrypt
613 //-------------------------------------------------------------------------------------------------
MOBF_WriteEnable(MS_BOOL bEnable)614 void MOBF_WriteEnable(MS_BOOL bEnable)
615 {
616 if(bEnable)
617 {
618 REG32_W((&_SHARNGCtrl[0].Rng_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl)&(~MOBF_IN_MIU_WRITE_EN));
619 }
620 else
621 {
622 REG32_W((&_SHARNGCtrl[0].Rng_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl)&(~MOBF_IN_MIU_WRITE_EN));
623 REG32_W((&_SHARNGCtrl[0].Rng_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl)|(MOBF_IN_MIU_WRITE_EN));
624 }
625 }
626
627 //-------------------------------------------------------------------------------------------------
628 /// Enable MOBF in MIU read port
629 /// @param bEnable \b IN: Enable/Disable
630
631 /// @note : MOBF Decrypt
632 //-------------------------------------------------------------------------------------------------
MOBF_ReadEnable(MS_BOOL bEnable)633 void MOBF_ReadEnable(MS_BOOL bEnable)
634 {
635 if(bEnable)
636 {
637 REG32_W((&_SHARNGCtrl[0].Rng_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl)&(~MOBF_IN_MIU_READ_EN));
638 }
639 else
640 {
641 REG32_W((&_SHARNGCtrl[0].Rng_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl)&(~MOBF_IN_MIU_READ_EN));
642 REG32_W((&_SHARNGCtrl[0].Rng_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl)|(MOBF_IN_MIU_READ_EN));
643 }
644 }
645
646 //-------------------------------------------------------------------------------------------------
647 /// Disable TDES
648 ///
649
650 /// @note : MOBF Decrypt
651 //-------------------------------------------------------------------------------------------------
MOBF_DisableTDES(void)652 void MOBF_DisableTDES(void)
653 {
654 REG32_W((&_AESDMACtrl[0].Dma_Ctrl2),_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl2) & (~AESDMA_DMA_USE_TDES_EN));
655 }
656
AESDMA_Parser_Set_Mode(AESDMA_ParserMode eMode)657 void AESDMA_Parser_Set_Mode(AESDMA_ParserMode eMode)
658 {
659 MS_U32 u32Cmd = 0;
660
661 switch (eMode)
662 {
663 case E_AESDMA_PARSER_TS_PKT192:
664 u32Cmd |= (TS_MODE | PKT192_MODE);
665 break;
666
667 case E_AESDMA_PARSER_TS_PKT192_CLEAR:
668 u32Cmd |= (TS_MODE | PKT192_MODE | CLEAR_MODE);
669 break;
670
671 case E_AESDMA_PARSER_TS_PKT188:
672 u32Cmd |= (TS_MODE);
673 u32Cmd &= (~PKT192_MODE);
674 break;
675
676 case E_AESDMA_PARSER_TS_PKT188_CLEAR:
677 u32Cmd |= (TS_MODE | CLEAR_MODE);
678 u32Cmd &= (~PKT192_MODE);
679 break;
680
681 case E_AESDMA_PARSER_HDCP20_PKT192:
682 u32Cmd |= (HDCP20_MODE | PKT192_MODE);
683 break;
684
685 case E_AESDMA_PARSER_HDCP20_PKT192_CLEAR:
686 u32Cmd |= (HDCP20_MODE | PKT192_MODE | CLEAR_MODE);
687 break;
688
689 case E_AESDMA_PARSER_HDCP20_PKT188:
690 u32Cmd |= (HDCP20_MODE);
691 u32Cmd &= (~PKT192_MODE);
692 break;
693
694 case E_AESDMA_PARSER_HDCP20_PKT188_CLEAR:
695 u32Cmd |= (HDCP20_MODE | CLEAR_MODE);
696 u32Cmd &= (~PKT192_MODE);
697 break;
698
699 default:
700 return;
701 }
702
703 u32Cmd |= (AUTO_MODE | INIT_TRUST);
704 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),(( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~ParserCtrlSet)) | u32Cmd ) );
705 }
706
707
AESDMA_Parser_Insert_Scrmb(MS_BOOL bEnable)708 void AESDMA_Parser_Insert_Scrmb(MS_BOOL bEnable)
709 {
710 if(bEnable)
711 {
712 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~INSERT_SCRMB)) );
713 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) | (INSERT_SCRMB)) );
714 }
715 else
716 {
717 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~INSERT_SCRMB)) );
718 }
719 }
720
AESDMA_Parser_Remove_Scrmb(MS_BOOL bEnable)721 void AESDMA_Parser_Remove_Scrmb(MS_BOOL bEnable)
722 {
723 if(bEnable)
724 {
725 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~REMOVE_SCRMB)) );
726 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) | (REMOVE_SCRMB)) );
727 }
728 else
729 {
730 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~REMOVE_SCRMB)) );
731 }
732 }
733
AESDMA_Parser_Mask_Scrmb(MS_BOOL bEnable)734 void AESDMA_Parser_Mask_Scrmb(MS_BOOL bEnable)
735 {
736 if(bEnable)
737 {
738 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~TS_SCRMB_MASK)) );
739 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) | (TS_SCRMB_MASK)) );
740 }
741 else
742 {
743 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~TS_SCRMB_MASK)) );
744 }
745 }
746
AESDMA_Parser_Bypass_Pid(MS_BOOL bEnable)747 void AESDMA_Parser_Bypass_Pid(MS_BOOL bEnable)
748 {
749 if(bEnable)
750 {
751 REG32_W((&_PARSERCtrl[0].Parser_Pid1),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) & (~BYPASS_PID)) );
752 REG32_W((&_PARSERCtrl[0].Parser_Pid1),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) | (BYPASS_PID)) );
753 }
754 else
755 {
756 REG32_W((&_PARSERCtrl[0].Parser_Pid1),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) & (~BYPASS_PID)) );
757 }
758 }
759
AESDMA_Parser_Set_ScrmbPattern(AESDMA_ScrmbPattern ePattern)760 void AESDMA_Parser_Set_ScrmbPattern(AESDMA_ScrmbPattern ePattern)
761 {
762 MS_U32 u32Cmd = 0;
763
764 switch (ePattern)
765 {
766 case E_AESDMA_PARSER_SCRMB_10:
767 u32Cmd |= (SCRMB_PATTERN10);
768 break;
769
770 case E_AESDMA_PARSER_SCRMB_11:
771 u32Cmd |= (SCRMB_PATTERN11);
772 break;
773
774 default:
775 u32Cmd &= ~(SCRMB_PATTERN11);
776 break;
777 }
778
779 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),(( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~SCRMB_INITVALUE)) | u32Cmd ) );
780
781 }
782
AESDMA_Parser_Set_AddedScrmbPattern(AESDMA_ScrmbPattern ePattern)783 void AESDMA_Parser_Set_AddedScrmbPattern(AESDMA_ScrmbPattern ePattern)
784 {
785 MS_U32 u32Cmd = 0;
786
787 switch (ePattern)
788 {
789 case E_AESDMA_PARSER_SCRMB_10:
790 u32Cmd |= (SCRMB_PATTERN10_ADD);
791 break;
792
793 case E_AESDMA_PARSER_SCRMB_11:
794 u32Cmd |= (SCRMB_PATTERN11_ADD);
795 break;
796
797 default:
798 return;
799 }
800
801 REG32_W((&_PARSERCtrl[0].Parser_Pid1),(( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) & (~SCRMB_INITVALUE_ADD)) | u32Cmd ) );
802
803 }
804
AESDMA_Parser_Set_Pid(MS_U8 u8Index,MS_U16 u16Pid)805 void AESDMA_Parser_Set_Pid(MS_U8 u8Index, MS_U16 u16Pid)
806 {
807 if(u8Index==0)
808 {
809 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),(( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~PARSER_PID0_MASK)) | (u16Pid<<16) ) );
810 }
811 else if(u8Index==1)
812 {
813 REG32_W((&_PARSERCtrl[0].Parser_Pid1),(( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) & (~PARSER_PID1_MASK)) | u16Pid ) );
814 }
815 else
816 {
817 printf("Edison do not support other PID\n");
818 }
819 }
820
AESDMA_Parser_Query_PidCount(void)821 MS_U8 AESDMA_Parser_Query_PidCount(void)
822 {
823 return PARSER_PID_COUNT;
824 }
825
AESDMA_Parser_Enable_HWParser(MS_BOOL bEnable)826 void AESDMA_Parser_Enable_HWParser(MS_BOOL bEnable)
827 {
828 if(bEnable)
829 {
830 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~HW_PARSER_MODE)) );
831 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) | (HW_PARSER_MODE)) );
832 REG32_W((&_PARSERCtrl[0].Parser_Pid1),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) | (ENABLE_LG_PATCH)) );
833 }
834 else
835 {
836 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Ctrl) & (~HW_PARSER_MODE)) );
837 REG32_W((&_PARSERCtrl[0].Parser_Pid1),( _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) & (~ENABLE_LG_PATCH)) );
838 }
839
840 //make sure CC_CTRL_BY_ACPU is set 0
841 REG32_W((&_CIPHERCtrl[0].Cipher_Ctrl),( _AESDMA_REG32_R(&_CIPHERCtrl[0].Cipher_Ctrl) & (~CC_CTRL_BY_ACPU)) );
842 }
843
RSA_ClearInt(void)844 void RSA_ClearInt(void)
845 {
846 //RSA interrupt clear
847 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_RData) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_RData)|(RSA_INT_CLR));
848 }
849
RSA_Reset(void)850 void RSA_Reset(void)
851 {
852 //RSA Rst
853 REG32_W((&_SHARNGCtrl[0].Rsa_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl)|(RSA_CTRL_RSA_RST));
854 REG32_W((&_SHARNGCtrl[0].Rsa_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl)&(~RSA_CTRL_RSA_RST));
855
856 //add polling RSA status before load data to SRAM
857 while (( RSA_GetStatus() & RSA_STATUS_RSA_BUSY ) != 0);
858 }
859
RSA_Ind32Ctrl(MS_U8 u8dirction)860 void RSA_Ind32Ctrl(MS_U8 u8dirction)
861 {
862 //[1] reg_ind32_direction 0: Read. 1: Write
863 if(u8dirction==1)
864 {
865 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Start) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Start)|(RSA_IND32_CTRL_DIRECTION_WRITE));
866 }
867 else
868 {
869 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Start) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Start)&(~RSA_IND32_CTRL_DIRECTION_WRITE));
870 }
871
872 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));
873
874 }
875
RSA_LoadSram(MS_U32 * u32Buf,RSA_IND32Address eMode)876 void RSA_LoadSram(MS_U32 *u32Buf, RSA_IND32Address eMode)
877 {
878 MS_U32 u32Cmd = 0;
879 MS_U32 i = 0;
880 MS_U32 WData_H = 0;
881 MS_U32 WData_L = 0;
882
883 switch (eMode)
884 {
885 case E_RSA_ADDRESS_E:
886 u32Cmd |= (RSA_E_BASE_ADDR);
887 break;
888
889 case E_RSA_ADDRESS_N:
890 u32Cmd |= (RSA_N_BASE_ADDR);
891 break;
892
893 case E_RSA_ADDRESS_A:
894 u32Cmd |= (RSA_A_BASE_ADDR);
895 break;
896
897 default:
898 return;
899 }
900
901 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Addr) , ((_AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Addr)&(~RSA_ADDRESS_MASK))|u32Cmd));
902 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Start) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Start)|(RSA_INDIRECT_START));
903
904 for( i = 0; i < 64; i++ )
905 {
906 if( eMode == E_RSA_ADDRESS_E )
907 {
908 WData_L = (((*(u32Buf+i))>>8)&0xFF00)|(((*(u32Buf+i))>>24)&0xFF);
909 WData_H = (((*(u32Buf+i))>>8)&0xFF)|(((*(u32Buf+i))<<8)&0xFF00);
910 }
911 else
912 {
913 WData_L = (((*(u32Buf-i))>>8)&0xFF00)|(((*(u32Buf-i))>>24)&0xFF);
914 WData_H = (((*(u32Buf-i))>>8)&0xFF)|(((*(u32Buf-i))<<8)&0xFF00);
915 }
916
917 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Addr) , ((_AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Addr)&(~RSA_WDATA_MASK_L))|(WData_L<<16)));
918 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_WData) , ((_AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_WData)&(~RSA_WDATA_MASK_H))|WData_H));
919 }
920
921 }
922
RSA_SetKeyLength(MS_U32 u32keylen)923 void RSA_SetKeyLength(MS_U32 u32keylen)
924 {
925 //[13:8] n_len_e: key length
926 REG32_W((&_SHARNGCtrl[0].Rsa_Ctrl) , (_AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl)&(~RSA_CTRL_KEY_LENGTH_MASK))|(u32keylen<<8));
927 }
928
RSA_SetKeyType(MS_U8 u8hwkey,MS_U8 u8pubkey)929 void RSA_SetKeyType(MS_U8 u8hwkey, MS_U8 u8pubkey)
930 {
931 //[1] hw_key_e : 0 : software key, 1: hardware key
932 //[2] e_pub_e : 0: pvivate key, 1: public key
933 if(u8hwkey==1)
934 {
935 REG32_W((&_SHARNGCtrl[0].Rsa_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl)|(RSA_CTRL_SEL_HW_KEY));
936 }
937 else
938 {
939 REG32_W((&_SHARNGCtrl[0].Rsa_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl)&(~RSA_CTRL_SEL_HW_KEY));
940 }
941
942 if(u8pubkey==1)
943 {
944 REG32_W((&_SHARNGCtrl[0].Rsa_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl)|(RSA_CTRL_SEL_PUBLIC_KEY));
945 }
946 else
947 {
948 REG32_W((&_SHARNGCtrl[0].Rsa_Ctrl) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl)&(~RSA_CTRL_SEL_PUBLIC_KEY));
949 }
950
951 }
952
RSA_ExponetialStart(void)953 void RSA_ExponetialStart(void)
954 {
955 //RSA exp start
956 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_RData) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_RData)|(RSA_EXP_START));
957 }
958
RSA_GetStatus(void)959 MS_U32 RSA_GetStatus(void)
960 {
961 return _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ctrl) & RSA_STATUS_MASK;
962 }
963
RSA_FileOutStart(void)964 void RSA_FileOutStart(void)
965 {
966 //RSA ind32_start
967 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Start) , _AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Start)|(RSA_INDIRECT_START));
968 }
969
RSA_SetFileOutAddr(MS_U32 u32offset)970 void RSA_SetFileOutAddr(MS_U32 u32offset)
971 {
972 MS_PHY u32Addr = 0;
973 u32Addr = RSA_Z_BASE_ADDR + u32offset;
974
975 REG32_W((&_SHARNGCtrl[0].Rsa_Ind32_Addr) , ((_AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_Addr)&(~RSA_ADDRESS_MASK))|u32Addr));
976 }
977
RSA_FileOut(void)978 MS_U32 RSA_FileOut(void)
979 {
980 MS_U32 u32out_L = 0;
981 MS_U32 u32out_H = 0;
982
983 u32out_L = (_AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_WData)&RSA_RDATA_MASK_L)>>16;
984 u32out_H = (_AESDMA_REG32_R(&_SHARNGCtrl[0].Rsa_Ind32_RData)&RSA_RDATA_MASK_H)<<16;
985
986 return (u32out_H|u32out_L);
987 }
988
RSA_Get_RSA_IsFinished(void)989 MS_U32 RSA_Get_RSA_IsFinished(void)
990 {
991 return (RSA_GetStatus()&RSA_STATUS_RSA_BUSY);
992 }
993
994 //reserved for secure protect function
995 /*
996 void AESDMA_Secure_SetCipherKey(MS_U32 *cipherkey)
997 {
998 REG32_W((&_DMASECURECtrl[0].Secure_CipherKey_L.Key_L) , cipherkey[0]);
999 REG32_W((&_DMASECURECtrl[0].Secure_CipherKey_L.Key_H) , cipherkey[1]);
1000 REG32_W((&_DMASECURECtrl[0].Secure_CipherKey_H.Key_L) , cipherkey[2]);
1001 REG32_W((&_DMASECURECtrl[0].Secure_CipherKey_H.Key_H) , cipherkey[3]);
1002 }
1003
1004 void AESDMA_Secure_SetInitVector(MS_U32 *pInitVector)
1005 {
1006 REG32_W((&_DMASECURECtrl[0].Secure_InitVector_L.IV_L), pInitVector[0]);
1007 REG32_W((&_DMASECURECtrl[0].Secure_InitVector_L.IV_H), pInitVector[1]);
1008 REG32_W((&_DMASECURECtrl[0].Secure_InitVector_H.IV_L), pInitVector[2]);
1009 REG32_W((&_DMASECURECtrl[0].Secure_InitVector_H.IV_H), pInitVector[3]);
1010 }
1011
1012 void AESDMA_SecureProtect(MS_BOOL bEnable)
1013 {
1014 if(bEnable)
1015 {
1016 REG32_W((&_DMASECURECtrl[0].Secure_dma3_ctrl) , _AESDMA_REG32_R(&_DMASECURECtrl[0].Secure_dma3_ctrl)|(AESDMA_SECURE_PROTECT_S));
1017 }
1018 else
1019 {
1020 REG32_W((&_DMASECURECtrl[0].Secure_dma3_ctrl) , _AESDMA_REG32_R(&_DMASECURECtrl[0].Secure_dma3_ctrl)&(~AESDMA_SECURE_PROTECT_S));
1021 }
1022 }
1023
1024 void AESDMA_Set_FileOutEnable(MS_BOOL bEnable)
1025 {
1026 if (bEnable)
1027 {
1028 REG32_W((&_AESDMACtrl[0].Dma_Ctrl), (_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl) |AESDMA_CTRL_FILEIN_START));
1029 }
1030 else
1031 {
1032 REG32_W((&_AESDMACtrl[0].Dma_Ctrl), (_AESDMA_REG32_R(&_AESDMACtrl[0].Dma_Ctrl) &~AESDMA_CTRL_FILEIN_START));
1033 }
1034 }
1035
1036 void AESDMA_Secure_Start(MS_BOOL AESDMAStart)
1037 {
1038 if (AESDMAStart)
1039 {
1040 REG32_W((&_DMASECURECtrl[0].Secure_file_st), (_AESDMA_REG32_R(&_DMASECURECtrl[0].Secure_file_st) &~AESDMA_SECURE_FILEIN_START));
1041 REG32_W((&_DMASECURECtrl[0].Secure_file_st), (_AESDMA_REG32_R(&_DMASECURECtrl[0].Secure_file_st) | AESDMA_SECURE_FILEIN_START));
1042 }
1043 else
1044 {
1045 REG32_W((&_DMASECURECtrl[0].Secure_file_st), (_AESDMA_REG32_R(&_DMASECURECtrl[0].Secure_file_st) &~AESDMA_SECURE_FILEIN_START));
1046 }
1047 }
1048
1049 MS_U32 AESDMA_Get_AESDMA_SecureIsFinished(void)
1050 {
1051 return (_AESDMA_REG32_R(&_DMASECURECtrl[0].Secure_dma3_status) & AESDMA_DONE_S);
1052 }
1053
1054 */
1055
1056 //-------------------------------------------------------------------------------------------------
1057 /// Get status of Secret Key in Normal bank
1058 /// @param N/A
1059 /// @note : Get Status
1060 //-------------------------------------------------------------------------------------------------
AESDMA_IsSecretKeyInNormalBank(void)1061 MS_U32 AESDMA_IsSecretKeyInNormalBank(void)
1062 {
1063 return (_AESDMA_REG32_R(&_SHARNGCtrl[0].Rng_Ctrl) & (SECRET_KEY_IN_NORMAL_BANK));
1064 }
1065
1066 //-------------------------------------------------------------------------------------------------
1067 /// Enable Two keys (Odd/Even) in using HW auto select key.
1068 /// @param bEnable \b IN: Enable/Disable
1069
1070 /// @note : Hardware Parser Decrypt
1071 //-------------------------------------------------------------------------------------------------
AESDMA_Parser_Enable_Two_Keys(MS_BOOL bEnable)1072 void AESDMA_Parser_Enable_Two_Keys(MS_BOOL bEnable)
1073 {
1074 if(bEnable)
1075 {
1076 REG32_W((&_PARSERCtrl[0].Parser_Pid1), _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) | (SCRMB_ENABLE_TWO_KEY) );
1077 }
1078 else
1079 {
1080 REG32_W((&_PARSERCtrl[0].Parser_Pid1), _AESDMA_REG32_R(&_PARSERCtrl[0].Parser_Pid1) & (~SCRMB_ENABLE_TWO_KEY) );
1081 }
1082 }
1083
1084 //-------------------------------------------------------------------------------------------------
1085 /// Set Odd keys in using HW auto select key.
1086 /// @param cipherkey
1087 /// @note : Hardware Parser Decrypt
1088 //-------------------------------------------------------------------------------------------------
AESDMA_Set_CipherOddKey(MS_U32 * cipherkey)1089 void AESDMA_Set_CipherOddKey(MS_U32 *cipherkey)
1090 {
1091 REG32_W((&_AESDMACtrlEx[0].Dma_CipherKey_L.Key_L) , cipherkey[0]);
1092 REG32_W((&_AESDMACtrlEx[0].Dma_CipherKey_L.Key_H) , cipherkey[1]);
1093 REG32_W((&_AESDMACtrlEx[0].Dma_CipherKey_H.Key_L) , cipherkey[2]);
1094 REG32_W((&_AESDMACtrlEx[0].Dma_CipherKey_H.Key_H) , cipherkey[3]);
1095 }
1096
1097 //-------------------------------------------------------------------------------------------------
1098 /// Set Odd IVs in using HW auto select key.
1099 /// @param cipherkey
1100 /// @note : Hardware Parser Decrypt
1101 //-------------------------------------------------------------------------------------------------
AESDMA_Set_OddInitVector(MS_U32 * pInitVector)1102 void AESDMA_Set_OddInitVector(MS_U32 *pInitVector)
1103 {
1104 REG32_W((&_AESDMACtrlEx[0].Dma_InitVector_L.IV_L), pInitVector[0]);
1105 REG32_W((&_AESDMACtrlEx[0].Dma_InitVector_L.IV_H), pInitVector[1]);
1106 REG32_W((&_AESDMACtrlEx[0].Dma_InitVector_H.IV_L), pInitVector[2]);
1107 REG32_W((&_AESDMACtrlEx[0].Dma_InitVector_H.IV_H), pInitVector[3]);
1108 }
1109
1110 //-------------------------------------------------------------------------------------------------
1111 /// Set Even keys in using HW auto select key.
1112 /// @param cipherkey
1113 /// @note : Hardware Parser Decrypt
1114 //-------------------------------------------------------------------------------------------------
AESDMA_Set_CipherEvenKey(MS_U32 * cipherkey)1115 void AESDMA_Set_CipherEvenKey(MS_U32 *cipherkey)
1116 {
1117 AESDMA_Set_CipherKey(cipherkey);
1118 }
1119
1120 //-------------------------------------------------------------------------------------------------
1121 /// Set Even IVs in using HW auto select key.
1122 /// @param cipherkey
1123 /// @note : Hardware Parser Decrypt
1124 //-------------------------------------------------------------------------------------------------
AESDMA_Set_EvenInitVector(MS_U32 * pInitVector)1125 void AESDMA_Set_EvenInitVector(MS_U32 *pInitVector)
1126 {
1127 AESDMA_Set_InitVector(pInitVector);
1128 }
1129
1130 //-------------------------------------------------------------------------------------------------
1131 /// Set HDCP Data
1132 /// @param u8Idx \b IN: Index
1133 /// @param pu8Data \b IN: Content Keys
1134 /// @param pu8privData \b IN: RIV
1135 /// @note : Set HDCP2.2
1136 //-------------------------------------------------------------------------------------------------
HDCP_ProcessCipher(MS_U8 u8Idx,MS_U8 * pu8Data,MS_U8 * pu8privData)1137 void HDCP_ProcessCipher (MS_U8 u8Idx, MS_U8 *pu8Data, MS_U8* pu8privData)
1138 {
1139 REG_HDCP22Data *pData = NULL;
1140 REG_HDCP22SEKCtrl *pCtrl = NULL;
1141 MS_U16 offset = 0;
1142 MS_U16 BKOffset = 0;
1143
1144 MS_U32 *cipherkey = (MS_U32 *)pu8Data;
1145 MS_U32 *riv = (MS_U32 *)pu8privData;
1146
1147 offset = u8Idx * (sizeof(REG_HDCP22Data) >> 1);
1148 BKOffset = u8Idx * 0x300;
1149
1150 pData = (REG_HDCP22Data*)((MS_U16*)_HDCP22Data + offset);
1151 pCtrl = (REG_HDCP22SEKCtrl*)((MS_U16*)_HDCP22SekCtrl + BKOffset);
1152
1153 //Content Keys
1154 REG32_W((&pData[0].Hdcp22_ContentKey[0]) , cipherkey[0]);
1155 REG32_W((&pData[0].Hdcp22_ContentKey[1]) , cipherkey[1]);
1156 REG32_W((&pData[0].Hdcp22_ContentKey[2]) , cipherkey[2]);
1157 REG32_W((&pData[0].Hdcp22_ContentKey[3]) , cipherkey[3]);
1158
1159 //RIV
1160 REG32_W((&pData[0].Hdcp22_Riv[0]) , riv[0]);
1161 REG32_W((&pData[0].Hdcp22_Riv[1]) , riv[1]);
1162
1163 //Set SKE successful
1164 REG32_W((&pCtrl[0].SEK), (_AESDMA_REG32_R(&pCtrl[0].SEK) | HDCP_SEK_BIT0));
1165 }
1166
1167 //-------------------------------------------------------------------------------------------------
1168 /// Get the status of HW supports HDCP2.2
1169 /// @param N/A
1170 /// @note : Support HDCP2.2
1171 //-------------------------------------------------------------------------------------------------
HDCP_GetHdcpCipherState(MS_U8 u8Idx,MS_U8 * pu8State)1172 void HDCP_GetHdcpCipherState(MS_U8 u8Idx, MS_U8 *pu8State)
1173 {
1174 #define HDCP_SUPPORT_EN 0x00000001
1175 REG_HDCP22SEKCtrl *pCtrl = NULL;
1176 MS_U16 offset = 0;
1177 MS_U16 BKOffset = 0;
1178
1179 offset = u8Idx * (sizeof(REG_HDCP22Data) >> 1);
1180 BKOffset = u8Idx * 0x300;
1181
1182 pCtrl = (REG_HDCP22SEKCtrl*)((MS_U16*)_HDCP22SekCtrl + BKOffset);
1183
1184 *pu8State = (MS_U8)(_AESDMA_REG32_R(&pCtrl[0].SEK) & HDCP_SUPPORT_EN);
1185 }
1186
1187 //-------------------------------------------------------------------------------------------------
1188 /// Reset AESDMA
1189 /// @param N/A
1190 /// @note : Clear Registers, not to do sw reset
1191 //-------------------------------------------------------------------------------------------------
AESDMA_NormalReset(void)1192 void AESDMA_NormalReset(void)
1193 {
1194 MS_VIRT Reg_AESDMA;
1195 MS_U32 i = 0;
1196 Reg_AESDMA = (MS_VIRT)(&_AESDMACtrl[0].Dma_Ctrl);
1197
1198 REG32_W((&_AESDMACtrl[0].Dma_Ctrl) , 0x00000000); // clear ctrl register
1199
1200 // reset all AESdma register
1201 for (i = 0 ; i < 19 ; i++)
1202 {
1203 REG32_W((REG32 *)(Reg_AESDMA+(i*8)), 0x00000000);
1204 }
1205 // reset secure_dma3_ctrl register
1206 REG32_W((&_DMASECURECtrl[0].Secure_dma3_ctrl), 0x00000000);
1207
1208 // reset hw_parser_ctrl register
1209 REG32_W((&_PARSERCtrl[0].Parser_Pid1),0x00000000);
1210 REG32_W((&_PARSERCtrl[0].Parser_Ctrl),0x00000000);
1211 }
1212