xref: /utopia/UTPA2-700.0.x/modules/dscmb/drv/dscmb2/drvDSCMB.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2006-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi ///
97*53ee8cc1Swenshuai.xi /// file   drvDSCMB.c
98*53ee8cc1Swenshuai.xi /// @brief  Descrambler (DSCMB) Driver Interface
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor,Inc.
100*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi 
102*53ee8cc1Swenshuai.xi #include "MsCommon.h"
103*53ee8cc1Swenshuai.xi #include "MsVersion.h"
104*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
105*53ee8cc1Swenshuai.xi #include <linux/string.h>
106*53ee8cc1Swenshuai.xi #include <linux/limits.h>
107*53ee8cc1Swenshuai.xi #else
108*53ee8cc1Swenshuai.xi #include <limits.h>
109*53ee8cc1Swenshuai.xi #include <string.h>
110*53ee8cc1Swenshuai.xi #endif
111*53ee8cc1Swenshuai.xi 
112*53ee8cc1Swenshuai.xi #include "drvSYS.h"
113*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
114*53ee8cc1Swenshuai.xi 
115*53ee8cc1Swenshuai.xi #include "drvDSCMB.h"
116*53ee8cc1Swenshuai.xi #include "regDSCMB.h"
117*53ee8cc1Swenshuai.xi #include "halDSCMB.h"
118*53ee8cc1Swenshuai.xi #include "asmCPU.h"
119*53ee8cc1Swenshuai.xi #include "utopia.h"
120*53ee8cc1Swenshuai.xi 
121*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA_20
122*53ee8cc1Swenshuai.xi #define  DSCMB_UTOPIA20
123*53ee8cc1Swenshuai.xi #else
124*53ee8cc1Swenshuai.xi #undef DSCMB_UTOPIA20
125*53ee8cc1Swenshuai.xi #endif
126*53ee8cc1Swenshuai.xi 
127*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
128*53ee8cc1Swenshuai.xi #include "drvDSCMB_v2.h"
129*53ee8cc1Swenshuai.xi #endif
130*53ee8cc1Swenshuai.xi 
131*53ee8cc1Swenshuai.xi #include "drvDSCMB_private.h"
132*53ee8cc1Swenshuai.xi 
133*53ee8cc1Swenshuai.xi // Threshold for KL calculation //
134*53ee8cc1Swenshuai.xi #define DSCMB_KL_WAIT_THRESHOLD 300
135*53ee8cc1Swenshuai.xi 
136*53ee8cc1Swenshuai.xi #define FLEXIBLE_PIDSLOTMAP
137*53ee8cc1Swenshuai.xi //=========================================================================================
138*53ee8cc1Swenshuai.xi //  Data Structure Declaration
139*53ee8cc1Swenshuai.xi //=========================================================================================
140*53ee8cc1Swenshuai.xi #define DSCMB_LOCK(_a_)      MsOS_ObtainMutex ( (_a_) , MSOS_WAIT_FOREVER );    HAL_DSCMB_KTE_HW_SEM_Lock(DSCMB_KL_WAIT_THRESHOLD);
141*53ee8cc1Swenshuai.xi #define DSCMB_UNLOCK(_a_)    HAL_DSCMB_KTE_HW_SEM_Unlock(); MsOS_ReleaseMutex( (_a_) )
142*53ee8cc1Swenshuai.xi 
143*53ee8cc1Swenshuai.xi static MS_U32 _u32DSCMB2DbgLv = DSCMB2_DBGLV_WARNING;
144*53ee8cc1Swenshuai.xi static MS_BOOL _bDSCMB2Drv_Inited = FALSE;
145*53ee8cc1Swenshuai.xi static MS_BOOL _bKLDrv_Inited = FALSE;
146*53ee8cc1Swenshuai.xi 
147*53ee8cc1Swenshuai.xi #ifdef DSCMB_NO_PRINTF
148*53ee8cc1Swenshuai.xi #define DRVDSCMB2_DBG(lv, x, args...)
149*53ee8cc1Swenshuai.xi #else
150*53ee8cc1Swenshuai.xi #define DRVDSCMB2_DBG(lv, x, args...) \
151*53ee8cc1Swenshuai.xi     if (lv <= _u32DSCMB2DbgLv ) \
152*53ee8cc1Swenshuai.xi     {   \
153*53ee8cc1Swenshuai.xi         if(lv == DSCMB2_DBGLV_ERR){ printf("[ERROR]"); } \
154*53ee8cc1Swenshuai.xi         else if(lv == DSCMB2_DBGLV_WARNING){ printf("[WARNING]"); }\
155*53ee8cc1Swenshuai.xi         else{ printf("[DEBUG]"); }\
156*53ee8cc1Swenshuai.xi         if(_u32DSCMB2DbgLv >= DSCMB2_DBGLV_DEBUG){ printf("[%05d][%-35s]", __LINE__, __FUNCTION__); }\
157*53ee8cc1Swenshuai.xi         printf(" ");\
158*53ee8cc1Swenshuai.xi         printf(x, ##args); \
159*53ee8cc1Swenshuai.xi     }
160*53ee8cc1Swenshuai.xi #endif
161*53ee8cc1Swenshuai.xi 
162*53ee8cc1Swenshuai.xi #define DSCMB_ASSERT(x, p, ret)  if (!(x)){DRVDSCMB2_DBG(DSCMB2_DBGLV_ALERT, "ALERT FAIL: %s\n", p); return ret;}
163*53ee8cc1Swenshuai.xi #define DSCMB_INIT_CHECK(ret)    DSCMB_ASSERT(_bDSCMB2Drv_Inited == TRUE, "The drvDSCMB2 is not initialized\n", ret)
164*53ee8cc1Swenshuai.xi #define KL_INIT_CHECK(ret)    DSCMB_ASSERT(_bKLDrv_Inited == TRUE, "The Key Ladder is not initialized\n", ret)
165*53ee8cc1Swenshuai.xi #define OBSOLETE_FUNCTION(x, args...)    DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "[%05d][%-35s]"x, __LINE__, __FUNCTION__, ##args)
166*53ee8cc1Swenshuai.xi 
167*53ee8cc1Swenshuai.xi static MSIF_Version _drv_dscmb_version =
168*53ee8cc1Swenshuai.xi {
169*53ee8cc1Swenshuai.xi     .DDI = { DSCMB_DRV_VERSION, },
170*53ee8cc1Swenshuai.xi };
171*53ee8cc1Swenshuai.xi 
172*53ee8cc1Swenshuai.xi 
173*53ee8cc1Swenshuai.xi 
174*53ee8cc1Swenshuai.xi 
175*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
176*53ee8cc1Swenshuai.xi     extern stTspFltInfo*  _u32PidFlt2Dscmb;
177*53ee8cc1Swenshuai.xi     extern MS_BOOL*       _bFreeSlot;
178*53ee8cc1Swenshuai.xi     extern stDscmbTspMap (*DscmbTspMap)[HAL_DSCMB_KTE_MAX];
179*53ee8cc1Swenshuai.xi     extern MS_BOOL*       _bFreeRIVSlot;
180*53ee8cc1Swenshuai.xi #else
181*53ee8cc1Swenshuai.xi     static stTspFltInfo  _u32PidFlt2Dscmb[HAL_DSCMB_PIDFLT_NUM];
182*53ee8cc1Swenshuai.xi     static stDscmbTspMap DscmbTspMap[HAL_DSCMB_ENG_NUM][HAL_DSCMB_KTE_MAX];
183*53ee8cc1Swenshuai.xi     static MS_BOOL       _bFreeSlot[HAL_DSCMB_KTE_MAX];
184*53ee8cc1Swenshuai.xi     static MS_BOOL       _bFreeRIVSlot[HAL_DSCMB_RIV_MAX];
185*53ee8cc1Swenshuai.xi #endif
186*53ee8cc1Swenshuai.xi 
187*53ee8cc1Swenshuai.xi // TODO: Fix me, need to put to resource private?
188*53ee8cc1Swenshuai.xi static MS_S32 _s32DscMutexId = -1 ;
189*53ee8cc1Swenshuai.xi static MS_S32 _s32KLMutexId = -1 ;
190*53ee8cc1Swenshuai.xi 
191*53ee8cc1Swenshuai.xi // TODO: Does it nessarary?
192*53ee8cc1Swenshuai.xi MS_U8  _u8KLPreLevel = 0;
193*53ee8cc1Swenshuai.xi 
194*53ee8cc1Swenshuai.xi static MS_BOOL  _bUsedCAFlt[DSCMB_CAPVR_PIDTABLE_NUM][HAL_DSCMB_SPSPVR_FLT_NUM];
195*53ee8cc1Swenshuai.xi 
196*53ee8cc1Swenshuai.xi 
197*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
198*53ee8cc1Swenshuai.xi static void *pu32DscmbInst = NULL;
199*53ee8cc1Swenshuai.xi #endif
200*53ee8cc1Swenshuai.xi 
201*53ee8cc1Swenshuai.xi #define SLOTUSED 1
202*53ee8cc1Swenshuai.xi #define SLOTEMPTY 0
203*53ee8cc1Swenshuai.xi 
204*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
_DSCMB_SlotEmptyCount(void)205*53ee8cc1Swenshuai.xi MS_U32 _DSCMB_SlotEmptyCount(void)
206*53ee8cc1Swenshuai.xi {
207*53ee8cc1Swenshuai.xi     MS_U32 i = 0 ;
208*53ee8cc1Swenshuai.xi     MS_U32 count = 0 ;
209*53ee8cc1Swenshuai.xi 
210*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < HAL_DSCMB_KTE_MAX ; i++)
211*53ee8cc1Swenshuai.xi     {
212*53ee8cc1Swenshuai.xi         if (_bFreeSlot[i] == SLOTEMPTY )
213*53ee8cc1Swenshuai.xi         {
214*53ee8cc1Swenshuai.xi             count++;
215*53ee8cc1Swenshuai.xi         }
216*53ee8cc1Swenshuai.xi     }
217*53ee8cc1Swenshuai.xi     return count;
218*53ee8cc1Swenshuai.xi }
219*53ee8cc1Swenshuai.xi 
_DSCMB_SlotAlloc(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Key_Type KeyType,MS_U32 * pu32SlotId)220*53ee8cc1Swenshuai.xi MS_BOOL _DSCMB_SlotAlloc(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Key_Type KeyType, MS_U32* pu32SlotId)
221*53ee8cc1Swenshuai.xi {
222*53ee8cc1Swenshuai.xi     MS_U32 i = 0 ;
223*53ee8cc1Swenshuai.xi     *pu32SlotId = 0 ;
224*53ee8cc1Swenshuai.xi 
225*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < HAL_DSCMB_KTE_MAX ; i++)
226*53ee8cc1Swenshuai.xi     {
227*53ee8cc1Swenshuai.xi         if (_bFreeSlot[i] == SLOTEMPTY )
228*53ee8cc1Swenshuai.xi         {
229*53ee8cc1Swenshuai.xi             _bFreeSlot[i] = SLOTUSED ;
230*53ee8cc1Swenshuai.xi             *pu32SlotId = i ;
231*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "DSCMB Filter 0x%x Key 0x%x has index 0x%x\n", (MS_U16)u32DscmbId,
232*53ee8cc1Swenshuai.xi             (MS_U16)KeyType, (MS_U16)i);
233*53ee8cc1Swenshuai.xi             return TRUE;
234*53ee8cc1Swenshuai.xi         }
235*53ee8cc1Swenshuai.xi     }
236*53ee8cc1Swenshuai.xi     return FALSE ;
237*53ee8cc1Swenshuai.xi }
238*53ee8cc1Swenshuai.xi 
239*53ee8cc1Swenshuai.xi 
_DSCMB_SlotFree(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Key_Type KeyType,MS_U32 u32SlotId)240*53ee8cc1Swenshuai.xi MS_BOOL _DSCMB_SlotFree(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Key_Type KeyType, MS_U32 u32SlotId)
241*53ee8cc1Swenshuai.xi {
242*53ee8cc1Swenshuai.xi     if(u32SlotId < HAL_DSCMB_KTE_MAX)
243*53ee8cc1Swenshuai.xi     {
244*53ee8cc1Swenshuai.xi         _bFreeSlot[u32SlotId] = SLOTEMPTY ;
245*53ee8cc1Swenshuai.xi         return TRUE ;
246*53ee8cc1Swenshuai.xi     }
247*53ee8cc1Swenshuai.xi 
248*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "Free an empty keyslot out of range\n");
249*53ee8cc1Swenshuai.xi 
250*53ee8cc1Swenshuai.xi     return FALSE;
251*53ee8cc1Swenshuai.xi }
252*53ee8cc1Swenshuai.xi 
_DSCMB_SlotRIVAlloc(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 * pu32SlotId)253*53ee8cc1Swenshuai.xi MS_BOOL _DSCMB_SlotRIVAlloc(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32* pu32SlotId)
254*53ee8cc1Swenshuai.xi {
255*53ee8cc1Swenshuai.xi     MS_U32 i = 0 ;
256*53ee8cc1Swenshuai.xi     *pu32SlotId = 0 ;
257*53ee8cc1Swenshuai.xi 
258*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < HAL_DSCMB_RIV_MAX ; i++)
259*53ee8cc1Swenshuai.xi     {
260*53ee8cc1Swenshuai.xi         if (_bFreeRIVSlot[i] == SLOTEMPTY )
261*53ee8cc1Swenshuai.xi         {
262*53ee8cc1Swenshuai.xi             _bFreeRIVSlot[i] = SLOTUSED ;
263*53ee8cc1Swenshuai.xi             *pu32SlotId = i ;
264*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "DSCMB 0x%x has RIV index 0x%x\n", (MS_U16)u32DscmbId,(MS_U16)i);
265*53ee8cc1Swenshuai.xi             return TRUE;
266*53ee8cc1Swenshuai.xi         }
267*53ee8cc1Swenshuai.xi     }
268*53ee8cc1Swenshuai.xi     return FALSE ;
269*53ee8cc1Swenshuai.xi }
270*53ee8cc1Swenshuai.xi 
271*53ee8cc1Swenshuai.xi 
_DSCMB_SlotRIVFree(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32SlotId)272*53ee8cc1Swenshuai.xi MS_BOOL _DSCMB_SlotRIVFree(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32SlotId)
273*53ee8cc1Swenshuai.xi {
274*53ee8cc1Swenshuai.xi     if(u32SlotId < HAL_DSCMB_RIV_MAX)
275*53ee8cc1Swenshuai.xi     {
276*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Free u32SlotId 0x%x\n", u32SlotId);
277*53ee8cc1Swenshuai.xi         _bFreeRIVSlot[u32SlotId] = SLOTEMPTY ;
278*53ee8cc1Swenshuai.xi         return TRUE ;
279*53ee8cc1Swenshuai.xi     }
280*53ee8cc1Swenshuai.xi 
281*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "Free an empty keyslot out of range\n");
282*53ee8cc1Swenshuai.xi 
283*53ee8cc1Swenshuai.xi     return FALSE;
284*53ee8cc1Swenshuai.xi }
285*53ee8cc1Swenshuai.xi 
286*53ee8cc1Swenshuai.xi // Find a filter which connect to target dscmb ID
_DSCMB_Dscmb2Flt(MS_U32 u32DscmbId,MS_U32 * pFltId)287*53ee8cc1Swenshuai.xi MS_BOOL _DSCMB_Dscmb2Flt(MS_U32 u32DscmbId , MS_U32* pFltId)
288*53ee8cc1Swenshuai.xi {
289*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
290*53ee8cc1Swenshuai.xi     *pFltId = u32DscmbId;
291*53ee8cc1Swenshuai.xi     return TRUE;
292*53ee8cc1Swenshuai.xi #else
293*53ee8cc1Swenshuai.xi     *pFltId = 0 ;
294*53ee8cc1Swenshuai.xi     MS_U32 i ;
295*53ee8cc1Swenshuai.xi 
296*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < HAL_DSCMB_PIDFLT_NUM ; i ++)
297*53ee8cc1Swenshuai.xi     {
298*53ee8cc1Swenshuai.xi         if ( _u32PidFlt2Dscmb[i].u8DscmbId== u32DscmbId )
299*53ee8cc1Swenshuai.xi         {
300*53ee8cc1Swenshuai.xi             break ;
301*53ee8cc1Swenshuai.xi         }
302*53ee8cc1Swenshuai.xi     }
303*53ee8cc1Swenshuai.xi 
304*53ee8cc1Swenshuai.xi     if ( i == HAL_DSCMB_PIDFLT_NUM )
305*53ee8cc1Swenshuai.xi     {
306*53ee8cc1Swenshuai.xi         return FALSE ;
307*53ee8cc1Swenshuai.xi     }
308*53ee8cc1Swenshuai.xi 
309*53ee8cc1Swenshuai.xi     *pFltId = i ;
310*53ee8cc1Swenshuai.xi 
311*53ee8cc1Swenshuai.xi     return TRUE ;
312*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP */
313*53ee8cc1Swenshuai.xi }
314*53ee8cc1Swenshuai.xi 
_DumpMapInfo(MS_U32 idx)315*53ee8cc1Swenshuai.xi void _DumpMapInfo(MS_U32 idx)
316*53ee8cc1Swenshuai.xi {
317*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
318*53ee8cc1Swenshuai.xi 
319*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[0][idx];
320*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Index:     %u\n", idx);
321*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Used:      %d\n", pMap->bUsed);
322*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Even  Idx: %u\n", pMap->u32SlotIdEven);
323*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Odd   Idx: %u\n", pMap->u32SlotIdOdd);
324*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Clear Idx: %u\n", pMap->u32SlotIdClear);
325*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "RIV   Idx: %u\n", pMap->u32RIVIdx);
326*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "PidFlt #:  %u\n", pMap->u32PidFltIdNum);
327*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Dscmb:     %d\n", pMap->bDscmb);
328*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, " %s\n", pMap->eFltType  == E_DSCMB_FLT_2_KEYS ?"2 Keys":"3 Keys");
329*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "CAVid:     %u\n", pMap->u32CAVid);
330*53ee8cc1Swenshuai.xi }
331*53ee8cc1Swenshuai.xi 
332*53ee8cc1Swenshuai.xi //Enable all PIDSlotMap in the Dscmb filter
_DSCMB_EnableDSCMB(MS_U32 u32DscmbId)333*53ee8cc1Swenshuai.xi MS_BOOL _DSCMB_EnableDSCMB(MS_U32 u32DscmbId)
334*53ee8cc1Swenshuai.xi {
335*53ee8cc1Swenshuai.xi     MS_U32 i;
336*53ee8cc1Swenshuai.xi 
337*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < HAL_DSCMB_PIDFLT_NUM ; i ++)
338*53ee8cc1Swenshuai.xi     {
339*53ee8cc1Swenshuai.xi         if ( _u32PidFlt2Dscmb[i].u8DscmbId== u32DscmbId )
340*53ee8cc1Swenshuai.xi         {
341*53ee8cc1Swenshuai.xi             if(FALSE == HAL_DSCMB_PidIdx_EnableSlot(i))
342*53ee8cc1Swenshuai.xi             {
343*53ee8cc1Swenshuai.xi                 DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "FAIL\n");
344*53ee8cc1Swenshuai.xi                 return FALSE;
345*53ee8cc1Swenshuai.xi             }
346*53ee8cc1Swenshuai.xi             else
347*53ee8cc1Swenshuai.xi             {
348*53ee8cc1Swenshuai.xi                 DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Enable PIDSlotMap %d !!!!!!!!!!!\n", i);
349*53ee8cc1Swenshuai.xi             }
350*53ee8cc1Swenshuai.xi         }
351*53ee8cc1Swenshuai.xi     }
352*53ee8cc1Swenshuai.xi 
353*53ee8cc1Swenshuai.xi     return TRUE;
354*53ee8cc1Swenshuai.xi }
355*53ee8cc1Swenshuai.xi 
356*53ee8cc1Swenshuai.xi //Disable all PIDSlotMap in the Dscmb filter
_DSCMB_DisableDSCMB(MS_U32 u32DscmbId)357*53ee8cc1Swenshuai.xi MS_BOOL _DSCMB_DisableDSCMB(MS_U32 u32DscmbId)
358*53ee8cc1Swenshuai.xi {
359*53ee8cc1Swenshuai.xi     MS_U32 i;
360*53ee8cc1Swenshuai.xi 
361*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < HAL_DSCMB_PIDFLT_NUM ; i ++)
362*53ee8cc1Swenshuai.xi     {
363*53ee8cc1Swenshuai.xi         if ( _u32PidFlt2Dscmb[i].u8DscmbId== u32DscmbId )
364*53ee8cc1Swenshuai.xi         {
365*53ee8cc1Swenshuai.xi             if(FALSE == HAL_DSCMB_PidIdx_DisableSlot(i))
366*53ee8cc1Swenshuai.xi             {
367*53ee8cc1Swenshuai.xi                 DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "FAIL\n");
368*53ee8cc1Swenshuai.xi                 return FALSE;
369*53ee8cc1Swenshuai.xi             }
370*53ee8cc1Swenshuai.xi             else
371*53ee8cc1Swenshuai.xi             {
372*53ee8cc1Swenshuai.xi                 DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Disable PIDSlotMap %d !!!!!!!!!!!\n", i);
373*53ee8cc1Swenshuai.xi             }
374*53ee8cc1Swenshuai.xi 
375*53ee8cc1Swenshuai.xi         }
376*53ee8cc1Swenshuai.xi     }
377*53ee8cc1Swenshuai.xi 
378*53ee8cc1Swenshuai.xi     return TRUE;
379*53ee8cc1Swenshuai.xi }
380*53ee8cc1Swenshuai.xi 
_DSCMB_IsFltConnectDSCMB(MS_U32 u32DscmbId,MS_U32 u32FltId)381*53ee8cc1Swenshuai.xi MS_BOOL _DSCMB_IsFltConnectDSCMB(MS_U32 u32DscmbId, MS_U32 u32FltId)
382*53ee8cc1Swenshuai.xi {
383*53ee8cc1Swenshuai.xi     if(u32DscmbId >= HAL_DSCMB_KTE_MAX || u32FltId >= HAL_DSCMB_PIDFLT_NUM)
384*53ee8cc1Swenshuai.xi     {
385*53ee8cc1Swenshuai.xi         return FALSE;
386*53ee8cc1Swenshuai.xi     }
387*53ee8cc1Swenshuai.xi 
388*53ee8cc1Swenshuai.xi     if(_u32PidFlt2Dscmb[u32FltId].u8DscmbId == u32DscmbId)
389*53ee8cc1Swenshuai.xi     {
390*53ee8cc1Swenshuai.xi         return TRUE;
391*53ee8cc1Swenshuai.xi     }
392*53ee8cc1Swenshuai.xi     else
393*53ee8cc1Swenshuai.xi     {
394*53ee8cc1Swenshuai.xi         return FALSE;
395*53ee8cc1Swenshuai.xi     }
396*53ee8cc1Swenshuai.xi }
397*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_SetPowerState(EN_POWER_MODE u16PowerState)398*53ee8cc1Swenshuai.xi MS_U32  _MDrv_DSCMB2_SetPowerState(EN_POWER_MODE u16PowerState)
399*53ee8cc1Swenshuai.xi {
400*53ee8cc1Swenshuai.xi     MS_U16 _ret = FALSE;
401*53ee8cc1Swenshuai.xi 
402*53ee8cc1Swenshuai.xi     switch (u16PowerState)
403*53ee8cc1Swenshuai.xi     {
404*53ee8cc1Swenshuai.xi         case E_POWER_SUSPEND:
405*53ee8cc1Swenshuai.xi             _ret = _MDrv_DSCMB2_Exit();
406*53ee8cc1Swenshuai.xi             break;
407*53ee8cc1Swenshuai.xi 
408*53ee8cc1Swenshuai.xi         case E_POWER_RESUME:
409*53ee8cc1Swenshuai.xi             _ret = _MDrv_DSCMB2_Init();
410*53ee8cc1Swenshuai.xi             break;
411*53ee8cc1Swenshuai.xi 
412*53ee8cc1Swenshuai.xi         case E_POWER_MECHANICAL:
413*53ee8cc1Swenshuai.xi         case E_POWER_SOFT_OFF:
414*53ee8cc1Swenshuai.xi         default:
415*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "[%s] %d Power state not support!!\n", __FUNCTION__, __LINE__);
416*53ee8cc1Swenshuai.xi             break;
417*53ee8cc1Swenshuai.xi     }
418*53ee8cc1Swenshuai.xi 
419*53ee8cc1Swenshuai.xi     return _ret;
420*53ee8cc1Swenshuai.xi }
421*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_KLadder_Init(void)422*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_KLadder_Init(void)
423*53ee8cc1Swenshuai.xi {
424*53ee8cc1Swenshuai.xi     MS_VIRT u32Bank;
425*53ee8cc1Swenshuai.xi     MS_PHY u32BankSize;
426*53ee8cc1Swenshuai.xi 
427*53ee8cc1Swenshuai.xi     if(_bKLDrv_Inited == TRUE)
428*53ee8cc1Swenshuai.xi     {
429*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_NOTICE, "Key Ladder driver already init\n");
430*53ee8cc1Swenshuai.xi         return TRUE;
431*53ee8cc1Swenshuai.xi     }
432*53ee8cc1Swenshuai.xi 
433*53ee8cc1Swenshuai.xi     if (FALSE == MDrv_MMIO_GetBASE(&u32Bank, &u32BankSize, MS_MODULE_HW))
434*53ee8cc1Swenshuai.xi     {
435*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Get MMIO base fail\n");
436*53ee8cc1Swenshuai.xi         return FALSE;
437*53ee8cc1Swenshuai.xi     }
438*53ee8cc1Swenshuai.xi 
439*53ee8cc1Swenshuai.xi     HAL_DSCMB_SetBank(u32Bank);
440*53ee8cc1Swenshuai.xi 
441*53ee8cc1Swenshuai.xi     _s32KLMutexId  = MsOS_CreateMutex(E_MSOS_FIFO,"KeyLadder_Mutex", MSOS_PROCESS_SHARED);
442*53ee8cc1Swenshuai.xi     _bKLDrv_Inited = TRUE;
443*53ee8cc1Swenshuai.xi     return TRUE;
444*53ee8cc1Swenshuai.xi }
445*53ee8cc1Swenshuai.xi 
446*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
447*53ee8cc1Swenshuai.xi /// Initialize dscrambler driver and descrambler engine by init flag
448*53ee8cc1Swenshuai.xi /// @param bSWInit\b IN: If TRUE, do SW init only. If FALSE do HW&SW init.
449*53ee8cc1Swenshuai.xi /// @return TRUE - Success
450*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
451*53ee8cc1Swenshuai.xi /// @note
452*53ee8cc1Swenshuai.xi /// It should be called before calling any other dscrambler DDI functions.
453*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
_MDrv_DSCMB2_InitBySWFlag(MS_BOOL bSWInit)454*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_InitBySWFlag(MS_BOOL bSWInit)
455*53ee8cc1Swenshuai.xi {
456*53ee8cc1Swenshuai.xi     MS_VIRT u32Bank;
457*53ee8cc1Swenshuai.xi     MS_PHY u32BankSize;
458*53ee8cc1Swenshuai.xi     MS_U32 i , j;
459*53ee8cc1Swenshuai.xi     MS_U32 u32CAVid = DEFAULT_CAVID;
460*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG,"u32CAVid = %d ++++\n", u32CAVid);
461*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_INFO,"ChipRev=%d\n", MDrv_SYS_GetChipRev());
462*53ee8cc1Swenshuai.xi     if(_bDSCMB2Drv_Inited == TRUE)
463*53ee8cc1Swenshuai.xi     {
464*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_NOTICE, "DSCMB driver already init\n");
465*53ee8cc1Swenshuai.xi         return TRUE;
466*53ee8cc1Swenshuai.xi     }
467*53ee8cc1Swenshuai.xi 
468*53ee8cc1Swenshuai.xi     if(u32CAVid == 0)
469*53ee8cc1Swenshuai.xi     {
470*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Invalid CAVid\n");
471*53ee8cc1Swenshuai.xi         return FALSE;
472*53ee8cc1Swenshuai.xi     }
473*53ee8cc1Swenshuai.xi 
474*53ee8cc1Swenshuai.xi     if (FALSE == MDrv_MMIO_GetBASE(&u32Bank, &u32BankSize, MS_MODULE_HW))
475*53ee8cc1Swenshuai.xi     {
476*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Get MMIO base fail\n");
477*53ee8cc1Swenshuai.xi         return FALSE;
478*53ee8cc1Swenshuai.xi     }
479*53ee8cc1Swenshuai.xi 
480*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_INFO, "Bank = 0x%X\n", (unsigned int)u32Bank);
481*53ee8cc1Swenshuai.xi     HAL_DSCMB_SetBank(u32Bank);
482*53ee8cc1Swenshuai.xi 
483*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_INFO, "CAVid = 0x%X\n", (unsigned int)u32CAVid);
484*53ee8cc1Swenshuai.xi     HAL_DSCMB_SetCAVid(u32CAVid);
485*53ee8cc1Swenshuai.xi 
486*53ee8cc1Swenshuai.xi     _s32DscMutexId = MsOS_CreateMutex(E_MSOS_FIFO,"DSCMB_Mutex", MSOS_PROCESS_SHARED);
487*53ee8cc1Swenshuai.xi     if( FALSE == _MDrv_DSCMB2_KLadder_Init() )
488*53ee8cc1Swenshuai.xi     {
489*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Init Keyladder Fail\n");
490*53ee8cc1Swenshuai.xi         return FALSE;
491*53ee8cc1Swenshuai.xi     }
492*53ee8cc1Swenshuai.xi     if(TRUE == bSWInit)
493*53ee8cc1Swenshuai.xi     {
494*53ee8cc1Swenshuai.xi         goto _MDrv_DSCMB2_InitBySWFlag_RET;
495*53ee8cc1Swenshuai.xi     }
496*53ee8cc1Swenshuai.xi 
497*53ee8cc1Swenshuai.xi     HAL_DSCMB_Init();
498*53ee8cc1Swenshuai.xi     memset(_bFreeSlot, 0x0, sizeof(MS_BOOL)*HAL_DSCMB_KTE_MAX);
499*53ee8cc1Swenshuai.xi     memset(DscmbTspMap , 0x0, sizeof(stDscmbTspMap)*HAL_DSCMB_ENG_NUM*HAL_DSCMB_KTE_MAX);
500*53ee8cc1Swenshuai.xi     memset(_bFreeRIVSlot, 0x0, sizeof(MS_BOOL)*HAL_DSCMB_RIV_MAX);
501*53ee8cc1Swenshuai.xi     memset(_bUsedCAFlt, 0x0, sizeof(_bUsedCAFlt));
502*53ee8cc1Swenshuai.xi     memset(_u32PidFlt2Dscmb, 0x0, sizeof(stTspFltInfo)*HAL_DSCMB_PIDFLT_NUM);
503*53ee8cc1Swenshuai.xi 
504*53ee8cc1Swenshuai.xi     for( j = 0 ; j < HAL_DSCMB_ENG_NUM ; j ++)
505*53ee8cc1Swenshuai.xi     {
506*53ee8cc1Swenshuai.xi         DscmbTspMap[j][0].bUsed = TRUE;//0 will not be used forever
507*53ee8cc1Swenshuai.xi 
508*53ee8cc1Swenshuai.xi         for ( i = 0 ; i < HAL_DSCMB_KTE_MAX ; i ++)
509*53ee8cc1Swenshuai.xi         {
510*53ee8cc1Swenshuai.xi             DscmbTspMap[j][i].u32SlotIdOdd   = DRV_DSCMB_FLT_NULL;
511*53ee8cc1Swenshuai.xi             DscmbTspMap[j][i].u32SlotIdEven  = DRV_DSCMB_FLT_NULL;
512*53ee8cc1Swenshuai.xi             DscmbTspMap[j][i].u32SlotIdClear = DRV_DSCMB_FLT_NULL;
513*53ee8cc1Swenshuai.xi             DscmbTspMap[j][i].u32CAVid       = u32CAVid;
514*53ee8cc1Swenshuai.xi             DscmbTspMap[j][i].u32RIVIdx      = HAL_DSCMB_RIV_MAX;
515*53ee8cc1Swenshuai.xi             DscmbTspMap[j][i].u32Tsid        = HAL_DSCMB_TSID_MAX;
516*53ee8cc1Swenshuai.xi         }
517*53ee8cc1Swenshuai.xi     }
518*53ee8cc1Swenshuai.xi 
519*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < HAL_DSCMB_PIDFLT_NUM ; i++)
520*53ee8cc1Swenshuai.xi     {
521*53ee8cc1Swenshuai.xi         _u32PidFlt2Dscmb[i].u8DscmbId= HAL_DSCMB_KTE_MAX ;
522*53ee8cc1Swenshuai.xi         _u32PidFlt2Dscmb[i].u8CaVid = u32CAVid;
523*53ee8cc1Swenshuai.xi         _u32PidFlt2Dscmb[i].u8TsId = HAL_DSCMB_TSID_MAX;
524*53ee8cc1Swenshuai.xi     }
525*53ee8cc1Swenshuai.xi 
526*53ee8cc1Swenshuai.xi     //Only if DSCMB is enable by OTP, we connect the path to DSCMB
527*53ee8cc1Swenshuai.xi     if( HAL_DSCMB_OTPEnDSCMB() == TRUE)
528*53ee8cc1Swenshuai.xi     {
529*53ee8cc1Swenshuai.xi         //go through DSCMB
530*53ee8cc1Swenshuai.xi         for (i = 0 ; i < REG_DSCMB_PATH_CNT ; i++)
531*53ee8cc1Swenshuai.xi         {
532*53ee8cc1Swenshuai.xi             // set recbuf source to DSCMB
533*53ee8cc1Swenshuai.xi             HAL_DSCMB_ConnectPath(i,TRUE);
534*53ee8cc1Swenshuai.xi         }
535*53ee8cc1Swenshuai.xi         #ifndef DSCMB_NO_PRINTF
536*53ee8cc1Swenshuai.xi         printf("\033[31mGo through DSCMB\n\033[m");
537*53ee8cc1Swenshuai.xi         #endif
538*53ee8cc1Swenshuai.xi     }
539*53ee8cc1Swenshuai.xi     else
540*53ee8cc1Swenshuai.xi     {
541*53ee8cc1Swenshuai.xi         #ifndef DSCMB_NO_PRINTF
542*53ee8cc1Swenshuai.xi         printf("\033[33m ByPass DSCMB\n\033[m");
543*53ee8cc1Swenshuai.xi         #endif
544*53ee8cc1Swenshuai.xi     }
545*53ee8cc1Swenshuai.xi 
546*53ee8cc1Swenshuai.xi _MDrv_DSCMB2_InitBySWFlag_RET:
547*53ee8cc1Swenshuai.xi 
548*53ee8cc1Swenshuai.xi     _bDSCMB2Drv_Inited = TRUE;
549*53ee8cc1Swenshuai.xi 
550*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG,"[%s][%d] ++++\n", __FUNCTION__, __LINE__);
551*53ee8cc1Swenshuai.xi 
552*53ee8cc1Swenshuai.xi     return TRUE;
553*53ee8cc1Swenshuai.xi }
554*53ee8cc1Swenshuai.xi 
555*53ee8cc1Swenshuai.xi 
556*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
557*53ee8cc1Swenshuai.xi /// Initialize dscrambler driver and descrambler engine
558*53ee8cc1Swenshuai.xi /// @return TRUE - Success
559*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
560*53ee8cc1Swenshuai.xi /// @note
561*53ee8cc1Swenshuai.xi /// It should be called before calling any other dscrambler DDI functions.
562*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
_MDrv_DSCMB2_Init(void)563*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_Init(void)
564*53ee8cc1Swenshuai.xi {
565*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_InitBySWFlag(FALSE);
566*53ee8cc1Swenshuai.xi }
567*53ee8cc1Swenshuai.xi 
568*53ee8cc1Swenshuai.xi 
569*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
570*53ee8cc1Swenshuai.xi /// Exit dscrambler driver and descrambler engine
571*53ee8cc1Swenshuai.xi /// @return TRUE - Success
572*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
573*53ee8cc1Swenshuai.xi /// @note
574*53ee8cc1Swenshuai.xi /// It should be called after finish any other dscrambler DDI functions.
575*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
_MDrv_DSCMB2_Exit(void)576*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_Exit(void)
577*53ee8cc1Swenshuai.xi {
578*53ee8cc1Swenshuai.xi     if (_s32DscMutexId != -1)
579*53ee8cc1Swenshuai.xi     {
580*53ee8cc1Swenshuai.xi         MsOS_DeleteMutex(_s32DscMutexId);
581*53ee8cc1Swenshuai.xi         _s32DscMutexId = -1;
582*53ee8cc1Swenshuai.xi     }
583*53ee8cc1Swenshuai.xi 
584*53ee8cc1Swenshuai.xi     if (_s32KLMutexId != -1)
585*53ee8cc1Swenshuai.xi     {
586*53ee8cc1Swenshuai.xi         MsOS_DeleteMutex(_s32KLMutexId);
587*53ee8cc1Swenshuai.xi         _s32KLMutexId = -1;
588*53ee8cc1Swenshuai.xi     }
589*53ee8cc1Swenshuai.xi 
590*53ee8cc1Swenshuai.xi     _bDSCMB2Drv_Inited = FALSE;
591*53ee8cc1Swenshuai.xi     _bKLDrv_Inited = FALSE;
592*53ee8cc1Swenshuai.xi     return TRUE;
593*53ee8cc1Swenshuai.xi }
594*53ee8cc1Swenshuai.xi 
595*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
596*53ee8cc1Swenshuai.xi /// Allocate a dscrambler filter
597*53ee8cc1Swenshuai.xi /// @param eFltType \b IN: type for descramber filter
598*53ee8cc1Swenshuai.xi /// @return Descrambler filter ID - Success
599*53ee8cc1Swenshuai.xi /// @return DRV_DSCMB_FLT_NULL - Failure
600*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
_MDrv_DSCMB2_FltAllocWithCAVid(MS_U32 u32EngId,DSCMB_Flt_Type eFltType,MS_U32 u32CAVid)601*53ee8cc1Swenshuai.xi MS_U32 _MDrv_DSCMB2_FltAllocWithCAVid(MS_U32 u32EngId, DSCMB_Flt_Type eFltType, MS_U32 u32CAVid)
602*53ee8cc1Swenshuai.xi {
603*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(DRV_DSCMB_FLT_NULL);
604*53ee8cc1Swenshuai.xi     MS_BOOL bSecureSlot = (( E_DSCMB_FLT_SECURE_KEYS_ENABLE & eFltType) != 0) ? TRUE : FALSE;
605*53ee8cc1Swenshuai.xi     eFltType = eFltType & (~(E_DSCMB_FLT_SECURE_KEYS_ENABLE));
606*53ee8cc1Swenshuai.xi //#define  E_DSCMB_FLT_PRIV_KEYS_ENABLE   (1 << 6)
607*53ee8cc1Swenshuai.xi //    MS_BOOL bPrivilegeSlot = (( E_DSCMB_FLT_PRIV_KEYS_ENABLE & eFltType) != 0) ? TRUE : FALSE;
608*53ee8cc1Swenshuai.xi //    eFltType = eFltType & (~(E_DSCMB_FLT_SECURE_KEYS_ENABLE | E_DSCMB_FLT_PRIV_KEYS_ENABLE));
609*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", DRV_DSCMB_FLT_NULL);
610*53ee8cc1Swenshuai.xi     DSCMB_ASSERT((eFltType == E_DSCMB_FLT_3_KEYS) || (eFltType == E_DSCMB_FLT_2_KEYS) || (eFltType == E_DSCMB_FLT_1_KEYS), "FltType input error", DRV_DSCMB_FLT_NULL);
611*53ee8cc1Swenshuai.xi     DSCMB_ASSERT((u32CAVid != 0) && (u32CAVid <= DEFAULT_CAVID), "CAVid input error", DRV_DSCMB_FLT_NULL);
612*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Allocate with %d CAVid=%u\n", eFltType, u32CAVid);
613*53ee8cc1Swenshuai.xi 
614*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
615*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
616*53ee8cc1Swenshuai.xi 
617*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
618*53ee8cc1Swenshuai.xi 
619*53ee8cc1Swenshuai.xi     // Find free dscmb slots for a DSCMB flt //
620*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < HAL_DSCMB_KTE_MAX ; i ++)
621*53ee8cc1Swenshuai.xi     {
622*53ee8cc1Swenshuai.xi         pMap = &DscmbTspMap[u32EngId][i];
623*53ee8cc1Swenshuai.xi         if ( pMap->bUsed == FALSE )
624*53ee8cc1Swenshuai.xi         {
625*53ee8cc1Swenshuai.xi             pMap->bUsed = TRUE ;
626*53ee8cc1Swenshuai.xi             // For 1 Key for a Dscmb filter //
627*53ee8cc1Swenshuai.xi             if(eFltType == E_DSCMB_FLT_1_KEYS)
628*53ee8cc1Swenshuai.xi             {
629*53ee8cc1Swenshuai.xi                 MS_U32 u32IgoreModeKeyIdx = 0;
630*53ee8cc1Swenshuai.xi                 if (FALSE == _DSCMB_SlotAlloc( u32EngId , i , E_DSCMB_KEY_CLEAR , &u32IgoreModeKeyIdx))
631*53ee8cc1Swenshuai.xi                 {
632*53ee8cc1Swenshuai.xi                     DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Find SlotMap FAIL\n");
633*53ee8cc1Swenshuai.xi                     goto MDrv_DSCMB2_FltAlloc_Ex_FAIL;
634*53ee8cc1Swenshuai.xi                 }
635*53ee8cc1Swenshuai.xi 
636*53ee8cc1Swenshuai.xi                 pMap->u32SlotIdClear = u32IgoreModeKeyIdx;
637*53ee8cc1Swenshuai.xi                 pMap->u32SlotIdEven  = u32IgoreModeKeyIdx;
638*53ee8cc1Swenshuai.xi                 pMap->u32SlotIdOdd   = u32IgoreModeKeyIdx;
639*53ee8cc1Swenshuai.xi 
640*53ee8cc1Swenshuai.xi                 break;
641*53ee8cc1Swenshuai.xi             }
642*53ee8cc1Swenshuai.xi             // For 3 Keys for a Dscmb filter //
643*53ee8cc1Swenshuai.xi             if ( E_DSCMB_FLT_3_KEYS == eFltType)
644*53ee8cc1Swenshuai.xi             {
645*53ee8cc1Swenshuai.xi                 // Clear key is init in BypassMode
646*53ee8cc1Swenshuai.xi                 if (FALSE == _DSCMB_SlotAlloc( u32EngId , i , E_DSCMB_KEY_CLEAR , &(pMap->u32SlotIdClear)))
647*53ee8cc1Swenshuai.xi                 {
648*53ee8cc1Swenshuai.xi                     DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Find SlotMap FAIL\n");
649*53ee8cc1Swenshuai.xi                     goto MDrv_DSCMB2_FltAlloc_Ex_FAIL;
650*53ee8cc1Swenshuai.xi                 }
651*53ee8cc1Swenshuai.xi             }
652*53ee8cc1Swenshuai.xi 
653*53ee8cc1Swenshuai.xi             // 2 Keys for a Dscmb filter //
654*53ee8cc1Swenshuai.xi             if (FALSE == _DSCMB_SlotAlloc( u32EngId , i , E_DSCMB_KEY_EVEN , &(pMap->u32SlotIdEven)))
655*53ee8cc1Swenshuai.xi             {
656*53ee8cc1Swenshuai.xi                 DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Find SlotMap FAIL\n");
657*53ee8cc1Swenshuai.xi                 goto MDrv_DSCMB2_FltAlloc_Ex_FAIL;
658*53ee8cc1Swenshuai.xi             }
659*53ee8cc1Swenshuai.xi             if (FALSE == _DSCMB_SlotAlloc( u32EngId , i , E_DSCMB_KEY_ODD , &(pMap->u32SlotIdOdd)))
660*53ee8cc1Swenshuai.xi             {
661*53ee8cc1Swenshuai.xi                 DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Find SlotMap FAIL\n");
662*53ee8cc1Swenshuai.xi                 goto MDrv_DSCMB2_FltAlloc_Ex_FAIL;
663*53ee8cc1Swenshuai.xi             }
664*53ee8cc1Swenshuai.xi 
665*53ee8cc1Swenshuai.xi             break; // successfully find a Free DSCMB filter
666*53ee8cc1Swenshuai.xi         }
667*53ee8cc1Swenshuai.xi     }
668*53ee8cc1Swenshuai.xi 
669*53ee8cc1Swenshuai.xi     // Check No free slot
670*53ee8cc1Swenshuai.xi     if( i == HAL_DSCMB_KTE_MAX )
671*53ee8cc1Swenshuai.xi     {
672*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Find SlotMap FAIL\n");
673*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltAlloc_Ex_FAIL;
674*53ee8cc1Swenshuai.xi     }
675*53ee8cc1Swenshuai.xi 
676*53ee8cc1Swenshuai.xi     // Set default value to Map object
677*53ee8cc1Swenshuai.xi     pMap->u32PidFltIdNum = 0;
678*53ee8cc1Swenshuai.xi     pMap->bDscmb = TRUE; //Descramble  or Scramble
679*53ee8cc1Swenshuai.xi     pMap->eFltType = eFltType;
680*53ee8cc1Swenshuai.xi     pMap->u32CAVid = u32CAVid;
681*53ee8cc1Swenshuai.xi     pMap->u32RIVIdx = HAL_DSCMB_RIV_MAX;
682*53ee8cc1Swenshuai.xi     pMap->u32Tsid = HAL_DSCMB_TSID_MAX;
683*53ee8cc1Swenshuai.xi     pMap->bSecure = bSecureSlot;
684*53ee8cc1Swenshuai.xi 
685*53ee8cc1Swenshuai.xi     _DumpMapInfo(i);
686*53ee8cc1Swenshuai.xi 
687*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
688*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(i, E_DSCMB_KEY_EVEN);
689*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(i, E_DSCMB_KEY_ODD);
690*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(i, E_DSCMB_KEY_CLEAR);
691*53ee8cc1Swenshuai.xi 
692*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_SetCAVid(i, u32CAVid);
693*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_SetSecure(i, pMap->bSecure);
694*53ee8cc1Swenshuai.xi     //HAL_DSCMB_PidIdx_SetPrivilege(i, bPrivilegeSlot);
695*53ee8cc1Swenshuai.xi     if ( FALSE == HAL_DSCMB_PidIdx_SetSlotKeyIdx( i , E_DSCMB_KEY_EVEN  , pMap->u32SlotIdEven) )
696*53ee8cc1Swenshuai.xi     {
697*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set SlotMap Fail\n");
698*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltAlloc_Ex_FAIL;
699*53ee8cc1Swenshuai.xi     }
700*53ee8cc1Swenshuai.xi 
701*53ee8cc1Swenshuai.xi     if ( FALSE == HAL_DSCMB_PidIdx_SetSlotKeyIdx( i , E_DSCMB_KEY_ODD   , pMap->u32SlotIdOdd) )
702*53ee8cc1Swenshuai.xi     {
703*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set SlotMap Fail\n");
704*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltAlloc_Ex_FAIL;
705*53ee8cc1Swenshuai.xi     }
706*53ee8cc1Swenshuai.xi 
707*53ee8cc1Swenshuai.xi     if(pMap->eFltType == E_DSCMB_FLT_3_KEYS || (pMap->eFltType == E_DSCMB_FLT_1_KEYS))
708*53ee8cc1Swenshuai.xi     {
709*53ee8cc1Swenshuai.xi         if ( FALSE == HAL_DSCMB_PidIdx_SetSlotKeyIdx( i , E_DSCMB_KEY_CLEAR , pMap->u32SlotIdClear) )
710*53ee8cc1Swenshuai.xi         {
711*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set SlotMap Fail\n");
712*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_FltAlloc_Ex_FAIL;
713*53ee8cc1Swenshuai.xi         }
714*53ee8cc1Swenshuai.xi     }
715*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP */
716*53ee8cc1Swenshuai.xi 
717*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
718*53ee8cc1Swenshuai.xi 
719*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Allocate DSCMB Filter ID: %u\n", i);
720*53ee8cc1Swenshuai.xi 
721*53ee8cc1Swenshuai.xi     return i;
722*53ee8cc1Swenshuai.xi 
723*53ee8cc1Swenshuai.xi MDrv_DSCMB2_FltAlloc_Ex_FAIL:
724*53ee8cc1Swenshuai.xi 
725*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
726*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(i, E_DSCMB_KEY_EVEN);
727*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(i, E_DSCMB_KEY_ODD);
728*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(i, E_DSCMB_KEY_CLEAR);
729*53ee8cc1Swenshuai.xi 
730*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_SetSecure(i, FALSE);
731*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP */
732*53ee8cc1Swenshuai.xi 
733*53ee8cc1Swenshuai.xi     if(i != HAL_DSCMB_KTE_MAX)
734*53ee8cc1Swenshuai.xi     {
735*53ee8cc1Swenshuai.xi         // Free key Slots //
736*53ee8cc1Swenshuai.xi         if (pMap->u32SlotIdClear != DRV_DSCMB_FLT_NULL)
737*53ee8cc1Swenshuai.xi         {
738*53ee8cc1Swenshuai.xi             _DSCMB_SlotFree(u32EngId, i , E_DSCMB_KEY_CLEAR  ,pMap->u32SlotIdClear);
739*53ee8cc1Swenshuai.xi             pMap->u32SlotIdClear = DRV_DSCMB_FLT_NULL ;
740*53ee8cc1Swenshuai.xi         }
741*53ee8cc1Swenshuai.xi         if (pMap->u32SlotIdOdd != DRV_DSCMB_FLT_NULL)
742*53ee8cc1Swenshuai.xi         {
743*53ee8cc1Swenshuai.xi             _DSCMB_SlotFree(u32EngId, i , E_DSCMB_KEY_ODD  ,pMap->u32SlotIdOdd);
744*53ee8cc1Swenshuai.xi             pMap->u32SlotIdOdd = DRV_DSCMB_FLT_NULL ;
745*53ee8cc1Swenshuai.xi         }
746*53ee8cc1Swenshuai.xi         if (pMap->u32SlotIdEven != DRV_DSCMB_FLT_NULL)
747*53ee8cc1Swenshuai.xi         {
748*53ee8cc1Swenshuai.xi             _DSCMB_SlotFree(u32EngId, i , E_DSCMB_KEY_EVEN  ,pMap->u32SlotIdEven);
749*53ee8cc1Swenshuai.xi             pMap->u32SlotIdEven = DRV_DSCMB_FLT_NULL ;
750*53ee8cc1Swenshuai.xi         }
751*53ee8cc1Swenshuai.xi 
752*53ee8cc1Swenshuai.xi         pMap->bUsed = FALSE;
753*53ee8cc1Swenshuai.xi         pMap->bSecure = FALSE;
754*53ee8cc1Swenshuai.xi     }
755*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
756*53ee8cc1Swenshuai.xi     return DRV_DSCMB_FLT_NULL;
757*53ee8cc1Swenshuai.xi }
758*53ee8cc1Swenshuai.xi 
759*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
760*53ee8cc1Swenshuai.xi /// Allocate a dscrambler filter
761*53ee8cc1Swenshuai.xi /// @return Descrambler filter ID - Success
762*53ee8cc1Swenshuai.xi /// @return DRV_DSCMB_FLT_NULL - Failure
763*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
_MDrv_DSCMB2_FltAlloc_Ex(MS_U32 u32EngId,DSCMB_Flt_Type eFltType)764*53ee8cc1Swenshuai.xi MS_U32 _MDrv_DSCMB2_FltAlloc_Ex(MS_U32 u32EngId, DSCMB_Flt_Type eFltType)
765*53ee8cc1Swenshuai.xi {
766*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltAllocWithCAVid(u32EngId, eFltType, HAL_DSCMB_GetCAVid());
767*53ee8cc1Swenshuai.xi }
768*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_FltAlloc(MS_U32 u32EngId)769*53ee8cc1Swenshuai.xi MS_U32 _MDrv_DSCMB2_FltAlloc(MS_U32 u32EngId)
770*53ee8cc1Swenshuai.xi {
771*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltAlloc_Ex(u32EngId, E_DSCMB_FLT_2_KEYS);
772*53ee8cc1Swenshuai.xi }
773*53ee8cc1Swenshuai.xi 
774*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
775*53ee8cc1Swenshuai.xi /// Free the specific DSCMB filter by ID
776*53ee8cc1Swenshuai.xi /// @return TRUE - SUCCESS
777*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
778*53ee8cc1Swenshuai.xi /// @note
779*53ee8cc1Swenshuai.xi ///
780*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
_MDrv_DSCMB2_FltFree(MS_U32 u32EngId,MS_U32 u32DscmbId)781*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_FltFree(MS_U32 u32EngId, MS_U32 u32DscmbId)
782*53ee8cc1Swenshuai.xi {
783*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
784*53ee8cc1Swenshuai.xi 
785*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
786*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
787*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Free with u32DscmbId=%u\n", u32DscmbId);
788*53ee8cc1Swenshuai.xi 
789*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
790*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
791*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMapTmp = NULL;
792*53ee8cc1Swenshuai.xi     MS_BOOL bDisablePES = TRUE;
793*53ee8cc1Swenshuai.xi 
794*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
795*53ee8cc1Swenshuai.xi 
796*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
797*53ee8cc1Swenshuai.xi 
798*53ee8cc1Swenshuai.xi     if(pMap->bUsed == FALSE)
799*53ee8cc1Swenshuai.xi     {
800*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "Free an unused DSCMB filter\n");
801*53ee8cc1Swenshuai.xi     }
802*53ee8cc1Swenshuai.xi 
803*53ee8cc1Swenshuai.xi     //Check if two or more u32DSCMB use PES decrypt in the same tsid
804*53ee8cc1Swenshuai.xi     // If there exist a dscmb id that use PES decrypt, do not disable PES
805*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < HAL_DSCMB_KTE_MAX ; i ++)
806*53ee8cc1Swenshuai.xi     {
807*53ee8cc1Swenshuai.xi         if(i == u32DscmbId)
808*53ee8cc1Swenshuai.xi         {
809*53ee8cc1Swenshuai.xi             continue;
810*53ee8cc1Swenshuai.xi         }
811*53ee8cc1Swenshuai.xi         pMapTmp = &DscmbTspMap[u32EngId][i];
812*53ee8cc1Swenshuai.xi         if ( (pMapTmp->bUsed == TRUE) && (pMapTmp->u32Tsid == pMap->u32Tsid))
813*53ee8cc1Swenshuai.xi         {
814*53ee8cc1Swenshuai.xi             if(pMapTmp->u32RIVIdx != HAL_DSCMB_RIV_MAX)
815*53ee8cc1Swenshuai.xi             {
816*53ee8cc1Swenshuai.xi                 bDisablePES = FALSE;
817*53ee8cc1Swenshuai.xi             }
818*53ee8cc1Swenshuai.xi         }
819*53ee8cc1Swenshuai.xi     }
820*53ee8cc1Swenshuai.xi 
821*53ee8cc1Swenshuai.xi     if(pMap->u32RIVIdx != HAL_DSCMB_RIV_MAX)
822*53ee8cc1Swenshuai.xi     {
823*53ee8cc1Swenshuai.xi         if(bDisablePES == TRUE)
824*53ee8cc1Swenshuai.xi         {
825*53ee8cc1Swenshuai.xi             HAL_DSCMB_PES_Enable (0, pMap->u32Tsid, FALSE);
826*53ee8cc1Swenshuai.xi         }
827*53ee8cc1Swenshuai.xi     }
828*53ee8cc1Swenshuai.xi 
829*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
830*53ee8cc1Swenshuai.xi     // Reset the Key index
831*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(u32DscmbId, E_DSCMB_KEY_CLEAR);
832*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(u32DscmbId, E_DSCMB_KEY_EVEN);
833*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(u32DscmbId, E_DSCMB_KEY_ODD);
834*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_SetSecure(u32DscmbId, FALSE);
835*53ee8cc1Swenshuai.xi     HAL_DSCMB_KTE_Clear_KeyFSCB(u32DscmbId);
836*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP */
837*53ee8cc1Swenshuai.xi 
838*53ee8cc1Swenshuai.xi     // Disable Pid Slot
839*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < HAL_DSCMB_PIDFLT_NUM ; i ++)
840*53ee8cc1Swenshuai.xi     {
841*53ee8cc1Swenshuai.xi         if (_u32PidFlt2Dscmb[i].u8DscmbId== u32DscmbId)
842*53ee8cc1Swenshuai.xi         {
843*53ee8cc1Swenshuai.xi #ifndef FLEXIBLE_PIDSLOTMAP
844*53ee8cc1Swenshuai.xi             // Reset the Key index
845*53ee8cc1Swenshuai.xi             HAL_DSCMB_PidIdx_ClearSlotKeyIdx(i, E_DSCMB_KEY_CLEAR);
846*53ee8cc1Swenshuai.xi             HAL_DSCMB_PidIdx_ClearSlotKeyIdx(i, E_DSCMB_KEY_EVEN);
847*53ee8cc1Swenshuai.xi             HAL_DSCMB_PidIdx_ClearSlotKeyIdx(i, E_DSCMB_KEY_ODD);
848*53ee8cc1Swenshuai.xi             HAL_DSCMB_PidIdx_SetSecure(i, FALSE);
849*53ee8cc1Swenshuai.xi             HAL_DSCMB_KTE_Clear_KeyFSCB(i);
850*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP */
851*53ee8cc1Swenshuai.xi 
852*53ee8cc1Swenshuai.xi             HAL_DSCMB_PidIdx_DisableSlot(i);
853*53ee8cc1Swenshuai.xi             pMap->u32PidFltIdNum--;
854*53ee8cc1Swenshuai.xi             _u32PidFlt2Dscmb[i].u8DscmbId= HAL_DSCMB_KTE_MAX ;
855*53ee8cc1Swenshuai.xi             _u32PidFlt2Dscmb[i].u8TsId = HAL_DSCMB_TSID_MAX;
856*53ee8cc1Swenshuai.xi             _u32PidFlt2Dscmb[i].u8CaVid = DEFAULT_CAVID;
857*53ee8cc1Swenshuai.xi 
858*53ee8cc1Swenshuai.xi         }
859*53ee8cc1Swenshuai.xi     }
860*53ee8cc1Swenshuai.xi 
861*53ee8cc1Swenshuai.xi     // Free key Slots //
862*53ee8cc1Swenshuai.xi     if (pMap->u32SlotIdClear != DRV_DSCMB_FLT_NULL)
863*53ee8cc1Swenshuai.xi     {
864*53ee8cc1Swenshuai.xi         _DSCMB_SlotFree(u32EngId, u32DscmbId , E_DSCMB_KEY_CLEAR  ,pMap->u32SlotIdClear);
865*53ee8cc1Swenshuai.xi         pMap->u32SlotIdClear = DRV_DSCMB_FLT_NULL ;
866*53ee8cc1Swenshuai.xi     }
867*53ee8cc1Swenshuai.xi     if (pMap->u32SlotIdOdd != DRV_DSCMB_FLT_NULL)
868*53ee8cc1Swenshuai.xi     {
869*53ee8cc1Swenshuai.xi         _DSCMB_SlotFree(u32EngId, u32DscmbId , E_DSCMB_KEY_ODD  ,pMap->u32SlotIdOdd);
870*53ee8cc1Swenshuai.xi         pMap->u32SlotIdOdd = DRV_DSCMB_FLT_NULL ;
871*53ee8cc1Swenshuai.xi     }
872*53ee8cc1Swenshuai.xi     if (pMap->u32SlotIdEven != DRV_DSCMB_FLT_NULL)
873*53ee8cc1Swenshuai.xi     {
874*53ee8cc1Swenshuai.xi         _DSCMB_SlotFree(u32EngId, u32DscmbId , E_DSCMB_KEY_EVEN  ,pMap->u32SlotIdEven);
875*53ee8cc1Swenshuai.xi         pMap->u32SlotIdEven = DRV_DSCMB_FLT_NULL ;
876*53ee8cc1Swenshuai.xi     }
877*53ee8cc1Swenshuai.xi     if(pMap->u32RIVIdx != HAL_DSCMB_RIV_MAX)
878*53ee8cc1Swenshuai.xi     {
879*53ee8cc1Swenshuai.xi         _DSCMB_SlotRIVFree (u32EngId, u32DscmbId, pMap->u32RIVIdx);
880*53ee8cc1Swenshuai.xi         pMap->u32RIVIdx = HAL_DSCMB_RIV_MAX;
881*53ee8cc1Swenshuai.xi     }
882*53ee8cc1Swenshuai.xi     pMap->u32CAVid = DEFAULT_CAVID ;
883*53ee8cc1Swenshuai.xi     pMap->u32Tsid = HAL_DSCMB_TSID_MAX;
884*53ee8cc1Swenshuai.xi     pMap->bUsed = FALSE ;
885*53ee8cc1Swenshuai.xi     pMap->bSecure = FALSE;
886*53ee8cc1Swenshuai.xi 
887*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
888*53ee8cc1Swenshuai.xi     return TRUE;
889*53ee8cc1Swenshuai.xi }
890*53ee8cc1Swenshuai.xi 
891*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_FltConnectFltId(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32FltId)892*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_FltConnectFltId(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32FltId)
893*53ee8cc1Swenshuai.xi {
894*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
895*53ee8cc1Swenshuai.xi 
896*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
897*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
898*53ee8cc1Swenshuai.xi     DSCMB_ASSERT((u32FltId < HAL_DSCMB_PIDIDX_MAX) && (u32FltId != 0), "FltId input error", FALSE);
899*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Connect u32FltId=%u to u32DscmbId=%u\n", u32FltId, u32DscmbId);
900*53ee8cc1Swenshuai.xi 
901*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
902*53ee8cc1Swenshuai.xi     MS_U32 u32Tsid = 0;
903*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
904*53ee8cc1Swenshuai.xi     MS_U32 u32CAVid = DEFAULT_CAVID;
905*53ee8cc1Swenshuai.xi 
906*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
907*53ee8cc1Swenshuai.xi 
908*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
909*53ee8cc1Swenshuai.xi     u32CAVid = pMap->u32CAVid;
910*53ee8cc1Swenshuai.xi 
911*53ee8cc1Swenshuai.xi     if(pMap->bUsed == FALSE)
912*53ee8cc1Swenshuai.xi     {
913*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "DSCMB filter does not allocated yet\n");
914*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltConnectFltId_FAIL;
915*53ee8cc1Swenshuai.xi     }
916*53ee8cc1Swenshuai.xi 
917*53ee8cc1Swenshuai.xi     for(i = 0 ; i < HAL_DSCMB_KTE_MAX; i++)
918*53ee8cc1Swenshuai.xi     {
919*53ee8cc1Swenshuai.xi         if(_DSCMB_IsFltConnectDSCMB(i, u32FltId))
920*53ee8cc1Swenshuai.xi         {
921*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "DSCMB filter already connect to another dscmb_id\n");
922*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_FltConnectFltId_FAIL;
923*53ee8cc1Swenshuai.xi         }
924*53ee8cc1Swenshuai.xi     }
925*53ee8cc1Swenshuai.xi 
926*53ee8cc1Swenshuai.xi     HAL_DSCMB_Get_TsidInput (u32FltId, &u32Tsid);
927*53ee8cc1Swenshuai.xi 
928*53ee8cc1Swenshuai.xi     if(pMap->u32PidFltIdNum == 0)
929*53ee8cc1Swenshuai.xi     {
930*53ee8cc1Swenshuai.xi         pMap->u32Tsid = u32Tsid;
931*53ee8cc1Swenshuai.xi     }
932*53ee8cc1Swenshuai.xi     else
933*53ee8cc1Swenshuai.xi     {
934*53ee8cc1Swenshuai.xi         if(u32Tsid != pMap->u32Tsid)
935*53ee8cc1Swenshuai.xi         {
936*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "DSCMB filter=%d tsid=%d not match tsid=%d\n",
937*53ee8cc1Swenshuai.xi                 u32FltId, u32Tsid, pMap->u32Tsid);
938*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_FltConnectFltId_FAIL;
939*53ee8cc1Swenshuai.xi 
940*53ee8cc1Swenshuai.xi         }
941*53ee8cc1Swenshuai.xi     }
942*53ee8cc1Swenshuai.xi 
943*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
944*53ee8cc1Swenshuai.xi     HAL_DSCMB_SetTSPCADst_PidSlotMap(u32FltId, _u32PidFlt2Dscmb[u32FltId].u8CaDestUpp, _u32PidFlt2Dscmb[u32FltId].u8CaDestLow, u32DscmbId);
945*53ee8cc1Swenshuai.xi #else
946*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(u32FltId, E_DSCMB_KEY_EVEN);
947*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(u32FltId, E_DSCMB_KEY_ODD);
948*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(u32FltId, E_DSCMB_KEY_CLEAR);
949*53ee8cc1Swenshuai.xi 
950*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_SetCAVid(u32FltId, u32CAVid);
951*53ee8cc1Swenshuai.xi 
952*53ee8cc1Swenshuai.xi     if ( FALSE == HAL_DSCMB_PidIdx_SetSlotKeyIdx( u32FltId , E_DSCMB_KEY_EVEN  , pMap->u32SlotIdEven) )
953*53ee8cc1Swenshuai.xi     {
954*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set SlotMap Fail\n");
955*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltConnectFltId_FAIL;
956*53ee8cc1Swenshuai.xi     }
957*53ee8cc1Swenshuai.xi 
958*53ee8cc1Swenshuai.xi     if ( FALSE == HAL_DSCMB_PidIdx_SetSlotKeyIdx( u32FltId , E_DSCMB_KEY_ODD   , pMap->u32SlotIdOdd) )
959*53ee8cc1Swenshuai.xi     {
960*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set SlotMap Fail\n");
961*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltConnectFltId_FAIL;
962*53ee8cc1Swenshuai.xi     }
963*53ee8cc1Swenshuai.xi 
964*53ee8cc1Swenshuai.xi     if(pMap->eFltType == E_DSCMB_FLT_3_KEYS || (pMap->eFltType == E_DSCMB_FLT_1_KEYS))
965*53ee8cc1Swenshuai.xi     {
966*53ee8cc1Swenshuai.xi         if ( FALSE == HAL_DSCMB_PidIdx_SetSlotKeyIdx( u32FltId , E_DSCMB_KEY_CLEAR , pMap->u32SlotIdClear) )
967*53ee8cc1Swenshuai.xi         {
968*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set SlotMap Fail\n");
969*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_FltConnectFltId_FAIL;
970*53ee8cc1Swenshuai.xi         }
971*53ee8cc1Swenshuai.xi     }
972*53ee8cc1Swenshuai.xi 
973*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_SetSecure(u32FltId, pMap->bSecure);
974*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP */
975*53ee8cc1Swenshuai.xi 
976*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_EnableSlot(u32FltId);
977*53ee8cc1Swenshuai.xi 
978*53ee8cc1Swenshuai.xi     pMap->u32PidFltIdNum++;
979*53ee8cc1Swenshuai.xi     _u32PidFlt2Dscmb[u32FltId].u8DscmbId = u32DscmbId;
980*53ee8cc1Swenshuai.xi     _u32PidFlt2Dscmb[u32FltId].u8TsId    = u32Tsid;
981*53ee8cc1Swenshuai.xi 
982*53ee8cc1Swenshuai.xi #ifdef ENABLE_KEY_FSCB
983*53ee8cc1Swenshuai.xi   #ifdef FLEXIBLE_PIDSLOTMAP
984*53ee8cc1Swenshuai.xi     // do nothing
985*53ee8cc1Swenshuai.xi   #else
986*53ee8cc1Swenshuai.xi     // Copy KeyFSCBs from existed KeySlot
987*53ee8cc1Swenshuai.xi     for( i = 0 ; i < HAL_DSCMB_PIDFLT_NUM ; i++ )
988*53ee8cc1Swenshuai.xi     {
989*53ee8cc1Swenshuai.xi         if( i != u32FltId && _u32PidFlt2Dscmb[i].u8DscmbId==u32DscmbId )
990*53ee8cc1Swenshuai.xi         {
991*53ee8cc1Swenshuai.xi             HAL_DSCMB_KTE_Copy_KeyFSCB( i, u32FltId);
992*53ee8cc1Swenshuai.xi             break;
993*53ee8cc1Swenshuai.xi         }
994*53ee8cc1Swenshuai.xi     }
995*53ee8cc1Swenshuai.xi   #endif
996*53ee8cc1Swenshuai.xi #endif
997*53ee8cc1Swenshuai.xi 
998*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Connect TSP flt %u to DSCMB flt %u\n", u32FltId, u32DscmbId);
999*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "DSCMB ID: %u has %u TSP filter connected\n", u32DscmbId, pMap->u32PidFltIdNum);
1000*53ee8cc1Swenshuai.xi 
1001*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1002*53ee8cc1Swenshuai.xi     return TRUE ;
1003*53ee8cc1Swenshuai.xi 
1004*53ee8cc1Swenshuai.xi MDrv_DSCMB2_FltConnectFltId_FAIL:
1005*53ee8cc1Swenshuai.xi 
1006*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1007*53ee8cc1Swenshuai.xi     return FALSE;
1008*53ee8cc1Swenshuai.xi }
1009*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_FltDisconnectFltId(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32FltId)1010*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_FltDisconnectFltId(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32FltId)
1011*53ee8cc1Swenshuai.xi {
1012*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
1013*53ee8cc1Swenshuai.xi 
1014*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
1015*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
1016*53ee8cc1Swenshuai.xi     DSCMB_ASSERT((u32FltId < HAL_DSCMB_PIDIDX_MAX) && (u32FltId != 0), "FltId input error", FALSE);
1017*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Disconnect u32FltId=%u from u32DscmbId=%u\n", u32FltId, u32DscmbId);
1018*53ee8cc1Swenshuai.xi 
1019*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
1020*53ee8cc1Swenshuai.xi 
1021*53ee8cc1Swenshuai.xi     // [FIXME] Discoonect Filter , Disable PidIdx reference.
1022*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
1023*53ee8cc1Swenshuai.xi 
1024*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
1025*53ee8cc1Swenshuai.xi 
1026*53ee8cc1Swenshuai.xi     // Check DSCMB filter data
1027*53ee8cc1Swenshuai.xi     if((pMap->bUsed == FALSE) || (pMap->u32PidFltIdNum <= 0))
1028*53ee8cc1Swenshuai.xi     {
1029*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "DSCMB filter content error\n");
1030*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltDisconnectFltId_FAIL;
1031*53ee8cc1Swenshuai.xi     }
1032*53ee8cc1Swenshuai.xi 
1033*53ee8cc1Swenshuai.xi     // Check if the TSP filter is mapped to the DSCMB filter
1034*53ee8cc1Swenshuai.xi     if(_u32PidFlt2Dscmb[u32FltId].u8DscmbId != u32DscmbId)
1035*53ee8cc1Swenshuai.xi     {
1036*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "DSCMB filter mapping error\n");
1037*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltDisconnectFltId_FAIL;
1038*53ee8cc1Swenshuai.xi     }
1039*53ee8cc1Swenshuai.xi 
1040*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
1041*53ee8cc1Swenshuai.xi     HAL_DSCMB_SetTSPCADst_PidSlotMap(u32FltId, _u32PidFlt2Dscmb[u32FltId].u8CaDestUpp, _u32PidFlt2Dscmb[u32FltId].u8CaDestLow, 0);
1042*53ee8cc1Swenshuai.xi #else
1043*53ee8cc1Swenshuai.xi     // Reset the Key index
1044*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(u32FltId, E_DSCMB_KEY_CLEAR);
1045*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(u32FltId, E_DSCMB_KEY_EVEN);
1046*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(u32FltId, E_DSCMB_KEY_ODD);
1047*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_SetSecure(u32FltId, FALSE);
1048*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP*/
1049*53ee8cc1Swenshuai.xi 
1050*53ee8cc1Swenshuai.xi     // disable Keytable SlotMap
1051*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_DisableSlot(u32FltId);
1052*53ee8cc1Swenshuai.xi 
1053*53ee8cc1Swenshuai.xi     // Update the internal data structure
1054*53ee8cc1Swenshuai.xi     pMap->u32PidFltIdNum--;
1055*53ee8cc1Swenshuai.xi     _u32PidFlt2Dscmb[u32FltId].u8DscmbId= HAL_DSCMB_KTE_MAX;
1056*53ee8cc1Swenshuai.xi     _u32PidFlt2Dscmb[u32FltId].u8TsId = 0xff;
1057*53ee8cc1Swenshuai.xi     _u32PidFlt2Dscmb[u32FltId].u8CaVid = 0xff;
1058*53ee8cc1Swenshuai.xi 
1059*53ee8cc1Swenshuai.xi #ifdef ENABLE_KEY_FSCB
1060*53ee8cc1Swenshuai.xi   #ifdef FLEXIBLE_PIDSLOTMAP
1061*53ee8cc1Swenshuai.xi     // do nothing
1062*53ee8cc1Swenshuai.xi   #else
1063*53ee8cc1Swenshuai.xi     // Clear all KeyFSCBs of given u32FltId
1064*53ee8cc1Swenshuai.xi     HAL_DSCMB_KTE_Clear_KeyFSCB(u32FltId);
1065*53ee8cc1Swenshuai.xi   #endif
1066*53ee8cc1Swenshuai.xi #endif
1067*53ee8cc1Swenshuai.xi 
1068*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1069*53ee8cc1Swenshuai.xi     return TRUE ;
1070*53ee8cc1Swenshuai.xi 
1071*53ee8cc1Swenshuai.xi MDrv_DSCMB2_FltDisconnectFltId_FAIL:
1072*53ee8cc1Swenshuai.xi 
1073*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1074*53ee8cc1Swenshuai.xi     return FALSE ;
1075*53ee8cc1Swenshuai.xi }
1076*53ee8cc1Swenshuai.xi 
1077*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_FltSwitchType(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Flt_Type eFltType)1078*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_FltSwitchType(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Flt_Type eFltType)
1079*53ee8cc1Swenshuai.xi {
1080*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
1081*53ee8cc1Swenshuai.xi 
1082*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
1083*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
1084*53ee8cc1Swenshuai.xi 
1085*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
1086*53ee8cc1Swenshuai.xi #ifndef FLEXIBLE_PIDSLOTMAP
1087*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
1088*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP */
1089*53ee8cc1Swenshuai.xi     MS_U32 u32OldSlotIdOdd = DRV_DSCMB_FLT_NULL;
1090*53ee8cc1Swenshuai.xi     MS_U32 u32OldSlotIdClear = DRV_DSCMB_FLT_NULL;
1091*53ee8cc1Swenshuai.xi 
1092*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
1093*53ee8cc1Swenshuai.xi 
1094*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
1095*53ee8cc1Swenshuai.xi 
1096*53ee8cc1Swenshuai.xi     if(pMap->bUsed == FALSE)
1097*53ee8cc1Swenshuai.xi     {
1098*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "DSCMB filter does not allocated yet\n");
1099*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltSwitchType_FAIL;
1100*53ee8cc1Swenshuai.xi     }
1101*53ee8cc1Swenshuai.xi 
1102*53ee8cc1Swenshuai.xi     if((eFltType == E_DSCMB_FLT_2_KEYS_SHARE) || (pMap->eFltType == E_DSCMB_FLT_2_KEYS_SHARE))
1103*53ee8cc1Swenshuai.xi     {
1104*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "DSCMB filter does not support the type switch\n");
1105*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltSwitchType_FAIL;
1106*53ee8cc1Swenshuai.xi     }
1107*53ee8cc1Swenshuai.xi 
1108*53ee8cc1Swenshuai.xi     if(eFltType == pMap->eFltType)
1109*53ee8cc1Swenshuai.xi     {
1110*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "DSCMB filter has the same type\n");
1111*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltSwitchType_OK;
1112*53ee8cc1Swenshuai.xi     }
1113*53ee8cc1Swenshuai.xi 
1114*53ee8cc1Swenshuai.xi     //make sure keyslot is enough, then SW operation never fail
1115*53ee8cc1Swenshuai.xi     if(_DSCMB_SlotEmptyCount()<2)
1116*53ee8cc1Swenshuai.xi     {
1117*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "KeySlot not enough\n");
1118*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltSwitchType_FAIL;
1119*53ee8cc1Swenshuai.xi     }
1120*53ee8cc1Swenshuai.xi 
1121*53ee8cc1Swenshuai.xi     ////////////////////////////////////////////////////////////////
1122*53ee8cc1Swenshuai.xi     ////  SW operation (6 cases)
1123*53ee8cc1Swenshuai.xi     ///////////////////////////////////////////////////////////////
1124*53ee8cc1Swenshuai.xi     u32OldSlotIdOdd = pMap->u32SlotIdOdd;
1125*53ee8cc1Swenshuai.xi     u32OldSlotIdClear = pMap->u32SlotIdClear;
1126*53ee8cc1Swenshuai.xi 
1127*53ee8cc1Swenshuai.xi     //case +1 slot odd key
1128*53ee8cc1Swenshuai.xi     if((eFltType==E_DSCMB_FLT_2_KEYS) && (pMap->eFltType==E_DSCMB_FLT_1_KEYS))
1129*53ee8cc1Swenshuai.xi     {
1130*53ee8cc1Swenshuai.xi         _DSCMB_SlotAlloc( u32EngId , u32DscmbId , E_DSCMB_KEY_ODD , &(pMap->u32SlotIdOdd));
1131*53ee8cc1Swenshuai.xi         pMap->u32SlotIdClear = DRV_DSCMB_FLT_NULL;
1132*53ee8cc1Swenshuai.xi 
1133*53ee8cc1Swenshuai.xi     }
1134*53ee8cc1Swenshuai.xi     //case +1 slot clear key
1135*53ee8cc1Swenshuai.xi     else if((eFltType==E_DSCMB_FLT_3_KEYS) && (pMap->eFltType==E_DSCMB_FLT_2_KEYS))
1136*53ee8cc1Swenshuai.xi     {
1137*53ee8cc1Swenshuai.xi         _DSCMB_SlotAlloc( u32EngId , u32DscmbId , E_DSCMB_KEY_CLEAR , &(pMap->u32SlotIdClear));
1138*53ee8cc1Swenshuai.xi     }
1139*53ee8cc1Swenshuai.xi     //case +2 slot odd & clear key
1140*53ee8cc1Swenshuai.xi     else if((eFltType==E_DSCMB_FLT_3_KEYS) && (pMap->eFltType==E_DSCMB_FLT_1_KEYS))
1141*53ee8cc1Swenshuai.xi     {
1142*53ee8cc1Swenshuai.xi         _DSCMB_SlotAlloc( u32EngId , u32DscmbId , E_DSCMB_KEY_ODD , &(pMap->u32SlotIdOdd));
1143*53ee8cc1Swenshuai.xi         _DSCMB_SlotAlloc( u32EngId , u32DscmbId , E_DSCMB_KEY_CLEAR , &(pMap->u32SlotIdClear));
1144*53ee8cc1Swenshuai.xi     }
1145*53ee8cc1Swenshuai.xi     //case -1 slot clear key
1146*53ee8cc1Swenshuai.xi     else if((eFltType==E_DSCMB_FLT_2_KEYS) && (pMap->eFltType==E_DSCMB_FLT_3_KEYS))
1147*53ee8cc1Swenshuai.xi     {
1148*53ee8cc1Swenshuai.xi         _DSCMB_SlotFree(u32EngId, u32DscmbId , E_DSCMB_KEY_CLEAR  ,pMap->u32SlotIdClear);
1149*53ee8cc1Swenshuai.xi         pMap->u32SlotIdClear= DRV_DSCMB_FLT_NULL;
1150*53ee8cc1Swenshuai.xi     }
1151*53ee8cc1Swenshuai.xi     //case -1 slot (enable odd & clear & even index all the same)
1152*53ee8cc1Swenshuai.xi     else if((eFltType==E_DSCMB_FLT_1_KEYS) && (pMap->eFltType==E_DSCMB_FLT_2_KEYS))
1153*53ee8cc1Swenshuai.xi     {
1154*53ee8cc1Swenshuai.xi         _DSCMB_SlotFree(u32EngId, u32DscmbId , E_DSCMB_KEY_ODD  ,pMap->u32SlotIdOdd);
1155*53ee8cc1Swenshuai.xi         pMap->u32SlotIdOdd = pMap->u32SlotIdEven;
1156*53ee8cc1Swenshuai.xi         pMap->u32SlotIdClear = pMap->u32SlotIdEven;
1157*53ee8cc1Swenshuai.xi 
1158*53ee8cc1Swenshuai.xi     }
1159*53ee8cc1Swenshuai.xi     //case -2 slot (enable odd & clear & even index all the same)
1160*53ee8cc1Swenshuai.xi     else if((eFltType==E_DSCMB_FLT_1_KEYS) && (pMap->eFltType==E_DSCMB_FLT_3_KEYS))
1161*53ee8cc1Swenshuai.xi     {
1162*53ee8cc1Swenshuai.xi         _DSCMB_SlotFree(u32EngId, u32DscmbId , E_DSCMB_KEY_ODD  ,pMap->u32SlotIdOdd);
1163*53ee8cc1Swenshuai.xi         _DSCMB_SlotFree(u32EngId, u32DscmbId , E_DSCMB_KEY_CLEAR  ,pMap->u32SlotIdClear);
1164*53ee8cc1Swenshuai.xi         pMap->u32SlotIdOdd = pMap->u32SlotIdEven;
1165*53ee8cc1Swenshuai.xi         pMap->u32SlotIdClear = pMap->u32SlotIdEven;
1166*53ee8cc1Swenshuai.xi     }
1167*53ee8cc1Swenshuai.xi 
1168*53ee8cc1Swenshuai.xi     // if no one connected, we don't need to update HW
1169*53ee8cc1Swenshuai.xi     if(pMap->u32PidFltIdNum == 0)
1170*53ee8cc1Swenshuai.xi     {
1171*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltSwitchType_OK;
1172*53ee8cc1Swenshuai.xi     }
1173*53ee8cc1Swenshuai.xi 
1174*53ee8cc1Swenshuai.xi     ///////////////////////////////////////////////////////////////
1175*53ee8cc1Swenshuai.xi     ////    HW operation (6 cases)
1176*53ee8cc1Swenshuai.xi     /////////////////////////////////////////////////////////////
1177*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
1178*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(u32DscmbId, E_DSCMB_KEY_ODD);
1179*53ee8cc1Swenshuai.xi     if(pMap->u32SlotIdOdd != DRV_DSCMB_FLT_NULL)
1180*53ee8cc1Swenshuai.xi     {
1181*53ee8cc1Swenshuai.xi         if(FALSE == HAL_DSCMB_PidIdx_SetSlotKeyIdx(u32DscmbId, E_DSCMB_KEY_ODD, pMap->u32SlotIdOdd))
1182*53ee8cc1Swenshuai.xi         {
1183*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_FltSwitchType_HWFAIL;
1184*53ee8cc1Swenshuai.xi         }
1185*53ee8cc1Swenshuai.xi     }
1186*53ee8cc1Swenshuai.xi 
1187*53ee8cc1Swenshuai.xi     HAL_DSCMB_PidIdx_ClearSlotKeyIdx(u32DscmbId, E_DSCMB_KEY_CLEAR);
1188*53ee8cc1Swenshuai.xi     if(pMap->u32SlotIdClear != DRV_DSCMB_FLT_NULL)
1189*53ee8cc1Swenshuai.xi     {
1190*53ee8cc1Swenshuai.xi         if(FALSE == HAL_DSCMB_PidIdx_SetSlotKeyIdx(u32DscmbId, E_DSCMB_KEY_CLEAR, pMap->u32SlotIdClear))
1191*53ee8cc1Swenshuai.xi         {
1192*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_FltSwitchType_HWFAIL;
1193*53ee8cc1Swenshuai.xi         }
1194*53ee8cc1Swenshuai.xi     }
1195*53ee8cc1Swenshuai.xi #else
1196*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < HAL_DSCMB_PIDFLT_NUM ; i ++)
1197*53ee8cc1Swenshuai.xi     {
1198*53ee8cc1Swenshuai.xi         if (_u32PidFlt2Dscmb[i].u8DscmbId== u32DscmbId)
1199*53ee8cc1Swenshuai.xi         {
1200*53ee8cc1Swenshuai.xi             HAL_DSCMB_PidIdx_ClearSlotKeyIdx(i,E_DSCMB_KEY_ODD);
1201*53ee8cc1Swenshuai.xi             if(pMap->u32SlotIdOdd != DRV_DSCMB_FLT_NULL)
1202*53ee8cc1Swenshuai.xi             {
1203*53ee8cc1Swenshuai.xi                 if(FALSE == HAL_DSCMB_PidIdx_SetSlotKeyIdx(i,E_DSCMB_KEY_ODD,pMap->u32SlotIdOdd))
1204*53ee8cc1Swenshuai.xi                 {
1205*53ee8cc1Swenshuai.xi                     goto MDrv_DSCMB2_FltSwitchType_HWFAIL;
1206*53ee8cc1Swenshuai.xi                 }
1207*53ee8cc1Swenshuai.xi             }
1208*53ee8cc1Swenshuai.xi 
1209*53ee8cc1Swenshuai.xi             HAL_DSCMB_PidIdx_ClearSlotKeyIdx(i,E_DSCMB_KEY_CLEAR);
1210*53ee8cc1Swenshuai.xi             if(pMap->u32SlotIdClear != DRV_DSCMB_FLT_NULL)
1211*53ee8cc1Swenshuai.xi             {
1212*53ee8cc1Swenshuai.xi                 if(FALSE == HAL_DSCMB_PidIdx_SetSlotKeyIdx(i,E_DSCMB_KEY_CLEAR,pMap->u32SlotIdClear))
1213*53ee8cc1Swenshuai.xi                 {
1214*53ee8cc1Swenshuai.xi                     goto MDrv_DSCMB2_FltSwitchType_HWFAIL;
1215*53ee8cc1Swenshuai.xi                 }
1216*53ee8cc1Swenshuai.xi             }
1217*53ee8cc1Swenshuai.xi         }
1218*53ee8cc1Swenshuai.xi     }
1219*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP */
1220*53ee8cc1Swenshuai.xi 
1221*53ee8cc1Swenshuai.xi MDrv_DSCMB2_FltSwitchType_OK:
1222*53ee8cc1Swenshuai.xi     pMap->eFltType = eFltType;
1223*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1224*53ee8cc1Swenshuai.xi     return TRUE;
1225*53ee8cc1Swenshuai.xi 
1226*53ee8cc1Swenshuai.xi MDrv_DSCMB2_FltSwitchType_HWFAIL:
1227*53ee8cc1Swenshuai.xi     // revert the original setting
1228*53ee8cc1Swenshuai.xi     pMap->u32SlotIdOdd = u32OldSlotIdOdd;
1229*53ee8cc1Swenshuai.xi     pMap->u32SlotIdClear = u32OldSlotIdClear;
1230*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
1231*53ee8cc1Swenshuai.xi     if(pMap->u32SlotIdOdd != DRV_DSCMB_FLT_NULL)
1232*53ee8cc1Swenshuai.xi     {
1233*53ee8cc1Swenshuai.xi         HAL_DSCMB_PidIdx_ClearSlotKeyIdx(u32DscmbId, E_DSCMB_KEY_ODD);
1234*53ee8cc1Swenshuai.xi         if(FALSE == HAL_DSCMB_PidIdx_SetSlotKeyIdx(u32DscmbId, E_DSCMB_KEY_ODD, pMap->u32SlotIdOdd))
1235*53ee8cc1Swenshuai.xi         {
1236*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_FltSwitchType_FAIL;
1237*53ee8cc1Swenshuai.xi         }
1238*53ee8cc1Swenshuai.xi     }
1239*53ee8cc1Swenshuai.xi     if(pMap->u32SlotIdClear != DRV_DSCMB_FLT_NULL)
1240*53ee8cc1Swenshuai.xi     {
1241*53ee8cc1Swenshuai.xi         HAL_DSCMB_PidIdx_ClearSlotKeyIdx(u32DscmbId, E_DSCMB_KEY_CLEAR);
1242*53ee8cc1Swenshuai.xi         if(FALSE == HAL_DSCMB_PidIdx_SetSlotKeyIdx(u32DscmbId, E_DSCMB_KEY_CLEAR, pMap->u32SlotIdClear))
1243*53ee8cc1Swenshuai.xi         {
1244*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_FltSwitchType_FAIL;
1245*53ee8cc1Swenshuai.xi         }
1246*53ee8cc1Swenshuai.xi     }
1247*53ee8cc1Swenshuai.xi #else
1248*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < HAL_DSCMB_PIDFLT_NUM ; i ++)
1249*53ee8cc1Swenshuai.xi     {
1250*53ee8cc1Swenshuai.xi         if (_u32PidFlt2Dscmb[i].u8DscmbId== u32DscmbId)
1251*53ee8cc1Swenshuai.xi         {
1252*53ee8cc1Swenshuai.xi             if(pMap->u32SlotIdOdd != DRV_DSCMB_FLT_NULL)
1253*53ee8cc1Swenshuai.xi             {
1254*53ee8cc1Swenshuai.xi                 HAL_DSCMB_PidIdx_ClearSlotKeyIdx(i,E_DSCMB_KEY_ODD);
1255*53ee8cc1Swenshuai.xi                 if(FALSE == HAL_DSCMB_PidIdx_SetSlotKeyIdx(i,E_DSCMB_KEY_ODD,pMap->u32SlotIdOdd))
1256*53ee8cc1Swenshuai.xi                 {
1257*53ee8cc1Swenshuai.xi                     goto MDrv_DSCMB2_FltSwitchType_FAIL;
1258*53ee8cc1Swenshuai.xi                 }
1259*53ee8cc1Swenshuai.xi             }
1260*53ee8cc1Swenshuai.xi             if(pMap->u32SlotIdClear != DRV_DSCMB_FLT_NULL)
1261*53ee8cc1Swenshuai.xi             {
1262*53ee8cc1Swenshuai.xi                 HAL_DSCMB_PidIdx_ClearSlotKeyIdx(i,E_DSCMB_KEY_CLEAR);
1263*53ee8cc1Swenshuai.xi                 if(FALSE == HAL_DSCMB_PidIdx_SetSlotKeyIdx(i,E_DSCMB_KEY_CLEAR,pMap->u32SlotIdClear))
1264*53ee8cc1Swenshuai.xi                 {
1265*53ee8cc1Swenshuai.xi                     goto MDrv_DSCMB2_FltSwitchType_FAIL;
1266*53ee8cc1Swenshuai.xi                 }
1267*53ee8cc1Swenshuai.xi             }
1268*53ee8cc1Swenshuai.xi         }
1269*53ee8cc1Swenshuai.xi     }
1270*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP */
1271*53ee8cc1Swenshuai.xi MDrv_DSCMB2_FltSwitchType_FAIL:
1272*53ee8cc1Swenshuai.xi 
1273*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1274*53ee8cc1Swenshuai.xi     return FALSE;
1275*53ee8cc1Swenshuai.xi 
1276*53ee8cc1Swenshuai.xi }
1277*53ee8cc1Swenshuai.xi 
1278*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_EngEnableKey(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Eng_Type eEngType,DSCMB_Key_Type eKeyType,MS_BOOL bEnable)1279*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_EngEnableKey(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Eng_Type eEngType, DSCMB_Key_Type eKeyType, MS_BOOL bEnable)
1280*53ee8cc1Swenshuai.xi {
1281*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0;
1282*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
1283*53ee8cc1Swenshuai.xi     MS_U32 u32CAVid = DEFAULT_CAVID;
1284*53ee8cc1Swenshuai.xi     DSCMB_Key_Type eSecureKeyType = E_DSCMB_KEY_CLEAR;
1285*53ee8cc1Swenshuai.xi 
1286*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
1287*53ee8cc1Swenshuai.xi 
1288*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
1289*53ee8cc1Swenshuai.xi     u32CAVid = pMap->u32CAVid;
1290*53ee8cc1Swenshuai.xi 
1291*53ee8cc1Swenshuai.xi     if (!_DSCMB_Dscmb2Flt( u32DscmbId , &u32FltId ))
1292*53ee8cc1Swenshuai.xi     {
1293*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "No filter connect to DSCMB\n");
1294*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltEnableKey_FAIL;
1295*53ee8cc1Swenshuai.xi     }
1296*53ee8cc1Swenshuai.xi 
1297*53ee8cc1Swenshuai.xi     if(TRUE == pMap->bSecure)
1298*53ee8cc1Swenshuai.xi     {
1299*53ee8cc1Swenshuai.xi         eSecureKeyType = E_DSCMB_KEY_SECURE_KEYS_ENABLE;
1300*53ee8cc1Swenshuai.xi     }
1301*53ee8cc1Swenshuai.xi 
1302*53ee8cc1Swenshuai.xi     if (!HAL_DSCMB_KTE_Key_Ctrl (u32FltId, eKeyType , eEngType | eSecureKeyType, u32CAVid, bEnable ))
1303*53ee8cc1Swenshuai.xi     {
1304*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Enable Key Fail\n");
1305*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_FltEnableKey_FAIL;
1306*53ee8cc1Swenshuai.xi     }
1307*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1308*53ee8cc1Swenshuai.xi     return TRUE;
1309*53ee8cc1Swenshuai.xi 
1310*53ee8cc1Swenshuai.xi MDrv_DSCMB2_FltEnableKey_FAIL:
1311*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1312*53ee8cc1Swenshuai.xi     return FALSE;
1313*53ee8cc1Swenshuai.xi }
1314*53ee8cc1Swenshuai.xi 
1315*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_EngSetFSCB(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_FSCB eForceSCB)1316*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_EngSetFSCB(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_FSCB eForceSCB )
1317*53ee8cc1Swenshuai.xi {
1318*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
1319*53ee8cc1Swenshuai.xi 
1320*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
1321*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
1322*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(eForceSCB <= DSCMB_FSCB_ODD, "ForceSCB input error", FALSE);
1323*53ee8cc1Swenshuai.xi 
1324*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Set DscmbId=%u FSCB=%d\n", u32DscmbId, eForceSCB);
1325*53ee8cc1Swenshuai.xi 
1326*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
1327*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0 ;
1328*53ee8cc1Swenshuai.xi     MS_U32 u32CAVid = DEFAULT_CAVID;
1329*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
1330*53ee8cc1Swenshuai.xi     DSCMB_Key_Type eSecureKeyType = E_DSCMB_KEY_CLEAR;
1331*53ee8cc1Swenshuai.xi 
1332*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
1333*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
1334*53ee8cc1Swenshuai.xi     u32CAVid = pMap->u32CAVid;
1335*53ee8cc1Swenshuai.xi 
1336*53ee8cc1Swenshuai.xi     if (!_DSCMB_Dscmb2Flt( u32DscmbId , &u32FltId ) )
1337*53ee8cc1Swenshuai.xi     {
1338*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "No filter connect to DSCMB\n");
1339*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetFSCB_FAIL;
1340*53ee8cc1Swenshuai.xi     }
1341*53ee8cc1Swenshuai.xi 
1342*53ee8cc1Swenshuai.xi     if(TRUE == pMap->bSecure)
1343*53ee8cc1Swenshuai.xi     {
1344*53ee8cc1Swenshuai.xi         eSecureKeyType = E_DSCMB_KEY_SECURE_KEYS_ENABLE;
1345*53ee8cc1Swenshuai.xi     }
1346*53ee8cc1Swenshuai.xi 
1347*53ee8cc1Swenshuai.xi     bRet &= HAL_DSCMB_KTE_Write_FSCB(u32FltId, (E_DSCMB_KEY_ODD|eSecureKeyType),   u32CAVid, eForceSCB);
1348*53ee8cc1Swenshuai.xi     bRet &= HAL_DSCMB_KTE_Write_FSCB(u32FltId, (E_DSCMB_KEY_EVEN|eSecureKeyType),  u32CAVid, eForceSCB);
1349*53ee8cc1Swenshuai.xi 
1350*53ee8cc1Swenshuai.xi     if(pMap->eFltType == E_DSCMB_FLT_3_KEYS)
1351*53ee8cc1Swenshuai.xi     {
1352*53ee8cc1Swenshuai.xi         bRet &= HAL_DSCMB_KTE_Write_FSCB(u32FltId, (E_DSCMB_KEY_CLEAR|eSecureKeyType), u32CAVid, eForceSCB);
1353*53ee8cc1Swenshuai.xi     }
1354*53ee8cc1Swenshuai.xi 
1355*53ee8cc1Swenshuai.xi     if (!bRet)
1356*53ee8cc1Swenshuai.xi     {
1357*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set FSCB Fail\n");
1358*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetFSCB_FAIL;
1359*53ee8cc1Swenshuai.xi     }
1360*53ee8cc1Swenshuai.xi 
1361*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1362*53ee8cc1Swenshuai.xi     return TRUE;
1363*53ee8cc1Swenshuai.xi 
1364*53ee8cc1Swenshuai.xi MDrv_DSCMB2_EngSetFSCB_FAIL:
1365*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1366*53ee8cc1Swenshuai.xi     return FALSE;
1367*53ee8cc1Swenshuai.xi }
1368*53ee8cc1Swenshuai.xi 
1369*53ee8cc1Swenshuai.xi // Set Upper & lower switch to dscmb filter //
1370*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
1371*53ee8cc1Swenshuai.xi /// Set upper switch and lower switch to choose which engine will go into.
1372*53ee8cc1Swenshuai.xi /// @param u32DscmbId\b IN: The descrambler id which is get from MDrv_DSCMB2_FltAlloc.
1373*53ee8cc1Swenshuai.xi /// @param eUppSwitch\b IN: An Enum type for choosing descrambler engine when go through upper path.
1374*53ee8cc1Swenshuai.xi /// @param eLowSwitch\b IN: An Enum type for choosing descrambler engine when go through lower path.
1375*53ee8cc1Swenshuai.xi /// @return TRUE - SUCCESS
1376*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
1377*53ee8cc1Swenshuai.xi /// @note
1378*53ee8cc1Swenshuai.xi ///
1379*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
_MDrv_DSCMB2_EngSetSwitch(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Eng_Type eUppSwitch,DSCMB_Eng_Type eLowSwitch)1380*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_EngSetSwitch(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Eng_Type eUppSwitch ,DSCMB_Eng_Type eLowSwitch)
1381*53ee8cc1Swenshuai.xi {
1382*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
1383*53ee8cc1Swenshuai.xi 
1384*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
1385*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
1386*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(eUppSwitch <= (E_DSCMB_ENG_LSAS|E_DSCMB_ENG_ESA|E_DSCMB_ENG_LSAD), "UppSwitch input error", FALSE);
1387*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(eLowSwitch <= (E_DSCMB_ENG_LSAS|E_DSCMB_ENG_ESA|E_DSCMB_ENG_LSAD), "LowSwitch input error", FALSE);
1388*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Set DscmbId=%u UppSwitch=%d LowSwitch=%d\n", u32DscmbId, eUppSwitch, eLowSwitch);
1389*53ee8cc1Swenshuai.xi 
1390*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
1391*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0 ;
1392*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
1393*53ee8cc1Swenshuai.xi     MS_U32 u32CAVid = DEFAULT_CAVID;
1394*53ee8cc1Swenshuai.xi     DSCMB_Key_Type eSecureKeyType = E_DSCMB_KEY_CLEAR;
1395*53ee8cc1Swenshuai.xi 
1396*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
1397*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
1398*53ee8cc1Swenshuai.xi     u32CAVid = pMap->u32CAVid;
1399*53ee8cc1Swenshuai.xi 
1400*53ee8cc1Swenshuai.xi     if (!_DSCMB_Dscmb2Flt( u32DscmbId , &u32FltId ) )
1401*53ee8cc1Swenshuai.xi     {
1402*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "No filter connect to DSCMB\n");
1403*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetSwitch_FAIL;
1404*53ee8cc1Swenshuai.xi     }
1405*53ee8cc1Swenshuai.xi 
1406*53ee8cc1Swenshuai.xi     if(TRUE == pMap->bSecure)
1407*53ee8cc1Swenshuai.xi     {
1408*53ee8cc1Swenshuai.xi         eSecureKeyType = E_DSCMB_KEY_SECURE_KEYS_ENABLE;
1409*53ee8cc1Swenshuai.xi     }
1410*53ee8cc1Swenshuai.xi 
1411*53ee8cc1Swenshuai.xi     bRet &= HAL_DSCMB_KTE_Write_PacketSwitch(u32FltId, (E_DSCMB_KEY_EVEN|eSecureKeyType),   u32CAVid, eUppSwitch, eLowSwitch);
1412*53ee8cc1Swenshuai.xi     bRet &= HAL_DSCMB_KTE_Write_PacketSwitch(u32FltId, (E_DSCMB_KEY_ODD|eSecureKeyType),    u32CAVid, eUppSwitch, eLowSwitch);
1413*53ee8cc1Swenshuai.xi 
1414*53ee8cc1Swenshuai.xi     if(pMap->eFltType == E_DSCMB_FLT_3_KEYS)
1415*53ee8cc1Swenshuai.xi     {
1416*53ee8cc1Swenshuai.xi         bRet  &= HAL_DSCMB_KTE_Write_PacketSwitch(u32FltId, (E_DSCMB_KEY_CLEAR|eSecureKeyType),  u32CAVid, eUppSwitch, eLowSwitch);
1417*53ee8cc1Swenshuai.xi     }
1418*53ee8cc1Swenshuai.xi 
1419*53ee8cc1Swenshuai.xi     if(!bRet)
1420*53ee8cc1Swenshuai.xi     {
1421*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set Switch Fail\n");
1422*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetSwitch_FAIL;
1423*53ee8cc1Swenshuai.xi     }
1424*53ee8cc1Swenshuai.xi 
1425*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1426*53ee8cc1Swenshuai.xi     return TRUE;
1427*53ee8cc1Swenshuai.xi 
1428*53ee8cc1Swenshuai.xi MDrv_DSCMB2_EngSetSwitch_FAIL:
1429*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1430*53ee8cc1Swenshuai.xi     return FALSE;
1431*53ee8cc1Swenshuai.xi }
1432*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_EngSetAlgo(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Eng_Type eEngType,DSCMB_Algo_Cfg stConfig)1433*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_EngSetAlgo(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Eng_Type eEngType, DSCMB_Algo_Cfg stConfig)
1434*53ee8cc1Swenshuai.xi {
1435*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
1436*53ee8cc1Swenshuai.xi 
1437*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
1438*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
1439*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(eEngType <= (E_DSCMB_ENG_LSAS|E_DSCMB_ENG_ESA|E_DSCMB_ENG_LSAD), "EngType input error", FALSE);
1440*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Set Algo DscmbId=%u eEngType=%d\n", u32DscmbId, eEngType);
1441*53ee8cc1Swenshuai.xi 
1442*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0;
1443*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
1444*53ee8cc1Swenshuai.xi     MS_U32 u32CAVid = DEFAULT_CAVID;
1445*53ee8cc1Swenshuai.xi     MS_U32 u32Variant = 0x0;
1446*53ee8cc1Swenshuai.xi     DSCMB_Key_Type eSecureKeyType = E_DSCMB_KEY_CLEAR;
1447*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
1448*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
1449*53ee8cc1Swenshuai.xi     u32CAVid = pMap->u32CAVid;
1450*53ee8cc1Swenshuai.xi 
1451*53ee8cc1Swenshuai.xi     if (!_DSCMB_Dscmb2Flt( u32DscmbId , &u32FltId ) )
1452*53ee8cc1Swenshuai.xi     {
1453*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "No filter connect to DSCMB\n");
1454*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetAlgo_FAIL;
1455*53ee8cc1Swenshuai.xi     }
1456*53ee8cc1Swenshuai.xi 
1457*53ee8cc1Swenshuai.xi     if(TRUE == pMap->bSecure)
1458*53ee8cc1Swenshuai.xi     {
1459*53ee8cc1Swenshuai.xi         eSecureKeyType = E_DSCMB_KEY_SECURE_KEYS_ENABLE;
1460*53ee8cc1Swenshuai.xi     }
1461*53ee8cc1Swenshuai.xi 
1462*53ee8cc1Swenshuai.xi     if((eEngType & E_DSCMB_ENG_LSAS ) == E_DSCMB_ENG_LSAS)
1463*53ee8cc1Swenshuai.xi     {
1464*53ee8cc1Swenshuai.xi         if ((!HAL_DSCMB_KTE_Write_Algo(u32FltId, (E_DSCMB_KEY_EVEN|eSecureKeyType), E_DSCMB_ENG_LSAS, u32CAVid, stConfig.eMainAlgo,
1465*53ee8cc1Swenshuai.xi                                        stConfig.eSubAlgo, stConfig.eResAlgo, stConfig.eSBAlgo, stConfig.bDecrypt ))||
1466*53ee8cc1Swenshuai.xi             (!HAL_DSCMB_KTE_Write_Algo(u32FltId, (E_DSCMB_KEY_ODD|eSecureKeyType) , E_DSCMB_ENG_LSAS, u32CAVid, stConfig.eMainAlgo,
1467*53ee8cc1Swenshuai.xi                                        stConfig.eSubAlgo, stConfig.eResAlgo, stConfig.eSBAlgo, stConfig.bDecrypt )))
1468*53ee8cc1Swenshuai.xi         {
1469*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set LSAS Engine Algorithm Fail\n");
1470*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetAlgo_FAIL;
1471*53ee8cc1Swenshuai.xi         }
1472*53ee8cc1Swenshuai.xi 
1473*53ee8cc1Swenshuai.xi         if(pMap->eFltType == E_DSCMB_FLT_3_KEYS)
1474*53ee8cc1Swenshuai.xi         {
1475*53ee8cc1Swenshuai.xi             if(!HAL_DSCMB_KTE_Write_Algo(u32FltId, (E_DSCMB_KEY_CLEAR|eSecureKeyType), E_DSCMB_ENG_LSAS, u32CAVid, stConfig.eMainAlgo,
1476*53ee8cc1Swenshuai.xi                                        stConfig.eSubAlgo, stConfig.eResAlgo, stConfig.eSBAlgo, stConfig.bDecrypt ))
1477*53ee8cc1Swenshuai.xi             {
1478*53ee8cc1Swenshuai.xi                 DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set LSAS Engine Algorithm Fail\n");
1479*53ee8cc1Swenshuai.xi                 goto MDrv_DSCMB2_EngSetAlgo_FAIL;
1480*53ee8cc1Swenshuai.xi             }
1481*53ee8cc1Swenshuai.xi         }
1482*53ee8cc1Swenshuai.xi     }
1483*53ee8cc1Swenshuai.xi 
1484*53ee8cc1Swenshuai.xi     if((eEngType & E_DSCMB_ENG_ESA ) == E_DSCMB_ENG_ESA)
1485*53ee8cc1Swenshuai.xi     {
1486*53ee8cc1Swenshuai.xi         if ((!HAL_DSCMB_KTE_Write_Algo(u32FltId, (E_DSCMB_KEY_EVEN|eSecureKeyType), E_DSCMB_ENG_ESA, u32CAVid, stConfig.eMainAlgo,
1487*53ee8cc1Swenshuai.xi                                        stConfig.eSubAlgo, stConfig.eResAlgo, stConfig.eSBAlgo, stConfig.bDecrypt ))||
1488*53ee8cc1Swenshuai.xi             (!HAL_DSCMB_KTE_Write_Algo(u32FltId, (E_DSCMB_KEY_ODD|eSecureKeyType) , E_DSCMB_ENG_ESA, u32CAVid, stConfig.eMainAlgo,
1489*53ee8cc1Swenshuai.xi                                        stConfig.eSubAlgo, stConfig.eResAlgo, stConfig.eSBAlgo, stConfig.bDecrypt )))
1490*53ee8cc1Swenshuai.xi         {
1491*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set ESA Engine Algorithm Fail\n");
1492*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetAlgo_FAIL;
1493*53ee8cc1Swenshuai.xi         }
1494*53ee8cc1Swenshuai.xi 
1495*53ee8cc1Swenshuai.xi         if(pMap->eFltType == E_DSCMB_FLT_3_KEYS)
1496*53ee8cc1Swenshuai.xi         {
1497*53ee8cc1Swenshuai.xi             if(!HAL_DSCMB_KTE_Write_Algo(u32FltId, (E_DSCMB_KEY_CLEAR|eSecureKeyType), E_DSCMB_ENG_ESA, u32CAVid, stConfig.eMainAlgo,
1498*53ee8cc1Swenshuai.xi                                        stConfig.eSubAlgo, stConfig.eResAlgo, stConfig.eSBAlgo, stConfig.bDecrypt ))
1499*53ee8cc1Swenshuai.xi             {
1500*53ee8cc1Swenshuai.xi                 DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set LSAS Engine Algorithm Fail\n");
1501*53ee8cc1Swenshuai.xi                 goto MDrv_DSCMB2_EngSetAlgo_FAIL;
1502*53ee8cc1Swenshuai.xi             }
1503*53ee8cc1Swenshuai.xi         }
1504*53ee8cc1Swenshuai.xi     }
1505*53ee8cc1Swenshuai.xi 
1506*53ee8cc1Swenshuai.xi     if((eEngType & E_DSCMB_ENG_LSAD ) == E_DSCMB_ENG_LSAD)
1507*53ee8cc1Swenshuai.xi     {
1508*53ee8cc1Swenshuai.xi         if ((!HAL_DSCMB_KTE_Write_Algo(u32FltId, (E_DSCMB_KEY_EVEN|eSecureKeyType), E_DSCMB_ENG_LSAD, u32CAVid, stConfig.eMainAlgo,
1509*53ee8cc1Swenshuai.xi                                        stConfig.eSubAlgo, stConfig.eResAlgo, stConfig.eSBAlgo, stConfig.bDecrypt ))||
1510*53ee8cc1Swenshuai.xi             (!HAL_DSCMB_KTE_Write_Algo(u32FltId, (E_DSCMB_KEY_ODD|eSecureKeyType) , E_DSCMB_ENG_LSAD, u32CAVid, stConfig.eMainAlgo,
1511*53ee8cc1Swenshuai.xi                                        stConfig.eSubAlgo, stConfig.eResAlgo, stConfig.eSBAlgo, stConfig.bDecrypt )))
1512*53ee8cc1Swenshuai.xi         {
1513*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set LSAD Engine Algorithm Fail\n");
1514*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetAlgo_FAIL;
1515*53ee8cc1Swenshuai.xi         }
1516*53ee8cc1Swenshuai.xi 
1517*53ee8cc1Swenshuai.xi         if(pMap->eFltType == E_DSCMB_FLT_3_KEYS)
1518*53ee8cc1Swenshuai.xi         {
1519*53ee8cc1Swenshuai.xi             if(!HAL_DSCMB_KTE_Write_Algo(u32FltId, (E_DSCMB_KEY_CLEAR|eSecureKeyType), E_DSCMB_ENG_LSAD, u32CAVid, stConfig.eMainAlgo,
1520*53ee8cc1Swenshuai.xi                                        stConfig.eSubAlgo, stConfig.eResAlgo, stConfig.eSBAlgo, stConfig.bDecrypt ))
1521*53ee8cc1Swenshuai.xi             {
1522*53ee8cc1Swenshuai.xi                 DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set LSAS Engine Algorithm Fail\n");
1523*53ee8cc1Swenshuai.xi                 goto MDrv_DSCMB2_EngSetAlgo_FAIL;
1524*53ee8cc1Swenshuai.xi             }
1525*53ee8cc1Swenshuai.xi         }
1526*53ee8cc1Swenshuai.xi     }
1527*53ee8cc1Swenshuai.xi 
1528*53ee8cc1Swenshuai.xi     if((eEngType & E_DSCMB_ENG_ESA ) == E_DSCMB_ENG_ESA)
1529*53ee8cc1Swenshuai.xi     {
1530*53ee8cc1Swenshuai.xi         if((stConfig.eMainAlgo == E_DSCMB_MAIN_ALGO_CSA2) ||(stConfig.eMainAlgo == E_DSCMB_MAIN_ALGO_CSA2_CONF))
1531*53ee8cc1Swenshuai.xi         {
1532*53ee8cc1Swenshuai.xi             u32Variant = 0x1;
1533*53ee8cc1Swenshuai.xi         }
1534*53ee8cc1Swenshuai.xi 
1535*53ee8cc1Swenshuai.xi         HAL_DSCMB_KTE_Write_SBOX( u32FltId , (E_DSCMB_KEY_ODD|eSecureKeyType)  , u32CAVid, u32Variant, FALSE );
1536*53ee8cc1Swenshuai.xi         HAL_DSCMB_KTE_Write_SBOX( u32FltId , (E_DSCMB_KEY_EVEN|eSecureKeyType) , u32CAVid, u32Variant, FALSE );
1537*53ee8cc1Swenshuai.xi         if(pMap->eFltType == E_DSCMB_FLT_3_KEYS)
1538*53ee8cc1Swenshuai.xi         {
1539*53ee8cc1Swenshuai.xi             HAL_DSCMB_KTE_Write_SBOX( u32FltId , (E_DSCMB_KEY_CLEAR|eSecureKeyType), u32CAVid, u32Variant, FALSE );
1540*53ee8cc1Swenshuai.xi         }
1541*53ee8cc1Swenshuai.xi     }
1542*53ee8cc1Swenshuai.xi 
1543*53ee8cc1Swenshuai.xi     if(stConfig.bDecrypt == TRUE)
1544*53ee8cc1Swenshuai.xi     {
1545*53ee8cc1Swenshuai.xi         HAL_DSCMB_KTE_Write_FSCB(u32FltId, (E_DSCMB_KEY_ODD|eSecureKeyType),    u32CAVid, DSCMB_FSCB_CLEAR);
1546*53ee8cc1Swenshuai.xi         HAL_DSCMB_KTE_Write_FSCB(u32FltId, (E_DSCMB_KEY_EVEN|eSecureKeyType),   u32CAVid, DSCMB_FSCB_CLEAR);
1547*53ee8cc1Swenshuai.xi         if(pMap->eFltType == E_DSCMB_FLT_3_KEYS)
1548*53ee8cc1Swenshuai.xi         {
1549*53ee8cc1Swenshuai.xi             HAL_DSCMB_KTE_Write_FSCB(u32FltId, (E_DSCMB_KEY_CLEAR|eSecureKeyType),  u32CAVid, DSCMB_FSCB_CLEAR);
1550*53ee8cc1Swenshuai.xi         }
1551*53ee8cc1Swenshuai.xi     }
1552*53ee8cc1Swenshuai.xi     else
1553*53ee8cc1Swenshuai.xi     {
1554*53ee8cc1Swenshuai.xi         HAL_DSCMB_KTE_Write_FSCB(u32FltId, (E_DSCMB_KEY_ODD|eSecureKeyType),    u32CAVid, DSCMB_FSCB_UNCHG);
1555*53ee8cc1Swenshuai.xi         HAL_DSCMB_KTE_Write_FSCB(u32FltId, (E_DSCMB_KEY_EVEN|eSecureKeyType),   u32CAVid, DSCMB_FSCB_UNCHG);
1556*53ee8cc1Swenshuai.xi         if(pMap->eFltType == E_DSCMB_FLT_3_KEYS)
1557*53ee8cc1Swenshuai.xi         {
1558*53ee8cc1Swenshuai.xi             HAL_DSCMB_KTE_Write_FSCB(u32FltId, (E_DSCMB_KEY_CLEAR|eSecureKeyType),  u32CAVid, DSCMB_FSCB_UNCHG);
1559*53ee8cc1Swenshuai.xi         }
1560*53ee8cc1Swenshuai.xi     }
1561*53ee8cc1Swenshuai.xi 
1562*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1563*53ee8cc1Swenshuai.xi     return TRUE ;
1564*53ee8cc1Swenshuai.xi 
1565*53ee8cc1Swenshuai.xi MDrv_DSCMB2_EngSetAlgo_FAIL:
1566*53ee8cc1Swenshuai.xi 
1567*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1568*53ee8cc1Swenshuai.xi     return FALSE ;
1569*53ee8cc1Swenshuai.xi }
1570*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_EngSetIV(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Key_Type eKeyType,MS_U8 * pu8IV)1571*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_EngSetIV(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Key_Type eKeyType, MS_U8* pu8IV)
1572*53ee8cc1Swenshuai.xi {
1573*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
1574*53ee8cc1Swenshuai.xi 
1575*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
1576*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
1577*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(eKeyType <= E_DSCMB_KEY_ODD, "KeyType input error", FALSE);
1578*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(pu8IV != NULL, "Key data input error", FALSE);
1579*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Set IV DscmbId=%u eKeyType=%d\n", u32DscmbId, eKeyType);
1580*53ee8cc1Swenshuai.xi 
1581*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0;
1582*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
1583*53ee8cc1Swenshuai.xi     MS_U32 u32CAVid = DEFAULT_CAVID;
1584*53ee8cc1Swenshuai.xi     DSCMB_Key_Type eSecureKeyType = E_DSCMB_KEY_CLEAR;
1585*53ee8cc1Swenshuai.xi 
1586*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
1587*53ee8cc1Swenshuai.xi 
1588*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
1589*53ee8cc1Swenshuai.xi     u32CAVid = pMap->u32CAVid;
1590*53ee8cc1Swenshuai.xi 
1591*53ee8cc1Swenshuai.xi     if (!_DSCMB_Dscmb2Flt( u32DscmbId , &u32FltId ))
1592*53ee8cc1Swenshuai.xi     {
1593*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "No filter connect to DSCMB\n");
1594*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetIV_FAIL;
1595*53ee8cc1Swenshuai.xi     }
1596*53ee8cc1Swenshuai.xi 
1597*53ee8cc1Swenshuai.xi     if(TRUE == pMap->bSecure)
1598*53ee8cc1Swenshuai.xi     {
1599*53ee8cc1Swenshuai.xi         eSecureKeyType = E_DSCMB_KEY_SECURE_KEYS_ENABLE;
1600*53ee8cc1Swenshuai.xi     }
1601*53ee8cc1Swenshuai.xi 
1602*53ee8cc1Swenshuai.xi     if((pMap->eFltType == E_DSCMB_FLT_2_KEYS) && (eKeyType == E_DSCMB_KEY_CLEAR))
1603*53ee8cc1Swenshuai.xi     {
1604*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "User Try to use 3 Keys.\n");
1605*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetIV_FAIL;
1606*53ee8cc1Swenshuai.xi     }
1607*53ee8cc1Swenshuai.xi 
1608*53ee8cc1Swenshuai.xi     if (!HAL_DSCMB_KTE_Write_IV(u32FltId, eKeyType | eSecureKeyType , u32CAVid, pu8IV))
1609*53ee8cc1Swenshuai.xi     {
1610*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set IV Fail\n");
1611*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetIV_FAIL;
1612*53ee8cc1Swenshuai.xi     }
1613*53ee8cc1Swenshuai.xi 
1614*53ee8cc1Swenshuai.xi     if (!HAL_DSCMB_KTE_IV_Ctrl (u32FltId, eKeyType | eSecureKeyType , u32CAVid, TRUE ))
1615*53ee8cc1Swenshuai.xi     {
1616*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set IV Fail\n");
1617*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetIV_FAIL;
1618*53ee8cc1Swenshuai.xi     }
1619*53ee8cc1Swenshuai.xi 
1620*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1621*53ee8cc1Swenshuai.xi     return TRUE;
1622*53ee8cc1Swenshuai.xi 
1623*53ee8cc1Swenshuai.xi MDrv_DSCMB2_EngSetIV_FAIL:
1624*53ee8cc1Swenshuai.xi 
1625*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1626*53ee8cc1Swenshuai.xi     return FALSE ;
1627*53ee8cc1Swenshuai.xi }
1628*53ee8cc1Swenshuai.xi 
1629*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_EngSetIV_Ex(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Eng_Type eEngType,DSCMB_Key_Type eKeyType,MS_U8 * pu8IV)1630*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_EngSetIV_Ex(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Eng_Type eEngType, DSCMB_Key_Type eKeyType, MS_U8* pu8IV)
1631*53ee8cc1Swenshuai.xi {
1632*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
1633*53ee8cc1Swenshuai.xi 
1634*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
1635*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
1636*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(eEngType <= (E_DSCMB_ENG_LSAS|E_DSCMB_ENG_ESA|E_DSCMB_ENG_LSAD), "EngType input error", FALSE);
1637*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(eKeyType <= E_DSCMB_KEY_ODD, "KeyType input error", FALSE);
1638*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(pu8IV != NULL, "Key data input error", FALSE);
1639*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Set IV DscmbId=%u eKeyType=%d\n", u32DscmbId, eKeyType);
1640*53ee8cc1Swenshuai.xi 
1641*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0;
1642*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
1643*53ee8cc1Swenshuai.xi     MS_U32 u32CAVid = DEFAULT_CAVID;
1644*53ee8cc1Swenshuai.xi     DSCMB_Key_Type eSecureKeyType = E_DSCMB_KEY_CLEAR;
1645*53ee8cc1Swenshuai.xi 
1646*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
1647*53ee8cc1Swenshuai.xi 
1648*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
1649*53ee8cc1Swenshuai.xi     u32CAVid = pMap->u32CAVid;
1650*53ee8cc1Swenshuai.xi 
1651*53ee8cc1Swenshuai.xi     if (!_DSCMB_Dscmb2Flt( u32DscmbId , &u32FltId ))
1652*53ee8cc1Swenshuai.xi     {
1653*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "No filter connect to DSCMB\n");
1654*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetIV_Ex_FAIL;
1655*53ee8cc1Swenshuai.xi     }
1656*53ee8cc1Swenshuai.xi 
1657*53ee8cc1Swenshuai.xi     if(TRUE == pMap->bSecure)
1658*53ee8cc1Swenshuai.xi     {
1659*53ee8cc1Swenshuai.xi         eSecureKeyType = E_DSCMB_KEY_SECURE_KEYS_ENABLE;
1660*53ee8cc1Swenshuai.xi     }
1661*53ee8cc1Swenshuai.xi 
1662*53ee8cc1Swenshuai.xi     if((pMap->eFltType == E_DSCMB_FLT_2_KEYS) && (eKeyType == E_DSCMB_KEY_CLEAR))
1663*53ee8cc1Swenshuai.xi     {
1664*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "User Try to use 3 Keys.\n");
1665*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetIV_Ex_FAIL;
1666*53ee8cc1Swenshuai.xi     }
1667*53ee8cc1Swenshuai.xi 
1668*53ee8cc1Swenshuai.xi     //Deal with LSAS engine
1669*53ee8cc1Swenshuai.xi     if((eEngType & E_DSCMB_ENG_LSAS) == E_DSCMB_ENG_LSAS )
1670*53ee8cc1Swenshuai.xi     {
1671*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_Write_IV_Ex(u32FltId, eKeyType | eSecureKeyType, E_DSCMB_ENG_LSAS, u32CAVid, pu8IV))
1672*53ee8cc1Swenshuai.xi         {
1673*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set LSAS IV Fail\n");
1674*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetIV_Ex_FAIL;
1675*53ee8cc1Swenshuai.xi         }
1676*53ee8cc1Swenshuai.xi 
1677*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_IV_Ctrl_Ex (u32FltId, eKeyType | eSecureKeyType, E_DSCMB_ENG_LSAS, u32CAVid, TRUE ))
1678*53ee8cc1Swenshuai.xi         {
1679*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set LSAS IV Fail\n");
1680*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetIV_Ex_FAIL;
1681*53ee8cc1Swenshuai.xi         }
1682*53ee8cc1Swenshuai.xi     }
1683*53ee8cc1Swenshuai.xi 
1684*53ee8cc1Swenshuai.xi     //Deal with ESA engine
1685*53ee8cc1Swenshuai.xi     if((eEngType & E_DSCMB_ENG_ESA) == E_DSCMB_ENG_ESA )
1686*53ee8cc1Swenshuai.xi     {
1687*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_Write_IV_Ex(u32FltId, eKeyType | eSecureKeyType, E_DSCMB_ENG_ESA, u32CAVid, pu8IV))
1688*53ee8cc1Swenshuai.xi         {
1689*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set ESA IV Fail\n");
1690*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetIV_Ex_FAIL;
1691*53ee8cc1Swenshuai.xi         }
1692*53ee8cc1Swenshuai.xi 
1693*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_IV_Ctrl_Ex (u32FltId, eKeyType | eSecureKeyType, E_DSCMB_ENG_ESA, u32CAVid, TRUE ))
1694*53ee8cc1Swenshuai.xi         {
1695*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set ESA IV Fail\n");
1696*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetIV_Ex_FAIL;
1697*53ee8cc1Swenshuai.xi         }
1698*53ee8cc1Swenshuai.xi     }
1699*53ee8cc1Swenshuai.xi 
1700*53ee8cc1Swenshuai.xi     //Deal with LSAD engine
1701*53ee8cc1Swenshuai.xi     if((eEngType & E_DSCMB_ENG_LSAD) == E_DSCMB_ENG_LSAD )
1702*53ee8cc1Swenshuai.xi     {
1703*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_Write_IV_Ex(u32FltId, eKeyType | eSecureKeyType, E_DSCMB_ENG_LSAD, u32CAVid, pu8IV))
1704*53ee8cc1Swenshuai.xi         {
1705*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set LSAD IV Fail\n");
1706*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetIV_Ex_FAIL;
1707*53ee8cc1Swenshuai.xi         }
1708*53ee8cc1Swenshuai.xi 
1709*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_IV_Ctrl_Ex (u32FltId, eKeyType | eSecureKeyType, E_DSCMB_ENG_LSAD, u32CAVid, TRUE ))
1710*53ee8cc1Swenshuai.xi         {
1711*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set LSAD IV Fail\n");
1712*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetIV_Ex_FAIL;
1713*53ee8cc1Swenshuai.xi         }
1714*53ee8cc1Swenshuai.xi     }
1715*53ee8cc1Swenshuai.xi 
1716*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1717*53ee8cc1Swenshuai.xi     return TRUE;
1718*53ee8cc1Swenshuai.xi 
1719*53ee8cc1Swenshuai.xi MDrv_DSCMB2_EngSetIV_Ex_FAIL:
1720*53ee8cc1Swenshuai.xi 
1721*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1722*53ee8cc1Swenshuai.xi     return FALSE ;
1723*53ee8cc1Swenshuai.xi }
1724*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_EngSetRIV(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U8 * pu8RIV)1725*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_EngSetRIV(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U8* pu8RIV)
1726*53ee8cc1Swenshuai.xi {
1727*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
1728*53ee8cc1Swenshuai.xi 
1729*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
1730*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
1731*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(pu8RIV != NULL, "Key data input error", FALSE);
1732*53ee8cc1Swenshuai.xi 
1733*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0;
1734*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
1735*53ee8cc1Swenshuai.xi     MS_U32 u32CAVid = DEFAULT_CAVID;
1736*53ee8cc1Swenshuai.xi     DSCMB_Key_Type eSecureKeyType = E_DSCMB_KEY_CLEAR;
1737*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
1738*53ee8cc1Swenshuai.xi 
1739*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
1740*53ee8cc1Swenshuai.xi     u32CAVid = pMap->u32CAVid;
1741*53ee8cc1Swenshuai.xi     if (!_DSCMB_Dscmb2Flt( u32DscmbId , &u32FltId ))
1742*53ee8cc1Swenshuai.xi     {
1743*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "No filter connect to DSCMB\n");
1744*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetRIV_FAIL;
1745*53ee8cc1Swenshuai.xi     }
1746*53ee8cc1Swenshuai.xi 
1747*53ee8cc1Swenshuai.xi     if(TRUE == pMap->bSecure)
1748*53ee8cc1Swenshuai.xi     {
1749*53ee8cc1Swenshuai.xi         eSecureKeyType = E_DSCMB_KEY_SECURE_KEYS_ENABLE;
1750*53ee8cc1Swenshuai.xi     }
1751*53ee8cc1Swenshuai.xi 
1752*53ee8cc1Swenshuai.xi     if(pMap->eFltType == E_DSCMB_FLT_2_KEYS)
1753*53ee8cc1Swenshuai.xi     {
1754*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "User Try to use 3 Keys.\n");
1755*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetRIV_FAIL;
1756*53ee8cc1Swenshuai.xi     }
1757*53ee8cc1Swenshuai.xi 
1758*53ee8cc1Swenshuai.xi     if(pMap->u32RIVIdx == HAL_DSCMB_RIV_MAX)
1759*53ee8cc1Swenshuai.xi     {
1760*53ee8cc1Swenshuai.xi         if(_DSCMB_SlotRIVAlloc (u32EngId, u32DscmbId, &pMap->u32RIVIdx) == FALSE)
1761*53ee8cc1Swenshuai.xi         {
1762*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Find RIV Slot FAIL\n");
1763*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetRIV_FAIL;
1764*53ee8cc1Swenshuai.xi         }
1765*53ee8cc1Swenshuai.xi     }
1766*53ee8cc1Swenshuai.xi 
1767*53ee8cc1Swenshuai.xi     if (!HAL_DSCMB_KTE_Write_RIV(u32FltId, (E_DSCMB_KEY_CLEAR|eSecureKeyType), u32CAVid, pu8RIV, pMap->u32RIVIdx))
1768*53ee8cc1Swenshuai.xi     {
1769*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set RIV Fail\n");
1770*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetRIV_FAIL;
1771*53ee8cc1Swenshuai.xi     }
1772*53ee8cc1Swenshuai.xi 
1773*53ee8cc1Swenshuai.xi     if (!HAL_DSCMB_KTE_IV_Ctrl_Ex (u32FltId, (E_DSCMB_KEY_CLEAR|eSecureKeyType), E_DSCMB_ENG_ESA, u32CAVid, TRUE ))
1774*53ee8cc1Swenshuai.xi     {
1775*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set RIV Fail\n");
1776*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetRIV_FAIL;
1777*53ee8cc1Swenshuai.xi     }
1778*53ee8cc1Swenshuai.xi 
1779*53ee8cc1Swenshuai.xi     // TODO: need to fix channel number
1780*53ee8cc1Swenshuai.xi     HAL_DSCMB_PES_Enable (0, pMap->u32Tsid, TRUE);
1781*53ee8cc1Swenshuai.xi 
1782*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1783*53ee8cc1Swenshuai.xi     return TRUE;
1784*53ee8cc1Swenshuai.xi 
1785*53ee8cc1Swenshuai.xi MDrv_DSCMB2_EngSetRIV_FAIL:
1786*53ee8cc1Swenshuai.xi 
1787*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1788*53ee8cc1Swenshuai.xi     return FALSE ;
1789*53ee8cc1Swenshuai.xi 
1790*53ee8cc1Swenshuai.xi }
1791*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_EngSetKeyFSCB(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Eng_Type eEngType,DSCMB_Key_Type eKeyType,DSCMB_FSCB eForceSCB)1792*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_EngSetKeyFSCB(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Eng_Type eEngType, DSCMB_Key_Type eKeyType, DSCMB_FSCB eForceSCB)
1793*53ee8cc1Swenshuai.xi {
1794*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
1795*53ee8cc1Swenshuai.xi 
1796*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
1797*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
1798*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(eEngType <= (E_DSCMB_ENG_LSAS|E_DSCMB_ENG_ESA|E_DSCMB_ENG_LSAD), "EngType input error", FALSE);
1799*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(eKeyType <= E_DSCMB_KEY_ODD, "KeyType input error", FALSE);
1800*53ee8cc1Swenshuai.xi 
1801*53ee8cc1Swenshuai.xi     MS_BOOL bRet      = TRUE;
1802*53ee8cc1Swenshuai.xi 
1803*53ee8cc1Swenshuai.xi #ifdef ENABLE_KEY_FSCB
1804*53ee8cc1Swenshuai.xi     MS_U32  u32KteSel = REG_KTE_SEL_LSAD;
1805*53ee8cc1Swenshuai.xi     MS_U32  u32i      = 0;
1806*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0;
1807*53ee8cc1Swenshuai.xi 
1808*53ee8cc1Swenshuai.xi     if (!_DSCMB_Dscmb2Flt( u32DscmbId , &u32FltId ))
1809*53ee8cc1Swenshuai.xi     {
1810*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "No filter connect to DSCMB\n");
1811*53ee8cc1Swenshuai.xi         return FALSE;
1812*53ee8cc1Swenshuai.xi     }
1813*53ee8cc1Swenshuai.xi 
1814*53ee8cc1Swenshuai.xi     switch(eEngType)
1815*53ee8cc1Swenshuai.xi     {
1816*53ee8cc1Swenshuai.xi         case E_DSCMB_ENG_LSAS:
1817*53ee8cc1Swenshuai.xi             u32KteSel = E_HAL_DSCMB_ENG_LSAS;
1818*53ee8cc1Swenshuai.xi             break;
1819*53ee8cc1Swenshuai.xi         case E_DSCMB_ENG_ESA:
1820*53ee8cc1Swenshuai.xi             u32KteSel = E_HAL_DSCMB_ENG_ESA;
1821*53ee8cc1Swenshuai.xi             break;
1822*53ee8cc1Swenshuai.xi         case  E_DSCMB_ENG_LSAD:
1823*53ee8cc1Swenshuai.xi             u32KteSel = E_HAL_DSCMB_ENG_LSAD;
1824*53ee8cc1Swenshuai.xi             break;
1825*53ee8cc1Swenshuai.xi         default:
1826*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "EngType input error\n");
1827*53ee8cc1Swenshuai.xi             return FALSE;
1828*53ee8cc1Swenshuai.xi     }
1829*53ee8cc1Swenshuai.xi   #ifdef FLEXIBLE_PIDSLOTMAP
1830*53ee8cc1Swenshuai.xi     bRet = HAL_DSCMB_KTE_Write_KeyFSCB( u32FltId, u32KteSel, eKeyType, eForceSCB);
1831*53ee8cc1Swenshuai.xi     u32i = u32i;
1832*53ee8cc1Swenshuai.xi   #else
1833*53ee8cc1Swenshuai.xi     for(u32i = 0 ; u32i < HAL_DSCMB_PIDFLT_NUM ; u32i++ )
1834*53ee8cc1Swenshuai.xi     {
1835*53ee8cc1Swenshuai.xi         if ( _u32PidFlt2Dscmb[u32i].u8DscmbId==u32DscmbId )
1836*53ee8cc1Swenshuai.xi         {
1837*53ee8cc1Swenshuai.xi             bRet |= HAL_DSCMB_KTE_Write_KeyFSCB( u32i, u32KteSel, eKeyType, eForceSCB);
1838*53ee8cc1Swenshuai.xi         }
1839*53ee8cc1Swenshuai.xi 
1840*53ee8cc1Swenshuai.xi         if( TRUE!= bRet )
1841*53ee8cc1Swenshuai.xi         {
1842*53ee8cc1Swenshuai.xi             break;
1843*53ee8cc1Swenshuai.xi         }
1844*53ee8cc1Swenshuai.xi     }
1845*53ee8cc1Swenshuai.xi   #endif
1846*53ee8cc1Swenshuai.xi #else
1847*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING,"Not support.\n");
1848*53ee8cc1Swenshuai.xi     bRet = FALSE;
1849*53ee8cc1Swenshuai.xi #endif
1850*53ee8cc1Swenshuai.xi 
1851*53ee8cc1Swenshuai.xi     return bRet;
1852*53ee8cc1Swenshuai.xi }
1853*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_EngSetKey(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Eng_Type eEngType,DSCMB_Key_Type eKeyType,MS_U8 * pu8Key)1854*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_EngSetKey(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Eng_Type eEngType, DSCMB_Key_Type eKeyType, MS_U8* pu8Key)
1855*53ee8cc1Swenshuai.xi {
1856*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
1857*53ee8cc1Swenshuai.xi 
1858*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
1859*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
1860*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(eEngType <= (E_DSCMB_ENG_LSAS|E_DSCMB_ENG_ESA|E_DSCMB_ENG_LSAD), "EngType input error", FALSE);
1861*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(eKeyType <= E_DSCMB_KEY_ODD, "KeyType input error", FALSE);
1862*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(pu8Key != NULL, "Key data input error", FALSE);
1863*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Set Key DscmbId=%u eEngType=%d, eKeyType=%d\n", u32DscmbId, eEngType, eKeyType);
1864*53ee8cc1Swenshuai.xi 
1865*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0;
1866*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
1867*53ee8cc1Swenshuai.xi     MS_U32 u32CAVid = DEFAULT_CAVID;
1868*53ee8cc1Swenshuai.xi     DSCMB_Key_Type eSecureKeyType = E_DSCMB_KEY_CLEAR;
1869*53ee8cc1Swenshuai.xi 
1870*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
1871*53ee8cc1Swenshuai.xi 
1872*53ee8cc1Swenshuai.xi     if (!_DSCMB_Dscmb2Flt( u32DscmbId , &u32FltId ))
1873*53ee8cc1Swenshuai.xi     {
1874*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "No filter connect to DSCMB\n");
1875*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetKey_FAIL;
1876*53ee8cc1Swenshuai.xi     }
1877*53ee8cc1Swenshuai.xi 
1878*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
1879*53ee8cc1Swenshuai.xi     u32CAVid = pMap->u32CAVid;
1880*53ee8cc1Swenshuai.xi 
1881*53ee8cc1Swenshuai.xi     if(TRUE == pMap->bSecure)
1882*53ee8cc1Swenshuai.xi     {
1883*53ee8cc1Swenshuai.xi         eSecureKeyType = E_DSCMB_KEY_SECURE_KEYS_ENABLE;
1884*53ee8cc1Swenshuai.xi     }
1885*53ee8cc1Swenshuai.xi 
1886*53ee8cc1Swenshuai.xi     if((pMap->eFltType == E_DSCMB_FLT_2_KEYS) && (eKeyType == E_DSCMB_KEY_CLEAR))
1887*53ee8cc1Swenshuai.xi     {
1888*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "User Try to use 3 Keys.\n");
1889*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngSetKey_FAIL;
1890*53ee8cc1Swenshuai.xi     }
1891*53ee8cc1Swenshuai.xi 
1892*53ee8cc1Swenshuai.xi     //Deal with LSAS engine
1893*53ee8cc1Swenshuai.xi     if((eEngType & E_DSCMB_ENG_LSAS) == E_DSCMB_ENG_LSAS )
1894*53ee8cc1Swenshuai.xi     {
1895*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_Write_Key(u32FltId, eKeyType | eSecureKeyType , E_DSCMB_ENG_LSAS , u32CAVid, pu8Key))
1896*53ee8cc1Swenshuai.xi         {
1897*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set Key Fail with LSAS Engine.\n");
1898*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetKey_FAIL;
1899*53ee8cc1Swenshuai.xi         }
1900*53ee8cc1Swenshuai.xi 
1901*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_Key_Ctrl (u32FltId, eKeyType | eSecureKeyType, E_DSCMB_ENG_LSAS , u32CAVid, TRUE ))
1902*53ee8cc1Swenshuai.xi         {
1903*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set Key Fail with LSAS Engine.\n");
1904*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetKey_FAIL;
1905*53ee8cc1Swenshuai.xi         }
1906*53ee8cc1Swenshuai.xi     }
1907*53ee8cc1Swenshuai.xi     //Deal with ESA engine
1908*53ee8cc1Swenshuai.xi     if((eEngType & E_DSCMB_ENG_ESA) == E_DSCMB_ENG_ESA )
1909*53ee8cc1Swenshuai.xi     {
1910*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_Write_Key(u32FltId, eKeyType | eSecureKeyType, E_DSCMB_ENG_ESA , u32CAVid, pu8Key))
1911*53ee8cc1Swenshuai.xi         {
1912*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set Key Fail with ESA Engine.\n");
1913*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetKey_FAIL;
1914*53ee8cc1Swenshuai.xi         }
1915*53ee8cc1Swenshuai.xi 
1916*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_Key_Ctrl (u32FltId, eKeyType | eSecureKeyType, E_DSCMB_ENG_ESA , u32CAVid, TRUE ))
1917*53ee8cc1Swenshuai.xi         {
1918*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set Key Fail with ESA Engine.\n");
1919*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetKey_FAIL;
1920*53ee8cc1Swenshuai.xi         }
1921*53ee8cc1Swenshuai.xi     }
1922*53ee8cc1Swenshuai.xi     //Deal with LSAD engine
1923*53ee8cc1Swenshuai.xi     if((eEngType & E_DSCMB_ENG_LSAD) == E_DSCMB_ENG_LSAD )
1924*53ee8cc1Swenshuai.xi     {
1925*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_Write_Key(u32FltId, eKeyType | eSecureKeyType, E_DSCMB_ENG_LSAD , u32CAVid, pu8Key))
1926*53ee8cc1Swenshuai.xi         {
1927*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set Key Fail with LSAD Engine.\n");
1928*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetKey_FAIL;
1929*53ee8cc1Swenshuai.xi         }
1930*53ee8cc1Swenshuai.xi 
1931*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_Key_Ctrl (u32FltId, eKeyType | eSecureKeyType, E_DSCMB_ENG_LSAD , u32CAVid, TRUE ))
1932*53ee8cc1Swenshuai.xi         {
1933*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set Key Fail with LSAD Engine.\n");
1934*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetKey_FAIL;
1935*53ee8cc1Swenshuai.xi         }
1936*53ee8cc1Swenshuai.xi     }
1937*53ee8cc1Swenshuai.xi 
1938*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1939*53ee8cc1Swenshuai.xi     return TRUE;
1940*53ee8cc1Swenshuai.xi 
1941*53ee8cc1Swenshuai.xi MDrv_DSCMB2_EngSetKey_FAIL:
1942*53ee8cc1Swenshuai.xi 
1943*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
1944*53ee8cc1Swenshuai.xi     return FALSE ;
1945*53ee8cc1Swenshuai.xi }
1946*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_EngResetKey(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Eng_Type eEngType,DSCMB_Key_Type eKeyType)1947*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_EngResetKey(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Eng_Type eEngType, DSCMB_Key_Type eKeyType)
1948*53ee8cc1Swenshuai.xi {
1949*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
1950*53ee8cc1Swenshuai.xi 
1951*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
1952*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
1953*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(eEngType <= (E_DSCMB_ENG_LSAS|E_DSCMB_ENG_ESA|E_DSCMB_ENG_LSAD), "EngType input error", FALSE);
1954*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(eKeyType <= E_DSCMB_KEY_ODD, "KeyType input error", FALSE);
1955*53ee8cc1Swenshuai.xi 
1956*53ee8cc1Swenshuai.xi     MS_U8 ClrKey[16] = {0};
1957*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0 ;
1958*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
1959*53ee8cc1Swenshuai.xi     MS_U32 u32CAVid = DEFAULT_CAVID;
1960*53ee8cc1Swenshuai.xi     DSCMB_Key_Type eSecureKeyType = E_DSCMB_KEY_CLEAR;
1961*53ee8cc1Swenshuai.xi 
1962*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
1963*53ee8cc1Swenshuai.xi 
1964*53ee8cc1Swenshuai.xi     if (!_DSCMB_Dscmb2Flt( u32DscmbId , &u32FltId ) )
1965*53ee8cc1Swenshuai.xi     {
1966*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "No filter connect to DSCMB\n");
1967*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngResetKey_FAIL;
1968*53ee8cc1Swenshuai.xi     }
1969*53ee8cc1Swenshuai.xi 
1970*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
1971*53ee8cc1Swenshuai.xi     u32CAVid = pMap->u32CAVid;
1972*53ee8cc1Swenshuai.xi 
1973*53ee8cc1Swenshuai.xi     if(TRUE == pMap->bSecure)
1974*53ee8cc1Swenshuai.xi     {
1975*53ee8cc1Swenshuai.xi         eSecureKeyType = E_DSCMB_KEY_SECURE_KEYS_ENABLE;
1976*53ee8cc1Swenshuai.xi     }
1977*53ee8cc1Swenshuai.xi 
1978*53ee8cc1Swenshuai.xi     if((pMap->eFltType == E_DSCMB_FLT_2_KEYS) && (eKeyType == E_DSCMB_KEY_CLEAR))
1979*53ee8cc1Swenshuai.xi     {
1980*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "User Try to use 3 Keys.\n");
1981*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_EngResetKey_FAIL;
1982*53ee8cc1Swenshuai.xi     }
1983*53ee8cc1Swenshuai.xi 
1984*53ee8cc1Swenshuai.xi     //Deal with LSAS engine
1985*53ee8cc1Swenshuai.xi     if((eEngType & E_DSCMB_ENG_LSAS) == E_DSCMB_ENG_LSAS )
1986*53ee8cc1Swenshuai.xi     {
1987*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_Write_Key(u32FltId, eKeyType | eSecureKeyType, E_DSCMB_ENG_LSAS, u32CAVid, ClrKey))
1988*53ee8cc1Swenshuai.xi         {
1989*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Reset Key Fail with LSAS Engine.\n");
1990*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngResetKey_FAIL;
1991*53ee8cc1Swenshuai.xi         }
1992*53ee8cc1Swenshuai.xi     }
1993*53ee8cc1Swenshuai.xi     //Deal with ESA engine
1994*53ee8cc1Swenshuai.xi     if((eEngType & E_DSCMB_ENG_ESA) == E_DSCMB_ENG_ESA )
1995*53ee8cc1Swenshuai.xi     {
1996*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_Write_Key(u32FltId, eKeyType | eSecureKeyType, E_DSCMB_ENG_ESA, u32CAVid, ClrKey))
1997*53ee8cc1Swenshuai.xi         {
1998*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Reset Key Fail with ESA Engine.\n");
1999*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngResetKey_FAIL;
2000*53ee8cc1Swenshuai.xi         }
2001*53ee8cc1Swenshuai.xi     }
2002*53ee8cc1Swenshuai.xi     //Deal with LSAD engine
2003*53ee8cc1Swenshuai.xi     if((eEngType & E_DSCMB_ENG_LSAD) == E_DSCMB_ENG_LSAD )
2004*53ee8cc1Swenshuai.xi     {
2005*53ee8cc1Swenshuai.xi         if (!HAL_DSCMB_KTE_Write_Key(u32FltId, eKeyType | eSecureKeyType, E_DSCMB_ENG_LSAD, u32CAVid, ClrKey))
2006*53ee8cc1Swenshuai.xi         {
2007*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Reset Key Fail with LSAD Engine.\n");
2008*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngResetKey_FAIL;
2009*53ee8cc1Swenshuai.xi         }
2010*53ee8cc1Swenshuai.xi     }
2011*53ee8cc1Swenshuai.xi 
2012*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2013*53ee8cc1Swenshuai.xi     return TRUE ;
2014*53ee8cc1Swenshuai.xi MDrv_DSCMB2_EngResetKey_FAIL:
2015*53ee8cc1Swenshuai.xi 
2016*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2017*53ee8cc1Swenshuai.xi     return FALSE;
2018*53ee8cc1Swenshuai.xi }
2019*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_EngSetCAVid(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32CAVid)2020*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_EngSetCAVid(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32CAVid)
2021*53ee8cc1Swenshuai.xi {
2022*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2023*53ee8cc1Swenshuai.xi 
2024*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
2025*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
2026*53ee8cc1Swenshuai.xi 
2027*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
2028*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
2029*53ee8cc1Swenshuai.xi 
2030*53ee8cc1Swenshuai.xi     for(i = 0 ; i < HAL_DSCMB_PIDFLT_NUM; i++)
2031*53ee8cc1Swenshuai.xi     {
2032*53ee8cc1Swenshuai.xi         if(_DSCMB_IsFltConnectDSCMB(u32DscmbId, i))
2033*53ee8cc1Swenshuai.xi         {
2034*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "DSCMB filter connect more than one filter\n");
2035*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_EngSetCAVid_FAIL;
2036*53ee8cc1Swenshuai.xi         }
2037*53ee8cc1Swenshuai.xi     }
2038*53ee8cc1Swenshuai.xi 
2039*53ee8cc1Swenshuai.xi     pMap->u32CAVid = u32CAVid;
2040*53ee8cc1Swenshuai.xi 
2041*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2042*53ee8cc1Swenshuai.xi     return TRUE;
2043*53ee8cc1Swenshuai.xi 
2044*53ee8cc1Swenshuai.xi MDrv_DSCMB2_EngSetCAVid_FAIL:
2045*53ee8cc1Swenshuai.xi 
2046*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2047*53ee8cc1Swenshuai.xi     return FALSE;
2048*53ee8cc1Swenshuai.xi }
2049*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_SetDefaultCAVid(MS_U32 u32EngId,MS_U32 u32CAVid)2050*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_SetDefaultCAVid(MS_U32 u32EngId, MS_U32 u32CAVid)
2051*53ee8cc1Swenshuai.xi {
2052*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2053*53ee8cc1Swenshuai.xi 
2054*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
2055*53ee8cc1Swenshuai.xi     DSCMB_ASSERT((u32CAVid != 0) && (u32CAVid <= DEFAULT_CAVID), "CAVid input error", FALSE);
2056*53ee8cc1Swenshuai.xi 
2057*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
2058*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
2059*53ee8cc1Swenshuai.xi 
2060*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
2061*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
2062*53ee8cc1Swenshuai.xi     for ( i = 1 ; i < HAL_DSCMB_KTE_MAX ; i ++)
2063*53ee8cc1Swenshuai.xi #else
2064*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < HAL_DSCMB_KTE_MAX ; i ++)
2065*53ee8cc1Swenshuai.xi #endif
2066*53ee8cc1Swenshuai.xi     {
2067*53ee8cc1Swenshuai.xi         pMap = &DscmbTspMap[u32EngId][i];
2068*53ee8cc1Swenshuai.xi         if ( (pMap->bUsed == TRUE) && (pMap->u32CAVid != u32CAVid))
2069*53ee8cc1Swenshuai.xi         {
2070*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Please release dscmb id %u\n", i);
2071*53ee8cc1Swenshuai.xi             goto MDrv_DSCMB2_SetDefaultCAVid_FAIL;
2072*53ee8cc1Swenshuai.xi         }
2073*53ee8cc1Swenshuai.xi     }
2074*53ee8cc1Swenshuai.xi 
2075*53ee8cc1Swenshuai.xi     //set default cavid
2076*53ee8cc1Swenshuai.xi     HAL_DSCMB_SetCAVid (u32CAVid);
2077*53ee8cc1Swenshuai.xi 
2078*53ee8cc1Swenshuai.xi     //set tsp cavid and packet out cavid
2079*53ee8cc1Swenshuai.xi     for(i = 0 ; i < HAL_DSCMB_TSID_MAX; i++)
2080*53ee8cc1Swenshuai.xi     {
2081*53ee8cc1Swenshuai.xi         HAL_DSCMB_SetTSPCAVid(i, u32CAVid);
2082*53ee8cc1Swenshuai.xi     }
2083*53ee8cc1Swenshuai.xi 
2084*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2085*53ee8cc1Swenshuai.xi     return TRUE;
2086*53ee8cc1Swenshuai.xi MDrv_DSCMB2_SetDefaultCAVid_FAIL:
2087*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2088*53ee8cc1Swenshuai.xi     return FALSE;
2089*53ee8cc1Swenshuai.xi }
2090*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_GetPidSlotMapIndex(MS_U32 u32EngId,MS_U32 u32DscmbId)2091*53ee8cc1Swenshuai.xi MS_U32  _MDrv_DSCMB2_GetPidSlotMapIndex(MS_U32 u32EngId, MS_U32 u32DscmbId)
2092*53ee8cc1Swenshuai.xi {
2093*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(DRV_DSCMB_FLT_NULL);
2094*53ee8cc1Swenshuai.xi 
2095*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
2096*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
2097*53ee8cc1Swenshuai.xi 
2098*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0 ;
2099*53ee8cc1Swenshuai.xi 
2100*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
2101*53ee8cc1Swenshuai.xi 
2102*53ee8cc1Swenshuai.xi     if (!_DSCMB_Dscmb2Flt( u32DscmbId , &u32FltId ) )
2103*53ee8cc1Swenshuai.xi     {
2104*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "No filter connect to DSCMB\n");
2105*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_GetPidSlotMapIndex_FAIL;
2106*53ee8cc1Swenshuai.xi     }
2107*53ee8cc1Swenshuai.xi 
2108*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2109*53ee8cc1Swenshuai.xi     return u32FltId;
2110*53ee8cc1Swenshuai.xi 
2111*53ee8cc1Swenshuai.xi MDrv_DSCMB2_GetPidSlotMapIndex_FAIL:
2112*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2113*53ee8cc1Swenshuai.xi     return DRV_DSCMB_FLT_NULL;
2114*53ee8cc1Swenshuai.xi 
2115*53ee8cc1Swenshuai.xi }
2116*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_IsKTEValid(MS_U32 u32FltId,DSCMB_Key_Type eKeyType)2117*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_IsKTEValid(MS_U32 u32FltId, DSCMB_Key_Type eKeyType)
2118*53ee8cc1Swenshuai.xi {
2119*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2120*53ee8cc1Swenshuai.xi 
2121*53ee8cc1Swenshuai.xi     MS_U32 KeyStatus = 0;
2122*53ee8cc1Swenshuai.xi 
2123*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
2124*53ee8cc1Swenshuai.xi 
2125*53ee8cc1Swenshuai.xi 
2126*53ee8cc1Swenshuai.xi     if(_u32PidFlt2Dscmb[u32FltId].u8DscmbId != HAL_DSCMB_KTE_MAX)
2127*53ee8cc1Swenshuai.xi     {
2128*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
2129*53ee8cc1Swenshuai.xi         HAL_DSCMB_KTE_GetStatus(_u32PidFlt2Dscmb[u32FltId].u8DscmbId, eKeyType, &KeyStatus);
2130*53ee8cc1Swenshuai.xi #else
2131*53ee8cc1Swenshuai.xi         HAL_DSCMB_KTE_GetStatus(u32FltId, eKeyType, &KeyStatus);
2132*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP */
2133*53ee8cc1Swenshuai.xi     }
2134*53ee8cc1Swenshuai.xi 
2135*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2136*53ee8cc1Swenshuai.xi 
2137*53ee8cc1Swenshuai.xi     return (KeyStatus & DSCMB_KTE_VALID)?TRUE:FALSE;
2138*53ee8cc1Swenshuai.xi }
2139*53ee8cc1Swenshuai.xi 
2140*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_SetTSPCAVid(DSCMB_TSIF eSrcTSIf,MS_U32 u32CAVid)2141*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_SetTSPCAVid(DSCMB_TSIF eSrcTSIf, MS_U32 u32CAVid)
2142*53ee8cc1Swenshuai.xi {
2143*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2144*53ee8cc1Swenshuai.xi 
2145*53ee8cc1Swenshuai.xi     MS_U32 u32Tsid = HAL_DSCMB_FltSrc2PktDmx(eSrcTSIf);
2146*53ee8cc1Swenshuai.xi 
2147*53ee8cc1Swenshuai.xi     HAL_DSCMB_SetTSPCAVid(u32Tsid, u32CAVid);
2148*53ee8cc1Swenshuai.xi 
2149*53ee8cc1Swenshuai.xi     return TRUE;
2150*53ee8cc1Swenshuai.xi }
2151*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_SetTSPCADst(MS_U32 u32FltId,MS_U32 u32UpDst,MS_U32 u32LowDst)2152*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_SetTSPCADst(MS_U32 u32FltId, MS_U32 u32UpDst, MS_U32 u32LowDst)
2153*53ee8cc1Swenshuai.xi {
2154*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2155*53ee8cc1Swenshuai.xi     MS_U32 u32PidSlotMapNo=0;
2156*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
2157*53ee8cc1Swenshuai.xi 
2158*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
2159*53ee8cc1Swenshuai.xi     if(_u32PidFlt2Dscmb[u32FltId].u8DscmbId != HAL_DSCMB_KTE_MAX)
2160*53ee8cc1Swenshuai.xi     {
2161*53ee8cc1Swenshuai.xi         u32PidSlotMapNo =_u32PidFlt2Dscmb[u32FltId].u8DscmbId;
2162*53ee8cc1Swenshuai.xi     }
2163*53ee8cc1Swenshuai.xi #else
2164*53ee8cc1Swenshuai.xi     u32PidSlotMapNo = u32FltId;
2165*53ee8cc1Swenshuai.xi #endif
2166*53ee8cc1Swenshuai.xi 
2167*53ee8cc1Swenshuai.xi     _u32PidFlt2Dscmb[u32FltId].u8CaDestUpp = u32UpDst;
2168*53ee8cc1Swenshuai.xi     _u32PidFlt2Dscmb[u32FltId].u8CaDestLow = u32LowDst;
2169*53ee8cc1Swenshuai.xi     HAL_DSCMB_SetTSPCADst_PidSlotMap(u32FltId, u32UpDst, u32LowDst, u32PidSlotMapNo);
2170*53ee8cc1Swenshuai.xi 
2171*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2172*53ee8cc1Swenshuai.xi     return TRUE;
2173*53ee8cc1Swenshuai.xi }
2174*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_DualPath_Enable(MS_U32 u32EngId,MS_U32 u32FltId)2175*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_DualPath_Enable(MS_U32 u32EngId, MS_U32 u32FltId)
2176*53ee8cc1Swenshuai.xi {
2177*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2178*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
2179*53ee8cc1Swenshuai.xi 
2180*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
2181*53ee8cc1Swenshuai.xi     if(_u32PidFlt2Dscmb[u32FltId].u8DscmbId != HAL_DSCMB_KTE_MAX)
2182*53ee8cc1Swenshuai.xi     {
2183*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
2184*53ee8cc1Swenshuai.xi         bRet = HAL_DSCMB_PidIdx_DualPath(_u32PidFlt2Dscmb[u32FltId].u8DscmbId, TRUE);   //enable small switch pid_no dual path
2185*53ee8cc1Swenshuai.xi #else
2186*53ee8cc1Swenshuai.xi         bRet = HAL_DSCMB_PidIdx_DualPath(u32FltId, TRUE);
2187*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP */
2188*53ee8cc1Swenshuai.xi     }
2189*53ee8cc1Swenshuai.xi     else
2190*53ee8cc1Swenshuai.xi     {
2191*53ee8cc1Swenshuai.xi         bRet = FALSE;
2192*53ee8cc1Swenshuai.xi     }
2193*53ee8cc1Swenshuai.xi 
2194*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2195*53ee8cc1Swenshuai.xi     return bRet;
2196*53ee8cc1Swenshuai.xi }
2197*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_DualPath_Disable(MS_U32 u32EngId,MS_U32 u32FltId)2198*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_DualPath_Disable(MS_U32 u32EngId, MS_U32 u32FltId)
2199*53ee8cc1Swenshuai.xi {
2200*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2201*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
2202*53ee8cc1Swenshuai.xi 
2203*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
2204*53ee8cc1Swenshuai.xi 
2205*53ee8cc1Swenshuai.xi     if(_u32PidFlt2Dscmb[u32FltId].u8DscmbId != HAL_DSCMB_KTE_MAX)
2206*53ee8cc1Swenshuai.xi     {
2207*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
2208*53ee8cc1Swenshuai.xi         bRet = HAL_DSCMB_PidIdx_DualPath(_u32PidFlt2Dscmb[u32FltId].u8DscmbId, FALSE);   //disable small switch pid_no dual path
2209*53ee8cc1Swenshuai.xi #else
2210*53ee8cc1Swenshuai.xi         bRet = HAL_DSCMB_PidIdx_DualPath(u32FltId, FALSE);
2211*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP */
2212*53ee8cc1Swenshuai.xi     }
2213*53ee8cc1Swenshuai.xi     else
2214*53ee8cc1Swenshuai.xi     {
2215*53ee8cc1Swenshuai.xi         bRet = FALSE;
2216*53ee8cc1Swenshuai.xi     }
2217*53ee8cc1Swenshuai.xi 
2218*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2219*53ee8cc1Swenshuai.xi     return bRet;
2220*53ee8cc1Swenshuai.xi }
2221*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_SPD_Enable(DSCMB_TSIF ePvrSrcTSIf)2222*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_SPD_Enable(DSCMB_TSIF ePvrSrcTSIf)
2223*53ee8cc1Swenshuai.xi {
2224*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2225*53ee8cc1Swenshuai.xi 
2226*53ee8cc1Swenshuai.xi     MS_U32 u32Tsif = HAL_DSCMB_FltSrc2TSIF(ePvrSrcTSIf);
2227*53ee8cc1Swenshuai.xi 
2228*53ee8cc1Swenshuai.xi     if( u32Tsif >= E_HAL_DSCMB_TSIF_NUM)
2229*53ee8cc1Swenshuai.xi     {
2230*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING,"Not support.\n");
2231*53ee8cc1Swenshuai.xi         return FALSE;
2232*53ee8cc1Swenshuai.xi     }
2233*53ee8cc1Swenshuai.xi 
2234*53ee8cc1Swenshuai.xi     HAL_DSCMB_SPD_Enable(u32Tsif);
2235*53ee8cc1Swenshuai.xi     HAL_DSCMB_SPD_Reset(u32Tsif);
2236*53ee8cc1Swenshuai.xi 
2237*53ee8cc1Swenshuai.xi     return TRUE;
2238*53ee8cc1Swenshuai.xi }
2239*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_SPD_Disable(DSCMB_TSIF ePvrSrcTSIf)2240*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_SPD_Disable(DSCMB_TSIF ePvrSrcTSIf)
2241*53ee8cc1Swenshuai.xi {
2242*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2243*53ee8cc1Swenshuai.xi 
2244*53ee8cc1Swenshuai.xi     MS_U32 u32Tsif = HAL_DSCMB_FltSrc2TSIF(ePvrSrcTSIf);
2245*53ee8cc1Swenshuai.xi 
2246*53ee8cc1Swenshuai.xi     if( u32Tsif >= E_HAL_DSCMB_TSIF_NUM)
2247*53ee8cc1Swenshuai.xi     {
2248*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING,"Not support.\n");
2249*53ee8cc1Swenshuai.xi         return FALSE;
2250*53ee8cc1Swenshuai.xi     }
2251*53ee8cc1Swenshuai.xi 
2252*53ee8cc1Swenshuai.xi     HAL_DSCMB_SPD_Disable(u32Tsif);
2253*53ee8cc1Swenshuai.xi     HAL_DSCMB_SPD_Reset(u32Tsif);
2254*53ee8cc1Swenshuai.xi 
2255*53ee8cc1Swenshuai.xi     return TRUE;
2256*53ee8cc1Swenshuai.xi }
2257*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_SPS_Enable(DSCMB_CAPVR_MODE eCaMode)2258*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_SPS_Enable (DSCMB_CAPVR_MODE eCaMode)
2259*53ee8cc1Swenshuai.xi {
2260*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2261*53ee8cc1Swenshuai.xi 
2262*53ee8cc1Swenshuai.xi     MS_U32 u32ProgId  = HAL_DSCMB_GetProgId(eCaMode);
2263*53ee8cc1Swenshuai.xi 
2264*53ee8cc1Swenshuai.xi     return HAL_DSCMB_Cipher_SPS_Enable(u32ProgId, TRUE);
2265*53ee8cc1Swenshuai.xi }
2266*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_SPS_Disable(DSCMB_CAPVR_MODE eCaMode)2267*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_SPS_Disable (DSCMB_CAPVR_MODE eCaMode)
2268*53ee8cc1Swenshuai.xi {
2269*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2270*53ee8cc1Swenshuai.xi 
2271*53ee8cc1Swenshuai.xi     MS_U32 u32ProgId  = HAL_DSCMB_GetProgId(eCaMode);
2272*53ee8cc1Swenshuai.xi 
2273*53ee8cc1Swenshuai.xi     return HAL_DSCMB_Cipher_SPS_Enable(u32ProgId, FALSE);
2274*53ee8cc1Swenshuai.xi }
2275*53ee8cc1Swenshuai.xi 
2276*53ee8cc1Swenshuai.xi /*//////////////////////////////////////////////////////////////////////
2277*53ee8cc1Swenshuai.xi 
2278*53ee8cc1Swenshuai.xi   Arg: ePvrSrcTSIf,  need to identify with TSP DMX_TSIF when use this function
2279*53ee8cc1Swenshuai.xi 
2280*53ee8cc1Swenshuai.xi //////////////////////////////////////////////////////////////////////*/
_MDrv_DSCMB2_CAPVR_FlowSet(MS_U32 u32EngId,DSCMB_CAPVR_MODE eCaMode,DSCMB_TSIF ePvrSrcTsif)2281*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_CAPVR_FlowSet(MS_U32 u32EngId, DSCMB_CAPVR_MODE eCaMode, DSCMB_TSIF ePvrSrcTsif)
2282*53ee8cc1Swenshuai.xi {
2283*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2284*53ee8cc1Swenshuai.xi 
2285*53ee8cc1Swenshuai.xi     MS_U32 u32Tsid    = HAL_DSCMB_FltSrc2PktDmx(ePvrSrcTsif); //genereate from ePvrSrcTSIF
2286*53ee8cc1Swenshuai.xi     MS_U32 u32CaVid   = HAL_DSCMB_GetCAVid();
2287*53ee8cc1Swenshuai.xi     MS_U32 u32Channel = HAL_DSCMB_GetChannlId(ePvrSrcTsif);
2288*53ee8cc1Swenshuai.xi     MS_U32 u32ProgId  = HAL_DSCMB_GetProgId(eCaMode);
2289*53ee8cc1Swenshuai.xi 
2290*53ee8cc1Swenshuai.xi     HAL_DSCMB_Cipher_Output_Ctrl(u32ProgId, u32Channel, TRUE, FALSE, u32Tsid, u32CaVid);
2291*53ee8cc1Swenshuai.xi     return TRUE;
2292*53ee8cc1Swenshuai.xi }
2293*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_SetPidPair(MS_U32 u32FltIdPri,MS_U32 u32FltIdSec)2294*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_SetPidPair(MS_U32 u32FltIdPri, MS_U32 u32FltIdSec)
2295*53ee8cc1Swenshuai.xi {
2296*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2297*53ee8cc1Swenshuai.xi 
2298*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
2299*53ee8cc1Swenshuai.xi 
2300*53ee8cc1Swenshuai.xi     if(!HAL_DSCMB_PidFlt_SetPidPair(u32FltIdPri, u32FltIdSec) )
2301*53ee8cc1Swenshuai.xi     {
2302*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Set Pid Pair Fail\n");
2303*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_SetPidPair_FAIL;
2304*53ee8cc1Swenshuai.xi     }
2305*53ee8cc1Swenshuai.xi 
2306*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2307*53ee8cc1Swenshuai.xi     return TRUE;
2308*53ee8cc1Swenshuai.xi 
2309*53ee8cc1Swenshuai.xi MDrv_DSCMB2_SetPidPair_FAIL:
2310*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2311*53ee8cc1Swenshuai.xi     return FALSE;
2312*53ee8cc1Swenshuai.xi }
2313*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_ClearPidPair(MS_U32 u32FltIdPri,MS_U32 u32FltIdSec)2314*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_ClearPidPair(MS_U32 u32FltIdPri, MS_U32 u32FltIdSec)
2315*53ee8cc1Swenshuai.xi {
2316*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2317*53ee8cc1Swenshuai.xi 
2318*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
2319*53ee8cc1Swenshuai.xi 
2320*53ee8cc1Swenshuai.xi     if(!HAL_DSCMB_PidFlt_ClearPidPair(u32FltIdPri, u32FltIdSec) )
2321*53ee8cc1Swenshuai.xi     {
2322*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Clear Pid Pair Fail\n");
2323*53ee8cc1Swenshuai.xi         goto MDrv_DSCMB2_Clear_FAIL;
2324*53ee8cc1Swenshuai.xi     }
2325*53ee8cc1Swenshuai.xi 
2326*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2327*53ee8cc1Swenshuai.xi     return TRUE;
2328*53ee8cc1Swenshuai.xi 
2329*53ee8cc1Swenshuai.xi MDrv_DSCMB2_Clear_FAIL:
2330*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2331*53ee8cc1Swenshuai.xi     return FALSE;
2332*53ee8cc1Swenshuai.xi }
2333*53ee8cc1Swenshuai.xi 
2334*53ee8cc1Swenshuai.xi 
2335*53ee8cc1Swenshuai.xi //----------------------------------------------------------------------//
2336*53ee8cc1Swenshuai.xi //                   Old Interface for compatibility                        //
2337*53ee8cc1Swenshuai.xi //----------------------------------------------------------------------//
_MDrv_DSCMB2_FltTypeSet(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Type DscmbType)2338*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_FltTypeSet(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Type DscmbType)
2339*53ee8cc1Swenshuai.xi {
2340*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2341*53ee8cc1Swenshuai.xi 
2342*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32EngId == 0, "EngId input error", FALSE);
2343*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32DscmbId < HAL_DSCMB_KTE_MAX, "DscmbId input error", FALSE);
2344*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(DscmbType <= E_DSCMB_TYPE_CSA_CONF, "Dscmb Type input error", FALSE);
2345*53ee8cc1Swenshuai.xi 
2346*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
2347*53ee8cc1Swenshuai.xi 
2348*53ee8cc1Swenshuai.xi     DSCMB_MainAlgo_Type  eAlgo    = E_DSCMB_MAIN_ALGO_AES;
2349*53ee8cc1Swenshuai.xi     DSCMB_SubAlgo_Type   eSubAlgo = E_DSCMB_SUB_ALGO_NONE;
2350*53ee8cc1Swenshuai.xi     DSCMB_ResSBAlgo_Type eRes     = E_DSCMB_RESSB_ALGO_NONE;
2351*53ee8cc1Swenshuai.xi     DSCMB_ResSBAlgo_Type eSB      = E_DSCMB_RESSB_ALGO_NONE;
2352*53ee8cc1Swenshuai.xi 
2353*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
2354*53ee8cc1Swenshuai.xi 
2355*53ee8cc1Swenshuai.xi     switch (DscmbType)
2356*53ee8cc1Swenshuai.xi     {
2357*53ee8cc1Swenshuai.xi         case E_DSCMB_TYPE_CSA:
2358*53ee8cc1Swenshuai.xi             eAlgo    = E_DSCMB_MAIN_ALGO_CSA2;
2359*53ee8cc1Swenshuai.xi             break;
2360*53ee8cc1Swenshuai.xi         case E_DSCMB_TYPE_CSA_CONF:
2361*53ee8cc1Swenshuai.xi             eAlgo    = E_DSCMB_MAIN_ALGO_CSA2_CONF;
2362*53ee8cc1Swenshuai.xi             break;
2363*53ee8cc1Swenshuai.xi         case E_DSCMB_TYPE_NSA_AS_ESA:
2364*53ee8cc1Swenshuai.xi             //[FIXME] Ask Designer to update this setting.
2365*53ee8cc1Swenshuai.xi             eAlgo    = E_DSCMB_MAIN_ALGO_CSA2 ;
2366*53ee8cc1Swenshuai.xi             break;
2367*53ee8cc1Swenshuai.xi         case E_DSCMB_TYPE_DES:
2368*53ee8cc1Swenshuai.xi             eAlgo    = E_DSCMB_MAIN_ALGO_DES ;
2369*53ee8cc1Swenshuai.xi             break;
2370*53ee8cc1Swenshuai.xi         case E_DSCMB_TYPE_AES: // AES - CBC
2371*53ee8cc1Swenshuai.xi             eAlgo    = E_DSCMB_MAIN_ALGO_AES ;
2372*53ee8cc1Swenshuai.xi             eSubAlgo = E_DSCMB_SUB_ALGO_CBC ;
2373*53ee8cc1Swenshuai.xi             break;
2374*53ee8cc1Swenshuai.xi         case E_DSCMB_TYPE_AES_ECB: // AES ECB
2375*53ee8cc1Swenshuai.xi             eAlgo    = E_DSCMB_MAIN_ALGO_AES ;
2376*53ee8cc1Swenshuai.xi             eSubAlgo = E_DSCMB_SUB_ALGO_ECB ;
2377*53ee8cc1Swenshuai.xi             break;
2378*53ee8cc1Swenshuai.xi         case E_DSCMB_TYPE_AES_CTR:
2379*53ee8cc1Swenshuai.xi             eAlgo    = E_DSCMB_MAIN_ALGO_AES ;
2380*53ee8cc1Swenshuai.xi             eSubAlgo = E_DSCMB_SUB_ALGO_CTR ;
2381*53ee8cc1Swenshuai.xi             eRes     = E_DSCMB_RESSB_ALGO_CTR ;
2382*53ee8cc1Swenshuai.xi             eSB      = E_DSCMB_RESSB_ALGO_CTR ;
2383*53ee8cc1Swenshuai.xi             break;
2384*53ee8cc1Swenshuai.xi         case E_DSCMB_TYPE_AES_SCTE52: //AES - SCTE 52 - CBC
2385*53ee8cc1Swenshuai.xi             eAlgo    = E_DSCMB_MAIN_ALGO_AES ;
2386*53ee8cc1Swenshuai.xi             eSubAlgo = E_DSCMB_SUB_ALGO_CBC ;
2387*53ee8cc1Swenshuai.xi             eRes     = E_DSCMB_RESSB_ALGO_SCTE52 ;
2388*53ee8cc1Swenshuai.xi             eSB      = E_DSCMB_RESSB_ALGO_SCTE52 ;
2389*53ee8cc1Swenshuai.xi             break;
2390*53ee8cc1Swenshuai.xi         case E_DSCMB_TYPE_TDES_ECB:
2391*53ee8cc1Swenshuai.xi             eAlgo    = E_DSCMB_MAIN_ALGO_TDES ;
2392*53ee8cc1Swenshuai.xi             eSubAlgo = E_DSCMB_SUB_ALGO_ECB ;
2393*53ee8cc1Swenshuai.xi             break;
2394*53ee8cc1Swenshuai.xi         case E_DSCMB_TYPE_TDES_SCTE52:
2395*53ee8cc1Swenshuai.xi             eAlgo    = E_DSCMB_MAIN_ALGO_TDES ;
2396*53ee8cc1Swenshuai.xi             eSubAlgo = E_DSCMB_SUB_ALGO_CBC ;
2397*53ee8cc1Swenshuai.xi             eRes     = E_DSCMB_RESSB_ALGO_SCTE52 ;
2398*53ee8cc1Swenshuai.xi             eSB      = E_DSCMB_RESSB_ALGO_SCTE52 ;
2399*53ee8cc1Swenshuai.xi             break;
2400*53ee8cc1Swenshuai.xi         case E_DSCMB_TYPE_SYN_AES:
2401*53ee8cc1Swenshuai.xi             eAlgo    = E_DSCMB_MAIN_ALGO_AES ;
2402*53ee8cc1Swenshuai.xi             eSubAlgo = E_DSCMB_SUB_ALGO_LEADING_CLEAR ;
2403*53ee8cc1Swenshuai.xi             break;
2404*53ee8cc1Swenshuai.xi         case E_DSCMB_TYPE_MULTI2: //[FIXME] check setting
2405*53ee8cc1Swenshuai.xi             eAlgo    = E_DSCMB_MAIN_ALGO_MULTI2 ;
2406*53ee8cc1Swenshuai.xi             eSubAlgo = E_DSCMB_SUB_ALGO_CBC ;
2407*53ee8cc1Swenshuai.xi             eRes     = E_DSCMB_RESSB_ALGO_SCTE52 ;
2408*53ee8cc1Swenshuai.xi             eSB      = E_DSCMB_RESSB_ALGO_CLR ;
2409*53ee8cc1Swenshuai.xi             break;
2410*53ee8cc1Swenshuai.xi         case E_DSCMB_TYPE_CSA3:
2411*53ee8cc1Swenshuai.xi             eAlgo    = E_DSCMB_MAIN_ALGO_CSA3 ;
2412*53ee8cc1Swenshuai.xi             break;
2413*53ee8cc1Swenshuai.xi         default:
2414*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Invalid Algorithm Type\n");
2415*53ee8cc1Swenshuai.xi             return FALSE;
2416*53ee8cc1Swenshuai.xi     }
2417*53ee8cc1Swenshuai.xi 
2418*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Algo info %d %d %d %d %d \n", pMap->bDscmb, eAlgo, eSubAlgo, eRes, eSB);
2419*53ee8cc1Swenshuai.xi 
2420*53ee8cc1Swenshuai.xi     DSCMB_Algo_Cfg stAlgoConfig =
2421*53ee8cc1Swenshuai.xi     {
2422*53ee8cc1Swenshuai.xi         .eMainAlgo= eAlgo,
2423*53ee8cc1Swenshuai.xi         .eSubAlgo = eSubAlgo,
2424*53ee8cc1Swenshuai.xi         .eResAlgo = eRes,
2425*53ee8cc1Swenshuai.xi         .eSBAlgo  = eSB,
2426*53ee8cc1Swenshuai.xi         .bDecrypt = pMap->bDscmb
2427*53ee8cc1Swenshuai.xi     };
2428*53ee8cc1Swenshuai.xi 
2429*53ee8cc1Swenshuai.xi     DSCMB_FSCB eFSCB = ((stAlgoConfig.bDecrypt == TRUE)?DSCMB_FSCB_CLEAR : DSCMB_FSCB_UNCHG);
2430*53ee8cc1Swenshuai.xi 
2431*53ee8cc1Swenshuai.xi     if(FALSE == _MDrv_DSCMB2_EngSetAlgo (u32EngId, u32DscmbId, E_DSCMB_ENG_ESA, stAlgoConfig) )
2432*53ee8cc1Swenshuai.xi     {
2433*53ee8cc1Swenshuai.xi         return FALSE;
2434*53ee8cc1Swenshuai.xi     }
2435*53ee8cc1Swenshuai.xi 
2436*53ee8cc1Swenshuai.xi     if(FALSE == _MDrv_DSCMB2_EngSetSwitch (0, u32DscmbId, 0, E_DSCMB_ENG_ESA))
2437*53ee8cc1Swenshuai.xi     {
2438*53ee8cc1Swenshuai.xi         return FALSE;
2439*53ee8cc1Swenshuai.xi     }
2440*53ee8cc1Swenshuai.xi 
2441*53ee8cc1Swenshuai.xi     if(FALSE == _MDrv_DSCMB2_EngSetFSCB (0, u32DscmbId, eFSCB))
2442*53ee8cc1Swenshuai.xi     {
2443*53ee8cc1Swenshuai.xi         return FALSE;
2444*53ee8cc1Swenshuai.xi     }
2445*53ee8cc1Swenshuai.xi 
2446*53ee8cc1Swenshuai.xi     return TRUE;
2447*53ee8cc1Swenshuai.xi }
2448*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_FltKeySet(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Key_Type eKeyType,MS_U8 * pu8Key)2449*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_FltKeySet(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Key_Type eKeyType, MS_U8* pu8Key)
2450*53ee8cc1Swenshuai.xi {
2451*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngSetKey (u32EngId, u32DscmbId, E_DSCMB_ENG_ESA, eKeyType, pu8Key);
2452*53ee8cc1Swenshuai.xi }
2453*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_FltIVSet(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Key_Type eKeyType,MS_U8 * pu8IV)2454*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_FltIVSet(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Key_Type eKeyType, MS_U8* pu8IV)
2455*53ee8cc1Swenshuai.xi {
2456*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngSetIV (u32EngId, u32DscmbId, eKeyType, pu8IV);
2457*53ee8cc1Swenshuai.xi }
2458*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_FltKeyReset(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Key_Type eKeyType)2459*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_FltKeyReset(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Key_Type eKeyType)
2460*53ee8cc1Swenshuai.xi {
2461*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngResetKey(u32EngId, u32DscmbId, E_DSCMB_ENG_ESA, eKeyType);
2462*53ee8cc1Swenshuai.xi }
2463*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_FltDscmb(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_BOOL bDscmb)2464*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_FltDscmb(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_BOOL bDscmb)
2465*53ee8cc1Swenshuai.xi {
2466*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2467*53ee8cc1Swenshuai.xi 
2468*53ee8cc1Swenshuai.xi     stDscmbTspMap* pMap = NULL;
2469*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
2470*53ee8cc1Swenshuai.xi 
2471*53ee8cc1Swenshuai.xi     pMap = &DscmbTspMap[u32EngId][u32DscmbId];
2472*53ee8cc1Swenshuai.xi     pMap->bDscmb = bDscmb ;
2473*53ee8cc1Swenshuai.xi 
2474*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
2475*53ee8cc1Swenshuai.xi 
2476*53ee8cc1Swenshuai.xi     return TRUE ;
2477*53ee8cc1Swenshuai.xi }
2478*53ee8cc1Swenshuai.xi 
2479*53ee8cc1Swenshuai.xi #if !(defined(MSOS_TYPE_OPTEE) || defined(MSOS_TYPE_NUTTX))
_MDrv_DSCMB2_FltConnectPid(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32Pid)2480*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_FltConnectPid(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32Pid)
2481*53ee8cc1Swenshuai.xi {
2482*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2483*53ee8cc1Swenshuai.xi 
2484*53ee8cc1Swenshuai.xi     MS_U32 j = 0;
2485*53ee8cc1Swenshuai.xi     MS_BOOL bConnected = FALSE;
2486*53ee8cc1Swenshuai.xi 
2487*53ee8cc1Swenshuai.xi     DSCMB_ASSERT_AND_RETURN(TRUE == DscmbTspMap[u32EngId][u32DscmbId].bUsed);
2488*53ee8cc1Swenshuai.xi 
2489*53ee8cc1Swenshuai.xi     for(j = 1 ; j < HAL_DSCMB_PIDFLT_NUM; j ++)
2490*53ee8cc1Swenshuai.xi     {
2491*53ee8cc1Swenshuai.xi         if(HAL_DSCMB_PidFlt_GetPid(j) == u32Pid)
2492*53ee8cc1Swenshuai.xi         {
2493*53ee8cc1Swenshuai.xi             if(_MDrv_DSCMB2_FltConnectFltId(u32EngId, u32DscmbId, j) == FALSE)
2494*53ee8cc1Swenshuai.xi             {
2495*53ee8cc1Swenshuai.xi                 DSCMB_ASSERT_AND_RETURN(0);
2496*53ee8cc1Swenshuai.xi                 return FALSE;
2497*53ee8cc1Swenshuai.xi             }
2498*53ee8cc1Swenshuai.xi             bConnected = TRUE;
2499*53ee8cc1Swenshuai.xi         }
2500*53ee8cc1Swenshuai.xi     }
2501*53ee8cc1Swenshuai.xi 
2502*53ee8cc1Swenshuai.xi     return bConnected;
2503*53ee8cc1Swenshuai.xi 
2504*53ee8cc1Swenshuai.xi }
2505*53ee8cc1Swenshuai.xi 
2506*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_FltDisconnectPid_Ex(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32Pid)2507*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_FltDisconnectPid_Ex(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32Pid)
2508*53ee8cc1Swenshuai.xi {
2509*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2510*53ee8cc1Swenshuai.xi 
2511*53ee8cc1Swenshuai.xi     MS_U32 j = 0;
2512*53ee8cc1Swenshuai.xi     MS_BOOL bDisconnected = FALSE;
2513*53ee8cc1Swenshuai.xi 
2514*53ee8cc1Swenshuai.xi     DSCMB_ASSERT_AND_RETURN(TRUE == DscmbTspMap[u32EngId][u32DscmbId].bUsed);
2515*53ee8cc1Swenshuai.xi 
2516*53ee8cc1Swenshuai.xi     for(j = 1 ; j < HAL_DSCMB_PIDFLT_NUM; j ++)
2517*53ee8cc1Swenshuai.xi     {
2518*53ee8cc1Swenshuai.xi         if(HAL_DSCMB_PidFlt_GetPid(j) == u32Pid)
2519*53ee8cc1Swenshuai.xi         {
2520*53ee8cc1Swenshuai.xi             if(_MDrv_DSCMB2_FltDisconnectFltId(u32EngId, u32DscmbId, j) == FALSE)
2521*53ee8cc1Swenshuai.xi             {
2522*53ee8cc1Swenshuai.xi                 DSCMB_ASSERT_AND_RETURN(0);
2523*53ee8cc1Swenshuai.xi                 return FALSE;
2524*53ee8cc1Swenshuai.xi             }
2525*53ee8cc1Swenshuai.xi             bDisconnected = TRUE;
2526*53ee8cc1Swenshuai.xi         }
2527*53ee8cc1Swenshuai.xi     }
2528*53ee8cc1Swenshuai.xi 
2529*53ee8cc1Swenshuai.xi     return bDisconnected;
2530*53ee8cc1Swenshuai.xi 
2531*53ee8cc1Swenshuai.xi }
2532*53ee8cc1Swenshuai.xi #endif//MSOS_TYPE_NUTTX , MSOS_TYPE_NUTTX
2533*53ee8cc1Swenshuai.xi 
2534*53ee8cc1Swenshuai.xi //------------------------------------- ------------------//
2535*53ee8cc1Swenshuai.xi //----------------------Keyladder API -----------------------//
2536*53ee8cc1Swenshuai.xi //-------------------------------------------------------//
2537*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
2538*53ee8cc1Swenshuai.xi /// An atomic Key ladder function for Key generation, including common KL use cases.
2539*53ee8cc1Swenshuai.xi /// Thread safe for cuncurrent usage.
2540*53ee8cc1Swenshuai.xi /// @param KLCfg\b IN: KL execution setting for target key generation
2541*53ee8cc1Swenshuai.xi /// @param ACPU_Out\b IN: A 16 bytes array pointer for Acpu key output.
2542*53ee8cc1Swenshuai.xi /// @param u32Status\b IN: Key ladder running status
2543*53ee8cc1Swenshuai.xi /// @return TRUE - Success
2544*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
2545*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
_MDrv_DSCMB2_KLadder_AtomicExec(DSCMB_KLCfg_All * KLCfg,MS_U8 * ACPU_Out,DSCMB_KL_Status * u32Status)2546*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_KLadder_AtomicExec(DSCMB_KLCfg_All* KLCfg , MS_U8 *ACPU_Out, DSCMB_KL_Status* u32Status )
2547*53ee8cc1Swenshuai.xi {
2548*53ee8cc1Swenshuai.xi     KL_INIT_CHECK(FALSE);
2549*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(KLCfg != NULL, "KLCfg input error", FALSE);
2550*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32Status != NULL, "u32Status input error", FALSE);
2551*53ee8cc1Swenshuai.xi 
2552*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
2553*53ee8cc1Swenshuai.xi     MS_U32 u32ErrMsg = 0;
2554*53ee8cc1Swenshuai.xi     //  MS_BOOL bKeepRound=FALSE;
2555*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0;
2556*53ee8cc1Swenshuai.xi     MS_U32 u32Field = 0;
2557*53ee8cc1Swenshuai.xi     MS_U32 u32CAVid = KLCfg->u32CAVid;
2558*53ee8cc1Swenshuai.xi 
2559*53ee8cc1Swenshuai.xi     DSCMB_KL_SelEng eKLEng = KLCfg->eKLSel;
2560*53ee8cc1Swenshuai.xi     DSCMB_KLDst eKLDst = KLCfg->eDst & (~E_DSCMB_KL_DST_KT_PIDSLOTMAP_ENABLE);
2561*53ee8cc1Swenshuai.xi     DSCMB_KLSrc eKLSrc = KLCfg->eSrc & (~E_DSCMB_KL_SRC_KDF_ENABLE);
2562*53ee8cc1Swenshuai.xi     MS_BOOL bEnableKDF = ((KLCfg->eSrc & E_DSCMB_KL_SRC_KDF_ENABLE) == E_DSCMB_KL_SRC_KDF_ENABLE);
2563*53ee8cc1Swenshuai.xi     MS_BOOL bEnablePidslotmap = ((KLCfg->eDst & E_DSCMB_KL_DST_KT_PIDSLOTMAP_ENABLE) == E_DSCMB_KL_DST_KT_PIDSLOTMAP_ENABLE);
2564*53ee8cc1Swenshuai.xi     DSCMB_Key_Type eKeyType = KLCfg->eKeyType & (~E_DSCMB_KEY_FSCB_ENABLE);
2565*53ee8cc1Swenshuai.xi #ifdef ENABLE_KEY_FSCB
2566*53ee8cc1Swenshuai.xi     MS_BOOL bEnableKeyFscb = ((KLCfg->eKeyType & E_DSCMB_KEY_FSCB_ENABLE) == E_DSCMB_KEY_FSCB_ENABLE);
2567*53ee8cc1Swenshuai.xi #endif
2568*53ee8cc1Swenshuai.xi     MS_BOOL bKLDstSecure = ((KLCfg->eKeyType & E_DSCMB_KEY_SECURE_KEYS_ENABLE) == E_DSCMB_KEY_SECURE_KEYS_ENABLE);
2569*53ee8cc1Swenshuai.xi 
2570*53ee8cc1Swenshuai.xi     if(_MDrv_DSCMB2_KLadder_Init () == FALSE)
2571*53ee8cc1Swenshuai.xi     {
2572*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Keyladder Init Fail\n");
2573*53ee8cc1Swenshuai.xi         return FALSE;
2574*53ee8cc1Swenshuai.xi     }
2575*53ee8cc1Swenshuai.xi 
2576*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Lock();
2577*53ee8cc1Swenshuai.xi     if ( FALSE == HAL_DSCMB_KL_HW_SEM_Lock(eKLEng, DSCMB_KL_WAIT_THRESHOLD)) //TODO: fix constant value
2578*53ee8cc1Swenshuai.xi     {
2579*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_WAIT_KL_READY_TIMEOUT;
2580*53ee8cc1Swenshuai.xi         goto KL_Fail;
2581*53ee8cc1Swenshuai.xi     }
2582*53ee8cc1Swenshuai.xi     *u32Status = KL_STATUS_KEY_OK ;
2583*53ee8cc1Swenshuai.xi 
2584*53ee8cc1Swenshuai.xi     ///translate cavid to Default CAVID if user set input cavid to 0x0
2585*53ee8cc1Swenshuai.xi     if(u32CAVid == 0)
2586*53ee8cc1Swenshuai.xi     {
2587*53ee8cc1Swenshuai.xi         u32CAVid = DEFAULT_CAVID;
2588*53ee8cc1Swenshuai.xi     }
2589*53ee8cc1Swenshuai.xi 
2590*53ee8cc1Swenshuai.xi     /////////////// Check Source and acpu data ////////////////////
2591*53ee8cc1Swenshuai.xi     if ((E_DSCMB_KL_SRC_ACPU == eKLSrc) && (NULL == KLCfg->u8KeyACPU))
2592*53ee8cc1Swenshuai.xi     {
2593*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_ACPU_KEY_NULL;
2594*53ee8cc1Swenshuai.xi         goto KL_Fail;
2595*53ee8cc1Swenshuai.xi     }
2596*53ee8cc1Swenshuai.xi 
2597*53ee8cc1Swenshuai.xi     /////////////// Check KL level ////////////////////
2598*53ee8cc1Swenshuai.xi     if((KLCfg->u32Level >5) && (KLCfg->u32Level != 9) && (KLCfg->u32Level != 0xD))
2599*53ee8cc1Swenshuai.xi     {
2600*53ee8cc1Swenshuai.xi         //bKeepRound = TRUE ;
2601*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_INVALID_INPUT_LEVEL;
2602*53ee8cc1Swenshuai.xi         goto KL_Fail;
2603*53ee8cc1Swenshuai.xi     }
2604*53ee8cc1Swenshuai.xi     else if(( 0 == KLCfg->u32Level ) && (0==(DSCMB_KL_DST_CLASS_DMA & eKLDst)))
2605*53ee8cc1Swenshuai.xi     {
2606*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_INVALID_INPUT_LEVEL;
2607*53ee8cc1Swenshuai.xi         goto KL_Fail;
2608*53ee8cc1Swenshuai.xi     }
2609*53ee8cc1Swenshuai.xi 
2610*53ee8cc1Swenshuai.xi     ////////////// check Key destination ///////////////
2611*53ee8cc1Swenshuai.xi     /// Compatible and translate old version to new version
2612*53ee8cc1Swenshuai.xi     if( ((eKLDst & 0xF0) == 0) && ( (eKLDst & 0x0F) > 0 )) //OLD Destination
2613*53ee8cc1Swenshuai.xi     {
2614*53ee8cc1Swenshuai.xi         switch(eKLDst)
2615*53ee8cc1Swenshuai.xi         {
2616*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_ACPU:
2617*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_CPU_ACPU;
2618*53ee8cc1Swenshuai.xi                 break;
2619*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_KT_NSA:
2620*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_KT_ESA;
2621*53ee8cc1Swenshuai.xi                 break;
2622*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_DMA_AES:
2623*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_DMA_SK0;
2624*53ee8cc1Swenshuai.xi                 break;
2625*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_DMA_TDES:
2626*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_DMA_SK0;
2627*53ee8cc1Swenshuai.xi                 break;
2628*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_PRIVATE0:
2629*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_PRIVATE_0;
2630*53ee8cc1Swenshuai.xi                 break;
2631*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_PRIVATE1:
2632*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_PRIVATE_1;
2633*53ee8cc1Swenshuai.xi                 break;
2634*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_PRIVATE2:
2635*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_PRIVATE_2;
2636*53ee8cc1Swenshuai.xi                 break;
2637*53ee8cc1Swenshuai.xi             default:
2638*53ee8cc1Swenshuai.xi                 ;
2639*53ee8cc1Swenshuai.xi         }
2640*53ee8cc1Swenshuai.xi     }
2641*53ee8cc1Swenshuai.xi 
2642*53ee8cc1Swenshuai.xi     // If destination is key table, and use dscmbId to get pidslotmap entry,
2643*53ee8cc1Swenshuai.xi     // need to check descrambler driver init
2644*53ee8cc1Swenshuai.xi     if (DSCMB_KL_DST_CLASS_KT & eKLDst)
2645*53ee8cc1Swenshuai.xi     {
2646*53ee8cc1Swenshuai.xi         if(bEnablePidslotmap == FALSE)
2647*53ee8cc1Swenshuai.xi         {
2648*53ee8cc1Swenshuai.xi             DSCMB_INIT_CHECK(FALSE);
2649*53ee8cc1Swenshuai.xi         }
2650*53ee8cc1Swenshuai.xi     }
2651*53ee8cc1Swenshuai.xi 
2652*53ee8cc1Swenshuai.xi     if (E_DSCMB_KL_DST_CPU_ACPU == eKLDst)
2653*53ee8cc1Swenshuai.xi     {
2654*53ee8cc1Swenshuai.xi         //KL to ACPU
2655*53ee8cc1Swenshuai.xi         if(NULL == ACPU_Out)
2656*53ee8cc1Swenshuai.xi         {
2657*53ee8cc1Swenshuai.xi             *u32Status = KL_STATUS_ACPU_OUTKEY_NULL;
2658*53ee8cc1Swenshuai.xi             goto KL_Fail;
2659*53ee8cc1Swenshuai.xi         }
2660*53ee8cc1Swenshuai.xi     }
2661*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_KT & eKLDst)
2662*53ee8cc1Swenshuai.xi     {
2663*53ee8cc1Swenshuai.xi         //KL to KT
2664*53ee8cc1Swenshuai.xi         if(bEnablePidslotmap)
2665*53ee8cc1Swenshuai.xi         {
2666*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Keyladder destination KT class\n");
2667*53ee8cc1Swenshuai.xi             u32FltId = KLCfg->u32DscID;
2668*53ee8cc1Swenshuai.xi         }
2669*53ee8cc1Swenshuai.xi         else
2670*53ee8cc1Swenshuai.xi         {
2671*53ee8cc1Swenshuai.xi             if ( FALSE == DscmbTspMap[KLCfg->u32EngID][KLCfg->u32DscID].bUsed )
2672*53ee8cc1Swenshuai.xi             {
2673*53ee8cc1Swenshuai.xi                 //The keyslot is not allocated for the DSCMB ID
2674*53ee8cc1Swenshuai.xi                 *u32Status = KL_STATUS_IVALID_DSCMB_ID;
2675*53ee8cc1Swenshuai.xi                 goto KL_Fail;
2676*53ee8cc1Swenshuai.xi            }
2677*53ee8cc1Swenshuai.xi             if( 0 == DscmbTspMap[KLCfg->u32EngID][KLCfg->u32DscID].u32PidFltIdNum )
2678*53ee8cc1Swenshuai.xi             {
2679*53ee8cc1Swenshuai.xi                 //No pid filter is connected to the DSCMB ID
2680*53ee8cc1Swenshuai.xi                 *u32Status = KL_STATUS_IVALID_DSCMB_ID;
2681*53ee8cc1Swenshuai.xi                 goto KL_Fail;
2682*53ee8cc1Swenshuai.xi             }
2683*53ee8cc1Swenshuai.xi 
2684*53ee8cc1Swenshuai.xi             // Get Filter ID
2685*53ee8cc1Swenshuai.xi             if(FALSE == _DSCMB_Dscmb2Flt(KLCfg->u32DscID, &u32FltId))
2686*53ee8cc1Swenshuai.xi             {
2687*53ee8cc1Swenshuai.xi                 *u32Status = KL_STATUS_IVALID_DSCMB_ID;
2688*53ee8cc1Swenshuai.xi                 goto KL_Fail;
2689*53ee8cc1Swenshuai.xi             }
2690*53ee8cc1Swenshuai.xi 
2691*53ee8cc1Swenshuai.xi         }
2692*53ee8cc1Swenshuai.xi         // Get Field
2693*53ee8cc1Swenshuai.xi 
2694*53ee8cc1Swenshuai.xi     }
2695*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_DMA & eKLDst)
2696*53ee8cc1Swenshuai.xi     {
2697*53ee8cc1Swenshuai.xi         //KL to DMA
2698*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Keyladder destination DMA class\n");
2699*53ee8cc1Swenshuai.xi     }
2700*53ee8cc1Swenshuai.xi     else if(DSCMB_KL_DST_CLASS_PVT &eKLDst)
2701*53ee8cc1Swenshuai.xi     {
2702*53ee8cc1Swenshuai.xi         //KL to PVT
2703*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Keyladder destination Private Key class\n");
2704*53ee8cc1Swenshuai.xi     }
2705*53ee8cc1Swenshuai.xi     else if(DSCMB_KL_DST_CLASS_TSIO & eKLDst)
2706*53ee8cc1Swenshuai.xi     {
2707*53ee8cc1Swenshuai.xi         //KL to TSIO
2708*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Keyladder destination TSIO\n");
2709*53ee8cc1Swenshuai.xi         u32FltId = KLCfg->u32DscID; //TSIO service id
2710*53ee8cc1Swenshuai.xi     }
2711*53ee8cc1Swenshuai.xi     else if(DSCMB_KL_DST_CLASS_CFB& eKLDst)
2712*53ee8cc1Swenshuai.xi     {
2713*53ee8cc1Swenshuai.xi         //KL to CFB
2714*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Keyladder destination CFB\n");
2715*53ee8cc1Swenshuai.xi     }
2716*53ee8cc1Swenshuai.xi     else
2717*53ee8cc1Swenshuai.xi     {
2718*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Unknown Keyladder destination\n");
2719*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_KL_INPUT_NULL;
2720*53ee8cc1Swenshuai.xi         goto KL_Fail;
2721*53ee8cc1Swenshuai.xi     }
2722*53ee8cc1Swenshuai.xi 
2723*53ee8cc1Swenshuai.xi     //Check KeyLadder Input
2724*53ee8cc1Swenshuai.xi     if ((KLCfg->u32Level != 0) && (NULL == KLCfg->pu8KeyKLIn))
2725*53ee8cc1Swenshuai.xi     {
2726*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_KL_INPUT_NULL;
2727*53ee8cc1Swenshuai.xi         goto KL_Fail;
2728*53ee8cc1Swenshuai.xi     }
2729*53ee8cc1Swenshuai.xi 
2730*53ee8cc1Swenshuai.xi     // TODO: Here need to check key property if support KDF or not
2731*53ee8cc1Swenshuai.xi 
2732*53ee8cc1Swenshuai.xi     if((E_DSCMB_KL_TYPE_INF == _u8KLPreLevel) || ((E_DSCMB_KL_TYPE_INF == _u8KLPreLevel) && (E_DSCMB_KL_TYPE_LV1 == KLCfg->u32Level)))
2733*53ee8cc1Swenshuai.xi     {
2734*53ee8cc1Swenshuai.xi         _u8KLPreLevel = KLCfg->u32Level;
2735*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Keyladder keep round and not reset \n");
2736*53ee8cc1Swenshuai.xi     }
2737*53ee8cc1Swenshuai.xi     else
2738*53ee8cc1Swenshuai.xi     {
2739*53ee8cc1Swenshuai.xi         _u8KLPreLevel = KLCfg->u32Level;
2740*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_Reset(eKLEng);
2741*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KDF_Disable(eKLEng);
2742*53ee8cc1Swenshuai.xi     }
2743*53ee8cc1Swenshuai.xi 
2744*53ee8cc1Swenshuai.xi     if(E_DSCMB_KL_SRC_ACPU == eKLSrc)
2745*53ee8cc1Swenshuai.xi     {
2746*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_ACPURootKey(eKLEng, KLCfg->u8KeyACPU);
2747*53ee8cc1Swenshuai.xi     }
2748*53ee8cc1Swenshuai.xi 
2749*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_INFO, "u32CAVid=%X\n", u32CAVid);
2750*53ee8cc1Swenshuai.xi     //FIXME: If Key from OTP, should we set usage & entropy ?
2751*53ee8cc1Swenshuai.xi     if(DSCMB_KL_DST_CLASS_TSIO & eKLDst)
2752*53ee8cc1Swenshuai.xi     {
2753*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyProp( eKLEng, u32CAVid, 0 , /*Usage*/ 1 /*Entropy*/);
2754*53ee8cc1Swenshuai.xi     }
2755*53ee8cc1Swenshuai.xi     else
2756*53ee8cc1Swenshuai.xi     {
2757*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyProp( eKLEng, u32CAVid, 0 , /*Usage*/ 0 /*Entropy*/);
2758*53ee8cc1Swenshuai.xi     }
2759*53ee8cc1Swenshuai.xi 
2760*53ee8cc1Swenshuai.xi     //Enable KDF
2761*53ee8cc1Swenshuai.xi     if(bEnableKDF)
2762*53ee8cc1Swenshuai.xi     {
2763*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KDF_Enable( eKLEng, KLCfg->stKDF.eKDFType, KLCfg->stKDF.u16AppId, KLCfg->stKDF.eHWKeyId);
2764*53ee8cc1Swenshuai.xi     }
2765*53ee8cc1Swenshuai.xi 
2766*53ee8cc1Swenshuai.xi     // Set KL Level input //
2767*53ee8cc1Swenshuai.xi     if(E_DSCMB_KL_TYPE_INF == KLCfg->u32Level) //Keep round, 1 stage
2768*53ee8cc1Swenshuai.xi     {
2769*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_Input(eKLEng, 0, KLCfg->pu8KeyKLIn);
2770*53ee8cc1Swenshuai.xi     }
2771*53ee8cc1Swenshuai.xi     else if(E_DSCMB_KL_TYPE_S5 == KLCfg->u32Level) //SMI Keyladder
2772*53ee8cc1Swenshuai.xi     {
2773*53ee8cc1Swenshuai.xi         for( i = 0 ; i < 5 ; i ++ )
2774*53ee8cc1Swenshuai.xi         {
2775*53ee8cc1Swenshuai.xi             HAL_DSCMB_KL_Input(eKLEng, (4 - i), KLCfg->pu8KeyKLIn+(16*i));
2776*53ee8cc1Swenshuai.xi         }
2777*53ee8cc1Swenshuai.xi     }
2778*53ee8cc1Swenshuai.xi     else if(KLCfg->u32Level <= 5) //0~5 level keyladder
2779*53ee8cc1Swenshuai.xi     {
2780*53ee8cc1Swenshuai.xi         for( i = 0 ; i < KLCfg->u32Level ; i ++ )
2781*53ee8cc1Swenshuai.xi         {
2782*53ee8cc1Swenshuai.xi             HAL_DSCMB_KL_Input(eKLEng, (KLCfg->u32Level-i-1), KLCfg->pu8KeyKLIn+(16*i));
2783*53ee8cc1Swenshuai.xi         }
2784*53ee8cc1Swenshuai.xi     }
2785*53ee8cc1Swenshuai.xi     else
2786*53ee8cc1Swenshuai.xi     {
2787*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Unknown Keyladder type(level) setting\n");
2788*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_INVALID_INPUT_LEVEL;
2789*53ee8cc1Swenshuai.xi         goto KL_Fail;
2790*53ee8cc1Swenshuai.xi     }
2791*53ee8cc1Swenshuai.xi 
2792*53ee8cc1Swenshuai.xi     // Set KL Ctrl
2793*53ee8cc1Swenshuai.xi     if(FALSE == HAL_DSCMB_KL_Ctrl(eKLEng, KLCfg->eAlgo, KLCfg->u32Level, eKLSrc, eKLDst))
2794*53ee8cc1Swenshuai.xi     {
2795*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Invalid Keyladder control setting\n");
2796*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_INVALID_INPUT_LEVEL;
2797*53ee8cc1Swenshuai.xi         goto KL_Fail;
2798*53ee8cc1Swenshuai.xi     }
2799*53ee8cc1Swenshuai.xi 
2800*53ee8cc1Swenshuai.xi     //KL to secure key slot
2801*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_DstSecure(eKLEng, bKLDstSecure);
2802*53ee8cc1Swenshuai.xi 
2803*53ee8cc1Swenshuai.xi     if (DSCMB_KL_DST_CLASS_CPU & eKLDst)
2804*53ee8cc1Swenshuai.xi     {
2805*53ee8cc1Swenshuai.xi         // KL flow for ACPU output //
2806*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
2807*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
2808*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
2809*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
2810*53ee8cc1Swenshuai.xi                             0);               /*For Dst DMA*/
2811*53ee8cc1Swenshuai.xi     }
2812*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_DMA & eKLDst)
2813*53ee8cc1Swenshuai.xi     {
2814*53ee8cc1Swenshuai.xi         // KL flow for output  to CryptoDMA  //
2815*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
2816*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
2817*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
2818*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
2819*53ee8cc1Swenshuai.xi                             eKLDst);          /*For Dst DMA*/
2820*53ee8cc1Swenshuai.xi     }
2821*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_KT & eKLDst)
2822*53ee8cc1Swenshuai.xi     {
2823*53ee8cc1Swenshuai.xi #ifdef ENABLE_KEY_FSCB
2824*53ee8cc1Swenshuai.xi         if(bEnableKeyFscb){
2825*53ee8cc1Swenshuai.xi             // KL flow for output  to KTE (with KeyFSCB) //
2826*53ee8cc1Swenshuai.xi             HAL_DSCMB_KL_KeyBus_Ex(eKLEng,
2827*53ee8cc1Swenshuai.xi                                   u32FltId,               /*For Dst KT*/
2828*53ee8cc1Swenshuai.xi                                   u32Field,               /*For Dst KT*/
2829*53ee8cc1Swenshuai.xi                                   eKeyType,               /*For Dst KT*/
2830*53ee8cc1Swenshuai.xi                                   eKLDst,                 /*For Dst KT*/
2831*53ee8cc1Swenshuai.xi                                   KLCfg->eFSCB);          /*For Dst KT*/
2832*53ee8cc1Swenshuai.xi         }
2833*53ee8cc1Swenshuai.xi         else{
2834*53ee8cc1Swenshuai.xi #endif
2835*53ee8cc1Swenshuai.xi         // KL flow for output  to KTE //
2836*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
2837*53ee8cc1Swenshuai.xi                             u32FltId,               /*For Dst KT*/
2838*53ee8cc1Swenshuai.xi                             u32Field,               /*For Dst KT*/
2839*53ee8cc1Swenshuai.xi                             eKeyType,               /*For Dst KT*/
2840*53ee8cc1Swenshuai.xi                             eKLDst);                /*For Dst KT*/
2841*53ee8cc1Swenshuai.xi #ifdef ENABLE_KEY_FSCB
2842*53ee8cc1Swenshuai.xi         }
2843*53ee8cc1Swenshuai.xi #endif
2844*53ee8cc1Swenshuai.xi     }
2845*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_PVT & eKLDst)
2846*53ee8cc1Swenshuai.xi     {
2847*53ee8cc1Swenshuai.xi         // KL flow for output  to PVT //
2848*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
2849*53ee8cc1Swenshuai.xi                             0,               /*For Dst KT*/
2850*53ee8cc1Swenshuai.xi                             0,               /*For Dst KT*/
2851*53ee8cc1Swenshuai.xi                             0,               /*For Dst KT*/
2852*53ee8cc1Swenshuai.xi                             0);              /*For Dst DMA*/
2853*53ee8cc1Swenshuai.xi     }
2854*53ee8cc1Swenshuai.xi     else if(DSCMB_KL_DST_CLASS_TSIO & eKLDst)
2855*53ee8cc1Swenshuai.xi     {
2856*53ee8cc1Swenshuai.xi         // KL flow for output  to TSIO //
2857*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
2858*53ee8cc1Swenshuai.xi                             u32FltId,               /*For Dst TSIO*/
2859*53ee8cc1Swenshuai.xi                             0,                      /*For Dst TSIO*/
2860*53ee8cc1Swenshuai.xi                             KLCfg->eKeyType,        /*For Dst TSIO*/
2861*53ee8cc1Swenshuai.xi                             eKLDst);                /*For Dst TSIO*/
2862*53ee8cc1Swenshuai.xi     }
2863*53ee8cc1Swenshuai.xi     else if(DSCMB_KL_DST_CLASS_CFB& eKLDst)
2864*53ee8cc1Swenshuai.xi     {
2865*53ee8cc1Swenshuai.xi         // KL flow for output  to CFB  //
2866*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
2867*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
2868*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
2869*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
2870*53ee8cc1Swenshuai.xi                             eKLDst);          /*For Dst CFB*/
2871*53ee8cc1Swenshuai.xi     }
2872*53ee8cc1Swenshuai.xi 
2873*53ee8cc1Swenshuai.xi     if(HAL_DSCMB_KL_Start(eKLEng) == FALSE)
2874*53ee8cc1Swenshuai.xi     {
2875*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_ErrMsg(eKLEng, &u32ErrMsg);
2876*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "\033[31m KL error message 0x%X\n\033[m", (unsigned int)u32ErrMsg);
2877*53ee8cc1Swenshuai.xi         goto KL_Fail;
2878*53ee8cc1Swenshuai.xi     }
2879*53ee8cc1Swenshuai.xi 
2880*53ee8cc1Swenshuai.xi     if ((DSCMB_KL_DST_CLASS_SPSSPD & eKLDst) == DSCMB_KL_DST_CLASS_SPSSPD)
2881*53ee8cc1Swenshuai.xi     {
2882*53ee8cc1Swenshuai.xi         // KL flow for output  to CryptoDMA  //
2883*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_SP_KeyCtrl(eKLEng, eKLDst);
2884*53ee8cc1Swenshuai.xi         if(HAL_DSCMB_KL_SP_Start(eKLEng) == FALSE)
2885*53ee8cc1Swenshuai.xi         {
2886*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "\033[31m KL to SPS SPD Fail\n\033[m");
2887*53ee8cc1Swenshuai.xi             goto KL_Fail;
2888*53ee8cc1Swenshuai.xi         }
2889*53ee8cc1Swenshuai.xi     }
2890*53ee8cc1Swenshuai.xi 
2891*53ee8cc1Swenshuai.xi     // enable key
2892*53ee8cc1Swenshuai.xi     if (DSCMB_KL_DST_CLASS_KT & eKLDst)
2893*53ee8cc1Swenshuai.xi     {
2894*53ee8cc1Swenshuai.xi         DSCMB_Eng_Type eEngType = E_DSCMB_ENG_ESA;
2895*53ee8cc1Swenshuai.xi         if(eKLDst == E_DSCMB_KL_DST_KT_ESA )
2896*53ee8cc1Swenshuai.xi         {
2897*53ee8cc1Swenshuai.xi             eEngType = E_DSCMB_ENG_ESA;
2898*53ee8cc1Swenshuai.xi         }
2899*53ee8cc1Swenshuai.xi         else if(eKLDst == E_DSCMB_KL_DST_KT_LSAS )
2900*53ee8cc1Swenshuai.xi         {
2901*53ee8cc1Swenshuai.xi             eEngType = E_DSCMB_ENG_LSAS;
2902*53ee8cc1Swenshuai.xi         }
2903*53ee8cc1Swenshuai.xi         else if(eKLDst == E_DSCMB_KL_DST_KT_LSAD )
2904*53ee8cc1Swenshuai.xi         {
2905*53ee8cc1Swenshuai.xi             eEngType = E_DSCMB_ENG_LSAD;
2906*53ee8cc1Swenshuai.xi         }
2907*53ee8cc1Swenshuai.xi 
2908*53ee8cc1Swenshuai.xi         if (FALSE == HAL_DSCMB_KTE_Key_Ctrl_Ex(u32FltId,
2909*53ee8cc1Swenshuai.xi                                             eKeyType,
2910*53ee8cc1Swenshuai.xi                                             eEngType,
2911*53ee8cc1Swenshuai.xi                                             u32CAVid,
2912*53ee8cc1Swenshuai.xi                                             TRUE,
2913*53ee8cc1Swenshuai.xi                                             TRUE))
2914*53ee8cc1Swenshuai.xi         {
2915*53ee8cc1Swenshuai.xi             *u32Status = KL_STATUS_KL_INPUT_NULL;
2916*53ee8cc1Swenshuai.xi             goto KL_Fail;
2917*53ee8cc1Swenshuai.xi         }
2918*53ee8cc1Swenshuai.xi     }
2919*53ee8cc1Swenshuai.xi 
2920*53ee8cc1Swenshuai.xi     //Output to ACPU
2921*53ee8cc1Swenshuai.xi     if (E_DSCMB_KL_DST_CPU_ACPU == eKLDst)
2922*53ee8cc1Swenshuai.xi     {
2923*53ee8cc1Swenshuai.xi         MS_U32 u32OutKeySize = 0;
2924*53ee8cc1Swenshuai.xi         if(KLCfg->eOutsize == E_DSCMB_KL_64_BITS)
2925*53ee8cc1Swenshuai.xi         {
2926*53ee8cc1Swenshuai.xi             u32OutKeySize = 8;
2927*53ee8cc1Swenshuai.xi         }
2928*53ee8cc1Swenshuai.xi         else if(KLCfg->eOutsize == E_DSCMB_KL_128_BITS)
2929*53ee8cc1Swenshuai.xi         {
2930*53ee8cc1Swenshuai.xi             u32OutKeySize = 16;
2931*53ee8cc1Swenshuai.xi         }
2932*53ee8cc1Swenshuai.xi         memset(ACPU_Out , 0x0 , u32OutKeySize );
2933*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_GetACPUOut(eKLEng,ACPU_Out,u32OutKeySize);
2934*53ee8cc1Swenshuai.xi     }
2935*53ee8cc1Swenshuai.xi 
2936*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_HW_SEM_Unlock(eKLEng);
2937*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Unlock();
2938*53ee8cc1Swenshuai.xi     return TRUE;
2939*53ee8cc1Swenshuai.xi 
2940*53ee8cc1Swenshuai.xi KL_Fail:
2941*53ee8cc1Swenshuai.xi 
2942*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_HW_SEM_Unlock(eKLEng);
2943*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Unlock();
2944*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "DSCMB KL Fail = %08X \n",*u32Status);
2945*53ee8cc1Swenshuai.xi     DSCMB_ASSERT_AND_RETURN(FALSE);
2946*53ee8cc1Swenshuai.xi 
2947*53ee8cc1Swenshuai.xi     return FALSE;
2948*53ee8cc1Swenshuai.xi }
2949*53ee8cc1Swenshuai.xi 
2950*53ee8cc1Swenshuai.xi #if 0
2951*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
2952*53ee8cc1Swenshuai.xi /// An atomic Key ladder function for TCSA3 Key generation.
2953*53ee8cc1Swenshuai.xi /// Thread safe for cuncurrent usage.
2954*53ee8cc1Swenshuai.xi /// @param KLCfg\b IN: KL execution setting for target key generation
2955*53ee8cc1Swenshuai.xi /// @param ACPU_Out\b IN: A 16 bytes array pointer for Acpu key output.
2956*53ee8cc1Swenshuai.xi /// @param u32Status\b IN: Key ladder running status
2957*53ee8cc1Swenshuai.xi /// @return TRUE - Success
2958*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
2959*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
2960*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_KLadder_TCSA3(DSCMB_KLCfg_All* KLCfg , MS_U8 *pu8ActCode, MS_U32 u32CHSel,DSCMB_KL_Status* u32Status )
2961*53ee8cc1Swenshuai.xi {
2962*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
2963*53ee8cc1Swenshuai.xi 
2964*53ee8cc1Swenshuai.xi     MS_U32 i;
2965*53ee8cc1Swenshuai.xi     *u32Status = KL_STATUS_KEY_OK ;
2966*53ee8cc1Swenshuai.xi     DSCMB_KL_SelEng eKLEng = E_DSCMB_KL_SEL_CW;
2967*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0;
2968*53ee8cc1Swenshuai.xi     MS_U32 u32ErrMsg = 0;
2969*53ee8cc1Swenshuai.xi     MS_U32 u32Step2Level = KLCfg->u32Level-1;  /*level - 1*/
2970*53ee8cc1Swenshuai.xi     MS_BOOL bKDFBusy = TRUE;
2971*53ee8cc1Swenshuai.xi     DSCMB_Key_Type eKeyType = KLCfg->eKeyType & (~E_DSCMB_KEY_FSCB_ENABLE);
2972*53ee8cc1Swenshuai.xi     //MS_BOOL bEnableKeyFscb = ((KLCfg->eKeyType & E_DSCMB_KEY_FSCB_ENABLE) == E_DSCMB_KEY_FSCB_ENABLE);
2973*53ee8cc1Swenshuai.xi 
2974*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Lock();
2975*53ee8cc1Swenshuai.xi 
2976*53ee8cc1Swenshuai.xi     // TODO: This global cavid may not work, dscmb id has its own cavid, use it in the future.
2977*53ee8cc1Swenshuai.xi     if( E_HAL_DSCMB_CAVID4 != HAL_DSCMB_GetCAVid())
2978*53ee8cc1Swenshuai.xi     {
2979*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_KL_INPUT_NULL;
2980*53ee8cc1Swenshuai.xi         goto KL_Fail;
2981*53ee8cc1Swenshuai.xi     }
2982*53ee8cc1Swenshuai.xi 
2983*53ee8cc1Swenshuai.xi     if(FALSE == HAL_DSCMB_KL_KDF_Busy(E_DSCMB_KL_SEL_CW, &bKDFBusy))
2984*53ee8cc1Swenshuai.xi     {
2985*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_KL_INPUT_NULL;
2986*53ee8cc1Swenshuai.xi         goto KL_Fail;
2987*53ee8cc1Swenshuai.xi     }
2988*53ee8cc1Swenshuai.xi     else
2989*53ee8cc1Swenshuai.xi     {
2990*53ee8cc1Swenshuai.xi         if(bKDFBusy == TRUE)
2991*53ee8cc1Swenshuai.xi         {
2992*53ee8cc1Swenshuai.xi             *u32Status = KL_STATUS_KL_INPUT_NULL;
2993*53ee8cc1Swenshuai.xi             goto KL_Fail;
2994*53ee8cc1Swenshuai.xi         }
2995*53ee8cc1Swenshuai.xi     }
2996*53ee8cc1Swenshuai.xi 
2997*53ee8cc1Swenshuai.xi     //////////////////////////////////////////////////
2998*53ee8cc1Swenshuai.xi     ////////////Step 1, KL Output Clear CW to KT  ////////
2999*53ee8cc1Swenshuai.xi     //////////////////////////////////////////////////
3000*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_Reset(eKLEng);
3001*53ee8cc1Swenshuai.xi 
3002*53ee8cc1Swenshuai.xi     for( i = 0 ; i < KLCfg->u32Level ; i ++ )
3003*53ee8cc1Swenshuai.xi     {
3004*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_Input(eKLEng, (KLCfg->u32Level-i-1), KLCfg->pu8KeyKLIn+(16*i));
3005*53ee8cc1Swenshuai.xi     }
3006*53ee8cc1Swenshuai.xi 
3007*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_Ctrl(eKLEng, KLCfg->eAlgo,
3008*53ee8cc1Swenshuai.xi                       KLCfg->u32Level,
3009*53ee8cc1Swenshuai.xi                       KLCfg->eSrc,
3010*53ee8cc1Swenshuai.xi                       E_DSCMB_KL_DST_KT_ESA/*output to KT ESA*/);
3011*53ee8cc1Swenshuai.xi 
3012*53ee8cc1Swenshuai.xi     // Get Filter ID
3013*53ee8cc1Swenshuai.xi     if(FALSE == _DSCMB_Dscmb2Flt(KLCfg->u32DscID, &u32FltId))
3014*53ee8cc1Swenshuai.xi     {
3015*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_IVALID_DSCMB_ID;
3016*53ee8cc1Swenshuai.xi         goto KL_Fail;
3017*53ee8cc1Swenshuai.xi     }
3018*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Filter ID %u\n\033[m", u32FltId);
3019*53ee8cc1Swenshuai.xi 
3020*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_KeyBus(eKLEng,
3021*53ee8cc1Swenshuai.xi                         u32FltId,                            /*For Dst KT*/
3022*53ee8cc1Swenshuai.xi                         0,                                   /*For Dst KT*/ /*No use*/
3023*53ee8cc1Swenshuai.xi                         eKeyType,                            /*For Dst KT*/
3024*53ee8cc1Swenshuai.xi                         E_HAL_DSCMB_KL_DSTKT_ESA);           /*For Dst DMA*/
3025*53ee8cc1Swenshuai.xi 
3026*53ee8cc1Swenshuai.xi     //Enable the key slot
3027*53ee8cc1Swenshuai.xi     if (FALSE == HAL_DSCMB_KTE_Key_Ctrl(u32FltId,
3028*53ee8cc1Swenshuai.xi                                         eKeyType,
3029*53ee8cc1Swenshuai.xi                                         E_DSCMB_ENG_ESA,
3030*53ee8cc1Swenshuai.xi                                         KLCfg->u32CAVid,
3031*53ee8cc1Swenshuai.xi                                         TRUE))
3032*53ee8cc1Swenshuai.xi     {
3033*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_KL_INPUT_NULL;
3034*53ee8cc1Swenshuai.xi         goto KL_Fail;
3035*53ee8cc1Swenshuai.xi     }
3036*53ee8cc1Swenshuai.xi 
3037*53ee8cc1Swenshuai.xi     if(FALSE == HAL_DSCMB_KL_Start(eKLEng))
3038*53ee8cc1Swenshuai.xi     {
3039*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_ErrMsg(eKLEng, &u32ErrMsg);
3040*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "\033[31m KL error message 0x%X\n\033[m", (unsigned int)u32ErrMsg);
3041*53ee8cc1Swenshuai.xi     }
3042*53ee8cc1Swenshuai.xi 
3043*53ee8cc1Swenshuai.xi     //////////////////////////////////////////////////
3044*53ee8cc1Swenshuai.xi     ////////////Step 2, KL Output to CSSK////////////////
3045*53ee8cc1Swenshuai.xi     //////////////////////////////////////////////////
3046*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_Reset(eKLEng);
3047*53ee8cc1Swenshuai.xi 
3048*53ee8cc1Swenshuai.xi     // Set KL Level input    /*level - 1*/
3049*53ee8cc1Swenshuai.xi     for( i = 0 ; i < (u32Step2Level) ; i ++ )
3050*53ee8cc1Swenshuai.xi     {
3051*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_Input(eKLEng, (u32Step2Level-i-1), KLCfg->pu8KeyKLIn+(16*i));
3052*53ee8cc1Swenshuai.xi     }
3053*53ee8cc1Swenshuai.xi 
3054*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_KeyBus(eKLEng,
3055*53ee8cc1Swenshuai.xi                         0,                              /*For Dst KT*/
3056*53ee8cc1Swenshuai.xi                         0,                              /*For Dst KT*/ /*No use*/
3057*53ee8cc1Swenshuai.xi                         0,                              /*For Dst KT*/
3058*53ee8cc1Swenshuai.xi                         E_DSCMB_KL_DST_DMA_CSSK);    /*For Dst DMA*/
3059*53ee8cc1Swenshuai.xi 
3060*53ee8cc1Swenshuai.xi     // Set KL Ctrl
3061*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_Ctrl(eKLEng, KLCfg->eAlgo,
3062*53ee8cc1Swenshuai.xi                       u32Step2Level, /*level - 1*/
3063*53ee8cc1Swenshuai.xi                       KLCfg->eSrc,
3064*53ee8cc1Swenshuai.xi                       E_DSCMB_KL_DST_DMA_CSSK /*FIXME to CSSK*/);
3065*53ee8cc1Swenshuai.xi 
3066*53ee8cc1Swenshuai.xi 
3067*53ee8cc1Swenshuai.xi     if(FALSE == HAL_DSCMB_KL_Start(eKLEng))
3068*53ee8cc1Swenshuai.xi     {
3069*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_ErrMsg(eKLEng, &u32ErrMsg);
3070*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "\033[31m KL error message 0x%X\n\033[m", (unsigned int)u32ErrMsg);
3071*53ee8cc1Swenshuai.xi     }
3072*53ee8cc1Swenshuai.xi 
3073*53ee8cc1Swenshuai.xi     //////////////////////////////////////////////////
3074*53ee8cc1Swenshuai.xi     ////////////Step 3, KL Output IV & RK to CSA3 ////////
3075*53ee8cc1Swenshuai.xi     //////////////////////////////////////////////////
3076*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_TCSA3_ActCode(pu8ActCode,16);
3077*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_TCSA3_CHSel(u32CHSel);
3078*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_TCSA3_Start();
3079*53ee8cc1Swenshuai.xi 
3080*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_ErrMsg(eKLEng, &u32ErrMsg);
3081*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "\033[31m KL error message 0x%X\n\033[m", (unsigned int)u32ErrMsg);
3082*53ee8cc1Swenshuai.xi 
3083*53ee8cc1Swenshuai.xi     if(FALSE == HAL_DSCMB_Cipher_TCSA3(u32CHSel,TRUE))
3084*53ee8cc1Swenshuai.xi     {
3085*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_IVALID_DSCMB_ID;
3086*53ee8cc1Swenshuai.xi         goto KL_Fail;
3087*53ee8cc1Swenshuai.xi     }
3088*53ee8cc1Swenshuai.xi 
3089*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Unlock();
3090*53ee8cc1Swenshuai.xi     return TRUE;
3091*53ee8cc1Swenshuai.xi 
3092*53ee8cc1Swenshuai.xi KL_Fail:
3093*53ee8cc1Swenshuai.xi 
3094*53ee8cc1Swenshuai.xi 
3095*53ee8cc1Swenshuai.xi #if 0
3096*53ee8cc1Swenshuai.xi 
3097*53ee8cc1Swenshuai.xi     i = HAL_DSCMB_KLadder_Status();
3098*53ee8cc1Swenshuai.xi     if ( i != 0 )
3099*53ee8cc1Swenshuai.xi     {
3100*53ee8cc1Swenshuai.xi         //printf("KL Satus = %x \n",i );
3101*53ee8cc1Swenshuai.xi         *u32Status |= i ;
3102*53ee8cc1Swenshuai.xi     }
3103*53ee8cc1Swenshuai.xi 
3104*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Stop();
3105*53ee8cc1Swenshuai.xi #endif
3106*53ee8cc1Swenshuai.xi 
3107*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Unlock();
3108*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "DSCMB KL Fail = %08X \n",*u32Status);
3109*53ee8cc1Swenshuai.xi     DSCMB_ASSERT_AND_RETURN(FALSE);
3110*53ee8cc1Swenshuai.xi     return FALSE;
3111*53ee8cc1Swenshuai.xi 
3112*53ee8cc1Swenshuai.xi }
3113*53ee8cc1Swenshuai.xi #endif
3114*53ee8cc1Swenshuai.xi 
3115*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
3116*53ee8cc1Swenshuai.xi /// An ETSI Key ladder function for Key generation, including common KL use cases.
3117*53ee8cc1Swenshuai.xi /// Thread safe for cuncurrent usage.
3118*53ee8cc1Swenshuai.xi /// @param KLCfg\b IN: KL execution setting for target key generation
3119*53ee8cc1Swenshuai.xi /// @param ACPU_Out\b IN: A 16 bytes array pointer for Acpu key output.
3120*53ee8cc1Swenshuai.xi /// @param pu8Nonce\b IN: A 16 bytes array pointer for Nonce input
3121*53ee8cc1Swenshuai.xi /// @param pu8Response\n OUT: A 16 byte array pointer for Response output
3122*53ee8cc1Swenshuai.xi /// @param u32Status\b IN: Key ladder running status
3123*53ee8cc1Swenshuai.xi /// @return TRUE - Success
3124*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
3125*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
_MDrv_DSCMB2_KLadder_ETSI(DSCMB_KLCfg_All * KLCfg,MS_U8 * ACPU_Out,MS_U8 * pu8Nonce,MS_U8 * pu8Response,DSCMB_KL_Status * u32Status)3126*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_KLadder_ETSI(DSCMB_KLCfg_All* KLCfg , MS_U8 *ACPU_Out, MS_U8 *pu8Nonce, MS_U8 *pu8Response, DSCMB_KL_Status* u32Status )
3127*53ee8cc1Swenshuai.xi {
3128*53ee8cc1Swenshuai.xi     KL_INIT_CHECK(FALSE);
3129*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(KLCfg != NULL, "KLCfg input error", FALSE);
3130*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u32Status != NULL, "u32Status input error", FALSE);
3131*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(pu8Nonce != NULL, "pu8Nonce input error", FALSE);
3132*53ee8cc1Swenshuai.xi 
3133*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
3134*53ee8cc1Swenshuai.xi     MS_U32 u32ErrMsg = 0;
3135*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0;
3136*53ee8cc1Swenshuai.xi     MS_U32 u32Field = 0;
3137*53ee8cc1Swenshuai.xi     MS_U32 u32CAVid = KLCfg->u32CAVid;
3138*53ee8cc1Swenshuai.xi 
3139*53ee8cc1Swenshuai.xi     DSCMB_KL_SelEng eKLEng = KLCfg->eKLSel;
3140*53ee8cc1Swenshuai.xi     DSCMB_KLDst eKLDst = KLCfg->eDst & (~E_DSCMB_KL_DST_KT_PIDSLOTMAP_ENABLE);
3141*53ee8cc1Swenshuai.xi     DSCMB_KLSrc eKLSrc = KLCfg->eSrc & (~E_DSCMB_KL_SRC_KDF_ENABLE);
3142*53ee8cc1Swenshuai.xi     MS_BOOL bEnableKDF = ((KLCfg->eSrc & E_DSCMB_KL_SRC_KDF_ENABLE) == E_DSCMB_KL_SRC_KDF_ENABLE);
3143*53ee8cc1Swenshuai.xi     MS_BOOL bEnablePidslotmap = ((KLCfg->eDst & E_DSCMB_KL_DST_KT_PIDSLOTMAP_ENABLE) == E_DSCMB_KL_DST_KT_PIDSLOTMAP_ENABLE);
3144*53ee8cc1Swenshuai.xi     DSCMB_Key_Type eKeyType = KLCfg->eKeyType & (~E_DSCMB_KEY_FSCB_ENABLE);
3145*53ee8cc1Swenshuai.xi #ifdef ENABLE_KEY_FSCB
3146*53ee8cc1Swenshuai.xi     MS_BOOL bEnableKeyFscb = ((KLCfg->eKeyType & E_DSCMB_KEY_FSCB_ENABLE) == E_DSCMB_KEY_FSCB_ENABLE);
3147*53ee8cc1Swenshuai.xi #endif
3148*53ee8cc1Swenshuai.xi     MS_BOOL bKLDstSecure = ((KLCfg->eKeyType & E_DSCMB_KEY_SECURE_KEYS_ENABLE) == E_DSCMB_KEY_SECURE_KEYS_ENABLE);
3149*53ee8cc1Swenshuai.xi 
3150*53ee8cc1Swenshuai.xi     if(_MDrv_DSCMB2_KLadder_Init () == FALSE)
3151*53ee8cc1Swenshuai.xi     {
3152*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Keyladder Init Fail\n");
3153*53ee8cc1Swenshuai.xi         return FALSE;
3154*53ee8cc1Swenshuai.xi     }
3155*53ee8cc1Swenshuai.xi 
3156*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Lock();
3157*53ee8cc1Swenshuai.xi     if ( FALSE == HAL_DSCMB_KL_HW_SEM_Lock(eKLEng, DSCMB_KL_WAIT_THRESHOLD)) //TODO: fix constant value
3158*53ee8cc1Swenshuai.xi     {
3159*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_WAIT_KL_READY_TIMEOUT;
3160*53ee8cc1Swenshuai.xi         goto KL_Fail;
3161*53ee8cc1Swenshuai.xi     }
3162*53ee8cc1Swenshuai.xi 
3163*53ee8cc1Swenshuai.xi     *u32Status = KL_STATUS_KEY_OK ;
3164*53ee8cc1Swenshuai.xi 
3165*53ee8cc1Swenshuai.xi     ///translate cavid to Default CAVID if user set input cavid to 0x0
3166*53ee8cc1Swenshuai.xi     if(u32CAVid == 0)
3167*53ee8cc1Swenshuai.xi     {
3168*53ee8cc1Swenshuai.xi         u32CAVid = DEFAULT_CAVID;
3169*53ee8cc1Swenshuai.xi     }
3170*53ee8cc1Swenshuai.xi 
3171*53ee8cc1Swenshuai.xi     /////////////// Check Source and acpu data ////////////////////
3172*53ee8cc1Swenshuai.xi     if ((E_DSCMB_KL_SRC_ACPU == eKLSrc) && (NULL == KLCfg->u8KeyACPU))
3173*53ee8cc1Swenshuai.xi     {
3174*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_ACPU_KEY_NULL;
3175*53ee8cc1Swenshuai.xi         goto KL_Fail;
3176*53ee8cc1Swenshuai.xi     }
3177*53ee8cc1Swenshuai.xi 
3178*53ee8cc1Swenshuai.xi     /////////////// Check KL level ////////////////////
3179*53ee8cc1Swenshuai.xi     if(KLCfg->u32Level != 3) //ETSI keyladder, must be 3 level!
3180*53ee8cc1Swenshuai.xi     {
3181*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_INVALID_INPUT_LEVEL;
3182*53ee8cc1Swenshuai.xi         goto KL_Fail;
3183*53ee8cc1Swenshuai.xi     }
3184*53ee8cc1Swenshuai.xi 
3185*53ee8cc1Swenshuai.xi     ////////////// check Key destination ///////////////
3186*53ee8cc1Swenshuai.xi     /// Compatible and translate old version to new version
3187*53ee8cc1Swenshuai.xi     if( ((eKLDst & 0xF0) == 0) && ( (eKLDst & 0x0F) > 0 )) //OLD Destination
3188*53ee8cc1Swenshuai.xi     {
3189*53ee8cc1Swenshuai.xi         switch(eKLDst)
3190*53ee8cc1Swenshuai.xi         {
3191*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_ACPU:
3192*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_CPU_ACPU;
3193*53ee8cc1Swenshuai.xi                 break;
3194*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_KT_NSA:
3195*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_KT_ESA;
3196*53ee8cc1Swenshuai.xi                 break;
3197*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_DMA_AES:
3198*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_DMA_SK0;
3199*53ee8cc1Swenshuai.xi                 break;
3200*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_DMA_TDES:
3201*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_DMA_SK0;
3202*53ee8cc1Swenshuai.xi                 break;
3203*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_PRIVATE0:
3204*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_PRIVATE_0;
3205*53ee8cc1Swenshuai.xi                 break;
3206*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_PRIVATE1:
3207*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_PRIVATE_1;
3208*53ee8cc1Swenshuai.xi                 break;
3209*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_PRIVATE2:
3210*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_PRIVATE_2;
3211*53ee8cc1Swenshuai.xi                 break;
3212*53ee8cc1Swenshuai.xi             default:
3213*53ee8cc1Swenshuai.xi                 ;
3214*53ee8cc1Swenshuai.xi         }
3215*53ee8cc1Swenshuai.xi     }
3216*53ee8cc1Swenshuai.xi 
3217*53ee8cc1Swenshuai.xi     // If destination is key table, and use dscmbId to get pidslotmap entry,
3218*53ee8cc1Swenshuai.xi     // need to check descrambler driver init
3219*53ee8cc1Swenshuai.xi     if (DSCMB_KL_DST_CLASS_KT & eKLDst)
3220*53ee8cc1Swenshuai.xi     {
3221*53ee8cc1Swenshuai.xi         if(bEnablePidslotmap == FALSE)
3222*53ee8cc1Swenshuai.xi         {
3223*53ee8cc1Swenshuai.xi             DSCMB_INIT_CHECK(FALSE);
3224*53ee8cc1Swenshuai.xi         }
3225*53ee8cc1Swenshuai.xi     }
3226*53ee8cc1Swenshuai.xi 
3227*53ee8cc1Swenshuai.xi     if (E_DSCMB_KL_DST_CPU_ACPU == eKLDst)
3228*53ee8cc1Swenshuai.xi     {
3229*53ee8cc1Swenshuai.xi         //KL to ACPU
3230*53ee8cc1Swenshuai.xi         if(NULL == ACPU_Out)
3231*53ee8cc1Swenshuai.xi         {
3232*53ee8cc1Swenshuai.xi             *u32Status = KL_STATUS_ACPU_OUTKEY_NULL;
3233*53ee8cc1Swenshuai.xi             goto KL_Fail;
3234*53ee8cc1Swenshuai.xi         }
3235*53ee8cc1Swenshuai.xi     }
3236*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_KT & eKLDst)
3237*53ee8cc1Swenshuai.xi     {
3238*53ee8cc1Swenshuai.xi         //KL to KT
3239*53ee8cc1Swenshuai.xi         if(bEnablePidslotmap)
3240*53ee8cc1Swenshuai.xi         {
3241*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Keyladder destination KT class\n");
3242*53ee8cc1Swenshuai.xi             u32FltId = KLCfg->u32DscID;
3243*53ee8cc1Swenshuai.xi         }
3244*53ee8cc1Swenshuai.xi         else
3245*53ee8cc1Swenshuai.xi         {
3246*53ee8cc1Swenshuai.xi             if ( FALSE == DscmbTspMap[KLCfg->u32EngID][KLCfg->u32DscID].bUsed )
3247*53ee8cc1Swenshuai.xi             {
3248*53ee8cc1Swenshuai.xi                     //The keyslot is not allocated for the DSCMB ID
3249*53ee8cc1Swenshuai.xi                 *u32Status = KL_STATUS_IVALID_DSCMB_ID;
3250*53ee8cc1Swenshuai.xi                 goto KL_Fail;
3251*53ee8cc1Swenshuai.xi             }
3252*53ee8cc1Swenshuai.xi             if( 0 == DscmbTspMap[KLCfg->u32EngID][KLCfg->u32DscID].u32PidFltIdNum )
3253*53ee8cc1Swenshuai.xi             {
3254*53ee8cc1Swenshuai.xi                     //No pid filter is connected to the DSCMB ID
3255*53ee8cc1Swenshuai.xi                 *u32Status = KL_STATUS_IVALID_DSCMB_ID;
3256*53ee8cc1Swenshuai.xi                 goto KL_Fail;
3257*53ee8cc1Swenshuai.xi             }
3258*53ee8cc1Swenshuai.xi 
3259*53ee8cc1Swenshuai.xi             // Get Filter ID
3260*53ee8cc1Swenshuai.xi             if(FALSE == _DSCMB_Dscmb2Flt(KLCfg->u32DscID, &u32FltId))
3261*53ee8cc1Swenshuai.xi             {
3262*53ee8cc1Swenshuai.xi                 *u32Status = KL_STATUS_IVALID_DSCMB_ID;
3263*53ee8cc1Swenshuai.xi                 goto KL_Fail;
3264*53ee8cc1Swenshuai.xi             }
3265*53ee8cc1Swenshuai.xi 
3266*53ee8cc1Swenshuai.xi         }
3267*53ee8cc1Swenshuai.xi         // Get Field
3268*53ee8cc1Swenshuai.xi 
3269*53ee8cc1Swenshuai.xi     }
3270*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_DMA & eKLDst)
3271*53ee8cc1Swenshuai.xi     {
3272*53ee8cc1Swenshuai.xi         //KL to DMA
3273*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Keyladder destination DMA class\n");
3274*53ee8cc1Swenshuai.xi     }
3275*53ee8cc1Swenshuai.xi     else if(DSCMB_KL_DST_CLASS_PVT &eKLDst)
3276*53ee8cc1Swenshuai.xi     {
3277*53ee8cc1Swenshuai.xi         //KL to PVT
3278*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Keyladder destination Private Key class\n");
3279*53ee8cc1Swenshuai.xi     }
3280*53ee8cc1Swenshuai.xi     else if(DSCMB_KL_DST_CLASS_TSIO & eKLDst)
3281*53ee8cc1Swenshuai.xi     {
3282*53ee8cc1Swenshuai.xi         //KL to TSIO
3283*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Keyladder destination TSIO\n");
3284*53ee8cc1Swenshuai.xi         u32FltId = KLCfg->u32DscID; //TSIO service id
3285*53ee8cc1Swenshuai.xi     }
3286*53ee8cc1Swenshuai.xi     else if(DSCMB_KL_DST_CLASS_CFB& eKLDst)
3287*53ee8cc1Swenshuai.xi     {
3288*53ee8cc1Swenshuai.xi         //KL to CFB
3289*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Keyladder destination CFB\n");
3290*53ee8cc1Swenshuai.xi     }
3291*53ee8cc1Swenshuai.xi     else
3292*53ee8cc1Swenshuai.xi     {
3293*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Unknown Keyladder destination\n");
3294*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_KL_INPUT_NULL;
3295*53ee8cc1Swenshuai.xi         goto KL_Fail;
3296*53ee8cc1Swenshuai.xi     }
3297*53ee8cc1Swenshuai.xi 
3298*53ee8cc1Swenshuai.xi     //Check KeyLadder Input
3299*53ee8cc1Swenshuai.xi     if ((KLCfg->u32Level != 0) && (NULL == KLCfg->pu8KeyKLIn))
3300*53ee8cc1Swenshuai.xi     {
3301*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_KL_INPUT_NULL;
3302*53ee8cc1Swenshuai.xi         goto KL_Fail;
3303*53ee8cc1Swenshuai.xi     }
3304*53ee8cc1Swenshuai.xi 
3305*53ee8cc1Swenshuai.xi     // TODO: Here need to check key property if support KDF or not
3306*53ee8cc1Swenshuai.xi 
3307*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_Reset(eKLEng);
3308*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_KDF_Disable(eKLEng);
3309*53ee8cc1Swenshuai.xi 
3310*53ee8cc1Swenshuai.xi 
3311*53ee8cc1Swenshuai.xi     if(E_DSCMB_KL_SRC_ACPU == eKLSrc)
3312*53ee8cc1Swenshuai.xi     {
3313*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_ACPURootKey(eKLEng, KLCfg->u8KeyACPU);
3314*53ee8cc1Swenshuai.xi     }
3315*53ee8cc1Swenshuai.xi 
3316*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_INFO, "u32CAVid=%X\n", u32CAVid);
3317*53ee8cc1Swenshuai.xi     //FIXME: If Key from OTP, should we set usage & entropy ?
3318*53ee8cc1Swenshuai.xi     if(DSCMB_KL_DST_CLASS_TSIO & eKLDst)
3319*53ee8cc1Swenshuai.xi     {
3320*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyProp( eKLEng, u32CAVid, 0 , /*Usage*/ 1 /*Entropy*/);
3321*53ee8cc1Swenshuai.xi     }
3322*53ee8cc1Swenshuai.xi     else
3323*53ee8cc1Swenshuai.xi     {
3324*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyProp( eKLEng, u32CAVid, 0 , /*Usage*/ 0 /*Entropy*/);
3325*53ee8cc1Swenshuai.xi     }
3326*53ee8cc1Swenshuai.xi 
3327*53ee8cc1Swenshuai.xi     //Enable KDF
3328*53ee8cc1Swenshuai.xi     if(bEnableKDF)
3329*53ee8cc1Swenshuai.xi     {
3330*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KDF_Enable( eKLEng, KLCfg->stKDF.eKDFType, KLCfg->stKDF.u16AppId, KLCfg->stKDF.eHWKeyId);
3331*53ee8cc1Swenshuai.xi     }
3332*53ee8cc1Swenshuai.xi 
3333*53ee8cc1Swenshuai.xi     // Set KL Level input //
3334*53ee8cc1Swenshuai.xi     for( i = 0 ; i < KLCfg->u32Level ; i ++ )
3335*53ee8cc1Swenshuai.xi     {
3336*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_Input(eKLEng, (KLCfg->u32Level-i-1), KLCfg->pu8KeyKLIn+(16*i));
3337*53ee8cc1Swenshuai.xi     }
3338*53ee8cc1Swenshuai.xi 
3339*53ee8cc1Swenshuai.xi 
3340*53ee8cc1Swenshuai.xi     //Set ETSI KL Nonce input
3341*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_ETSI_Nonce(eKLEng, pu8Nonce);
3342*53ee8cc1Swenshuai.xi 
3343*53ee8cc1Swenshuai.xi     // Set KL Ctrl
3344*53ee8cc1Swenshuai.xi     if(FALSE == HAL_DSCMB_KL_Ctrl(eKLEng, KLCfg->eAlgo, KLCfg->u32Level, eKLSrc, eKLDst))
3345*53ee8cc1Swenshuai.xi     {
3346*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Invalid Keyladder control setting\n");
3347*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_INVALID_INPUT_LEVEL;
3348*53ee8cc1Swenshuai.xi         goto KL_Fail;
3349*53ee8cc1Swenshuai.xi 
3350*53ee8cc1Swenshuai.xi     }
3351*53ee8cc1Swenshuai.xi 
3352*53ee8cc1Swenshuai.xi     //KL to secure key slot
3353*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_DstSecure(eKLEng, bKLDstSecure);
3354*53ee8cc1Swenshuai.xi 
3355*53ee8cc1Swenshuai.xi     if (DSCMB_KL_DST_CLASS_CPU & eKLDst)
3356*53ee8cc1Swenshuai.xi     {
3357*53ee8cc1Swenshuai.xi         // KL flow for ACPU output //
3358*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
3359*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
3360*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
3361*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
3362*53ee8cc1Swenshuai.xi                             0);     /*For Dst DMA*/
3363*53ee8cc1Swenshuai.xi     }
3364*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_DMA & eKLDst)
3365*53ee8cc1Swenshuai.xi     {
3366*53ee8cc1Swenshuai.xi         // KL flow for output  to CryptoDMA  //
3367*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
3368*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
3369*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
3370*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
3371*53ee8cc1Swenshuai.xi                             eKLDst);          /*For Dst DMA*/
3372*53ee8cc1Swenshuai.xi     }
3373*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_KT & eKLDst)
3374*53ee8cc1Swenshuai.xi     {
3375*53ee8cc1Swenshuai.xi #ifdef ENABLE_KEY_FSCB
3376*53ee8cc1Swenshuai.xi         if(bEnableKeyFscb){
3377*53ee8cc1Swenshuai.xi             // KL flow for output  to KTE (with KeyFSCB) //
3378*53ee8cc1Swenshuai.xi             HAL_DSCMB_KL_KeyBus_Ex(eKLEng,
3379*53ee8cc1Swenshuai.xi                                   u32FltId,               /*For Dst KT*/
3380*53ee8cc1Swenshuai.xi                                   u32Field,               /*For Dst KT*/
3381*53ee8cc1Swenshuai.xi                                   eKeyType,               /*For Dst KT*/
3382*53ee8cc1Swenshuai.xi                                   eKLDst,                 /*For Dst KT*/
3383*53ee8cc1Swenshuai.xi                                   KLCfg->eFSCB);          /*For Dst KT*/
3384*53ee8cc1Swenshuai.xi         }
3385*53ee8cc1Swenshuai.xi         else{
3386*53ee8cc1Swenshuai.xi #endif
3387*53ee8cc1Swenshuai.xi         // KL flow for output  to KTE //
3388*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
3389*53ee8cc1Swenshuai.xi                             u32FltId,               /*For Dst KT*/
3390*53ee8cc1Swenshuai.xi                             u32Field,               /*For Dst KT*/
3391*53ee8cc1Swenshuai.xi                             eKeyType,               /*For Dst KT*/
3392*53ee8cc1Swenshuai.xi                             eKLDst);                 /*For Dst KT*/
3393*53ee8cc1Swenshuai.xi #ifdef ENABLE_KEY_FSCB
3394*53ee8cc1Swenshuai.xi         }
3395*53ee8cc1Swenshuai.xi #endif
3396*53ee8cc1Swenshuai.xi     }
3397*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_PVT & eKLDst)
3398*53ee8cc1Swenshuai.xi     {
3399*53ee8cc1Swenshuai.xi         // KL flow for output  to PVT //
3400*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
3401*53ee8cc1Swenshuai.xi                             0,               /*For Dst KT*/
3402*53ee8cc1Swenshuai.xi                             0,               /*For Dst KT*/
3403*53ee8cc1Swenshuai.xi                             0,               /*For Dst KT*/
3404*53ee8cc1Swenshuai.xi                             0);              /*For Dst DMA*/
3405*53ee8cc1Swenshuai.xi     }
3406*53ee8cc1Swenshuai.xi     else if(DSCMB_KL_DST_CLASS_TSIO & eKLDst)
3407*53ee8cc1Swenshuai.xi     {
3408*53ee8cc1Swenshuai.xi         // KL flow for output  to TSIO //
3409*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
3410*53ee8cc1Swenshuai.xi                             u32FltId,               /*For Dst TSIO*/
3411*53ee8cc1Swenshuai.xi                             0,                      /*For Dst TSIO*/
3412*53ee8cc1Swenshuai.xi                             KLCfg->eKeyType,        /*For Dst TSIO*/
3413*53ee8cc1Swenshuai.xi                             eKLDst);                /*For Dst TSIO*/
3414*53ee8cc1Swenshuai.xi     }
3415*53ee8cc1Swenshuai.xi     else if(DSCMB_KL_DST_CLASS_CFB& eKLDst)
3416*53ee8cc1Swenshuai.xi     {
3417*53ee8cc1Swenshuai.xi         // KL flow for output  to CFB  //
3418*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
3419*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
3420*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
3421*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
3422*53ee8cc1Swenshuai.xi                             eKLDst);          /*For Dst CFB*/
3423*53ee8cc1Swenshuai.xi     }
3424*53ee8cc1Swenshuai.xi 
3425*53ee8cc1Swenshuai.xi     if(HAL_DSCMB_KL_Start(eKLEng) == FALSE)
3426*53ee8cc1Swenshuai.xi     {
3427*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_ErrMsg(eKLEng, &u32ErrMsg);
3428*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "\033[31m KL error message 0x%X\n\033[m", (unsigned int)u32ErrMsg);
3429*53ee8cc1Swenshuai.xi         goto KL_Fail;
3430*53ee8cc1Swenshuai.xi     }
3431*53ee8cc1Swenshuai.xi 
3432*53ee8cc1Swenshuai.xi     if ((DSCMB_KL_DST_CLASS_SPSSPD & eKLDst) == DSCMB_KL_DST_CLASS_SPSSPD)
3433*53ee8cc1Swenshuai.xi     {
3434*53ee8cc1Swenshuai.xi         // KL flow for output  to CryptoDMA  //
3435*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_SP_KeyCtrl(eKLEng, eKLDst);
3436*53ee8cc1Swenshuai.xi         if(HAL_DSCMB_KL_SP_Start(eKLEng) == FALSE)
3437*53ee8cc1Swenshuai.xi         {
3438*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "\033[31m KL to SPS SPD Fail\n\033[m");
3439*53ee8cc1Swenshuai.xi             goto KL_Fail;
3440*53ee8cc1Swenshuai.xi         }
3441*53ee8cc1Swenshuai.xi     }
3442*53ee8cc1Swenshuai.xi 
3443*53ee8cc1Swenshuai.xi     // enable key
3444*53ee8cc1Swenshuai.xi     if (DSCMB_KL_DST_CLASS_KT & eKLDst)
3445*53ee8cc1Swenshuai.xi     {
3446*53ee8cc1Swenshuai.xi         DSCMB_Eng_Type eEngType = E_DSCMB_ENG_ESA;
3447*53ee8cc1Swenshuai.xi         if(eKLDst == E_DSCMB_KL_DST_KT_ESA )
3448*53ee8cc1Swenshuai.xi         {
3449*53ee8cc1Swenshuai.xi             eEngType = E_DSCMB_ENG_ESA;
3450*53ee8cc1Swenshuai.xi         }
3451*53ee8cc1Swenshuai.xi         else if(eKLDst == E_DSCMB_KL_DST_KT_LSAS )
3452*53ee8cc1Swenshuai.xi         {
3453*53ee8cc1Swenshuai.xi             eEngType = E_DSCMB_ENG_LSAS;
3454*53ee8cc1Swenshuai.xi         }
3455*53ee8cc1Swenshuai.xi         else if(eKLDst == E_DSCMB_KL_DST_KT_LSAD )
3456*53ee8cc1Swenshuai.xi         {
3457*53ee8cc1Swenshuai.xi             eEngType = E_DSCMB_ENG_LSAD;
3458*53ee8cc1Swenshuai.xi         }
3459*53ee8cc1Swenshuai.xi 
3460*53ee8cc1Swenshuai.xi         if (FALSE == HAL_DSCMB_KTE_Key_Ctrl_Ex(u32FltId,
3461*53ee8cc1Swenshuai.xi                                             eKeyType,
3462*53ee8cc1Swenshuai.xi                                             eEngType,
3463*53ee8cc1Swenshuai.xi                                             u32CAVid,
3464*53ee8cc1Swenshuai.xi                                             TRUE,
3465*53ee8cc1Swenshuai.xi                                             TRUE))
3466*53ee8cc1Swenshuai.xi         {
3467*53ee8cc1Swenshuai.xi             *u32Status = KL_STATUS_KL_INPUT_NULL;
3468*53ee8cc1Swenshuai.xi             goto KL_Fail;
3469*53ee8cc1Swenshuai.xi         }
3470*53ee8cc1Swenshuai.xi     }
3471*53ee8cc1Swenshuai.xi 
3472*53ee8cc1Swenshuai.xi     //Output to ACPU
3473*53ee8cc1Swenshuai.xi     if (E_DSCMB_KL_DST_CPU_ACPU == eKLDst)
3474*53ee8cc1Swenshuai.xi     {
3475*53ee8cc1Swenshuai.xi         MS_U32 u32OutKeySize = 0;
3476*53ee8cc1Swenshuai.xi         if(KLCfg->eOutsize == E_DSCMB_KL_64_BITS)
3477*53ee8cc1Swenshuai.xi         {
3478*53ee8cc1Swenshuai.xi             u32OutKeySize = 8;
3479*53ee8cc1Swenshuai.xi         }
3480*53ee8cc1Swenshuai.xi         else if(KLCfg->eOutsize == E_DSCMB_KL_128_BITS)
3481*53ee8cc1Swenshuai.xi         {
3482*53ee8cc1Swenshuai.xi             u32OutKeySize = 16;
3483*53ee8cc1Swenshuai.xi         }
3484*53ee8cc1Swenshuai.xi         memset(ACPU_Out , 0x0 , u32OutKeySize );
3485*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_GetACPUOut(eKLEng,ACPU_Out,u32OutKeySize);
3486*53ee8cc1Swenshuai.xi     }
3487*53ee8cc1Swenshuai.xi 
3488*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_ETSI_Response(eKLEng, pu8Response);
3489*53ee8cc1Swenshuai.xi 
3490*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_HW_SEM_Unlock(eKLEng);
3491*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Unlock();
3492*53ee8cc1Swenshuai.xi     return TRUE;
3493*53ee8cc1Swenshuai.xi 
3494*53ee8cc1Swenshuai.xi KL_Fail:
3495*53ee8cc1Swenshuai.xi 
3496*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_HW_SEM_Unlock(eKLEng);
3497*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Unlock();
3498*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "DSCMB KL Fail = %08X \n",*u32Status);
3499*53ee8cc1Swenshuai.xi     DSCMB_ASSERT_AND_RETURN(FALSE);
3500*53ee8cc1Swenshuai.xi 
3501*53ee8cc1Swenshuai.xi     return FALSE;
3502*53ee8cc1Swenshuai.xi }
3503*53ee8cc1Swenshuai.xi 
3504*53ee8cc1Swenshuai.xi #if 0
3505*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_BOOL MDrv_DSCMB_KLadder_TCSA3_TA(DSCMB_KLCfg_All* KLCfg , MS_U8 *pu8ActCode, MS_U32 u32CHSel, MS_U8 *
3506*53ee8cc1Swenshuai.xi         pu8EncCW, DSCMB_KL_TA_LUT3* LUT3Tab, DSCMB_KL_Status* u32Status)
3507*53ee8cc1Swenshuai.xi {
3508*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
3509*53ee8cc1Swenshuai.xi     *u32Status = KL_STATUS_KEY_OK ;
3510*53ee8cc1Swenshuai.xi     DSCMB_KL_SelEng eKLEng = E_DSCMB_KL_SEL_CW;
3511*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0;
3512*53ee8cc1Swenshuai.xi     MS_U32 u32ErrMsg = 0;
3513*53ee8cc1Swenshuai.xi     MS_U32 u32Step2Level = KLCfg->u32Level-1;  /*level - 1*/
3514*53ee8cc1Swenshuai.xi     MS_BOOL bKDFBusy = TRUE;
3515*53ee8cc1Swenshuai.xi 
3516*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Lock();
3517*53ee8cc1Swenshuai.xi 
3518*53ee8cc1Swenshuai.xi     if( DRV_DSCMB_CAVID_IRD != HAL_DSCMB_GetCavid())
3519*53ee8cc1Swenshuai.xi     {
3520*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_KL_INPUT_NULL;
3521*53ee8cc1Swenshuai.xi         goto KL_Fail;
3522*53ee8cc1Swenshuai.xi     }
3523*53ee8cc1Swenshuai.xi 
3524*53ee8cc1Swenshuai.xi     if(FALSE == HAL_DSCMB_KL_KDF_Busy(E_DSCMB_KL_SEL_CW, &bKDFBusy))
3525*53ee8cc1Swenshuai.xi     {
3526*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_KL_INPUT_NULL;
3527*53ee8cc1Swenshuai.xi         goto KL_Fail;
3528*53ee8cc1Swenshuai.xi     }
3529*53ee8cc1Swenshuai.xi     else
3530*53ee8cc1Swenshuai.xi     {
3531*53ee8cc1Swenshuai.xi         if(bKDFBusy == TRUE)
3532*53ee8cc1Swenshuai.xi         {
3533*53ee8cc1Swenshuai.xi             *u32Status = KL_STATUS_KL_INPUT_NULL;
3534*53ee8cc1Swenshuai.xi             goto KL_Fail;
3535*53ee8cc1Swenshuai.xi         }
3536*53ee8cc1Swenshuai.xi     }
3537*53ee8cc1Swenshuai.xi 
3538*53ee8cc1Swenshuai.xi     //////////////////////////////////////////////////
3539*53ee8cc1Swenshuai.xi     ////////////Step 1, KL Output Clear CW to KT  ////////
3540*53ee8cc1Swenshuai.xi     //////////////////////////////////////////////////
3541*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_Reset(eKLEng);
3542*53ee8cc1Swenshuai.xi 
3543*53ee8cc1Swenshuai.xi     for( i = 0 ; i < KLCfg->u32Level ; i ++ )
3544*53ee8cc1Swenshuai.xi     {
3545*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_Input(eKLEng, (KLCfg->u32Level-i-1), KLCfg->pu8KeyKLIn+(16*i));
3546*53ee8cc1Swenshuai.xi     }
3547*53ee8cc1Swenshuai.xi 
3548*53ee8cc1Swenshuai.xi     //Unlock LUT3 table
3549*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_TA_EN(eKLEng, FALSE);
3550*53ee8cc1Swenshuai.xi 
3551*53ee8cc1Swenshuai.xi     //Set Transformed Algorithm EncCW
3552*53ee8cc1Swenshuai.xi     if(FALSE == HAL_DSCMB_KL_TA_EncCW(eKLEng, pu8EncCW))
3553*53ee8cc1Swenshuai.xi     {
3554*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_KL_INPUT_NULL;
3555*53ee8cc1Swenshuai.xi         goto KL_Fail;
3556*53ee8cc1Swenshuai.xi     }
3557*53ee8cc1Swenshuai.xi     //////////////////////////////////////////////////
3558*53ee8cc1Swenshuai.xi     ////Set Transformed Algorithm LUT3 table address  //////
3559*53ee8cc1Swenshuai.xi     //////////////////////////////////////////////////
3560*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_TA_LUT3(eKLEng, LUT3Tab);
3561*53ee8cc1Swenshuai.xi 
3562*53ee8cc1Swenshuai.xi     //Enable TA and lock LUT3 table
3563*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_TA_EN(eKLEng, TRUE);
3564*53ee8cc1Swenshuai.xi 
3565*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_Ctrl(eKLEng, KLCfg->eAlgo,
3566*53ee8cc1Swenshuai.xi                       KLCfg->u32Level,
3567*53ee8cc1Swenshuai.xi                       KLCfg->eSrc,
3568*53ee8cc1Swenshuai.xi                       E_DSCMB_KL_DST_KT_ESA/*output to KT ESA*/);
3569*53ee8cc1Swenshuai.xi 
3570*53ee8cc1Swenshuai.xi     // Get Filter ID
3571*53ee8cc1Swenshuai.xi     if(FALSE == _DSCMB_Dscmb2Flt(KLCfg->u32DscID, &u32FltId))
3572*53ee8cc1Swenshuai.xi     {
3573*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_IVALID_DSCMB_ID;
3574*53ee8cc1Swenshuai.xi         goto KL_Fail;
3575*53ee8cc1Swenshuai.xi     }
3576*53ee8cc1Swenshuai.xi     DSCMB_DBG("\033[31m LINE %d, filter ID %lu\n\033[m", __LINE__, u32FltId);
3577*53ee8cc1Swenshuai.xi 
3578*53ee8cc1Swenshuai.xi 
3579*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_KeyBus(eKLEng,
3580*53ee8cc1Swenshuai.xi                         u32FltId,                            /*For Dst KT*/
3581*53ee8cc1Swenshuai.xi                         0,                                   /*For Dst KT*/ /*No use*/
3582*53ee8cc1Swenshuai.xi                         KLCfg->eKeyType,                     /*For Dst KT*/
3583*53ee8cc1Swenshuai.xi                         E_HAL_DSCMB_KL_DSTKT_ESA);           /*For Dst DMA*/
3584*53ee8cc1Swenshuai.xi 
3585*53ee8cc1Swenshuai.xi     //Enable the key slot
3586*53ee8cc1Swenshuai.xi     if (FALSE == HAL_DSCMB_KTE_Key_Ctrl(u32FltId,
3587*53ee8cc1Swenshuai.xi                                         KLCfg->eKeyType,
3588*53ee8cc1Swenshuai.xi                                         E_DSCMB_ENG_KEY_ESA,
3589*53ee8cc1Swenshuai.xi                                         TRUE))
3590*53ee8cc1Swenshuai.xi     {
3591*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_KL_INPUT_NULL;
3592*53ee8cc1Swenshuai.xi         goto KL_Fail;
3593*53ee8cc1Swenshuai.xi     }
3594*53ee8cc1Swenshuai.xi 
3595*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_Start(eKLEng);
3596*53ee8cc1Swenshuai.xi 
3597*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_ErrMsg(eKLEng, &u32ErrMsg);
3598*53ee8cc1Swenshuai.xi 
3599*53ee8cc1Swenshuai.xi     DSCMB_DBG("\033[31m KL error message 0x%X\n\033[m", (unsigned int)u32ErrMsg);
3600*53ee8cc1Swenshuai.xi 
3601*53ee8cc1Swenshuai.xi     //////////////////////////////////////////////////
3602*53ee8cc1Swenshuai.xi     ////////////Step 2, KL Output to CSSK////////////////
3603*53ee8cc1Swenshuai.xi     //////////////////////////////////////////////////
3604*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_Reset(eKLEng);
3605*53ee8cc1Swenshuai.xi 
3606*53ee8cc1Swenshuai.xi     // Set KL Level input    /*level - 1*/
3607*53ee8cc1Swenshuai.xi     for( i = 0 ; i < (u32Step2Level) ; i ++ )
3608*53ee8cc1Swenshuai.xi     {
3609*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_Input(eKLEng, (u32Step2Level-i-1), KLCfg->pu8KeyKLIn+(16*i));
3610*53ee8cc1Swenshuai.xi     }
3611*53ee8cc1Swenshuai.xi 
3612*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_KeyBus(eKLEng,
3613*53ee8cc1Swenshuai.xi                         0,                              /*For Dst KT*/
3614*53ee8cc1Swenshuai.xi                         0,                              /*For Dst KT*/ /*No use*/
3615*53ee8cc1Swenshuai.xi                         0,                              /*For Dst KT*/
3616*53ee8cc1Swenshuai.xi                         E_DSCMB_KL_DST_DMA_CSSK);    /*For Dst DMA*/
3617*53ee8cc1Swenshuai.xi 
3618*53ee8cc1Swenshuai.xi     // Set KL Ctrl
3619*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_Ctrl(eKLEng, KLCfg->eAlgo,
3620*53ee8cc1Swenshuai.xi                       u32Step2Level, /*level - 1*/
3621*53ee8cc1Swenshuai.xi                       KLCfg->eSrc,
3622*53ee8cc1Swenshuai.xi                       E_DSCMB_KL_DST_DMA_CSSK /*FIXME to CSSK*/);
3623*53ee8cc1Swenshuai.xi 
3624*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_Start(eKLEng);
3625*53ee8cc1Swenshuai.xi 
3626*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_ErrMsg(eKLEng, &u32ErrMsg);
3627*53ee8cc1Swenshuai.xi     DSCMB_DBG("\033[31m KL error message 0x%X\n\033[m", (unsigned int)u32ErrMsg);
3628*53ee8cc1Swenshuai.xi 
3629*53ee8cc1Swenshuai.xi     //////////////////////////////////////////////////
3630*53ee8cc1Swenshuai.xi     ////////////Step 3, KL Output IV & RK to CSA3 ////////
3631*53ee8cc1Swenshuai.xi     //////////////////////////////////////////////////
3632*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_TCSA3_ActCode(pu8ActCode,16);
3633*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_TCSA3_CHSel(u32CHSel);
3634*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_TCSA3_Start();
3635*53ee8cc1Swenshuai.xi 
3636*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_ErrMsg(eKLEng, &u32ErrMsg);
3637*53ee8cc1Swenshuai.xi     DSCMB_DBG("\033[31m KL error message 0x%X\n\033[m", (unsigned int)u32ErrMsg);
3638*53ee8cc1Swenshuai.xi 
3639*53ee8cc1Swenshuai.xi     if(FALSE == HAL_DSCMB_Cipher_TCSA3(u32CHSel,TRUE))
3640*53ee8cc1Swenshuai.xi     {
3641*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_IVALID_DSCMB_ID;
3642*53ee8cc1Swenshuai.xi         goto KL_Fail;
3643*53ee8cc1Swenshuai.xi     }
3644*53ee8cc1Swenshuai.xi 
3645*53ee8cc1Swenshuai.xi     //Unlock LUT3 table and KL SRAM
3646*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_TA_EN(eKLEng, FALSE);
3647*53ee8cc1Swenshuai.xi 
3648*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Unlock();
3649*53ee8cc1Swenshuai.xi     return TRUE;
3650*53ee8cc1Swenshuai.xi 
3651*53ee8cc1Swenshuai.xi KL_Fail:
3652*53ee8cc1Swenshuai.xi 
3653*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_TA_EN(eKLEng, FALSE);
3654*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Unlock();
3655*53ee8cc1Swenshuai.xi     printf("[%s][%d]TCSA3 TA DSCMB KL Fail = %08lX \n",__FUNCTION__,__LINE__,*u32Status );
3656*53ee8cc1Swenshuai.xi     DSCMB_ASSERT_AND_RETURN(FALSE);
3657*53ee8cc1Swenshuai.xi 
3658*53ee8cc1Swenshuai.xi     return FALSE;
3659*53ee8cc1Swenshuai.xi }
3660*53ee8cc1Swenshuai.xi #endif
3661*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_GetCap(MS_U32 u32EngId,DSCMB_Query_Type eQueryType,void * pInput,void * pOutput)3662*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_GetCap(MS_U32 u32EngId, DSCMB_Query_Type eQueryType, void* pInput, void* pOutput)
3663*53ee8cc1Swenshuai.xi {
3664*53ee8cc1Swenshuai.xi     HAL_DSCMB_Query_Type u32Cap;
3665*53ee8cc1Swenshuai.xi 
3666*53ee8cc1Swenshuai.xi     DSCMB_ASSERT_AND_RETURN(u32EngId == 0);
3667*53ee8cc1Swenshuai.xi     DSCMB_ASSERT_AND_RETURN(pOutput != NULL);
3668*53ee8cc1Swenshuai.xi 
3669*53ee8cc1Swenshuai.xi     switch (eQueryType)
3670*53ee8cc1Swenshuai.xi     {
3671*53ee8cc1Swenshuai.xi         case E_DSCMB_CAP_ENGINE_NUM:
3672*53ee8cc1Swenshuai.xi             u32Cap = E_HAL_DSCMB_CAP_ENGINE_NUM;
3673*53ee8cc1Swenshuai.xi             break;
3674*53ee8cc1Swenshuai.xi         case E_DSCMB_CAP_FLT_NUM:
3675*53ee8cc1Swenshuai.xi             u32Cap = E_HAL_DSCMB_CAP_FLT_NUM;
3676*53ee8cc1Swenshuai.xi             break;
3677*53ee8cc1Swenshuai.xi         case E_DSCMB_CAP_SUPPORT_ALGORITHM:
3678*53ee8cc1Swenshuai.xi             DSCMB_ASSERT_AND_RETURN(pInput != NULL);
3679*53ee8cc1Swenshuai.xi             u32Cap = E_HAL_DSCMB_CAP_SUPPORT_ALGORITHM;
3680*53ee8cc1Swenshuai.xi             break;
3681*53ee8cc1Swenshuai.xi         case E_DSCMB_CAP_SUPPORT_KEY_TYPE:
3682*53ee8cc1Swenshuai.xi             DSCMB_ASSERT_AND_RETURN(pInput != NULL);
3683*53ee8cc1Swenshuai.xi             if((*(DSCMB_Key_Type *)pInput) <= E_DSCMB_KEY_ODD)
3684*53ee8cc1Swenshuai.xi             {
3685*53ee8cc1Swenshuai.xi                 return TRUE;
3686*53ee8cc1Swenshuai.xi             }
3687*53ee8cc1Swenshuai.xi             else
3688*53ee8cc1Swenshuai.xi             {
3689*53ee8cc1Swenshuai.xi                 return FALSE;
3690*53ee8cc1Swenshuai.xi             }
3691*53ee8cc1Swenshuai.xi             break;
3692*53ee8cc1Swenshuai.xi         case E_DSCMB_CAP_PIDFILTER_MAP_START:
3693*53ee8cc1Swenshuai.xi             u32Cap = E_HAL_DSCMB_CAP_PIDFILTER_MAP_START;
3694*53ee8cc1Swenshuai.xi             break;
3695*53ee8cc1Swenshuai.xi         case E_DSCMB_CAP_PIDFILTER_MAP_END:
3696*53ee8cc1Swenshuai.xi             u32Cap = E_HAL_DSCMB_CAP_PIDFILTER_MAP_END;
3697*53ee8cc1Swenshuai.xi             break;
3698*53ee8cc1Swenshuai.xi         case E_DSCMB_CAP_SHARE_KEY_SLOT_MAX_NUM:
3699*53ee8cc1Swenshuai.xi             u32Cap = E_HAL_DSCMB_CAP_SHARE_KEY_SLOT_NUM;
3700*53ee8cc1Swenshuai.xi             break;
3701*53ee8cc1Swenshuai.xi         case E_DSCMB_CAP_SHARE_KEY_REGION_NUM:
3702*53ee8cc1Swenshuai.xi             u32Cap = E_HAL_DSCMB_CAP_SHARE_KEY_REGION_NUM;
3703*53ee8cc1Swenshuai.xi             break;
3704*53ee8cc1Swenshuai.xi         case E_DSCMB_CAP_SHARE_KEY_REGION_START:
3705*53ee8cc1Swenshuai.xi             u32Cap = E_HAL_DSCMB_CAP_SHARE_KEY_REGION_START;
3706*53ee8cc1Swenshuai.xi             break;
3707*53ee8cc1Swenshuai.xi         case E_DSCMB_CAP_SHARE_KEY_REGION_END:
3708*53ee8cc1Swenshuai.xi             u32Cap = E_HAL_DSCMB_CAP_SHARE_KEY_REGION_END;
3709*53ee8cc1Swenshuai.xi             break;
3710*53ee8cc1Swenshuai.xi         default:
3711*53ee8cc1Swenshuai.xi     return FALSE;
3712*53ee8cc1Swenshuai.xi             break;
3713*53ee8cc1Swenshuai.xi     }
3714*53ee8cc1Swenshuai.xi 
3715*53ee8cc1Swenshuai.xi     return HAL_DSCMB_GetCap(u32EngId, u32Cap, pInput, pOutput);
3716*53ee8cc1Swenshuai.xi 
3717*53ee8cc1Swenshuai.xi }
3718*53ee8cc1Swenshuai.xi 
3719*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
3720*53ee8cc1Swenshuai.xi /// Get Dscmb driver library information
3721*53ee8cc1Swenshuai.xi /// @param ppVersion \b OUT: Descrambler library version infomation
3722*53ee8cc1Swenshuai.xi /// @return TRUE - Success
3723*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
3724*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
_MDrv_DSCMB2_GetLibVer(const MSIF_Version ** ppVersion)3725*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_GetLibVer(const MSIF_Version **ppVersion)
3726*53ee8cc1Swenshuai.xi {
3727*53ee8cc1Swenshuai.xi     *ppVersion = &_drv_dscmb_version;
3728*53ee8cc1Swenshuai.xi     return TRUE;
3729*53ee8cc1Swenshuai.xi }
3730*53ee8cc1Swenshuai.xi 
3731*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
3732*53ee8cc1Swenshuai.xi /// Set Dscmb driver debug level
3733*53ee8cc1Swenshuai.xi /// @param u32Level \b IN: debug level
3734*53ee8cc1Swenshuai.xi /// @return TRUE - Success
3735*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
3736*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
_MDrv_DSCMB2_SetDBGLevel(MS_U32 u32Level)3737*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_SetDBGLevel(MS_U32 u32Level)
3738*53ee8cc1Swenshuai.xi {
3739*53ee8cc1Swenshuai.xi     _u32DSCMB2DbgLv = u32Level;
3740*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_INFO, "%s level: %x\n", __FUNCTION__, u32Level);
3741*53ee8cc1Swenshuai.xi     HAL_DSCMB_SetDBGLevel(u32Level);
3742*53ee8cc1Swenshuai.xi     return TRUE;
3743*53ee8cc1Swenshuai.xi }
_MDrv_DSCMB2_PVR_RecCtrl(MS_U32 u32EngId,MS_BOOL Enable)3744*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_PVR_RecCtrl(MS_U32 u32EngId, MS_BOOL Enable)
3745*53ee8cc1Swenshuai.xi {
3746*53ee8cc1Swenshuai.xi     //For compatible, always return TRUE because PVR MW will check the return status
3747*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION ("Not support\n");
3748*53ee8cc1Swenshuai.xi     return TRUE;
3749*53ee8cc1Swenshuai.xi }
3750*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_PidFlt_ScmbStatus(MS_U32 u32EngId,MS_U32 u32PidFltId,SCMB_Level * pScmbLevel)3751*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_PidFlt_ScmbStatus(MS_U32 u32EngId, MS_U32 u32PidFltId, SCMB_Level* pScmbLevel)
3752*53ee8cc1Swenshuai.xi {
3753*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION ("Not support\n");
3754*53ee8cc1Swenshuai.xi     return FALSE;
3755*53ee8cc1Swenshuai.xi }
3756*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_Multi2_SetRound(MS_U32 u32EngId,MS_U32 u32Round)3757*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_Multi2_SetRound(MS_U32 u32EngId, MS_U32 u32Round)
3758*53ee8cc1Swenshuai.xi {
3759*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
3760*53ee8cc1Swenshuai.xi 
3761*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
3762*53ee8cc1Swenshuai.xi     HAL_DSCMB_KTE_Write_MULTI2_Round(u32Round);
3763*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
3764*53ee8cc1Swenshuai.xi 
3765*53ee8cc1Swenshuai.xi     return TRUE;
3766*53ee8cc1Swenshuai.xi }
3767*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_Multi2_SetSystemKey(MS_U32 u32EngId,MS_U8 * u8Syskey)3768*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_Multi2_SetSystemKey(MS_U32 u32EngId, MS_U8* u8Syskey)
3769*53ee8cc1Swenshuai.xi {
3770*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
3771*53ee8cc1Swenshuai.xi     DSCMB_ASSERT(u8Syskey != NULL, "System key input NULL", FALSE);
3772*53ee8cc1Swenshuai.xi 
3773*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
3774*53ee8cc1Swenshuai.xi     HAL_DSCMB_KTE_Write_MULTI2_SysKey(u8Syskey, HAL_DSCMB_MULTI2_SYSKEY_MAX);
3775*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
3776*53ee8cc1Swenshuai.xi 
3777*53ee8cc1Swenshuai.xi     return TRUE;
3778*53ee8cc1Swenshuai.xi }
3779*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_HDCP2_SetRIV(MS_U32 u32EngId,MS_U8 * pu8RIV)3780*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_HDCP2_SetRIV(MS_U32 u32EngId, MS_U8* pu8RIV)
3781*53ee8cc1Swenshuai.xi {
3782*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION ("Obsolete function\n");
3783*53ee8cc1Swenshuai.xi     return FALSE;
3784*53ee8cc1Swenshuai.xi }
3785*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_HDCP2_SetRIV_Ex(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U8 * pu8RIV)3786*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_HDCP2_SetRIV_Ex(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U8* pu8RIV)
3787*53ee8cc1Swenshuai.xi {
3788*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngSetRIV(u32EngId, u32DscmbId, pu8RIV);
3789*53ee8cc1Swenshuai.xi }
3790*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_ES_SetStaticKey(MS_U32 u32EngId,MS_U8 * pu8Statickey)3791*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_ES_SetStaticKey(MS_U32 u32EngId, MS_U8* pu8Statickey)
3792*53ee8cc1Swenshuai.xi {
3793*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
3794*53ee8cc1Swenshuai.xi 
3795*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
3796*53ee8cc1Swenshuai.xi     HAL_DSCMB_Cipher_ES_SetStaticKey(u32EngId, pu8Statickey, HAL_DSCMB_ES_STATICKEY_MAX);
3797*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
3798*53ee8cc1Swenshuai.xi 
3799*53ee8cc1Swenshuai.xi     return TRUE;
3800*53ee8cc1Swenshuai.xi }
3801*53ee8cc1Swenshuai.xi 
3802*53ee8cc1Swenshuai.xi //------------------------------------- ------------------//
3803*53ee8cc1Swenshuai.xi //----------------------Debug API -------------------------//
3804*53ee8cc1Swenshuai.xi //-------------------------------------------------------//
_MDrv_DSCMB2_GetConnectStatus(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32TspFltId)3805*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DSCMB2_GetConnectStatus(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32TspFltId)
3806*53ee8cc1Swenshuai.xi {
3807*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
3808*53ee8cc1Swenshuai.xi 
3809*53ee8cc1Swenshuai.xi     return _DSCMB_IsFltConnectDSCMB(u32DscmbId, u32TspFltId);
3810*53ee8cc1Swenshuai.xi }
3811*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_ReadSwitch(MS_U32 u32FltId,DSCMB_Key_Type type,MS_U32 u32CAVid)3812*53ee8cc1Swenshuai.xi void _MDrv_DSCMB2_ReadSwitch(MS_U32 u32FltId, DSCMB_Key_Type type, MS_U32 u32CAVid)
3813*53ee8cc1Swenshuai.xi {
3814*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK();
3815*53ee8cc1Swenshuai.xi 
3816*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
3817*53ee8cc1Swenshuai.xi 
3818*53ee8cc1Swenshuai.xi     if(_u32PidFlt2Dscmb[u32FltId].u8DscmbId != HAL_DSCMB_KTE_MAX)
3819*53ee8cc1Swenshuai.xi     {
3820*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
3821*53ee8cc1Swenshuai.xi         HAL_DSCMB_PrintSwitchSetup(_u32PidFlt2Dscmb[u32FltId].u8DscmbId, type, u32CAVid);
3822*53ee8cc1Swenshuai.xi #else
3823*53ee8cc1Swenshuai.xi         HAL_DSCMB_PrintSwitchSetup(u32FltId, type, u32CAVid);
3824*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP */
3825*53ee8cc1Swenshuai.xi     }
3826*53ee8cc1Swenshuai.xi 
3827*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
3828*53ee8cc1Swenshuai.xi }
3829*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_ReadPidSlotMap(MS_U32 u32FltId)3830*53ee8cc1Swenshuai.xi void _MDrv_DSCMB2_ReadPidSlotMap(MS_U32 u32FltId)
3831*53ee8cc1Swenshuai.xi {
3832*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK();
3833*53ee8cc1Swenshuai.xi 
3834*53ee8cc1Swenshuai.xi     PidSlotMapRead_t tReadData;
3835*53ee8cc1Swenshuai.xi     memset(&tReadData, 0, sizeof(PidSlotMapRead_t));
3836*53ee8cc1Swenshuai.xi 
3837*53ee8cc1Swenshuai.xi     DSCMB_LOCK(_s32DscMutexId);
3838*53ee8cc1Swenshuai.xi 
3839*53ee8cc1Swenshuai.xi     if(_u32PidFlt2Dscmb[u32FltId].u8DscmbId != HAL_DSCMB_KTE_MAX)
3840*53ee8cc1Swenshuai.xi     {
3841*53ee8cc1Swenshuai.xi #ifdef FLEXIBLE_PIDSLOTMAP
3842*53ee8cc1Swenshuai.xi         HAL_DSCMB_ReadPidSlotMap(_u32PidFlt2Dscmb[u32FltId].u8DscmbId, &tReadData);
3843*53ee8cc1Swenshuai.xi #else
3844*53ee8cc1Swenshuai.xi         HAL_DSCMB_ReadPidSlotMap(u32FltId, &tReadData);
3845*53ee8cc1Swenshuai.xi #endif /* FLEXIBLE_PIDSLOTMAP */
3846*53ee8cc1Swenshuai.xi     }
3847*53ee8cc1Swenshuai.xi 
3848*53ee8cc1Swenshuai.xi     DSCMB_UNLOCK(_s32DscMutexId);
3849*53ee8cc1Swenshuai.xi }
3850*53ee8cc1Swenshuai.xi 
_MDrv_DSCMB2_PacketView(MS_U32 u32Eng,MS_U32 u32FltId,MS_U32 Mode,MS_U32 u32Range,MS_BOOL bRst)3851*53ee8cc1Swenshuai.xi void _MDrv_DSCMB2_PacketView(MS_U32 u32Eng, MS_U32 u32FltId, MS_U32 Mode, MS_U32 u32Range, MS_BOOL bRst)
3852*53ee8cc1Swenshuai.xi {
3853*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK();
3854*53ee8cc1Swenshuai.xi 
3855*53ee8cc1Swenshuai.xi     MS_U32 u32pktparser = 0;
3856*53ee8cc1Swenshuai.xi     MS_U32 u32tsif = 0;
3857*53ee8cc1Swenshuai.xi     Mode = Mode >= 1? TRUE: FALSE;
3858*53ee8cc1Swenshuai.xi 
3859*53ee8cc1Swenshuai.xi     //Mode = 1, enable    snap mode, stop when pktcnt is finished
3860*53ee8cc1Swenshuai.xi     //Mode = 0, enable trigger mode, stop when badpkt occurs
3861*53ee8cc1Swenshuai.xi 
3862*53ee8cc1Swenshuai.xi     HAL_DSCMB_Get_TsidInput(u32FltId, &u32tsif);
3863*53ee8cc1Swenshuai.xi     //printf("%s, u32tsif = %lx, reset = %d\n", __FUNCTION__, u32tsif, bRst);
3864*53ee8cc1Swenshuai.xi 
3865*53ee8cc1Swenshuai.xi     if(bRst == TRUE)
3866*53ee8cc1Swenshuai.xi     {
3867*53ee8cc1Swenshuai.xi         //reset....
3868*53ee8cc1Swenshuai.xi         u32pktparser = HAL_DSCMB_PktParser_Ctrl(u32Eng, u32tsif, TRUE, u32Range, 0, Mode);
3869*53ee8cc1Swenshuai.xi         return;
3870*53ee8cc1Swenshuai.xi     }
3871*53ee8cc1Swenshuai.xi 
3872*53ee8cc1Swenshuai.xi     u32pktparser = HAL_DSCMB_PktParser_Ctrl(u32Eng, u32tsif, FALSE, u32Range, E_HAL_DSCMB_PARSER_EVENT, Mode);
3873*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "Event = 0x%08x\n", u32pktparser);
3874*53ee8cc1Swenshuai.xi     HAL_DSCMB_PktParser_PrintEvent(u32pktparser);
3875*53ee8cc1Swenshuai.xi 
3876*53ee8cc1Swenshuai.xi     u32pktparser = HAL_DSCMB_PktParser_Ctrl(u32Eng, u32tsif, FALSE, u32Range, E_HAL_DSCMB_PARSER_SCB, Mode);
3877*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "SCB_00 = 0x%x\n", (u32pktparser & 0xFF000000) >>24);
3878*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "SCB_01 = 0x%x\n", (u32pktparser & 0x00FF0000) >>16);
3879*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "SCB_10 = 0x%x\n", (u32pktparser & 0x0000FF00) >> 8);
3880*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "SCB_11 = 0x%x\n", (u32pktparser & 0x000000FF) >> 0);
3881*53ee8cc1Swenshuai.xi 
3882*53ee8cc1Swenshuai.xi     u32pktparser = HAL_DSCMB_PktParser_Ctrl(u32Eng, u32tsif, FALSE, u32Range, E_HAL_DSCMB_PARSER_BADPKT, Mode);
3883*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "BADPKT_UPP = 0x%x\n", (u32pktparser & 0xFF000000) >>24);
3884*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "BADPKT_LOW = 0x%x\n", (u32pktparser & 0x00FF0000) >>16);
3885*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "PKT_UPP    = 0x%x\n", (u32pktparser & 0x0000FF00) >> 8);
3886*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "PKT_LOW    = 0x%x\n", (u32pktparser & 0x000000FF) >> 0);
3887*53ee8cc1Swenshuai.xi 
3888*53ee8cc1Swenshuai.xi     u32pktparser = HAL_DSCMB_PktParser_Ctrl(u32Eng, u32tsif, FALSE, u32Range, E_HAL_DSCMB_PARSER_2NDHIT, Mode);
3889*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "2NDHIT = 0x%x\n", u32pktparser);
3890*53ee8cc1Swenshuai.xi 
3891*53ee8cc1Swenshuai.xi     u32pktparser = HAL_DSCMB_PktParser_Ctrl(u32Eng, u32tsif, FALSE, u32Range, E_HAL_DSCMB_PARSER_ESA, Mode);
3892*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "ESA    = 0x%x\n", u32pktparser);
3893*53ee8cc1Swenshuai.xi 
3894*53ee8cc1Swenshuai.xi     u32pktparser = HAL_DSCMB_PktParser_Ctrl(u32Eng, u32tsif, FALSE, u32Range, E_HAL_DSCMB_PARSER_LSA, Mode);
3895*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_WARNING, "LSA    = 0x%x\n", u32pktparser);
3896*53ee8cc1Swenshuai.xi }
3897*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_SetPowerState(EN_POWER_MODE u16PowerState)3898*53ee8cc1Swenshuai.xi MS_U32  MDrv_DSCMB2_SetPowerState(EN_POWER_MODE u16PowerState)
3899*53ee8cc1Swenshuai.xi {
3900*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
3901*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3902*53ee8cc1Swenshuai.xi     EN_POWER_MODE pArgs = u16PowerState;
3903*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
3904*53ee8cc1Swenshuai.xi     {
3905*53ee8cc1Swenshuai.xi         if(UTOPIA_STATUS_FAIL == UtopiaOpen(MODULE_DSCMB, &pu32DscmbInst, 0x0, NULL))
3906*53ee8cc1Swenshuai.xi         {
3907*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "UtopiaOpen DSCMB fail\n");
3908*53ee8cc1Swenshuai.xi             return FALSE;
3909*53ee8cc1Swenshuai.xi         }
3910*53ee8cc1Swenshuai.xi     }
3911*53ee8cc1Swenshuai.xi 
3912*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_SetPowerState, (void*)&pArgs);
3913*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3914*53ee8cc1Swenshuai.xi     {
3915*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
3916*53ee8cc1Swenshuai.xi         return FALSE;
3917*53ee8cc1Swenshuai.xi     }
3918*53ee8cc1Swenshuai.xi 
3919*53ee8cc1Swenshuai.xi     return TRUE;
3920*53ee8cc1Swenshuai.xi #else
3921*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_SetPowerState(u16PowerState);
3922*53ee8cc1Swenshuai.xi #endif
3923*53ee8cc1Swenshuai.xi }
3924*53ee8cc1Swenshuai.xi 
3925*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_Init(void)3926*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_Init(void)
3927*53ee8cc1Swenshuai.xi {
3928*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
3929*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3930*53ee8cc1Swenshuai.xi 
3931*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
3932*53ee8cc1Swenshuai.xi     {
3933*53ee8cc1Swenshuai.xi         if(UTOPIA_STATUS_FAIL == UtopiaOpen(MODULE_DSCMB, &pu32DscmbInst, 0x0, NULL))
3934*53ee8cc1Swenshuai.xi         {
3935*53ee8cc1Swenshuai.xi             DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "UtopiaOpen DSCMB fail\n");
3936*53ee8cc1Swenshuai.xi             return FALSE;
3937*53ee8cc1Swenshuai.xi         }
3938*53ee8cc1Swenshuai.xi     }
3939*53ee8cc1Swenshuai.xi 
3940*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_Init, NULL);
3941*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3942*53ee8cc1Swenshuai.xi     {
3943*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
3944*53ee8cc1Swenshuai.xi         return FALSE;
3945*53ee8cc1Swenshuai.xi     }
3946*53ee8cc1Swenshuai.xi 
3947*53ee8cc1Swenshuai.xi     return TRUE;
3948*53ee8cc1Swenshuai.xi #else
3949*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_Init();
3950*53ee8cc1Swenshuai.xi #endif
3951*53ee8cc1Swenshuai.xi }
3952*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_Exit(void)3953*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_Exit(void)
3954*53ee8cc1Swenshuai.xi {
3955*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
3956*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3957*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
3958*53ee8cc1Swenshuai.xi     {
3959*53ee8cc1Swenshuai.xi         return FALSE;
3960*53ee8cc1Swenshuai.xi     }
3961*53ee8cc1Swenshuai.xi 
3962*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_Exit, NULL);
3963*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3964*53ee8cc1Swenshuai.xi     {
3965*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
3966*53ee8cc1Swenshuai.xi         return FALSE;
3967*53ee8cc1Swenshuai.xi     }
3968*53ee8cc1Swenshuai.xi 
3969*53ee8cc1Swenshuai.xi     return TRUE;
3970*53ee8cc1Swenshuai.xi 
3971*53ee8cc1Swenshuai.xi #else
3972*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_Exit();
3973*53ee8cc1Swenshuai.xi #endif
3974*53ee8cc1Swenshuai.xi }
3975*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_FltAllocWithCAVid(MS_U32 u32EngId,DSCMB_Flt_Type eFltType,MS_U32 u32CAVid)3976*53ee8cc1Swenshuai.xi MS_U32 MDrv_DSCMB2_FltAllocWithCAVid(MS_U32 u32EngId, DSCMB_Flt_Type eFltType, MS_U32 u32CAVid)
3977*53ee8cc1Swenshuai.xi {
3978*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltAllocWithCAVid(u32EngId, eFltType, u32CAVid);
3979*53ee8cc1Swenshuai.xi }
3980*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_FltAlloc_Ex(MS_U32 u32EngId,DSCMB_Flt_Type eFltType)3981*53ee8cc1Swenshuai.xi MS_U32 MDrv_DSCMB2_FltAlloc_Ex(MS_U32 u32EngId, DSCMB_Flt_Type eFltType)
3982*53ee8cc1Swenshuai.xi {
3983*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
3984*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
3985*53ee8cc1Swenshuai.xi     DSCMB_FLTALLOC pArgs;
3986*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
3987*53ee8cc1Swenshuai.xi     {
3988*53ee8cc1Swenshuai.xi         return DRV_DSCMB_FLT_NULL;
3989*53ee8cc1Swenshuai.xi     }
3990*53ee8cc1Swenshuai.xi 
3991*53ee8cc1Swenshuai.xi     pArgs.u32EngId = u32EngId;
3992*53ee8cc1Swenshuai.xi     pArgs.eFltType = eFltType;
3993*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId = 0xFF;
3994*53ee8cc1Swenshuai.xi 
3995*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_FltAlloc, (void*)&pArgs);
3996*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
3997*53ee8cc1Swenshuai.xi     {
3998*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
3999*53ee8cc1Swenshuai.xi         return DRV_DSCMB_FLT_NULL;
4000*53ee8cc1Swenshuai.xi     }
4001*53ee8cc1Swenshuai.xi 
4002*53ee8cc1Swenshuai.xi     return pArgs.u32DscmbId;
4003*53ee8cc1Swenshuai.xi 
4004*53ee8cc1Swenshuai.xi #else
4005*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltAlloc_Ex(u32EngId, eFltType);
4006*53ee8cc1Swenshuai.xi #endif
4007*53ee8cc1Swenshuai.xi }
4008*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_FltAlloc(MS_U32 u32EngId)4009*53ee8cc1Swenshuai.xi MS_U32 MDrv_DSCMB2_FltAlloc(MS_U32 u32EngId)
4010*53ee8cc1Swenshuai.xi {
4011*53ee8cc1Swenshuai.xi     return MDrv_DSCMB2_FltAlloc_Ex(u32EngId, E_DSCMB_FLT_2_KEYS);
4012*53ee8cc1Swenshuai.xi }
4013*53ee8cc1Swenshuai.xi 
4014*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
4015*53ee8cc1Swenshuai.xi /// Free the specific DSCMB filter by ID
4016*53ee8cc1Swenshuai.xi /// @return TRUE - SUCCESS
4017*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
4018*53ee8cc1Swenshuai.xi /// @note
4019*53ee8cc1Swenshuai.xi ///
4020*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
4021*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_FltFree(MS_U32 u32EngId,MS_U32 u32DscmbId)4022*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_FltFree(MS_U32 u32EngId, MS_U32 u32DscmbId)
4023*53ee8cc1Swenshuai.xi {
4024*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4025*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4026*53ee8cc1Swenshuai.xi     DSCMB_FLTFREE pArgs;
4027*53ee8cc1Swenshuai.xi 
4028*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_FLTFREE));
4029*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4030*53ee8cc1Swenshuai.xi     {
4031*53ee8cc1Swenshuai.xi         return FALSE;
4032*53ee8cc1Swenshuai.xi     }
4033*53ee8cc1Swenshuai.xi 
4034*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId = u32DscmbId;
4035*53ee8cc1Swenshuai.xi 
4036*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_FltFree, (void*)&pArgs);
4037*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4038*53ee8cc1Swenshuai.xi     {
4039*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4040*53ee8cc1Swenshuai.xi         return FALSE;
4041*53ee8cc1Swenshuai.xi     }
4042*53ee8cc1Swenshuai.xi 
4043*53ee8cc1Swenshuai.xi     return TRUE;
4044*53ee8cc1Swenshuai.xi 
4045*53ee8cc1Swenshuai.xi #else
4046*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltFree(u32EngId, u32DscmbId);
4047*53ee8cc1Swenshuai.xi #endif
4048*53ee8cc1Swenshuai.xi }
4049*53ee8cc1Swenshuai.xi 
4050*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_FltConnectFltId(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32FltId)4051*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_FltConnectFltId(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32FltId)
4052*53ee8cc1Swenshuai.xi {
4053*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4054*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4055*53ee8cc1Swenshuai.xi     DSCMB_CONNECTFLT pArgs;
4056*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_CONNECTFLT));
4057*53ee8cc1Swenshuai.xi 
4058*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4059*53ee8cc1Swenshuai.xi     {
4060*53ee8cc1Swenshuai.xi         return FALSE;
4061*53ee8cc1Swenshuai.xi     }
4062*53ee8cc1Swenshuai.xi 
4063*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId = u32DscmbId;
4064*53ee8cc1Swenshuai.xi     pArgs.u32DmxFltId = u32FltId;
4065*53ee8cc1Swenshuai.xi 
4066*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_FltConnectFltId, (void*)&pArgs);
4067*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4068*53ee8cc1Swenshuai.xi     {
4069*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4070*53ee8cc1Swenshuai.xi         return FALSE;
4071*53ee8cc1Swenshuai.xi     }
4072*53ee8cc1Swenshuai.xi 
4073*53ee8cc1Swenshuai.xi     return TRUE;
4074*53ee8cc1Swenshuai.xi #else
4075*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltConnectFltId(u32EngId, u32DscmbId, u32FltId);
4076*53ee8cc1Swenshuai.xi #endif
4077*53ee8cc1Swenshuai.xi }
4078*53ee8cc1Swenshuai.xi 
4079*53ee8cc1Swenshuai.xi 
4080*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_FltDisconnectFltId(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32FltId)4081*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_FltDisconnectFltId(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32FltId)
4082*53ee8cc1Swenshuai.xi {
4083*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4084*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4085*53ee8cc1Swenshuai.xi     DSCMB_DISCONNECTFLT pArgs;
4086*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_DISCONNECTFLT));
4087*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4088*53ee8cc1Swenshuai.xi     {
4089*53ee8cc1Swenshuai.xi         return FALSE;
4090*53ee8cc1Swenshuai.xi     }
4091*53ee8cc1Swenshuai.xi 
4092*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId = u32DscmbId;
4093*53ee8cc1Swenshuai.xi     pArgs.u32DmxFltId = u32FltId;
4094*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_FltDisconnectFltId, (void*)&pArgs);
4095*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4096*53ee8cc1Swenshuai.xi     {
4097*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4098*53ee8cc1Swenshuai.xi         return FALSE;
4099*53ee8cc1Swenshuai.xi     }
4100*53ee8cc1Swenshuai.xi 
4101*53ee8cc1Swenshuai.xi     return TRUE;
4102*53ee8cc1Swenshuai.xi #else
4103*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltDisconnectFltId(u32EngId, u32DscmbId, u32FltId);
4104*53ee8cc1Swenshuai.xi #endif
4105*53ee8cc1Swenshuai.xi }
4106*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_EngSetFSCB(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_FSCB eForceSCB)4107*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_EngSetFSCB(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_FSCB eForceSCB )
4108*53ee8cc1Swenshuai.xi {
4109*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4110*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4111*53ee8cc1Swenshuai.xi     DSCMB_ENGFSCB pArgs;
4112*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_ENGFSCB));
4113*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4114*53ee8cc1Swenshuai.xi     {
4115*53ee8cc1Swenshuai.xi         return FALSE;
4116*53ee8cc1Swenshuai.xi     }
4117*53ee8cc1Swenshuai.xi 
4118*53ee8cc1Swenshuai.xi     pArgs.u32EngId   = u32EngId;
4119*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId = u32DscmbId;
4120*53ee8cc1Swenshuai.xi     pArgs.eForceSCB  = eForceSCB;
4121*53ee8cc1Swenshuai.xi 
4122*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_EngSetFSCB, (void*)&pArgs);
4123*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4124*53ee8cc1Swenshuai.xi     {
4125*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4126*53ee8cc1Swenshuai.xi         return FALSE;
4127*53ee8cc1Swenshuai.xi     }
4128*53ee8cc1Swenshuai.xi 
4129*53ee8cc1Swenshuai.xi     return TRUE;
4130*53ee8cc1Swenshuai.xi #else
4131*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngSetFSCB(u32EngId, u32DscmbId, eForceSCB);
4132*53ee8cc1Swenshuai.xi #endif
4133*53ee8cc1Swenshuai.xi }
4134*53ee8cc1Swenshuai.xi 
4135*53ee8cc1Swenshuai.xi // Set Upper & lower switch to dscmb filter //
4136*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
4137*53ee8cc1Swenshuai.xi /// Set upper switch and lower switch to choose which engine will go into.
4138*53ee8cc1Swenshuai.xi /// @param u32DscmbId\b IN: The descrambler id which is get from MDrv_DSCMB2_FltAlloc.
4139*53ee8cc1Swenshuai.xi /// @param eUppSwitch\b IN: An Enum type for choosing descrambler engine when go through upper path.
4140*53ee8cc1Swenshuai.xi /// @param eLowSwitch\b IN: An Enum type for choosing descrambler engine when go through lower path.
4141*53ee8cc1Swenshuai.xi /// @return TRUE - SUCCESS
4142*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
4143*53ee8cc1Swenshuai.xi /// @note
4144*53ee8cc1Swenshuai.xi ///
4145*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB2_EngSetSwitch(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Eng_Type eUppSwitch,DSCMB_Eng_Type eLowSwitch)4146*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_EngSetSwitch(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Eng_Type eUppSwitch, DSCMB_Eng_Type eLowSwitch)
4147*53ee8cc1Swenshuai.xi {
4148*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4149*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4150*53ee8cc1Swenshuai.xi     DSCMB_ENGSWITCH pArgs;
4151*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_ENGSWITCH));
4152*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4153*53ee8cc1Swenshuai.xi     {
4154*53ee8cc1Swenshuai.xi         return FALSE;
4155*53ee8cc1Swenshuai.xi     }
4156*53ee8cc1Swenshuai.xi 
4157*53ee8cc1Swenshuai.xi     pArgs.u32EngId    = u32EngId;
4158*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId  = u32DscmbId;
4159*53ee8cc1Swenshuai.xi     pArgs.eUppSwitch  = eUppSwitch;
4160*53ee8cc1Swenshuai.xi     pArgs.eLowSwitch  = eLowSwitch;
4161*53ee8cc1Swenshuai.xi 
4162*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_EngSetSwitch, (void*)&pArgs);
4163*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4164*53ee8cc1Swenshuai.xi     {
4165*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4166*53ee8cc1Swenshuai.xi         return FALSE;
4167*53ee8cc1Swenshuai.xi     }
4168*53ee8cc1Swenshuai.xi 
4169*53ee8cc1Swenshuai.xi     return TRUE;
4170*53ee8cc1Swenshuai.xi #else
4171*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngSetSwitch(u32EngId, u32DscmbId, eUppSwitch, eLowSwitch);
4172*53ee8cc1Swenshuai.xi #endif
4173*53ee8cc1Swenshuai.xi }
4174*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_EngSetAlgo(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Eng_Type eEngType,DSCMB_Algo_Cfg stConfig)4175*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_EngSetAlgo(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Eng_Type eEngType, DSCMB_Algo_Cfg stConfig)
4176*53ee8cc1Swenshuai.xi {
4177*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4178*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4179*53ee8cc1Swenshuai.xi     DSCMB_ENGALGO pArgs;
4180*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_ENGALGO));
4181*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4182*53ee8cc1Swenshuai.xi     {
4183*53ee8cc1Swenshuai.xi         return FALSE;
4184*53ee8cc1Swenshuai.xi     }
4185*53ee8cc1Swenshuai.xi 
4186*53ee8cc1Swenshuai.xi     pArgs.u32EngId    = u32EngId;
4187*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId  = u32DscmbId;
4188*53ee8cc1Swenshuai.xi     pArgs.eEngType    = eEngType;
4189*53ee8cc1Swenshuai.xi     pArgs.stConfig    = stConfig;
4190*53ee8cc1Swenshuai.xi 
4191*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_EngSetAlgo, (void*)&pArgs);
4192*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4193*53ee8cc1Swenshuai.xi     {
4194*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4195*53ee8cc1Swenshuai.xi         return FALSE;
4196*53ee8cc1Swenshuai.xi     }
4197*53ee8cc1Swenshuai.xi 
4198*53ee8cc1Swenshuai.xi     return TRUE;
4199*53ee8cc1Swenshuai.xi #else
4200*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngSetAlgo(u32EngId, u32DscmbId, eEngType, stConfig);
4201*53ee8cc1Swenshuai.xi #endif
4202*53ee8cc1Swenshuai.xi }
4203*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_EngSetRIV(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U8 * pu8RIV)4204*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_EngSetRIV(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U8* pu8RIV)
4205*53ee8cc1Swenshuai.xi {
4206*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngSetRIV(u32EngId, u32DscmbId, pu8RIV);
4207*53ee8cc1Swenshuai.xi }
4208*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_EngSetIV(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Key_Type eKeyType,MS_U8 * pu8IV)4209*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_EngSetIV(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Key_Type eKeyType, MS_U8* pu8IV)
4210*53ee8cc1Swenshuai.xi {
4211*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4212*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4213*53ee8cc1Swenshuai.xi     DSCMB_ENGIV pArgs;
4214*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_ENGIV));
4215*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4216*53ee8cc1Swenshuai.xi     {
4217*53ee8cc1Swenshuai.xi         return FALSE;
4218*53ee8cc1Swenshuai.xi     }
4219*53ee8cc1Swenshuai.xi 
4220*53ee8cc1Swenshuai.xi     pArgs.u32EngId    = u32EngId;
4221*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId  = u32DscmbId;
4222*53ee8cc1Swenshuai.xi     pArgs.eKeyType    = eKeyType;
4223*53ee8cc1Swenshuai.xi     pArgs.pu8IV       = pu8IV;
4224*53ee8cc1Swenshuai.xi 
4225*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_EngSetIV, (void*)&pArgs);
4226*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4227*53ee8cc1Swenshuai.xi     {
4228*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4229*53ee8cc1Swenshuai.xi         return FALSE;
4230*53ee8cc1Swenshuai.xi     }
4231*53ee8cc1Swenshuai.xi 
4232*53ee8cc1Swenshuai.xi     return TRUE;
4233*53ee8cc1Swenshuai.xi #else
4234*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngSetIV(u32EngId, u32DscmbId, eKeyType, pu8IV);
4235*53ee8cc1Swenshuai.xi #endif
4236*53ee8cc1Swenshuai.xi }
4237*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_EngSetIV_Ex(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Eng_Type eEngType,DSCMB_Key_Type eKeyType,MS_U8 * pu8IV)4238*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_EngSetIV_Ex(MS_U32 u32EngId, MS_U32 u32DscmbId,  DSCMB_Eng_Type eEngType, DSCMB_Key_Type eKeyType, MS_U8* pu8IV)
4239*53ee8cc1Swenshuai.xi {
4240*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4241*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4242*53ee8cc1Swenshuai.xi     DSCMB_ENGIV_EX pArgs;
4243*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_ENGIV_EX));
4244*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4245*53ee8cc1Swenshuai.xi     {
4246*53ee8cc1Swenshuai.xi         return FALSE;
4247*53ee8cc1Swenshuai.xi     }
4248*53ee8cc1Swenshuai.xi 
4249*53ee8cc1Swenshuai.xi     pArgs.u32EngId    = u32EngId;
4250*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId  = u32DscmbId;
4251*53ee8cc1Swenshuai.xi     pArgs.eEngType    = eEngType;
4252*53ee8cc1Swenshuai.xi     pArgs.eKeyType    = eKeyType;
4253*53ee8cc1Swenshuai.xi     pArgs.pu8IV       = pu8IV;
4254*53ee8cc1Swenshuai.xi 
4255*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_EngSetIV_Ex, (void*)&pArgs);
4256*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4257*53ee8cc1Swenshuai.xi     {
4258*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4259*53ee8cc1Swenshuai.xi         return FALSE;
4260*53ee8cc1Swenshuai.xi     }
4261*53ee8cc1Swenshuai.xi 
4262*53ee8cc1Swenshuai.xi     return TRUE;
4263*53ee8cc1Swenshuai.xi #else
4264*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngSetIV_Ex(u32EngId, u32DscmbId, eEngType, eKeyType, pu8IV);
4265*53ee8cc1Swenshuai.xi #endif
4266*53ee8cc1Swenshuai.xi }
4267*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_EngSetKeyFSCB(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Eng_Type eEngType,DSCMB_Key_Type eKeyType,DSCMB_FSCB eForceSCB)4268*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_EngSetKeyFSCB(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Eng_Type eEngType, DSCMB_Key_Type eKeyType, DSCMB_FSCB eForceSCB)
4269*53ee8cc1Swenshuai.xi {
4270*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4271*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4272*53ee8cc1Swenshuai.xi     DSCMB_ENGKEYFSCB pArgs;
4273*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_ENGKEY));
4274*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4275*53ee8cc1Swenshuai.xi     {
4276*53ee8cc1Swenshuai.xi         return FALSE;
4277*53ee8cc1Swenshuai.xi     }
4278*53ee8cc1Swenshuai.xi 
4279*53ee8cc1Swenshuai.xi     pArgs.u32EngId    = u32EngId;
4280*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId  = u32DscmbId;
4281*53ee8cc1Swenshuai.xi     pArgs.eEngType    = eEngType;
4282*53ee8cc1Swenshuai.xi     pArgs.eKeyType    = eKeyType;
4283*53ee8cc1Swenshuai.xi     pArgs.eForceSCB   = eForceSCB;
4284*53ee8cc1Swenshuai.xi 
4285*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_EngSetKeyFSCB, (void*)&pArgs);
4286*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4287*53ee8cc1Swenshuai.xi     {
4288*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4289*53ee8cc1Swenshuai.xi         return FALSE;
4290*53ee8cc1Swenshuai.xi     }
4291*53ee8cc1Swenshuai.xi 
4292*53ee8cc1Swenshuai.xi     return TRUE;
4293*53ee8cc1Swenshuai.xi #else
4294*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngSetKeyFSCB(u32EngId, u32DscmbId, eEngType, eKeyType, eForceSCB);
4295*53ee8cc1Swenshuai.xi #endif
4296*53ee8cc1Swenshuai.xi }
4297*53ee8cc1Swenshuai.xi 
4298*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_EngSetKey(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Eng_Type eEngType,DSCMB_Key_Type eKeyType,MS_U8 * pu8Key)4299*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_EngSetKey(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Eng_Type eEngType, DSCMB_Key_Type eKeyType, MS_U8* pu8Key)
4300*53ee8cc1Swenshuai.xi {
4301*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4302*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4303*53ee8cc1Swenshuai.xi     DSCMB_ENGKEY pArgs;
4304*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_ENGKEY));
4305*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4306*53ee8cc1Swenshuai.xi     {
4307*53ee8cc1Swenshuai.xi         return FALSE;
4308*53ee8cc1Swenshuai.xi     }
4309*53ee8cc1Swenshuai.xi 
4310*53ee8cc1Swenshuai.xi     pArgs.u32EngId    = u32EngId;
4311*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId  = u32DscmbId;
4312*53ee8cc1Swenshuai.xi     pArgs.eEngType    = eEngType;
4313*53ee8cc1Swenshuai.xi     pArgs.eKeyType    = eKeyType;
4314*53ee8cc1Swenshuai.xi     pArgs.pu8Key      = pu8Key;
4315*53ee8cc1Swenshuai.xi 
4316*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_EngSetKey, (void*)&pArgs);
4317*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4318*53ee8cc1Swenshuai.xi     {
4319*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4320*53ee8cc1Swenshuai.xi         return FALSE;
4321*53ee8cc1Swenshuai.xi     }
4322*53ee8cc1Swenshuai.xi 
4323*53ee8cc1Swenshuai.xi     return TRUE;
4324*53ee8cc1Swenshuai.xi #else
4325*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngSetKey(u32EngId, u32DscmbId, eEngType, eKeyType, pu8Key);
4326*53ee8cc1Swenshuai.xi #endif
4327*53ee8cc1Swenshuai.xi }
4328*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_EngResetKey(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Eng_Type eEngType,DSCMB_Key_Type eKeyType)4329*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_EngResetKey(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Eng_Type eEngType, DSCMB_Key_Type eKeyType)
4330*53ee8cc1Swenshuai.xi {
4331*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4332*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4333*53ee8cc1Swenshuai.xi     DSCMB_ENGRESETKEY pArgs;
4334*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_ENGRESETKEY));
4335*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4336*53ee8cc1Swenshuai.xi     {
4337*53ee8cc1Swenshuai.xi         return FALSE;
4338*53ee8cc1Swenshuai.xi     }
4339*53ee8cc1Swenshuai.xi 
4340*53ee8cc1Swenshuai.xi     pArgs.u32EngId    = u32EngId;
4341*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId  = u32DscmbId;
4342*53ee8cc1Swenshuai.xi     pArgs.eEngType    = eEngType;
4343*53ee8cc1Swenshuai.xi     pArgs.eKeyType    = eKeyType;
4344*53ee8cc1Swenshuai.xi 
4345*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_EngResetKey, (void*)&pArgs);
4346*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4347*53ee8cc1Swenshuai.xi     {
4348*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4349*53ee8cc1Swenshuai.xi         return FALSE;
4350*53ee8cc1Swenshuai.xi     }
4351*53ee8cc1Swenshuai.xi 
4352*53ee8cc1Swenshuai.xi     return TRUE;
4353*53ee8cc1Swenshuai.xi #else
4354*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngResetKey(u32EngId, u32DscmbId, eEngType, eKeyType);
4355*53ee8cc1Swenshuai.xi #endif
4356*53ee8cc1Swenshuai.xi }
4357*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_EngSetCAVid(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32CAVid)4358*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_EngSetCAVid(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32CAVid)
4359*53ee8cc1Swenshuai.xi {
4360*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngSetCAVid(u32EngId, u32DscmbId, u32CAVid);
4361*53ee8cc1Swenshuai.xi }
4362*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_SetDefaultCAVid(MS_U32 u32EngId,MS_U32 u32CAVid)4363*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_SetDefaultCAVid(MS_U32 u32EngId, MS_U32 u32CAVid)
4364*53ee8cc1Swenshuai.xi {
4365*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4366*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4367*53ee8cc1Swenshuai.xi     DSCMB_DEFAULT_CAVID pArgs;
4368*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_DEFAULT_CAVID));
4369*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4370*53ee8cc1Swenshuai.xi     {
4371*53ee8cc1Swenshuai.xi         return FALSE;
4372*53ee8cc1Swenshuai.xi     }
4373*53ee8cc1Swenshuai.xi 
4374*53ee8cc1Swenshuai.xi     pArgs.u32EngId   = u32EngId;
4375*53ee8cc1Swenshuai.xi     pArgs.u32CAVid   = u32CAVid;
4376*53ee8cc1Swenshuai.xi 
4377*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_SetDefaultCAVid, (void*)&pArgs);
4378*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4379*53ee8cc1Swenshuai.xi     {
4380*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4381*53ee8cc1Swenshuai.xi         return FALSE;
4382*53ee8cc1Swenshuai.xi     }
4383*53ee8cc1Swenshuai.xi 
4384*53ee8cc1Swenshuai.xi     return TRUE;
4385*53ee8cc1Swenshuai.xi #else
4386*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_SetDefaultCAVid(u32EngId, u32CAVid);
4387*53ee8cc1Swenshuai.xi #endif
4388*53ee8cc1Swenshuai.xi }
4389*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_IsKTEValid(MS_U32 u32FltId,DSCMB_Key_Type eKeyType)4390*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_IsKTEValid(MS_U32 u32FltId, DSCMB_Key_Type eKeyType)
4391*53ee8cc1Swenshuai.xi {
4392*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_IsKTEValid (u32FltId, eKeyType);
4393*53ee8cc1Swenshuai.xi }
4394*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_SetTSPCAVid(DSCMB_TSIF eSrcTSIf,MS_U32 u32CAVid)4395*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_SetTSPCAVid(DSCMB_TSIF eSrcTSIf, MS_U32 u32CAVid)
4396*53ee8cc1Swenshuai.xi {
4397*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_SetTSPCAVid(eSrcTSIf, u32CAVid);
4398*53ee8cc1Swenshuai.xi }
4399*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_SetTSPCADst(MS_U32 u32FltId,MS_U32 u32UpDst,MS_U32 u32LowDst)4400*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_SetTSPCADst(MS_U32 u32FltId, MS_U32 u32UpDst, MS_U32 u32LowDst)
4401*53ee8cc1Swenshuai.xi {
4402*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_SetTSPCADst(u32FltId, u32UpDst, u32LowDst);
4403*53ee8cc1Swenshuai.xi }
4404*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_DualPath_Enable(MS_U32 u32EngId,MS_U32 u32FltId)4405*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_DualPath_Enable(MS_U32 u32EngId, MS_U32 u32FltId)
4406*53ee8cc1Swenshuai.xi {
4407*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4408*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4409*53ee8cc1Swenshuai.xi     DSCMB_DUALPATH pArgs;
4410*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_DUALPATH));
4411*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4412*53ee8cc1Swenshuai.xi     {
4413*53ee8cc1Swenshuai.xi         return FALSE;
4414*53ee8cc1Swenshuai.xi     }
4415*53ee8cc1Swenshuai.xi 
4416*53ee8cc1Swenshuai.xi     pArgs.u32EngId     = u32EngId;
4417*53ee8cc1Swenshuai.xi     pArgs.u32DmxFltId  = u32FltId;
4418*53ee8cc1Swenshuai.xi 
4419*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_DualPath_Enable, (void*)&pArgs);
4420*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4421*53ee8cc1Swenshuai.xi     {
4422*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4423*53ee8cc1Swenshuai.xi         return FALSE;
4424*53ee8cc1Swenshuai.xi     }
4425*53ee8cc1Swenshuai.xi 
4426*53ee8cc1Swenshuai.xi     return TRUE;
4427*53ee8cc1Swenshuai.xi #else
4428*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_DualPath_Enable(u32EngId, u32FltId);
4429*53ee8cc1Swenshuai.xi #endif
4430*53ee8cc1Swenshuai.xi }
4431*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_DualPath_Disable(MS_U32 u32EngId,MS_U32 u32FltId)4432*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_DualPath_Disable(MS_U32 u32EngId, MS_U32 u32FltId)
4433*53ee8cc1Swenshuai.xi {
4434*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4435*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4436*53ee8cc1Swenshuai.xi     DSCMB_DUALPATH pArgs;
4437*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_DUALPATH));
4438*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4439*53ee8cc1Swenshuai.xi     {
4440*53ee8cc1Swenshuai.xi         return FALSE;
4441*53ee8cc1Swenshuai.xi     }
4442*53ee8cc1Swenshuai.xi 
4443*53ee8cc1Swenshuai.xi     pArgs.u32EngId     = u32EngId;
4444*53ee8cc1Swenshuai.xi     pArgs.u32DmxFltId  = u32FltId;
4445*53ee8cc1Swenshuai.xi 
4446*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_DualPath_Disable, (void*)&pArgs);
4447*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4448*53ee8cc1Swenshuai.xi     {
4449*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4450*53ee8cc1Swenshuai.xi         return FALSE;
4451*53ee8cc1Swenshuai.xi     }
4452*53ee8cc1Swenshuai.xi 
4453*53ee8cc1Swenshuai.xi     return TRUE;
4454*53ee8cc1Swenshuai.xi #else
4455*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_DualPath_Disable(u32EngId, u32FltId);   //enable small switch pid_no dual path
4456*53ee8cc1Swenshuai.xi #endif
4457*53ee8cc1Swenshuai.xi }
4458*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_SPD_Enable(DSCMB_TSIF ePvrSrcTSIf)4459*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_SPD_Enable(DSCMB_TSIF ePvrSrcTSIf)
4460*53ee8cc1Swenshuai.xi {
4461*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_SPD_Enable(ePvrSrcTSIf);
4462*53ee8cc1Swenshuai.xi }
4463*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_SPD_Disable(DSCMB_TSIF ePvrSrcTSIf)4464*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_SPD_Disable(DSCMB_TSIF ePvrSrcTSIf)
4465*53ee8cc1Swenshuai.xi {
4466*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_SPD_Disable(ePvrSrcTSIf);
4467*53ee8cc1Swenshuai.xi }
4468*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_CAPVR_FlowSet(MS_U32 u32EngId,DSCMB_CAPVR_MODE eCaMode,DSCMB_TSIF ePvrSrcTsif)4469*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_CAPVR_FlowSet(MS_U32 u32EngId, DSCMB_CAPVR_MODE eCaMode, DSCMB_TSIF ePvrSrcTsif)
4470*53ee8cc1Swenshuai.xi {
4471*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4472*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4473*53ee8cc1Swenshuai.xi     DSCMB_CAPVR_FLOWSET pArgs;
4474*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_CAPVR_FLOWSET));
4475*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4476*53ee8cc1Swenshuai.xi     {
4477*53ee8cc1Swenshuai.xi         return FALSE;
4478*53ee8cc1Swenshuai.xi     }
4479*53ee8cc1Swenshuai.xi 
4480*53ee8cc1Swenshuai.xi     pArgs.u32EngId    = u32EngId;
4481*53ee8cc1Swenshuai.xi     pArgs.eCaMode     = eCaMode;
4482*53ee8cc1Swenshuai.xi     pArgs.ePvrSrcTsif = ePvrSrcTsif;
4483*53ee8cc1Swenshuai.xi 
4484*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_CAPVR_FlowSet, (void*)&pArgs);
4485*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4486*53ee8cc1Swenshuai.xi     {
4487*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4488*53ee8cc1Swenshuai.xi         return FALSE;
4489*53ee8cc1Swenshuai.xi     }
4490*53ee8cc1Swenshuai.xi 
4491*53ee8cc1Swenshuai.xi     return TRUE;
4492*53ee8cc1Swenshuai.xi #else
4493*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_CAPVR_FlowSet(u32EngId, eCaMode, ePvrSrcTsif);
4494*53ee8cc1Swenshuai.xi #endif
4495*53ee8cc1Swenshuai.xi }
4496*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_SetPidPair(MS_U32 u32FltIdPri,MS_U32 u32FltIdSec)4497*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_SetPidPair(MS_U32 u32FltIdPri, MS_U32 u32FltIdSec)
4498*53ee8cc1Swenshuai.xi {
4499*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_SetPidPair(u32FltIdPri, u32FltIdSec);
4500*53ee8cc1Swenshuai.xi }
4501*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_ClearPidPair(MS_U32 u32FltIdPri,MS_U32 u32FltIdSec)4502*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_ClearPidPair(MS_U32 u32FltIdPri, MS_U32 u32FltIdSec)
4503*53ee8cc1Swenshuai.xi {
4504*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_ClearPidPair(u32FltIdPri, u32FltIdSec);
4505*53ee8cc1Swenshuai.xi }
4506*53ee8cc1Swenshuai.xi 
4507*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_FltTypeSet(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Type DscmbType)4508*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_FltTypeSet(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Type DscmbType)
4509*53ee8cc1Swenshuai.xi {
4510*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4511*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4512*53ee8cc1Swenshuai.xi     DSCMB_TYPESET pArgs;
4513*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_TYPESET));
4514*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4515*53ee8cc1Swenshuai.xi     {
4516*53ee8cc1Swenshuai.xi         return FALSE;
4517*53ee8cc1Swenshuai.xi     }
4518*53ee8cc1Swenshuai.xi 
4519*53ee8cc1Swenshuai.xi     pArgs.u32EngId   = u32EngId;
4520*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId = u32DscmbId;
4521*53ee8cc1Swenshuai.xi     pArgs.eType = DscmbType;
4522*53ee8cc1Swenshuai.xi 
4523*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_FltTypeSet, (void*)&pArgs);
4524*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4525*53ee8cc1Swenshuai.xi     {
4526*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4527*53ee8cc1Swenshuai.xi         return FALSE;
4528*53ee8cc1Swenshuai.xi     }
4529*53ee8cc1Swenshuai.xi 
4530*53ee8cc1Swenshuai.xi     return TRUE;
4531*53ee8cc1Swenshuai.xi #else
4532*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltTypeSet(u32EngId, u32DscmbId, DscmbType);
4533*53ee8cc1Swenshuai.xi #endif
4534*53ee8cc1Swenshuai.xi }
4535*53ee8cc1Swenshuai.xi 
4536*53ee8cc1Swenshuai.xi 
4537*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_FltKeySet(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Key_Type eKeyType,MS_U8 * pu8Key)4538*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_FltKeySet(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Key_Type eKeyType, MS_U8* pu8Key)
4539*53ee8cc1Swenshuai.xi {
4540*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4541*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4542*53ee8cc1Swenshuai.xi     DSCMB_FLTKEYSET pArgs;
4543*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_FLTKEYSET));
4544*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4545*53ee8cc1Swenshuai.xi     {
4546*53ee8cc1Swenshuai.xi         return FALSE;
4547*53ee8cc1Swenshuai.xi     }
4548*53ee8cc1Swenshuai.xi 
4549*53ee8cc1Swenshuai.xi     pArgs.u32EngId      = u32EngId;
4550*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId    = u32DscmbId;
4551*53ee8cc1Swenshuai.xi     pArgs.eKeyType      = eKeyType;
4552*53ee8cc1Swenshuai.xi     pArgs.pu8Key        = pu8Key;
4553*53ee8cc1Swenshuai.xi 
4554*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_FltKeySet, (void*)&pArgs);
4555*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4556*53ee8cc1Swenshuai.xi     {
4557*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4558*53ee8cc1Swenshuai.xi         return FALSE;
4559*53ee8cc1Swenshuai.xi     }
4560*53ee8cc1Swenshuai.xi 
4561*53ee8cc1Swenshuai.xi     return TRUE;
4562*53ee8cc1Swenshuai.xi #else
4563*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltKeySet(u32EngId, u32DscmbId, eKeyType, pu8Key);
4564*53ee8cc1Swenshuai.xi #endif
4565*53ee8cc1Swenshuai.xi }
4566*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_FltIVSet(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Key_Type eKeyType,MS_U8 * pu8IV)4567*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_FltIVSet(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Key_Type eKeyType, MS_U8* pu8IV)
4568*53ee8cc1Swenshuai.xi {
4569*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4570*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4571*53ee8cc1Swenshuai.xi     DSCMB_FLTIVSET pArgs;
4572*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_FLTIVSET));
4573*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4574*53ee8cc1Swenshuai.xi     {
4575*53ee8cc1Swenshuai.xi         return FALSE;
4576*53ee8cc1Swenshuai.xi     }
4577*53ee8cc1Swenshuai.xi 
4578*53ee8cc1Swenshuai.xi     pArgs.u32EngId      = u32EngId;
4579*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId    = u32DscmbId;
4580*53ee8cc1Swenshuai.xi     pArgs.eKeyType      = eKeyType;
4581*53ee8cc1Swenshuai.xi     pArgs.pu8IV         = pu8IV;
4582*53ee8cc1Swenshuai.xi 
4583*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_FltIVSet, (void*)&pArgs);
4584*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4585*53ee8cc1Swenshuai.xi     {
4586*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4587*53ee8cc1Swenshuai.xi         return FALSE;
4588*53ee8cc1Swenshuai.xi     }
4589*53ee8cc1Swenshuai.xi 
4590*53ee8cc1Swenshuai.xi     return TRUE;
4591*53ee8cc1Swenshuai.xi #else
4592*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltIVSet(u32EngId, u32DscmbId, eKeyType, pu8IV);
4593*53ee8cc1Swenshuai.xi #endif
4594*53ee8cc1Swenshuai.xi }
4595*53ee8cc1Swenshuai.xi 
4596*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_FltKeyReset(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Key_Type eKeyType)4597*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_FltKeyReset(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Key_Type eKeyType)
4598*53ee8cc1Swenshuai.xi {
4599*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4600*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4601*53ee8cc1Swenshuai.xi     DSCMB_FLTKEYRESET pArgs;
4602*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_FLTKEYRESET));
4603*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4604*53ee8cc1Swenshuai.xi     {
4605*53ee8cc1Swenshuai.xi         return FALSE;
4606*53ee8cc1Swenshuai.xi     }
4607*53ee8cc1Swenshuai.xi 
4608*53ee8cc1Swenshuai.xi     pArgs.u32EngId = u32EngId;
4609*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId = u32DscmbId;
4610*53ee8cc1Swenshuai.xi     pArgs.eKeyType = eKeyType;
4611*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_FltKeyReset, (void*)&pArgs);
4612*53ee8cc1Swenshuai.xi 
4613*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4614*53ee8cc1Swenshuai.xi     {
4615*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4616*53ee8cc1Swenshuai.xi         return FALSE;
4617*53ee8cc1Swenshuai.xi     }
4618*53ee8cc1Swenshuai.xi 
4619*53ee8cc1Swenshuai.xi     return TRUE;
4620*53ee8cc1Swenshuai.xi #else
4621*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltKeyReset(u32EngId, u32DscmbId, eKeyType);
4622*53ee8cc1Swenshuai.xi #endif
4623*53ee8cc1Swenshuai.xi }
4624*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_FltDscmb(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_BOOL bDscmb)4625*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_FltDscmb(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_BOOL bDscmb)
4626*53ee8cc1Swenshuai.xi {
4627*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4628*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4629*53ee8cc1Swenshuai.xi     DSCMB_FLTDSCMB pArgs;
4630*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_FLTDSCMB));
4631*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4632*53ee8cc1Swenshuai.xi     {
4633*53ee8cc1Swenshuai.xi         return FALSE;
4634*53ee8cc1Swenshuai.xi     }
4635*53ee8cc1Swenshuai.xi 
4636*53ee8cc1Swenshuai.xi     pArgs.u32EngId = u32EngId;
4637*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId = u32DscmbId;
4638*53ee8cc1Swenshuai.xi     pArgs.bDscmb = bDscmb;
4639*53ee8cc1Swenshuai.xi 
4640*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_FltDscmb, (void*)&pArgs);
4641*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4642*53ee8cc1Swenshuai.xi     {
4643*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4644*53ee8cc1Swenshuai.xi         return FALSE;
4645*53ee8cc1Swenshuai.xi     }
4646*53ee8cc1Swenshuai.xi 
4647*53ee8cc1Swenshuai.xi     return TRUE;
4648*53ee8cc1Swenshuai.xi #else
4649*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltDscmb(u32EngId, u32DscmbId, bDscmb);
4650*53ee8cc1Swenshuai.xi #endif
4651*53ee8cc1Swenshuai.xi }
4652*53ee8cc1Swenshuai.xi 
4653*53ee8cc1Swenshuai.xi #if !(defined(MSOS_TYPE_OPTEE) || defined(MSOS_TYPE_NUTTX))
MDrv_DSCMB2_FltDisconnectPid_Ex(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32Pid)4654*53ee8cc1Swenshuai.xi DLL_PUBLIC MS_BOOL MDrv_DSCMB2_FltDisconnectPid_Ex(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32Pid)
4655*53ee8cc1Swenshuai.xi {
4656*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4657*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4658*53ee8cc1Swenshuai.xi     DSCMB_DISCONNECTPID pArgs;
4659*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_DISCONNECTPID));
4660*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4661*53ee8cc1Swenshuai.xi     {
4662*53ee8cc1Swenshuai.xi         return FALSE;
4663*53ee8cc1Swenshuai.xi     }
4664*53ee8cc1Swenshuai.xi 
4665*53ee8cc1Swenshuai.xi     pArgs.u32EngId = u32EngId;
4666*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId = u32DscmbId;
4667*53ee8cc1Swenshuai.xi     pArgs.u32Pid = u32Pid;
4668*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_FltDisconnectPid, (void*)&pArgs);
4669*53ee8cc1Swenshuai.xi 
4670*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4671*53ee8cc1Swenshuai.xi     {
4672*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4673*53ee8cc1Swenshuai.xi         return FALSE;
4674*53ee8cc1Swenshuai.xi     }
4675*53ee8cc1Swenshuai.xi 
4676*53ee8cc1Swenshuai.xi     return TRUE;
4677*53ee8cc1Swenshuai.xi #else
4678*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltDisconnectPid_Ex(u32EngId, u32DscmbId, u32Pid);
4679*53ee8cc1Swenshuai.xi #endif
4680*53ee8cc1Swenshuai.xi 
4681*53ee8cc1Swenshuai.xi }
4682*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_FltConnectPid(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32Pid)4683*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_FltConnectPid(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32Pid)
4684*53ee8cc1Swenshuai.xi {
4685*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4686*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4687*53ee8cc1Swenshuai.xi     DSCMB_CONNECTPID pArgs;
4688*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_CONNECTPID));
4689*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4690*53ee8cc1Swenshuai.xi     {
4691*53ee8cc1Swenshuai.xi         return FALSE;
4692*53ee8cc1Swenshuai.xi     }
4693*53ee8cc1Swenshuai.xi 
4694*53ee8cc1Swenshuai.xi     pArgs.u32EngId = u32EngId;
4695*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId = u32DscmbId;
4696*53ee8cc1Swenshuai.xi     pArgs.u32Pid = u32Pid;
4697*53ee8cc1Swenshuai.xi 
4698*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_FltConnectPid, (void*)&pArgs);
4699*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4700*53ee8cc1Swenshuai.xi     {
4701*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4702*53ee8cc1Swenshuai.xi         return FALSE;
4703*53ee8cc1Swenshuai.xi     }
4704*53ee8cc1Swenshuai.xi 
4705*53ee8cc1Swenshuai.xi     return TRUE;
4706*53ee8cc1Swenshuai.xi #else
4707*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltConnectPid(u32EngId, u32DscmbId, u32Pid);
4708*53ee8cc1Swenshuai.xi #endif
4709*53ee8cc1Swenshuai.xi }
4710*53ee8cc1Swenshuai.xi 
4711*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_FltDisconnectPid(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32Pid)4712*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_FltDisconnectPid(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32Pid)
4713*53ee8cc1Swenshuai.xi {
4714*53ee8cc1Swenshuai.xi     return MDrv_DSCMB2_FltDisconnectPid_Ex(u32EngId, u32DscmbId, u32Pid);
4715*53ee8cc1Swenshuai.xi }
4716*53ee8cc1Swenshuai.xi #endif
4717*53ee8cc1Swenshuai.xi 
4718*53ee8cc1Swenshuai.xi //----------------------------------------------------------------------//
4719*53ee8cc1Swenshuai.xi //                   New Interface for K3 Series                        //
4720*53ee8cc1Swenshuai.xi //----------------------------------------------------------------------//
MDrv_DSCMB2_KLadder_AtomicExec(DSCMB_KLCfg_All * KLCfg,MS_U8 * ACPU_Out,DSCMB_KL_Status * u32Status)4721*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_KLadder_AtomicExec(DSCMB_KLCfg_All* KLCfg , MS_U8 *ACPU_Out, DSCMB_KL_Status* u32Status)
4722*53ee8cc1Swenshuai.xi {
4723*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4724*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4725*53ee8cc1Swenshuai.xi     DSCMB_KL_ATOMICEXEC pArgs;
4726*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_KL_ATOMICEXEC));
4727*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4728*53ee8cc1Swenshuai.xi     {
4729*53ee8cc1Swenshuai.xi         return FALSE;
4730*53ee8cc1Swenshuai.xi     }
4731*53ee8cc1Swenshuai.xi 
4732*53ee8cc1Swenshuai.xi     pArgs.KLCfg     = KLCfg;
4733*53ee8cc1Swenshuai.xi     pArgs.ACPU_Out  = ACPU_Out;
4734*53ee8cc1Swenshuai.xi     pArgs.u32Status = u32Status;
4735*53ee8cc1Swenshuai.xi 
4736*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_KLadder_AtomicExec, (void*)&pArgs);
4737*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4738*53ee8cc1Swenshuai.xi     {
4739*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4740*53ee8cc1Swenshuai.xi         return FALSE;
4741*53ee8cc1Swenshuai.xi     }
4742*53ee8cc1Swenshuai.xi 
4743*53ee8cc1Swenshuai.xi     return TRUE;
4744*53ee8cc1Swenshuai.xi 
4745*53ee8cc1Swenshuai.xi #else
4746*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_KLadder_AtomicExec(KLCfg, ACPU_Out, u32Status);
4747*53ee8cc1Swenshuai.xi #endif
4748*53ee8cc1Swenshuai.xi }
4749*53ee8cc1Swenshuai.xi 
4750*53ee8cc1Swenshuai.xi 
4751*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
4752*53ee8cc1Swenshuai.xi /// An atomic Key ladder function for TCSA3 Key generation.
4753*53ee8cc1Swenshuai.xi /// Thread safe for cuncurrent usage.
4754*53ee8cc1Swenshuai.xi /// @param KLCfg\b IN: KL execution setting for target key generation
4755*53ee8cc1Swenshuai.xi /// @param ACPU_Out\b IN: A 16 bytes array pointer for Acpu key output.
4756*53ee8cc1Swenshuai.xi /// @param u32Status\b IN: Key ladder running status
4757*53ee8cc1Swenshuai.xi /// @return TRUE - Success
4758*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
4759*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
4760*53ee8cc1Swenshuai.xi #if 0
4761*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_KLadder_TCSA3(DSCMB_KLCfg_All* KLCfg , MS_U8 *pu8ActCode, MS_U32 u32CHSel, DSCMB_KL_Status* u32Status )
4762*53ee8cc1Swenshuai.xi {
4763*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_KLadder_TCSA3(KLCfg, pu8ActCode, u32CHSel, u32Status);
4764*53ee8cc1Swenshuai.xi }
4765*53ee8cc1Swenshuai.xi #endif
4766*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_KLadder_ETSI(DSCMB_KLCfg_All * KLCfg,MS_U8 * ACPU_Out,MS_U8 * pu8Nonce,MS_U8 * pu8Response,DSCMB_KL_Status * u32Status)4767*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_KLadder_ETSI(DSCMB_KLCfg_All* KLCfg , MS_U8 *ACPU_Out, MS_U8 *pu8Nonce, MS_U8 *pu8Response, DSCMB_KL_Status* u32Status )
4768*53ee8cc1Swenshuai.xi {
4769*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
4770*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
4771*53ee8cc1Swenshuai.xi     DSCMB_KL_ETSI pArgs;
4772*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_KL_ETSI));
4773*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
4774*53ee8cc1Swenshuai.xi     {
4775*53ee8cc1Swenshuai.xi         return FALSE;
4776*53ee8cc1Swenshuai.xi     }
4777*53ee8cc1Swenshuai.xi     pArgs.KLCfg       = KLCfg;
4778*53ee8cc1Swenshuai.xi     pArgs.ACPU_Out    = ACPU_Out;
4779*53ee8cc1Swenshuai.xi     pArgs.pu8Nonce    = pu8Nonce;
4780*53ee8cc1Swenshuai.xi     pArgs.pu8Response = pu8Response;
4781*53ee8cc1Swenshuai.xi     pArgs.u32Status   = u32Status;
4782*53ee8cc1Swenshuai.xi 
4783*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_KLadder_ETSI, &pArgs);
4784*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
4785*53ee8cc1Swenshuai.xi     {
4786*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
4787*53ee8cc1Swenshuai.xi         return FALSE;
4788*53ee8cc1Swenshuai.xi     }
4789*53ee8cc1Swenshuai.xi 
4790*53ee8cc1Swenshuai.xi     return TRUE;
4791*53ee8cc1Swenshuai.xi 
4792*53ee8cc1Swenshuai.xi #else
4793*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_KLadder_ETSI(KLCfg, ACPU_Out, pu8Nonce, pu8Response, u32Status);
4794*53ee8cc1Swenshuai.xi #endif
4795*53ee8cc1Swenshuai.xi }
4796*53ee8cc1Swenshuai.xi 
4797*53ee8cc1Swenshuai.xi #if 0
4798*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_KLadder_TA(DSCMB_KLCfg_All* KLCfg , MS_U8* ACPU_Out, DSCMB_KL_Status* u32Status)
4799*53ee8cc1Swenshuai.xi {
4800*53ee8cc1Swenshuai.xi     DSCMB_INIT_CHECK(FALSE);
4801*53ee8cc1Swenshuai.xi 
4802*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
4803*53ee8cc1Swenshuai.xi     MS_U32 u32ErrMsg = 0;
4804*53ee8cc1Swenshuai.xi     *u32Status = KL_STATUS_KEY_OK ;
4805*53ee8cc1Swenshuai.xi     DSCMB_KL_SelEng eKLEng = KLCfg->eKLSel;
4806*53ee8cc1Swenshuai.xi     MS_U32 u32FltId = 0;
4807*53ee8cc1Swenshuai.xi     MS_U32 u32Field = 0;
4808*53ee8cc1Swenshuai.xi     DSCMB_KLDst eKLDst = KLCfg->eDst;
4809*53ee8cc1Swenshuai.xi     MS_U32 u32CAVid = KLCfg->u32CAVid;
4810*53ee8cc1Swenshuai.xi 
4811*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Lock();
4812*53ee8cc1Swenshuai.xi     ///translate cavid to Default CAVID if user set input cavid to 0x0
4813*53ee8cc1Swenshuai.xi     if(u32CAVid == 0)
4814*53ee8cc1Swenshuai.xi     {
4815*53ee8cc1Swenshuai.xi         u32CAVid = DEFAULT_CAVID;
4816*53ee8cc1Swenshuai.xi     }
4817*53ee8cc1Swenshuai.xi 
4818*53ee8cc1Swenshuai.xi     /////////////// Check Source and acpu data ////////////////////
4819*53ee8cc1Swenshuai.xi     if ((E_DSCMB_KL_SRC_ACPU == KLCfg->eSrc) && (NULL == KLCfg->u8KeyACPU))
4820*53ee8cc1Swenshuai.xi     {
4821*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_ACPU_KEY_NULL;
4822*53ee8cc1Swenshuai.xi         goto KL_Fail;
4823*53ee8cc1Swenshuai.xi     }
4824*53ee8cc1Swenshuai.xi 
4825*53ee8cc1Swenshuai.xi     /////////////// Check KL level ////////////////////
4826*53ee8cc1Swenshuai.xi     if((KLCfg->u32Level >3) && (KLCfg->u32Level != 9) && (KLCfg->u32Level != 0xD))
4827*53ee8cc1Swenshuai.xi     {
4828*53ee8cc1Swenshuai.xi         //bKeepRound = TRUE ;
4829*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_INVALID_INPUT_LEVEL;
4830*53ee8cc1Swenshuai.xi         goto KL_Fail;
4831*53ee8cc1Swenshuai.xi     }
4832*53ee8cc1Swenshuai.xi     else if(( 0 == KLCfg->u32Level ) && (0==(DSCMB_KL_DST_CLASS_DMA & eKLDst)))
4833*53ee8cc1Swenshuai.xi     {
4834*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_INVALID_INPUT_LEVEL;
4835*53ee8cc1Swenshuai.xi         goto KL_Fail;
4836*53ee8cc1Swenshuai.xi     }
4837*53ee8cc1Swenshuai.xi 
4838*53ee8cc1Swenshuai.xi     ////////////// check Key destination ///////////////
4839*53ee8cc1Swenshuai.xi     /// Compatible and translate old version to new version
4840*53ee8cc1Swenshuai.xi     if( ((KLCfg->eDst & 0xF0) == 0) && ( (KLCfg->eDst & 0x0F) > 0 )) //OLD Destination
4841*53ee8cc1Swenshuai.xi     {
4842*53ee8cc1Swenshuai.xi         switch(KLCfg->eDst)
4843*53ee8cc1Swenshuai.xi         {
4844*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_ACPU:
4845*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_CPU_ACPU;
4846*53ee8cc1Swenshuai.xi                 break;
4847*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_KT_NSA:
4848*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_KT_ESA;
4849*53ee8cc1Swenshuai.xi                 break;
4850*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_DMA_AES:
4851*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_DMA_SK0;
4852*53ee8cc1Swenshuai.xi                 break;
4853*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_DMA_TDES:
4854*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_DMA_SK0;
4855*53ee8cc1Swenshuai.xi                 break;
4856*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_PRIVATE0:
4857*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_PRIVATE_0;
4858*53ee8cc1Swenshuai.xi                 break;
4859*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_PRIVATE1:
4860*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_PRIVATE_1;
4861*53ee8cc1Swenshuai.xi                 break;
4862*53ee8cc1Swenshuai.xi             case E_DSCMB_KL_DST_PRIVATE2:
4863*53ee8cc1Swenshuai.xi                 eKLDst = E_DSCMB_KL_DST_PRIVATE_2;
4864*53ee8cc1Swenshuai.xi                 break;
4865*53ee8cc1Swenshuai.xi             default:
4866*53ee8cc1Swenshuai.xi                 ;
4867*53ee8cc1Swenshuai.xi         }
4868*53ee8cc1Swenshuai.xi     }
4869*53ee8cc1Swenshuai.xi 
4870*53ee8cc1Swenshuai.xi     if (E_DSCMB_KL_DST_CPU_ACPU == eKLDst)
4871*53ee8cc1Swenshuai.xi     {
4872*53ee8cc1Swenshuai.xi         //KL to ACPU
4873*53ee8cc1Swenshuai.xi         if(NULL == ACPU_Out)
4874*53ee8cc1Swenshuai.xi         {
4875*53ee8cc1Swenshuai.xi             *u32Status = KL_STATUS_ACPU_OUTKEY_NULL;
4876*53ee8cc1Swenshuai.xi             goto KL_Fail;
4877*53ee8cc1Swenshuai.xi         }
4878*53ee8cc1Swenshuai.xi     }
4879*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_KT & eKLDst)
4880*53ee8cc1Swenshuai.xi     {
4881*53ee8cc1Swenshuai.xi         //KL to KT
4882*53ee8cc1Swenshuai.xi         if ( FALSE == DscmbTspMap[KLCfg->u32EngID][KLCfg->u32DscID].bUsed )
4883*53ee8cc1Swenshuai.xi         {
4884*53ee8cc1Swenshuai.xi             //The keyslot is not allocated for the DSCMB ID
4885*53ee8cc1Swenshuai.xi             *u32Status = KL_STATUS_IVALID_DSCMB_ID;
4886*53ee8cc1Swenshuai.xi             goto KL_Fail;
4887*53ee8cc1Swenshuai.xi         }
4888*53ee8cc1Swenshuai.xi         if( 0 == DscmbTspMap[KLCfg->u32EngID][KLCfg->u32DscID].u32PidFltIdNum )
4889*53ee8cc1Swenshuai.xi         {
4890*53ee8cc1Swenshuai.xi             //No pid filter is connected to the DSCMB ID
4891*53ee8cc1Swenshuai.xi             *u32Status = KL_STATUS_IVALID_DSCMB_ID;
4892*53ee8cc1Swenshuai.xi             goto KL_Fail;
4893*53ee8cc1Swenshuai.xi         }
4894*53ee8cc1Swenshuai.xi 
4895*53ee8cc1Swenshuai.xi         // Get Filter ID
4896*53ee8cc1Swenshuai.xi         if(FALSE == _DSCMB_Dscmb2Flt(KLCfg->u32DscID, &u32FltId))
4897*53ee8cc1Swenshuai.xi         {
4898*53ee8cc1Swenshuai.xi             *u32Status = KL_STATUS_IVALID_DSCMB_ID;
4899*53ee8cc1Swenshuai.xi             goto KL_Fail;
4900*53ee8cc1Swenshuai.xi         }
4901*53ee8cc1Swenshuai.xi 
4902*53ee8cc1Swenshuai.xi         // Get Field
4903*53ee8cc1Swenshuai.xi 
4904*53ee8cc1Swenshuai.xi     }
4905*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_DMA & eKLDst)
4906*53ee8cc1Swenshuai.xi     {
4907*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Keyladder destination DMA class\n");
4908*53ee8cc1Swenshuai.xi     }
4909*53ee8cc1Swenshuai.xi     else if(DSCMB_KL_DST_CLASS_PVT &eKLDst)
4910*53ee8cc1Swenshuai.xi     {
4911*53ee8cc1Swenshuai.xi         //KL to PVT
4912*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Keyladder destination Private Key class\n");
4913*53ee8cc1Swenshuai.xi     }
4914*53ee8cc1Swenshuai.xi     else
4915*53ee8cc1Swenshuai.xi     {
4916*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Unknown Keyladder destination\n");
4917*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_KL_INPUT_NULL;
4918*53ee8cc1Swenshuai.xi         goto KL_Fail;
4919*53ee8cc1Swenshuai.xi     }
4920*53ee8cc1Swenshuai.xi 
4921*53ee8cc1Swenshuai.xi     //Check KeyLadder Input
4922*53ee8cc1Swenshuai.xi     if ((KLCfg->u32Level != 0) && (NULL == KLCfg->pu8KeyKLIn))
4923*53ee8cc1Swenshuai.xi     {
4924*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_KL_INPUT_NULL;
4925*53ee8cc1Swenshuai.xi         goto KL_Fail;
4926*53ee8cc1Swenshuai.xi     }
4927*53ee8cc1Swenshuai.xi 
4928*53ee8cc1Swenshuai.xi     if((_u8KLPreLevel == 9) || ((_u8KLPreLevel == 9) && (KLCfg->u32Level == 1)))
4929*53ee8cc1Swenshuai.xi     {
4930*53ee8cc1Swenshuai.xi         _u8KLPreLevel = KLCfg->u32Level;
4931*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_DEBUG, "Keyladder keep round and not reset \n");
4932*53ee8cc1Swenshuai.xi     }
4933*53ee8cc1Swenshuai.xi     else
4934*53ee8cc1Swenshuai.xi     {
4935*53ee8cc1Swenshuai.xi         _u8KLPreLevel = KLCfg->u32Level;
4936*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_Reset(eKLEng);
4937*53ee8cc1Swenshuai.xi     }
4938*53ee8cc1Swenshuai.xi 
4939*53ee8cc1Swenshuai.xi     if(E_DSCMB_KL_SRC_ACPU == KLCfg->eSrc)
4940*53ee8cc1Swenshuai.xi     {
4941*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_ACPURootKey(eKLEng, KLCfg->u8KeyACPU);
4942*53ee8cc1Swenshuai.xi     }
4943*53ee8cc1Swenshuai.xi 
4944*53ee8cc1Swenshuai.xi 
4945*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_INFO, "u32CAVid=%lX\n", (unsigned long)u32CAVid);
4946*53ee8cc1Swenshuai.xi     //FIXME: If Key from OTP, should we set usage & entropy ?
4947*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_KeyProp( eKLEng, u32CAVid, 0 , /*Usage*/ 0 /*Entropy*/);
4948*53ee8cc1Swenshuai.xi 
4949*53ee8cc1Swenshuai.xi     // Set KL Level input //
4950*53ee8cc1Swenshuai.xi     if(KLCfg->u32Level == 9) //Keep round, 1 stage
4951*53ee8cc1Swenshuai.xi     {
4952*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_Input(eKLEng, 0, KLCfg->pu8KeyKLIn);
4953*53ee8cc1Swenshuai.xi     }
4954*53ee8cc1Swenshuai.xi     else if(KLCfg->u32Level == 0xD) //SMI Keyladder
4955*53ee8cc1Swenshuai.xi     {
4956*53ee8cc1Swenshuai.xi         for( i = 0 ; i < 5 ; i ++ )
4957*53ee8cc1Swenshuai.xi         {
4958*53ee8cc1Swenshuai.xi             HAL_DSCMB_KL_Input(eKLEng, (4 - i), KLCfg->pu8KeyKLIn+(16*i));
4959*53ee8cc1Swenshuai.xi         }
4960*53ee8cc1Swenshuai.xi     }
4961*53ee8cc1Swenshuai.xi     else if(KLCfg->u32Level <= 3) //0~3 level keyladder
4962*53ee8cc1Swenshuai.xi     {
4963*53ee8cc1Swenshuai.xi         for( i = 0 ; i < KLCfg->u32Level ; i ++ )
4964*53ee8cc1Swenshuai.xi         {
4965*53ee8cc1Swenshuai.xi             HAL_DSCMB_KL_Input(eKLEng, (KLCfg->u32Level-i-1), KLCfg->pu8KeyKLIn+(16*i));
4966*53ee8cc1Swenshuai.xi         }
4967*53ee8cc1Swenshuai.xi     }
4968*53ee8cc1Swenshuai.xi     else
4969*53ee8cc1Swenshuai.xi     {
4970*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "Unknown Keyladder type(level) setting\n");
4971*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_INVALID_INPUT_LEVEL;
4972*53ee8cc1Swenshuai.xi         goto KL_Fail;
4973*53ee8cc1Swenshuai.xi     }
4974*53ee8cc1Swenshuai.xi 
4975*53ee8cc1Swenshuai.xi     //Set Transformed Algorithm EncCW
4976*53ee8cc1Swenshuai.xi     if(FALSE == HAL_DSCMB_KL_TA_EncCW(eKLEng, KLCfg->pu8KeyKLIn+(16*(KLCfg->u32Level-1)) ))
4977*53ee8cc1Swenshuai.xi     {
4978*53ee8cc1Swenshuai.xi         *u32Status = KL_STATUS_KL_INPUT_NULL;
4979*53ee8cc1Swenshuai.xi         goto KL_Fail;
4980*53ee8cc1Swenshuai.xi     }
4981*53ee8cc1Swenshuai.xi     //Set Transformed Algorithm LUT3 table address
4982*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_TA_LUT3(eKLEng, NULL);
4983*53ee8cc1Swenshuai.xi 
4984*53ee8cc1Swenshuai.xi     //Enable TA and lock LUT3 table and KL SRAM
4985*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_TA_EN(eKLEng, TRUE);
4986*53ee8cc1Swenshuai.xi 
4987*53ee8cc1Swenshuai.xi     // Set KL Ctrl
4988*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_Ctrl(eKLEng, KLCfg->eAlgo,
4989*53ee8cc1Swenshuai.xi                       KLCfg->u32Level,
4990*53ee8cc1Swenshuai.xi                       KLCfg->eSrc,
4991*53ee8cc1Swenshuai.xi                       eKLDst);
4992*53ee8cc1Swenshuai.xi 
4993*53ee8cc1Swenshuai.xi     if (DSCMB_KL_DST_CLASS_CPU & eKLDst)
4994*53ee8cc1Swenshuai.xi     {
4995*53ee8cc1Swenshuai.xi         // KL flow for ACPU output //
4996*53ee8cc1Swenshuai.xi 
4997*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
4998*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
4999*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
5000*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
5001*53ee8cc1Swenshuai.xi                             0);               /*For Dst DMA*/
5002*53ee8cc1Swenshuai.xi     }
5003*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_DMA & eKLDst)
5004*53ee8cc1Swenshuai.xi     {
5005*53ee8cc1Swenshuai.xi         // KL flow for output  to CryptoDMA  //
5006*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
5007*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
5008*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
5009*53ee8cc1Swenshuai.xi                             0,                /*For Dst KT*/
5010*53ee8cc1Swenshuai.xi                             eKLDst);          /*For Dst DMA*/
5011*53ee8cc1Swenshuai.xi     }
5012*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_KT & eKLDst)
5013*53ee8cc1Swenshuai.xi     {
5014*53ee8cc1Swenshuai.xi         // KL flow for output  to KTE //
5015*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
5016*53ee8cc1Swenshuai.xi                             u32FltId,               /*For Dst KT*/
5017*53ee8cc1Swenshuai.xi                             u32Field,               /*For Dst KT*/
5018*53ee8cc1Swenshuai.xi                             KLCfg->eKeyType,        /*For Dst KT*/
5019*53ee8cc1Swenshuai.xi                             eKLDst);                 /*For Dst KT*/
5020*53ee8cc1Swenshuai.xi     }
5021*53ee8cc1Swenshuai.xi     else if (DSCMB_KL_DST_CLASS_PVT & eKLDst)
5022*53ee8cc1Swenshuai.xi     {
5023*53ee8cc1Swenshuai.xi         // KL flow for output  to PVT //
5024*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_KeyBus(eKLEng,
5025*53ee8cc1Swenshuai.xi                             0,               /*For Dst KT*/
5026*53ee8cc1Swenshuai.xi                             0,               /*For Dst KT*/
5027*53ee8cc1Swenshuai.xi                             0,               /*For Dst KT*/
5028*53ee8cc1Swenshuai.xi                             0);              /*For Dst DMA*/
5029*53ee8cc1Swenshuai.xi     }
5030*53ee8cc1Swenshuai.xi 
5031*53ee8cc1Swenshuai.xi     if(HAL_DSCMB_KL_Start(eKLEng) == FALSE)
5032*53ee8cc1Swenshuai.xi     {
5033*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_ErrMsg(eKLEng, &u32ErrMsg);
5034*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "\033[31m KL error message 0x%X\n\033[m", (unsigned int)u32ErrMsg);
5035*53ee8cc1Swenshuai.xi         goto KL_Fail;
5036*53ee8cc1Swenshuai.xi     }
5037*53ee8cc1Swenshuai.xi 
5038*53ee8cc1Swenshuai.xi     // enable key
5039*53ee8cc1Swenshuai.xi     if (DSCMB_KL_DST_CLASS_KT & eKLDst)
5040*53ee8cc1Swenshuai.xi     {
5041*53ee8cc1Swenshuai.xi         DSCMB_Eng_Type eEngType = E_DSCMB_ENG_ESA;
5042*53ee8cc1Swenshuai.xi         if(eKLDst == E_DSCMB_KL_DST_KT_ESA )
5043*53ee8cc1Swenshuai.xi         {
5044*53ee8cc1Swenshuai.xi             eEngType = E_DSCMB_ENG_ESA;
5045*53ee8cc1Swenshuai.xi         }
5046*53ee8cc1Swenshuai.xi         else if(eKLDst == E_DSCMB_KL_DST_KT_LSAS )
5047*53ee8cc1Swenshuai.xi         {
5048*53ee8cc1Swenshuai.xi             eEngType = E_DSCMB_ENG_LSAS;
5049*53ee8cc1Swenshuai.xi         }
5050*53ee8cc1Swenshuai.xi         else if(eKLDst == E_DSCMB_KL_DST_KT_LSAD )
5051*53ee8cc1Swenshuai.xi         {
5052*53ee8cc1Swenshuai.xi             eEngType = E_DSCMB_ENG_LSAD;
5053*53ee8cc1Swenshuai.xi         }
5054*53ee8cc1Swenshuai.xi 
5055*53ee8cc1Swenshuai.xi         if (FALSE == HAL_DSCMB_KTE_Key_Ctrl_Ex(u32FltId,
5056*53ee8cc1Swenshuai.xi                                             KLCfg->eKeyType,
5057*53ee8cc1Swenshuai.xi                                             eEngType,
5058*53ee8cc1Swenshuai.xi                                             KLCfg->u32CAVid,
5059*53ee8cc1Swenshuai.xi                                             TRUE,
5060*53ee8cc1Swenshuai.xi                                             TRUE))
5061*53ee8cc1Swenshuai.xi         {
5062*53ee8cc1Swenshuai.xi             *u32Status = KL_STATUS_KL_INPUT_NULL;
5063*53ee8cc1Swenshuai.xi             goto KL_Fail;
5064*53ee8cc1Swenshuai.xi         }
5065*53ee8cc1Swenshuai.xi     }
5066*53ee8cc1Swenshuai.xi 
5067*53ee8cc1Swenshuai.xi     //Output to ACPU
5068*53ee8cc1Swenshuai.xi     if (E_DSCMB_KL_DST_CPU_ACPU == eKLDst)
5069*53ee8cc1Swenshuai.xi     {
5070*53ee8cc1Swenshuai.xi         MS_U32 u32OutKeySize = 0;
5071*53ee8cc1Swenshuai.xi         if(KLCfg->eOutsize == E_DSCMB_KL_64_BITS)
5072*53ee8cc1Swenshuai.xi         {
5073*53ee8cc1Swenshuai.xi             u32OutKeySize = 8;
5074*53ee8cc1Swenshuai.xi         }
5075*53ee8cc1Swenshuai.xi         else if(KLCfg->eOutsize == E_DSCMB_KL_128_BITS)
5076*53ee8cc1Swenshuai.xi         {
5077*53ee8cc1Swenshuai.xi             u32OutKeySize = 16;
5078*53ee8cc1Swenshuai.xi         }
5079*53ee8cc1Swenshuai.xi         memset(ACPU_Out , 0x0 , u32OutKeySize );
5080*53ee8cc1Swenshuai.xi         HAL_DSCMB_KL_GetACPUOut(eKLEng,ACPU_Out,u32OutKeySize);
5081*53ee8cc1Swenshuai.xi     }
5082*53ee8cc1Swenshuai.xi 
5083*53ee8cc1Swenshuai.xi     //Unlock LUT3 table and KL SRAM
5084*53ee8cc1Swenshuai.xi     HAL_DSCMB_KL_TA_EN(eKLEng, FALSE);
5085*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Unlock();
5086*53ee8cc1Swenshuai.xi     return TRUE;
5087*53ee8cc1Swenshuai.xi 
5088*53ee8cc1Swenshuai.xi 
5089*53ee8cc1Swenshuai.xi KL_Fail:
5090*53ee8cc1Swenshuai.xi 
5091*53ee8cc1Swenshuai.xi 
5092*53ee8cc1Swenshuai.xi #if 0
5093*53ee8cc1Swenshuai.xi 
5094*53ee8cc1Swenshuai.xi     i = HAL_DSCMB_KLadder_Status();
5095*53ee8cc1Swenshuai.xi     if ( i != 0 )
5096*53ee8cc1Swenshuai.xi     {
5097*53ee8cc1Swenshuai.xi         //printf("KL Satus = %x \n",i );
5098*53ee8cc1Swenshuai.xi         *u32Status |= i ;
5099*53ee8cc1Swenshuai.xi     }
5100*53ee8cc1Swenshuai.xi 
5101*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Stop();
5102*53ee8cc1Swenshuai.xi #endif
5103*53ee8cc1Swenshuai.xi 
5104*53ee8cc1Swenshuai.xi     MDrv_DSCMB_KLadder_Unlock();
5105*53ee8cc1Swenshuai.xi     DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "DSCMB KL Fail = %08lX \n",(unsigned long)*u32Status);
5106*53ee8cc1Swenshuai.xi 
5107*53ee8cc1Swenshuai.xi     DSCMB_ASSERT_AND_RETURN(FALSE);
5108*53ee8cc1Swenshuai.xi 
5109*53ee8cc1Swenshuai.xi     return FALSE;
5110*53ee8cc1Swenshuai.xi 
5111*53ee8cc1Swenshuai.xi }
5112*53ee8cc1Swenshuai.xi #endif
5113*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_GetCap(MS_U32 u32EngId,DSCMB_Query_Type eQueryType,void * pInput,void * pOutput)5114*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_GetCap(MS_U32 u32EngId, DSCMB_Query_Type eQueryType, void* pInput, void* pOutput)
5115*53ee8cc1Swenshuai.xi {
5116*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
5117*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
5118*53ee8cc1Swenshuai.xi     DSCMB_QUERYCAP pArgs;
5119*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_QUERYCAP));
5120*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
5121*53ee8cc1Swenshuai.xi     {
5122*53ee8cc1Swenshuai.xi         return FALSE;
5123*53ee8cc1Swenshuai.xi     }
5124*53ee8cc1Swenshuai.xi     pArgs.u32EngId   = u32EngId;
5125*53ee8cc1Swenshuai.xi     pArgs.eQueryType = eQueryType;
5126*53ee8cc1Swenshuai.xi     pArgs.pInput     = pInput;
5127*53ee8cc1Swenshuai.xi     pArgs.pOutput    = pOutput;
5128*53ee8cc1Swenshuai.xi 
5129*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_QueryCap, &pArgs);
5130*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
5131*53ee8cc1Swenshuai.xi     {
5132*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
5133*53ee8cc1Swenshuai.xi         return FALSE;
5134*53ee8cc1Swenshuai.xi     }
5135*53ee8cc1Swenshuai.xi 
5136*53ee8cc1Swenshuai.xi     return TRUE;
5137*53ee8cc1Swenshuai.xi 
5138*53ee8cc1Swenshuai.xi #else
5139*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_GetCap(u32EngId, eQueryType, pInput, pOutput);
5140*53ee8cc1Swenshuai.xi #endif
5141*53ee8cc1Swenshuai.xi }
5142*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_GetLibVer(const MSIF_Version ** ppVersion)5143*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_GetLibVer(const MSIF_Version **ppVersion)
5144*53ee8cc1Swenshuai.xi {
5145*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
5146*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
5147*53ee8cc1Swenshuai.xi     const MSIF_Version** pArgs = ppVersion;
5148*53ee8cc1Swenshuai.xi 
5149*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
5150*53ee8cc1Swenshuai.xi     {
5151*53ee8cc1Swenshuai.xi         return FALSE;
5152*53ee8cc1Swenshuai.xi     }
5153*53ee8cc1Swenshuai.xi 
5154*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_GetLibVer , pArgs);
5155*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
5156*53ee8cc1Swenshuai.xi     {
5157*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
5158*53ee8cc1Swenshuai.xi         return FALSE;
5159*53ee8cc1Swenshuai.xi     }
5160*53ee8cc1Swenshuai.xi 
5161*53ee8cc1Swenshuai.xi     return TRUE;
5162*53ee8cc1Swenshuai.xi 
5163*53ee8cc1Swenshuai.xi #else
5164*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_GetLibVer(ppVersion);
5165*53ee8cc1Swenshuai.xi #endif
5166*53ee8cc1Swenshuai.xi }
5167*53ee8cc1Swenshuai.xi 
5168*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5169*53ee8cc1Swenshuai.xi /// Set Dscmb driver debug level
5170*53ee8cc1Swenshuai.xi /// @param u32Level \b IN: debug level
5171*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5172*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5173*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB2_SetDBGLevel(MS_U32 u32Level)5174*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_SetDBGLevel(MS_U32 u32Level)
5175*53ee8cc1Swenshuai.xi {
5176*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
5177*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
5178*53ee8cc1Swenshuai.xi     MS_U32 pArgs = u32Level;
5179*53ee8cc1Swenshuai.xi 
5180*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
5181*53ee8cc1Swenshuai.xi     {
5182*53ee8cc1Swenshuai.xi         return FALSE;
5183*53ee8cc1Swenshuai.xi     }
5184*53ee8cc1Swenshuai.xi 
5185*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_SetDBGLevel , &pArgs);
5186*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
5187*53ee8cc1Swenshuai.xi     {
5188*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
5189*53ee8cc1Swenshuai.xi         return FALSE;
5190*53ee8cc1Swenshuai.xi     }
5191*53ee8cc1Swenshuai.xi 
5192*53ee8cc1Swenshuai.xi     return TRUE;
5193*53ee8cc1Swenshuai.xi 
5194*53ee8cc1Swenshuai.xi #else
5195*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_SetDBGLevel(u32Level);
5196*53ee8cc1Swenshuai.xi #endif
5197*53ee8cc1Swenshuai.xi }
5198*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_PVR_RecCtrl(MS_U32 u32EngId,MS_BOOL Enable)5199*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_PVR_RecCtrl(MS_U32 u32EngId, MS_BOOL Enable)
5200*53ee8cc1Swenshuai.xi {
5201*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
5202*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
5203*53ee8cc1Swenshuai.xi     DSCMB_PVR_RECCTRL pArgs;
5204*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_PVR_RECCTRL));
5205*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
5206*53ee8cc1Swenshuai.xi     {
5207*53ee8cc1Swenshuai.xi         return FALSE;
5208*53ee8cc1Swenshuai.xi     }
5209*53ee8cc1Swenshuai.xi 
5210*53ee8cc1Swenshuai.xi     pArgs.u32EngId = u32EngId;
5211*53ee8cc1Swenshuai.xi     pArgs.bEnable  = Enable;
5212*53ee8cc1Swenshuai.xi 
5213*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_PVR_RecCtrl, &pArgs);
5214*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
5215*53ee8cc1Swenshuai.xi     {
5216*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
5217*53ee8cc1Swenshuai.xi         return FALSE;
5218*53ee8cc1Swenshuai.xi     }
5219*53ee8cc1Swenshuai.xi 
5220*53ee8cc1Swenshuai.xi     return TRUE;
5221*53ee8cc1Swenshuai.xi 
5222*53ee8cc1Swenshuai.xi #else
5223*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_PVR_RecCtrl(u32EngId, Enable);
5224*53ee8cc1Swenshuai.xi #endif
5225*53ee8cc1Swenshuai.xi }
5226*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_PidFlt_ScmbStatus(MS_U32 u32EngId,MS_U32 u32PidFltId,SCMB_Level * pScmbLevel)5227*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_PidFlt_ScmbStatus(MS_U32 u32EngId, MS_U32 u32PidFltId, SCMB_Level* pScmbLevel)
5228*53ee8cc1Swenshuai.xi {
5229*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
5230*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
5231*53ee8cc1Swenshuai.xi     DSCMB_DSCMBSTATUS pArgs;
5232*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_DSCMBSTATUS));
5233*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
5234*53ee8cc1Swenshuai.xi     {
5235*53ee8cc1Swenshuai.xi         return FALSE;
5236*53ee8cc1Swenshuai.xi     }
5237*53ee8cc1Swenshuai.xi 
5238*53ee8cc1Swenshuai.xi     pArgs.u32EngId      = u32EngId;
5239*53ee8cc1Swenshuai.xi     pArgs.u32DmxFltId   = u32PidFltId;
5240*53ee8cc1Swenshuai.xi     pArgs.pScmbLevel    = pScmbLevel;
5241*53ee8cc1Swenshuai.xi 
5242*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_PidFlt_ScmbStatus, (void*)&pArgs);
5243*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
5244*53ee8cc1Swenshuai.xi     {
5245*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
5246*53ee8cc1Swenshuai.xi         return FALSE;
5247*53ee8cc1Swenshuai.xi     }
5248*53ee8cc1Swenshuai.xi 
5249*53ee8cc1Swenshuai.xi     return TRUE;
5250*53ee8cc1Swenshuai.xi #else
5251*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_PidFlt_ScmbStatus(u32EngId, u32PidFltId, pScmbLevel);
5252*53ee8cc1Swenshuai.xi #endif
5253*53ee8cc1Swenshuai.xi }
5254*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_Multi2_SetRound(MS_U32 u32EngId,MS_U32 u32Round)5255*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_Multi2_SetRound(MS_U32 u32EngId, MS_U32 u32Round)
5256*53ee8cc1Swenshuai.xi {
5257*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
5258*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
5259*53ee8cc1Swenshuai.xi     DSCMB_MULTI2_SETROUND pArgs;
5260*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_MULTI2_SETROUND));
5261*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
5262*53ee8cc1Swenshuai.xi     {
5263*53ee8cc1Swenshuai.xi         return FALSE;
5264*53ee8cc1Swenshuai.xi     }
5265*53ee8cc1Swenshuai.xi     pArgs.u32EngId = u32EngId;
5266*53ee8cc1Swenshuai.xi     pArgs.u32Round = u32Round;
5267*53ee8cc1Swenshuai.xi 
5268*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_Multi2_SetRound, &pArgs);
5269*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
5270*53ee8cc1Swenshuai.xi     {
5271*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
5272*53ee8cc1Swenshuai.xi         return FALSE;
5273*53ee8cc1Swenshuai.xi     }
5274*53ee8cc1Swenshuai.xi 
5275*53ee8cc1Swenshuai.xi     return TRUE;
5276*53ee8cc1Swenshuai.xi 
5277*53ee8cc1Swenshuai.xi #else
5278*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_Multi2_SetRound(u32EngId, u32Round);
5279*53ee8cc1Swenshuai.xi #endif
5280*53ee8cc1Swenshuai.xi }
5281*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_Multi2_SetSystemKey(MS_U32 u32EngId,MS_U8 * pu8Syskey)5282*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_Multi2_SetSystemKey(MS_U32 u32EngId, MS_U8* pu8Syskey)
5283*53ee8cc1Swenshuai.xi {
5284*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
5285*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
5286*53ee8cc1Swenshuai.xi     DSCMB_MULTI2_SETSYSKEY pArgs;
5287*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_MULTI2_SETSYSKEY));
5288*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
5289*53ee8cc1Swenshuai.xi     {
5290*53ee8cc1Swenshuai.xi         return FALSE;
5291*53ee8cc1Swenshuai.xi     }
5292*53ee8cc1Swenshuai.xi     pArgs.u32EngId  = u32EngId;
5293*53ee8cc1Swenshuai.xi     pArgs.pu8SysKey = pu8Syskey;
5294*53ee8cc1Swenshuai.xi 
5295*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_Multi2_SetSysKey, &pArgs);
5296*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
5297*53ee8cc1Swenshuai.xi     {
5298*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
5299*53ee8cc1Swenshuai.xi         return FALSE;
5300*53ee8cc1Swenshuai.xi     }
5301*53ee8cc1Swenshuai.xi 
5302*53ee8cc1Swenshuai.xi     return TRUE;
5303*53ee8cc1Swenshuai.xi 
5304*53ee8cc1Swenshuai.xi #else
5305*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_Multi2_SetSystemKey(u32EngId, pu8Syskey);
5306*53ee8cc1Swenshuai.xi #endif
5307*53ee8cc1Swenshuai.xi }
5308*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_ES_SetStaticKey(MS_U32 u32EngId,MS_U8 * pu8Statickey)5309*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_ES_SetStaticKey(MS_U32 u32EngId, MS_U8* pu8Statickey)
5310*53ee8cc1Swenshuai.xi {
5311*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
5312*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
5313*53ee8cc1Swenshuai.xi     DSCMB_ES_SETSTATICKEY pArgs;
5314*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_ES_SETSTATICKEY));
5315*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
5316*53ee8cc1Swenshuai.xi     {
5317*53ee8cc1Swenshuai.xi         return FALSE;
5318*53ee8cc1Swenshuai.xi     }
5319*53ee8cc1Swenshuai.xi     pArgs.u32EngId     = u32EngId;
5320*53ee8cc1Swenshuai.xi     pArgs.pu8StaticKey = pu8Statickey;
5321*53ee8cc1Swenshuai.xi 
5322*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_ES_SetStaticKey, &pArgs);
5323*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
5324*53ee8cc1Swenshuai.xi     {
5325*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
5326*53ee8cc1Swenshuai.xi         return FALSE;
5327*53ee8cc1Swenshuai.xi     }
5328*53ee8cc1Swenshuai.xi 
5329*53ee8cc1Swenshuai.xi     return TRUE;
5330*53ee8cc1Swenshuai.xi 
5331*53ee8cc1Swenshuai.xi #else
5332*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_ES_SetStaticKey(u32EngId, pu8Statickey);
5333*53ee8cc1Swenshuai.xi #endif
5334*53ee8cc1Swenshuai.xi }
5335*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_HDCP2_SetRIV(MS_U32 u32EngId,MS_U8 * pu8RIV)5336*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_HDCP2_SetRIV(MS_U32 u32EngId, MS_U8* pu8RIV)
5337*53ee8cc1Swenshuai.xi {
5338*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
5339*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
5340*53ee8cc1Swenshuai.xi     DSCMB_HDCP2_SETRIV pArgs;
5341*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_HDCP2_SETRIV));
5342*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
5343*53ee8cc1Swenshuai.xi     {
5344*53ee8cc1Swenshuai.xi         return FALSE;
5345*53ee8cc1Swenshuai.xi     }
5346*53ee8cc1Swenshuai.xi     pArgs.u32EngId = u32EngId;
5347*53ee8cc1Swenshuai.xi     pArgs.pu8Riv = pu8RIV;
5348*53ee8cc1Swenshuai.xi 
5349*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_HDCP2_SetRiv, &pArgs);
5350*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
5351*53ee8cc1Swenshuai.xi     {
5352*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
5353*53ee8cc1Swenshuai.xi         return FALSE;
5354*53ee8cc1Swenshuai.xi     }
5355*53ee8cc1Swenshuai.xi 
5356*53ee8cc1Swenshuai.xi     return TRUE;
5357*53ee8cc1Swenshuai.xi 
5358*53ee8cc1Swenshuai.xi #else
5359*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_HDCP2_SetRIV(u32EngId, pu8RIV);
5360*53ee8cc1Swenshuai.xi #endif
5361*53ee8cc1Swenshuai.xi 
5362*53ee8cc1Swenshuai.xi }
5363*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_HDCP2_SetRIV_Ex(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U8 * pu8RIV)5364*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_HDCP2_SetRIV_Ex(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U8* pu8RIV)
5365*53ee8cc1Swenshuai.xi {
5366*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
5367*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
5368*53ee8cc1Swenshuai.xi     DSCMB_HDCP2_SETRIV_EX pArgs;
5369*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_HDCP2_SETRIV_EX));
5370*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
5371*53ee8cc1Swenshuai.xi     {
5372*53ee8cc1Swenshuai.xi         return FALSE;
5373*53ee8cc1Swenshuai.xi     }
5374*53ee8cc1Swenshuai.xi     pArgs.u32EngId = u32EngId;
5375*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId = u32DscmbId;
5376*53ee8cc1Swenshuai.xi     pArgs.pu8Riv = pu8RIV;
5377*53ee8cc1Swenshuai.xi 
5378*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_HDCP2_SetRiv_Ex, &pArgs);
5379*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
5380*53ee8cc1Swenshuai.xi     {
5381*53ee8cc1Swenshuai.xi         DRVDSCMB2_DBG(DSCMB2_DBGLV_ERR, "[%s]ERROR : UtopiaIoctl return value 0x%x\n", __FUNCTION__, (unsigned int)u32Ret);
5382*53ee8cc1Swenshuai.xi         return FALSE;
5383*53ee8cc1Swenshuai.xi     }
5384*53ee8cc1Swenshuai.xi 
5385*53ee8cc1Swenshuai.xi     return TRUE;
5386*53ee8cc1Swenshuai.xi 
5387*53ee8cc1Swenshuai.xi #else
5388*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_HDCP2_SetRIV_Ex(u32EngId, u32DscmbId, pu8RIV);
5389*53ee8cc1Swenshuai.xi #endif
5390*53ee8cc1Swenshuai.xi }
5391*53ee8cc1Swenshuai.xi 
5392*53ee8cc1Swenshuai.xi 
5393*53ee8cc1Swenshuai.xi //------------------------------------- ------------------//
5394*53ee8cc1Swenshuai.xi //----------------------Debug API -------------------------//
5395*53ee8cc1Swenshuai.xi //-------------------------------------------------------//
MDrv_DSCMB2_GetConnectStatus(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32TspFltId)5396*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_GetConnectStatus(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32TspFltId)
5397*53ee8cc1Swenshuai.xi {
5398*53ee8cc1Swenshuai.xi #ifdef DSCMB_UTOPIA20
5399*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = UTOPIA_STATUS_SUCCESS;
5400*53ee8cc1Swenshuai.xi     DSCMB_CONNECTSTATUS pArgs;
5401*53ee8cc1Swenshuai.xi     memset(&pArgs, 0, sizeof(DSCMB_CONNECTSTATUS));
5402*53ee8cc1Swenshuai.xi     if(pu32DscmbInst == NULL)
5403*53ee8cc1Swenshuai.xi     {
5404*53ee8cc1Swenshuai.xi         return FALSE;
5405*53ee8cc1Swenshuai.xi     }
5406*53ee8cc1Swenshuai.xi     pArgs.u32EngId = u32EngId;
5407*53ee8cc1Swenshuai.xi     pArgs.u32DscmbId = u32DscmbId;
5408*53ee8cc1Swenshuai.xi     pArgs.u32DmxFltId = u32TspFltId;
5409*53ee8cc1Swenshuai.xi 
5410*53ee8cc1Swenshuai.xi     u32Ret = UtopiaIoctl(pu32DscmbInst, E_MDRV_CMD_DSCMB_GetConnectStatus, &pArgs);
5411*53ee8cc1Swenshuai.xi     if(UTOPIA_STATUS_SUCCESS != u32Ret)
5412*53ee8cc1Swenshuai.xi     {
5413*53ee8cc1Swenshuai.xi         return FALSE;
5414*53ee8cc1Swenshuai.xi     }
5415*53ee8cc1Swenshuai.xi 
5416*53ee8cc1Swenshuai.xi     return TRUE;
5417*53ee8cc1Swenshuai.xi 
5418*53ee8cc1Swenshuai.xi #else
5419*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_GetConnectStatus(u32EngId, u32DscmbId, u32TspFltId);
5420*53ee8cc1Swenshuai.xi #endif
5421*53ee8cc1Swenshuai.xi }
5422*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_ReadSwitch(MS_U32 u32FltId,DSCMB_Key_Type type,MS_U32 u32CAVid)5423*53ee8cc1Swenshuai.xi void MDrv_DSCMB2_ReadSwitch(MS_U32 u32FltId, DSCMB_Key_Type type, MS_U32 u32CAVid)
5424*53ee8cc1Swenshuai.xi {
5425*53ee8cc1Swenshuai.xi     _MDrv_DSCMB2_ReadSwitch(u32FltId, type, u32CAVid);
5426*53ee8cc1Swenshuai.xi }
5427*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_ReadPidSlotMap(MS_U32 u32FltId)5428*53ee8cc1Swenshuai.xi void MDrv_DSCMB2_ReadPidSlotMap(MS_U32 u32FltId)
5429*53ee8cc1Swenshuai.xi {
5430*53ee8cc1Swenshuai.xi     _MDrv_DSCMB2_ReadPidSlotMap(u32FltId);
5431*53ee8cc1Swenshuai.xi }
5432*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_PacketView(MS_U32 u32Eng,MS_U32 u32FltId,MS_U32 Mode,MS_U32 u32Range,MS_BOOL bRst)5433*53ee8cc1Swenshuai.xi void MDrv_DSCMB2_PacketView(MS_U32 u32Eng, MS_U32 u32FltId, MS_U32 Mode, MS_U32 u32Range, MS_BOOL bRst)
5434*53ee8cc1Swenshuai.xi {
5435*53ee8cc1Swenshuai.xi     _MDrv_DSCMB2_PacketView(u32Eng, u32FltId, Mode, u32Range, bRst);
5436*53ee8cc1Swenshuai.xi }
5437*53ee8cc1Swenshuai.xi 
5438*53ee8cc1Swenshuai.xi //------------------------------------- ------------------//
5439*53ee8cc1Swenshuai.xi //------------------------Depreted API ---------------------//
5440*53ee8cc1Swenshuai.xi //-------------------------------------------------------//
MDrv_DSCMB_Init(void)5441*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_Init(void)
5442*53ee8cc1Swenshuai.xi {
5443*53ee8cc1Swenshuai.xi     return MDrv_DSCMB2_Init();
5444*53ee8cc1Swenshuai.xi }
5445*53ee8cc1Swenshuai.xi 
MDrv_DSCMB_Exit(void)5446*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_Exit(void)
5447*53ee8cc1Swenshuai.xi {
5448*53ee8cc1Swenshuai.xi     return MDrv_DSCMB2_Exit();
5449*53ee8cc1Swenshuai.xi }
5450*53ee8cc1Swenshuai.xi 
5451*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5452*53ee8cc1Swenshuai.xi /// Dscmb lock API for supporting multithreading
5453*53ee8cc1Swenshuai.xi /// @param u
5454*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5455*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5456*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_KLadder_Lock(void)5457*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_Lock(void  )
5458*53ee8cc1Swenshuai.xi {
5459*53ee8cc1Swenshuai.xi     return MsOS_ObtainMutex(_s32KLMutexId, MSOS_WAIT_FOREVER);
5460*53ee8cc1Swenshuai.xi }
5461*53ee8cc1Swenshuai.xi 
5462*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5463*53ee8cc1Swenshuai.xi /// Dscmb unlock API for supporting multithreading
5464*53ee8cc1Swenshuai.xi /// @param u
5465*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5466*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5467*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_KLadder_Unlock(void)5468*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_Unlock(void)
5469*53ee8cc1Swenshuai.xi {
5470*53ee8cc1Swenshuai.xi     return MsOS_ReleaseMutex(_s32KLMutexId);
5471*53ee8cc1Swenshuai.xi }
5472*53ee8cc1Swenshuai.xi 
5473*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5474*53ee8cc1Swenshuai.xi /// Check if key ladder operation is complete
5475*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5476*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5477*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_KLadder_IsComplete(void)5478*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_IsComplete(void)
5479*53ee8cc1Swenshuai.xi {
5480*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Obsolete function\n");
5481*53ee8cc1Swenshuai.xi     return FALSE;
5482*53ee8cc1Swenshuai.xi }
5483*53ee8cc1Swenshuai.xi 
5484*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5485*53ee8cc1Swenshuai.xi /// Check if key ladder output is complete
5486*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5487*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5488*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_KLadder_Output_IsComplete(void)5489*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_Output_IsComplete(void)
5490*53ee8cc1Swenshuai.xi {
5491*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Obsolete function\n");
5492*53ee8cc1Swenshuai.xi     return FALSE;
5493*53ee8cc1Swenshuai.xi }
5494*53ee8cc1Swenshuai.xi 
5495*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5496*53ee8cc1Swenshuai.xi /// Make key ladder start output
5497*53ee8cc1Swenshuai.xi /// @param u32DscmbId \b IN: Descrambler filter ID obtained from MDrv_DSCMB_FltAlloc
5498*53ee8cc1Swenshuai.xi /// @param eKeyType \b IN: Descrambler key type
5499*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5500*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5501*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_KLadder_Output_Start(MS_U32 u32DscmbId,DSCMB_Key_Type eKeyType)5502*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_Output_Start(MS_U32 u32DscmbId, DSCMB_Key_Type eKeyType)
5503*53ee8cc1Swenshuai.xi {
5504*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Obsolete function\n");
5505*53ee8cc1Swenshuai.xi     return FALSE;
5506*53ee8cc1Swenshuai.xi }
5507*53ee8cc1Swenshuai.xi 
5508*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5509*53ee8cc1Swenshuai.xi /// Make key ladder stop output
5510*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5511*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5512*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_KLadder_Output_Stop(void)5513*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_Output_Stop(void)
5514*53ee8cc1Swenshuai.xi {
5515*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Obsolete function\n");
5516*53ee8cc1Swenshuai.xi     return FALSE;
5517*53ee8cc1Swenshuai.xi }
5518*53ee8cc1Swenshuai.xi 
5519*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5520*53ee8cc1Swenshuai.xi /// Reset key ladder
5521*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5522*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5523*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_KLadder_Reset(void)5524*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_Reset(void)
5525*53ee8cc1Swenshuai.xi {
5526*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Obsolete function\n");
5527*53ee8cc1Swenshuai.xi     return FALSE;
5528*53ee8cc1Swenshuai.xi }
5529*53ee8cc1Swenshuai.xi 
MDrv_DSCMB_KLadder_ResetAcpuAck(void)5530*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_ResetAcpuAck(void)
5531*53ee8cc1Swenshuai.xi {
5532*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Obsolete function\n");
5533*53ee8cc1Swenshuai.xi     return FALSE;
5534*53ee8cc1Swenshuai.xi }
5535*53ee8cc1Swenshuai.xi 
5536*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5537*53ee8cc1Swenshuai.xi /// Make key ladder start operating
5538*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5539*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5540*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_KLadder_Start(void)5541*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_Start(void)
5542*53ee8cc1Swenshuai.xi {
5543*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Obsolete function\n");
5544*53ee8cc1Swenshuai.xi     return FALSE;
5545*53ee8cc1Swenshuai.xi }
5546*53ee8cc1Swenshuai.xi 
5547*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5548*53ee8cc1Swenshuai.xi /// Make key ladder stop operating
5549*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5550*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5551*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_KLadder_Stop(void)5552*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_Stop(void)
5553*53ee8cc1Swenshuai.xi {
5554*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Obsolete function\n");
5555*53ee8cc1Swenshuai.xi     return FALSE;
5556*53ee8cc1Swenshuai.xi }
5557*53ee8cc1Swenshuai.xi 
5558*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5559*53ee8cc1Swenshuai.xi /// Set key ladder input
5560*53ee8cc1Swenshuai.xi /// @param KLSrc \b IN: key ladder key source
5561*53ee8cc1Swenshuai.xi /// @param pu8Key \b IN: The target key of key ladder
5562*53ee8cc1Swenshuai.xi /// @param u32KeyLen \b IN: the length of the target key of key ladder
5563*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5564*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5565*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_KLadder_SetKey(DSCMB_KLSrc KLSrc,MS_U8 * pu8Key,MS_U32 u32KeyLen)5566*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_SetKey(DSCMB_KLSrc KLSrc, MS_U8* pu8Key, MS_U32 u32KeyLen)
5567*53ee8cc1Swenshuai.xi {
5568*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Obsolete function\n");
5569*53ee8cc1Swenshuai.xi     return FALSE;
5570*53ee8cc1Swenshuai.xi }
5571*53ee8cc1Swenshuai.xi 
5572*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5573*53ee8cc1Swenshuai.xi /// Set key ladder input
5574*53ee8cc1Swenshuai.xi /// @param u32Level \b IN: key ladder level
5575*53ee8cc1Swenshuai.xi /// @param pu8In \b IN: input of key ladder at u32Level level
5576*53ee8cc1Swenshuai.xi /// @param u32InLen \b IN: input length
5577*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5578*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5579*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_KLadder_SetInput(MS_U32 u32Level,MS_U8 * pu8In,MS_U32 u32InLen)5580*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_SetInput(MS_U32 u32Level, MS_U8* pu8In, MS_U32 u32InLen)
5581*53ee8cc1Swenshuai.xi {
5582*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Obsolete function\n");
5583*53ee8cc1Swenshuai.xi     return FALSE;
5584*53ee8cc1Swenshuai.xi }
5585*53ee8cc1Swenshuai.xi 
5586*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5587*53ee8cc1Swenshuai.xi /// Set key ladder configurations
5588*53ee8cc1Swenshuai.xi /// @param pConfig \b IN: key ladder configurations
5589*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_KLadder_SetConfig(DSCMB_KLCfg * KLCfg)5590*53ee8cc1Swenshuai.xi void MDrv_DSCMB_KLadder_SetConfig(DSCMB_KLCfg *KLCfg)
5591*53ee8cc1Swenshuai.xi {
5592*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Obsolete function\n");
5593*53ee8cc1Swenshuai.xi     return;
5594*53ee8cc1Swenshuai.xi }
5595*53ee8cc1Swenshuai.xi 
5596*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5597*53ee8cc1Swenshuai.xi /// Set key ladder destination
5598*53ee8cc1Swenshuai.xi /// @param KLDst \b IN: key ladder key destination
5599*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5600*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5601*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_KLadder_SetDst(DSCMB_KLDst KLDst)5602*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_SetDst(DSCMB_KLDst KLDst)
5603*53ee8cc1Swenshuai.xi {
5604*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Obsolete function\n");
5605*53ee8cc1Swenshuai.xi     return FALSE;
5606*53ee8cc1Swenshuai.xi }
5607*53ee8cc1Swenshuai.xi 
MDrv_DSCMB_KLadder_ReadDataFromAcpu(MS_U8 * pu8Out)5608*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_ReadDataFromAcpu(MS_U8* pu8Out)
5609*53ee8cc1Swenshuai.xi {
5610*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Obsolete function\n");
5611*53ee8cc1Swenshuai.xi     return FALSE;
5612*53ee8cc1Swenshuai.xi }
5613*53ee8cc1Swenshuai.xi 
MApi_DSCMB_SetPowerState(EN_POWER_MODE u16PowerState)5614*53ee8cc1Swenshuai.xi MS_U32  MApi_DSCMB_SetPowerState(EN_POWER_MODE u16PowerState)
5615*53ee8cc1Swenshuai.xi {
5616*53ee8cc1Swenshuai.xi     return MDrv_DSCMB2_SetPowerState(u16PowerState);
5617*53ee8cc1Swenshuai.xi }
5618*53ee8cc1Swenshuai.xi 
MDrv_DSCMB_SlotSwitchWrite(MS_U32 u32DscmbId,DSCMB_Key_Type eKeyType,MS_U32 u32SW0,MS_U32 u32SW1,MS_U32 u32SW2)5619*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_SlotSwitchWrite(MS_U32 u32DscmbId, DSCMB_Key_Type eKeyType, MS_U32 u32SW0, MS_U32 u32SW1, MS_U32 u32SW2)
5620*53ee8cc1Swenshuai.xi {
5621*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Not support\n");
5622*53ee8cc1Swenshuai.xi     return FALSE;
5623*53ee8cc1Swenshuai.xi }
5624*53ee8cc1Swenshuai.xi 
MDrv_DSCMB_GetLibVer(const MSIF_Version ** ppVersion)5625*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_GetLibVer(const MSIF_Version **ppVersion)
5626*53ee8cc1Swenshuai.xi {
5627*53ee8cc1Swenshuai.xi     return MDrv_DSCMB2_GetLibVer (ppVersion);
5628*53ee8cc1Swenshuai.xi }
5629*53ee8cc1Swenshuai.xi 
MDrv_DSCMB_SetDBGLevel(MS_U32 u32Level)5630*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_SetDBGLevel(MS_U32 u32Level)
5631*53ee8cc1Swenshuai.xi {
5632*53ee8cc1Swenshuai.xi     return MDrv_DSCMB2_SetDBGLevel(u32Level);
5633*53ee8cc1Swenshuai.xi }
5634*53ee8cc1Swenshuai.xi 
MDrv_DSCMB_KLadder_AtomicExec(DSCMB_KLCfg_All * KLCfg,MS_U8 * ACPU_Out,DSCMB_KL_Status * u32Status)5635*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_KLadder_AtomicExec(DSCMB_KLCfg_All* KLCfg , MS_U8 *ACPU_Out, DSCMB_KL_Status* u32Status)
5636*53ee8cc1Swenshuai.xi {
5637*53ee8cc1Swenshuai.xi     return MDrv_DSCMB2_KLadder_AtomicExec(KLCfg, ACPU_Out, u32Status);
5638*53ee8cc1Swenshuai.xi }
5639*53ee8cc1Swenshuai.xi 
5640*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5641*53ee8cc1Swenshuai.xi /// Get the status between descramble id and tsp filter id
5642*53ee8cc1Swenshuai.xi /// @param u32DscmbId \b IN: descramble id
5643*53ee8cc1Swenshuai.xi /// @param u32TspFltId \b IN: tsp filter id
5644*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5645*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5646*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_GetConnectStatus(MS_U32 u32EngId,MS_U32 u32DscmbId,MS_U32 u32TspFltId)5647*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_GetConnectStatus(MS_U32 u32EngId, MS_U32 u32DscmbId, MS_U32 u32TspFltId)
5648*53ee8cc1Swenshuai.xi {
5649*53ee8cc1Swenshuai.xi     return MDrv_DSCMB2_GetConnectStatus(u32EngId, u32DscmbId, u32TspFltId);
5650*53ee8cc1Swenshuai.xi }
5651*53ee8cc1Swenshuai.xi 
5652*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5653*53ee8cc1Swenshuai.xi /// Get Dscmb driver status
5654*53ee8cc1Swenshuai.xi /// @param pStatus \b OUT: Descrambler status
5655*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5656*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5657*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_GetStatus(DSCMB_Status * pStatus)5658*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_GetStatus(DSCMB_Status *pStatus)
5659*53ee8cc1Swenshuai.xi {
5660*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Not Implement\n");
5661*53ee8cc1Swenshuai.xi     return FALSE;
5662*53ee8cc1Swenshuai.xi }
5663*53ee8cc1Swenshuai.xi 
5664*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5665*53ee8cc1Swenshuai.xi /// Get Dscmb driver information
5666*53ee8cc1Swenshuai.xi /// @return DSCMB_Info
5667*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_GetInfo(void)5668*53ee8cc1Swenshuai.xi const DSCMB_Info*  MDrv_DSCMB_GetInfo(void)
5669*53ee8cc1Swenshuai.xi {
5670*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Not Implement\n");
5671*53ee8cc1Swenshuai.xi     return NULL;
5672*53ee8cc1Swenshuai.xi }
5673*53ee8cc1Swenshuai.xi 
5674*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5675*53ee8cc1Swenshuai.xi /// Set the PID to be replaced
5676*53ee8cc1Swenshuai.xi /// @param u32PidPrim\b IN: The packet with this target PID(u32PidPrim) will be replaced in the field of PID byu32Pid2ndary
5677*53ee8cc1Swenshuai.xi /// @param u32Pid2ndary\b IN: The packet with this target PID(u32PidPrim) will be replaced in the field of PID byu32Pid2ndary
5678*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5679*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5680*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_2ndarySet(MS_U32 u32PidPrim,MS_U32 u32Pid2ndary)5681*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_2ndarySet(MS_U32 u32PidPrim, MS_U32 u32Pid2ndary)
5682*53ee8cc1Swenshuai.xi {
5683*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Not support\n");
5684*53ee8cc1Swenshuai.xi     return FALSE;
5685*53ee8cc1Swenshuai.xi }
5686*53ee8cc1Swenshuai.xi 
5687*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
5688*53ee8cc1Swenshuai.xi /// Reset the PID to be replaced
5689*53ee8cc1Swenshuai.xi /// @param u32PidPrim\b IN: Reset the replacement of PID (u32PidPrim) set by MDrv_DSCMB_2ndarySet
5690*53ee8cc1Swenshuai.xi /// @return TRUE - Success
5691*53ee8cc1Swenshuai.xi /// @return FALSE - Failure
5692*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_DSCMB_2ndaryReset(MS_U32 u32PidPrim)5693*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB_2ndaryReset(MS_U32 u32PidPrim)
5694*53ee8cc1Swenshuai.xi {
5695*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Not support\n");
5696*53ee8cc1Swenshuai.xi     return FALSE;
5697*53ee8cc1Swenshuai.xi }
5698*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_SetRecBuf(MS_U32 u32EngId,MS_U32 u32Start,MS_U32 u32Size)5699*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_SetRecBuf(MS_U32 u32EngId , MS_U32 u32Start, MS_U32 u32Size)
5700*53ee8cc1Swenshuai.xi {
5701*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Not support\n");
5702*53ee8cc1Swenshuai.xi     return FALSE;
5703*53ee8cc1Swenshuai.xi }
5704*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_RecCtrl(MS_U32 u32EngId,MS_BOOL bEnable)5705*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_RecCtrl(MS_U32 u32EngId, MS_BOOL bEnable)
5706*53ee8cc1Swenshuai.xi {
5707*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Not support\n");
5708*53ee8cc1Swenshuai.xi     return FALSE;
5709*53ee8cc1Swenshuai.xi }
5710*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_GetRecWptr(MS_U32 u32EngId,MS_U32 * pu32Write)5711*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_GetRecWptr(MS_U32 u32EngId, MS_U32* pu32Write)
5712*53ee8cc1Swenshuai.xi {
5713*53ee8cc1Swenshuai.xi     OBSOLETE_FUNCTION("Not support\n");
5714*53ee8cc1Swenshuai.xi     return FALSE;
5715*53ee8cc1Swenshuai.xi }
5716*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_EngEnableKey(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Eng_Type eEngType,DSCMB_Key_Type eKeyType,MS_BOOL bEnable)5717*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_EngEnableKey(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Eng_Type eEngType, DSCMB_Key_Type eKeyType, MS_BOOL bEnable)
5718*53ee8cc1Swenshuai.xi {
5719*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_EngEnableKey(u32EngId, u32DscmbId, eEngType, eKeyType, bEnable);
5720*53ee8cc1Swenshuai.xi }
5721*53ee8cc1Swenshuai.xi 
5722*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_FltSwitchType(MS_U32 u32EngId,MS_U32 u32DscmbId,DSCMB_Flt_Type eFltType)5723*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DSCMB2_FltSwitchType(MS_U32 u32EngId, MS_U32 u32DscmbId, DSCMB_Flt_Type eFltType)
5724*53ee8cc1Swenshuai.xi {
5725*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_FltSwitchType(u32EngId, u32DscmbId, eFltType);
5726*53ee8cc1Swenshuai.xi }
5727*53ee8cc1Swenshuai.xi 
MDrv_DSCMB2_GetPidSlotMapIndex(MS_U32 u32EngId,MS_U32 u32DscmbId)5728*53ee8cc1Swenshuai.xi MS_U32  MDrv_DSCMB2_GetPidSlotMapIndex(MS_U32 u32EngId, MS_U32 u32DscmbId)
5729*53ee8cc1Swenshuai.xi {
5730*53ee8cc1Swenshuai.xi     return _MDrv_DSCMB2_GetPidSlotMapIndex(u32EngId, u32DscmbId);
5731*53ee8cc1Swenshuai.xi }
5732*53ee8cc1Swenshuai.xi 
5733