xref: /utopia/UTPA2-700.0.x/modules/dscmb/drv/nds/nds_flt.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) 2008-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    drvNDS.c
98*53ee8cc1Swenshuai.xi /// @brief  NDS Driver Interface
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
100*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi 
102*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
103*53ee8cc1Swenshuai.xi //  Include Files
104*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
105*53ee8cc1Swenshuai.xi #include "MsCommon.h"
106*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
107*53ee8cc1Swenshuai.xi #include "string.h"
108*53ee8cc1Swenshuai.xi #endif
109*53ee8cc1Swenshuai.xi 
110*53ee8cc1Swenshuai.xi #include "asmCPU.h"
111*53ee8cc1Swenshuai.xi #include "regNDS.h"
112*53ee8cc1Swenshuai.xi #include "drvNDS.h"
113*53ee8cc1Swenshuai.xi #include "halNDS.h"
114*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
115*53ee8cc1Swenshuai.xi #include "../tsp/drvTSP.h"
116*53ee8cc1Swenshuai.xi // TSP2 to TSP wrapper
117*53ee8cc1Swenshuai.xi #define E_TSP_OK                        DRVTSP_OK
118*53ee8cc1Swenshuai.xi #define E_TSP_FAIL                      DRVTSP_FAIL
119*53ee8cc1Swenshuai.xi #define E_TSP_FLT_SRC_TSIF0             E_DRVTSP_FLT_SOURCE_TYPE_LIVE
120*53ee8cc1Swenshuai.xi #define E_TSP_FLT_USER_SEC              E_DRVTSP_FLT_TYPE_SECTION
121*53ee8cc1Swenshuai.xi #define E_TSP_FLT_USER_PKT              E_DRVTSP_FLT_TYPE_PACKET
122*53ee8cc1Swenshuai.xi #define E_TSP_FLT_USER_EMM              E_DRVTSP_FLT_TYPE_EMM
123*53ee8cc1Swenshuai.xi #define E_TSP_FLT_USER_ECM              E_DRVTSP_FLT_TYPE_ECM
124*53ee8cc1Swenshuai.xi #define TSP_FltState                    DrvTSP_FltState
125*53ee8cc1Swenshuai.xi #define E_TSP_FLT_STATE_FREE            E_DRVTSP_FLT_STATE_FREE
126*53ee8cc1Swenshuai.xi #define TSP_PID_NULL                    DRVTSP_PID_NULL
127*53ee8cc1Swenshuai.xi #define MDrv_TSP_FLT_Alloc(i, p...)     MDrv_TSP_PidFlt_Alloc(0, p)
128*53ee8cc1Swenshuai.xi #define MDrv_TSP_FLT_SetPID(p...)       MDrv_TSP_PidFlt_SetPid(0, p)
129*53ee8cc1Swenshuai.xi #define MDrv_TSP_FLT_Enable(p...)       MDrv_TSP_PidFlt_Enable(0, p)
130*53ee8cc1Swenshuai.xi #define MDrv_TSP_FLT_Free(p...)         MDrv_TSP_PidFlt_Free(0, p)
131*53ee8cc1Swenshuai.xi #define MDrv_TSP_FLT_GetState(p...)     MDrv_TSP_PidFlt_GetState(0, p)
132*53ee8cc1Swenshuai.xi #else
133*53ee8cc1Swenshuai.xi #include "../tsp2/drvTSP2.h"
134*53ee8cc1Swenshuai.xi #endif
135*53ee8cc1Swenshuai.xi 
136*53ee8cc1Swenshuai.xi #include "ddiNDS_HDI.h"
137*53ee8cc1Swenshuai.xi 
138*53ee8cc1Swenshuai.xi #include "nds.h"
139*53ee8cc1Swenshuai.xi 
140*53ee8cc1Swenshuai.xi #define NDS_FLT_DBG(_fmt, _args...)     { } // printf(_fmt, ##_args)
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi 
143*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
144*53ee8cc1Swenshuai.xi //  Driver Compiler Options
145*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
146*53ee8cc1Swenshuai.xi #define NDS_EMM_PASSIVE                 1
147*53ee8cc1Swenshuai.xi 
148*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
149*53ee8cc1Swenshuai.xi //  Local Defines
150*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
151*53ee8cc1Swenshuai.xi 
152*53ee8cc1Swenshuai.xi //FIXME: it's no use?
153*53ee8cc1Swenshuai.xi #define NDS_FLT_ENTRY()                 MsOS_ObtainMutex(_nds_flt_mutexid, MSOS_WAIT_FOREVER)
154*53ee8cc1Swenshuai.xi #define NDS_FLT_RETURN(_ret)            { MsOS_ReleaseMutex(_nds_flt_mutexid); return _ret; }
155*53ee8cc1Swenshuai.xi #define NDS_FLT_LOCK()                  MsOS_ObtainMutex(_nds_flt_mutexid, MSOS_WAIT_FOREVER)
156*53ee8cc1Swenshuai.xi #define NDS_FLT_UNLOCK()                MsOS_ReleaseMutex(_nds_flt_mutexid)
157*53ee8cc1Swenshuai.xi // -jerry
158*53ee8cc1Swenshuai.xi 
159*53ee8cc1Swenshuai.xi #define NDS_EMM_EVENT_BUFFER            0x00000010      // 0x00000010-0x00000019
160*53ee8cc1Swenshuai.xi #define NDS_EMM_EVENT_BUFFER_MASK       0x0000000F
161*53ee8cc1Swenshuai.xi #define NDS_EMM_EVENT_OVERFLOW_HW       0x00000020
162*53ee8cc1Swenshuai.xi #define NDS_EMM_EVENT_OVERFLOW_SW       0x00000040
163*53ee8cc1Swenshuai.xi #define NDS_ECM_EVENT_FILTER            0x00FFFF00
164*53ee8cc1Swenshuai.xi #define NDS_ECM_EVENT_FILTER_SHFT       8
165*53ee8cc1Swenshuai.xi #define NDS_ECM_EVENT_OVERFLOW          0xFF000000
166*53ee8cc1Swenshuai.xi #define NDS_ECM_EVENT_OVERFLOW_SHFT     24
167*53ee8cc1Swenshuai.xi #define NDS_ALL_EVENT                   0xFFFFFFFF
168*53ee8cc1Swenshuai.xi 
169*53ee8cc1Swenshuai.xi #define NDS_FLT_OS_AttachInterrupt(isr)  MsOS_AttachInterrupt(NDS_INT_EMM_ECM, isr)
170*53ee8cc1Swenshuai.xi #define NDS_FLT_OS_EnableInterrupt()     MsOS_EnableInterrupt(NDS_INT_EMM_ECM );
171*53ee8cc1Swenshuai.xi #define NDS_FLT_OS_DisableInterrupt()    MsOS_DisableInterrupt(NDS_INT_EMM_ECM );
172*53ee8cc1Swenshuai.xi #define NDS_FLT_OS_DetachInterrupt()     MsOS_DetachInterrupt(NDS_INT_EMM_ECM);
173*53ee8cc1Swenshuai.xi 
174*53ee8cc1Swenshuai.xi 
175*53ee8cc1Swenshuai.xi #define GET_4BYTE( cp )                 ( ( ( (MS_U32)(*cp) )<< 24 ) | ( ( (MS_U32)(*(cp+1)) ) << 16 ) | ( ( (MS_U32)(*(cp+2)) ) << 8 ) | ( (MS_U32)(*(cp+3)) ) )
176*53ee8cc1Swenshuai.xi 
177*53ee8cc1Swenshuai.xi #define NDS_FLT_NULL                    0xFFFFFFFF
178*53ee8cc1Swenshuai.xi 
179*53ee8cc1Swenshuai.xi #define NDS_FLT_TASK_STACK_SIZE         4096
180*53ee8cc1Swenshuai.xi 
181*53ee8cc1Swenshuai.xi 
182*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------------------
183*53ee8cc1Swenshuai.xi 
184*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
185*53ee8cc1Swenshuai.xi //  Local Structurs
186*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
187*53ee8cc1Swenshuai.xi typedef struct _NDS_FLT_Dev
188*53ee8cc1Swenshuai.xi {
189*53ee8cc1Swenshuai.xi     NDS_FLT_Param                   param;
190*53ee8cc1Swenshuai.xi 
191*53ee8cc1Swenshuai.xi } NDS_FLT_Dev;
192*53ee8cc1Swenshuai.xi 
193*53ee8cc1Swenshuai.xi 
194*53ee8cc1Swenshuai.xi typedef struct
195*53ee8cc1Swenshuai.xi {
196*53ee8cc1Swenshuai.xi     MS_U16                          pid;                                // PID status for REG_CAM_ECM_PID (W_ONLY)
197*53ee8cc1Swenshuai.xi     MS_U32                          flt_id;
198*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
199*53ee8cc1Swenshuai.xi     MS_U32                          buf_id;
200*53ee8cc1Swenshuai.xi #endif
201*53ee8cc1Swenshuai.xi 
202*53ee8cc1Swenshuai.xi     MS_U32                          x_connect;
203*53ee8cc1Swenshuai.xi     MS_U8                           ecm_id;
204*53ee8cc1Swenshuai.xi     MS_BOOL                         b_defined;
205*53ee8cc1Swenshuai.xi 
206*53ee8cc1Swenshuai.xi #if NDS_ECM_SAME_PID_DROP_EN
207*53ee8cc1Swenshuai.xi     MS_U8                           u8Drop;
208*53ee8cc1Swenshuai.xi     MS_U8                           u8Ctrl;
209*53ee8cc1Swenshuai.xi #endif
210*53ee8cc1Swenshuai.xi 
211*53ee8cc1Swenshuai.xi } NDS_ECM_Flt;
212*53ee8cc1Swenshuai.xi 
213*53ee8cc1Swenshuai.xi 
214*53ee8cc1Swenshuai.xi typedef struct
215*53ee8cc1Swenshuai.xi {
216*53ee8cc1Swenshuai.xi     MS_U16                          pid;                                // PID status for REG_CAM_EMM_PID (W_ONLY)
217*53ee8cc1Swenshuai.xi     MS_U32                          flt_id;
218*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
219*53ee8cc1Swenshuai.xi     MS_U32                          buf_id;
220*53ee8cc1Swenshuai.xi #endif
221*53ee8cc1Swenshuai.xi 
222*53ee8cc1Swenshuai.xi     MS_U32                          x_connect;
223*53ee8cc1Swenshuai.xi     MS_U8                           flt_ctrl;
224*53ee8cc1Swenshuai.xi 
225*53ee8cc1Swenshuai.xi } NDS_EMM_Flt;
226*53ee8cc1Swenshuai.xi 
227*53ee8cc1Swenshuai.xi //[NEW] Refine?
228*53ee8cc1Swenshuai.xi #define MAX_EMM_LIST_NUM            11 //(NDS_CAM_EMM_BUF_NUM+1) // N for N-1 slots
229*53ee8cc1Swenshuai.xi 
230*53ee8cc1Swenshuai.xi MS_U8 _u8EmmRead = 0;
231*53ee8cc1Swenshuai.xi MS_U8 _u8EmmWrite = 0;
232*53ee8cc1Swenshuai.xi MS_U8 _u8EmmCur = 0;
233*53ee8cc1Swenshuai.xi 
234*53ee8cc1Swenshuai.xi #define emmQueueInc()                                   \
235*53ee8cc1Swenshuai.xi {                                                       \
236*53ee8cc1Swenshuai.xi     _u8EmmWrite++;                                      \
237*53ee8cc1Swenshuai.xi     if (MAX_EMM_LIST_NUM <= _u8EmmWrite)                \
238*53ee8cc1Swenshuai.xi     {                                                   \
239*53ee8cc1Swenshuai.xi         _u8EmmWrite = 0;                                \
240*53ee8cc1Swenshuai.xi     }                                                   \
241*53ee8cc1Swenshuai.xi }
242*53ee8cc1Swenshuai.xi 
243*53ee8cc1Swenshuai.xi #define emmQueueDec()                                   \
244*53ee8cc1Swenshuai.xi {                                                       \
245*53ee8cc1Swenshuai.xi     _u8EmmRead++;                                       \
246*53ee8cc1Swenshuai.xi     if (MAX_EMM_LIST_NUM <= _u8EmmRead)                 \
247*53ee8cc1Swenshuai.xi     {                                                   \
248*53ee8cc1Swenshuai.xi         _u8EmmRead = 0;                                 \
249*53ee8cc1Swenshuai.xi     }                                                   \
250*53ee8cc1Swenshuai.xi }
251*53ee8cc1Swenshuai.xi 
252*53ee8cc1Swenshuai.xi #define emmQueueIsEmpty()       (_u8EmmRead == _u8EmmWrite)
253*53ee8cc1Swenshuai.xi #define emmQueueIsFull()        (0 == emmQueueFreeSize())
254*53ee8cc1Swenshuai.xi #define emmQueueUsedSize()      ((_u8EmmWrite >= _u8EmmRead) ? (_u8EmmWrite - _u8EmmRead) : (MAX_EMM_LIST_NUM - _u8EmmRead + _u8EmmWrite))
255*53ee8cc1Swenshuai.xi #define emmQueueFreeSize()      (MAX_EMM_LIST_NUM - emmQueueUsedSize() - 1)
256*53ee8cc1Swenshuai.xi #define emmQueueReset()         { _u8EmmRead = _u8EmmWrite = _u8EmmCur = 0 }
257*53ee8cc1Swenshuai.xi // -Jerry
258*53ee8cc1Swenshuai.xi 
259*53ee8cc1Swenshuai.xi 
260*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
261*53ee8cc1Swenshuai.xi //  Global Variables
262*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
263*53ee8cc1Swenshuai.xi 
264*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
265*53ee8cc1Swenshuai.xi //  Local Variables
266*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
267*53ee8cc1Swenshuai.xi 
268*53ee8cc1Swenshuai.xi static NDS_FLT_Dev                  _nds_flt_dev = {
269*53ee8cc1Swenshuai.xi                                         .param.ecm_emm_addr = (MS_PHYADDR)NULL,
270*53ee8cc1Swenshuai.xi                                         .param.pu8ecm_emm_buf = (MS_U8*)NULL,
271*53ee8cc1Swenshuai.xi                                     };
272*53ee8cc1Swenshuai.xi 
273*53ee8cc1Swenshuai.xi #if !defined(MSOS_TYPE_LINUX_KERNEL)
274*53ee8cc1Swenshuai.xi static MS_U32                       _nds_flt_stack[NDS_FLT_TASK_STACK_SIZE/sizeof(MS_U32)];
275*53ee8cc1Swenshuai.xi #endif
276*53ee8cc1Swenshuai.xi static MS_S32                       _nds_flt_eventid = -1, _nds_flt_mutexid = -1, _nds_flt_taskid = -1;
277*53ee8cc1Swenshuai.xi 
278*53ee8cc1Swenshuai.xi static NDS_ECM_Flt                  _EcmFlt[NDS_CAM_ECM_FLT_NUM];
279*53ee8cc1Swenshuai.xi static NDS_EMM_Flt                  _EmmFlt;
280*53ee8cc1Swenshuai.xi 
281*53ee8cc1Swenshuai.xi MS_U8                               _u8EmmBuf[MAX_EMM_LIST_NUM][NDS_CAM_FLT_BUF_SIZE];
282*53ee8cc1Swenshuai.xi MS_U8                               _u8EcmBuf[NDS_CAM_ECM_FLT_NUM][2][NDS_CAM_FLT_BUF_SIZE];
283*53ee8cc1Swenshuai.xi 
284*53ee8cc1Swenshuai.xi extern void _verSC_PrintData(MS_U8 *pu8Data, MS_U16 u16DataLen);
285*53ee8cc1Swenshuai.xi 
286*53ee8cc1Swenshuai.xi #if 0
287*53ee8cc1Swenshuai.xi extern NDS_Result NDS_RASP_DefineEcmFilter (NDS_ULONG Xconn , NDS_BYTE ecm_filter_num , NDS_BYTE ecm_filter_control);
288*53ee8cc1Swenshuai.xi extern NDS_Result NDS_RASP_DefineEcmPid (NDS_ULONG Xconn , NDS_BYTE ecm_filter_num ,NDS_USHORT Pid,NDS_BYTE odd_ecm_table_id,NDS_BYTE even_ecm_table_id );
289*53ee8cc1Swenshuai.xi #endif
290*53ee8cc1Swenshuai.xi 
291*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
292*53ee8cc1Swenshuai.xi //  Debug Functions
293*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
294*53ee8cc1Swenshuai.xi 
295*53ee8cc1Swenshuai.xi 
296*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
297*53ee8cc1Swenshuai.xi //  Local Functions
298*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
299*53ee8cc1Swenshuai.xi 
300*53ee8cc1Swenshuai.xi 
301*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
302*53ee8cc1Swenshuai.xi //  Global Functions
303*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
304*53ee8cc1Swenshuai.xi 
305*53ee8cc1Swenshuai.xi //[NEW] refine? is it necessary to reduce OVERFLOW?
306*53ee8cc1Swenshuai.xi MS_BOOL bEmmOverflow = TRUE;
307*53ee8cc1Swenshuai.xi // -Jerry
308*53ee8cc1Swenshuai.xi 
309*53ee8cc1Swenshuai.xi 
_EMM_FreeFilter(void)310*53ee8cc1Swenshuai.xi void _EMM_FreeFilter(void)
311*53ee8cc1Swenshuai.xi {
312*53ee8cc1Swenshuai.xi     int                 i;
313*53ee8cc1Swenshuai.xi 
314*53ee8cc1Swenshuai.xi     MDrv_TSP_FLT_Enable(_EmmFlt.flt_id, FALSE);
315*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
316*53ee8cc1Swenshuai.xi     MDrv_TSP_SecFlt_Free(0, _EmmFlt.buf_id);
317*53ee8cc1Swenshuai.xi #endif
318*53ee8cc1Swenshuai.xi     MDrv_TSP_FLT_Free(_EmmFlt.flt_id);
319*53ee8cc1Swenshuai.xi 
320*53ee8cc1Swenshuai.xi     for (i = 0; i < NDS_CAM_EMM_BUF_NUM; i++)
321*53ee8cc1Swenshuai.xi     {
322*53ee8cc1Swenshuai.xi         memset(_u8EmmBuf[i], 0, NDS_CAM_FLT_BUF_SIZE);
323*53ee8cc1Swenshuai.xi     }
324*53ee8cc1Swenshuai.xi     memset((void*)MS_PA2KSEG1(_nds_flt_dev.param.ecm_emm_addr+NDS_CAM_ECM_BUFS_SIZE), 0, NDS_CAM_FLT_BUF_SIZE * NDS_CAM_EMM_BUF_NUM);
325*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
326*53ee8cc1Swenshuai.xi 
327*53ee8cc1Swenshuai.xi     _EmmFlt.flt_id = NDS_FLT_NULL;
328*53ee8cc1Swenshuai.xi     _EmmFlt.pid = TSP_PID_NULL;
329*53ee8cc1Swenshuai.xi 
330*53ee8cc1Swenshuai.xi     bEmmOverflow = TRUE;
331*53ee8cc1Swenshuai.xi }
332*53ee8cc1Swenshuai.xi 
333*53ee8cc1Swenshuai.xi 
_EMM_AllocFilter(MS_U32 x_connection,MS_U16 pid,MS_U8 emm_filter_control)334*53ee8cc1Swenshuai.xi MS_BOOL _EMM_AllocFilter(MS_U32 x_connection, MS_U16 pid, MS_U8 emm_filter_control)
335*53ee8cc1Swenshuai.xi {
336*53ee8cc1Swenshuai.xi     if (NDS_FLT_NULL != _EmmFlt.flt_id)
337*53ee8cc1Swenshuai.xi     {
338*53ee8cc1Swenshuai.xi         TSP_FltState        eTspState;
339*53ee8cc1Swenshuai.xi         TSP_Result          eTspRet = E_TSP_FAIL;
340*53ee8cc1Swenshuai.xi         eTspRet = MDrv_TSP_FLT_GetState(_EmmFlt.flt_id, &eTspState);
341*53ee8cc1Swenshuai.xi         if (eTspRet == E_TSP_OK && eTspState != E_TSP_FLT_STATE_FREE)
342*53ee8cc1Swenshuai.xi         {
343*53ee8cc1Swenshuai.xi             _EMM_FreeFilter();
344*53ee8cc1Swenshuai.xi         }
345*53ee8cc1Swenshuai.xi     }
346*53ee8cc1Swenshuai.xi 
347*53ee8cc1Swenshuai.xi #if 0 // debugging
348*53ee8cc1Swenshuai.xi     MS_U32          secbuf = 0x0, bufsize = 0x0;
349*53ee8cc1Swenshuai.xi     MS_U32          secid;
350*53ee8cc1Swenshuai.xi     if (secbuf != 0)
351*53ee8cc1Swenshuai.xi     {
352*53ee8cc1Swenshuai.xi         printf("[%s]-[%d] EMM debugging buffer enable\n", __FUNCTION__, __LINE__);
353*53ee8cc1Swenshuai.xi         MDrv_TSP_FLT_Alloc(0, E_TSP_FLT_SRC_TSIF0 | E_TSP_FLT_USER_SEC, &_EmmFlt.flt_id);
354*53ee8cc1Swenshuai.xi //        MDrv_TSP_FLT_SetMode(_EmmFlt.flt_id, E_TSP_FLT_MODE_CONTI);
355*53ee8cc1Swenshuai.xi         MDrv_TSP_SEC_Alloc(0, &secid);
356*53ee8cc1Swenshuai.xi         MDrv_TSP_SEC_SetBuffer(secid, secbuf, bufsize);
357*53ee8cc1Swenshuai.xi         MDrv_TSP_FLT_SelSEC(_EmmFlt.flt_id, secid);
358*53ee8cc1Swenshuai.xi     }
359*53ee8cc1Swenshuai.xi     else
360*53ee8cc1Swenshuai.xi #endif // debugging
361*53ee8cc1Swenshuai.xi     if (E_TSP_OK != MDrv_TSP_FLT_Alloc(0, E_TSP_FLT_SRC_TSIF0 | E_TSP_FLT_USER_EMM, &_EmmFlt.flt_id))
362*53ee8cc1Swenshuai.xi     {
363*53ee8cc1Swenshuai.xi         return FALSE;
364*53ee8cc1Swenshuai.xi     }
365*53ee8cc1Swenshuai.xi 
366*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
367*53ee8cc1Swenshuai.xi     if (E_TSP_OK != MDrv_TSP_SecFlt_Alloc(0, &_EmmFlt.buf_id))
368*53ee8cc1Swenshuai.xi     {
369*53ee8cc1Swenshuai.xi         return FALSE;
370*53ee8cc1Swenshuai.xi     }
371*53ee8cc1Swenshuai.xi     MDrv_TSP_PidFlt_SelSecFlt(0, _EmmFlt.flt_id, _EmmFlt.buf_id);
372*53ee8cc1Swenshuai.xi     MDrv_TSP_SecFlt_SetMode(0, _EmmFlt.buf_id, E_DRVTSP_FLT_MODE_CONTI);
373*53ee8cc1Swenshuai.xi     MDrv_TSP_SecFlt_SetBuffer(0, _EmmFlt.buf_id, (_nds_flt_dev.param.ecm_emm_addr + NDS_CAM_ECM_BUFS_SIZE), NDS_CAM_FLT_BUF_SIZE * NDS_CAM_EMM_BUF_NUM);
374*53ee8cc1Swenshuai.xi #endif
375*53ee8cc1Swenshuai.xi 
376*53ee8cc1Swenshuai.xi     MDrv_TSP_FLT_SetPID(_EmmFlt.flt_id, pid);
377*53ee8cc1Swenshuai.xi     MDrv_TSP_FLT_Enable(_EmmFlt.flt_id, TRUE);
378*53ee8cc1Swenshuai.xi 
379*53ee8cc1Swenshuai.xi     _EmmFlt.pid = pid;
380*53ee8cc1Swenshuai.xi     _EmmFlt.flt_ctrl = emm_filter_control;
381*53ee8cc1Swenshuai.xi     _EmmFlt.x_connect = x_connection;
382*53ee8cc1Swenshuai.xi 
383*53ee8cc1Swenshuai.xi     return TRUE;
384*53ee8cc1Swenshuai.xi }
385*53ee8cc1Swenshuai.xi 
386*53ee8cc1Swenshuai.xi 
387*53ee8cc1Swenshuai.xi // Enable at EMM SetPid
_EMM_EnableFilter(MS_BOOL bEnable)388*53ee8cc1Swenshuai.xi void _EMM_EnableFilter(MS_BOOL bEnable)
389*53ee8cc1Swenshuai.xi {
390*53ee8cc1Swenshuai.xi     MS_U16  emm_pid;
391*53ee8cc1Swenshuai.xi 
392*53ee8cc1Swenshuai.xi     if (bEnable)
393*53ee8cc1Swenshuai.xi     {
394*53ee8cc1Swenshuai.xi         emm_pid = _EmmFlt.pid & CAM_EMM_PID_MASK;
395*53ee8cc1Swenshuai.xi         if (_EmmFlt.flt_ctrl & HDICA_EMM_RECEPTION_ENABLE)
396*53ee8cc1Swenshuai.xi         {
397*53ee8cc1Swenshuai.xi             emm_pid = emm_pid | CAM_EMM_PID_ENABLE;
398*53ee8cc1Swenshuai.xi         }
399*53ee8cc1Swenshuai.xi         if (_EmmFlt.flt_ctrl & HDICA_TABLE_ID_FILTERING_USE)
400*53ee8cc1Swenshuai.xi         {
401*53ee8cc1Swenshuai.xi             emm_pid = emm_pid | CAM_EMM_PID_TID_ENABLE;
402*53ee8cc1Swenshuai.xi         }
403*53ee8cc1Swenshuai.xi 
404*53ee8cc1Swenshuai.xi         CAM_REG(REG_CAM_EMM_PID) = emm_pid;
405*53ee8cc1Swenshuai.xi     }
406*53ee8cc1Swenshuai.xi     else
407*53ee8cc1Swenshuai.xi     {
408*53ee8cc1Swenshuai.xi         // disable EMM filtering
409*53ee8cc1Swenshuai.xi         CAM_REG(REG_CAM_EMM_PID) = _EmmFlt.pid; // Clear [15:14]
410*53ee8cc1Swenshuai.xi     }
411*53ee8cc1Swenshuai.xi }
412*53ee8cc1Swenshuai.xi 
413*53ee8cc1Swenshuai.xi 
_ECM_FreeFilter(MS_U8 ecm_id)414*53ee8cc1Swenshuai.xi void _ECM_FreeFilter(MS_U8 ecm_id)
415*53ee8cc1Swenshuai.xi {
416*53ee8cc1Swenshuai.xi     MDrv_TSP_FLT_Enable(_EcmFlt[ecm_id].flt_id, FALSE);
417*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
418*53ee8cc1Swenshuai.xi     MDrv_TSP_SecFlt_Free(0, _EcmFlt[ecm_id].buf_id);
419*53ee8cc1Swenshuai.xi #endif
420*53ee8cc1Swenshuai.xi     MDrv_TSP_FLT_Free(_EcmFlt[ecm_id].flt_id);
421*53ee8cc1Swenshuai.xi 
422*53ee8cc1Swenshuai.xi     memset(_u8EcmBuf[ecm_id][0], 0, NDS_CAM_FLT_BUF_SIZE);
423*53ee8cc1Swenshuai.xi     memset(_u8EcmBuf[ecm_id][1], 0, NDS_CAM_FLT_BUF_SIZE);
424*53ee8cc1Swenshuai.xi     memset((void*)MS_PA2KSEG1(_nds_flt_dev.param.ecm_emm_addr + NDS_CAM_FLT_BUF_SIZE*ecm_id), 0, NDS_CAM_FLT_BUF_SIZE);
425*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
426*53ee8cc1Swenshuai.xi 
427*53ee8cc1Swenshuai.xi     _EcmFlt[ecm_id].flt_id = NDS_FLT_NULL;
428*53ee8cc1Swenshuai.xi     _EcmFlt[ecm_id].pid = TSP_PID_NULL;
429*53ee8cc1Swenshuai.xi     _EcmFlt[ecm_id].b_defined = FALSE;
430*53ee8cc1Swenshuai.xi }
431*53ee8cc1Swenshuai.xi 
432*53ee8cc1Swenshuai.xi 
_ECM_AllocFilter(MS_U32 x_connection,MS_U8 ecm_filter_num,MS_U16 pid)433*53ee8cc1Swenshuai.xi MS_BOOL _ECM_AllocFilter(MS_U32 x_connection, MS_U8 ecm_filter_num, MS_U16 pid)
434*53ee8cc1Swenshuai.xi {
435*53ee8cc1Swenshuai.xi     if (NDS_FLT_NULL != _EcmFlt[ecm_filter_num].flt_id)
436*53ee8cc1Swenshuai.xi     {
437*53ee8cc1Swenshuai.xi         TSP_FltState        eTspState;
438*53ee8cc1Swenshuai.xi         TSP_Result          eTspRet = E_TSP_OK;
439*53ee8cc1Swenshuai.xi         eTspRet = MDrv_TSP_FLT_GetState(_EcmFlt[ecm_filter_num].flt_id, &eTspState);
440*53ee8cc1Swenshuai.xi         if (eTspState != E_TSP_FLT_STATE_FREE && eTspRet == E_TSP_OK)
441*53ee8cc1Swenshuai.xi         {
442*53ee8cc1Swenshuai.xi             _ECM_FreeFilter(ecm_filter_num);
443*53ee8cc1Swenshuai.xi         }
444*53ee8cc1Swenshuai.xi     }
445*53ee8cc1Swenshuai.xi 
446*53ee8cc1Swenshuai.xi     if (E_TSP_OK != MDrv_TSP_FLT_Alloc(0, E_TSP_FLT_SRC_TSIF0 | E_TSP_FLT_USER_ECM, &_EcmFlt[ecm_filter_num].flt_id))
447*53ee8cc1Swenshuai.xi     {
448*53ee8cc1Swenshuai.xi         return FALSE;
449*53ee8cc1Swenshuai.xi     }
450*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
451*53ee8cc1Swenshuai.xi     if (E_TSP_OK != MDrv_TSP_SecFlt_Alloc(0, &_EcmFlt[ecm_filter_num].buf_id))
452*53ee8cc1Swenshuai.xi     {
453*53ee8cc1Swenshuai.xi         return FALSE;
454*53ee8cc1Swenshuai.xi     }
455*53ee8cc1Swenshuai.xi     MDrv_TSP_SecFlt_SetEcmIdx(0, _EcmFlt[ecm_filter_num].buf_id, _EcmFlt[ecm_filter_num].ecm_id);
456*53ee8cc1Swenshuai.xi     MDrv_TSP_PidFlt_SelSecFlt(0, _EcmFlt[ecm_filter_num].flt_id, _EcmFlt[ecm_filter_num].buf_id);
457*53ee8cc1Swenshuai.xi     MDrv_TSP_SecFlt_SetMode(0, _EcmFlt[ecm_filter_num].buf_id, E_DRVTSP_FLT_MODE_ONESHOT | E_DRVTSP_FLT_MODE_CRCCHK);
458*53ee8cc1Swenshuai.xi     MDrv_TSP_SecFlt_SetBuffer(0, _EcmFlt[ecm_filter_num].buf_id, (_nds_flt_dev.param.ecm_emm_addr + (NDS_CAM_FLT_BUF_SIZE*ecm_filter_num)), NDS_CAM_FLT_BUF_SIZE);
459*53ee8cc1Swenshuai.xi #endif
460*53ee8cc1Swenshuai.xi 
461*53ee8cc1Swenshuai.xi     _EcmFlt[ecm_filter_num].pid = pid;
462*53ee8cc1Swenshuai.xi     _EcmFlt[ecm_filter_num].ecm_id = ecm_filter_num;
463*53ee8cc1Swenshuai.xi     _EcmFlt[ecm_filter_num].x_connect = x_connection;
464*53ee8cc1Swenshuai.xi 
465*53ee8cc1Swenshuai.xi     return TRUE;
466*53ee8cc1Swenshuai.xi }
467*53ee8cc1Swenshuai.xi 
468*53ee8cc1Swenshuai.xi 
469*53ee8cc1Swenshuai.xi // Enable at ECM Define
_ECM_EnableFilter(MS_U32 x_connection,MS_U8 u8Filter_num,MS_BOOL bEnable,MS_U8 u8Ctrl)470*53ee8cc1Swenshuai.xi void _ECM_EnableFilter(MS_U32 x_connection, MS_U8 u8Filter_num, MS_BOOL bEnable, MS_U8 u8Ctrl)
471*53ee8cc1Swenshuai.xi {
472*53ee8cc1Swenshuai.xi     MS_BOOL             bFristSet = FALSE;
473*53ee8cc1Swenshuai.xi     MS_U16              u16Pid = _EcmFlt[u8Filter_num].pid;
474*53ee8cc1Swenshuai.xi     int                 i;
475*53ee8cc1Swenshuai.xi 
476*53ee8cc1Swenshuai.xi     if (_EcmFlt[u8Filter_num].flt_id != NDS_FLT_NULL)
477*53ee8cc1Swenshuai.xi     {
478*53ee8cc1Swenshuai.xi #if NDS_ECM_SAME_PID_DROP_EN
479*53ee8cc1Swenshuai.xi         if (bEnable)
480*53ee8cc1Swenshuai.xi         {
481*53ee8cc1Swenshuai.xi             _EcmFlt[u8Filter_num].u8Ctrl = u8Ctrl;
482*53ee8cc1Swenshuai.xi             for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++)
483*53ee8cc1Swenshuai.xi             {
484*53ee8cc1Swenshuai.xi                 if (_EcmFlt[i].pid == u16Pid)
485*53ee8cc1Swenshuai.xi                 {
486*53ee8cc1Swenshuai.xi                     if (_EcmFlt[i].u8Ctrl > 0 && bFristSet == FALSE)
487*53ee8cc1Swenshuai.xi                     {
488*53ee8cc1Swenshuai.xi                         bFristSet = TRUE;
489*53ee8cc1Swenshuai.xi                         _EcmFlt[i].u8Drop = 0;
490*53ee8cc1Swenshuai.xi                     }
491*53ee8cc1Swenshuai.xi                     else
492*53ee8cc1Swenshuai.xi                     {
493*53ee8cc1Swenshuai.xi                         _EcmFlt[i].u8Drop = 1;
494*53ee8cc1Swenshuai.xi                     }
495*53ee8cc1Swenshuai.xi                 }
496*53ee8cc1Swenshuai.xi             }
497*53ee8cc1Swenshuai.xi         }
498*53ee8cc1Swenshuai.xi         else
499*53ee8cc1Swenshuai.xi         {
500*53ee8cc1Swenshuai.xi             _EcmFlt[u8Filter_num].u8Ctrl = 0;
501*53ee8cc1Swenshuai.xi         }
502*53ee8cc1Swenshuai.xi #endif
503*53ee8cc1Swenshuai.xi         if (bEnable)
504*53ee8cc1Swenshuai.xi         {
505*53ee8cc1Swenshuai.xi             // non-NULL PID to enable filter
506*53ee8cc1Swenshuai.xi             MDrv_TSP_FLT_SetPID(_EcmFlt[u8Filter_num].flt_id, _EcmFlt[u8Filter_num].pid);
507*53ee8cc1Swenshuai.xi         }
508*53ee8cc1Swenshuai.xi         else
509*53ee8cc1Swenshuai.xi         {
510*53ee8cc1Swenshuai.xi             MDrv_TSP_FLT_SetPID(_EcmFlt[u8Filter_num].flt_id, TSP_PID_NULL);
511*53ee8cc1Swenshuai.xi         }
512*53ee8cc1Swenshuai.xi 
513*53ee8cc1Swenshuai.xi         MDrv_TSP_FLT_Enable(_EcmFlt[u8Filter_num].flt_id, bEnable);
514*53ee8cc1Swenshuai.xi     }
515*53ee8cc1Swenshuai.xi }
516*53ee8cc1Swenshuai.xi 
517*53ee8cc1Swenshuai.xi 
_NDS_REC_GetPktCount(MS_U32 x_connection,MS_U32 * hi_count,MS_U32 * lo_count)518*53ee8cc1Swenshuai.xi void _NDS_REC_GetPktCount(MS_U32 x_connection, MS_U32 *hi_count, MS_U32 *lo_count)
519*53ee8cc1Swenshuai.xi {
520*53ee8cc1Swenshuai.xi     *hi_count = 0xFFFFFFFF;
521*53ee8cc1Swenshuai.xi     *lo_count = 0xFFFFFFFF;
522*53ee8cc1Swenshuai.xi 
523*53ee8cc1Swenshuai.xi     return;
524*53ee8cc1Swenshuai.xi }
525*53ee8cc1Swenshuai.xi 
526*53ee8cc1Swenshuai.xi 
527*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
_NDS_FLT_Isr(int irq,void * dev_id)528*53ee8cc1Swenshuai.xi static irqreturn_t _NDS_FLT_Isr(int irq, void *dev_id)
529*53ee8cc1Swenshuai.xi #else
530*53ee8cc1Swenshuai.xi static void _NDS_FLT_Isr(InterruptNum eIntNum)
531*53ee8cc1Swenshuai.xi #endif
532*53ee8cc1Swenshuai.xi {
533*53ee8cc1Swenshuai.xi     MS_U8               u8IntReg, emm_idx, u8EcmReg;
534*53ee8cc1Swenshuai.xi     MS_U8               ecm_polarity;
535*53ee8cc1Swenshuai.xi     int                 i;
536*53ee8cc1Swenshuai.xi 
537*53ee8cc1Swenshuai.xi     u8IntReg = CAM_REG(REG_CAM_CA_INT);
538*53ee8cc1Swenshuai.xi 
539*53ee8cc1Swenshuai.xi     // EMM
540*53ee8cc1Swenshuai.xi     if (u8IntReg & (CAM_CA_INT_EMM_OVERFLOW))
541*53ee8cc1Swenshuai.xi     {
542*53ee8cc1Swenshuai.xi         CAM_REG(REG_CAM_CA_INT) = (CAM_CA_INT_MASK_RESET_MODE | CAM_CA_INT_EMM_OVERFLOW); // clear EMM overflow
543*53ee8cc1Swenshuai.xi         CAM_REG(REG_CAM_CA_INT) = (CAM_CA_INT_ECM | CAM_CA_INT_EMM | CAM_CA_INT_EMM_OVERFLOW); // enable interrupt
544*53ee8cc1Swenshuai.xi 
545*53ee8cc1Swenshuai.xi #if NDS_EMM_PASSIVE
546*53ee8cc1Swenshuai.xi         if (bEmmOverflow == FALSE)
547*53ee8cc1Swenshuai.xi         {
548*53ee8cc1Swenshuai.xi             bEmmOverflow = TRUE;
549*53ee8cc1Swenshuai.xi         }
550*53ee8cc1Swenshuai.xi #endif
551*53ee8cc1Swenshuai.xi 
552*53ee8cc1Swenshuai.xi         MsOS_SetEvent(_nds_flt_eventid, NDS_EMM_EVENT_BUFFER | NDS_EMM_EVENT_OVERFLOW_HW);
553*53ee8cc1Swenshuai.xi     }
554*53ee8cc1Swenshuai.xi     else if (u8IntReg & (CAM_CA_INT_EMM))
555*53ee8cc1Swenshuai.xi     {
556*53ee8cc1Swenshuai.xi         // @TODO: add R/W pointer of _u8EmmBuf
557*53ee8cc1Swenshuai.xi         // Make sure no event lost at IPC
558*53ee8cc1Swenshuai.xi         CAM_REG(REG_CAM_CA_INT) = (CAM_CA_INT_ECM | CAM_CA_INT_EMM | CAM_CA_INT_EMM_OVERFLOW);
559*53ee8cc1Swenshuai.xi 
560*53ee8cc1Swenshuai.xi         // u8EmmReg is Emm index 0~9, 0x1000 is ack.
561*53ee8cc1Swenshuai.xi         emm_idx = CAM_REG(REG_CAM_EMM_INT_STAT) & CAM_EMM_INT_BUF_MASK;
562*53ee8cc1Swenshuai.xi 
563*53ee8cc1Swenshuai.xi //[NEW] EMM queue management
564*53ee8cc1Swenshuai.xi // it's the only way to handle no-sync index for ACT at overflow
565*53ee8cc1Swenshuai.xi 
566*53ee8cc1Swenshuai.xi #if NDS_EMM_PASSIVE
567*53ee8cc1Swenshuai.xi         if (bEmmOverflow == FALSE)
568*53ee8cc1Swenshuai.xi         {
569*53ee8cc1Swenshuai.xi #endif
570*53ee8cc1Swenshuai.xi             if (emmQueueIsFull())
571*53ee8cc1Swenshuai.xi             {
572*53ee8cc1Swenshuai.xi #if NDS_EMM_PASSIVE
573*53ee8cc1Swenshuai.xi                 bEmmOverflow = TRUE;
574*53ee8cc1Swenshuai.xi #endif
575*53ee8cc1Swenshuai.xi                 MsOS_SetEvent(_nds_flt_eventid, NDS_EMM_EVENT_BUFFER | NDS_EMM_EVENT_OVERFLOW_SW);
576*53ee8cc1Swenshuai.xi             }
577*53ee8cc1Swenshuai.xi             else
578*53ee8cc1Swenshuai.xi             {
579*53ee8cc1Swenshuai.xi                 MsOS_ReadMemory();
580*53ee8cc1Swenshuai.xi                 memcpy(_u8EmmBuf[_u8EmmWrite], (void*)MS_PA2KSEG1(_nds_flt_dev.param.ecm_emm_addr+NDS_CAM_ECM_BUFS_SIZE+(NDS_CAM_FLT_BUF_SIZE*emm_idx)), 188);
581*53ee8cc1Swenshuai.xi                 MsOS_SetEvent(_nds_flt_eventid, NDS_EMM_EVENT_BUFFER+emm_idx);
582*53ee8cc1Swenshuai.xi                 emmQueueInc();
583*53ee8cc1Swenshuai.xi             }
584*53ee8cc1Swenshuai.xi #if NDS_EMM_PASSIVE
585*53ee8cc1Swenshuai.xi         }
586*53ee8cc1Swenshuai.xi         else
587*53ee8cc1Swenshuai.xi         {
588*53ee8cc1Swenshuai.xi             MsOS_SetEvent(_nds_flt_eventid, NDS_EMM_EVENT_BUFFER);
589*53ee8cc1Swenshuai.xi         }
590*53ee8cc1Swenshuai.xi #endif
591*53ee8cc1Swenshuai.xi // -jerry
592*53ee8cc1Swenshuai.xi 
593*53ee8cc1Swenshuai.xi         // Ack and Clear EMM interrupt
594*53ee8cc1Swenshuai.xi         CAM_REG(REG_CAM_EMM_INT_STAT) = CAM_EMM_INT_ACK;
595*53ee8cc1Swenshuai.xi     }
596*53ee8cc1Swenshuai.xi 
597*53ee8cc1Swenshuai.xi     // ECM
598*53ee8cc1Swenshuai.xi     if (u8IntReg & (CAM_CA_INT_ECM))
599*53ee8cc1Swenshuai.xi     {
600*53ee8cc1Swenshuai.xi         u8EcmReg = CAM_REG(REG_CAM_ECM_INT_STAT);
601*53ee8cc1Swenshuai.xi 
602*53ee8cc1Swenshuai.xi         // bit0~5 to indicate six slot
603*53ee8cc1Swenshuai.xi         for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++)
604*53ee8cc1Swenshuai.xi         {
605*53ee8cc1Swenshuai.xi             if (u8EcmReg & (0x1 << i))
606*53ee8cc1Swenshuai.xi             {
607*53ee8cc1Swenshuai.xi                 MS_U8   *pEcmData;
608*53ee8cc1Swenshuai.xi 
609*53ee8cc1Swenshuai.xi                 CAM_REG(REG_CAM_ECM_INT_STAT) = (0x1 << i);
610*53ee8cc1Swenshuai.xi 
611*53ee8cc1Swenshuai.xi #if NDS_ECM_SAME_PID_DROP_EN
612*53ee8cc1Swenshuai.xi                 if (_EcmFlt[i].u8Drop == 1)
613*53ee8cc1Swenshuai.xi                     continue;
614*53ee8cc1Swenshuai.xi #endif
615*53ee8cc1Swenshuai.xi 
616*53ee8cc1Swenshuai.xi                 pEcmData = (void *)MS_PA2KSEG1(_nds_flt_dev.param.ecm_emm_addr+(NDS_CAM_FLT_BUF_SIZE*i));
617*53ee8cc1Swenshuai.xi                 MsOS_ReadMemory();
618*53ee8cc1Swenshuai.xi                 if (pEcmData[0] != 0x47)
619*53ee8cc1Swenshuai.xi                 {
620*53ee8cc1Swenshuai.xi                     continue; //_NDS_ASSERT_;
621*53ee8cc1Swenshuai.xi                 }
622*53ee8cc1Swenshuai.xi                 if (pEcmData[5] == 0x80)
623*53ee8cc1Swenshuai.xi                 {
624*53ee8cc1Swenshuai.xi                     ecm_polarity = 0; // EVEN
625*53ee8cc1Swenshuai.xi                 }
626*53ee8cc1Swenshuai.xi                 else if (pEcmData[5] == 0x81)
627*53ee8cc1Swenshuai.xi                 {
628*53ee8cc1Swenshuai.xi                     ecm_polarity = 1; // ODD
629*53ee8cc1Swenshuai.xi                 }
630*53ee8cc1Swenshuai.xi                 else
631*53ee8cc1Swenshuai.xi                 {
632*53ee8cc1Swenshuai.xi                     NDS_ASSERT(FALSE, , "[%s]-[%d]\n", __FUNCTION__, __LINE__);
633*53ee8cc1Swenshuai.xi                 }
634*53ee8cc1Swenshuai.xi 
635*53ee8cc1Swenshuai.xi                 if (_u8EcmBuf[i][ecm_polarity][0] == 0) // if buffer empty
636*53ee8cc1Swenshuai.xi                 {
637*53ee8cc1Swenshuai.xi                     // @TODO: Manual Lock
638*53ee8cc1Swenshuai.xi                     // Check auto/manual mode
639*53ee8cc1Swenshuai.xi                     // Set correspondant setting
640*53ee8cc1Swenshuai.xi 
641*53ee8cc1Swenshuai.xi                     MsOS_ReadMemory();
642*53ee8cc1Swenshuai.xi                     memcpy(_u8EcmBuf[i][ecm_polarity], pEcmData, 188);
643*53ee8cc1Swenshuai.xi 
644*53ee8cc1Swenshuai.xi                     // if ECM incomming at this time, the buffer could be dirty
645*53ee8cc1Swenshuai.xi                     if (CAM_REG(REG_CAM_ECM_INT_STAT) & (0x1 << i))
646*53ee8cc1Swenshuai.xi                     {
647*53ee8cc1Swenshuai.xi                         // ECM overfolw
648*53ee8cc1Swenshuai.xi                         MsOS_SetEvent(_nds_flt_eventid, 0x1 << (i + NDS_ECM_EVENT_OVERFLOW_SHFT));
649*53ee8cc1Swenshuai.xi                         continue;
650*53ee8cc1Swenshuai.xi                     }
651*53ee8cc1Swenshuai.xi 
652*53ee8cc1Swenshuai.xi                     MsOS_SetEvent(_nds_flt_eventid, (0x1 << (i*2 + NDS_ECM_EVENT_FILTER_SHFT)) << ecm_polarity);
653*53ee8cc1Swenshuai.xi                 }
654*53ee8cc1Swenshuai.xi                 else
655*53ee8cc1Swenshuai.xi                 {
656*53ee8cc1Swenshuai.xi                     //_NDS_ASSERT_;
657*53ee8cc1Swenshuai.xi                     // ECM overfolw
658*53ee8cc1Swenshuai.xi                     MsOS_SetEvent(_nds_flt_eventid, 0x1 << (i + NDS_ECM_EVENT_OVERFLOW_SHFT));
659*53ee8cc1Swenshuai.xi                     break;
660*53ee8cc1Swenshuai.xi                 }
661*53ee8cc1Swenshuai.xi             }
662*53ee8cc1Swenshuai.xi         }
663*53ee8cc1Swenshuai.xi     }
664*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
665*53ee8cc1Swenshuai.xi     return IRQ_HANDLED;
666*53ee8cc1Swenshuai.xi #else
667*53ee8cc1Swenshuai.xi     // IRQ handled
668*53ee8cc1Swenshuai.xi     NDS_FLT_OS_EnableInterrupt();
669*53ee8cc1Swenshuai.xi #endif
670*53ee8cc1Swenshuai.xi }
671*53ee8cc1Swenshuai.xi 
672*53ee8cc1Swenshuai.xi 
673*53ee8cc1Swenshuai.xi //[NEW]
674*53ee8cc1Swenshuai.xi MS_U32 emm_overflow_time = 0;
675*53ee8cc1Swenshuai.xi // -jerry
676*53ee8cc1Swenshuai.xi 
677*53ee8cc1Swenshuai.xi 
_NDS_FLT_IsrTask(void)678*53ee8cc1Swenshuai.xi static void _NDS_FLT_IsrTask(void)
679*53ee8cc1Swenshuai.xi {
680*53ee8cc1Swenshuai.xi     MS_U32              u32Events, hi_count, lo_count;
681*53ee8cc1Swenshuai.xi     XECM_MSG            ecm_msg;
682*53ee8cc1Swenshuai.xi     XEMM_MSG            emm_msg;
683*53ee8cc1Swenshuai.xi     int                 i, p;
684*53ee8cc1Swenshuai.xi 
685*53ee8cc1Swenshuai.xi     while(1)
686*53ee8cc1Swenshuai.xi     {
687*53ee8cc1Swenshuai.xi         MsOS_WaitEvent(_nds_flt_eventid, NDS_ALL_EVENT, &u32Events, E_OR_CLEAR, MSOS_WAIT_FOREVER);
688*53ee8cc1Swenshuai.xi 
689*53ee8cc1Swenshuai.xi         //u8EmmReg = CAM_REG(REG_CAM_EMM_INT_STAT);
690*53ee8cc1Swenshuai.xi         //MsOS_DisableInterrupt(NDS_EMMECM_IRQ);
691*53ee8cc1Swenshuai.xi 
692*53ee8cc1Swenshuai.xi #if (NDS_EMM_PASSIVE==0)
693*53ee8cc1Swenshuai.xi         if (u32Events & (NDS_EMM_EVENT_OVERFLOW_HW | NDS_EMM_EVENT_OVERFLOW_SW))
694*53ee8cc1Swenshuai.xi         {
695*53ee8cc1Swenshuai.xi             NDS_FLT_LOCK(); // for disable interrupt protection
696*53ee8cc1Swenshuai.xi             if (bEmmOverflow == FALSE)
697*53ee8cc1Swenshuai.xi             {
698*53ee8cc1Swenshuai.xi                 _EMM_EnableFilter(FALSE);
699*53ee8cc1Swenshuai.xi                 bEmmOverflow = TRUE;
700*53ee8cc1Swenshuai.xi             }
701*53ee8cc1Swenshuai.xi             NDS_FLT_UNLOCK();
702*53ee8cc1Swenshuai.xi         }
703*53ee8cc1Swenshuai.xi #endif
704*53ee8cc1Swenshuai.xi 
705*53ee8cc1Swenshuai.xi         for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++)
706*53ee8cc1Swenshuai.xi         {
707*53ee8cc1Swenshuai.xi             if (u32Events & (0x1 << (i + NDS_ECM_EVENT_OVERFLOW_SHFT)))
708*53ee8cc1Swenshuai.xi             {
709*53ee8cc1Swenshuai.xi                 printf("\n\nECM_OVERFLOW\n\n");
710*53ee8cc1Swenshuai.xi                 //[FIXME] for ecm test , reset buffer at XCORECA_EcmReceived
711*53ee8cc1Swenshuai.xi                 //memset(_u8EcmBuf[i][0], 0, 188);
712*53ee8cc1Swenshuai.xi                 //memset(_u8EcmBuf[i][1], 0, 188);
713*53ee8cc1Swenshuai.xi 
714*53ee8cc1Swenshuai.xi                 ecm_msg.ecm_buf_ptr = _u8EcmBuf[i][0];
715*53ee8cc1Swenshuai.xi                 ecm_msg.rcv_status  = ECM_OVERFLOW;
716*53ee8cc1Swenshuai.xi                 _NDS_REC_GetPktCount(_EcmFlt[i].x_connect, &hi_count, &lo_count);
717*53ee8cc1Swenshuai.xi 
718*53ee8cc1Swenshuai.xi                 // if USER return fail, it will release the buffer
719*53ee8cc1Swenshuai.xi                 //XCORECA_EcmReceived(0, &ecm_msg , hi_count, lo_count);
720*53ee8cc1Swenshuai.xi                 XCORECA_EcmReceived(_EcmFlt[i].x_connect, &ecm_msg , hi_count, lo_count);
721*53ee8cc1Swenshuai.xi                 //_NDS_ASSERT_;
722*53ee8cc1Swenshuai.xi             }
723*53ee8cc1Swenshuai.xi             else // if (u32Events & (0x1 << (i + NDS_ECM_EVENT_ODD_SHFT)))
724*53ee8cc1Swenshuai.xi             {
725*53ee8cc1Swenshuai.xi                 MS_U8   valid = (u32Events >> (i*2 + NDS_ECM_EVENT_FILTER_SHFT)) & 0x3;
726*53ee8cc1Swenshuai.xi                 if (valid) // any ODD/EVEN buffer arrival
727*53ee8cc1Swenshuai.xi                 {
728*53ee8cc1Swenshuai.xi                     for (p = 0; p < 2; p++)
729*53ee8cc1Swenshuai.xi                     {
730*53ee8cc1Swenshuai.xi                         if ( (valid & (0x1<<p)) && _u8EcmBuf[i][p][0] == 0x47 && _u8EcmBuf[i][p][5] == (0x80|p)) // 0x80, 0x81
731*53ee8cc1Swenshuai.xi                         {
732*53ee8cc1Swenshuai.xi                             ecm_msg.ecm_filter_num = i;
733*53ee8cc1Swenshuai.xi                             ecm_msg.ecm_buf_ptr    = _u8EcmBuf[i][p]+8;
734*53ee8cc1Swenshuai.xi                             ecm_msg.ecm_polarity   = ((p==0) ? HDICA_EVEN_BUFFER : HDICA_ODD_BUFFER);
735*53ee8cc1Swenshuai.xi                             ecm_msg.rcv_status     = ECM_OK;
736*53ee8cc1Swenshuai.xi                             _NDS_REC_GetPktCount(_EcmFlt[i].x_connect, &hi_count, &lo_count);
737*53ee8cc1Swenshuai.xi 
738*53ee8cc1Swenshuai.xi                             // if USER return fail, it will release the buffer
739*53ee8cc1Swenshuai.xi                             NDS_FLT_DBG("\n\nECM_RECV %d %d %ld\n\n", i, ecm_msg.ecm_polarity, MsOS_GetSystemTime());
740*53ee8cc1Swenshuai.xi                             if (XCORECA_EcmReceived(_EcmFlt[i].x_connect, &ecm_msg , hi_count, lo_count) != CA_OK)
741*53ee8cc1Swenshuai.xi                             {
742*53ee8cc1Swenshuai.xi                                 XHDICA_ReleaseEcmBuffer(_EcmFlt[i].x_connect, ecm_msg.ecm_filter_num, ecm_msg.ecm_polarity, ecm_msg.ecm_buf_ptr);
743*53ee8cc1Swenshuai.xi                             }
744*53ee8cc1Swenshuai.xi                         }
745*53ee8cc1Swenshuai.xi                     }
746*53ee8cc1Swenshuai.xi                 }
747*53ee8cc1Swenshuai.xi 
748*53ee8cc1Swenshuai.xi             }
749*53ee8cc1Swenshuai.xi         }
750*53ee8cc1Swenshuai.xi 
751*53ee8cc1Swenshuai.xi         // Issue all EMM received
752*53ee8cc1Swenshuai.xi         if (u32Events & NDS_EMM_EVENT_BUFFER)
753*53ee8cc1Swenshuai.xi         {
754*53ee8cc1Swenshuai.xi             NDS_FLT_DBG("[%s][%d] ======> evt r c w s = %08x %02d %02d %02d %02d\n", __FUNCTION__, __LINE__, u32Events, _u8EmmRead, _u8EmmCur, _u8EmmWrite, u32UsedSize);
755*53ee8cc1Swenshuai.xi // #if NDS_EMM_PASSIVE
756*53ee8cc1Swenshuai.xi #if 0
757*53ee8cc1Swenshuai.xi             if (_u8EmmCur != _u8EmmWrite)
758*53ee8cc1Swenshuai.xi #else // NDS_EMM_PASSIVE==0
759*53ee8cc1Swenshuai.xi             MS_U32 u32UsedSize = ((_u8EmmWrite >= _u8EmmCur) ? (_u8EmmWrite - _u8EmmCur) : (MAX_EMM_LIST_NUM - _u8EmmCur + _u8EmmWrite));
760*53ee8cc1Swenshuai.xi             for (; u32UsedSize > 0; u32UsedSize--)
761*53ee8cc1Swenshuai.xi #endif
762*53ee8cc1Swenshuai.xi             // while (!emmQueueIsEmpty())
763*53ee8cc1Swenshuai.xi             {
764*53ee8cc1Swenshuai.xi                 if (_u8EmmBuf[_u8EmmCur][0] != 0x47)
765*53ee8cc1Swenshuai.xi                 {
766*53ee8cc1Swenshuai.xi                     NDS_FLT_DBG("[%s] %d is NULL\n", __FUNCTION__, _u8EmmCur);
767*53ee8cc1Swenshuai.xi                     goto jump_next_emm;
768*53ee8cc1Swenshuai.xi                     // MY_ASSERT(0);
769*53ee8cc1Swenshuai.xi                 }
770*53ee8cc1Swenshuai.xi                 emm_msg.emm_buf        = &_u8EmmBuf[_u8EmmCur][8]; // emm payload
771*53ee8cc1Swenshuai.xi                 emm_msg.receive_status = EMM_OK;
772*53ee8cc1Swenshuai.xi                 NDS_FLT_DBG("\n\nEMM_RECV %ld\n\n", MsOS_GetSystemTime());
773*53ee8cc1Swenshuai.xi                 if (XCORECA_EmmReceived( _EmmFlt.x_connect, &emm_msg ) != CA_OK)
774*53ee8cc1Swenshuai.xi                 {
775*53ee8cc1Swenshuai.xi                     XHDICA_ReleaseEmmBuffer(_EmmFlt.x_connect, emm_msg.emm_buf);
776*53ee8cc1Swenshuai.xi                 }
777*53ee8cc1Swenshuai.xi jump_next_emm:
778*53ee8cc1Swenshuai.xi                 _u8EmmCur++;
779*53ee8cc1Swenshuai.xi                 if (MAX_EMM_LIST_NUM <= _u8EmmCur)
780*53ee8cc1Swenshuai.xi                 {
781*53ee8cc1Swenshuai.xi                     _u8EmmCur = 0;
782*53ee8cc1Swenshuai.xi                 }
783*53ee8cc1Swenshuai.xi                 //emmQueueDec();
784*53ee8cc1Swenshuai.xi             }
785*53ee8cc1Swenshuai.xi         }
786*53ee8cc1Swenshuai.xi 
787*53ee8cc1Swenshuai.xi         if ( (u32Events & (NDS_EMM_EVENT_OVERFLOW_HW | NDS_EMM_EVENT_OVERFLOW_SW)) )
788*53ee8cc1Swenshuai.xi         {
789*53ee8cc1Swenshuai.xi             //MDrv_TSP_FLT_Enable(_EmmFlt.flt_id, FALSE);
790*53ee8cc1Swenshuai.xi             //FIXME: remove it            emmQueueReset();
791*53ee8cc1Swenshuai.xi 
792*53ee8cc1Swenshuai.xi             NDS_FLT_DBG("[%s][%d] ======> evt r c w = %08x %02d %02d %02d\n", __FUNCTION__, __LINE__, u32Events, _u8EmmRead, _u8EmmCur, _u8EmmWrite);
793*53ee8cc1Swenshuai.xi 
794*53ee8cc1Swenshuai.xi             if (u32Events & NDS_EMM_EVENT_OVERFLOW_HW)
795*53ee8cc1Swenshuai.xi             {
796*53ee8cc1Swenshuai.xi                 printf("\n\nEMM_OVERFLOW(HW)\n\n");
797*53ee8cc1Swenshuai.xi                 #if defined(CHIP_U3)
798*53ee8cc1Swenshuai.xi                 MDrv_TSP_SecFlt_ResetBuffer(0, _EmmFlt.buf_id);
799*53ee8cc1Swenshuai.xi                 #endif
800*53ee8cc1Swenshuai.xi             }
801*53ee8cc1Swenshuai.xi             if (u32Events & NDS_EMM_EVENT_OVERFLOW_SW)
802*53ee8cc1Swenshuai.xi             {
803*53ee8cc1Swenshuai.xi                 printf("\n\n\nEMM_OVERFLOW(SW)\n\n");
804*53ee8cc1Swenshuai.xi             }
805*53ee8cc1Swenshuai.xi             emm_msg.emm_buf        = NULL;
806*53ee8cc1Swenshuai.xi             emm_msg.receive_status = EMM_OVERFLOW;
807*53ee8cc1Swenshuai.xi 
808*53ee8cc1Swenshuai.xi             XCORECA_EmmReceived(_EmmFlt.x_connect, &emm_msg);
809*53ee8cc1Swenshuai.xi 
810*53ee8cc1Swenshuai.xi             emm_overflow_time = MsOS_GetSystemTime();
811*53ee8cc1Swenshuai.xi /*
812*53ee8cc1Swenshuai.xi             for (i = 0; i < NDS_CAM_EMM_BUF_NUM; i++)
813*53ee8cc1Swenshuai.xi             {
814*53ee8cc1Swenshuai.xi                 memset(_u8EmmBuf[i], 0, 188); // release all emm buf
815*53ee8cc1Swenshuai.xi             }
816*53ee8cc1Swenshuai.xi */
817*53ee8cc1Swenshuai.xi 
818*53ee8cc1Swenshuai.xi //FIXME: enable after all release!!
819*53ee8cc1Swenshuai.xi //            _EnableFilter(TRUE);
820*53ee8cc1Swenshuai.xi         }
821*53ee8cc1Swenshuai.xi 
822*53ee8cc1Swenshuai.xi         u32Events = 0;
823*53ee8cc1Swenshuai.xi 
824*53ee8cc1Swenshuai.xi         // enable all interrupt
825*53ee8cc1Swenshuai.xi         // @TODO: add R/W pointer of _u8EmmBuf to make sure no EMM lost.
826*53ee8cc1Swenshuai.xi         // @NOTE: only effective for EMM now
827*53ee8cc1Swenshuai.xi         CAM_REG(REG_CAM_CA_INT) = (CAM_CA_INT_ECM | CAM_CA_INT_EMM | CAM_CA_INT_EMM_OVERFLOW);
828*53ee8cc1Swenshuai.xi 
829*53ee8cc1Swenshuai.xi         //MsOS_DelayTask(5);
830*53ee8cc1Swenshuai.xi     }
831*53ee8cc1Swenshuai.xi }
832*53ee8cc1Swenshuai.xi 
833*53ee8cc1Swenshuai.xi 
NDS_FLT_Init(NDS_FLT_Param * param)834*53ee8cc1Swenshuai.xi NDS_Result NDS_FLT_Init(NDS_FLT_Param *param)
835*53ee8cc1Swenshuai.xi {
836*53ee8cc1Swenshuai.xi     int i;
837*53ee8cc1Swenshuai.xi 
838*53ee8cc1Swenshuai.xi     if ( ((MS_PHYADDR)NULL == param->ecm_emm_addr) ||
839*53ee8cc1Swenshuai.xi          (param->ecm_emm_size < NDS_CAM_FLT_BUFS_SIZE) )
840*53ee8cc1Swenshuai.xi     {
841*53ee8cc1Swenshuai.xi         return E_NDS_FAIL;
842*53ee8cc1Swenshuai.xi     }
843*53ee8cc1Swenshuai.xi 
844*53ee8cc1Swenshuai.xi     HAL_NDS_FLT_Init(param);
845*53ee8cc1Swenshuai.xi     _nds_flt_dev.param.ecm_emm_addr = param->ecm_emm_addr;
846*53ee8cc1Swenshuai.xi     _nds_flt_dev.param.pu8ecm_emm_buf = param->pu8ecm_emm_buf;
847*53ee8cc1Swenshuai.xi     _nds_flt_dev.param.ecm_emm_size = param->ecm_emm_size;
848*53ee8cc1Swenshuai.xi 
849*53ee8cc1Swenshuai.xi     _EmmFlt.pid = TSP_PID_NULL;
850*53ee8cc1Swenshuai.xi     _EmmFlt.flt_id = NDS_FLT_NULL;
851*53ee8cc1Swenshuai.xi     for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++)
852*53ee8cc1Swenshuai.xi     {
853*53ee8cc1Swenshuai.xi         _EcmFlt[i].pid = TSP_PID_NULL;
854*53ee8cc1Swenshuai.xi         _EcmFlt[i].flt_id = NDS_FLT_NULL;
855*53ee8cc1Swenshuai.xi         _EcmFlt[i].b_defined = FALSE;
856*53ee8cc1Swenshuai.xi #if NDS_ECM_SAME_PID_DROP_EN
857*53ee8cc1Swenshuai.xi         _EcmFlt[i].u8Ctrl = 0;
858*53ee8cc1Swenshuai.xi         _EcmFlt[i].u8Drop = 0;
859*53ee8cc1Swenshuai.xi #endif
860*53ee8cc1Swenshuai.xi     }
861*53ee8cc1Swenshuai.xi 
862*53ee8cc1Swenshuai.xi     for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++)
863*53ee8cc1Swenshuai.xi     {
864*53ee8cc1Swenshuai.xi         memset(_u8EcmBuf[i][0], 0, NDS_CAM_FLT_BUF_SIZE);
865*53ee8cc1Swenshuai.xi         memset(_u8EcmBuf[i][1], 0, NDS_CAM_FLT_BUF_SIZE);
866*53ee8cc1Swenshuai.xi     }
867*53ee8cc1Swenshuai.xi     for (i = 0; i < MAX_EMM_LIST_NUM; i++)
868*53ee8cc1Swenshuai.xi     {
869*53ee8cc1Swenshuai.xi         memset(_u8EmmBuf[i], 0, NDS_CAM_FLT_BUF_SIZE);
870*53ee8cc1Swenshuai.xi     }
871*53ee8cc1Swenshuai.xi 
872*53ee8cc1Swenshuai.xi #if 1
873*53ee8cc1Swenshuai.xi     //*((volatile unsigned int*)( 0xbf202d00 )) = 0x11;// allow TS packet to flow through CA module
874*53ee8cc1Swenshuai.xi     //*((volatile unsigned int*)( 0xbf202d00 )) = 0x59;// 49:pvr, 59: live in+pvr
875*53ee8cc1Swenshuai.xi 
876*53ee8cc1Swenshuai.xi     //*((volatile unsigned int*)( 0xBF2216CC )) = 0x0080;//olny for FPGA of NSK ignored , set to 0 = disable all
877*53ee8cc1Swenshuai.xi     //*((volatile unsigned int*)( 0xBF2018b0 )) = 0x0080;//accept_en
878*53ee8cc1Swenshuai.xi     //*((volatile unsigned int*)( 0xBF203c50)) = 0x1022;//tsp clk
879*53ee8cc1Swenshuai.xi     *((volatile unsigned int*)( 0xBF221840)) = 0x0010; // Descambler bank 2 enable  reg_latch_even_odd for ca_value
880*53ee8cc1Swenshuai.xi #endif
881*53ee8cc1Swenshuai.xi 
882*53ee8cc1Swenshuai.xi #if 0 //------ for FPGA TSO ----
883*53ee8cc1Swenshuai.xi 
884*53ee8cc1Swenshuai.xi     *((volatile MS_U32*)0xbf202d78) = 0x027;//TS0 config only for ts out , 0x021:only video, clk/2 ,,, 0x27:all ts, clk/2
885*53ee8cc1Swenshuai.xi     *((volatile MS_U32*)0xBF202AB0) = 0xbb32; //bypass VPID
886*53ee8cc1Swenshuai.xi #endif
887*53ee8cc1Swenshuai.xi 
888*53ee8cc1Swenshuai.xi     _nds_flt_eventid = MsOS_CreateEventGroup("NDS_FLT_Event");
889*53ee8cc1Swenshuai.xi     MS_ASSERT(_nds_flt_eventid >= 0);
890*53ee8cc1Swenshuai.xi 
891*53ee8cc1Swenshuai.xi     _nds_flt_mutexid = MsOS_CreateMutex(E_MSOS_FIFO, "NDS_FLT_Mutex", MSOS_PROCESS_SHARED);
892*53ee8cc1Swenshuai.xi     MS_ASSERT(_nds_flt_mutexid >= 0);
893*53ee8cc1Swenshuai.xi 
894*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX_KERNEL)
895*53ee8cc1Swenshuai.xi     _nds_flt_taskid = MsOS_CreateTask(  (TaskEntry) _NDS_FLT_IsrTask,
896*53ee8cc1Swenshuai.xi                                         (MS_U32)NULL,
897*53ee8cc1Swenshuai.xi                                         (TaskPriority) (E_TASK_PRI_SYS+1),
898*53ee8cc1Swenshuai.xi                                         TRUE,
899*53ee8cc1Swenshuai.xi                                         NULL,
900*53ee8cc1Swenshuai.xi                                         0,
901*53ee8cc1Swenshuai.xi                                         "NDS_FLT_IsrTask");
902*53ee8cc1Swenshuai.xi #else
903*53ee8cc1Swenshuai.xi     _nds_flt_taskid = MsOS_CreateTask(  (TaskEntry) _NDS_FLT_IsrTask,
904*53ee8cc1Swenshuai.xi                                         (MS_U32)NULL,
905*53ee8cc1Swenshuai.xi                                         (TaskPriority) (E_TASK_PRI_SYS+1),
906*53ee8cc1Swenshuai.xi                                         TRUE,
907*53ee8cc1Swenshuai.xi                                         _nds_flt_stack,
908*53ee8cc1Swenshuai.xi                                         NDS_FLT_TASK_STACK_SIZE,
909*53ee8cc1Swenshuai.xi                                         "NDS_FLT_IsrTask");
910*53ee8cc1Swenshuai.xi #endif
911*53ee8cc1Swenshuai.xi     MS_ASSERT(_nds_flt_taskid >= 0);
912*53ee8cc1Swenshuai.xi 
913*53ee8cc1Swenshuai.xi     NDS_FLT_OS_AttachInterrupt(_NDS_FLT_Isr);
914*53ee8cc1Swenshuai.xi     NDS_FLT_OS_EnableInterrupt();
915*53ee8cc1Swenshuai.xi 
916*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_ECM_INT_STAT) = CAM_REG(REG_CAM_ECM_INT_STAT);
917*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_CA_INT) = CAM_CA_INT_EMM;
918*53ee8cc1Swenshuai.xi     while (CAM_REG(REG_CAM_CA_INT) & CAM_CA_INT_EMM)
919*53ee8cc1Swenshuai.xi     {
920*53ee8cc1Swenshuai.xi         CAM_REG(REG_CAM_EMM_INT_STAT) = CAM_EMM_INT_ACK;
921*53ee8cc1Swenshuai.xi     }
922*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_CA_INT) = 0;
923*53ee8cc1Swenshuai.xi 
924*53ee8cc1Swenshuai.xi     // Enable (unmask) all interrupts
925*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_CA_INT) = (CAM_CA_INT_ECM | CAM_CA_INT_EMM | CAM_CA_INT_EMM_OVERFLOW);
926*53ee8cc1Swenshuai.xi 
927*53ee8cc1Swenshuai.xi     return E_NDS_OK;
928*53ee8cc1Swenshuai.xi }
929*53ee8cc1Swenshuai.xi 
930*53ee8cc1Swenshuai.xi 
NDS_FLT_Exit(void)931*53ee8cc1Swenshuai.xi NDS_Result NDS_FLT_Exit(void)
932*53ee8cc1Swenshuai.xi {
933*53ee8cc1Swenshuai.xi     // Disable (mask) all interrupts
934*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_CA_INT) = 0;
935*53ee8cc1Swenshuai.xi 
936*53ee8cc1Swenshuai.xi     NDS_FLT_OS_DisableInterrupt();
937*53ee8cc1Swenshuai.xi     NDS_FLT_OS_DetachInterrupt();
938*53ee8cc1Swenshuai.xi 
939*53ee8cc1Swenshuai.xi     MsOS_DeleteTask(_nds_flt_taskid);
940*53ee8cc1Swenshuai.xi     MsOS_DeleteMutex(_nds_flt_mutexid);
941*53ee8cc1Swenshuai.xi     MsOS_DeleteEventGroup(_nds_flt_eventid);
942*53ee8cc1Swenshuai.xi 
943*53ee8cc1Swenshuai.xi     HAL_NDS_FLT_Exit();
944*53ee8cc1Swenshuai.xi 
945*53ee8cc1Swenshuai.xi     return E_NDS_OK;
946*53ee8cc1Swenshuai.xi }
947*53ee8cc1Swenshuai.xi 
948*53ee8cc1Swenshuai.xi 
949*53ee8cc1Swenshuai.xi // 7.2.1
XHDICA_SetEmmPid(NDS_ULONG x_connection,NDS_USHORT pid,NDS_BYTE emm_filter_control)950*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_SetEmmPid (NDS_ULONG  x_connection,
951*53ee8cc1Swenshuai.xi                              NDS_USHORT pid,
952*53ee8cc1Swenshuai.xi                              NDS_BYTE   emm_filter_control)
953*53ee8cc1Swenshuai.xi {
954*53ee8cc1Swenshuai.xi     NDS_FUNC("[%s]-[%d] pid[0x%x]\n", __FUNCTION__, __LINE__, pid);
955*53ee8cc1Swenshuai.xi 
956*53ee8cc1Swenshuai.xi     NDS_FLT_ENTRY(); // for disable interrupt protection
957*53ee8cc1Swenshuai.xi 
958*53ee8cc1Swenshuai.xi     if ((pid < 2) || (pid > 0x1FFE))
959*53ee8cc1Swenshuai.xi     {
960*53ee8cc1Swenshuai.xi         NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
961*53ee8cc1Swenshuai.xi         NDS_FLT_RETURN(CA_REQUEST_NOT_SUPPORTED_BY_DRIVER);
962*53ee8cc1Swenshuai.xi     }
963*53ee8cc1Swenshuai.xi 
964*53ee8cc1Swenshuai.xi     _EMM_EnableFilter(FALSE);
965*53ee8cc1Swenshuai.xi 
966*53ee8cc1Swenshuai.xi #if 0
967*53ee8cc1Swenshuai.xi     if (_EmmFlt.pid != TSP_PID_NULL)
968*53ee8cc1Swenshuai.xi     {
969*53ee8cc1Swenshuai.xi         NDS_ASSERT((_EmmFlt.pid == pid), CA_REQUEST_NOT_SUPPORTED_BY_DRIVER, "[%s]-[%d]\n", __FUNCTION__, __LINE__);
970*53ee8cc1Swenshuai.xi     }
971*53ee8cc1Swenshuai.xi #endif
972*53ee8cc1Swenshuai.xi     // @TODO:
973*53ee8cc1Swenshuai.xi     // should filter and PID be disable and set to NULL for disabling EMM filter?
974*53ee8cc1Swenshuai.xi 
975*53ee8cc1Swenshuai.xi     // Save pid and allocate fitler
976*53ee8cc1Swenshuai.xi     //_EmmFlt.pid = pid & CAM_EMM_PID_MASK; // Get new pid
977*53ee8cc1Swenshuai.xi     _EMM_AllocFilter(x_connection, pid, emm_filter_control);
978*53ee8cc1Swenshuai.xi 
979*53ee8cc1Swenshuai.xi     // Enable EMM Filter
980*53ee8cc1Swenshuai.xi     NDS_FLT_OS_DisableInterrupt();
981*53ee8cc1Swenshuai.xi     bEmmOverflow = FALSE;
982*53ee8cc1Swenshuai.xi     NDS_FLT_OS_EnableInterrupt();
983*53ee8cc1Swenshuai.xi 
984*53ee8cc1Swenshuai.xi     _EMM_EnableFilter(TRUE);
985*53ee8cc1Swenshuai.xi 
986*53ee8cc1Swenshuai.xi     NDS_FLT_RETURN(CA_OK);
987*53ee8cc1Swenshuai.xi }
988*53ee8cc1Swenshuai.xi 
989*53ee8cc1Swenshuai.xi 
990*53ee8cc1Swenshuai.xi // 7.2.2
991*53ee8cc1Swenshuai.xi /*-----------------
992*53ee8cc1Swenshuai.xi source byte --------------- byte 0 ---------------  --------------- byte 1 ---------------  ...    2,
993*53ee8cc1Swenshuai.xi             msb                                lsb  msb                                lsb
994*53ee8cc1Swenshuai.xi source bit    7,   6,   5,   4,   3,   2,   1,   0,  15,  14,  13,  12,  11,  10,   9,   8, ... 25,  24, <= bit index
995*53ee8cc1Swenshuai.xi TID(lsn)        x         x         2         3         4         5         6         7     ...    F     <= tid index
996*53ee8cc1Swenshuai.xi 
997*53ee8cc1Swenshuai.xi             --------------- byte 0 ---------------  --------------- byte 1 ---------------
998*53ee8cc1Swenshuai.xi TID(lsn)      7    6    5    4    3    2    x    x   15   14   13   12   11   10    9    8               <= tid index
999*53ee8cc1Swenshuai.xi lsb           8   10   12   14    0    2    4    6   24   26   28   30   16   18   20   22               <= new position with old index
1000*53ee8cc1Swenshuai.xi msb          10   11   13   15    1    3    5    7   25   27   29   31   17   19   21   23               <= new position with old index
1001*53ee8cc1Swenshuai.xi ------------------*/
XHDICA_EmmSetTableIdFilter(NDS_ULONG x_connection,NDS_BYTE table_id[4])1002*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_EmmSetTableIdFilter (NDS_ULONG    x_connection,
1003*53ee8cc1Swenshuai.xi                                        NDS_BYTE     table_id[4])
1004*53ee8cc1Swenshuai.xi {
1005*53ee8cc1Swenshuai.xi     MS_U32              u32TMode;
1006*53ee8cc1Swenshuai.xi     MS_U16              lsb = 0, msb = 0;
1007*53ee8cc1Swenshuai.xi     int                 i;
1008*53ee8cc1Swenshuai.xi 
1009*53ee8cc1Swenshuai.xi     NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
1010*53ee8cc1Swenshuai.xi 
1011*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_TID_MODE_L) = lsb;
1012*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_TID_MODE_H) = msb;
1013*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_TID) = 0x80; // EMM TID
1014*53ee8cc1Swenshuai.xi 
1015*53ee8cc1Swenshuai.xi     u32TMode = (table_id[0]<<24) | (table_id[1]<<16) | (table_id[2]<<8) | (table_id[3]);
1016*53ee8cc1Swenshuai.xi     for (i = 2; i <= 0xF; i++) // 0x82-0x8F
1017*53ee8cc1Swenshuai.xi     {
1018*53ee8cc1Swenshuai.xi         lsb |= ( (u32TMode >> ((0xF-i)*2)     ) & 0x1 ) << i;
1019*53ee8cc1Swenshuai.xi         msb |= ( (u32TMode >> (((0xF-i)*2)+1) ) & 0x1 ) << i;
1020*53ee8cc1Swenshuai.xi     }
1021*53ee8cc1Swenshuai.xi 
1022*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_TID_MODE_L) = lsb;
1023*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_TID_MODE_H) = msb;
1024*53ee8cc1Swenshuai.xi 
1025*53ee8cc1Swenshuai.xi 
1026*53ee8cc1Swenshuai.xi     return CA_OK;
1027*53ee8cc1Swenshuai.xi }
1028*53ee8cc1Swenshuai.xi 
1029*53ee8cc1Swenshuai.xi 
1030*53ee8cc1Swenshuai.xi // 7.2.3
1031*53ee8cc1Swenshuai.xi /*
1032*53ee8cc1Swenshuai.xi     data byte       0x01 0x23 0x45 0x67
1033*53ee8cc1Swenshuai.xi     nds reg_mem     0x01 0x23 0x45 0x67
1034*53ee8cc1Swenshuai.xi     nds reg_word    0x01234567
1035*53ee8cc1Swenshuai.xi     mstar reg_word  0x01234567
1036*53ee8cc1Swenshuai.xi     mstar_reg16     0x4567(L) 0x0123(H)
1037*53ee8cc1Swenshuai.xi */
XHDICA_SetPrivateEmmFilter(NDS_ULONG x_connection,EMM_REG * emm_reg)1038*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_SetPrivateEmmFilter (NDS_ULONG    x_connection,
1039*53ee8cc1Swenshuai.xi                                        EMM_REG *    emm_reg)
1040*53ee8cc1Swenshuai.xi {
1041*53ee8cc1Swenshuai.xi     NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
1042*53ee8cc1Swenshuai.xi 
1043*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_DATA_ID_H(1)) = *(MS_U8*)(emm_reg->reg1_address+1) + (*(MS_U8*)(emm_reg->reg1_address)<<8);
1044*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_DATA_ID_L(1)) = *(MS_U8*)(emm_reg->reg1_address+3) + (*(MS_U8*)(emm_reg->reg1_address+2)<<8);
1045*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_MASK_ID_H(1)) = *(MS_U8*)(emm_reg->reg1_mask+1) + (*(MS_U8*)(emm_reg->reg1_mask)<<8);
1046*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_MASK_ID_L(1)) = *(MS_U8*)(emm_reg->reg1_mask+3) + (*(MS_U8*)(emm_reg->reg1_mask+2)<<8);
1047*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_DATA_ID_H(2)) = *(MS_U8*)(emm_reg->reg2_address+1) + (*(MS_U8*)(emm_reg->reg2_address)<<8);
1048*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_DATA_ID_L(2)) = *(MS_U8*)(emm_reg->reg2_address+3) + (*(MS_U8*)(emm_reg->reg2_address+2)<<8);
1049*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_MASK_ID_H(2)) = *(MS_U8*)(emm_reg->reg2_mask+1) + (*(MS_U8*)(emm_reg->reg2_mask)<<8);
1050*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_MASK_ID_L(2)) = *(MS_U8*)(emm_reg->reg2_mask+3) + (*(MS_U8*)(emm_reg->reg2_mask+2)<<8);
1051*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_DATA_ID_H(3)) = *(MS_U8*)(emm_reg->reg3_address+1) + (*(MS_U8*)(emm_reg->reg3_address)<<8);
1052*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_DATA_ID_L(3)) = *(MS_U8*)(emm_reg->reg3_address+3) + (*(MS_U8*)(emm_reg->reg3_address+2)<<8);
1053*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_MASK_ID_H(3)) = *(MS_U8*)(emm_reg->reg3_mask+1) + (*(MS_U8*)(emm_reg->reg3_mask)<<8);
1054*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_EMM_MASK_ID_L(3)) = *(MS_U8*)(emm_reg->reg3_mask+3) + (*(MS_U8*)(emm_reg->reg3_mask+2)<<8);
1055*53ee8cc1Swenshuai.xi 
1056*53ee8cc1Swenshuai.xi     return CA_OK;
1057*53ee8cc1Swenshuai.xi }
1058*53ee8cc1Swenshuai.xi 
1059*53ee8cc1Swenshuai.xi 
1060*53ee8cc1Swenshuai.xi // 7.2.5
XHDICA_ReleaseEmmBuffer(NDS_ULONG x_connection,NDS_BYTE * emm_buf)1061*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_ReleaseEmmBuffer (NDS_ULONG   x_connection,
1062*53ee8cc1Swenshuai.xi                                     NDS_BYTE *  emm_buf)
1063*53ee8cc1Swenshuai.xi {
1064*53ee8cc1Swenshuai.xi     NDS_FUNC("[%s]-[%d]\n", __FUNCTION__, __LINE__);
1065*53ee8cc1Swenshuai.xi 
1066*53ee8cc1Swenshuai.xi     NDS_FLT_DBG("free EMM %x\n", emm_buf);
1067*53ee8cc1Swenshuai.xi 
1068*53ee8cc1Swenshuai.xi     NDS_FLT_ENTRY(); // for disable interrupt protection
1069*53ee8cc1Swenshuai.xi 
1070*53ee8cc1Swenshuai.xi     if (emm_buf != NULL)
1071*53ee8cc1Swenshuai.xi     {
1072*53ee8cc1Swenshuai.xi         //_verSC_PrintData(emm_buf-8, 32);
1073*53ee8cc1Swenshuai.xi //[NEW]
1074*53ee8cc1Swenshuai.xi         if (bEmmOverflow == TRUE)
1075*53ee8cc1Swenshuai.xi         {
1076*53ee8cc1Swenshuai.xi             NDS_FLT_DBG("(read, cur, write) = (%02d %02d %02d)\n", _u8EmmRead, _u8EmmCur, _u8EmmWrite);
1077*53ee8cc1Swenshuai.xi             NDS_FLT_DBG("free Emm %d %02x %02x\n", MsOS_GetSystemTime() - emm_overflow_time, *(emm_buf), *(emm_buf-8));
1078*53ee8cc1Swenshuai.xi         }
1079*53ee8cc1Swenshuai.xi // -jerry
1080*53ee8cc1Swenshuai.xi 
1081*53ee8cc1Swenshuai.xi         NDS_FLT_OS_DisableInterrupt();
1082*53ee8cc1Swenshuai.xi         *(emm_buf) = 0;
1083*53ee8cc1Swenshuai.xi         *(emm_buf-8) = 0;
1084*53ee8cc1Swenshuai.xi         emmQueueDec();
1085*53ee8cc1Swenshuai.xi 
1086*53ee8cc1Swenshuai.xi //[NEW]
1087*53ee8cc1Swenshuai.xi         if ( (bEmmOverflow == TRUE) && (emmQueueIsEmpty()) )
1088*53ee8cc1Swenshuai.xi         {
1089*53ee8cc1Swenshuai.xi #if (NDS_EMM_PASSIVE==0)
1090*53ee8cc1Swenshuai.xi             _EMM_EnableFilter(TRUE);
1091*53ee8cc1Swenshuai.xi #endif
1092*53ee8cc1Swenshuai.xi             bEmmOverflow = FALSE;
1093*53ee8cc1Swenshuai.xi         }
1094*53ee8cc1Swenshuai.xi // -jerry
1095*53ee8cc1Swenshuai.xi         NDS_FLT_OS_EnableInterrupt();
1096*53ee8cc1Swenshuai.xi     }
1097*53ee8cc1Swenshuai.xi     else
1098*53ee8cc1Swenshuai.xi     {
1099*53ee8cc1Swenshuai.xi         NDS_FLT_RETURN(CA_DRIVER_CAN_NOT_PERFORM_FUNCTION_NOW);
1100*53ee8cc1Swenshuai.xi     }
1101*53ee8cc1Swenshuai.xi 
1102*53ee8cc1Swenshuai.xi //    MsOS_DelayTask(5);
1103*53ee8cc1Swenshuai.xi 
1104*53ee8cc1Swenshuai.xi     NDS_FLT_RETURN(CA_OK);
1105*53ee8cc1Swenshuai.xi }
1106*53ee8cc1Swenshuai.xi 
1107*53ee8cc1Swenshuai.xi 
1108*53ee8cc1Swenshuai.xi // 8.2.1
XHDICA_DefineEcmPid(NDS_ULONG x_connection,NDS_BYTE ecm_filter_num,NDS_USHORT pid,NDS_BYTE odd_ecm_table_id,NDS_BYTE even_ecm_table_id)1109*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_DefineEcmPid (NDS_ULONG   x_connection,
1110*53ee8cc1Swenshuai.xi                                 NDS_BYTE    ecm_filter_num,
1111*53ee8cc1Swenshuai.xi                                 NDS_USHORT  pid,
1112*53ee8cc1Swenshuai.xi                                 NDS_BYTE    odd_ecm_table_id,
1113*53ee8cc1Swenshuai.xi                                 NDS_BYTE    even_ecm_table_id)
1114*53ee8cc1Swenshuai.xi {
1115*53ee8cc1Swenshuai.xi     //MS_U16  ecm_pid;
1116*53ee8cc1Swenshuai.xi     MS_U16  u16EcmTid = 0;
1117*53ee8cc1Swenshuai.xi 
1118*53ee8cc1Swenshuai.xi #if 0
1119*53ee8cc1Swenshuai.xi     if(x_connection == 1 )
1120*53ee8cc1Swenshuai.xi     {
1121*53ee8cc1Swenshuai.xi         NDS_RASP_DefineEcmPid(x_connection,ecm_filter_num,pid,odd_ecm_table_id,even_ecm_table_id);
1122*53ee8cc1Swenshuai.xi         return CA_OK ;
1123*53ee8cc1Swenshuai.xi     }
1124*53ee8cc1Swenshuai.xi #endif
1125*53ee8cc1Swenshuai.xi 
1126*53ee8cc1Swenshuai.xi 
1127*53ee8cc1Swenshuai.xi     NDS_FUNC("(%ld)-[%s]-[%d] pid [0x%x]\n", MsOS_GetSystemTime(), __FUNCTION__, __LINE__, pid);
1128*53ee8cc1Swenshuai.xi 
1129*53ee8cc1Swenshuai.xi     if (ecm_filter_num >= NDS_CAM_ECM_FLT_NUM)
1130*53ee8cc1Swenshuai.xi     {
1131*53ee8cc1Swenshuai.xi         NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
1132*53ee8cc1Swenshuai.xi         return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
1133*53ee8cc1Swenshuai.xi     }
1134*53ee8cc1Swenshuai.xi 
1135*53ee8cc1Swenshuai.xi     // disable filter before setting
1136*53ee8cc1Swenshuai.xi     _ECM_EnableFilter(x_connection, ecm_filter_num, FALSE, 0);
1137*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_ECM_PID(ecm_filter_num)) = pid & CAM_ECM_PID_MASK; // clear [15:13] for later DefineEcmPid
1138*53ee8cc1Swenshuai.xi 
1139*53ee8cc1Swenshuai.xi     u16EcmTid |= (even_ecm_table_id & CAM_ECM_TID_EVEN_MASK);
1140*53ee8cc1Swenshuai.xi     u16EcmTid |= ((odd_ecm_table_id<<8) & CAM_ECM_TID_ODD_MASK);
1141*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_ECM_TID) = u16EcmTid;
1142*53ee8cc1Swenshuai.xi 
1143*53ee8cc1Swenshuai.xi     if (pid == 0xFFFF)
1144*53ee8cc1Swenshuai.xi     {
1145*53ee8cc1Swenshuai.xi         // disable the filter
1146*53ee8cc1Swenshuai.xi         return CA_OK;
1147*53ee8cc1Swenshuai.xi     }
1148*53ee8cc1Swenshuai.xi 
1149*53ee8cc1Swenshuai.xi     if ((pid < 0x2 || pid > 0x1FFE))
1150*53ee8cc1Swenshuai.xi     {
1151*53ee8cc1Swenshuai.xi         NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
1152*53ee8cc1Swenshuai.xi         return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
1153*53ee8cc1Swenshuai.xi     }
1154*53ee8cc1Swenshuai.xi 
1155*53ee8cc1Swenshuai.xi     // Save pid and allocate fitler
1156*53ee8cc1Swenshuai.xi     //_EcmFlt[ecm_filter_num].pid = pid & CAM_ECM_PID_MASK;
1157*53ee8cc1Swenshuai.xi     _ECM_AllocFilter(x_connection, ecm_filter_num, pid);
1158*53ee8cc1Swenshuai.xi 
1159*53ee8cc1Swenshuai.xi     return CA_OK;
1160*53ee8cc1Swenshuai.xi }
1161*53ee8cc1Swenshuai.xi 
1162*53ee8cc1Swenshuai.xi 
1163*53ee8cc1Swenshuai.xi //8.2.2
XHDICA_DefineEcmFilter(NDS_ULONG x_connection,NDS_BYTE ecm_filter_num,NDS_BYTE ecm_filter_control)1164*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_DefineEcmFilter (NDS_ULONG    x_connection,
1165*53ee8cc1Swenshuai.xi                                    NDS_BYTE     ecm_filter_num,
1166*53ee8cc1Swenshuai.xi                                    NDS_BYTE     ecm_filter_control)
1167*53ee8cc1Swenshuai.xi {
1168*53ee8cc1Swenshuai.xi     MS_U16              ecm_pid = 0;
1169*53ee8cc1Swenshuai.xi     int                 i;
1170*53ee8cc1Swenshuai.xi 
1171*53ee8cc1Swenshuai.xi     NDS_FUNC("[%s]-[%d] -- ecm_filter_num[%d]\n", __FUNCTION__, __LINE__, ecm_filter_num);
1172*53ee8cc1Swenshuai.xi 
1173*53ee8cc1Swenshuai.xi #if 0
1174*53ee8cc1Swenshuai.xi     if(x_connection == 1 )
1175*53ee8cc1Swenshuai.xi     {
1176*53ee8cc1Swenshuai.xi         NDS_RASP_DefineEcmFilter(x_connection,ecm_filter_num,ecm_filter_control);
1177*53ee8cc1Swenshuai.xi         return CA_OK ;
1178*53ee8cc1Swenshuai.xi     }
1179*53ee8cc1Swenshuai.xi #endif
1180*53ee8cc1Swenshuai.xi 
1181*53ee8cc1Swenshuai.xi 
1182*53ee8cc1Swenshuai.xi     if (ecm_filter_num >= NDS_CAM_ECM_FLT_NUM)
1183*53ee8cc1Swenshuai.xi     {
1184*53ee8cc1Swenshuai.xi         NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
1185*53ee8cc1Swenshuai.xi         return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
1186*53ee8cc1Swenshuai.xi     }
1187*53ee8cc1Swenshuai.xi     for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++) // 8.2.2 Note
1188*53ee8cc1Swenshuai.xi     {
1189*53ee8cc1Swenshuai.xi         if ( (i != ecm_filter_num) &&
1190*53ee8cc1Swenshuai.xi              (_EcmFlt[i].pid == _EcmFlt[ecm_filter_num].pid) &&
1191*53ee8cc1Swenshuai.xi              (_EcmFlt[i].x_connect == _EcmFlt[ecm_filter_num].x_connect) &&
1192*53ee8cc1Swenshuai.xi              (_EcmFlt[i].b_defined == TRUE) )
1193*53ee8cc1Swenshuai.xi         {
1194*53ee8cc1Swenshuai.xi             return CA_ECM_PID_FILTER_ALREADY_DEFINED;
1195*53ee8cc1Swenshuai.xi         }
1196*53ee8cc1Swenshuai.xi     }
1197*53ee8cc1Swenshuai.xi 
1198*53ee8cc1Swenshuai.xi     // @FIXME: is it possible and return CA_OK?
1199*53ee8cc1Swenshuai.xi     if ((_EcmFlt[ecm_filter_num].pid < 0x2 || _EcmFlt[ecm_filter_num].pid > 0x1FFE))
1200*53ee8cc1Swenshuai.xi     {
1201*53ee8cc1Swenshuai.xi         // Invaliad PID
1202*53ee8cc1Swenshuai.xi         return CA_OK;
1203*53ee8cc1Swenshuai.xi     }
1204*53ee8cc1Swenshuai.xi 
1205*53ee8cc1Swenshuai.xi     ecm_pid = _EcmFlt[ecm_filter_num].pid;
1206*53ee8cc1Swenshuai.xi     if (ecm_filter_control & HDICA_ECM_FILTER_CONTROL_ENABLE_ODD_RECEPTION)
1207*53ee8cc1Swenshuai.xi     {
1208*53ee8cc1Swenshuai.xi         ecm_pid |= CAM_ECM_PID_TID_ODD;
1209*53ee8cc1Swenshuai.xi     }
1210*53ee8cc1Swenshuai.xi     if (ecm_filter_control & HDICA_ECM_FILTER_CONTROL_ENABLE_EVEN_RECEPTION)
1211*53ee8cc1Swenshuai.xi     {
1212*53ee8cc1Swenshuai.xi         ecm_pid |= CAM_ECM_PID_TID_EVEN;
1213*53ee8cc1Swenshuai.xi     }
1214*53ee8cc1Swenshuai.xi     if (ecm_filter_control & HDICA_ECM_ENABLE_RECEPTION)
1215*53ee8cc1Swenshuai.xi     {
1216*53ee8cc1Swenshuai.xi         ecm_pid |= CAM_ECM_PID_ENABLE;
1217*53ee8cc1Swenshuai.xi         _EcmFlt[ecm_filter_num].b_defined = TRUE;
1218*53ee8cc1Swenshuai.xi     }
1219*53ee8cc1Swenshuai.xi     else
1220*53ee8cc1Swenshuai.xi     {
1221*53ee8cc1Swenshuai.xi         _EcmFlt[ecm_filter_num].b_defined = FALSE;
1222*53ee8cc1Swenshuai.xi     }
1223*53ee8cc1Swenshuai.xi 
1224*53ee8cc1Swenshuai.xi     // Enable
1225*53ee8cc1Swenshuai.xi     // NOTE: It's always AUTO for current NDS implementation
1226*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_ECM_PID(ecm_filter_num)) = 0; // disable filter & reset LOCK
1227*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_ECM_LOCK(ecm_filter_num)) |=  CAM_ECM_LOCK_AUTO(ecm_filter_num);
1228*53ee8cc1Swenshuai.xi     CAM_REG(REG_CAM_ECM_PID(ecm_filter_num)) = ecm_pid;
1229*53ee8cc1Swenshuai.xi 
1230*53ee8cc1Swenshuai.xi     _ECM_EnableFilter(x_connection, ecm_filter_num, (ecm_filter_control & HDICA_ECM_ENABLE_RECEPTION) ? TRUE : FALSE, ecm_filter_control);
1231*53ee8cc1Swenshuai.xi 
1232*53ee8cc1Swenshuai.xi     return CA_OK;
1233*53ee8cc1Swenshuai.xi }
1234*53ee8cc1Swenshuai.xi 
1235*53ee8cc1Swenshuai.xi 
1236*53ee8cc1Swenshuai.xi // 8.2.4
XHDICA_ReleaseEcmBuffer(NDS_ULONG x_connection,NDS_BYTE ecm_filter_num,NDS_BYTE ecm_polarity,NDS_BYTE * ecm_buf)1237*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_ReleaseEcmBuffer (NDS_ULONG   x_connection,
1238*53ee8cc1Swenshuai.xi                                     NDS_BYTE    ecm_filter_num,
1239*53ee8cc1Swenshuai.xi                                     NDS_BYTE    ecm_polarity,
1240*53ee8cc1Swenshuai.xi                                     NDS_BYTE *  ecm_buf)
1241*53ee8cc1Swenshuai.xi {
1242*53ee8cc1Swenshuai.xi     NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
1243*53ee8cc1Swenshuai.xi 
1244*53ee8cc1Swenshuai.xi     NDS_FLT_DBG("free ECM %d %d\n", ecm_filter_num, ecm_polarity);
1245*53ee8cc1Swenshuai.xi 
1246*53ee8cc1Swenshuai.xi     NDS_FLT_ENTRY(); // for disable interrupt protection
1247*53ee8cc1Swenshuai.xi 
1248*53ee8cc1Swenshuai.xi     if (ecm_buf != NULL)
1249*53ee8cc1Swenshuai.xi     {
1250*53ee8cc1Swenshuai.xi         NDS_FLT_OS_DisableInterrupt();
1251*53ee8cc1Swenshuai.xi         memset(ecm_buf-8, 0, 188);
1252*53ee8cc1Swenshuai.xi         NDS_FLT_OS_EnableInterrupt();
1253*53ee8cc1Swenshuai.xi 
1254*53ee8cc1Swenshuai.xi         // @TODO: Manual UnLock
1255*53ee8cc1Swenshuai.xi         // Check auto/manual mode
1256*53ee8cc1Swenshuai.xi         // Set correspondant setting
1257*53ee8cc1Swenshuai.xi     }
1258*53ee8cc1Swenshuai.xi     else
1259*53ee8cc1Swenshuai.xi     {
1260*53ee8cc1Swenshuai.xi         NDS_FLT_RETURN(CA_DRIVER_CAN_NOT_PERFORM_FUNCTION_NOW);
1261*53ee8cc1Swenshuai.xi     }
1262*53ee8cc1Swenshuai.xi 
1263*53ee8cc1Swenshuai.xi     NDS_FLT_RETURN(CA_OK);
1264*53ee8cc1Swenshuai.xi }
1265*53ee8cc1Swenshuai.xi 
1266*53ee8cc1Swenshuai.xi 
1267*53ee8cc1Swenshuai.xi // 8.2.5
XHDICA_ReleaseAllEcmBuffers(NDS_ULONG x_connection)1268*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_ReleaseAllEcmBuffers (NDS_ULONG   x_connection)
1269*53ee8cc1Swenshuai.xi {
1270*53ee8cc1Swenshuai.xi     int                 i = 0;
1271*53ee8cc1Swenshuai.xi 
1272*53ee8cc1Swenshuai.xi     NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
1273*53ee8cc1Swenshuai.xi 
1274*53ee8cc1Swenshuai.xi     NDS_FLT_ENTRY(); // for disable interrupt protection
1275*53ee8cc1Swenshuai.xi 
1276*53ee8cc1Swenshuai.xi     for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++)
1277*53ee8cc1Swenshuai.xi     {
1278*53ee8cc1Swenshuai.xi         NDS_FLT_OS_DisableInterrupt();
1279*53ee8cc1Swenshuai.xi         memset(_u8EcmBuf[i][0], 0, 188);
1280*53ee8cc1Swenshuai.xi         memset(_u8EcmBuf[i][1], 0, 188);
1281*53ee8cc1Swenshuai.xi         NDS_FLT_OS_EnableInterrupt();
1282*53ee8cc1Swenshuai.xi     }
1283*53ee8cc1Swenshuai.xi 
1284*53ee8cc1Swenshuai.xi     NDS_FLT_RETURN(CA_OK);
1285*53ee8cc1Swenshuai.xi }
1286*53ee8cc1Swenshuai.xi 
1287