xref: /utopia/UTPA2-700.0.x/modules/dmx/drv/tsp4/drvTSP2.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) 2009-2010 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    drvTSP2.c
98*53ee8cc1Swenshuai.xi /// @brief  Transport Stream Processer (TSP) Driver Interface
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor,Inc.
100*53ee8cc1Swenshuai.xi /// @attention
101*53ee8cc1Swenshuai.xi /// All TSP DDI are not allowed to use in any interrupt context other than TSP ISR and Callback
102*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
103*53ee8cc1Swenshuai.xi 
104*53ee8cc1Swenshuai.xi // Common Definition
105*53ee8cc1Swenshuai.xi #include "MsCommon.h"
106*53ee8cc1Swenshuai.xi #include "MsVersion.h"
107*53ee8cc1Swenshuai.xi #include "tsp2_msos.h"
108*53ee8cc1Swenshuai.xi #include "tsp2_nos.h"
109*53ee8cc1Swenshuai.xi #include "ULog.h"
110*53ee8cc1Swenshuai.xi 
111*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
112*53ee8cc1Swenshuai.xi #include <linux/sched.h>
113*53ee8cc1Swenshuai.xi #include <linux/string.h>
114*53ee8cc1Swenshuai.xi #include <linux/delay.h>
115*53ee8cc1Swenshuai.xi #include <linux/spinlock.h>
116*53ee8cc1Swenshuai.xi #else
117*53ee8cc1Swenshuai.xi #include "string.h"
118*53ee8cc1Swenshuai.xi #endif
119*53ee8cc1Swenshuai.xi 
120*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
121*53ee8cc1Swenshuai.xi #include "halCHIP.h"
122*53ee8cc1Swenshuai.xi #include "../../drv/mbx/apiMBX_St.h"
123*53ee8cc1Swenshuai.xi #include "../../drv/mbx/apiMBX.h"
124*53ee8cc1Swenshuai.xi #include "../drv/sys/tee_client_api.h"
125*53ee8cc1Swenshuai.xi #include "drvSYS.h"
126*53ee8cc1Swenshuai.xi #endif
127*53ee8cc1Swenshuai.xi 
128*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX)
129*53ee8cc1Swenshuai.xi     #include <sys/ioctl.h>
130*53ee8cc1Swenshuai.xi     #include <unistd.h>
131*53ee8cc1Swenshuai.xi     #include <fcntl.h> // O_RDWR
132*53ee8cc1Swenshuai.xi     #include "mdrv_firmware_io.h"
133*53ee8cc1Swenshuai.xi #endif
134*53ee8cc1Swenshuai.xi 
135*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
136*53ee8cc1Swenshuai.xi 
137*53ee8cc1Swenshuai.xi #if defined(OTV_ENABLE)
138*53ee8cc1Swenshuai.xi #include "drvOTV.h"
139*53ee8cc1Swenshuai.xi #endif
140*53ee8cc1Swenshuai.xi 
141*53ee8cc1Swenshuai.xi #include "drvTSP2.h"
142*53ee8cc1Swenshuai.xi 
143*53ee8cc1Swenshuai.xi // Internal Definition
144*53ee8cc1Swenshuai.xi #include "asmCPU.h"
145*53ee8cc1Swenshuai.xi #include "regTSP.h"
146*53ee8cc1Swenshuai.xi #include "halTSP.h"
147*53ee8cc1Swenshuai.xi #include "halCHIP.h"
148*53ee8cc1Swenshuai.xi 
149*53ee8cc1Swenshuai.xi #include "drvSEM.h"
150*53ee8cc1Swenshuai.xi 
151*53ee8cc1Swenshuai.xi 
152*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
153*53ee8cc1Swenshuai.xi //  Driver Compiler Options
154*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
155*53ee8cc1Swenshuai.xi #define SWITCH_TSP_UART                             0
156*53ee8cc1Swenshuai.xi 
157*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
158*53ee8cc1Swenshuai.xi //  Local Defines
159*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
160*53ee8cc1Swenshuai.xi 
161*53ee8cc1Swenshuai.xi 
162*53ee8cc1Swenshuai.xi #define FWTSP_CHECK_CODE        "<FWTSP>"
163*53ee8cc1Swenshuai.xi 
164*53ee8cc1Swenshuai.xi // Blocking events
165*53ee8cc1Swenshuai.xi #define TSP_SetEvent(eventid, flag)                          ({ MS_BOOL bRet = TSP_OS_EventSet(eventid, (flag)); (bRet == TRUE)? TRUE : FALSE; })
166*53ee8cc1Swenshuai.xi #define TSP_GetEvent(eventid, events, flag, opt, timeout)    ({ MS_BOOL bRet = TSP_OS_EventGet(eventid, (flag), (events), (opt), (timeout)); (bRet == TRUE)? TRUE : FALSE; })
167*53ee8cc1Swenshuai.xi 
168*53ee8cc1Swenshuai.xi // Filter event flags
169*53ee8cc1Swenshuai.xi #define TSP_FLAG_SetSecRdy(fltid)                   ({ MS_BOOL bRet = TSP_OS_EventSet(_s32SecRdyFlags[fltid>>5], (1<<(fltid&0x1F))); (bRet == TRUE)? TRUE : FALSE; })
170*53ee8cc1Swenshuai.xi #define TSP_FLAG_GetSecRdy(fltid, events, opt)      ({ MS_BOOL bRet = TSP_OS_EventGet(_s32SecRdyFlags[fltid>>5], (1<<(fltid&0x1F)), (events), (opt), 0); (bRet == TRUE)? TRUE : FALSE; })
171*53ee8cc1Swenshuai.xi #define TSP_FLAG_ModeSecRdy(idx, mask,events, opt)  ({ MS_BOOL bRet = TSP_OS_EventGet(_s32SecRdyFlags[idx], mask, (events), (opt), 0); (bRet == TRUE)? TRUE : FALSE; })
172*53ee8cc1Swenshuai.xi 
173*53ee8cc1Swenshuai.xi #define TSP_FLAG_SetCrcErr(fltid)                   ({ MS_BOOL bRet = TSP_OS_EventSet(_s32CrcErrFlags[fltid>>5], (1<<(fltid&0x1F))); (bRet == TRUE)? TRUE : FALSE; })
174*53ee8cc1Swenshuai.xi #define TSP_FLAG_GetCrcErr(fltid, events, opt)      ({ MS_BOOL bRet = TSP_OS_EventGet(_s32CrcErrFlags[fltid>>5], (1<<(fltid&0x1F)), (events), (opt), 0); (bRet == TRUE)? TRUE : FALSE; })
175*53ee8cc1Swenshuai.xi #define TSP_FLAG_ModeCrcErr(idx,mask ,events, opt)  ({ MS_BOOL bRet = TSP_OS_EventGet(_s32CrcErrFlags[idx], mask, (events), (opt), 0); (bRet == TRUE)? TRUE : FALSE; })
176*53ee8cc1Swenshuai.xi 
177*53ee8cc1Swenshuai.xi #define TSP_FLAG_SetSecOvf(fltid)                   ({ MS_BOOL bRet = TSP_OS_EventSet(_s32SecOvfFlags[fltid>>5], (1<<(fltid&0x1F))); (bRet == TRUE)? TRUE : FALSE; })
178*53ee8cc1Swenshuai.xi #define TSP_FLAG_GetSecOvf(fltid, events, opt)      ({ MS_BOOL bRet = TSP_OS_EventGet(_s32SecOvfFlags[fltid>>5], (1<<(fltid&0x1F)), (events), (opt), 0); (bRet == TRUE)? TRUE : FALSE; })
179*53ee8cc1Swenshuai.xi #define TSP_FLAG_ModeSecOvf(idx,mask ,events, opt)  ({ MS_BOOL bRet = TSP_OS_EventGet(_s32SecOvfFlags[idx], mask, (events), (opt), 0); (bRet == TRUE)? TRUE : FALSE; })
180*53ee8cc1Swenshuai.xi 
181*53ee8cc1Swenshuai.xi #define TSP_FLAG_SetFltDis(fltid)                   ({ MS_BOOL bRet = TSP_OS_EventSet(_s32FltDisFlags[fltid>>5], (1<<(fltid&0x1F))); (bRet == TRUE)? TRUE : FALSE; })
182*53ee8cc1Swenshuai.xi #define TSP_FLAG_GetFltDis(fltid, events, opt)      ({ MS_BOOL bRet = TSP_OS_EventGet(_s32FltDisFlags[fltid>>5], (1<<(fltid&0x1F)), (events), (opt), 0); (bRet == TRUE)? TRUE : FALSE; })
183*53ee8cc1Swenshuai.xi #define TSP_FLAG_ModeFltDis(idx, mask,events, opt)  ({ MS_BOOL bRet = TSP_OS_EventGet(_s32FltDisFlags[idx], mask, (events), (opt), 0); (bRet == TRUE)? TRUE : FALSE; })
184*53ee8cc1Swenshuai.xi 
185*53ee8cc1Swenshuai.xi #define TSP_FLAG_FREE_TIMEOUT                       8
186*53ee8cc1Swenshuai.xi #define TSP_FLAG_SetFree(fltid)                     ({ MS_BOOL bRet = TSP_OS_EventSet(_s32FreeFlags[fltid>>5], (1<<(fltid&0x1F))); (bRet == TRUE)? TRUE : FALSE; })
187*53ee8cc1Swenshuai.xi #define TSP_FLAG_GetFree(fltid, events, opt)        ({ MS_BOOL bRet = TSP_OS_EventGet(_s32FreeFlags[fltid>>5], (1<<(fltid&0x1F)), (events), (opt), 0); (bRet == TRUE)? TRUE : FALSE; })
188*53ee8cc1Swenshuai.xi #define TSP_FLAG_ModeFree(idx, mask,events, opt)    ({ MS_BOOL bRet = TSP_OS_EventGet(_s32FreeFlags[idx], mask, (events), (opt), 0); (bRet == TRUE)? TRUE : FALSE; })
189*53ee8cc1Swenshuai.xi #define TSP_FLAG_SetDone(fltid)                     ({ MS_BOOL bRet = TSP_OS_EventSet(_s32DoneFlags[fltid>>5], (1<<(fltid&0x1F))); (bRet == TRUE)? TRUE : FALSE; })
190*53ee8cc1Swenshuai.xi #define TSP_FLAG_GetDone(fltid, events, opt)        ({ MS_BOOL bRet = TSP_OS_EventGet(_s32DoneFlags[fltid>>5], (1<<(fltid&0x1F)), (events), (opt), TSP_FLAG_FREE_TIMEOUT); (bRet == TRUE)? TRUE : FALSE; })
191*53ee8cc1Swenshuai.xi 
192*53ee8cc1Swenshuai.xi #define TSP_FLAG_SetModeFlags(fltid)                { _s32ModeFlags[fltid>>5] |= (1<<(fltid&0x1F)) ;}
193*53ee8cc1Swenshuai.xi #define TSP_FLAG_GetModeFlags(idx ,flags)           {  flags = _s32ModeFlags[idx] ; }
194*53ee8cc1Swenshuai.xi #define TSP_FLAG_ClrModeFlags(fltid)                { _s32ModeFlags[fltid>>5] &= (~(1<<(fltid&0x1F))); }
195*53ee8cc1Swenshuai.xi 
196*53ee8cc1Swenshuai.xi #define TSP_FLAG_SetOvfRst(fltid)                   (_s32OvfRstFlags[fltid>>5] |= (1<<(fltid&0x1F)))
197*53ee8cc1Swenshuai.xi #define TSP_FLAG_GetOvfRst(fltid)                   ((_s32OvfRstFlags[fltid>>5] & (1<<(fltid&0x1F)))?TRUE:FALSE )
198*53ee8cc1Swenshuai.xi #define TSP_FLAG_ClrOvfRst(fltid)                   (_s32OvfRstFlags[fltid>>5] &= (~(1<<(fltid&0x1F))))
199*53ee8cc1Swenshuai.xi 
200*53ee8cc1Swenshuai.xi // for mutiple process using, record which filter is enabled by this process
201*53ee8cc1Swenshuai.xi #define _TSP_SetSecNotifyId(fltid)                          (_u32SecNotifyId[(fltid>>5)] |= (1 << (fltid&0x1F)))
202*53ee8cc1Swenshuai.xi #define _TSP_RemoveSecNotifyId(fltid)                       (_u32SecNotifyId[(fltid>>5)] &= ~(1 << (fltid&0x1F)))
203*53ee8cc1Swenshuai.xi #define _TSP_ChkSecNotifyId(fltid)                          (_u32SecNotifyId[(fltid>>5)] & (1 << (fltid&0x1F)))
204*53ee8cc1Swenshuai.xi 
205*53ee8cc1Swenshuai.xi // for mutiple process using, record which pvr engine is enabled by this process
206*53ee8cc1Swenshuai.xi #define _TSP_SetPvrNotifyId(fltid)                          (_u32PvrNotifyId[(fltid>>5)] |= (1 << (fltid&0x1F)))
207*53ee8cc1Swenshuai.xi #define _TSP_RemovePvrNotifyId(fltid)                       (_u32PvrNotifyId[(fltid>>5)] &= ~(1 << (fltid&0x1F)))
208*53ee8cc1Swenshuai.xi #define _TSP_ChkPvrNotifyId(fltid)                          (_u32PvrNotifyId[(fltid>>5)] & (1 << (fltid&0x1F)))
209*53ee8cc1Swenshuai.xi 
210*53ee8cc1Swenshuai.xi // for mutiple process using, record which hw pcr is enabled by this process
211*53ee8cc1Swenshuai.xi #define _TSP_SetHwPcrNotifyId(fltid)                        (_u32HwPcrNotifyId[(fltid>>5)] |= (1 << (fltid&0x1F)))
212*53ee8cc1Swenshuai.xi #define _TSP_RemoveHwPcrNotifyId(fltid)                     (_u32HwPcrNotifyId[(fltid>>5)] &= ~(1 << (fltid&0x1F)))
213*53ee8cc1Swenshuai.xi #define _TSP_ChkHwPcrNotifyId(fltid)                        (_u32HwPcrNotifyId[(fltid>>5)] & (1 << (fltid&0x1F)))
214*53ee8cc1Swenshuai.xi 
215*53ee8cc1Swenshuai.xi #define TSP_ENTRY()                                 if (!TSP_OS_MutexObtain(_ptsp_res->_s32MutexId, TSP_OS_MUTEX_TIMEOUT)) \
216*53ee8cc1Swenshuai.xi                                                     {                                                           \
217*53ee8cc1Swenshuai.xi                                                         _ptsp_res->_tspInfo.LastErr = E_TSP_FAIL_FUNCTION;                 \
218*53ee8cc1Swenshuai.xi                                                         return E_TSP_FAIL_FUNCTION;                             \
219*53ee8cc1Swenshuai.xi                                                     }                                                           \
220*53ee8cc1Swenshuai.xi                                                     TSP_LOCK();                                                 \
221*53ee8cc1Swenshuai.xi 
222*53ee8cc1Swenshuai.xi 
223*53ee8cc1Swenshuai.xi 
224*53ee8cc1Swenshuai.xi #define TSP_RETURN(_ret)                            TSP_UNLOCK();                                       \
225*53ee8cc1Swenshuai.xi                                                     TSP_OS_MutexRelease(_ptsp_res->_s32MutexId);                   \
226*53ee8cc1Swenshuai.xi                                                     if (_ret != E_TSP_OK) { _ptsp_res->_tspInfo.LastErr = _ret; }  \
227*53ee8cc1Swenshuai.xi                                                     return _ret; // Should be optimized by compiler
228*53ee8cc1Swenshuai.xi 
229*53ee8cc1Swenshuai.xi // @TODO: Jerry
230*53ee8cc1Swenshuai.xi // Review and check the rule of LOCK
231*53ee8cc1Swenshuai.xi #define TSP_LOCK()                                  TSP_OS_MutexObtain(_ptsp_res->_s32LockId, TSP_OS_MUTEX_TIMEOUT); \
232*53ee8cc1Swenshuai.xi                                                     MDrv_SEM_Lock(E_SEM_CA , MSOS_WAIT_FOREVER)
233*53ee8cc1Swenshuai.xi                                                     // if you got compile error for E_SEM_CA, you should update your drvSEM
234*53ee8cc1Swenshuai.xi                                                     // to CL#817352 CL provide by johnson.chen
235*53ee8cc1Swenshuai.xi #define TSP_UNLOCK()                                MDrv_SEM_Unlock(E_SEM_CA); \
236*53ee8cc1Swenshuai.xi                                                     TSP_OS_MutexRelease(_ptsp_res->_s32LockId)
237*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
238*53ee8cc1Swenshuai.xi #define _TSP_INT_LOCK()                             spin_lock_irqsave(&_ptsp_res->_s32IntRegMutexId, _ptsp_res->_IntRegFlags)
239*53ee8cc1Swenshuai.xi #define _TSP_INT_UNLOCK()                           spin_unlock_irqrestore(&_ptsp_res->_s32IntRegMutexId,_ptsp_res->_IntRegFlags)
240*53ee8cc1Swenshuai.xi #else
241*53ee8cc1Swenshuai.xi #define _TSP_INT_LOCK()                             TSP_OS_MutexObtain(_ptsp_res->_s32IntRegMutexId, TSP_OS_MUTEX_TIMEOUT)
242*53ee8cc1Swenshuai.xi #define _TSP_INT_UNLOCK()                           TSP_OS_MutexRelease(_ptsp_res->_s32IntRegMutexId)
243*53ee8cc1Swenshuai.xi #endif
244*53ee8cc1Swenshuai.xi 
245*53ee8cc1Swenshuai.xi #define TSP_PVR_ENTRY()                             if (!TSP_OS_MutexObtain(_ptsp_res->_s32PvrMutexId, TSP_OS_MUTEX_TIMEOUT)) \
246*53ee8cc1Swenshuai.xi                                                     {                                                              \
247*53ee8cc1Swenshuai.xi                                                         _ptsp_res->_tspInfo.LastErr = E_TSP_FAIL_FUNCTION;                    \
248*53ee8cc1Swenshuai.xi                                                         return E_TSP_FAIL_FUNCTION;                                \
249*53ee8cc1Swenshuai.xi                                                     }
250*53ee8cc1Swenshuai.xi 
251*53ee8cc1Swenshuai.xi #define TSP_PVR_RETURN(_ret)                        TSP_OS_MutexRelease(_ptsp_res->_s32PvrMutexId);                   \
252*53ee8cc1Swenshuai.xi                                                     if (_ret != E_TSP_OK) { _ptsp_res->_tspInfo.LastErr = _ret; }     \
253*53ee8cc1Swenshuai.xi                                                     return _ret; // Should be optimized by compiler
254*53ee8cc1Swenshuai.xi 
255*53ee8cc1Swenshuai.xi #define TSP_FQ_NUM_CHECK_RET(idx)                   if( (MS_U32)idx >= (MS_U32)TSP_FQ_NUM ) \
256*53ee8cc1Swenshuai.xi                                                     { printf("[TSP][FQ][ERR] FQ Engine [%uld] not exist ! \n", idx);   \
257*53ee8cc1Swenshuai.xi                                                      return 0; }
258*53ee8cc1Swenshuai.xi 
259*53ee8cc1Swenshuai.xi #define TSP_FLT2BUF_NULL                            0xFFFFFFFF
260*53ee8cc1Swenshuai.xi #define TSP_BUF2FLT_NULL                            TSP_FLT2BUF_NULL
261*53ee8cc1Swenshuai.xi 
262*53ee8cc1Swenshuai.xi #define TSP_CHECK(_b, _f, _a...)                    { if (!(_b)) { TSP_OS_Print("[TSP_ASSERT]"); TSP_OS_Print(_f, ##_a); return E_TSP_FAIL;} }
263*53ee8cc1Swenshuai.xi #define TSP_CHECK_UNLOCK(_b, _f, _a...)             { if (!(_b)) { TSP_OS_Print("[TSP_ASSERT]"); TSP_OS_Print(_f, ##_a); TSP_UNLOCK(); return E_TSP_FAIL; } }
264*53ee8cc1Swenshuai.xi #define TSP_RES_ALLOC_STC_CHECK(u32StcEng)          {                                                                                                                           \
265*53ee8cc1Swenshuai.xi                                                         if((_ptsp_res->_bIsStcEverAlloc == TRUE) && (_ptsp_res->_stTspStcState[u32StcEng].bUsed == FALSE))                      \
266*53ee8cc1Swenshuai.xi                                                         {                                                                                                                       \
267*53ee8cc1Swenshuai.xi                                                             TSP_OS_Print("[TSP_ERROR][%s][%d]: Mix old & new STC resource allocation scheme !!\n", __FUNCTION__, __LINE__);     \
268*53ee8cc1Swenshuai.xi                                                         }                                                                                                                       \
269*53ee8cc1Swenshuai.xi                                                     }
270*53ee8cc1Swenshuai.xi 
271*53ee8cc1Swenshuai.xi #define TSP_RES_ALLOC_TSPPATH_CHECK(PhyTspPath)     {                                                                                                                               \
272*53ee8cc1Swenshuai.xi                                                         if((_ptsp_res->_bIsTspPathEverAlloc == TRUE) && (_ptsp_res->_stTspPathState[PhyTspPath].bUsed == FALSE))                    \
273*53ee8cc1Swenshuai.xi                                                         {                                                                                                                           \
274*53ee8cc1Swenshuai.xi                                                             TSP_OS_Print("[TSP_ERROR][%s][%d]: Mix old & new TSP Path resource allocation scheme !!\n", __FUNCTION__, __LINE__);    \
275*53ee8cc1Swenshuai.xi                                                         }                                                                                                                           \
276*53ee8cc1Swenshuai.xi                                                     }
277*53ee8cc1Swenshuai.xi 
278*53ee8cc1Swenshuai.xi #define TSP_PCRFLT_GET_ID(NUM)                      (_tspFltIdMap.u32PcrFltId_Start + (NUM))
279*53ee8cc1Swenshuai.xi 
280*53ee8cc1Swenshuai.xi 
281*53ee8cc1Swenshuai.xi #define TSP_DBG(_l, _f, _a...)                      { if (_u32DbgLevel >= (_l)) { TSP_OS_Print("[TSP_DBG]"); TSP_OS_Print(_f, ##_a); } }
282*53ee8cc1Swenshuai.xi 
283*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
284*53ee8cc1Swenshuai.xi #define TSP_DBG_TASK()                              { _ptsp_res->_tspInfo.u32TaskLine = __LINE__; }
285*53ee8cc1Swenshuai.xi #else
286*53ee8cc1Swenshuai.xi #define TSP_DBG_TASK()                              { }
287*53ee8cc1Swenshuai.xi #endif
288*53ee8cc1Swenshuai.xi 
289*53ee8cc1Swenshuai.xi 
290*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
291*53ee8cc1Swenshuai.xi #define DEMUX_EVENT_DATA_DISCARDED                   (0x00000001U)
292*53ee8cc1Swenshuai.xi #define DEMUX_EVENT_CRC_FAILED                       (0x00000010U)
293*53ee8cc1Swenshuai.xi #endif
294*53ee8cc1Swenshuai.xi 
295*53ee8cc1Swenshuai.xi #define TSP_NEED_SEC_FILTER(FltType)                (E_TSP_FLT_USER_SEC == (FltType & E_TSP_FLT_USER_MASK)) || \
296*53ee8cc1Swenshuai.xi                                                     (E_TSP_FLT_USER_PES == (FltType & E_TSP_FLT_USER_MASK)) || \
297*53ee8cc1Swenshuai.xi                                                     (E_TSP_FLT_USER_PKT == (FltType & E_TSP_FLT_USER_MASK)) || \
298*53ee8cc1Swenshuai.xi                                                     (E_TSP_FLT_USER_PCR == (FltType & E_TSP_FLT_USER_MASK)) || \
299*53ee8cc1Swenshuai.xi                                                     (E_TSP_FLT_USER_TTX == (FltType & E_TSP_FLT_USER_MASK))
300*53ee8cc1Swenshuai.xi 
301*53ee8cc1Swenshuai.xi #define TSP_POLLING_TASK_DELAY                      50
302*53ee8cc1Swenshuai.xi 
303*53ee8cc1Swenshuai.xi #define DRVTSP_MAX_PROCESS_NUM                      (10)
304*53ee8cc1Swenshuai.xi 
305*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
306*53ee8cc1Swenshuai.xi #define current                                     get_current()
307*53ee8cc1Swenshuai.xi #endif
308*53ee8cc1Swenshuai.xi 
309*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
310*53ee8cc1Swenshuai.xi //  Local Structures
311*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
312*53ee8cc1Swenshuai.xi //----------------
313*53ee8cc1Swenshuai.xi //For Tee
314*53ee8cc1Swenshuai.xi //----------------
315*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
316*53ee8cc1Swenshuai.xi typedef enum
317*53ee8cc1Swenshuai.xi {
318*53ee8cc1Swenshuai.xi     E_TSP_TEE_TO_REE_MBX_MSG_NULL,
319*53ee8cc1Swenshuai.xi     E_TSP_TEE_TO_REE_MBX_ACK_MSG_INVALID,
320*53ee8cc1Swenshuai.xi     E_TSP_TEE_TO_REE_MBX_ACK_MSG_NO_TEE,
321*53ee8cc1Swenshuai.xi     E_TSP_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS,
322*53ee8cc1Swenshuai.xi     E_TSP_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL
323*53ee8cc1Swenshuai.xi } TSP_TEE_TO_REE_MBX_ACK_TYPE;
324*53ee8cc1Swenshuai.xi #endif
325*53ee8cc1Swenshuai.xi 
326*53ee8cc1Swenshuai.xi typedef struct DLL_PACKED _TSP_Info
327*53ee8cc1Swenshuai.xi {
328*53ee8cc1Swenshuai.xi     MS_BOOL                         bSWInit;
329*53ee8cc1Swenshuai.xi     MS_BOOL                         bISRTaskEn;
330*53ee8cc1Swenshuai.xi     TSP_SW_Status                   Status;
331*53ee8cc1Swenshuai.xi     TSP_Result                      LastErr;
332*53ee8cc1Swenshuai.xi 
333*53ee8cc1Swenshuai.xi     MS_U32                          Pid[TSP_PIDFLT_NUM_ALL-1];
334*53ee8cc1Swenshuai.xi     EN_TSP_Id                       OwnerId [TSP_PIDFLT_NUM_ALL-1];
335*53ee8cc1Swenshuai.xi     TSP_FltState                    FltState[TSP_PIDFLT_NUM_ALL-1];
336*53ee8cc1Swenshuai.xi     TSP_FltType                     FltType [TSP_PIDFLT_NUM_ALL-1];
337*53ee8cc1Swenshuai.xi     MS_U32                          Flt2Buf [TSP_PIDFLT_NUM];
338*53ee8cc1Swenshuai.xi 
339*53ee8cc1Swenshuai.xi     TSP_FltMode                     FltMode    [TSP_SECFLT_NUM];
340*53ee8cc1Swenshuai.xi     TSP_Event                       FltEvent   [TSP_SECFLT_NUM];
341*53ee8cc1Swenshuai.xi     P_TSP_Callback                  FltCallback[TSP_SECFLT_NUM];
342*53ee8cc1Swenshuai.xi #if !defined (__aarch64__)
343*53ee8cc1Swenshuai.xi     MS_U32                          u32AlignDummy[TSP_SECFLT_NUM];  //align size for MI init share mem size check fail
344*53ee8cc1Swenshuai.xi #endif
345*53ee8cc1Swenshuai.xi 
346*53ee8cc1Swenshuai.xi     TSP_FltState                    BufState[TSP_SECBUF_NUM]; // @TODO: FltState, SecFltState?
347*53ee8cc1Swenshuai.xi     MS_U32                          Buf2Flt [TSP_SECBUF_NUM];
348*53ee8cc1Swenshuai.xi 
349*53ee8cc1Swenshuai.xi     TSP_InitParam                   Param;
350*53ee8cc1Swenshuai.xi 
351*53ee8cc1Swenshuai.xi     // Legacy
352*53ee8cc1Swenshuai.xi     MS_BOOL                         bSuspend;
353*53ee8cc1Swenshuai.xi     // Debug information
354*53ee8cc1Swenshuai.xi     MS_U32                          u32TaskLine;
355*53ee8cc1Swenshuai.xi 
356*53ee8cc1Swenshuai.xi     MS_U8                           MulFlt2Buf[TSP_SECFLT_NUM];
357*53ee8cc1Swenshuai.xi 
358*53ee8cc1Swenshuai.xi     MS_S32                          s32TspEvtId[TSP_SECFLT_NUM];
359*53ee8cc1Swenshuai.xi } TSP_Info;
360*53ee8cc1Swenshuai.xi 
361*53ee8cc1Swenshuai.xi typedef struct
362*53ee8cc1Swenshuai.xi {
363*53ee8cc1Swenshuai.xi     MS_U32  u32StcOffset;
364*53ee8cc1Swenshuai.xi     MS_BOOL bAdd;
365*53ee8cc1Swenshuai.xi }STC_Offset;
366*53ee8cc1Swenshuai.xi 
367*53ee8cc1Swenshuai.xi typedef struct
368*53ee8cc1Swenshuai.xi {
369*53ee8cc1Swenshuai.xi     MS_BOOL bEnable;
370*53ee8cc1Swenshuai.xi     MS_BOOL bUpdateOnce;
371*53ee8cc1Swenshuai.xi }STC_UpdateCtrl;
372*53ee8cc1Swenshuai.xi 
373*53ee8cc1Swenshuai.xi typedef struct _DrvTSP_Stc_State
374*53ee8cc1Swenshuai.xi {
375*53ee8cc1Swenshuai.xi     MS_U32  u32PcrFltId;
376*53ee8cc1Swenshuai.xi     MS_BOOL bUsed;
377*53ee8cc1Swenshuai.xi }DrvTSP_Stc_State;
378*53ee8cc1Swenshuai.xi 
379*53ee8cc1Swenshuai.xi typedef struct
380*53ee8cc1Swenshuai.xi {
381*53ee8cc1Swenshuai.xi     MS_BOOL bUsed;
382*53ee8cc1Swenshuai.xi } DrvTSP_Path_State;
383*53ee8cc1Swenshuai.xi 
384*53ee8cc1Swenshuai.xi typedef struct
385*53ee8cc1Swenshuai.xi {
386*53ee8cc1Swenshuai.xi     // all pid filter ids
387*53ee8cc1Swenshuai.xi     MS_U32  u32PidFltIdAll;
388*53ee8cc1Swenshuai.xi     // section filter , section buffer
389*53ee8cc1Swenshuai.xi     MS_U32  u32SecFltId_Start, u32SecFltId_End;
390*53ee8cc1Swenshuai.xi     MS_U32  u32SecBufId_Start, u32SecBufId_End;
391*53ee8cc1Swenshuai.xi     // pid filter
392*53ee8cc1Swenshuai.xi     MS_U32  u32PidFltId_Start, u32PidFltId_End;
393*53ee8cc1Swenshuai.xi     // PCR filter
394*53ee8cc1Swenshuai.xi     MS_U32  u32PcrFltId_Start, u32PcrFltId_End;
395*53ee8cc1Swenshuai.xi     // REC filter idx
396*53ee8cc1Swenshuai.xi     MS_U32  u32RecFltIdx;
397*53ee8cc1Swenshuai.xi } DrvTSP_FltIdMap;
398*53ee8cc1Swenshuai.xi 
399*53ee8cc1Swenshuai.xi #ifdef DMX_UTOPIA_2K
400*53ee8cc1Swenshuai.xi typedef struct _DrvTSP_KMode_ProcEvtIdTbl
401*53ee8cc1Swenshuai.xi {
402*53ee8cc1Swenshuai.xi     #ifdef MSOS_TYPE_LINUX_KERNEL
403*53ee8cc1Swenshuai.xi     pid_t                   tgid;
404*53ee8cc1Swenshuai.xi     #endif
405*53ee8cc1Swenshuai.xi 
406*53ee8cc1Swenshuai.xi     MS_S32                  s32TspEvtId;
407*53ee8cc1Swenshuai.xi }DrvTSP_KMode_ProcEvtIdTbl;
408*53ee8cc1Swenshuai.xi #endif
409*53ee8cc1Swenshuai.xi 
410*53ee8cc1Swenshuai.xi typedef struct DLL_PACKED _TSP_RESOURCE_PRIVATE
411*53ee8cc1Swenshuai.xi {
412*53ee8cc1Swenshuai.xi     MS_S32                  _s32TaskId;
413*53ee8cc1Swenshuai.xi     MS_S32                  _s32MutexId;
414*53ee8cc1Swenshuai.xi     MS_S32                  _s32LockId;
415*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
416*53ee8cc1Swenshuai.xi     spinlock_t              _s32IntRegMutexId;
417*53ee8cc1Swenshuai.xi     unsigned long           _IntRegFlags;
418*53ee8cc1Swenshuai.xi #else
419*53ee8cc1Swenshuai.xi     MS_S32                  _s32IntRegMutexId;
420*53ee8cc1Swenshuai.xi #endif
421*53ee8cc1Swenshuai.xi     MS_S32                  _s32PvrMutexId;
422*53ee8cc1Swenshuai.xi 
423*53ee8cc1Swenshuai.xi     TSP_Info                _tspInfo;
424*53ee8cc1Swenshuai.xi     #if defined(__LEGACY__)
425*53ee8cc1Swenshuai.xi     TSP_Event               _PvrEvtNotify;
426*53ee8cc1Swenshuai.xi     P_TSP_Callback          _PvrCallback;
427*53ee8cc1Swenshuai.xi     #if !defined (__aarch64__)
428*53ee8cc1Swenshuai.xi     MS_U32                  u32AlignDummy;  //align size for MI init share mem size check fail
429*53ee8cc1Swenshuai.xi     #endif
430*53ee8cc1Swenshuai.xi     MS_S32                  _s32PvrEvtId;
431*53ee8cc1Swenshuai.xi     #endif
432*53ee8cc1Swenshuai.xi 
433*53ee8cc1Swenshuai.xi     MS_U8                   _u8_ResetPcr[STC_ENG_NUM];
434*53ee8cc1Swenshuai.xi     MS_U32                  _u32_PrevStcBase[STC_ENG_NUM];
435*53ee8cc1Swenshuai.xi     MS_U32                  _u32_PrevPllControl[STC_ENG_NUM];
436*53ee8cc1Swenshuai.xi     STC_Offset              _u32_StcOffset[STC_ENG_NUM];
437*53ee8cc1Swenshuai.xi     STC_UpdateCtrl          _u32_StcUpdateCtrl[STC_ENG_NUM];
438*53ee8cc1Swenshuai.xi     DrvTSP_Stc_State        _stTspStcState[STC_ENG_NUM];
439*53ee8cc1Swenshuai.xi     MS_BOOL                 _bIsStcEverAlloc;
440*53ee8cc1Swenshuai.xi     DrvTSP_Path_State       _stTspPathState[TSP_TSIF_NUM];
441*53ee8cc1Swenshuai.xi     MS_BOOL                 _bIsTspPathEverAlloc;
442*53ee8cc1Swenshuai.xi 
443*53ee8cc1Swenshuai.xi     MS_U32                  _Current_PVR;
444*53ee8cc1Swenshuai.xi 
445*53ee8cc1Swenshuai.xi     //[NOTE][Eddie]
446*53ee8cc1Swenshuai.xi     // Since STB and TV architecture are different, STB have to emulate TV behavior to avoid
447*53ee8cc1Swenshuai.xi     // Live/File collision of PLAYBACK channel.
448*53ee8cc1Swenshuai.xi     TSP_FltType             _Current_Live;
449*53ee8cc1Swenshuai.xi 
450*53ee8cc1Swenshuai.xi     //for dummy record filter compatibility
451*53ee8cc1Swenshuai.xi     MS_U32                  u32RecFltBufId;
452*53ee8cc1Swenshuai.xi     MS_U32                  u32RecFltPID;
453*53ee8cc1Swenshuai.xi     DrvTSP_TsIf_Set         TsIf_Src[TSP_TSIF_NUM];
454*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
455*53ee8cc1Swenshuai.xi     SYS_TEEINFO             _teemode;
456*53ee8cc1Swenshuai.xi     DrvTSP_SecureBuf        _stSecBuf;
457*53ee8cc1Swenshuai.xi #endif
458*53ee8cc1Swenshuai.xi 
459*53ee8cc1Swenshuai.xi     MS_U32                  _u32StcAdjustUnit;
460*53ee8cc1Swenshuai.xi 
461*53ee8cc1Swenshuai.xi }TSP_RESOURCE_PRIVATE;
462*53ee8cc1Swenshuai.xi 
463*53ee8cc1Swenshuai.xi static MS_S32                  _s32EventId = -1;
464*53ee8cc1Swenshuai.xi static MS_S32                  _s32CrcErrFlags[(TSP_SECFLT_NUM+31)>>5] = { [0 ... (((TSP_SECFLT_NUM+31)>>5)-1)] = -1 };
465*53ee8cc1Swenshuai.xi static MS_S32                  _s32SecOvfFlags[(TSP_SECFLT_NUM+31)>>5] = { [0 ... (((TSP_SECFLT_NUM+31)>>5)-1)] = -1 };
466*53ee8cc1Swenshuai.xi static MS_S32                  _s32SecRdyFlags[(TSP_SECFLT_NUM+31)>>5] = { [0 ... (((TSP_SECFLT_NUM+31)>>5)-1)] = -1 };
467*53ee8cc1Swenshuai.xi static MS_S32                  _s32FltDisFlags[(TSP_SECFLT_NUM+31)>>5] = { [0 ... (((TSP_SECFLT_NUM+31)>>5)-1)] = -1 };
468*53ee8cc1Swenshuai.xi static MS_S32                  _s32FreeFlags  [(TSP_SECFLT_NUM+31)>>5] = { [0 ... (((TSP_SECFLT_NUM+31)>>5)-1)] = -1 };
469*53ee8cc1Swenshuai.xi static MS_S32                  _s32DoneFlags  [(TSP_SECFLT_NUM+31)>>5] = { [0 ... (((TSP_SECFLT_NUM+31)>>5)-1)] = -1 };
470*53ee8cc1Swenshuai.xi 
471*53ee8cc1Swenshuai.xi static MS_S32                  _s32ModeFlags[(TSP_SECFLT_NUM+31)>>5] = { [0 ... (((TSP_SECFLT_NUM+31)>>5)-1)] = -1 };
472*53ee8cc1Swenshuai.xi static MS_S32                  _s32OvfRstFlags[(TSP_SECFLT_NUM+31)>>5] = { [0 ... (((TSP_SECFLT_NUM+31)>>5)-1)] = -1 };
473*53ee8cc1Swenshuai.xi 
474*53ee8cc1Swenshuai.xi static MS_U32                  _u32SecNotifyId[(TSP_SECFLT_NUM+31)>>5] = { [0 ... (((TSP_SECFLT_NUM+31)>>5)-1)] = 0 }; //for ISR processing
475*53ee8cc1Swenshuai.xi static MS_U32                  _u32PvrNotifyId[(TSP_PVR_IF_NUM+31)>>5] = { [0 ... (((TSP_PVR_IF_NUM+31)>>5)-1)] = 0 };
476*53ee8cc1Swenshuai.xi static MS_U32                  _u32HwPcrNotifyId[(TSP_PCRFLT_NUM+31)>>5] = { [0 ... (((TSP_PCRFLT_NUM+31)>>5)-1)] = 0 };
477*53ee8cc1Swenshuai.xi 
478*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
479*53ee8cc1Swenshuai.xi //  Global Variables
480*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
481*53ee8cc1Swenshuai.xi #ifndef TSP_UTOPIA_20
482*53ee8cc1Swenshuai.xi static TSP_RESOURCE_PRIVATE         _tsp_res = {
483*53ee8cc1Swenshuai.xi     ._s32TaskId                     = -1,
484*53ee8cc1Swenshuai.xi     ._s32MutexId                    = -1,
485*53ee8cc1Swenshuai.xi     ._s32LockId                     = -1,
486*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
487*53ee8cc1Swenshuai.xi     ._s32IntRegMutexId              = __SPIN_LOCK_UNLOCKED(_s32IntRegMutexId),
488*53ee8cc1Swenshuai.xi     ._IntRegFlags                   =  0,
489*53ee8cc1Swenshuai.xi #else
490*53ee8cc1Swenshuai.xi     ._s32IntRegMutexId              = -1,
491*53ee8cc1Swenshuai.xi #endif
492*53ee8cc1Swenshuai.xi     ._s32PvrMutexId                 = -1,
493*53ee8cc1Swenshuai.xi 
494*53ee8cc1Swenshuai.xi     ._tspInfo                       = {
495*53ee8cc1Swenshuai.xi         .bSWInit                    = FALSE,
496*53ee8cc1Swenshuai.xi         .bISRTaskEn                 = FALSE,
497*53ee8cc1Swenshuai.xi         .LastErr                    = E_TSP_OK,
498*53ee8cc1Swenshuai.xi         .bSuspend                   = FALSE,
499*53ee8cc1Swenshuai.xi         .u32TaskLine                = 0,
500*53ee8cc1Swenshuai.xi     },
501*53ee8cc1Swenshuai.xi 
502*53ee8cc1Swenshuai.xi     #if defined(__LEGACY__)
503*53ee8cc1Swenshuai.xi     ._PvrEvtNotify                  = E_TSP_EVENT_DATA_IDLE,
504*53ee8cc1Swenshuai.xi     ._PvrCallback                   = NULL,
505*53ee8cc1Swenshuai.xi     ._s32PvrEvtId                   = -1,
506*53ee8cc1Swenshuai.xi     #endif
507*53ee8cc1Swenshuai.xi 
508*53ee8cc1Swenshuai.xi     ._u8_ResetPcr                   = {[0 ... (STC_ENG_NUM-1)] = 3},
509*53ee8cc1Swenshuai.xi     ._u32_PrevStcBase               = {[0 ... (STC_ENG_NUM-1)] = 0},
510*53ee8cc1Swenshuai.xi     ._u32_PrevPllControl            = {[0 ... (STC_ENG_NUM-1)] = 0},
511*53ee8cc1Swenshuai.xi     ._u32_StcOffset                 = {[0 ... (STC_ENG_NUM-1)] = {0,TRUE}},
512*53ee8cc1Swenshuai.xi     ._u32_StcUpdateCtrl             = {[0 ... (STC_ENG_NUM-1)] = {TRUE,FALSE}},
513*53ee8cc1Swenshuai.xi     ._stTspStcState                 = {[0 ... (STC_ENG_NUM-1)] = {0xFFFFFFFF, FALSE}},
514*53ee8cc1Swenshuai.xi 
515*53ee8cc1Swenshuai.xi     ._bIsStcEverAlloc               = FALSE,
516*53ee8cc1Swenshuai.xi     ._stTspPathState                = {[0 ... (TSP_TSIF_NUM-1)] = {FALSE}},
517*53ee8cc1Swenshuai.xi     ._bIsTspPathEverAlloc           = FALSE,
518*53ee8cc1Swenshuai.xi 
519*53ee8cc1Swenshuai.xi     ._Current_PVR                   = 0,
520*53ee8cc1Swenshuai.xi     ._Current_Live                  = E_TSP_FLT_SRC_LIVE0,
521*53ee8cc1Swenshuai.xi     .u32RecFltBufId                 = TSP_SECFLT_SECBUF_MAX,
522*53ee8cc1Swenshuai.xi     .u32RecFltPID                   = TSP_PID_NULL,
523*53ee8cc1Swenshuai.xi     .TsIf_Src                       = {[0 ... (TSP_TSIF_NUM-1)] = {E_TSP_TS_INVALID,FALSE,TRUE,TRUE}},
524*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
525*53ee8cc1Swenshuai.xi     ._teemode                       = {.OsType = SYS_TEEINFO_OSTYPE_NOTEE},
526*53ee8cc1Swenshuai.xi     ._stSecBuf                      = { 0, 0, 0, 0},
527*53ee8cc1Swenshuai.xi #endif
528*53ee8cc1Swenshuai.xi     ._u32StcAdjustUnit              = 100,
529*53ee8cc1Swenshuai.xi };
530*53ee8cc1Swenshuai.xi 
531*53ee8cc1Swenshuai.xi static TSP_RESOURCE_PRIVATE*        _ptsp_res = &_tsp_res;
532*53ee8cc1Swenshuai.xi #else
533*53ee8cc1Swenshuai.xi static TSP_RESOURCE_PRIVATE*        _ptsp_res = NULL;
534*53ee8cc1Swenshuai.xi #endif
535*53ee8cc1Swenshuai.xi 
536*53ee8cc1Swenshuai.xi static DrvTSP_FltIdMap         _tspFltIdMap ={
537*53ee8cc1Swenshuai.xi                 .u32SecFltId_Start          = TSP_SECFLT_START_ID,
538*53ee8cc1Swenshuai.xi                 .u32SecFltId_End            = TSP_SECFLT_END_ID,
539*53ee8cc1Swenshuai.xi                 .u32SecBufId_Start          = TSP_SECBUF_START_ID,
540*53ee8cc1Swenshuai.xi                 .u32SecBufId_End            = TSP_SECBUF_END_ID,
541*53ee8cc1Swenshuai.xi                 .u32PidFltId_Start          = TSP_PIDFLT_START_ID,
542*53ee8cc1Swenshuai.xi                 .u32PidFltId_End            = TSP_PIDFLT_END_ID,
543*53ee8cc1Swenshuai.xi                 .u32PcrFltId_Start          = TSP_PCRFLT_START_ID,
544*53ee8cc1Swenshuai.xi                 .u32PcrFltId_End            = TSP_PCRFLT_END_ID,
545*53ee8cc1Swenshuai.xi                 .u32RecFltIdx               = TSP_RECFLT_IDX,
546*53ee8cc1Swenshuai.xi             };
547*53ee8cc1Swenshuai.xi 
548*53ee8cc1Swenshuai.xi 
549*53ee8cc1Swenshuai.xi 
550*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
551*53ee8cc1Swenshuai.xi //  Local Variables
552*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
553*53ee8cc1Swenshuai.xi 
554*53ee8cc1Swenshuai.xi static MSIF_Version                 _drv_tsp_version = {
555*53ee8cc1Swenshuai.xi                                         .DDI = { TSP_DRV_VERSION, },
556*53ee8cc1Swenshuai.xi                                     };
557*53ee8cc1Swenshuai.xi 
558*53ee8cc1Swenshuai.xi static TSP_DbgLevel                 _u32DbgLevel = E_TSP_DBG_MUST;
559*53ee8cc1Swenshuai.xi 
560*53ee8cc1Swenshuai.xi MS_U32                              _u32IntNum = E_INT_IRQ_TSP2HK;
561*53ee8cc1Swenshuai.xi 
562*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
563*53ee8cc1Swenshuai.xi wait_queue_head_t                   tsp_wq_head[TSP_SECFLT_NUM];
564*53ee8cc1Swenshuai.xi static MS_U32                       _u32SecEvent[TSP_SECFLT_NUM];
565*53ee8cc1Swenshuai.xi #endif // MSOS_TYPE_LINUX_KERNEL
566*53ee8cc1Swenshuai.xi 
567*53ee8cc1Swenshuai.xi static MS_BOOL                      _bBankInit = FALSE;
568*53ee8cc1Swenshuai.xi 
569*53ee8cc1Swenshuai.xi static MS_BOOL                      _s32_IsrTaskReturn = FALSE;
570*53ee8cc1Swenshuai.xi 
571*53ee8cc1Swenshuai.xi static MS_BOOL                      _bIsFltMapped;
572*53ee8cc1Swenshuai.xi 
573*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
574*53ee8cc1Swenshuai.xi static DrvTSP_KMode_ProcEvtIdTbl    _stKModePrcEvtTbl[DRVTSP_MAX_PROCESS_NUM];
575*53ee8cc1Swenshuai.xi static MS_U32                       _u32KPrcEvtTblUseFlag = 0;  //bit control for event table used
576*53ee8cc1Swenshuai.xi #endif
577*53ee8cc1Swenshuai.xi 
578*53ee8cc1Swenshuai.xi //-----      For optee   ------------------
579*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
580*53ee8cc1Swenshuai.xi #define MSTAR_UPA_DMXTA_UUID {0x7a7c8b61, 0x5d74, 0x4b6c, {0xb2, 0xa9, 0x92, 0xe4, 0x9c, 0xe8, 0x66, 0xbd} }
581*53ee8cc1Swenshuai.xi #define SYS_TEEC_OPERATION_INITIALIZER { 0 }
582*53ee8cc1Swenshuai.xi 
583*53ee8cc1Swenshuai.xi static const char optee_dmx[] = "opteearmtz00";
584*53ee8cc1Swenshuai.xi char *_dmx_device = (char *)optee_dmx;
585*53ee8cc1Swenshuai.xi TEEC_Context dmx_mstar_teec_ctx;
586*53ee8cc1Swenshuai.xi TEEC_Session dmx_session = { 0 };
587*53ee8cc1Swenshuai.xi TEEC_UUID dmx_uuid = MSTAR_UPA_DMXTA_UUID;
588*53ee8cc1Swenshuai.xi TEEC_Operation dmx_op = SYS_TEEC_OPERATION_INITIALIZER;
589*53ee8cc1Swenshuai.xi #endif //SECURE_PVR_ENABLE
590*53ee8cc1Swenshuai.xi 
591*53ee8cc1Swenshuai.xi //For Optee
592*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
593*53ee8cc1Swenshuai.xi extern MS_U32 MDrv_SYS_TEEC_InitializeContext(const char *name, TEEC_Context *context);
594*53ee8cc1Swenshuai.xi extern MS_U32 MDrv_SYS_TEEC_Open(TEEC_Context *context, TEEC_Session *session, const TEEC_UUID *destination, MS_U32 connection_method, const void *connection_data, TEEC_Operation *operation, MS_U32 *error_origin);
595*53ee8cc1Swenshuai.xi extern MS_U32 MDrv_SYS_TEEC_InvokeCmd(TEEC_Session *session, MS_U32 cmd_id, TEEC_Operation *operation, MS_U32 *error_origin);
596*53ee8cc1Swenshuai.xi extern void   MDrv_SYS_TEEC_Close(TEEC_Session *session);
597*53ee8cc1Swenshuai.xi extern void   MDrv_SYS_TEEC_FinalizeContext(TEEC_Context *context);
598*53ee8cc1Swenshuai.xi #endif
599*53ee8cc1Swenshuai.xi 
600*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
601*53ee8cc1Swenshuai.xi //  Debug Functions
602*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
603*53ee8cc1Swenshuai.xi 
MDrv_TSP_FLT_DropEnable(MS_BOOL bSet)604*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_DropEnable(MS_BOOL bSet)
605*53ee8cc1Swenshuai.xi {
606*53ee8cc1Swenshuai.xi     TSP_ENTRY();
607*53ee8cc1Swenshuai.xi     HAL_TSP_SecFlt_DropEnable(bSet);
608*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
609*53ee8cc1Swenshuai.xi }
610*53ee8cc1Swenshuai.xi 
611*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
612*53ee8cc1Swenshuai.xi //  Local Functions
613*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
614*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_FltAllocForRec(MS_U32 u32Eng, TSP_SRC_SEQ eEngSrc, MS_U32 *pu32FltId);
615*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_FltFreeForRec(MS_U32 u32FltId);
616*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_FltSetPIDForRec(MS_U32 u32FltId, MS_U32 u32PID);
617*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_FltGetPIDForRec(MS_U32 u32FltId, MS_U32* pu32PID);
618*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_FltEnableForRec(MS_U32 u32FltId, MS_BOOL bEnable);
619*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_SetBuffer(MS_U32 u32Eng, MS_PHYADDR u32Start0, MS_PHYADDR u32Start1, MS_U32 u32Size0, MS_U32 u32Size1);
620*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_Start(MS_U32 u32Eng, TSP_DRV_PVR_RecMode eRecMode, MS_BOOL bStart)                                 ;
621*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_Pause(MS_U32 u32Eng, MS_BOOL bPause);
622*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_GetWriteAddr(MS_U32 u32Eng, MS_PHY *pu32WriteAddr)                                     ;
623*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_Notify(MS_U32 u32Eng, TSP_Event eEvents, P_TSP_Callback pfCallback)                        ;
624*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_SetPacketMode(MS_U32 u32Eng, MS_BOOL bSet);
625*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_TimeStampSetRecordStamp(MS_U32 u32Eng, MS_U32 u32Stamp);
626*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_TimeStampGetRecordStamp(MS_U32 u32Eng, MS_U32* u32Stamp);
627*53ee8cc1Swenshuai.xi static void _MDrv_TSP_FLT_ResetFltId(void);
628*53ee8cc1Swenshuai.xi /*
629*53ee8cc1Swenshuai.xi static void _TSP_CMDQ_Init(void)
630*53ee8cc1Swenshuai.xi {
631*53ee8cc1Swenshuai.xi     while (HAL_TSP_CMDQ_Count()); // wait command finish
632*53ee8cc1Swenshuai.xi }
633*53ee8cc1Swenshuai.xi */
634*53ee8cc1Swenshuai.xi // Switch Uart to TSP Fw, function works only when fw support uart functionality
635*53ee8cc1Swenshuai.xi // Compile Fwtsp.c with UART_ENABLE in chip.h
636*53ee8cc1Swenshuai.xi 
637*53ee8cc1Swenshuai.xi #if SWITCH_TSP_UART
_TSP_Switch_Uart(void)638*53ee8cc1Swenshuai.xi static void _TSP_Switch_Uart(void)
639*53ee8cc1Swenshuai.xi {
640*53ee8cc1Swenshuai.xi         MS_U32 u32Base = 0 ,u32Size;
641*53ee8cc1Swenshuai.xi         MS_U16 u16Temp;
642*53ee8cc1Swenshuai.xi 
643*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST,"Switch Uart to TSP firmware !!\n");
644*53ee8cc1Swenshuai.xi 
645*53ee8cc1Swenshuai.xi         MDrv_MMIO_GetBASE( &u32Base, &u32Size, MS_MODULE_CHIPTOP );
646*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST,"ChipTop MMIO base = %08lX \n",u32Base);
647*53ee8cc1Swenshuai.xi 
648*53ee8cc1Swenshuai.xi         if(u32Base)
649*53ee8cc1Swenshuai.xi         {
650*53ee8cc1Swenshuai.xi         u16Temp = READ_WORD((u32Base + 0x1EA6*2));
651*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST,"ChipTop Uart setting = %x \n",u16Temp);
652*53ee8cc1Swenshuai.xi         u16Temp = ((u16Temp & 0xFFF0) | 0x3 );
653*53ee8cc1Swenshuai.xi         WRITE_WORD((u32Base + 0x1EA6*2),u16Temp);
654*53ee8cc1Swenshuai.xi         }
655*53ee8cc1Swenshuai.xi         else
656*53ee8cc1Swenshuai.xi         {
657*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST,"MMIO ChipTOP GetBase Fail\n");
658*53ee8cc1Swenshuai.xi         }
659*53ee8cc1Swenshuai.xi 
660*53ee8cc1Swenshuai.xi }
661*53ee8cc1Swenshuai.xi #endif
662*53ee8cc1Swenshuai.xi 
_TSP_InitResource(TSP_RESOURCE_PRIVATE * presource)663*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_InitResource(TSP_RESOURCE_PRIVATE* presource)
664*53ee8cc1Swenshuai.xi {
665*53ee8cc1Swenshuai.xi     MS_U32 u32ii = 0;
666*53ee8cc1Swenshuai.xi 
667*53ee8cc1Swenshuai.xi     if(presource == NULL)
668*53ee8cc1Swenshuai.xi     {
669*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST,"Utopia2 Resource address is NULL!\n");
670*53ee8cc1Swenshuai.xi         return FALSE;
671*53ee8cc1Swenshuai.xi     }
672*53ee8cc1Swenshuai.xi 
673*53ee8cc1Swenshuai.xi     presource->_s32TaskId = -1;
674*53ee8cc1Swenshuai.xi     presource->_s32MutexId = -1;
675*53ee8cc1Swenshuai.xi     presource->_s32LockId = -1;
676*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
677*53ee8cc1Swenshuai.xi     spin_lock_init(&presource->_s32IntRegMutexId);
678*53ee8cc1Swenshuai.xi #else
679*53ee8cc1Swenshuai.xi     presource->_s32IntRegMutexId = -1;
680*53ee8cc1Swenshuai.xi #endif
681*53ee8cc1Swenshuai.xi     presource->_s32PvrMutexId = -1;
682*53ee8cc1Swenshuai.xi 
683*53ee8cc1Swenshuai.xi     presource->_tspInfo.bSWInit = FALSE;
684*53ee8cc1Swenshuai.xi     presource->_tspInfo.bISRTaskEn = FALSE;
685*53ee8cc1Swenshuai.xi     presource->_tspInfo.LastErr = E_TSP_OK;
686*53ee8cc1Swenshuai.xi     presource->_tspInfo.bSuspend = FALSE;
687*53ee8cc1Swenshuai.xi     presource->_tspInfo.u32TaskLine = 0;
688*53ee8cc1Swenshuai.xi 
689*53ee8cc1Swenshuai.xi     #if defined(__LEGACY__)
690*53ee8cc1Swenshuai.xi     presource->_PvrEvtNotify = E_TSP_EVENT_DATA_IDLE;
691*53ee8cc1Swenshuai.xi     presource->_PvrCallback = NULL;
692*53ee8cc1Swenshuai.xi     presource->_s32PvrEvtId = -1;
693*53ee8cc1Swenshuai.xi     #endif
694*53ee8cc1Swenshuai.xi 
695*53ee8cc1Swenshuai.xi     for(u32ii = 0; u32ii < STC_ENG_NUM; u32ii++)
696*53ee8cc1Swenshuai.xi     {
697*53ee8cc1Swenshuai.xi         presource->_u8_ResetPcr[u32ii] = 3;
698*53ee8cc1Swenshuai.xi         presource->_u32_PrevStcBase[u32ii] = 0;
699*53ee8cc1Swenshuai.xi         presource->_u32_PrevPllControl[u32ii] = 0;
700*53ee8cc1Swenshuai.xi 
701*53ee8cc1Swenshuai.xi         presource->_stTspStcState[u32ii].u32PcrFltId = 0xFFFFFFFF;
702*53ee8cc1Swenshuai.xi         presource->_stTspStcState[u32ii].bUsed = FALSE;
703*53ee8cc1Swenshuai.xi     }
704*53ee8cc1Swenshuai.xi 
705*53ee8cc1Swenshuai.xi     presource->_bIsStcEverAlloc = FALSE;
706*53ee8cc1Swenshuai.xi 
707*53ee8cc1Swenshuai.xi     for(u32ii = 0; u32ii < TSP_TSIF_NUM; u32ii++)
708*53ee8cc1Swenshuai.xi     {
709*53ee8cc1Swenshuai.xi         presource->_stTspPathState[u32ii].bUsed = FALSE;
710*53ee8cc1Swenshuai.xi     }
711*53ee8cc1Swenshuai.xi 
712*53ee8cc1Swenshuai.xi     presource->_bIsTspPathEverAlloc = FALSE;
713*53ee8cc1Swenshuai.xi 
714*53ee8cc1Swenshuai.xi     presource->_Current_PVR = 0;
715*53ee8cc1Swenshuai.xi     presource->_Current_Live = E_TSP_FLT_SRC_LIVE0;
716*53ee8cc1Swenshuai.xi 
717*53ee8cc1Swenshuai.xi     for(u32ii = 0; u32ii < TSP_TSIF_NUM; u32ii++)
718*53ee8cc1Swenshuai.xi     {
719*53ee8cc1Swenshuai.xi         presource->TsIf_Src[u32ii].ePad = E_TSP_TS_INVALID;
720*53ee8cc1Swenshuai.xi         presource->TsIf_Src[u32ii].bClkInv = FALSE;
721*53ee8cc1Swenshuai.xi         presource->TsIf_Src[u32ii].bExtSync = TRUE;
722*53ee8cc1Swenshuai.xi         presource->TsIf_Src[u32ii].bParallel = TRUE;
723*53ee8cc1Swenshuai.xi     }
724*53ee8cc1Swenshuai.xi 
725*53ee8cc1Swenshuai.xi 	#ifdef SECURE_PVR_ENABLE
726*53ee8cc1Swenshuai.xi     presource->_teemode.OsType = SYS_TEEINFO_OSTYPE_NOTEE;
727*53ee8cc1Swenshuai.xi     presource->_stSecBuf.u32BufId = 0;
728*53ee8cc1Swenshuai.xi     presource->_stSecBuf.u32BufOpt = 0;
729*53ee8cc1Swenshuai.xi     presource->_stSecBuf.u32BufSize = 0;
730*53ee8cc1Swenshuai.xi     presource->_stSecBuf.phyBufAddr = 0;
731*53ee8cc1Swenshuai.xi     #endif
732*53ee8cc1Swenshuai.xi 
733*53ee8cc1Swenshuai.xi     presource->_u32StcAdjustUnit = 100;
734*53ee8cc1Swenshuai.xi     _MDrv_TSP_FLT_ResetFltId();
735*53ee8cc1Swenshuai.xi 
736*53ee8cc1Swenshuai.xi     return TRUE;
737*53ee8cc1Swenshuai.xi 
738*53ee8cc1Swenshuai.xi }
739*53ee8cc1Swenshuai.xi 
740*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
741*53ee8cc1Swenshuai.xi //For REE, HK cowork with Tee by mailbox
742*53ee8cc1Swenshuai.xi 
743*53ee8cc1Swenshuai.xi MS_BOOL _bTSPMbxInitFlag = 0;
744*53ee8cc1Swenshuai.xi MS_U8   _u8TSPMbxMsgClass = 0;
745*53ee8cc1Swenshuai.xi MBX_Msg _TSPReeToTeeMbxMsg;
746*53ee8cc1Swenshuai.xi MBX_Msg _TSPTeeToReeMbxMsg;
747*53ee8cc1Swenshuai.xi 
_TSP_REE_MbxParamToBufParam(MBX_Msg * pMsg,MS_U32 * pu32BufAddr,MS_U32 * pu32Size)748*53ee8cc1Swenshuai.xi MS_BOOL _TSP_REE_MbxParamToBufParam(MBX_Msg *pMsg, MS_U32* pu32BufAddr, MS_U32* pu32Size)
749*53ee8cc1Swenshuai.xi {
750*53ee8cc1Swenshuai.xi     MS_U32 u32addr = 0;
751*53ee8cc1Swenshuai.xi 
752*53ee8cc1Swenshuai.xi     if(pMsg->u8ParameterCount < 9)
753*53ee8cc1Swenshuai.xi         return FALSE;
754*53ee8cc1Swenshuai.xi 
755*53ee8cc1Swenshuai.xi     *pu32Size = ((MS_U32)pMsg->u8Parameters[0]) & 0xFFUL;
756*53ee8cc1Swenshuai.xi     *pu32Size += ((((MS_U32)pMsg->u8Parameters[1]) << 8UL) & 0xFF00UL);
757*53ee8cc1Swenshuai.xi     *pu32Size += ((((MS_U32)pMsg->u8Parameters[2]) << 16UL) & 0xFF0000UL);
758*53ee8cc1Swenshuai.xi     *pu32Size += ((((MS_U32)pMsg->u8Parameters[3]) << 24UL) & 0xFF000000UL);
759*53ee8cc1Swenshuai.xi     u32addr = ((MS_U32)pMsg->u8Parameters[4]) & 0xFFUL;
760*53ee8cc1Swenshuai.xi     u32addr += ((((MS_U32)pMsg->u8Parameters[5]) << 8UL) & 0xFF00UL);
761*53ee8cc1Swenshuai.xi     u32addr += (((MS_U32)pMsg->u8Parameters[6] << 16UL) & 0xFF0000UL);
762*53ee8cc1Swenshuai.xi     u32addr += (((MS_U32)pMsg->u8Parameters[7] << 24UL) & 0xFF000000UL);
763*53ee8cc1Swenshuai.xi     _miu_offset_to_phy(pMsg->u8Parameters[8], u32addr, *pu32BufAddr);
764*53ee8cc1Swenshuai.xi 
765*53ee8cc1Swenshuai.xi     return TRUE;
766*53ee8cc1Swenshuai.xi }
767*53ee8cc1Swenshuai.xi 
_TSP_REE_RegisterMBX(void)768*53ee8cc1Swenshuai.xi MS_BOOL _TSP_REE_RegisterMBX(void)
769*53ee8cc1Swenshuai.xi {
770*53ee8cc1Swenshuai.xi     MS_U8 ClassNum = 0;
771*53ee8cc1Swenshuai.xi     MBX_Result result = E_MBX_ERR_NOT_INITIALIZED;
772*53ee8cc1Swenshuai.xi     MS_U32 u32StartTime = 0;
773*53ee8cc1Swenshuai.xi     const MS_U32 u32RetryTimeOutMs = 3000;
774*53ee8cc1Swenshuai.xi 
775*53ee8cc1Swenshuai.xi     result = MApi_MBX_Init(E_MBX_CPU_MIPS,E_MBX_ROLE_HK,1000);
776*53ee8cc1Swenshuai.xi     if (( E_MBX_SUCCESS != result) && ( E_MBX_ERR_SLOT_AREADY_OPENNED != result ))
777*53ee8cc1Swenshuai.xi     {
778*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_ERROR, "DMX_REE MApi_MBX_Init fail\n");
779*53ee8cc1Swenshuai.xi         return FALSE;
780*53ee8cc1Swenshuai.xi     }
781*53ee8cc1Swenshuai.xi     else
782*53ee8cc1Swenshuai.xi     {
783*53ee8cc1Swenshuai.xi         MApi_MBX_Enable(TRUE);
784*53ee8cc1Swenshuai.xi     }
785*53ee8cc1Swenshuai.xi 
786*53ee8cc1Swenshuai.xi     u32StartTime = MsOS_GetSystemTime();
787*53ee8cc1Swenshuai.xi     while((MsOS_GetSystemTime() - u32StartTime) < u32RetryTimeOutMs)
788*53ee8cc1Swenshuai.xi     {
789*53ee8cc1Swenshuai.xi         result = MApi_MBX_QueryDynamicClass(E_MBX_CPU_MIPS_VPE1, "DMX_TEE", (MS_U8 *)&ClassNum);
790*53ee8cc1Swenshuai.xi         if(result == E_MBX_SUCCESS)
791*53ee8cc1Swenshuai.xi             break;
792*53ee8cc1Swenshuai.xi         MsOS_DelayTask(100);
793*53ee8cc1Swenshuai.xi     };
794*53ee8cc1Swenshuai.xi 
795*53ee8cc1Swenshuai.xi     if(result != E_MBX_SUCCESS)
796*53ee8cc1Swenshuai.xi     {
797*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_ERROR, "DMX_REE MApi_MBX_QueryDynamicClass fail\n");
798*53ee8cc1Swenshuai.xi         return FALSE;
799*53ee8cc1Swenshuai.xi     }
800*53ee8cc1Swenshuai.xi 
801*53ee8cc1Swenshuai.xi     result = MApi_MBX_RegisterMSG(ClassNum, 10);
802*53ee8cc1Swenshuai.xi     if (( E_MBX_SUCCESS != result) && ( E_MBX_ERR_SLOT_AREADY_OPENNED != result ))
803*53ee8cc1Swenshuai.xi     {
804*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_ERROR, "%s fail\n",__FUNCTION__);
805*53ee8cc1Swenshuai.xi         return FALSE;
806*53ee8cc1Swenshuai.xi     }
807*53ee8cc1Swenshuai.xi     else
808*53ee8cc1Swenshuai.xi     {
809*53ee8cc1Swenshuai.xi         _bTSPMbxInitFlag = TRUE;
810*53ee8cc1Swenshuai.xi         _u8TSPMbxMsgClass = ClassNum;
811*53ee8cc1Swenshuai.xi         return TRUE;
812*53ee8cc1Swenshuai.xi     }
813*53ee8cc1Swenshuai.xi }
814*53ee8cc1Swenshuai.xi 
_TSP_Ree_SendMBXMsg(TSP_REE_TO_TEE_CMD_TYPE msg_type,void * param)815*53ee8cc1Swenshuai.xi MS_BOOL _TSP_Ree_SendMBXMsg(TSP_REE_TO_TEE_CMD_TYPE msg_type, void* param)
816*53ee8cc1Swenshuai.xi {
817*53ee8cc1Swenshuai.xi     MBX_Result result = E_MBX_UNKNOW_ERROR;
818*53ee8cc1Swenshuai.xi     DrvTSP_SecureBuf *pstSecBuf = (DrvTSP_SecureBuf*)param;
819*53ee8cc1Swenshuai.xi     MS_U8 u8Id = 0;
820*53ee8cc1Swenshuai.xi     MS_U32 u32Addr = 0, u32Size = 0;
821*53ee8cc1Swenshuai.xi     MS_U32 u32Offset = 0;
822*53ee8cc1Swenshuai.xi     MS_U8 u8MiuSel = 0;
823*53ee8cc1Swenshuai.xi     MS_U8 u8Opt = 0;
824*53ee8cc1Swenshuai.xi     MS_U32 u32StartTime = MsOS_GetSystemTime();
825*53ee8cc1Swenshuai.xi     MS_U32 u32Timeout = 2000;
826*53ee8cc1Swenshuai.xi     const MS_U32 u32TotTimeout = 6000;
827*53ee8cc1Swenshuai.xi     const MS_U32 u32RevMsgTimeout = 2000;
828*53ee8cc1Swenshuai.xi 
829*53ee8cc1Swenshuai.xi     if (_bTSPMbxInitFlag == FALSE)
830*53ee8cc1Swenshuai.xi     {
831*53ee8cc1Swenshuai.xi         return FALSE;
832*53ee8cc1Swenshuai.xi     }
833*53ee8cc1Swenshuai.xi 
834*53ee8cc1Swenshuai.xi     //retry mbx msg sending, if sending fail
835*53ee8cc1Swenshuai.xi     u32StartTime = MsOS_GetSystemTime();
836*53ee8cc1Swenshuai.xi     while((MsOS_GetSystemTime() - u32StartTime) < u32TotTimeout)
837*53ee8cc1Swenshuai.xi     {
838*53ee8cc1Swenshuai.xi         _TSPReeToTeeMbxMsg.eRoleID = E_MBX_CPU_MIPS_VPE1;
839*53ee8cc1Swenshuai.xi         _TSPReeToTeeMbxMsg.u8Ctrl = 0;
840*53ee8cc1Swenshuai.xi         _TSPReeToTeeMbxMsg.eMsgType = E_MBX_MSG_TYPE_INSTANT;
841*53ee8cc1Swenshuai.xi         _TSPReeToTeeMbxMsg.u8MsgClass = _u8TSPMbxMsgClass;
842*53ee8cc1Swenshuai.xi         _TSPReeToTeeMbxMsg.u8Index = msg_type;
843*53ee8cc1Swenshuai.xi 
844*53ee8cc1Swenshuai.xi         switch(msg_type)
845*53ee8cc1Swenshuai.xi         {
846*53ee8cc1Swenshuai.xi             case E_DRVTSP_REE_TO_TEE_CMD_FW_LoadCode:
847*53ee8cc1Swenshuai.xi                 u8Id = (MS_U8)(pstSecBuf->u32BufId);
848*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8Parameters[0] = u8Id;
849*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8ParameterCount = 1;
850*53ee8cc1Swenshuai.xi                 break;
851*53ee8cc1Swenshuai.xi             case E_DRVTSP_REE_TO_TEE_CMD_SET_VqBuf:
852*53ee8cc1Swenshuai.xi                 break;
853*53ee8cc1Swenshuai.xi             case E_DRVTSP_REE_TO_TEE_CMD_SET_PvrBuf:
854*53ee8cc1Swenshuai.xi                 if(pstSecBuf == 0)
855*53ee8cc1Swenshuai.xi                 {
856*53ee8cc1Swenshuai.xi                     MS_DEBUG_MSG(TSP_DBG("[%s][%d] Parameter pointer of PVR buffer is 0!!!!\n",__FUNCTION__, __LINE__));
857*53ee8cc1Swenshuai.xi                     return FALSE;
858*53ee8cc1Swenshuai.xi                 }
859*53ee8cc1Swenshuai.xi                 u8Id = (MS_U8)(pstSecBuf->u32BufId);
860*53ee8cc1Swenshuai.xi                 u8Opt = (MS_U8)(pstSecBuf->u32BufOpt);
861*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8Parameters[0] = u8Id;
862*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8Parameters[1] = u8Opt;
863*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8ParameterCount = 2;
864*53ee8cc1Swenshuai.xi                 break;
865*53ee8cc1Swenshuai.xi             case E_DRVTSP_REE_TO_TEE_CMD_SET_FileinBuf:
866*53ee8cc1Swenshuai.xi                 if(pstSecBuf == 0)
867*53ee8cc1Swenshuai.xi                 {
868*53ee8cc1Swenshuai.xi                     MS_DEBUG_MSG(TSP_DBG("[%s][%d] Parameter pointer of Filein buffer is 0!!!!\n",__FUNCTION__, __LINE__));
869*53ee8cc1Swenshuai.xi                     return FALSE;
870*53ee8cc1Swenshuai.xi                 }
871*53ee8cc1Swenshuai.xi                 u8Id = (MS_U8)(pstSecBuf->u32BufId);
872*53ee8cc1Swenshuai.xi                 u8Opt = (MS_U8)(pstSecBuf->u32BufOpt);
873*53ee8cc1Swenshuai.xi                 u32Addr = (MS_U32)(pstSecBuf->phyBufAddr);
874*53ee8cc1Swenshuai.xi                 u32Size = pstSecBuf->u32BufSize;
875*53ee8cc1Swenshuai.xi                 _phy_to_miu_offset(u8MiuSel, u32Offset, u32Addr);
876*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8Parameters[0] = (MS_U8)(u32Size & 0xFFUL);
877*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8Parameters[1] = (MS_U8)((u32Size & 0xFF00UL) >> 8UL);
878*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8Parameters[2] = (MS_U8)((u32Size & 0xFF0000UL) >> 16UL);
879*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8Parameters[3] = (MS_U8)((u32Size & 0xFF000000UL) >> 24UL);
880*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8Parameters[4] = (MS_U8)(u32Offset & 0xFFUL);
881*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8Parameters[5] = (MS_U8)((u32Offset & 0xFF00UL) >> 8UL);
882*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8Parameters[6] = (MS_U8)((u32Offset & 0xFF0000UL) >> 16UL);
883*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8Parameters[7] = (MS_U8)((u32Offset & 0xFF000000UL) >> 24UL);
884*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8Parameters[8] = u8MiuSel;
885*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8Parameters[9] = u8Id;
886*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8ParameterCount = 10;
887*53ee8cc1Swenshuai.xi                 break;
888*53ee8cc1Swenshuai.xi             case E_DRVTSP_REE_TO_TEE_CMD_GET_PvrWPtr:
889*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8Parameters[0] = (MS_U8)(pstSecBuf->u32BufId);
890*53ee8cc1Swenshuai.xi                 _TSPReeToTeeMbxMsg.u8ParameterCount = 1;
891*53ee8cc1Swenshuai.xi                 break;
892*53ee8cc1Swenshuai.xi 
893*53ee8cc1Swenshuai.xi             default:
894*53ee8cc1Swenshuai.xi                 MS_DEBUG_MSG(TSP_DBG("[%s] Tee cmd not support\n",__FUNCTION__));
895*53ee8cc1Swenshuai.xi                 return FALSE;
896*53ee8cc1Swenshuai.xi         }
897*53ee8cc1Swenshuai.xi 
898*53ee8cc1Swenshuai.xi         result = MApi_MBX_SendMsg(&_TSPReeToTeeMbxMsg);
899*53ee8cc1Swenshuai.xi         if (E_MBX_SUCCESS != result)
900*53ee8cc1Swenshuai.xi         {
901*53ee8cc1Swenshuai.xi             MsOS_DelayTask(100);
902*53ee8cc1Swenshuai.xi             continue;
903*53ee8cc1Swenshuai.xi         }
904*53ee8cc1Swenshuai.xi 
905*53ee8cc1Swenshuai.xi         // Receive Reply ACK from TEE side.
906*53ee8cc1Swenshuai.xi         memset(&_TSPTeeToReeMbxMsg, 0, sizeof(MBX_Msg));
907*53ee8cc1Swenshuai.xi 
908*53ee8cc1Swenshuai.xi         _TSPTeeToReeMbxMsg.u8MsgClass = _u8TSPMbxMsgClass;
909*53ee8cc1Swenshuai.xi 
910*53ee8cc1Swenshuai.xi         #if 0 // marked temperarily, wait kernel team to fix MApi_MBX_RecvMsg.
911*53ee8cc1Swenshuai.xi         if(E_MBX_SUCCESS != MApi_MBX_RecvMsg(TEE_MBX_MSG_CLASS, &(TEE_TO_REE_MBX_MSG), 20, MBX_CHECK_INSTANT_MSG))
912*53ee8cc1Swenshuai.xi         {
913*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("VDEC get Secure world ACK fail\n");
914*53ee8cc1Swenshuai.xi             return E_TSP_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL;
915*53ee8cc1Swenshuai.xi         }
916*53ee8cc1Swenshuai.xi         else
917*53ee8cc1Swenshuai.xi         #else
918*53ee8cc1Swenshuai.xi         do
919*53ee8cc1Swenshuai.xi         {
920*53ee8cc1Swenshuai.xi             result = MApi_MBX_RecvMsg(_u8TSPMbxMsgClass, &_TSPTeeToReeMbxMsg, u32RevMsgTimeout, MBX_CHECK_INSTANT_MSG);
921*53ee8cc1Swenshuai.xi             u32Timeout -= u32RevMsgTimeout;
922*53ee8cc1Swenshuai.xi         } while((E_MBX_SUCCESS != result) && (u32Timeout > 0));
923*53ee8cc1Swenshuai.xi         #endif
924*53ee8cc1Swenshuai.xi 
925*53ee8cc1Swenshuai.xi         if((result == E_MBX_SUCCESS) && (_TSPTeeToReeMbxMsg.u8Index == E_TSP_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS))
926*53ee8cc1Swenshuai.xi         {
927*53ee8cc1Swenshuai.xi             break;
928*53ee8cc1Swenshuai.xi         }
929*53ee8cc1Swenshuai.xi 
930*53ee8cc1Swenshuai.xi         MsOS_DelayTask(100);
931*53ee8cc1Swenshuai.xi 
932*53ee8cc1Swenshuai.xi     }
933*53ee8cc1Swenshuai.xi 
934*53ee8cc1Swenshuai.xi     //parsing return data
935*53ee8cc1Swenshuai.xi     if((result == E_MBX_SUCCESS) && (_TSPTeeToReeMbxMsg.u8Index == E_TSP_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS))
936*53ee8cc1Swenshuai.xi     {
937*53ee8cc1Swenshuai.xi         switch(msg_type)
938*53ee8cc1Swenshuai.xi         {
939*53ee8cc1Swenshuai.xi             case E_DRVTSP_REE_TO_TEE_CMD_SET_PvrBuf:
940*53ee8cc1Swenshuai.xi                 pstSecBuf->phyBufAddr = 0;
941*53ee8cc1Swenshuai.xi                 pstSecBuf->u32BufSize = 0;
942*53ee8cc1Swenshuai.xi                 _TSP_REE_MbxParamToBufParam(&_TSPTeeToReeMbxMsg, &u32Addr, &u32Size);
943*53ee8cc1Swenshuai.xi                 pstSecBuf->phyBufAddr = ((MS_PHY)u32Addr) & 0xFFFFFFFFUL;
944*53ee8cc1Swenshuai.xi                 pstSecBuf->u32BufSize = u32Size;
945*53ee8cc1Swenshuai.xi                 break;
946*53ee8cc1Swenshuai.xi             case E_DRVTSP_REE_TO_TEE_CMD_GET_PvrWPtr:
947*53ee8cc1Swenshuai.xi                 pstSecBuf->phyBufAddr = 0;
948*53ee8cc1Swenshuai.xi                 if(_TSPTeeToReeMbxMsg.u8ParameterCount < 5)
949*53ee8cc1Swenshuai.xi                 {
950*53ee8cc1Swenshuai.xi                     return FALSE;
951*53ee8cc1Swenshuai.xi                 }
952*53ee8cc1Swenshuai.xi                 u32Addr = ((MS_U32)_TSPTeeToReeMbxMsg.u8Parameters[1]) & 0xFFUL;
953*53ee8cc1Swenshuai.xi                 u32Addr += ((((MS_U32)_TSPTeeToReeMbxMsg.u8Parameters[2]) << 8UL) & 0xFF00UL);
954*53ee8cc1Swenshuai.xi                 u32Addr += ((((MS_U32)_TSPTeeToReeMbxMsg.u8Parameters[3]) << 16UL) & 0xFF0000UL);
955*53ee8cc1Swenshuai.xi                 u32Addr += ((((MS_U32)_TSPTeeToReeMbxMsg.u8Parameters[4]) << 24UL) & 0xFF000000UL);
956*53ee8cc1Swenshuai.xi                 _miu_offset_to_phy(_TSPTeeToReeMbxMsg.u8Parameters[0], u32Offset, u32Addr);
957*53ee8cc1Swenshuai.xi                 pstSecBuf->phyBufAddr = ((MS_PHY)u32Addr) & 0xFFFFFFFFUL;
958*53ee8cc1Swenshuai.xi                 break;
959*53ee8cc1Swenshuai.xi             default:
960*53ee8cc1Swenshuai.xi                 break;
961*53ee8cc1Swenshuai.xi         }
962*53ee8cc1Swenshuai.xi 
963*53ee8cc1Swenshuai.xi         return TRUE;
964*53ee8cc1Swenshuai.xi     }
965*53ee8cc1Swenshuai.xi 
966*53ee8cc1Swenshuai.xi     //printf("[%s][%d] timeout!\n",__FUNCTION__,__LINE__);
967*53ee8cc1Swenshuai.xi 
968*53ee8cc1Swenshuai.xi     return FALSE;
969*53ee8cc1Swenshuai.xi }
970*53ee8cc1Swenshuai.xi 
971*53ee8cc1Swenshuai.xi #endif  //SECURE_PVR_ENABLE
972*53ee8cc1Swenshuai.xi 
_TSP_DrvHal_PadMapping(TSP_TSPad eTSPad)973*53ee8cc1Swenshuai.xi static TSP_TS_PAD _TSP_DrvHal_PadMapping(TSP_TSPad eTSPad)
974*53ee8cc1Swenshuai.xi {
975*53ee8cc1Swenshuai.xi     switch (eTSPad)
976*53ee8cc1Swenshuai.xi     {
977*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD0:
978*53ee8cc1Swenshuai.xi             return E_TSP_TS_PAD_EXT0;
979*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD1:
980*53ee8cc1Swenshuai.xi             return E_TSP_TS_PAD_EXT1;
981*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD2:
982*53ee8cc1Swenshuai.xi             return E_TSP_TS_PAD_EXT2;
983*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD3:
984*53ee8cc1Swenshuai.xi             return E_TSP_TS_PAD_EXT3;
985*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD4:
986*53ee8cc1Swenshuai.xi             return E_TSP_TS_PAD_EXT4;
987*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD5:
988*53ee8cc1Swenshuai.xi             return E_TSP_TS_PAD_EXT5;
989*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD6:
990*53ee8cc1Swenshuai.xi             return E_TSP_TS_PAD_EXT6;
991*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD7:
992*53ee8cc1Swenshuai.xi             return E_TSP_TS_PAD_EXT7;
993*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD0_3WIRE:
994*53ee8cc1Swenshuai.xi             return HAL_TSP_3WirePadMapping(0);
995*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD1_3WIRE:
996*53ee8cc1Swenshuai.xi             return HAL_TSP_3WirePadMapping(1);
997*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD2_3WIRE:
998*53ee8cc1Swenshuai.xi             return HAL_TSP_3WirePadMapping(2);
999*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD3_3WIRE:
1000*53ee8cc1Swenshuai.xi             return HAL_TSP_3WirePadMapping(3);
1001*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD4_3WIRE:
1002*53ee8cc1Swenshuai.xi             return HAL_TSP_3WirePadMapping(4);
1003*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD5_3WIRE:
1004*53ee8cc1Swenshuai.xi             return HAL_TSP_3WirePadMapping(5);
1005*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD6_3WIRE:
1006*53ee8cc1Swenshuai.xi             return HAL_TSP_3WirePadMapping(6);
1007*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD7_3WIRE:
1008*53ee8cc1Swenshuai.xi             return HAL_TSP_3WirePadMapping(7);
1009*53ee8cc1Swenshuai.xi         case E_TSP_TS_DEMOD0:
1010*53ee8cc1Swenshuai.xi             return E_TSP_TS_PAD_INTER0;
1011*53ee8cc1Swenshuai.xi         case E_TSP_TS_DEMOD1:
1012*53ee8cc1Swenshuai.xi             return E_TSP_TS_PAD_INTER1;
1013*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD_TSO0:
1014*53ee8cc1Swenshuai.xi             return E_TSP_TS_PAD_TSOUT0;
1015*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD_TSO1:
1016*53ee8cc1Swenshuai.xi             return E_TSP_TS_PAD_TSOUT1;
1017*53ee8cc1Swenshuai.xi #ifdef TSIO_ENABLE
1018*53ee8cc1Swenshuai.xi         case E_TSP_TS_PAD_TSIO0:
1019*53ee8cc1Swenshuai.xi             return E_TSP_TS_PAD_TSIOOUT0;
1020*53ee8cc1Swenshuai.xi #endif
1021*53ee8cc1Swenshuai.xi 
1022*53ee8cc1Swenshuai.xi         default:
1023*53ee8cc1Swenshuai.xi             return E_TSP_TS_PAD_INVALID;
1024*53ee8cc1Swenshuai.xi     }
1025*53ee8cc1Swenshuai.xi }
1026*53ee8cc1Swenshuai.xi 
_TSP_DrvHal_TSIFMapping(TSP_TSIF eTSIF)1027*53ee8cc1Swenshuai.xi static TSP_HAL_TSIF _TSP_DrvHal_TSIFMapping(TSP_TSIF eTSIF)
1028*53ee8cc1Swenshuai.xi {
1029*53ee8cc1Swenshuai.xi     switch(eTSIF)
1030*53ee8cc1Swenshuai.xi     {
1031*53ee8cc1Swenshuai.xi         case E_TSP_TSIF_0:
1032*53ee8cc1Swenshuai.xi             return E_TSP_HAL_TSIF_0;
1033*53ee8cc1Swenshuai.xi         case E_TSP_TSIF_1:
1034*53ee8cc1Swenshuai.xi             return E_TSP_HAL_TSIF_1;
1035*53ee8cc1Swenshuai.xi         case E_TSP_TSIF_2:
1036*53ee8cc1Swenshuai.xi             return E_TSP_HAL_TSIF_2;
1037*53ee8cc1Swenshuai.xi         case E_TSP_TSIF_3:
1038*53ee8cc1Swenshuai.xi             return E_TSP_HAL_TSIF_3;
1039*53ee8cc1Swenshuai.xi         case E_TSP_TSIF_4:
1040*53ee8cc1Swenshuai.xi             return E_TSP_HAL_TSIF_4;
1041*53ee8cc1Swenshuai.xi         case E_TSP_TSIF_5:
1042*53ee8cc1Swenshuai.xi             return E_TSP_HAL_TSIF_5;
1043*53ee8cc1Swenshuai.xi         case E_TSP_TSIF_6:
1044*53ee8cc1Swenshuai.xi             return E_TSP_HAL_TSIF_6;
1045*53ee8cc1Swenshuai.xi         case E_TSP_TSIF_PVR0:
1046*53ee8cc1Swenshuai.xi             return E_TSP_HAL_TSIF_PVR0;
1047*53ee8cc1Swenshuai.xi         case E_TSP_TSIF_PVR1:
1048*53ee8cc1Swenshuai.xi             return E_TSP_HAL_TSIF_PVR1;
1049*53ee8cc1Swenshuai.xi         case E_TSP_TSIF_PVR2:
1050*53ee8cc1Swenshuai.xi             return E_TSP_HAL_TSIF_PVR2;
1051*53ee8cc1Swenshuai.xi         case E_TSP_TSIF_PVR3:
1052*53ee8cc1Swenshuai.xi             return E_TSP_HAL_TSIF_PVR3;
1053*53ee8cc1Swenshuai.xi         default:
1054*53ee8cc1Swenshuai.xi             return E_TSP_HAL_TSIF_INVALID;
1055*53ee8cc1Swenshuai.xi     }
1056*53ee8cc1Swenshuai.xi }
1057*53ee8cc1Swenshuai.xi 
_TSP_DrvHal_FltSrcMapping(MS_U32 u32FltSrc)1058*53ee8cc1Swenshuai.xi TSP_PIDFLT_SRC _TSP_DrvHal_FltSrcMapping(MS_U32 u32FltSrc)
1059*53ee8cc1Swenshuai.xi {
1060*53ee8cc1Swenshuai.xi     TSP_PIDFLT_SRC  ePidFltSrc = E_TSP_PIDFLT_INVALID;
1061*53ee8cc1Swenshuai.xi 
1062*53ee8cc1Swenshuai.xi     switch(u32FltSrc)
1063*53ee8cc1Swenshuai.xi     {
1064*53ee8cc1Swenshuai.xi         case E_TSP_FLT_SRC_LIVE0:
1065*53ee8cc1Swenshuai.xi             ePidFltSrc = E_TSP_PIDFLT_LIVE0;
1066*53ee8cc1Swenshuai.xi             break;
1067*53ee8cc1Swenshuai.xi         case E_TSP_FLT_SRC_LIVE1:
1068*53ee8cc1Swenshuai.xi             ePidFltSrc = E_TSP_PIDFLT_LIVE1;
1069*53ee8cc1Swenshuai.xi             break;
1070*53ee8cc1Swenshuai.xi         case E_TSP_FLT_SRC_LIVE2:
1071*53ee8cc1Swenshuai.xi             ePidFltSrc = E_TSP_PIDFLT_LIVE2;
1072*53ee8cc1Swenshuai.xi             break;
1073*53ee8cc1Swenshuai.xi         case E_TSP_FLT_SRC_LIVE3:
1074*53ee8cc1Swenshuai.xi             ePidFltSrc = E_TSP_PIDFLT_LIVE3;
1075*53ee8cc1Swenshuai.xi             break;
1076*53ee8cc1Swenshuai.xi         case E_TSP_FLT_SRC_FILE0:
1077*53ee8cc1Swenshuai.xi             ePidFltSrc = E_TSP_PIDFLT_FILE0;
1078*53ee8cc1Swenshuai.xi             break;
1079*53ee8cc1Swenshuai.xi         case E_TSP_FLT_SRC_FILE1:
1080*53ee8cc1Swenshuai.xi             ePidFltSrc = E_TSP_PIDFLT_FILE1;
1081*53ee8cc1Swenshuai.xi             break;
1082*53ee8cc1Swenshuai.xi         case E_TSP_FLT_SRC_FILE2:
1083*53ee8cc1Swenshuai.xi             ePidFltSrc = E_TSP_PIDFLT_FILE2;
1084*53ee8cc1Swenshuai.xi             break;
1085*53ee8cc1Swenshuai.xi         case E_TSP_FLT_SRC_FILE3:
1086*53ee8cc1Swenshuai.xi             ePidFltSrc = E_TSP_PIDFLT_FILE3;
1087*53ee8cc1Swenshuai.xi             break;
1088*53ee8cc1Swenshuai.xi         case E_TSP_FLT_SRC_LIVE4:
1089*53ee8cc1Swenshuai.xi         case E_TSP_FLT_SRC_FILE4:
1090*53ee8cc1Swenshuai.xi             ePidFltSrc = E_TSP_PIDFLT_LIVE4;
1091*53ee8cc1Swenshuai.xi             break;
1092*53ee8cc1Swenshuai.xi         case E_TSP_FLT_SRC_LIVE5:
1093*53ee8cc1Swenshuai.xi         case E_TSP_FLT_SRC_FILE5:
1094*53ee8cc1Swenshuai.xi             ePidFltSrc = E_TSP_PIDFLT_LIVE5;
1095*53ee8cc1Swenshuai.xi             break;
1096*53ee8cc1Swenshuai.xi         case E_TSP_FLT_SRC_LIVE6:
1097*53ee8cc1Swenshuai.xi         case E_TSP_FLT_SRC_FILE6:
1098*53ee8cc1Swenshuai.xi             ePidFltSrc = E_TSP_PIDFLT_LIVE6;
1099*53ee8cc1Swenshuai.xi             break;
1100*53ee8cc1Swenshuai.xi         default:
1101*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_WARNING, "[%04d] Filter input source is not assigned !! \n", __LINE__);
1102*53ee8cc1Swenshuai.xi             ePidFltSrc = E_TSP_PIDFLT_LIVE0;
1103*53ee8cc1Swenshuai.xi             break;
1104*53ee8cc1Swenshuai.xi     }
1105*53ee8cc1Swenshuai.xi 
1106*53ee8cc1Swenshuai.xi     return ePidFltSrc;
1107*53ee8cc1Swenshuai.xi }
1108*53ee8cc1Swenshuai.xi 
MDrv_TSP_FIFO_SourceSelect(TSP_TSId eTspTSid,TSP_FileMode eFifoType)1109*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FIFO_SourceSelect(TSP_TSId eTspTSid, TSP_FileMode eFifoType)
1110*53ee8cc1Swenshuai.xi {
1111*53ee8cc1Swenshuai.xi     TSP_ENTRY();
1112*53ee8cc1Swenshuai.xi 
1113*53ee8cc1Swenshuai.xi     TSP_DST_SEQ eTspDstSeq = E_TSP_DST_INVALID;
1114*53ee8cc1Swenshuai.xi     TSP_SRC_SEQ eTspSrcSeq = E_TSP_SRC_INVALID;
1115*53ee8cc1Swenshuai.xi 
1116*53ee8cc1Swenshuai.xi     switch (eFifoType)
1117*53ee8cc1Swenshuai.xi     {
1118*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO:
1119*53ee8cc1Swenshuai.xi             eTspDstSeq = E_TSP_DST_FIFO_AUDIO;
1120*53ee8cc1Swenshuai.xi             break;
1121*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO2:
1122*53ee8cc1Swenshuai.xi             eTspDstSeq = E_TSP_DST_FIFO_AUDIO2;
1123*53ee8cc1Swenshuai.xi             break;
1124*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO3:
1125*53ee8cc1Swenshuai.xi             eTspDstSeq = E_TSP_DST_FIFO_AUDIO3;
1126*53ee8cc1Swenshuai.xi             break;
1127*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO4:
1128*53ee8cc1Swenshuai.xi             eTspDstSeq = E_TSP_DST_FIFO_AUDIO4;
1129*53ee8cc1Swenshuai.xi             break;
1130*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO5:
1131*53ee8cc1Swenshuai.xi             eTspDstSeq = E_TSP_DST_FIFO_AUDIO5;
1132*53ee8cc1Swenshuai.xi             break;
1133*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO6:
1134*53ee8cc1Swenshuai.xi             eTspDstSeq = E_TSP_DST_FIFO_AUDIO6;
1135*53ee8cc1Swenshuai.xi             break;
1136*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO:
1137*53ee8cc1Swenshuai.xi             eTspDstSeq = E_TSP_DST_FIFO_VIDEO;
1138*53ee8cc1Swenshuai.xi             break;
1139*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO3D:
1140*53ee8cc1Swenshuai.xi             eTspDstSeq = E_TSP_DST_FIFO_VIDEO3D;
1141*53ee8cc1Swenshuai.xi             break;
1142*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO3:
1143*53ee8cc1Swenshuai.xi             eTspDstSeq = E_TSP_DST_FIFO_VIDEO3;
1144*53ee8cc1Swenshuai.xi             break;
1145*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO4:
1146*53ee8cc1Swenshuai.xi             eTspDstSeq = E_TSP_DST_FIFO_VIDEO4;
1147*53ee8cc1Swenshuai.xi             break;
1148*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO5:
1149*53ee8cc1Swenshuai.xi             eTspDstSeq = E_TSP_DST_FIFO_VIDEO5;
1150*53ee8cc1Swenshuai.xi             break;
1151*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO6:
1152*53ee8cc1Swenshuai.xi             eTspDstSeq = E_TSP_DST_FIFO_VIDEO6;
1153*53ee8cc1Swenshuai.xi             break;
1154*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO7:
1155*53ee8cc1Swenshuai.xi             eTspDstSeq = E_TSP_DST_FIFO_VIDEO7;
1156*53ee8cc1Swenshuai.xi             break;
1157*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO8:
1158*53ee8cc1Swenshuai.xi             eTspDstSeq = E_TSP_DST_FIFO_VIDEO8;
1159*53ee8cc1Swenshuai.xi             break;
1160*53ee8cc1Swenshuai.xi         default:
1161*53ee8cc1Swenshuai.xi             TSP_OS_Print("[TSP Error][%04d] INVALID FIFO TYPE\n",__LINE__);
1162*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL_INVALID);
1163*53ee8cc1Swenshuai.xi    }
1164*53ee8cc1Swenshuai.xi 
1165*53ee8cc1Swenshuai.xi    switch (eTspTSid)
1166*53ee8cc1Swenshuai.xi    {
1167*53ee8cc1Swenshuai.xi         case E_TSP_TSID_TSIF0:
1168*53ee8cc1Swenshuai.xi             eTspSrcSeq = E_TSP_SRC_PKTDMX0;
1169*53ee8cc1Swenshuai.xi             break;
1170*53ee8cc1Swenshuai.xi         case E_TSP_TSID_TSIF1:
1171*53ee8cc1Swenshuai.xi             eTspSrcSeq = E_TSP_SRC_PKTDMX1;
1172*53ee8cc1Swenshuai.xi             break;
1173*53ee8cc1Swenshuai.xi         case E_TSP_TSID_TSIF2:
1174*53ee8cc1Swenshuai.xi             eTspSrcSeq = E_TSP_SRC_PKTDMX3;
1175*53ee8cc1Swenshuai.xi             break;
1176*53ee8cc1Swenshuai.xi         case E_TSP_TSID_TSIF3:
1177*53ee8cc1Swenshuai.xi             eTspSrcSeq = E_TSP_SRC_PKTDMX4;
1178*53ee8cc1Swenshuai.xi             break;
1179*53ee8cc1Swenshuai.xi         case E_TSP_TSID_MMFI0:
1180*53ee8cc1Swenshuai.xi             eTspSrcSeq = E_TSP_SRC_MMFI0;
1181*53ee8cc1Swenshuai.xi             break;
1182*53ee8cc1Swenshuai.xi         case E_TSP_TSID_MMFI1:
1183*53ee8cc1Swenshuai.xi             eTspSrcSeq = E_TSP_SRC_MMFI1;
1184*53ee8cc1Swenshuai.xi             break;
1185*53ee8cc1Swenshuai.xi         default:
1186*53ee8cc1Swenshuai.xi             TSP_OS_Print("[TSP Error][%04d] INVALID PKDMX SRC\n",__LINE__);
1187*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL_INVALID);
1188*53ee8cc1Swenshuai.xi     }
1189*53ee8cc1Swenshuai.xi 
1190*53ee8cc1Swenshuai.xi     HAL_TSP_FIFO_SetSrc(eTspDstSeq, eTspSrcSeq);
1191*53ee8cc1Swenshuai.xi 
1192*53ee8cc1Swenshuai.xi     if((eTspTSid == E_TSP_TSID_MMFI0) || (eTspTSid == E_TSP_TSID_MMFI1))
1193*53ee8cc1Swenshuai.xi     {
1194*53ee8cc1Swenshuai.xi         HAL_TSP_FIFO_BlockDis(eTspDstSeq, FALSE);
1195*53ee8cc1Swenshuai.xi     }
1196*53ee8cc1Swenshuai.xi     else
1197*53ee8cc1Swenshuai.xi     {
1198*53ee8cc1Swenshuai.xi         HAL_TSP_FIFO_BlockDis(eTspDstSeq, TRUE);
1199*53ee8cc1Swenshuai.xi     }
1200*53ee8cc1Swenshuai.xi 
1201*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
1202*53ee8cc1Swenshuai.xi }
1203*53ee8cc1Swenshuai.xi 
1204*53ee8cc1Swenshuai.xi 
_TSP_DrvHal_FltType2DstMapping(TSP_FltType eFltType)1205*53ee8cc1Swenshuai.xi static TSP_DST_SEQ _TSP_DrvHal_FltType2DstMapping(TSP_FltType eFltType)
1206*53ee8cc1Swenshuai.xi {
1207*53ee8cc1Swenshuai.xi     TSP_DST_SEQ eRetDst = E_TSP_DST_INVALID;
1208*53ee8cc1Swenshuai.xi 
1209*53ee8cc1Swenshuai.xi     switch(eFltType)
1210*53ee8cc1Swenshuai.xi     {
1211*53ee8cc1Swenshuai.xi         case E_TSP_FLT_FIFO_VIDEO ... E_TSP_FLT_FIFO_VIDEO8:
1212*53ee8cc1Swenshuai.xi             eRetDst= (TSP_DST_SEQ)(E_TSP_DST_FIFO_VIDEO + (eFltType - E_TSP_FLT_FIFO_VIDEO));
1213*53ee8cc1Swenshuai.xi             break;
1214*53ee8cc1Swenshuai.xi         case E_TSP_FLT_FIFO_AUDIO ... E_TSP_FLT_FIFO_AUDIO6:
1215*53ee8cc1Swenshuai.xi             eRetDst = (TSP_DST_SEQ)(E_TSP_DST_FIFO_AUDIO + (eFltType - E_TSP_FLT_FIFO_AUDIO));
1216*53ee8cc1Swenshuai.xi             break;
1217*53ee8cc1Swenshuai.xi         default:
1218*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d] UnSupport Flt Type!\n", __FUNCTION__, __LINE__);
1219*53ee8cc1Swenshuai.xi             break;
1220*53ee8cc1Swenshuai.xi     }
1221*53ee8cc1Swenshuai.xi 
1222*53ee8cc1Swenshuai.xi     return eRetDst;
1223*53ee8cc1Swenshuai.xi }
1224*53ee8cc1Swenshuai.xi 
1225*53ee8cc1Swenshuai.xi 
1226*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1227*53ee8cc1Swenshuai.xi /// Reset audio/video fifo
1228*53ee8cc1Swenshuai.xi /// @param  bReset                  \b IN   0->1:reset, 1->0:activate
1229*53ee8cc1Swenshuai.xi /// @return TSP_Result
1230*53ee8cc1Swenshuai.xi /// @note
1231*53ee8cc1Swenshuai.xi /// 0->1 reset, 1->0 activate
1232*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FIFO_Reset(TSP_FltType eFltType,MS_BOOL bReset)1233*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FIFO_Reset(TSP_FltType eFltType, MS_BOOL bReset)
1234*53ee8cc1Swenshuai.xi {
1235*53ee8cc1Swenshuai.xi     TSP_ENTRY();
1236*53ee8cc1Swenshuai.xi 
1237*53ee8cc1Swenshuai.xi     TSP_DST_SEQ eDst = _TSP_DrvHal_FltType2DstMapping(eFltType);
1238*53ee8cc1Swenshuai.xi 
1239*53ee8cc1Swenshuai.xi     HAL_TSP_FIFO_Reset(eDst,  bReset);
1240*53ee8cc1Swenshuai.xi 
1241*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
1242*53ee8cc1Swenshuai.xi }
1243*53ee8cc1Swenshuai.xi 
1244*53ee8cc1Swenshuai.xi 
MDrv_TSP_FIFO_BlockEnable(TSP_FltType eFltType,MS_BOOL bDisable)1245*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FIFO_BlockEnable(TSP_FltType eFltType, MS_BOOL bDisable)
1246*53ee8cc1Swenshuai.xi {
1247*53ee8cc1Swenshuai.xi     TSP_ENTRY();
1248*53ee8cc1Swenshuai.xi 
1249*53ee8cc1Swenshuai.xi     TSP_DST_SEQ eDst = _TSP_DrvHal_FltType2DstMapping(eFltType);
1250*53ee8cc1Swenshuai.xi 
1251*53ee8cc1Swenshuai.xi     HAL_TSP_FIFO_BlockDis(eDst, bDisable);
1252*53ee8cc1Swenshuai.xi 
1253*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
1254*53ee8cc1Swenshuai.xi }
1255*53ee8cc1Swenshuai.xi 
1256*53ee8cc1Swenshuai.xi 
1257*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1258*53ee8cc1Swenshuai.xi /// Reset audio/video fifo
1259*53ee8cc1Swenshuai.xi /// @param  u32Level                \b OUT  0:0-25%, 1:25-50%, 2:50-75%, 3:75-100%, 0xFFFFFFFF:N/A
1260*53ee8cc1Swenshuai.xi /// @return TSP_Result
1261*53ee8cc1Swenshuai.xi /// @note
1262*53ee8cc1Swenshuai.xi /// 0->1 reset, 1->0 activate
1263*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FIFO_GetStatus(TSP_FltType eFltType,MS_U32 * pu32Level)1264*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FIFO_GetStatus(TSP_FltType eFltType, MS_U32 *pu32Level)
1265*53ee8cc1Swenshuai.xi {
1266*53ee8cc1Swenshuai.xi     TSP_ENTRY();
1267*53ee8cc1Swenshuai.xi 
1268*53ee8cc1Swenshuai.xi     eFltType &= E_TSP_FLT_FIFO_MASK;
1269*53ee8cc1Swenshuai.xi 
1270*53ee8cc1Swenshuai.xi     TSP_DST_SEQ eDst = _TSP_DrvHal_FltType2DstMapping(eFltType);
1271*53ee8cc1Swenshuai.xi 
1272*53ee8cc1Swenshuai.xi     *pu32Level = HAL_TSP_FIFO_GetStatus(eDst);
1273*53ee8cc1Swenshuai.xi     if (*pu32Level == HAL_TSP_RET_NULL)
1274*53ee8cc1Swenshuai.xi     {
1275*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL);
1276*53ee8cc1Swenshuai.xi     }
1277*53ee8cc1Swenshuai.xi 
1278*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
1279*53ee8cc1Swenshuai.xi }
1280*53ee8cc1Swenshuai.xi 
MDrv_TSP_FIFO_Overflow_Status(TSP_FltType eFltType,MS_BOOL * pbOverflow)1281*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FIFO_Overflow_Status(TSP_FltType eFltType, MS_BOOL *pbOverflow)
1282*53ee8cc1Swenshuai.xi {
1283*53ee8cc1Swenshuai.xi     *pbOverflow = FALSE;
1284*53ee8cc1Swenshuai.xi 
1285*53ee8cc1Swenshuai.xi     TSP_ENTRY();
1286*53ee8cc1Swenshuai.xi     *pbOverflow = HAL_TSP_FIFO_Overflow(eFltType);
1287*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
1288*53ee8cc1Swenshuai.xi }
1289*53ee8cc1Swenshuai.xi 
MDrv_TSP_AU_BD_Mode_Enable(MS_BOOL bEnable)1290*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_AU_BD_Mode_Enable(MS_BOOL bEnable)
1291*53ee8cc1Swenshuai.xi {
1292*53ee8cc1Swenshuai.xi     TSP_ENTRY();
1293*53ee8cc1Swenshuai.xi 
1294*53ee8cc1Swenshuai.xi     HAL_TSP_BD_AUD_En(0, bEnable);
1295*53ee8cc1Swenshuai.xi 
1296*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
1297*53ee8cc1Swenshuai.xi }
1298*53ee8cc1Swenshuai.xi 
_TSP_Path_Alloc(DRV_TSP_PATH_TYPE eResType,MS_U32 * pu32PathId)1299*53ee8cc1Swenshuai.xi static TSP_Result _TSP_Path_Alloc(DRV_TSP_PATH_TYPE eResType, MS_U32 *pu32PathId)
1300*53ee8cc1Swenshuai.xi {
1301*53ee8cc1Swenshuai.xi     if( (eResType == E_DRV_TSP_PATH_LIVE) || (eResType == E_DRV_TSP_PATH_FILE) )
1302*53ee8cc1Swenshuai.xi     {
1303*53ee8cc1Swenshuai.xi         TSP_TSIF    eTSIF = E_TSP_TSIF_INVALID;
1304*53ee8cc1Swenshuai.xi         MS_U32      u32PhyTspPath = 0;
1305*53ee8cc1Swenshuai.xi 
1306*53ee8cc1Swenshuai.xi         *pu32PathId = (MS_U32)-1;
1307*53ee8cc1Swenshuai.xi         for(eTSIF = E_TSP_TSIF_0; eTSIF < TSP_TSIF_NUM; eTSIF++)
1308*53ee8cc1Swenshuai.xi         {
1309*53ee8cc1Swenshuai.xi             //@Note: Currently, TSP_TSIF for live-in & TSP HW path are 1-1 mapping, and
1310*53ee8cc1Swenshuai.xi             //       TSP_TSIF for file-in & TSP HW path are also 1-1 mapping
1311*53ee8cc1Swenshuai.xi             TSP_HAL_TSIF eHalTSIF = _TSP_DrvHal_TSIFMapping(eTSIF);
1312*53ee8cc1Swenshuai.xi             u32PhyTspPath = HAL_TSP_TsifMapping(eHalTSIF, (eResType == E_DRV_TSP_PATH_FILE));
1313*53ee8cc1Swenshuai.xi 
1314*53ee8cc1Swenshuai.xi             if(_ptsp_res->_stTspPathState[u32PhyTspPath].bUsed == FALSE)
1315*53ee8cc1Swenshuai.xi             {
1316*53ee8cc1Swenshuai.xi                 _ptsp_res->_stTspPathState[u32PhyTspPath].bUsed = TRUE;
1317*53ee8cc1Swenshuai.xi                 *pu32PathId = (MS_U32) eTSIF;
1318*53ee8cc1Swenshuai.xi                 return E_TSP_OK;
1319*53ee8cc1Swenshuai.xi             }
1320*53ee8cc1Swenshuai.xi         }
1321*53ee8cc1Swenshuai.xi     }
1322*53ee8cc1Swenshuai.xi 
1323*53ee8cc1Swenshuai.xi     return E_TSP_FAIL;
1324*53ee8cc1Swenshuai.xi }
1325*53ee8cc1Swenshuai.xi 
_TSP_Path_Free(DRV_TSP_PATH_TYPE eResType,TSP_TSIF ePath)1326*53ee8cc1Swenshuai.xi static TSP_Result _TSP_Path_Free(DRV_TSP_PATH_TYPE eResType, TSP_TSIF ePath)
1327*53ee8cc1Swenshuai.xi {
1328*53ee8cc1Swenshuai.xi     if( (eResType == E_DRV_TSP_PATH_LIVE) || (eResType == E_DRV_TSP_PATH_FILE) )
1329*53ee8cc1Swenshuai.xi     {
1330*53ee8cc1Swenshuai.xi         MS_U32      u32PhyTspPath = 0;
1331*53ee8cc1Swenshuai.xi 
1332*53ee8cc1Swenshuai.xi         TSP_HAL_TSIF eHalTSIF = _TSP_DrvHal_TSIFMapping(ePath);
1333*53ee8cc1Swenshuai.xi         u32PhyTspPath = HAL_TSP_TsifMapping(eHalTSIF, (eResType == E_DRV_TSP_PATH_FILE));
1334*53ee8cc1Swenshuai.xi 
1335*53ee8cc1Swenshuai.xi         if(_ptsp_res->_stTspPathState[u32PhyTspPath].bUsed == FALSE)
1336*53ee8cc1Swenshuai.xi             return E_TSP_FAIL;
1337*53ee8cc1Swenshuai.xi 
1338*53ee8cc1Swenshuai.xi         _ptsp_res->_stTspPathState[u32PhyTspPath].bUsed = FALSE;
1339*53ee8cc1Swenshuai.xi         return E_TSP_OK;
1340*53ee8cc1Swenshuai.xi     }
1341*53ee8cc1Swenshuai.xi 
1342*53ee8cc1Swenshuai.xi     return E_TSP_FAIL;
1343*53ee8cc1Swenshuai.xi }
1344*53ee8cc1Swenshuai.xi 
_TSP_STC_Alloc(MS_U32 * pu32EngId)1345*53ee8cc1Swenshuai.xi static TSP_Result _TSP_STC_Alloc(MS_U32 *pu32EngId)
1346*53ee8cc1Swenshuai.xi {
1347*53ee8cc1Swenshuai.xi     MS_U32 i;
1348*53ee8cc1Swenshuai.xi     *pu32EngId = 0xFFFFFFFF;
1349*53ee8cc1Swenshuai.xi 
1350*53ee8cc1Swenshuai.xi     for(i = 0; i < STC_ENG_NUM; i++)
1351*53ee8cc1Swenshuai.xi     {
1352*53ee8cc1Swenshuai.xi         if(_ptsp_res->_stTspStcState[i].bUsed == FALSE)
1353*53ee8cc1Swenshuai.xi         {
1354*53ee8cc1Swenshuai.xi             _ptsp_res->_stTspStcState[i].bUsed = TRUE;
1355*53ee8cc1Swenshuai.xi             *pu32EngId = i;
1356*53ee8cc1Swenshuai.xi             break;
1357*53ee8cc1Swenshuai.xi         }
1358*53ee8cc1Swenshuai.xi     }
1359*53ee8cc1Swenshuai.xi 
1360*53ee8cc1Swenshuai.xi     if(*pu32EngId == 0xFFFFFFFF)
1361*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
1362*53ee8cc1Swenshuai.xi 
1363*53ee8cc1Swenshuai.xi     return E_TSP_OK;
1364*53ee8cc1Swenshuai.xi }
1365*53ee8cc1Swenshuai.xi 
_TSP_STC_Free(MS_U32 u32EngId)1366*53ee8cc1Swenshuai.xi static TSP_Result _TSP_STC_Free(MS_U32 u32EngId)
1367*53ee8cc1Swenshuai.xi {
1368*53ee8cc1Swenshuai.xi     if(_ptsp_res->_stTspStcState[u32EngId].bUsed == FALSE)
1369*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
1370*53ee8cc1Swenshuai.xi 
1371*53ee8cc1Swenshuai.xi     _ptsp_res->_stTspStcState[u32EngId].bUsed = FALSE;
1372*53ee8cc1Swenshuai.xi     _ptsp_res->_stTspStcState[u32EngId].u32PcrFltId = 0xFFFFFFFF;
1373*53ee8cc1Swenshuai.xi 
1374*53ee8cc1Swenshuai.xi     return E_TSP_OK;
1375*53ee8cc1Swenshuai.xi }
1376*53ee8cc1Swenshuai.xi 
_TSP_STC_SetPcrFlt(MS_U32 u32EngId,MS_U32 u32PcrFltId)1377*53ee8cc1Swenshuai.xi static TSP_Result _TSP_STC_SetPcrFlt(MS_U32 u32EngId, MS_U32 u32PcrFltId)
1378*53ee8cc1Swenshuai.xi {
1379*53ee8cc1Swenshuai.xi     _ptsp_res->_stTspStcState[u32EngId].u32PcrFltId = u32PcrFltId;
1380*53ee8cc1Swenshuai.xi 
1381*53ee8cc1Swenshuai.xi     return E_TSP_OK;
1382*53ee8cc1Swenshuai.xi }
1383*53ee8cc1Swenshuai.xi 
_TSP_PcrId_To_StcId(MS_U32 u32PcrFltId,MS_U32 * pu32EngId)1384*53ee8cc1Swenshuai.xi static TSP_Result _TSP_PcrId_To_StcId(MS_U32 u32PcrFltId,MS_U32 *pu32EngId)
1385*53ee8cc1Swenshuai.xi {
1386*53ee8cc1Swenshuai.xi     MS_U32 i;
1387*53ee8cc1Swenshuai.xi 
1388*53ee8cc1Swenshuai.xi     *pu32EngId = 0xFFFFFFFF;
1389*53ee8cc1Swenshuai.xi 
1390*53ee8cc1Swenshuai.xi     for(i = 0; i < STC_ENG_NUM; i++)
1391*53ee8cc1Swenshuai.xi     {
1392*53ee8cc1Swenshuai.xi         if((_ptsp_res->_stTspStcState[i].u32PcrFltId == u32PcrFltId)
1393*53ee8cc1Swenshuai.xi             && (_ptsp_res->_stTspStcState[i].bUsed == TRUE))
1394*53ee8cc1Swenshuai.xi         {
1395*53ee8cc1Swenshuai.xi             *pu32EngId = i;
1396*53ee8cc1Swenshuai.xi             return E_TSP_OK;
1397*53ee8cc1Swenshuai.xi         }
1398*53ee8cc1Swenshuai.xi     }
1399*53ee8cc1Swenshuai.xi 
1400*53ee8cc1Swenshuai.xi     return E_TSP_FAIL;
1401*53ee8cc1Swenshuai.xi }
1402*53ee8cc1Swenshuai.xi 
1403*53ee8cc1Swenshuai.xi // initilize or reset the FLT to be initial state
1404*53ee8cc1Swenshuai.xi // PID and ctrls are clear
_TSP_FLT_Init(MS_U32 u32FltId)1405*53ee8cc1Swenshuai.xi static void _TSP_FLT_Init(MS_U32 u32FltId)
1406*53ee8cc1Swenshuai.xi {
1407*53ee8cc1Swenshuai.xi     static MS_U8        u8Mask[TSP_FILTER_DEPTH]  = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1408*53ee8cc1Swenshuai.xi                                                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
1409*53ee8cc1Swenshuai.xi     static MS_U8        u8NMask[TSP_FILTER_DEPTH] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1410*53ee8cc1Swenshuai.xi                                                       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
1411*53ee8cc1Swenshuai.xi #if HW_PCRFLT_ENABLE
1412*53ee8cc1Swenshuai.xi 
1413*53ee8cc1Swenshuai.xi     if ((_ptsp_res->_tspInfo.FltType[u32FltId]& E_TSP_FLT_USER_MASK)== E_TSP_FLT_USER_PCR)
1414*53ee8cc1Swenshuai.xi     {
1415*53ee8cc1Swenshuai.xi         MS_U32  Pcr_H, Pcr;
1416*53ee8cc1Swenshuai.xi         MS_U32  u32PcrId;
1417*53ee8cc1Swenshuai.xi 
1418*53ee8cc1Swenshuai.xi         if ((u32FltId >= TSP_PCRFLT_GET_ID(0)) && (u32FltId <= HAL_TSP_PCRFLT_GET_ID(TSP_PCRFLT_NUM - 1)))
1419*53ee8cc1Swenshuai.xi         {
1420*53ee8cc1Swenshuai.xi             u32PcrId = u32FltId - _tspFltIdMap.u32PcrFltId_Start;
1421*53ee8cc1Swenshuai.xi 
1422*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_SetPid(u32PcrId, TSP_PID_NULL);
1423*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_SetSrc(u32PcrId, E_TSP_PCR_SRC_INVALID);
1424*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
1425*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_SetSrcId(u32PcrId, (E_TSP_FLT_SRCID_0 & E_TSP_FLT_SRCID_MASK) >> E_TSP_FLT_SRCID_SHIFT);
1426*53ee8cc1Swenshuai.xi #endif // end MERGE_STR_SUPPORT
1427*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_Enable(u32PcrId, FALSE);
1428*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_ClearInt(u32PcrId);
1429*53ee8cc1Swenshuai.xi             HAL_TSP_INT_Disable(HAL_TSP_PcrFlt_GetIntMask(u32PcrId));
1430*53ee8cc1Swenshuai.xi 
1431*53ee8cc1Swenshuai.xi             //always read PCR after PCR interrupt has been disabled or cleared to avoid that interrupt's not trggering again.
1432*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_GetPcr(u32PcrId, &Pcr_H, &Pcr);
1433*53ee8cc1Swenshuai.xi         }
1434*53ee8cc1Swenshuai.xi         else
1435*53ee8cc1Swenshuai.xi         {
1436*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST,"[%s][%d] Incorrect PCR filter ID !!\n",__FUNCTION__,__LINE__);
1437*53ee8cc1Swenshuai.xi             return;
1438*53ee8cc1Swenshuai.xi         }
1439*53ee8cc1Swenshuai.xi     }
1440*53ee8cc1Swenshuai.xi     else
1441*53ee8cc1Swenshuai.xi 
1442*53ee8cc1Swenshuai.xi #endif
1443*53ee8cc1Swenshuai.xi     {
1444*53ee8cc1Swenshuai.xi         HAL_TSP_PidFlt_SetPid(u32FltId, TSP_PID_NULL);
1445*53ee8cc1Swenshuai.xi         HAL_TSP_PidFlt_SetFltIn(u32FltId, TSP_PIDFLT_TSIF_MAX);                                         // default MAX
1446*53ee8cc1Swenshuai.xi         HAL_TSP_PidFlt_SetFltOut(u32FltId, TSP_PIDFLT_OUT_NONE);
1447*53ee8cc1Swenshuai.xi         HAL_TSP_PidFlt_SetSecFlt(u32FltId, u32FltId);                                                   // PIDFLT <-> SECFLT
1448*53ee8cc1Swenshuai.xi 
1449*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.Flt2Buf[u32FltId]     = TSP_FLT2BUF_NULL;
1450*53ee8cc1Swenshuai.xi     }
1451*53ee8cc1Swenshuai.xi 
1452*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.Pid[u32FltId]         = TSP_PID_NULL ;
1453*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.FltState[u32FltId]    = E_TSP_FLT_STATE_FREE;
1454*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.OwnerId[u32FltId]     = E_TSP_ID_NULL;
1455*53ee8cc1Swenshuai.xi 
1456*53ee8cc1Swenshuai.xi     // @NOTE section filters may be less than PID filters
1457*53ee8cc1Swenshuai.xi     if(u32FltId < _tspFltIdMap.u32SecFltId_End)
1458*53ee8cc1Swenshuai.xi     {
1459*53ee8cc1Swenshuai.xi         REG_SecFlt *        pSecFlt =     &(_REGSec->Flt[u32FltId]);
1460*53ee8cc1Swenshuai.xi 
1461*53ee8cc1Swenshuai.xi         HAL_TSP_SecFlt_ClrCtrl(pSecFlt);
1462*53ee8cc1Swenshuai.xi         HAL_TSP_SecFlt_SelSecBuf(pSecFlt, TSP_SECFLT_SECBUF_MAX);                                       // default MAX
1463*53ee8cc1Swenshuai.xi         HAL_TSP_SecFlt_SetMask(pSecFlt, u8Mask);
1464*53ee8cc1Swenshuai.xi         HAL_TSP_SecFlt_SetNMask(pSecFlt, u8NMask);
1465*53ee8cc1Swenshuai.xi         HAL_TSP_SecFlt_SetType(pSecFlt, TSP_SECFLT_USER_NULL);                                          // default SECTION
1466*53ee8cc1Swenshuai.xi 
1467*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.FltMode[u32FltId]     = E_TSP_FLT_MODE_CONTI;
1468*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.FltEvent[u32FltId]    = E_TSP_EVENT_DATA_IDLE;
1469*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.FltCallback[u32FltId] = NULL;
1470*53ee8cc1Swenshuai.xi     }
1471*53ee8cc1Swenshuai.xi 
1472*53ee8cc1Swenshuai.xi }
1473*53ee8cc1Swenshuai.xi 
_TSP_FLT_Free(MS_U32 u32FltId)1474*53ee8cc1Swenshuai.xi static void _TSP_FLT_Free(MS_U32 u32FltId)
1475*53ee8cc1Swenshuai.xi {
1476*53ee8cc1Swenshuai.xi     if (_tspFltIdMap.u32SecFltId_End > u32FltId)
1477*53ee8cc1Swenshuai.xi     {
1478*53ee8cc1Swenshuai.xi         HAL_TSP_SecFlt_Free(&(_REGSec->Flt[u32FltId]));
1479*53ee8cc1Swenshuai.xi         TSP_FLAG_ClrModeFlags(u32FltId);
1480*53ee8cc1Swenshuai.xi     }
1481*53ee8cc1Swenshuai.xi 
1482*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.OwnerId[u32FltId]  = E_TSP_ID_NULL;
1483*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.FltState[u32FltId] = E_TSP_FLT_STATE_FREE;
1484*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.FltType[u32FltId] = E_TSP_FLT_USER_NULL;
1485*53ee8cc1Swenshuai.xi 
1486*53ee8cc1Swenshuai.xi }
1487*53ee8cc1Swenshuai.xi 
1488*53ee8cc1Swenshuai.xi // Disable FLT output (SEC, AUD, VID)
1489*53ee8cc1Swenshuai.xi // NOTE: other bypass route to ECM/EMM/REC/etc. is not disable.
_TSP_FLT_Disable(MS_U32 u32FltId)1490*53ee8cc1Swenshuai.xi static void _TSP_FLT_Disable(MS_U32 u32FltId)
1491*53ee8cc1Swenshuai.xi {
1492*53ee8cc1Swenshuai.xi #if 1
1493*53ee8cc1Swenshuai.xi 
1494*53ee8cc1Swenshuai.xi     #if HW_PCRFLT_ENABLE
1495*53ee8cc1Swenshuai.xi 
1496*53ee8cc1Swenshuai.xi     if ((_ptsp_res->_tspInfo.FltType[u32FltId]& E_TSP_FLT_USER_MASK)== E_TSP_FLT_USER_PCR)
1497*53ee8cc1Swenshuai.xi     {
1498*53ee8cc1Swenshuai.xi         MS_U32  Pcr_H, Pcr;
1499*53ee8cc1Swenshuai.xi         MS_U32  u32PcrId;
1500*53ee8cc1Swenshuai.xi 
1501*53ee8cc1Swenshuai.xi         if ((u32FltId >= TSP_PCRFLT_GET_ID(0)) && (u32FltId <= HAL_TSP_PCRFLT_GET_ID(TSP_PCRFLT_NUM - 1)))
1502*53ee8cc1Swenshuai.xi         {
1503*53ee8cc1Swenshuai.xi             u32PcrId = u32FltId - _tspFltIdMap.u32PcrFltId_Start;
1504*53ee8cc1Swenshuai.xi 
1505*53ee8cc1Swenshuai.xi             //HAL_TSP_PcrFlt_SetSrc(u32PcrId, E_TSP_PCR_SRC_INVALID);
1506*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_Enable(u32PcrId, FALSE);
1507*53ee8cc1Swenshuai.xi 
1508*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_ClearInt(u32PcrId);
1509*53ee8cc1Swenshuai.xi             HAL_TSP_INT_Disable(HAL_TSP_PcrFlt_GetIntMask(u32PcrId));
1510*53ee8cc1Swenshuai.xi 
1511*53ee8cc1Swenshuai.xi             //always read PCR after PCR interrupt has been disabled or cleared to avoid that interrupt's not trggering again.
1512*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_GetPcr(u32PcrId, &Pcr_H, &Pcr);
1513*53ee8cc1Swenshuai.xi         }
1514*53ee8cc1Swenshuai.xi         else
1515*53ee8cc1Swenshuai.xi         {
1516*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST,"[%s][%d] Incorrect PCR filter ID !!\n",__FUNCTION__,__LINE__);
1517*53ee8cc1Swenshuai.xi             return;
1518*53ee8cc1Swenshuai.xi         }
1519*53ee8cc1Swenshuai.xi     }
1520*53ee8cc1Swenshuai.xi     else
1521*53ee8cc1Swenshuai.xi 
1522*53ee8cc1Swenshuai.xi     #endif
1523*53ee8cc1Swenshuai.xi     {
1524*53ee8cc1Swenshuai.xi         HAL_TSP_PidFlt_SetFltOut(u32FltId, TSP_PIDFLT_OUT_NONE);  //@FIXME do we have to clear pvr and section out at this function?
1525*53ee8cc1Swenshuai.xi     }
1526*53ee8cc1Swenshuai.xi 
1527*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.FltState[u32FltId] &= (TSP_FltState)(~E_TSP_FLT_STATE_ENABLE);
1528*53ee8cc1Swenshuai.xi 
1529*53ee8cc1Swenshuai.xi #else
1530*53ee8cc1Swenshuai.xi     HAL_TSP_PidFlt_SetFltOut(&(_REGPid->Flt[u32FltId]), TSP_PIDFLT_OUT_NULL);
1531*53ee8cc1Swenshuai.xi     if ((_ptsp_res->_tspInfo.FltType[u32FltId]& E_TSP_FLT_USER_MASK)== E_TSP_FLT_USER_PCR)
1532*53ee8cc1Swenshuai.xi     {
1533*53ee8cc1Swenshuai.xi         HAL_TSP_SecFlt_PcrReset(&(_REGSec->Flt[u32FltId]));
1534*53ee8cc1Swenshuai.xi         HAL_TSP_PCRFlt_SetPid(0x1FFF,false);
1535*53ee8cc1Swenshuai.xi         HAL_TSP_PCRFlt_ClearInt();
1536*53ee8cc1Swenshuai.xi         HAL_TSP_INT_Disable(TSP_HWINT2_PCR_UPD << 8 );
1537*53ee8cc1Swenshuai.xi     }
1538*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.FltState[u32FltId] &= (TSP_FltState)(~E_TSP_FLT_STATE_ENABLE);
1539*53ee8cc1Swenshuai.xi #endif
1540*53ee8cc1Swenshuai.xi 
1541*53ee8cc1Swenshuai.xi 
1542*53ee8cc1Swenshuai.xi /*
1543*53ee8cc1Swenshuai.xi //[Note] Delay for VQ flush, open it if necessary.
1544*53ee8cc1Swenshuai.xi #if defined (MSOS_TYPE_LINUX_KERNEL)
1545*53ee8cc1Swenshuai.xi     mdelay(5);
1546*53ee8cc1Swenshuai.xi #elif defined (MSOS_TYPE_ECOS) || defined(MSOS_TYPE_UCOS)
1547*53ee8cc1Swenshuai.xi #else
1548*53ee8cc1Swenshuai.xi     MsOS_DelayTask(5);
1549*53ee8cc1Swenshuai.xi #endif
1550*53ee8cc1Swenshuai.xi */
1551*53ee8cc1Swenshuai.xi 
1552*53ee8cc1Swenshuai.xi }
1553*53ee8cc1Swenshuai.xi 
1554*53ee8cc1Swenshuai.xi 
_TSP_SEC_Init(MS_U32 u32BufId)1555*53ee8cc1Swenshuai.xi static void _TSP_SEC_Init(MS_U32 u32BufId)
1556*53ee8cc1Swenshuai.xi {
1557*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.MulFlt2Buf[u32BufId] = 0 ;        // Multi Filter to buffer count.
1558*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.Buf2Flt[u32BufId] = TSP_BUF2FLT_NULL;
1559*53ee8cc1Swenshuai.xi     HAL_TSP_SecBuf_SetBuf(&(_REGBuf->Buf[u32BufId]), 0, 0);
1560*53ee8cc1Swenshuai.xi     HAL_TSP_SecBuf_Reset(&(_REGBuf->Buf[u32BufId]));
1561*53ee8cc1Swenshuai.xi }
1562*53ee8cc1Swenshuai.xi 
1563*53ee8cc1Swenshuai.xi 
_TSP_SEC_Free(MS_U32 u32BufId)1564*53ee8cc1Swenshuai.xi static void _TSP_SEC_Free(MS_U32 u32BufId)
1565*53ee8cc1Swenshuai.xi {
1566*53ee8cc1Swenshuai.xi     HAL_TSP_SecBuf_Free(&(_REGBuf->Buf[u32BufId]));
1567*53ee8cc1Swenshuai.xi     _TSP_RemoveSecNotifyId(u32BufId);
1568*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.BufState[u32BufId] = E_TSP_FLT_STATE_FREE;
1569*53ee8cc1Swenshuai.xi }
1570*53ee8cc1Swenshuai.xi 
_TSP_PROC_CrcErr(MS_U32 u32FltId,TSP_Event * pEvent)1571*53ee8cc1Swenshuai.xi static TSP_Result _TSP_PROC_CrcErr(MS_U32 u32FltId, TSP_Event *pEvent)
1572*53ee8cc1Swenshuai.xi {
1573*53ee8cc1Swenshuai.xi     static TSP_EventMsg msg;
1574*53ee8cc1Swenshuai.xi     MS_U32              flags; // dummy
1575*53ee8cc1Swenshuai.xi 
1576*53ee8cc1Swenshuai.xi     TSP_FLAG_GetCrcErr(u32FltId, &flags, TSP_OS_EVENT_OR_CLEAR); // if TSP not enable
1577*53ee8cc1Swenshuai.xi 
1578*53ee8cc1Swenshuai.xi         if (pEvent)
1579*53ee8cc1Swenshuai.xi         {
1580*53ee8cc1Swenshuai.xi             if ((_ptsp_res->_tspInfo.FltMode[u32FltId] & E_TSP_FLT_MODE_CRCCHK) ||
1581*53ee8cc1Swenshuai.xi                 (_ptsp_res->_tspInfo.FltMode[u32FltId] & E_TSP_FLT_MODE_AUTO_CRCCHK))
1582*53ee8cc1Swenshuai.xi             {
1583*53ee8cc1Swenshuai.xi                 *pEvent = (TSP_Event) E_TSP_EVENT_SEC_CRCERROR;
1584*53ee8cc1Swenshuai.xi             }
1585*53ee8cc1Swenshuai.xi         }
1586*53ee8cc1Swenshuai.xi         else
1587*53ee8cc1Swenshuai.xi         {
1588*53ee8cc1Swenshuai.xi             if (!(_ptsp_res->_tspInfo.FltState[u32FltId] & E_TSP_FLT_STATE_ENABLE)) // if TSP not enable
1589*53ee8cc1Swenshuai.xi             {
1590*53ee8cc1Swenshuai.xi                 return E_TSP_FAIL;
1591*53ee8cc1Swenshuai.xi             }
1592*53ee8cc1Swenshuai.xi             if ((_ptsp_res->_tspInfo.FltEvent[u32FltId] & E_TSP_EVENT_SEC_CRCERROR) &&
1593*53ee8cc1Swenshuai.xi                 (_ptsp_res->_tspInfo.FltCallback[u32FltId]) )
1594*53ee8cc1Swenshuai.xi             {
1595*53ee8cc1Swenshuai.xi                 msg.FltInfo = (_ptsp_res->_tspInfo.OwnerId[u32FltId] << TSP_MSG_ENGID_SHFT) | (u32FltId << TSP_MSG_FLTID_SHFT);
1596*53ee8cc1Swenshuai.xi                 TSP_DBG_TASK();
1597*53ee8cc1Swenshuai.xi                 _ptsp_res->_tspInfo.FltCallback[u32FltId](E_TSP_EVENT_SEC_CRCERROR, &msg);
1598*53ee8cc1Swenshuai.xi                 TSP_DBG_TASK();
1599*53ee8cc1Swenshuai.xi             }
1600*53ee8cc1Swenshuai.xi         }
1601*53ee8cc1Swenshuai.xi 
1602*53ee8cc1Swenshuai.xi     return E_TSP_OK;
1603*53ee8cc1Swenshuai.xi }
1604*53ee8cc1Swenshuai.xi 
1605*53ee8cc1Swenshuai.xi 
1606*53ee8cc1Swenshuai.xi 
1607*53ee8cc1Swenshuai.xi 
_TSP_PROC_SecOvf(MS_U32 u32FltId,TSP_Event * pEvent)1608*53ee8cc1Swenshuai.xi static TSP_Result _TSP_PROC_SecOvf(MS_U32 u32FltId, TSP_Event *pEvent)
1609*53ee8cc1Swenshuai.xi {
1610*53ee8cc1Swenshuai.xi     static TSP_EventMsg msg;
1611*53ee8cc1Swenshuai.xi     MS_U32              flags; // dummy
1612*53ee8cc1Swenshuai.xi 
1613*53ee8cc1Swenshuai.xi     //(POLL) Check any possible filter should be disabled
1614*53ee8cc1Swenshuai.xi     //(TASK) Check only overflowed filter and to disable
1615*53ee8cc1Swenshuai.xi     TSP_LOCK(); //{
1616*53ee8cc1Swenshuai.xi     if (HAL_TSP_PidFlt_GetFltOutput(&(_REGPid1->Flt[u32FltId])) & TSP_PIDFLT_OUT_SECFLT)
1617*53ee8cc1Swenshuai.xi     {
1618*53ee8cc1Swenshuai.xi         _TSP_FLT_Disable(u32FltId);
1619*53ee8cc1Swenshuai.xi     }
1620*53ee8cc1Swenshuai.xi     TSP_FLAG_SetOvfRst(u32FltId);
1621*53ee8cc1Swenshuai.xi     TSP_UNLOCK(); //}
1622*53ee8cc1Swenshuai.xi 
1623*53ee8cc1Swenshuai.xi     TSP_FLAG_GetFltDis(u32FltId, &flags, TSP_OS_EVENT_OR_CLEAR);
1624*53ee8cc1Swenshuai.xi     //[Eddie]Clear Event at Filter Enable , Try to avoid redundant Overflow event.
1625*53ee8cc1Swenshuai.xi     //       Driver will not call overflow call back until previous overflow have been serverd(Reset Buffer)
1626*53ee8cc1Swenshuai.xi     //TSP_FLAG_GetSecOvf(u32FltId, &flags, TSP_OS_EVENT_OR_CLEAR);
1627*53ee8cc1Swenshuai.xi 
1628*53ee8cc1Swenshuai.xi 
1629*53ee8cc1Swenshuai.xi     if (pEvent ) // MDrv_TSP_Proc -> _TSP_Poll_Proc
1630*53ee8cc1Swenshuai.xi     {
1631*53ee8cc1Swenshuai.xi         *pEvent = (MS_U32)E_TSP_EVENT_BUF_OVERFLOW;
1632*53ee8cc1Swenshuai.xi     }
1633*53ee8cc1Swenshuai.xi     else
1634*53ee8cc1Swenshuai.xi     {
1635*53ee8cc1Swenshuai.xi         // required event callback
1636*53ee8cc1Swenshuai.xi         if ( (_ptsp_res->_tspInfo.FltEvent[u32FltId] & E_TSP_EVENT_BUF_OVERFLOW) &&
1637*53ee8cc1Swenshuai.xi              (_ptsp_res->_tspInfo.FltCallback[u32FltId]) )
1638*53ee8cc1Swenshuai.xi         {
1639*53ee8cc1Swenshuai.xi             msg.FltInfo = (_ptsp_res->_tspInfo.OwnerId[u32FltId] << TSP_MSG_ENGID_SHFT) | (u32FltId << TSP_MSG_FLTID_SHFT);
1640*53ee8cc1Swenshuai.xi 
1641*53ee8cc1Swenshuai.xi             TSP_DBG_TASK();
1642*53ee8cc1Swenshuai.xi             _ptsp_res->_tspInfo.FltCallback[u32FltId](E_TSP_EVENT_BUF_OVERFLOW, &msg);
1643*53ee8cc1Swenshuai.xi             TSP_DBG_TASK();
1644*53ee8cc1Swenshuai.xi         }
1645*53ee8cc1Swenshuai.xi     }
1646*53ee8cc1Swenshuai.xi 
1647*53ee8cc1Swenshuai.xi     return E_TSP_OK;
1648*53ee8cc1Swenshuai.xi }
1649*53ee8cc1Swenshuai.xi 
1650*53ee8cc1Swenshuai.xi 
MDrv_TSP_SEC_Update(MS_U32 u32SecFltId)1651*53ee8cc1Swenshuai.xi void MDrv_TSP_SEC_Update( MS_U32 u32SecFltId)
1652*53ee8cc1Swenshuai.xi {
1653*53ee8cc1Swenshuai.xi     TSP_FLAG_SetSecRdy(u32SecFltId);
1654*53ee8cc1Swenshuai.xi }
1655*53ee8cc1Swenshuai.xi 
1656*53ee8cc1Swenshuai.xi 
_TSP_PROC_SecRdy(MS_U32 u32FltId,TSP_Event * pEvent)1657*53ee8cc1Swenshuai.xi static TSP_Result _TSP_PROC_SecRdy(MS_U32 u32FltId, TSP_Event *pEvent)
1658*53ee8cc1Swenshuai.xi {
1659*53ee8cc1Swenshuai.xi     static TSP_EventMsg msg;
1660*53ee8cc1Swenshuai.xi 
1661*53ee8cc1Swenshuai.xi     MS_U16              bufid;
1662*53ee8cc1Swenshuai.xi     MS_BOOL             data;
1663*53ee8cc1Swenshuai.xi     MS_U32              flags;
1664*53ee8cc1Swenshuai.xi 
1665*53ee8cc1Swenshuai.xi /*
1666*53ee8cc1Swenshuai.xi     if (E_TSP_EVENT_CB_POLL == u32CbOpt)
1667*53ee8cc1Swenshuai.xi     {
1668*53ee8cc1Swenshuai.xi         TSP_GetEvent(u32Events, TSP_EVENT_SECTION_POLL, TSP_OS_EVENT_OR_CLEAR, 0);
1669*53ee8cc1Swenshuai.xi     }
1670*53ee8cc1Swenshuai.xi     else
1671*53ee8cc1Swenshuai.xi     {
1672*53ee8cc1Swenshuai.xi     }
1673*53ee8cc1Swenshuai.xi */
1674*53ee8cc1Swenshuai.xi 
1675*53ee8cc1Swenshuai.xi     TSP_FLAG_GetSecRdy(u32FltId, &flags, TSP_OS_EVENT_OR_CLEAR); // clear for next incoming
1676*53ee8cc1Swenshuai.xi 
1677*53ee8cc1Swenshuai.xi     TSP_LOCK();
1678*53ee8cc1Swenshuai.xi     bufid = HAL_TSP_SecFlt_GetSecBuf(&(_REGSec->Flt[u32FltId]));
1679*53ee8cc1Swenshuai.xi 
1680*53ee8cc1Swenshuai.xi     #if 1
1681*53ee8cc1Swenshuai.xi     if ((_ptsp_res->_tspInfo.FltState[u32FltId] == E_TSP_FLT_STATE_FREE) || (bufid != _ptsp_res->_tspInfo.Flt2Buf[u32FltId]))
1682*53ee8cc1Swenshuai.xi     {
1683*53ee8cc1Swenshuai.xi         for(flags = 0 ; flags < 10 ; flags ++)
1684*53ee8cc1Swenshuai.xi         TSP_OS_Print("[TSP Error][%04d] u32FltId:%u eFltType:%08X Pid:%08X, FltStatus = %08X ,Mode = %08X , Event =%08X , AllMode= %08X ,Pevent = %08X,HwBufId %d != tspInfo Bufid %d\n",
1685*53ee8cc1Swenshuai.xi                                                           __LINE__,
1686*53ee8cc1Swenshuai.xi                                                           (unsigned int)u32FltId,
1687*53ee8cc1Swenshuai.xi                                                           (unsigned int)(_ptsp_res->_tspInfo.FltType[u32FltId]),
1688*53ee8cc1Swenshuai.xi                                                           (unsigned int)_ptsp_res->_tspInfo.Pid[u32FltId],
1689*53ee8cc1Swenshuai.xi                                                           (unsigned int)(_ptsp_res->_tspInfo.FltState[u32FltId]),
1690*53ee8cc1Swenshuai.xi                                                           (unsigned int)(_ptsp_res->_tspInfo.FltMode[u32FltId]),
1691*53ee8cc1Swenshuai.xi                                                           (unsigned int)(_ptsp_res->_tspInfo.FltEvent[u32FltId]),
1692*53ee8cc1Swenshuai.xi                                                           (unsigned int)_s32ModeFlags[u32FltId],
1693*53ee8cc1Swenshuai.xi                                                           (unsigned int)*pEvent,
1694*53ee8cc1Swenshuai.xi                                                           bufid,
1695*53ee8cc1Swenshuai.xi                                                           (unsigned int)_ptsp_res->_tspInfo.Flt2Buf[u32FltId]);
1696*53ee8cc1Swenshuai.xi         //while(1);
1697*53ee8cc1Swenshuai.xi         TSP_UNLOCK();
1698*53ee8cc1Swenshuai.xi 
1699*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
1700*53ee8cc1Swenshuai.xi     }
1701*53ee8cc1Swenshuai.xi 
1702*53ee8cc1Swenshuai.xi     #else
1703*53ee8cc1Swenshuai.xi 
1704*53ee8cc1Swenshuai.xi     TSP_CHECK_UNLOCK(bufid == _ptsp_res->_tspInfo.Flt2Buf[u32FltId], "[TSP Error][%04d] u32FltId:%u eFltType:%08X Pid:%08X, FltStatus = %08X ,Mode = %08X , Event =%08X , AllMode= %08lX ,Pevent = %08lX,HwBufId %ld != tspInfo Bufid %ld\n",
1705*53ee8cc1Swenshuai.xi                                                           __LINE__,
1706*53ee8cc1Swenshuai.xi                                                           (unsigned int)u32FltId,
1707*53ee8cc1Swenshuai.xi                                                           (unsigned int)(_ptsp_res->_tspInfo.FltType[u32FltId]),
1708*53ee8cc1Swenshuai.xi                                                           (unsigned int)_ptsp_res->_tspInfo.Pid[u32FltId],
1709*53ee8cc1Swenshuai.xi                                                           (unsigned int)(_ptsp_res->_tspInfo.FltState[u32FltId]),
1710*53ee8cc1Swenshuai.xi                                                           (unsigned int)(_ptsp_res->_tspInfo.FltMode[u32FltId]),
1711*53ee8cc1Swenshuai.xi                                                           (unsigned int)(_ptsp_res->_tspInfo.FltEvent[u32FltId]),
1712*53ee8cc1Swenshuai.xi                                                           (MS_U32)_s32ModeFlags,
1713*53ee8cc1Swenshuai.xi                                                           (MS_U32)pEvent,
1714*53ee8cc1Swenshuai.xi                                                           (MS_U32)bufid,
1715*53ee8cc1Swenshuai.xi                                                           _ptsp_res->_tspInfo.Flt2Buf[u32FltId]);
1716*53ee8cc1Swenshuai.xi     #endif
1717*53ee8cc1Swenshuai.xi 
1718*53ee8cc1Swenshuai.xi     data = (HAL_TSP_SecBuf_GetRead(&(_REGBuf->Buf[bufid])) != HAL_TSP_SecBuf_GetWrite(&(_REGBuf->Buf[bufid]))) ? TRUE : FALSE;
1719*53ee8cc1Swenshuai.xi     TSP_UNLOCK();
1720*53ee8cc1Swenshuai.xi 
1721*53ee8cc1Swenshuai.xi 
1722*53ee8cc1Swenshuai.xi     if (data)
1723*53ee8cc1Swenshuai.xi     {
1724*53ee8cc1Swenshuai.xi         if (pEvent) // POLL mode
1725*53ee8cc1Swenshuai.xi         {
1726*53ee8cc1Swenshuai.xi             *pEvent = (TSP_Event)E_TSP_EVENT_DATA_READY;
1727*53ee8cc1Swenshuai.xi             // if TSP not enable
1728*53ee8cc1Swenshuai.xi             if (TSP_FLAG_GetSecOvf(u32FltId,&flags,TSP_OS_EVENT_OR)||TSP_FLAG_GetCrcErr(u32FltId,&flags,TSP_OS_EVENT_OR))
1729*53ee8cc1Swenshuai.xi             {
1730*53ee8cc1Swenshuai.xi                 return E_TSP_FAIL;
1731*53ee8cc1Swenshuai.xi             }
1732*53ee8cc1Swenshuai.xi         }
1733*53ee8cc1Swenshuai.xi         else
1734*53ee8cc1Swenshuai.xi         {
1735*53ee8cc1Swenshuai.xi             if (!(_ptsp_res->_tspInfo.FltState[u32FltId] & E_TSP_FLT_STATE_ENABLE)) // if TSP not enable
1736*53ee8cc1Swenshuai.xi             {
1737*53ee8cc1Swenshuai.xi                 return E_TSP_FAIL;
1738*53ee8cc1Swenshuai.xi             }
1739*53ee8cc1Swenshuai.xi             if ((_ptsp_res->_tspInfo.FltEvent[u32FltId] & E_TSP_EVENT_DATA_READY) &&
1740*53ee8cc1Swenshuai.xi                 (_ptsp_res->_tspInfo.FltCallback[u32FltId]) )
1741*53ee8cc1Swenshuai.xi             {
1742*53ee8cc1Swenshuai.xi                 msg.FltInfo = (_ptsp_res->_tspInfo.OwnerId[u32FltId] << TSP_MSG_ENGID_SHFT) | (u32FltId << TSP_MSG_FLTID_SHFT);
1743*53ee8cc1Swenshuai.xi 
1744*53ee8cc1Swenshuai.xi                 TSP_DBG_TASK();
1745*53ee8cc1Swenshuai.xi                 _ptsp_res->_tspInfo.FltCallback[u32FltId](E_TSP_EVENT_DATA_READY, &msg);
1746*53ee8cc1Swenshuai.xi                 TSP_DBG_TASK();
1747*53ee8cc1Swenshuai.xi             }
1748*53ee8cc1Swenshuai.xi         }
1749*53ee8cc1Swenshuai.xi     }
1750*53ee8cc1Swenshuai.xi 
1751*53ee8cc1Swenshuai.xi     //(POLL) Check any possible filter should be disabled
1752*53ee8cc1Swenshuai.xi     //(TASK) Check only one-shot filter and to disable
1753*53ee8cc1Swenshuai.xi     if (TSP_FLAG_GetFltDis(u32FltId, &flags, TSP_OS_EVENT_OR_CLEAR))
1754*53ee8cc1Swenshuai.xi     {
1755*53ee8cc1Swenshuai.xi         TSP_LOCK();
1756*53ee8cc1Swenshuai.xi         _TSP_FLT_Disable(u32FltId);
1757*53ee8cc1Swenshuai.xi         TSP_UNLOCK();
1758*53ee8cc1Swenshuai.xi     }
1759*53ee8cc1Swenshuai.xi 
1760*53ee8cc1Swenshuai.xi     if (data)
1761*53ee8cc1Swenshuai.xi     {
1762*53ee8cc1Swenshuai.xi         return E_TSP_OK;
1763*53ee8cc1Swenshuai.xi     }
1764*53ee8cc1Swenshuai.xi     return E_TSP_FAIL; // no data valid || not enable
1765*53ee8cc1Swenshuai.xi }
1766*53ee8cc1Swenshuai.xi 
_TSP_Proc_Pvr(MS_U32 u32Events,MS_U32 u32CbOpt)1767*53ee8cc1Swenshuai.xi static void _TSP_Proc_Pvr(MS_U32 u32Events, MS_U32 u32CbOpt)
1768*53ee8cc1Swenshuai.xi {
1769*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_MUST, "%s Wait implementation\n", __FUNCTION__);
1770*53ee8cc1Swenshuai.xi }
1771*53ee8cc1Swenshuai.xi 
_TSP_ISR_Proc(MS_U32 u32Events)1772*53ee8cc1Swenshuai.xi static void _TSP_ISR_Proc(MS_U32 u32Events)
1773*53ee8cc1Swenshuai.xi {
1774*53ee8cc1Swenshuai.xi     MS_U32              fltid = TSP_SECFLT_NUM, flags = 0,ModeMask,dummy,BaseFlt;
1775*53ee8cc1Swenshuai.xi     int                 i;
1776*53ee8cc1Swenshuai.xi 
1777*53ee8cc1Swenshuai.xi     TSP_DBG_TASK();
1778*53ee8cc1Swenshuai.xi 
1779*53ee8cc1Swenshuai.xi #if __LEGACY__
1780*53ee8cc1Swenshuai.xi     if ( (TSP_EVENT_PVR0_RDY_POLL | TSP_EVENT_PVR1_RDY_POLL) & u32Events)
1781*53ee8cc1Swenshuai.xi     {
1782*53ee8cc1Swenshuai.xi         _TSP_Proc_Pvr(u32Events, E_TSP_EVENT_CB_AUTO);
1783*53ee8cc1Swenshuai.xi     }
1784*53ee8cc1Swenshuai.xi #endif
1785*53ee8cc1Swenshuai.xi 
1786*53ee8cc1Swenshuai.xi 
1787*53ee8cc1Swenshuai.xi     // @NOTE: Jerry
1788*53ee8cc1Swenshuai.xi     //
1789*53ee8cc1Swenshuai.xi     // WATCH OUT!!
1790*53ee8cc1Swenshuai.xi     // It has many issues before due to race condition between TSP_TASK and USER_TASK dealing with FLT_FREE
1791*53ee8cc1Swenshuai.xi     // Please pay more attention on it
1792*53ee8cc1Swenshuai.xi     //
1793*53ee8cc1Swenshuai.xi     // Check all freeing filters
1794*53ee8cc1Swenshuai.xi     if (u32Events & TSP_EVENT_FREEFLT)
1795*53ee8cc1Swenshuai.xi     {
1796*53ee8cc1Swenshuai.xi         for (i = 0; i < ((TSP_SECFLT_NUM+31)>>5); i++)
1797*53ee8cc1Swenshuai.xi         {
1798*53ee8cc1Swenshuai.xi             // Add to FREE list
1799*53ee8cc1Swenshuai.xi             TSP_FLAG_GetModeFlags(i, ModeMask); // get CB mode Filter Mask
1800*53ee8cc1Swenshuai.xi             TSP_FLAG_ModeFree(i, ModeMask,&flags, TSP_OS_EVENT_OR_CLEAR);
1801*53ee8cc1Swenshuai.xi             while (flags)
1802*53ee8cc1Swenshuai.xi             {
1803*53ee8cc1Swenshuai.xi                 BaseFlt = MAsm_CPU_GetTrailOne(flags);
1804*53ee8cc1Swenshuai.xi                 fltid = BaseFlt + (i<<5);
1805*53ee8cc1Swenshuai.xi                 TSP_LOCK();
1806*53ee8cc1Swenshuai.xi                 _TSP_FLT_Disable(fltid); // disable output
1807*53ee8cc1Swenshuai.xi                 TSP_UNLOCK();
1808*53ee8cc1Swenshuai.xi                 flags &= ~(1 << BaseFlt);
1809*53ee8cc1Swenshuai.xi                 TSP_FLAG_SetDone(fltid);
1810*53ee8cc1Swenshuai.xi 
1811*53ee8cc1Swenshuai.xi                 // Clear other filter activities
1812*53ee8cc1Swenshuai.xi                 TSP_FLAG_GetFltDis(fltid, &dummy, TSP_OS_EVENT_OR_CLEAR);
1813*53ee8cc1Swenshuai.xi                 TSP_FLAG_GetSecOvf(fltid, &dummy, TSP_OS_EVENT_OR_CLEAR);
1814*53ee8cc1Swenshuai.xi                 TSP_FLAG_GetSecRdy(fltid, &dummy, TSP_OS_EVENT_OR_CLEAR);
1815*53ee8cc1Swenshuai.xi             }
1816*53ee8cc1Swenshuai.xi         }
1817*53ee8cc1Swenshuai.xi     }
1818*53ee8cc1Swenshuai.xi 
1819*53ee8cc1Swenshuai.xi     MsOS_DelayTask(1);
1820*53ee8cc1Swenshuai.xi     // Check all section avaiable filters
1821*53ee8cc1Swenshuai.xi     if (u32Events & TSP_EVENT_SECTION)
1822*53ee8cc1Swenshuai.xi     {
1823*53ee8cc1Swenshuai.xi         // @TODO Jerry
1824*53ee8cc1Swenshuai.xi         // Is it necessary to balance every filter priority even the event process is at TASK?
1825*53ee8cc1Swenshuai.xi 
1826*53ee8cc1Swenshuai.xi         for (i = 0; i < ((TSP_SECFLT_NUM+31)>>5); i++)
1827*53ee8cc1Swenshuai.xi         {
1828*53ee8cc1Swenshuai.xi             TSP_FLAG_GetModeFlags(i, ModeMask); // get CB mode Filter Mask
1829*53ee8cc1Swenshuai.xi             TSP_FLAG_ModeCrcErr(i, ModeMask,&flags, TSP_OS_EVENT_OR);
1830*53ee8cc1Swenshuai.xi             while (flags)
1831*53ee8cc1Swenshuai.xi             {
1832*53ee8cc1Swenshuai.xi                 //(POLL) Check any possible filter should be disabled
1833*53ee8cc1Swenshuai.xi                 //(TASK) Check only one-shot filter and to disable
1834*53ee8cc1Swenshuai.xi                 BaseFlt = MAsm_CPU_GetTrailOne(flags);
1835*53ee8cc1Swenshuai.xi                 fltid = BaseFlt + (i<<5);
1836*53ee8cc1Swenshuai.xi 
1837*53ee8cc1Swenshuai.xi                 // cause we serve free event before section rdy
1838*53ee8cc1Swenshuai.xi                 if ((_ptsp_res->_tspInfo.FltState[fltid] != E_TSP_FLT_STATE_FREE) && (_ptsp_res->_tspInfo.FltState[fltid] != E_TSP_FLT_STATE_ISR_FREE))
1839*53ee8cc1Swenshuai.xi                 {
1840*53ee8cc1Swenshuai.xi                     _TSP_PROC_CrcErr(fltid, NULL); // Pass events directly to callback
1841*53ee8cc1Swenshuai.xi                 }
1842*53ee8cc1Swenshuai.xi                 flags &= ~(1 << BaseFlt);
1843*53ee8cc1Swenshuai.xi             }
1844*53ee8cc1Swenshuai.xi 
1845*53ee8cc1Swenshuai.xi             TSP_FLAG_ModeSecRdy(i, ModeMask,&flags, TSP_OS_EVENT_OR);
1846*53ee8cc1Swenshuai.xi             while (flags)
1847*53ee8cc1Swenshuai.xi             {
1848*53ee8cc1Swenshuai.xi                 //(POLL) Check any possible filter should be disabled
1849*53ee8cc1Swenshuai.xi                 //(TASK) Check only one-shot filter and to disable
1850*53ee8cc1Swenshuai.xi                 BaseFlt = MAsm_CPU_GetTrailOne(flags);
1851*53ee8cc1Swenshuai.xi                 fltid = BaseFlt + (i<<5);
1852*53ee8cc1Swenshuai.xi 
1853*53ee8cc1Swenshuai.xi                 // cause we serve free event before section rdy
1854*53ee8cc1Swenshuai.xi                 if ((_ptsp_res->_tspInfo.FltState[fltid] != E_TSP_FLT_STATE_FREE) && (_ptsp_res->_tspInfo.FltState[fltid] != E_TSP_FLT_STATE_ISR_FREE))
1855*53ee8cc1Swenshuai.xi                 {
1856*53ee8cc1Swenshuai.xi                     _TSP_PROC_SecRdy(fltid, NULL); // Pass events directly to callback
1857*53ee8cc1Swenshuai.xi                 }
1858*53ee8cc1Swenshuai.xi                 flags &= ~(1 << BaseFlt);
1859*53ee8cc1Swenshuai.xi             }
1860*53ee8cc1Swenshuai.xi             TSP_FLAG_ModeSecOvf(i, ModeMask,&flags, TSP_OS_EVENT_OR);
1861*53ee8cc1Swenshuai.xi             while (flags)
1862*53ee8cc1Swenshuai.xi             {
1863*53ee8cc1Swenshuai.xi                 //(POLL) Check any possible filter should be disabled
1864*53ee8cc1Swenshuai.xi                 //(TASK) Check only overflowed filter and to disable
1865*53ee8cc1Swenshuai.xi                 BaseFlt = MAsm_CPU_GetTrailOne(flags);
1866*53ee8cc1Swenshuai.xi                 fltid = BaseFlt + (i<<5);
1867*53ee8cc1Swenshuai.xi 
1868*53ee8cc1Swenshuai.xi                 //if (_ptsp_res->_tspInfo.FltState[fltid] != E_TSP_FLT_STATE_FREE )
1869*53ee8cc1Swenshuai.xi                 if ((_ptsp_res->_tspInfo.FltState[fltid] != E_TSP_FLT_STATE_FREE) &&
1870*53ee8cc1Swenshuai.xi                     (_ptsp_res->_tspInfo.FltState[fltid] != E_TSP_FLT_STATE_ISR_FREE) &&
1871*53ee8cc1Swenshuai.xi                     (!TSP_FLAG_GetOvfRst(fltid)))
1872*53ee8cc1Swenshuai.xi                 {
1873*53ee8cc1Swenshuai.xi                     //TSP_OS_Print("TSP_FLT_OVFLOW [%ld] , Buf = %ld ,PID = %04lX \n",fltid, _ptsp_res->_tspInfo.Flt2Buf[fltid], _ptsp_res->_tspInfo.Pid[fltid]);
1874*53ee8cc1Swenshuai.xi                     _TSP_PROC_SecOvf(fltid, NULL); // Pass events directly to callback
1875*53ee8cc1Swenshuai.xi                 }
1876*53ee8cc1Swenshuai.xi                 flags &= ~(1 << BaseFlt );
1877*53ee8cc1Swenshuai.xi                 // Clear other filter activities
1878*53ee8cc1Swenshuai.xi                 TSP_FLAG_GetSecRdy(fltid, &dummy, TSP_OS_EVENT_OR_CLEAR); // Clear section ready also
1879*53ee8cc1Swenshuai.xi             }
1880*53ee8cc1Swenshuai.xi             MsOS_DelayTask(1);
1881*53ee8cc1Swenshuai.xi         }
1882*53ee8cc1Swenshuai.xi     }
1883*53ee8cc1Swenshuai.xi 
1884*53ee8cc1Swenshuai.xi 
1885*53ee8cc1Swenshuai.xi     if (u32Events & TSP_EVENT_DISABLEFLT)//Disable Polling mode filter,CB mode filter disable at SecRdy or SecOvf
1886*53ee8cc1Swenshuai.xi     {
1887*53ee8cc1Swenshuai.xi         for (i = 0; i < ((TSP_SECFLT_NUM+31)>>5); i++)
1888*53ee8cc1Swenshuai.xi         {
1889*53ee8cc1Swenshuai.xi             TSP_FLAG_GetModeFlags(i, ModeMask); // get CB mode Filter Mask
1890*53ee8cc1Swenshuai.xi             TSP_FLAG_ModeFltDis(i,~ModeMask, &flags ,TSP_OS_EVENT_OR_CLEAR); // Polling mode
1891*53ee8cc1Swenshuai.xi             while (flags)
1892*53ee8cc1Swenshuai.xi             {
1893*53ee8cc1Swenshuai.xi                 BaseFlt = MAsm_CPU_GetTrailOne(flags);
1894*53ee8cc1Swenshuai.xi                 fltid = BaseFlt + (i<<5);
1895*53ee8cc1Swenshuai.xi                 if (TSP_FLAG_GetFltDis(fltid, &dummy, TSP_OS_EVENT_OR_CLEAR))
1896*53ee8cc1Swenshuai.xi                 {
1897*53ee8cc1Swenshuai.xi                     TSP_LOCK();
1898*53ee8cc1Swenshuai.xi                     _TSP_FLT_Disable(fltid); // disable output
1899*53ee8cc1Swenshuai.xi                     TSP_UNLOCK();
1900*53ee8cc1Swenshuai.xi                 }
1901*53ee8cc1Swenshuai.xi                 flags &= ~(1 << BaseFlt);
1902*53ee8cc1Swenshuai.xi             }
1903*53ee8cc1Swenshuai.xi         }
1904*53ee8cc1Swenshuai.xi    }
1905*53ee8cc1Swenshuai.xi 
1906*53ee8cc1Swenshuai.xi    MsOS_DelayTask(1);
1907*53ee8cc1Swenshuai.xi 
1908*53ee8cc1Swenshuai.xi 
1909*53ee8cc1Swenshuai.xi }
1910*53ee8cc1Swenshuai.xi 
1911*53ee8cc1Swenshuai.xi 
_TSP_ISR_Task(void)1912*53ee8cc1Swenshuai.xi static void _TSP_ISR_Task(void)
1913*53ee8cc1Swenshuai.xi {
1914*53ee8cc1Swenshuai.xi     MS_U32              events = 0;
1915*53ee8cc1Swenshuai.xi 
1916*53ee8cc1Swenshuai.xi     while (_ptsp_res->_tspInfo.bISRTaskEn)
1917*53ee8cc1Swenshuai.xi     {
1918*53ee8cc1Swenshuai.xi         // @NOTE Jerry
1919*53ee8cc1Swenshuai.xi         // Clear task events directly in case there has any incoming event before _TSP_ISR_Proc to clear
1920*53ee8cc1Swenshuai.xi         TSP_GetEvent(_s32EventId, &events, TSP_TASK_EVENTS, TSP_OS_EVENT_OR_CLEAR, MSOS_WAIT_FOREVER);
1921*53ee8cc1Swenshuai.xi 
1922*53ee8cc1Swenshuai.xi         if(events & TSP_EVENT_TASKEND)
1923*53ee8cc1Swenshuai.xi         {
1924*53ee8cc1Swenshuai.xi             break;
1925*53ee8cc1Swenshuai.xi         }
1926*53ee8cc1Swenshuai.xi 
1927*53ee8cc1Swenshuai.xi         _TSP_ISR_Proc(events);
1928*53ee8cc1Swenshuai.xi     }
1929*53ee8cc1Swenshuai.xi 
1930*53ee8cc1Swenshuai.xi     _s32_IsrTaskReturn = TRUE;
1931*53ee8cc1Swenshuai.xi }
1932*53ee8cc1Swenshuai.xi 
1933*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
_TSP_ISR(int irq,void * dev_id)1934*53ee8cc1Swenshuai.xi static irqreturn_t _TSP_ISR(int irq, void *dev_id)
1935*53ee8cc1Swenshuai.xi #else
1936*53ee8cc1Swenshuai.xi static void _TSP_ISR(void)
1937*53ee8cc1Swenshuai.xi #endif
1938*53ee8cc1Swenshuai.xi {
1939*53ee8cc1Swenshuai.xi     MS_U32                 hw_int;
1940*53ee8cc1Swenshuai.xi     MS_U32                 sw_int;
1941*53ee8cc1Swenshuai.xi     MS_U32                 Pcr_H, Pcr, Stc_H = 0, Stc = 0, u32Diff;
1942*53ee8cc1Swenshuai.xi     MS_U32                 i = 0;
1943*53ee8cc1Swenshuai.xi 
1944*53ee8cc1Swenshuai.xi     _TSP_INT_LOCK();
1945*53ee8cc1Swenshuai.xi     hw_int = HAL_TSP_INT_GetHW();
1946*53ee8cc1Swenshuai.xi     //@TODO Need to check why call clr twice will cause one of pcr not work
1947*53ee8cc1Swenshuai.xi     sw_int = HAL_TSP_INT_GetSW();
1948*53ee8cc1Swenshuai.xi     _TSP_INT_UNLOCK();
1949*53ee8cc1Swenshuai.xi 
1950*53ee8cc1Swenshuai.xi #if __LEGACY__
1951*53ee8cc1Swenshuai.xi     // Richard: @FIXME: do we need to detect all the int
1952*53ee8cc1Swenshuai.xi     if (hw_int & TSP_HWINT_PVR)
1953*53ee8cc1Swenshuai.xi     {
1954*53ee8cc1Swenshuai.xi         if(_TSP_ChkPvrNotifyId(0))
1955*53ee8cc1Swenshuai.xi         {
1956*53ee8cc1Swenshuai.xi             TSP_SetEvent(_ptsp_res->_s32PvrEvtId, hw_int & TSP_HWINT_PVR); // Trigger task
1957*53ee8cc1Swenshuai.xi         }
1958*53ee8cc1Swenshuai.xi         else
1959*53ee8cc1Swenshuai.xi         {
1960*53ee8cc1Swenshuai.xi             hw_int &= ~TSP_HWINT_PVR;
1961*53ee8cc1Swenshuai.xi         }
1962*53ee8cc1Swenshuai.xi     }
1963*53ee8cc1Swenshuai.xi #endif
1964*53ee8cc1Swenshuai.xi 
1965*53ee8cc1Swenshuai.xi #if defined(OTV_ENABLE)
1966*53ee8cc1Swenshuai.xi 
1967*53ee8cc1Swenshuai.xi     if ( hw_int & (TSP_HWINT2_OTV) )
1968*53ee8cc1Swenshuai.xi     {
1969*53ee8cc1Swenshuai.xi         MS_U32  u32OTV_Eng;
1970*53ee8cc1Swenshuai.xi         MS_BOOL bInterrupted;
1971*53ee8cc1Swenshuai.xi 
1972*53ee8cc1Swenshuai.xi         //TSP_DBG(E_TSP_DBG_TRACK, "[%s][%04d] ____TSP_OTV_ISR____ \n", __FUNCTION__, __LINE__);
1973*53ee8cc1Swenshuai.xi 
1974*53ee8cc1Swenshuai.xi         for( u32OTV_Eng=0; u32OTV_Eng<TSP_OTVENG_NUM; u32OTV_Eng++)
1975*53ee8cc1Swenshuai.xi         {
1976*53ee8cc1Swenshuai.xi             if( MDrv_OTV_HWINT_Get(u32OTV_Eng, E_DRVOTV_HWINT_EVENT, &bInterrupted) )
1977*53ee8cc1Swenshuai.xi             {
1978*53ee8cc1Swenshuai.xi                 if(bInterrupted)
1979*53ee8cc1Swenshuai.xi                 {
1980*53ee8cc1Swenshuai.xi                     MDrv_OTV_ISR(u32OTV_Eng, E_DRVOTV_HWINT_EVENT);
1981*53ee8cc1Swenshuai.xi                     MDrv_OTV_HWINT_Clear(u32OTV_Eng, E_DRVOTV_HWINT_EVENT);
1982*53ee8cc1Swenshuai.xi                 }
1983*53ee8cc1Swenshuai.xi             }
1984*53ee8cc1Swenshuai.xi 
1985*53ee8cc1Swenshuai.xi             if( MDrv_OTV_HWINT_Get(u32OTV_Eng, E_DRVOTV_HWINT_TIMER, &bInterrupted) )
1986*53ee8cc1Swenshuai.xi             {
1987*53ee8cc1Swenshuai.xi                 if(bInterrupted)
1988*53ee8cc1Swenshuai.xi                 {
1989*53ee8cc1Swenshuai.xi                     MDrv_OTV_ISR(u32OTV_Eng, E_DRVOTV_HWINT_TIMER);
1990*53ee8cc1Swenshuai.xi                     MDrv_OTV_HWINT_Clear(u32OTV_Eng, E_DRVOTV_HWINT_TIMER);
1991*53ee8cc1Swenshuai.xi                 }
1992*53ee8cc1Swenshuai.xi             }
1993*53ee8cc1Swenshuai.xi 
1994*53ee8cc1Swenshuai.xi         }
1995*53ee8cc1Swenshuai.xi 
1996*53ee8cc1Swenshuai.xi         // clear OTV HW Interrrupt
1997*53ee8cc1Swenshuai.xi         HAL_TSP_INT_ClrHW(TSP_HWINT2_OTV);
1998*53ee8cc1Swenshuai.xi 
1999*53ee8cc1Swenshuai.xi     }
2000*53ee8cc1Swenshuai.xi     else
2001*53ee8cc1Swenshuai.xi     {
2002*53ee8cc1Swenshuai.xi         hw_int &= ~TSP_HWINT2_OTV;
2003*53ee8cc1Swenshuai.xi     }
2004*53ee8cc1Swenshuai.xi 
2005*53ee8cc1Swenshuai.xi #endif
2006*53ee8cc1Swenshuai.xi 
2007*53ee8cc1Swenshuai.xi 
2008*53ee8cc1Swenshuai.xi /******************PCR INT*********************/
2009*53ee8cc1Swenshuai.xi 
2010*53ee8cc1Swenshuai.xi     MS_U32 u32PcrDstSTC = 0;
2011*53ee8cc1Swenshuai.xi     MS_U32 u32HwPcrIntMask = 0x0;
2012*53ee8cc1Swenshuai.xi 
2013*53ee8cc1Swenshuai.xi 
2014*53ee8cc1Swenshuai.xi     #define STC_SYNTH_DEFAULT 0x28000000   // @F_TODO do we have to seperate 27M and 90K clk mode? plz define this value to right place...
2015*53ee8cc1Swenshuai.xi 
2016*53ee8cc1Swenshuai.xi     for(i = 0; i < STC_ENG_NUM; i++)
2017*53ee8cc1Swenshuai.xi     {
2018*53ee8cc1Swenshuai.xi         u32HwPcrIntMask = HAL_TSP_PcrFlt_GetIntMask(i);
2019*53ee8cc1Swenshuai.xi 
2020*53ee8cc1Swenshuai.xi         if (_TSP_ChkHwPcrNotifyId(i) && (hw_int & u32HwPcrIntMask))
2021*53ee8cc1Swenshuai.xi         {
2022*53ee8cc1Swenshuai.xi             _TSP_PcrId_To_StcId(TSP_PCRFLT_GET_ID(i), &u32PcrDstSTC);
2023*53ee8cc1Swenshuai.xi 
2024*53ee8cc1Swenshuai.xi             _TSP_INT_LOCK();
2025*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_ClearInt(i);
2026*53ee8cc1Swenshuai.xi             _TSP_INT_UNLOCK();
2027*53ee8cc1Swenshuai.xi 
2028*53ee8cc1Swenshuai.xi             //always read PCR after PCR interrupt has been disabled or cleared to avoid that interrupt's not trggering again.
2029*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_GetPcr(i, &Pcr_H, &Pcr);
2030*53ee8cc1Swenshuai.xi 
2031*53ee8cc1Swenshuai.xi             MS_U32 u32STC_Add_Offset = ( _ptsp_res->_u32_StcOffset[i].bAdd == TRUE) ? (Pcr + _ptsp_res->_u32_StcOffset[i].u32StcOffset) : (Pcr - _ptsp_res->_u32_StcOffset[i].u32StcOffset);
2032*53ee8cc1Swenshuai.xi 
2033*53ee8cc1Swenshuai.xi             if(_ptsp_res->_u8_ResetPcr[i]>=2)
2034*53ee8cc1Swenshuai.xi             {
2035*53ee8cc1Swenshuai.xi                 if(_ptsp_res->_u8_ResetPcr[i] == 3)
2036*53ee8cc1Swenshuai.xi                 {
2037*53ee8cc1Swenshuai.xi                     HAL_TSP_SetSTCSynth(u32PcrDstSTC, STC_SYNTH_DEFAULT);
2038*53ee8cc1Swenshuai.xi                 }
2039*53ee8cc1Swenshuai.xi                 //HAL_TSP_CMDQ_SetSTC(Pcr_H,Pcr);
2040*53ee8cc1Swenshuai.xi 
2041*53ee8cc1Swenshuai.xi                 if(_ptsp_res->_u32_StcUpdateCtrl[i].bEnable == TRUE)
2042*53ee8cc1Swenshuai.xi                 {
2043*53ee8cc1Swenshuai.xi                     HAL_TSP_STC64_Set(u32PcrDstSTC, Pcr_H,u32STC_Add_Offset);
2044*53ee8cc1Swenshuai.xi 
2045*53ee8cc1Swenshuai.xi                     if(_ptsp_res->_u32_StcUpdateCtrl[i].bUpdateOnce == TRUE)
2046*53ee8cc1Swenshuai.xi                     {
2047*53ee8cc1Swenshuai.xi                         _ptsp_res->_u32_StcUpdateCtrl[i].bEnable = FALSE;
2048*53ee8cc1Swenshuai.xi                         _ptsp_res->_u32_StcUpdateCtrl[i].bUpdateOnce = FALSE;
2049*53ee8cc1Swenshuai.xi                     }
2050*53ee8cc1Swenshuai.xi                 }
2051*53ee8cc1Swenshuai.xi 
2052*53ee8cc1Swenshuai.xi                 _ptsp_res->_u8_ResetPcr[i] = 0;
2053*53ee8cc1Swenshuai.xi                 _ptsp_res->_u32_PrevStcBase[i] = u32STC_Add_Offset;
2054*53ee8cc1Swenshuai.xi                 HAL_TSP_GetSTCSynth(u32PcrDstSTC, &_ptsp_res->_u32_PrevPllControl[i]);
2055*53ee8cc1Swenshuai.xi             }
2056*53ee8cc1Swenshuai.xi 
2057*53ee8cc1Swenshuai.xi             //HAL_TSP_CMDQ_GetSTC(&Stc_H, &Stc);
2058*53ee8cc1Swenshuai.xi             HAL_TSP_STC64_Get(u32PcrDstSTC, &Stc_H, &Stc);
2059*53ee8cc1Swenshuai.xi             if(( Stc - _ptsp_res->_u32_PrevStcBase[i]) > 0x4000)
2060*53ee8cc1Swenshuai.xi             {
2061*53ee8cc1Swenshuai.xi                 //ULOGD("TSP", "STC_DIFF = %08X ==== \n\n",Stc - _ptsp_res->_u32_PrevStcBase);
2062*53ee8cc1Swenshuai.xi                 _ptsp_res->_u32_PrevStcBase[i] = Stc;
2063*53ee8cc1Swenshuai.xi 
2064*53ee8cc1Swenshuai.xi                 if(_ptsp_res->_u32_PrevStcBase[i] > u32STC_Add_Offset) // faster then PCR comming
2065*53ee8cc1Swenshuai.xi                 {
2066*53ee8cc1Swenshuai.xi                     u32Diff = _ptsp_res->_u32_PrevStcBase[i] - u32STC_Add_Offset;
2067*53ee8cc1Swenshuai.xi                     if( u32Diff  <= 0x02) //pretty close
2068*53ee8cc1Swenshuai.xi                     {
2069*53ee8cc1Swenshuai.xi                         _ptsp_res->_u8_ResetPcr[i] = 0;
2070*53ee8cc1Swenshuai.xi                     }
2071*53ee8cc1Swenshuai.xi                     else if( u32Diff  < 0x1000)
2072*53ee8cc1Swenshuai.xi                     {
2073*53ee8cc1Swenshuai.xi                         _ptsp_res->_u32_PrevPllControl[i] += ((u32Diff) >> 3 );                         //now = error x alpha + prev
2074*53ee8cc1Swenshuai.xi                         HAL_TSP_SetSTCSynth(u32PcrDstSTC, _ptsp_res->_u32_PrevPllControl[i] + ((u32Diff)>>6));        //out = now + error x beta
2075*53ee8cc1Swenshuai.xi                         _ptsp_res->_u8_ResetPcr[i] = 0;
2076*53ee8cc1Swenshuai.xi                         //ULOGD("TSP", "======== Set STC CONTROL <++> %08X  PCR/Diff = %08X/%08X \n",_ptsp_res->_u32_PrevPllControl[i] + ((_ptsp_res->_u32_PrevStcBase[i] - u32STC_Add_Offset)>>6),u32STC_Add_Offset,_ptsp_res->_u32_PrevStcBase[i]-u32STC_Add_Offset);
2077*53ee8cc1Swenshuai.xi                     }
2078*53ee8cc1Swenshuai.xi                     else
2079*53ee8cc1Swenshuai.xi                     {
2080*53ee8cc1Swenshuai.xi                         _ptsp_res->_u8_ResetPcr[i]++;
2081*53ee8cc1Swenshuai.xi                     }
2082*53ee8cc1Swenshuai.xi                 }
2083*53ee8cc1Swenshuai.xi                 else // slower or equal
2084*53ee8cc1Swenshuai.xi                 {
2085*53ee8cc1Swenshuai.xi                     u32Diff = u32STC_Add_Offset - _ptsp_res->_u32_PrevStcBase[i];
2086*53ee8cc1Swenshuai.xi                     if(( u32Diff) <= 0x02)
2087*53ee8cc1Swenshuai.xi                     {
2088*53ee8cc1Swenshuai.xi                         _ptsp_res->_u8_ResetPcr[i] = 0;
2089*53ee8cc1Swenshuai.xi                     }
2090*53ee8cc1Swenshuai.xi                     else if((u32Diff) < 0x1000)
2091*53ee8cc1Swenshuai.xi                     {
2092*53ee8cc1Swenshuai.xi                         _ptsp_res->_u32_PrevPllControl[i]-=((u32Diff)>> 3);                                //now = error x alpha + prev
2093*53ee8cc1Swenshuai.xi                         HAL_TSP_SetSTCSynth(u32PcrDstSTC, _ptsp_res->_u32_PrevPllControl[i] - (( u32Diff )>> 6));        //out = now + error x beta
2094*53ee8cc1Swenshuai.xi                         _ptsp_res->_u8_ResetPcr[i] = 0;
2095*53ee8cc1Swenshuai.xi                         //ULOGD("TSP", "======== Set STC CONTROL <--> %08X  PCR/Diff = %08X/%08X \n",_ptsp_res->_u32_PrevPllControl[i] - ((u32STC_Add_Offset - _ptsp_res->_u32_PrevStcBase[i] )>>6),u32STC_Add_Offset,u32STC_Add_Offset-_ptsp_res->_u32_PrevStcBase[i] );
2096*53ee8cc1Swenshuai.xi                     }
2097*53ee8cc1Swenshuai.xi                     else
2098*53ee8cc1Swenshuai.xi                     {
2099*53ee8cc1Swenshuai.xi                         _ptsp_res->_u8_ResetPcr[i]++;
2100*53ee8cc1Swenshuai.xi                     }
2101*53ee8cc1Swenshuai.xi                 }
2102*53ee8cc1Swenshuai.xi             }
2103*53ee8cc1Swenshuai.xi         }// end pcr
2104*53ee8cc1Swenshuai.xi         else
2105*53ee8cc1Swenshuai.xi         {
2106*53ee8cc1Swenshuai.xi             hw_int &=( ~u32HwPcrIntMask);
2107*53ee8cc1Swenshuai.xi         }
2108*53ee8cc1Swenshuai.xi     }
2109*53ee8cc1Swenshuai.xi 
2110*53ee8cc1Swenshuai.xi /**********************************************/
2111*53ee8cc1Swenshuai.xi 
2112*53ee8cc1Swenshuai.xi 
2113*53ee8cc1Swenshuai.xi     if (sw_int & TSP_SWINT_CTRL_FIRE)
2114*53ee8cc1Swenshuai.xi     {
2115*53ee8cc1Swenshuai.xi         //MS_U32          engid;
2116*53ee8cc1Swenshuai.xi         MS_U32          fltid;
2117*53ee8cc1Swenshuai.xi         MS_U32          status;
2118*53ee8cc1Swenshuai.xi         //REG_SecFlt*     pFilter;
2119*53ee8cc1Swenshuai.xi         MS_U32          dummy;
2120*53ee8cc1Swenshuai.xi 
2121*53ee8cc1Swenshuai.xi         //engid   = (sw_int & TSP_SWINT_INFO_ENG_MASK)   >> TSP_SWINT_INFO_ENG_SHFT;
2122*53ee8cc1Swenshuai.xi         fltid   = (sw_int & TSP_SWINT_INFO_SEC_MASK)   >> TSP_SWINT_INFO_SEC_SHFT;
2123*53ee8cc1Swenshuai.xi         status  = (sw_int & TSP_SWINT_STATUS_CMD_MASK) >> TSP_SWINT_STATUS_CMD_SHFT;
2124*53ee8cc1Swenshuai.xi         //pFilter = &(_REGSec->Flt[fltid]);
2125*53ee8cc1Swenshuai.xi 
2126*53ee8cc1Swenshuai.xi         if(_ptsp_res->_tspInfo.BufState[fltid] == E_TSP_FLT_STATE_FREE)
2127*53ee8cc1Swenshuai.xi         {
2128*53ee8cc1Swenshuai.xi             goto CLEAR_INT;;
2129*53ee8cc1Swenshuai.xi         }
2130*53ee8cc1Swenshuai.xi 
2131*53ee8cc1Swenshuai.xi         if(_TSP_ChkSecNotifyId(fltid) == FALSE)
2132*53ee8cc1Swenshuai.xi         {
2133*53ee8cc1Swenshuai.xi             sw_int &= ~TSP_SWINT_CTRL_FIRE;
2134*53ee8cc1Swenshuai.xi             hw_int &= ~TSP_HWINT_TSP_SW_INT_EN;
2135*53ee8cc1Swenshuai.xi             status = 0;
2136*53ee8cc1Swenshuai.xi         }
2137*53ee8cc1Swenshuai.xi         else
2138*53ee8cc1Swenshuai.xi         {
2139*53ee8cc1Swenshuai.xi             _s32EventId = _ptsp_res->_tspInfo.s32TspEvtId[fltid];
2140*53ee8cc1Swenshuai.xi         }
2141*53ee8cc1Swenshuai.xi 
2142*53ee8cc1Swenshuai.xi         switch (status)
2143*53ee8cc1Swenshuai.xi         {
2144*53ee8cc1Swenshuai.xi 
2145*53ee8cc1Swenshuai.xi         case TSP_SWINT_STATUS_SEC_RDY_CRCERR:  // CRC error But accept section ;
2146*53ee8cc1Swenshuai.xi             //When there's no CRC in the section & E_TSP_FLT_MODE_AUTO_CRCCHK is used,
2147*53ee8cc1Swenshuai.xi             //don't report CRC error
2148*53ee8cc1Swenshuai.xi             if(!(_ptsp_res->_tspInfo.FltMode[fltid] & E_TSP_FLT_MODE_AUTO_CRCCHK))
2149*53ee8cc1Swenshuai.xi         case TSP_SWINT_STATUS_SEC_CRCERR:  // Filter Didn't check CRC and Section Rdy
2150*53ee8cc1Swenshuai.xi             {
2151*53ee8cc1Swenshuai.xi                 TSP_FLAG_SetCrcErr(fltid);                                                          // Set section event flag
2152*53ee8cc1Swenshuai.xi             }
2153*53ee8cc1Swenshuai.xi 
2154*53ee8cc1Swenshuai.xi             if (E_TSP_EVENT_CB_AUTO == (_ptsp_res->_tspInfo.FltEvent[fltid] & E_TSP_EVENT_CB_MASK))
2155*53ee8cc1Swenshuai.xi             {
2156*53ee8cc1Swenshuai.xi                 TSP_SetEvent(_s32EventId, TSP_EVENT_SECTION);                                                    // Wake task up
2157*53ee8cc1Swenshuai.xi             }
2158*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2159*53ee8cc1Swenshuai.xi //            TSP_OS_Print("%s[%04d]: 0x%08X\n", __FILE__, __LINE__, status);
2160*53ee8cc1Swenshuai.xi             MDrv_TSP_SEC_SetEvent(fltid, DEMUX_EVENT_CRC_FAILED);
2161*53ee8cc1Swenshuai.xi             wake_up_interruptible(&(tsp_wq_head[fltid]));
2162*53ee8cc1Swenshuai.xi #endif
2163*53ee8cc1Swenshuai.xi 
2164*53ee8cc1Swenshuai.xi         if (TSP_SWINT_STATUS_SEC_CRCERR == status)
2165*53ee8cc1Swenshuai.xi             break;
2166*53ee8cc1Swenshuai.xi 
2167*53ee8cc1Swenshuai.xi         case TSP_SWINT_STATUS_SEC_RDY:
2168*53ee8cc1Swenshuai.xi 
2169*53ee8cc1Swenshuai.xi             if ( (E_TSP_FLT_USER_MASK & _ptsp_res->_tspInfo.FltType[fltid]) &&
2170*53ee8cc1Swenshuai.xi                  (E_TSP_FLT_MODE_ONESHOT  & _ptsp_res->_tspInfo.FltMode[fltid]))
2171*53ee8cc1Swenshuai.xi             {
2172*53ee8cc1Swenshuai.xi                 TSP_FLAG_SetFltDis(fltid);                                                    // Set section event flag
2173*53ee8cc1Swenshuai.xi                 if (E_TSP_EVENT_CB_POLL == (_ptsp_res->_tspInfo.FltEvent[fltid] & E_TSP_EVENT_CB_MASK))
2174*53ee8cc1Swenshuai.xi                     TSP_SetEvent(_s32EventId, TSP_EVENT_DISABLEFLT);
2175*53ee8cc1Swenshuai.xi             }
2176*53ee8cc1Swenshuai.xi 
2177*53ee8cc1Swenshuai.xi             // During over-night test, we have got section ready interrupt from non-section filter.
2178*53ee8cc1Swenshuai.xi             // The interrupt is illegal, and will cause TSP ASSERT "HwBufId != tspInfo Bufid" in _TSP_PROC_SecRdy.
2179*53ee8cc1Swenshuai.xi             // Since the root cause was not found yet, we add a patch here to reject the non-section filter interrupt.
2180*53ee8cc1Swenshuai.xi             if(((_ptsp_res->_tspInfo.FltType[fltid] & E_TSP_FLT_USER_MASK) == 0) || ((_ptsp_res->_tspInfo.FltState[fltid] & E_TSP_FLT_STATE_ENABLE) == 0) )
2181*53ee8cc1Swenshuai.xi             {
2182*53ee8cc1Swenshuai.xi                 break;
2183*53ee8cc1Swenshuai.xi             }
2184*53ee8cc1Swenshuai.xi 
2185*53ee8cc1Swenshuai.xi             TSP_FLAG_SetSecRdy(fltid);                                                          // Set section event flag
2186*53ee8cc1Swenshuai.xi             // @NOTE Jerry
2187*53ee8cc1Swenshuai.xi             // It's set by user and ALL section filters should be the same beucase the TASK will race with POLL
2188*53ee8cc1Swenshuai.xi             // Since it's for backward compatible, it's not revised at this time and may be remove in the future.
2189*53ee8cc1Swenshuai.xi             if (E_TSP_EVENT_CB_AUTO == (_ptsp_res->_tspInfo.FltEvent[fltid] & E_TSP_EVENT_CB_MASK))
2190*53ee8cc1Swenshuai.xi             {
2191*53ee8cc1Swenshuai.xi                 TSP_SetEvent(_s32EventId, TSP_EVENT_SECTION);                                                    // Wake task up
2192*53ee8cc1Swenshuai.xi             }
2193*53ee8cc1Swenshuai.xi             else if (E_TSP_EVENT_CB_POLL == (_ptsp_res->_tspInfo.FltEvent[fltid] & E_TSP_EVENT_CB_MASK))
2194*53ee8cc1Swenshuai.xi             {
2195*53ee8cc1Swenshuai.xi                 TSP_SetEvent(_s32EventId, TSP_EVENT_SECTION_POLL);                                               // Set POLL flags
2196*53ee8cc1Swenshuai.xi 
2197*53ee8cc1Swenshuai.xi             }
2198*53ee8cc1Swenshuai.xi 
2199*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2200*53ee8cc1Swenshuai.xi             wake_up_interruptible(&(tsp_wq_head[fltid]));
2201*53ee8cc1Swenshuai.xi #endif
2202*53ee8cc1Swenshuai.xi             break;
2203*53ee8cc1Swenshuai.xi 
2204*53ee8cc1Swenshuai.xi         case TSP_SWINT_STATUS_BUF_OVFLOW:
2205*53ee8cc1Swenshuai.xi             if (!(TSP_FLAG_GetSecOvf(fltid, &dummy, TSP_OS_EVENT_OR))) // ignore redundant overflow
2206*53ee8cc1Swenshuai.xi             {
2207*53ee8cc1Swenshuai.xi                 //TSP_ISR_Print("TSP_SWINT_STATUS_PKT_OVFLOW  , Flt = %ld, Buf = %ld , PID= %04lX\n",fltid,_ptsp_res->_tspInfo.Flt2Buf[fltid],_ptsp_res->_tspInfo.Pid[fltid]);
2208*53ee8cc1Swenshuai.xi                 if ( (E_TSP_FLT_USER_MASK & _ptsp_res->_tspInfo.FltType[fltid]) )
2209*53ee8cc1Swenshuai.xi                 {
2210*53ee8cc1Swenshuai.xi                     TSP_FLAG_SetFltDis(fltid);                                                          // Set section event flag
2211*53ee8cc1Swenshuai.xi                     if (E_TSP_EVENT_CB_POLL == (_ptsp_res->_tspInfo.FltEvent[fltid] & E_TSP_EVENT_CB_MASK))
2212*53ee8cc1Swenshuai.xi                         TSP_SetEvent(_s32EventId, TSP_EVENT_DISABLEFLT);
2213*53ee8cc1Swenshuai.xi 
2214*53ee8cc1Swenshuai.xi                 }
2215*53ee8cc1Swenshuai.xi 
2216*53ee8cc1Swenshuai.xi                 TSP_FLAG_SetSecOvf(fltid);             // Set section event flag
2217*53ee8cc1Swenshuai.xi                 if (E_TSP_EVENT_CB_AUTO == (_ptsp_res->_tspInfo.FltEvent[fltid] & E_TSP_EVENT_CB_MASK))
2218*53ee8cc1Swenshuai.xi                 {
2219*53ee8cc1Swenshuai.xi                     TSP_SetEvent(_s32EventId, TSP_EVENT_SECTION);                                                    // Wake task up
2220*53ee8cc1Swenshuai.xi                 }
2221*53ee8cc1Swenshuai.xi                 else if (E_TSP_EVENT_CB_POLL == (_ptsp_res->_tspInfo.FltEvent[fltid] & E_TSP_EVENT_CB_MASK))
2222*53ee8cc1Swenshuai.xi                 {
2223*53ee8cc1Swenshuai.xi                    TSP_SetEvent(_s32EventId, TSP_EVENT_SECTION_POLL);                                               // Set POLL flags
2224*53ee8cc1Swenshuai.xi                 }
2225*53ee8cc1Swenshuai.xi             }
2226*53ee8cc1Swenshuai.xi 
2227*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2228*53ee8cc1Swenshuai.xi             MDrv_TSP_SEC_SetEvent(fltid, DEMUX_EVENT_DATA_DISCARDED);
2229*53ee8cc1Swenshuai.xi             wake_up_interruptible(&(tsp_wq_head[fltid]));
2230*53ee8cc1Swenshuai.xi #endif
2231*53ee8cc1Swenshuai.xi             break;
2232*53ee8cc1Swenshuai.xi 
2233*53ee8cc1Swenshuai.xi         case TSP_SWINT_STATUS_PKT_OVRUN:
2234*53ee8cc1Swenshuai.xi             TSP_ISR_Print("TSP_SWINT_STATUS_PKT_OVRUN [%d] \n",(unsigned int)fltid);
2235*53ee8cc1Swenshuai.xi             break;
2236*53ee8cc1Swenshuai.xi 
2237*53ee8cc1Swenshuai.xi         case TSP_SWINT_STATUS_SEC_ERROR:
2238*53ee8cc1Swenshuai.xi         case TSP_SWINT_STATUS_DEBUG:
2239*53ee8cc1Swenshuai.xi             //[ISR print]
2240*53ee8cc1Swenshuai.xi //            TSP_OS_Print("%s[%04d]: 0x%08X\n", __FILE__, __LINE__, status);
2241*53ee8cc1Swenshuai.xi             break;
2242*53ee8cc1Swenshuai.xi 
2243*53ee8cc1Swenshuai.xi         default:
2244*53ee8cc1Swenshuai.xi             //[ISR print]
2245*53ee8cc1Swenshuai.xi //            TSP_OS_Print(OSAL_TSP_Print("Unknown TSP interrupt %d\n", u32EngId));
2246*53ee8cc1Swenshuai.xi             break;
2247*53ee8cc1Swenshuai.xi         }
2248*53ee8cc1Swenshuai.xi     }
2249*53ee8cc1Swenshuai.xi 
2250*53ee8cc1Swenshuai.xi CLEAR_INT:
2251*53ee8cc1Swenshuai.xi 
2252*53ee8cc1Swenshuai.xi     _TSP_INT_LOCK();
2253*53ee8cc1Swenshuai.xi     if(hw_int)
2254*53ee8cc1Swenshuai.xi     {
2255*53ee8cc1Swenshuai.xi         HAL_TSP_INT_ClrHW(TSP_HWINT_ALL); // @F_TODO: it's changed from U4 make sure we clr them all
2256*53ee8cc1Swenshuai.xi         //HAL_TSP_INT_ClrHW(hw_int >> 8); // @F_TODO: it's changed from U4 make sure we clr them all
2257*53ee8cc1Swenshuai.xi     }
2258*53ee8cc1Swenshuai.xi     if(sw_int)
2259*53ee8cc1Swenshuai.xi     {
2260*53ee8cc1Swenshuai.xi         HAL_TSP_INT_ClrSW();
2261*53ee8cc1Swenshuai.xi     }
2262*53ee8cc1Swenshuai.xi     _TSP_INT_UNLOCK();
2263*53ee8cc1Swenshuai.xi 
2264*53ee8cc1Swenshuai.xi     TSP_OS_IntEnable();
2265*53ee8cc1Swenshuai.xi 
2266*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2267*53ee8cc1Swenshuai.xi     return IRQ_HANDLED;
2268*53ee8cc1Swenshuai.xi #endif
2269*53ee8cc1Swenshuai.xi }
2270*53ee8cc1Swenshuai.xi 
2271*53ee8cc1Swenshuai.xi 
_TSP_POLL_Proc(MS_U32 u32Events,MS_U32 u32FltId,TSP_Event * pEvent)2272*53ee8cc1Swenshuai.xi static void _TSP_POLL_Proc(MS_U32 u32Events, MS_U32 u32FltId, TSP_Event *pEvent)
2273*53ee8cc1Swenshuai.xi {
2274*53ee8cc1Swenshuai.xi     MS_U32              flags; // dummy
2275*53ee8cc1Swenshuai.xi //    int                 i;
2276*53ee8cc1Swenshuai.xi 
2277*53ee8cc1Swenshuai.xi #if __LEGACY__
2278*53ee8cc1Swenshuai.xi     if ( (TSP_EVENT_PVR0_RDY_POLL | TSP_EVENT_PVR1_RDY_POLL) & u32Events )
2279*53ee8cc1Swenshuai.xi     {
2280*53ee8cc1Swenshuai.xi         _TSP_Proc_Pvr(u32Events, E_TSP_EVENT_CB_POLL);
2281*53ee8cc1Swenshuai.xi     }
2282*53ee8cc1Swenshuai.xi #endif
2283*53ee8cc1Swenshuai.xi 
2284*53ee8cc1Swenshuai.xi /*  [Eddie] Disable filter at ISR_Task
2285*53ee8cc1Swenshuai.xi     // Check any possible filter should be disabled (POLL)
2286*53ee8cc1Swenshuai.xi     for (i = 0; i < TSP_PIDFLT_NUM; i++)
2287*53ee8cc1Swenshuai.xi     {
2288*53ee8cc1Swenshuai.xi         if (TSP_FLAG_GetFltDis(i, &flags, TSP_OS_EVENT_OR_CLEAR))
2289*53ee8cc1Swenshuai.xi         {
2290*53ee8cc1Swenshuai.xi             TSP_LOCK();
2291*53ee8cc1Swenshuai.xi             _TSP_FLT_Disable(i);
2292*53ee8cc1Swenshuai.xi             TSP_UNLOCK();
2293*53ee8cc1Swenshuai.xi         }
2294*53ee8cc1Swenshuai.xi     }
2295*53ee8cc1Swenshuai.xi */
2296*53ee8cc1Swenshuai.xi     if (TSP_FLAG_GetFltDis(u32FltId, &flags, TSP_OS_EVENT_OR_CLEAR))
2297*53ee8cc1Swenshuai.xi     {
2298*53ee8cc1Swenshuai.xi         TSP_LOCK();
2299*53ee8cc1Swenshuai.xi         _TSP_FLT_Disable(u32FltId);
2300*53ee8cc1Swenshuai.xi         TSP_UNLOCK();
2301*53ee8cc1Swenshuai.xi     }
2302*53ee8cc1Swenshuai.xi 
2303*53ee8cc1Swenshuai.xi     // Process singl specified filter
2304*53ee8cc1Swenshuai.xi 
2305*53ee8cc1Swenshuai.xi     // @FIXME: Jerry
2306*53ee8cc1Swenshuai.xi     // Check the behavior between ISR_Proc and _Poll_Proc
2307*53ee8cc1Swenshuai.xi     // Why isn't _Proc_SecOvf first than _Proc_SecRdy as _ISR_Proc
2308*53ee8cc1Swenshuai.xi 
2309*53ee8cc1Swenshuai.xi     if ((_ptsp_res->_tspInfo.FltState[u32FltId] != E_TSP_FLT_STATE_FREE) && (_ptsp_res->_tspInfo.FltState[u32FltId] != E_TSP_FLT_STATE_ISR_FREE))
2310*53ee8cc1Swenshuai.xi     {
2311*53ee8cc1Swenshuai.xi         *pEvent = E_TSP_EVENT_DATA_IDLE;
2312*53ee8cc1Swenshuai.xi         if (E_TSP_FAIL == _TSP_PROC_SecRdy(u32FltId, pEvent))
2313*53ee8cc1Swenshuai.xi         {
2314*53ee8cc1Swenshuai.xi             if (TSP_FLAG_GetSecOvf(u32FltId, &flags, TSP_OS_EVENT_OR)) // @FIXME: clear events at Proc_SecOvf?
2315*53ee8cc1Swenshuai.xi             {
2316*53ee8cc1Swenshuai.xi                 _TSP_PROC_SecOvf(u32FltId, pEvent);
2317*53ee8cc1Swenshuai.xi             }
2318*53ee8cc1Swenshuai.xi             else if (TSP_FLAG_GetCrcErr(u32FltId, &flags, TSP_OS_EVENT_OR)) // @Note:  Priority Overflow > CRCError > SecRdy
2319*53ee8cc1Swenshuai.xi             {
2320*53ee8cc1Swenshuai.xi                 _TSP_PROC_CrcErr(u32FltId, pEvent);
2321*53ee8cc1Swenshuai.xi             }
2322*53ee8cc1Swenshuai.xi         }
2323*53ee8cc1Swenshuai.xi     }
2324*53ee8cc1Swenshuai.xi }
2325*53ee8cc1Swenshuai.xi 
2326*53ee8cc1Swenshuai.xi 
_TSP_HW_ResetState(void)2327*53ee8cc1Swenshuai.xi static void _TSP_HW_ResetState(void)
2328*53ee8cc1Swenshuai.xi {
2329*53ee8cc1Swenshuai.xi     MS_U32              fltid;
2330*53ee8cc1Swenshuai.xi 
2331*53ee8cc1Swenshuai.xi     for (fltid = 0; fltid < (TSP_PIDFLT_NUM_ALL-1); fltid++)
2332*53ee8cc1Swenshuai.xi     {
2333*53ee8cc1Swenshuai.xi         _TSP_FLT_Disable(fltid);
2334*53ee8cc1Swenshuai.xi         _TSP_FLT_Init(fltid); // state => FREE
2335*53ee8cc1Swenshuai.xi         _TSP_FLT_Free(fltid);
2336*53ee8cc1Swenshuai.xi     }
2337*53ee8cc1Swenshuai.xi 
2338*53ee8cc1Swenshuai.xi     for (fltid = 0; fltid < TSP_SECBUF_END_ID; fltid++)
2339*53ee8cc1Swenshuai.xi     {
2340*53ee8cc1Swenshuai.xi         _TSP_SEC_Init(fltid); // state => FREE
2341*53ee8cc1Swenshuai.xi         _TSP_SEC_Free(fltid);
2342*53ee8cc1Swenshuai.xi     }
2343*53ee8cc1Swenshuai.xi }
2344*53ee8cc1Swenshuai.xi 
2345*53ee8cc1Swenshuai.xi 
_TSP_SW_ResetState(void)2346*53ee8cc1Swenshuai.xi static void _TSP_SW_ResetState(void)
2347*53ee8cc1Swenshuai.xi {
2348*53ee8cc1Swenshuai.xi     MS_U32              fltid;
2349*53ee8cc1Swenshuai.xi 
2350*53ee8cc1Swenshuai.xi     for (fltid = 0; fltid < TSP_SECFLT_END_ID; fltid++)
2351*53ee8cc1Swenshuai.xi     {
2352*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.BufState[fltid]         = E_TSP_FLT_STATE_NA;
2353*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.FltMode[fltid]          = E_TSP_FLT_MODE_CONTI;
2354*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.FltEvent[fltid]         = E_TSP_EVENT_DATA_IDLE;
2355*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.FltCallback[fltid]      = NULL;
2356*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.s32TspEvtId[fltid]      = -1;
2357*53ee8cc1Swenshuai.xi     }
2358*53ee8cc1Swenshuai.xi 
2359*53ee8cc1Swenshuai.xi     for (fltid = 0; fltid < (TSP_PIDFLT_NUM_ALL - 1); fltid++)
2360*53ee8cc1Swenshuai.xi     {
2361*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.Pid[fltid]         = TSP_PID_NULL;
2362*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.FltState[fltid]    = E_TSP_FLT_STATE_NA;
2363*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.FltType[fltid]     = E_TSP_FLT_USER_NULL;
2364*53ee8cc1Swenshuai.xi     }
2365*53ee8cc1Swenshuai.xi 
2366*53ee8cc1Swenshuai.xi }
2367*53ee8cc1Swenshuai.xi 
_TSP_Init(MS_BOOL bResetSW,MS_BOOL bRestoreHW)2368*53ee8cc1Swenshuai.xi static TSP_Result _TSP_Init(MS_BOOL bResetSW, MS_BOOL bRestoreHW)
2369*53ee8cc1Swenshuai.xi {
2370*53ee8cc1Swenshuai.xi     int             i;
2371*53ee8cc1Swenshuai.xi 
2372*53ee8cc1Swenshuai.xi     //Disable CPU to prevent cpu enable by other module before tsp_init.
2373*53ee8cc1Swenshuai.xi     HAL_TSP_CPU(0);
2374*53ee8cc1Swenshuai.xi     HAL_TSP_Power(1);//@F_TODO not implement yet disable unused clk in TSP compare with K2
2375*53ee8cc1Swenshuai.xi 
2376*53ee8cc1Swenshuai.xi     // Diable interrupt
2377*53ee8cc1Swenshuai.xi     HAL_TSP_INT_Disable(TSP_HWINT_ALL|(TSP_HWINT2_ALL<<8)|(TSP_HWINT3_ALL<<16));//@F_TODO need to check what it really disabled.... 0x6c????
2378*53ee8cc1Swenshuai.xi 
2379*53ee8cc1Swenshuai.xi     // IntDisable
2380*53ee8cc1Swenshuai.xi     // IntDetach
2381*53ee8cc1Swenshuai.xi     TSP_OS_IntDisable();
2382*53ee8cc1Swenshuai.xi     TSP_OS_IntDetach();
2383*53ee8cc1Swenshuai.xi 
2384*53ee8cc1Swenshuai.xi     //@F_TODO DISABLE tsif 0~3
2385*53ee8cc1Swenshuai.xi     for (i = 0; i < TSP_TSIF_NUM; i++)
2386*53ee8cc1Swenshuai.xi     {
2387*53ee8cc1Swenshuai.xi         HAL_TSP_SetTSIF(i, E_TSP_TSIF_DIS, FALSE);
2388*53ee8cc1Swenshuai.xi     }
2389*53ee8cc1Swenshuai.xi 
2390*53ee8cc1Swenshuai.xi     //HAL_TSP_HW_Lock_Init();//@NOTE HW LOCK is a mechenism to use regiter to protect register modify race between HK and TSP CPU
2391*53ee8cc1Swenshuai.xi 
2392*53ee8cc1Swenshuai.xi     HAL_TSP_Reset(1);
2393*53ee8cc1Swenshuai.xi     HAL_TSP_Reset(0); // indirect access activated, WB reset, CMDQ reset
2394*53ee8cc1Swenshuai.xi //    HAL_TSP_HWPatch();
2395*53ee8cc1Swenshuai.xi 
2396*53ee8cc1Swenshuai.xi     HAL_TSP_INT_ClrSW();
2397*53ee8cc1Swenshuai.xi     HAL_TSP_INT_ClrHW(TSP_HWINT_ALL|(TSP_HWINT2_ALL<<8)|(TSP_HWINT3_ALL<<16)); // @F_TODO: need to check this step with Stephen for which interrup to clear
2398*53ee8cc1Swenshuai.xi 
2399*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
2400*53ee8cc1Swenshuai.xi     HAL_TSP_PktConverter_Init();
2401*53ee8cc1Swenshuai.xi #endif
2402*53ee8cc1Swenshuai.xi 
2403*53ee8cc1Swenshuai.xi     HAL_TSP_HwPatch(); // @F_TODO no source yet
2404*53ee8cc1Swenshuai.xi     //HAL_TSP_SetCAPath(TSP_CA_ROUTE_EN | TSP_CA_OUT_EN | TSP_CA_FLOWCTRL_EN);
2405*53ee8cc1Swenshuai.xi 
2406*53ee8cc1Swenshuai.xi /*
2407*53ee8cc1Swenshuai.xi     // XXX: Jericho: temp solution to prevent TSP write memory
2408*53ee8cc1Swenshuai.xi     HAL_TSP_CPU_WProtect(TRUE, 0, 0);
2409*53ee8cc1Swenshuai.xi */
2410*53ee8cc1Swenshuai.xi 
2411*53ee8cc1Swenshuai.xi     if (bResetSW)
2412*53ee8cc1Swenshuai.xi     {
2413*53ee8cc1Swenshuai.xi         _TSP_SW_ResetState();
2414*53ee8cc1Swenshuai.xi     }
2415*53ee8cc1Swenshuai.xi 
2416*53ee8cc1Swenshuai.xi     if (bRestoreHW)
2417*53ee8cc1Swenshuai.xi     {
2418*53ee8cc1Swenshuai.xi         HAL_TSP_RestoreFltState();
2419*53ee8cc1Swenshuai.xi     }
2420*53ee8cc1Swenshuai.xi     else
2421*53ee8cc1Swenshuai.xi     {
2422*53ee8cc1Swenshuai.xi         _TSP_HW_ResetState();
2423*53ee8cc1Swenshuai.xi     }
2424*53ee8cc1Swenshuai.xi 
2425*53ee8cc1Swenshuai.xi #ifndef SECURE_PVR_ENABLE
2426*53ee8cc1Swenshuai.xi     if (TRUE != HAL_TSP_SetVQ(_ptsp_res->_tspInfo.Param.phyVQAddr, _ptsp_res->_tspInfo.Param.u32VQSize))
2427*53ee8cc1Swenshuai.xi     {
2428*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "TSP VQ is not aligned\n");
2429*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
2430*53ee8cc1Swenshuai.xi     }
2431*53ee8cc1Swenshuai.xi #else
2432*53ee8cc1Swenshuai.xi     _ptsp_res->_stSecBuf.u32BufId = 0;
2433*53ee8cc1Swenshuai.xi     _ptsp_res->_stSecBuf.u32BufOpt = 0;
2434*53ee8cc1Swenshuai.xi     _ptsp_res->_stSecBuf.u32BufSize = _ptsp_res->_tspInfo.Param.u32VQSize;
2435*53ee8cc1Swenshuai.xi     _ptsp_res->_stSecBuf.phyBufAddr = _ptsp_res->_tspInfo.Param.phyVQAddr;
2436*53ee8cc1Swenshuai.xi     //printf("[%s][%d] u32BufId %d, opte %d , bufsize %x, addr %x \n", __FUNCTION__, __LINE__, (int)_ptsp_res->_stSecBuf.u32BufId,
2437*53ee8cc1Swenshuai.xi     //    (int)_ptsp_res->_stSecBuf.u32BufOpt, (int)_ptsp_res->_stSecBuf.u32BufSize, (int)_ptsp_res->_stSecBuf.phyBufAddr);
2438*53ee8cc1Swenshuai.xi     if(MDrv_TSP_Ree_SendTeeCmd(E_DRVTSP_REE_TO_TEE_CMD_SET_VqBuf, (void*)(&(_ptsp_res->_stSecBuf)), sizeof(DrvTSP_SecureBuf)) != E_TSP_OK)
2439*53ee8cc1Swenshuai.xi     {
2440*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[MDRV TSP][%06d] Set VQ buf fail!\n", __LINE__);
2441*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
2442*53ee8cc1Swenshuai.xi     }
2443*53ee8cc1Swenshuai.xi     HAL_TSP_VQ_Enable(TRUE);
2444*53ee8cc1Swenshuai.xi #endif  //SECURE_PVR_ENABLE
2445*53ee8cc1Swenshuai.xi 
2446*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE   //load fwtsp.dat from Tee
2447*53ee8cc1Swenshuai.xi     _ptsp_res->_stSecBuf.u32BufId = 0;
2448*53ee8cc1Swenshuai.xi     _ptsp_res->_stSecBuf.u32BufOpt = 0;
2449*53ee8cc1Swenshuai.xi     _ptsp_res->_stSecBuf.u32BufSize = _ptsp_res->_tspInfo.Param.u32FWSize;
2450*53ee8cc1Swenshuai.xi     _ptsp_res->_stSecBuf.phyBufAddr = _ptsp_res->_tspInfo.Param.phyFWAddr;
2451*53ee8cc1Swenshuai.xi     //printf("[%s][%d] u32BufId %d, opte %d , bufsize %x, addr %x \n", __FUNCTION__, __LINE__, (int)_ptsp_res->_stSecBuf.u32BufId,
2452*53ee8cc1Swenshuai.xi     //    (int)_ptsp_res->_stSecBuf.u32BufOpt, (int)_ptsp_res->_stSecBuf.u32BufSize, (int)_ptsp_res->_stSecBuf.phyBufAddr);
2453*53ee8cc1Swenshuai.xi     if(MDrv_TSP_Ree_SendTeeCmd(E_DRVTSP_REE_TO_TEE_CMD_FW_LoadCode, (void*)(&(_ptsp_res->_stSecBuf)), sizeof(DrvTSP_SecureBuf)) != E_TSP_OK)
2454*53ee8cc1Swenshuai.xi     {
2455*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
2456*53ee8cc1Swenshuai.xi     }
2457*53ee8cc1Swenshuai.xi #endif
2458*53ee8cc1Swenshuai.xi 
2459*53ee8cc1Swenshuai.xi     if (TRUE != HAL_TSP_LoadFW(_ptsp_res->_tspInfo.Param.phyFWAddr, _ptsp_res->_tspInfo.Param.u32FWSize))
2460*53ee8cc1Swenshuai.xi     {
2461*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "TSP firmware is not aligned\n");
2462*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
2463*53ee8cc1Swenshuai.xi     }
2464*53ee8cc1Swenshuai.xi 
2465*53ee8cc1Swenshuai.xi     HAL_TSP_CPU(1);
2466*53ee8cc1Swenshuai.xi #if defined (MSOS_TYPE_LINUX_KERNEL)
2467*53ee8cc1Swenshuai.xi     mdelay(3);
2468*53ee8cc1Swenshuai.xi #else
2469*53ee8cc1Swenshuai.xi     MsOS_DelayTask(3);
2470*53ee8cc1Swenshuai.xi #endif
2471*53ee8cc1Swenshuai.xi 
2472*53ee8cc1Swenshuai.xi     while (FALSE == HAL_TSP_HCMD_Alive())
2473*53ee8cc1Swenshuai.xi     {
2474*53ee8cc1Swenshuai.xi         TSP_OS_Print("Reset TSP CPU fail, Retry.\n");
2475*53ee8cc1Swenshuai.xi         HAL_TSP_CPU(0);
2476*53ee8cc1Swenshuai.xi         #ifdef SECURE_PVR_ENABLE   //load fwtsp.dat from Tee
2477*53ee8cc1Swenshuai.xi         if(MDrv_TSP_Ree_SendTeeCmd(E_DRVTSP_REE_TO_TEE_CMD_FW_LoadCode, (void*)(&(_ptsp_res->_stSecBuf)), sizeof(DrvTSP_SecureBuf)) != E_TSP_OK)
2478*53ee8cc1Swenshuai.xi         {
2479*53ee8cc1Swenshuai.xi             return E_TSP_FAIL;
2480*53ee8cc1Swenshuai.xi         }
2481*53ee8cc1Swenshuai.xi         #endif
2482*53ee8cc1Swenshuai.xi         HAL_TSP_LoadFW(_ptsp_res->_tspInfo.Param.phyFWAddr, _ptsp_res->_tspInfo.Param.u32FWSize);
2483*53ee8cc1Swenshuai.xi         HAL_TSP_CPU(1);
2484*53ee8cc1Swenshuai.xi         #if defined (MSOS_TYPE_LINUX_KERNEL)
2485*53ee8cc1Swenshuai.xi             mdelay(3);
2486*53ee8cc1Swenshuai.xi         #else
2487*53ee8cc1Swenshuai.xi             MsOS_DelayTask(3);
2488*53ee8cc1Swenshuai.xi         #endif
2489*53ee8cc1Swenshuai.xi     }
2490*53ee8cc1Swenshuai.xi     TSP_OS_Print("Reset TSP CPU Success.\n");
2491*53ee8cc1Swenshuai.xi     TSP_OS_Print(">> FwVersion:%08X , Date:%08X \n",(unsigned int)HAL_TSP_HCMD_GetInfo(INFO_FW_VERSION),(unsigned int)HAL_TSP_HCMD_GetInfo(INFO_FW_DATE));
2492*53ee8cc1Swenshuai.xi 
2493*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
2494*53ee8cc1Swenshuai.xi     _ptsp_res->_stSecBuf.u32BufId = 0xFF;
2495*53ee8cc1Swenshuai.xi     _ptsp_res->_stSecBuf.u32BufOpt = 0;
2496*53ee8cc1Swenshuai.xi     _ptsp_res->_stSecBuf.u32BufSize = 0;
2497*53ee8cc1Swenshuai.xi     _ptsp_res->_stSecBuf.phyBufAddr = 0;
2498*53ee8cc1Swenshuai.xi     if(MDrv_TSP_Ree_SendTeeCmd(E_DRVTSP_REE_TO_TEE_CMD_FW_LoadCode, (void*)(&(_ptsp_res->_stSecBuf)), sizeof(DrvTSP_SecureBuf)) != E_TSP_OK)
2499*53ee8cc1Swenshuai.xi     {
2500*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
2501*53ee8cc1Swenshuai.xi     }
2502*53ee8cc1Swenshuai.xi #endif
2503*53ee8cc1Swenshuai.xi 
2504*53ee8cc1Swenshuai.xi     HAL_TSP_INT_ClrSW();
2505*53ee8cc1Swenshuai.xi     HAL_TSP_INT_ClrHW(TSP_HWINT_ALL|(TSP_HWINT2_ALL<<8)|(TSP_HWINT3_ALL<<16)); // @FIXME : it's changed from U4 we need to make sure kaiser is not chaged
2506*53ee8cc1Swenshuai.xi 
2507*53ee8cc1Swenshuai.xi     // Implicity MDrv_TSP_Reset()
2508*53ee8cc1Swenshuai.xi #if 1
2509*53ee8cc1Swenshuai.xi     for(i=0; i<TSP_TSIF_NUM; i++)
2510*53ee8cc1Swenshuai.xi     {
2511*53ee8cc1Swenshuai.xi         switch(i)
2512*53ee8cc1Swenshuai.xi         {
2513*53ee8cc1Swenshuai.xi             case TSP_TSIF0:
2514*53ee8cc1Swenshuai.xi                 HAL_TSP_Filein_ByteDelay(E_FILEENG_TSIF0, 0x0A, TRUE);  //@FIXME why use 0xA
2515*53ee8cc1Swenshuai.xi                 break;
2516*53ee8cc1Swenshuai.xi             case TSP_TSIF1:
2517*53ee8cc1Swenshuai.xi                 HAL_TSP_Filein_ByteDelay(E_FILEENG_TSIF1, 0x0A, TRUE);  //@FIXME why use 0xA
2518*53ee8cc1Swenshuai.xi                 break;
2519*53ee8cc1Swenshuai.xi             case TSP_TSIF2:
2520*53ee8cc1Swenshuai.xi                 HAL_TSP_Filein_ByteDelay(E_FILEENG_TSIF2, 0x0A, TRUE);  //@FIXME why use 0xA
2521*53ee8cc1Swenshuai.xi                 break;
2522*53ee8cc1Swenshuai.xi             case TSP_TSIF3:
2523*53ee8cc1Swenshuai.xi                 HAL_TSP_Filein_ByteDelay(E_FILEENG_TSIF3, 0x0A, TRUE);  //@FIXME why use 0xA
2524*53ee8cc1Swenshuai.xi                 break;
2525*53ee8cc1Swenshuai.xi         }
2526*53ee8cc1Swenshuai.xi     }
2527*53ee8cc1Swenshuai.xi #else
2528*53ee8cc1Swenshuai.xi    HAL_TSP_File_SetDelay(0x0A);                                          // Set TsDma delay, //jyliu.tsp, how come the value?
2529*53ee8cc1Swenshuai.xi #endif
2530*53ee8cc1Swenshuai.xi 
2531*53ee8cc1Swenshuai.xi     // STC control by TSP need indirect R/W enable
2532*53ee8cc1Swenshuai.xi     HAL_TSP_STC_Init();
2533*53ee8cc1Swenshuai.xi    // HAL_TSP_SetSTCSynth(STC_SYNTH_DEFAULT); // @NOTE this is done in HAL_TSP_STC_Init
2534*53ee8cc1Swenshuai.xi 
2535*53ee8cc1Swenshuai.xi 
2536*53ee8cc1Swenshuai.xi     TSP_OS_IntAttach((void*)_TSP_ISR);
2537*53ee8cc1Swenshuai.xi     TSP_OS_IntEnable();
2538*53ee8cc1Swenshuai.xi 
2539*53ee8cc1Swenshuai.xi     // [URANUS] Richard: Refine the interrupt selection later.
2540*53ee8cc1Swenshuai.xi     HAL_TSP_INT_Enable(TSP_HWINT_ALL|(TSP_HWINT2_ALL<<8)|(TSP_HWINT3_ALL<<16));                                     // Enable TSP hardware interrupt
2541*53ee8cc1Swenshuai.xi 
2542*53ee8cc1Swenshuai.xi     if (_ptsp_res->_tspInfo.bSWInit)
2543*53ee8cc1Swenshuai.xi     {
2544*53ee8cc1Swenshuai.xi         return E_TSP_OK;
2545*53ee8cc1Swenshuai.xi     }
2546*53ee8cc1Swenshuai.xi 
2547*53ee8cc1Swenshuai.xi #if defined(__LEGACY__)
2548*53ee8cc1Swenshuai.xi     _ptsp_res->_PvrEvtNotify = E_TSP_EVENT_DATA_IDLE;
2549*53ee8cc1Swenshuai.xi     _ptsp_res->_PvrCallback = NULL;
2550*53ee8cc1Swenshuai.xi #endif
2551*53ee8cc1Swenshuai.xi 
2552*53ee8cc1Swenshuai.xi     _ptsp_res->_s32MutexId = TSP_OS_MutexCreate((MS_U8*)"TSP_Mutex"); // MsOS_CreateMutex(E_MSOS_FIFO, "TSP_Mutex");
2553*53ee8cc1Swenshuai.xi     _ptsp_res->_s32LockId =  TSP_OS_MutexCreate((MS_U8*)"TSP_Ind_Mutex"); // MsOS_CreateMutex(E_MSOS_FIFO, "TSP_Mutex");
2554*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
2555*53ee8cc1Swenshuai.xi     _ptsp_res->_s32IntRegMutexId =  TSP_OS_MutexCreate((MS_U8*)"TSP_Int_Mutex");
2556*53ee8cc1Swenshuai.xi #endif
2557*53ee8cc1Swenshuai.xi     _ptsp_res->_s32PvrMutexId = TSP_OS_MutexCreate((MS_U8*)"TSP_Pvr_Mutex"); // MsOS_CreateMutex(E_MSOS_FIFO, "TSP_Pvr_Mutex");
2558*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
2559*53ee8cc1Swenshuai.xi     _s32EventId = TSP_OS_EventCreate((MS_U8*)"TSP_Event"); // MsOS_CreateEventGroup("TSP_Event");
2560*53ee8cc1Swenshuai.xi #endif
2561*53ee8cc1Swenshuai.xi 
2562*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.bISRTaskEn = TRUE;
2563*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
2564*53ee8cc1Swenshuai.xi     // we dont create driver task in kernel mode, thus related checking should be remove too.
2565*53ee8cc1Swenshuai.xi     _ptsp_res->_s32TaskId =  TSP_OS_TaskCreate(_TSP_ISR_Task, (MS_U8*)"TSP_ISR_Task");
2566*53ee8cc1Swenshuai.xi 
2567*53ee8cc1Swenshuai.xi     if ( _ptsp_res->_s32TaskId == -1 )
2568*53ee8cc1Swenshuai.xi     {
2569*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
2570*53ee8cc1Swenshuai.xi     }
2571*53ee8cc1Swenshuai.xi #endif
2572*53ee8cc1Swenshuai.xi 
2573*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
2574*53ee8cc1Swenshuai.xi     if ( (_ptsp_res->_s32MutexId == -1) || (_ptsp_res->_s32LockId == -1) || (_ptsp_res->_s32PvrMutexId == -1) || (_s32EventId == -1) )
2575*53ee8cc1Swenshuai.xi #else
2576*53ee8cc1Swenshuai.xi     if ( (_ptsp_res->_s32MutexId == -1) || (_ptsp_res->_s32LockId == -1) || (_ptsp_res->_s32PvrMutexId == -1))
2577*53ee8cc1Swenshuai.xi #endif
2578*53ee8cc1Swenshuai.xi     {
2579*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
2580*53ee8cc1Swenshuai.xi     }
2581*53ee8cc1Swenshuai.xi 
2582*53ee8cc1Swenshuai.xi     for (i = 0; i < ((TSP_SECFLT_NUM+31)>>5); i++)
2583*53ee8cc1Swenshuai.xi     {
2584*53ee8cc1Swenshuai.xi         _s32SecRdyFlags[i] = TSP_OS_EventCreate((MS_U8*)"TSP_SecRdy");
2585*53ee8cc1Swenshuai.xi         if(_s32SecRdyFlags[i] == -1)
2586*53ee8cc1Swenshuai.xi         { TSP_DBG(E_TSP_DBG_ERROR, "[%04d] Create _s32SecRdyFlags[%d] failed", __LINE__, i); }
2587*53ee8cc1Swenshuai.xi 
2588*53ee8cc1Swenshuai.xi         _s32CrcErrFlags[i] = TSP_OS_EventCreate((MS_U8*)"TSP_CrcErr");
2589*53ee8cc1Swenshuai.xi         if(_s32CrcErrFlags[i] == -1)
2590*53ee8cc1Swenshuai.xi         { TSP_DBG(E_TSP_DBG_ERROR, "[%04d] Create _s32CrcErrFlags[%d] failed", __LINE__, i); }
2591*53ee8cc1Swenshuai.xi 
2592*53ee8cc1Swenshuai.xi         _s32SecOvfFlags[i] = TSP_OS_EventCreate((MS_U8*)"TSP_SecOvf");
2593*53ee8cc1Swenshuai.xi         if(_s32SecOvfFlags[i] == -1)
2594*53ee8cc1Swenshuai.xi         { TSP_DBG(E_TSP_DBG_ERROR, "[%04d] Create _s32SecOvfFlags[%d] failed", __LINE__, i); }
2595*53ee8cc1Swenshuai.xi 
2596*53ee8cc1Swenshuai.xi         _s32FltDisFlags[i] = TSP_OS_EventCreate((MS_U8*)"TSP_FltDis");
2597*53ee8cc1Swenshuai.xi         if(_s32FltDisFlags[i] == -1)
2598*53ee8cc1Swenshuai.xi         { TSP_DBG(E_TSP_DBG_ERROR, "[%04d] Create _s32FltDisFlags[%d] failed", __LINE__, i); }
2599*53ee8cc1Swenshuai.xi 
2600*53ee8cc1Swenshuai.xi         _s32FreeFlags[i]   = TSP_OS_EventCreate((MS_U8*)"TSP_FltFree");
2601*53ee8cc1Swenshuai.xi         if(_s32FreeFlags[i] == -1)
2602*53ee8cc1Swenshuai.xi         { TSP_DBG(E_TSP_DBG_ERROR, "[%04d] Create _s32FreeFlags[%d] failed", __LINE__, i); }
2603*53ee8cc1Swenshuai.xi 
2604*53ee8cc1Swenshuai.xi         _s32DoneFlags[i]   = TSP_OS_EventCreate((MS_U8*)"TSP_FltDone");
2605*53ee8cc1Swenshuai.xi         if(_s32DoneFlags[i] == -1)
2606*53ee8cc1Swenshuai.xi         { TSP_DBG(E_TSP_DBG_ERROR, "[%04d] Create _s32DoneFlags[%d] failed", __LINE__, i); }
2607*53ee8cc1Swenshuai.xi 
2608*53ee8cc1Swenshuai.xi         _s32OvfRstFlags[i]= 0 ;
2609*53ee8cc1Swenshuai.xi         _s32ModeFlags[i] = 0 ;
2610*53ee8cc1Swenshuai.xi 
2611*53ee8cc1Swenshuai.xi         _u32SecNotifyId[i] = 0;
2612*53ee8cc1Swenshuai.xi 
2613*53ee8cc1Swenshuai.xi     }
2614*53ee8cc1Swenshuai.xi 
2615*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.Status  = E_TSP_SW_INIT;
2616*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.bSWInit = TRUE;
2617*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.LastErr = E_TSP_OK;
2618*53ee8cc1Swenshuai.xi 
2619*53ee8cc1Swenshuai.xi     // Default Live Path as TSIF0
2620*53ee8cc1Swenshuai.xi     _ptsp_res->_Current_Live = E_TSP_FLT_SRC_LIVE0;
2621*53ee8cc1Swenshuai.xi     _ptsp_res->_Current_PVR = 0 ;
2622*53ee8cc1Swenshuai.xi 
2623*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2624*53ee8cc1Swenshuai.xi     for (i = 0; i < TSP_SECFLT_END_ID; i++)
2625*53ee8cc1Swenshuai.xi     {
2626*53ee8cc1Swenshuai.xi         init_waitqueue_head(&tsp_wq_head[i]);
2627*53ee8cc1Swenshuai.xi     }
2628*53ee8cc1Swenshuai.xi     memset(_u32SecEvent, 0, sizeof(_u32SecEvent));
2629*53ee8cc1Swenshuai.xi 
2630*53ee8cc1Swenshuai.xi     if(_u32KPrcEvtTblUseFlag == 0)
2631*53ee8cc1Swenshuai.xi     {
2632*53ee8cc1Swenshuai.xi         for (i= 0; i< DRVTSP_MAX_PROCESS_NUM; i++)
2633*53ee8cc1Swenshuai.xi         {
2634*53ee8cc1Swenshuai.xi             _stKModePrcEvtTbl[i].tgid = 0;
2635*53ee8cc1Swenshuai.xi             _stKModePrcEvtTbl[i].s32TspEvtId = -1;
2636*53ee8cc1Swenshuai.xi         }
2637*53ee8cc1Swenshuai.xi     }
2638*53ee8cc1Swenshuai.xi #endif
2639*53ee8cc1Swenshuai.xi 
2640*53ee8cc1Swenshuai.xi     return E_TSP_OK;
2641*53ee8cc1Swenshuai.xi 
2642*53ee8cc1Swenshuai.xi }
2643*53ee8cc1Swenshuai.xi 
2644*53ee8cc1Swenshuai.xi 
_TSP_Exit(void)2645*53ee8cc1Swenshuai.xi static void _TSP_Exit(void)
2646*53ee8cc1Swenshuai.xi {
2647*53ee8cc1Swenshuai.xi     MS_U32                 i;
2648*53ee8cc1Swenshuai.xi     MS_U32                 Pcr_H, Pcr;
2649*53ee8cc1Swenshuai.xi 
2650*53ee8cc1Swenshuai.xi     HAL_TSP_INT_Disable(TSP_HWINT_ALL|(TSP_HWINT2_ALL<<8)|(TSP_HWINT3_ALL<<16));
2651*53ee8cc1Swenshuai.xi 
2652*53ee8cc1Swenshuai.xi     //always read PCR after PCR interrupt has been disabled or cleared to avoid that interrupt's not trggering again.
2653*53ee8cc1Swenshuai.xi     for (i = 0; i < TSP_PCRFLT_NUM; i++)
2654*53ee8cc1Swenshuai.xi     {
2655*53ee8cc1Swenshuai.xi           HAL_TSP_PcrFlt_GetPcr(i, &Pcr_H, &Pcr);
2656*53ee8cc1Swenshuai.xi     }
2657*53ee8cc1Swenshuai.xi 
2658*53ee8cc1Swenshuai.xi     TSP_OS_IntDisable();
2659*53ee8cc1Swenshuai.xi     TSP_OS_IntDetach();
2660*53ee8cc1Swenshuai.xi 
2661*53ee8cc1Swenshuai.xi     for (i = 0; i < TSP_TSIF_NUM; i++) //@FIXME is this enough?
2662*53ee8cc1Swenshuai.xi     {
2663*53ee8cc1Swenshuai.xi         HAL_TSP_SetTSIF(i, E_TSP_TSIF_DIS, FALSE);
2664*53ee8cc1Swenshuai.xi     }
2665*53ee8cc1Swenshuai.xi     HAL_TSP_CPU(0);
2666*53ee8cc1Swenshuai.xi     HAL_TSP_Reset(1);
2667*53ee8cc1Swenshuai.xi     HAL_TSP_Power(0);
2668*53ee8cc1Swenshuai.xi }
2669*53ee8cc1Swenshuai.xi 
_TSP_SW_Exit(void)2670*53ee8cc1Swenshuai.xi static void _TSP_SW_Exit(void)
2671*53ee8cc1Swenshuai.xi {
2672*53ee8cc1Swenshuai.xi     int                 i;
2673*53ee8cc1Swenshuai.xi 
2674*53ee8cc1Swenshuai.xi     if(_ptsp_res->_s32TaskId != -1)
2675*53ee8cc1Swenshuai.xi     {
2676*53ee8cc1Swenshuai.xi         while(!_s32_IsrTaskReturn)
2677*53ee8cc1Swenshuai.xi         {
2678*53ee8cc1Swenshuai.xi             TSP_SetEvent(_s32EventId, TSP_EVENT_TASKEND);
2679*53ee8cc1Swenshuai.xi 
2680*53ee8cc1Swenshuai.xi #if defined (MSOS_TYPE_LINUX_KERNEL)
2681*53ee8cc1Swenshuai.xi             mdelay(TSP_POLLING_TASK_DELAY);
2682*53ee8cc1Swenshuai.xi #else
2683*53ee8cc1Swenshuai.xi             MsOS_DelayTask(TSP_POLLING_TASK_DELAY);
2684*53ee8cc1Swenshuai.xi #endif
2685*53ee8cc1Swenshuai.xi         }
2686*53ee8cc1Swenshuai.xi         _s32_IsrTaskReturn = FALSE;
2687*53ee8cc1Swenshuai.xi 
2688*53ee8cc1Swenshuai.xi         _ptsp_res->_s32TaskId = -1;
2689*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.bISRTaskEn = FALSE;
2690*53ee8cc1Swenshuai.xi     }
2691*53ee8cc1Swenshuai.xi 
2692*53ee8cc1Swenshuai.xi     if(_ptsp_res->_s32MutexId != -1)
2693*53ee8cc1Swenshuai.xi     {
2694*53ee8cc1Swenshuai.xi         TSP_OS_MutexRelease(_ptsp_res->_s32MutexId);
2695*53ee8cc1Swenshuai.xi         TSP_OS_MutexDelete(_ptsp_res->_s32MutexId);
2696*53ee8cc1Swenshuai.xi         _ptsp_res->_s32MutexId = -1;
2697*53ee8cc1Swenshuai.xi     }
2698*53ee8cc1Swenshuai.xi     if(_ptsp_res->_s32LockId != -1)
2699*53ee8cc1Swenshuai.xi     {
2700*53ee8cc1Swenshuai.xi         TSP_OS_MutexRelease(_ptsp_res->_s32LockId);
2701*53ee8cc1Swenshuai.xi         TSP_OS_MutexDelete(_ptsp_res->_s32LockId);
2702*53ee8cc1Swenshuai.xi         _ptsp_res->_s32LockId = -1;
2703*53ee8cc1Swenshuai.xi     }
2704*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2705*53ee8cc1Swenshuai.xi     spin_lock_init(&_ptsp_res->_s32IntRegMutexId);
2706*53ee8cc1Swenshuai.xi #else
2707*53ee8cc1Swenshuai.xi     if(_ptsp_res->_s32IntRegMutexId != -1)
2708*53ee8cc1Swenshuai.xi     {
2709*53ee8cc1Swenshuai.xi         TSP_OS_MutexRelease(_ptsp_res->_s32IntRegMutexId);
2710*53ee8cc1Swenshuai.xi         TSP_OS_MutexDelete(_ptsp_res->_s32IntRegMutexId);
2711*53ee8cc1Swenshuai.xi         _ptsp_res->_s32IntRegMutexId = -1;
2712*53ee8cc1Swenshuai.xi     }
2713*53ee8cc1Swenshuai.xi #endif
2714*53ee8cc1Swenshuai.xi     if(_ptsp_res->_s32PvrMutexId != -1)
2715*53ee8cc1Swenshuai.xi     {
2716*53ee8cc1Swenshuai.xi         TSP_OS_MutexRelease(_ptsp_res->_s32PvrMutexId);
2717*53ee8cc1Swenshuai.xi         TSP_OS_MutexDelete(_ptsp_res->_s32PvrMutexId);
2718*53ee8cc1Swenshuai.xi         _ptsp_res->_s32PvrMutexId = -1;
2719*53ee8cc1Swenshuai.xi     }
2720*53ee8cc1Swenshuai.xi 
2721*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
2722*53ee8cc1Swenshuai.xi     if(_s32EventId != -1)
2723*53ee8cc1Swenshuai.xi     {
2724*53ee8cc1Swenshuai.xi         TSP_OS_EventDelete(_s32EventId);
2725*53ee8cc1Swenshuai.xi         _s32EventId = -1;
2726*53ee8cc1Swenshuai.xi     }
2727*53ee8cc1Swenshuai.xi #endif
2728*53ee8cc1Swenshuai.xi 
2729*53ee8cc1Swenshuai.xi     for (i = 0; i < ((TSP_SECFLT_NUM+31)>>5); i++)
2730*53ee8cc1Swenshuai.xi     {
2731*53ee8cc1Swenshuai.xi         if(_s32SecRdyFlags[i] != -1)
2732*53ee8cc1Swenshuai.xi         {
2733*53ee8cc1Swenshuai.xi             TSP_OS_EventDelete(_s32SecRdyFlags[i]);
2734*53ee8cc1Swenshuai.xi             _s32SecRdyFlags[i] = -1;
2735*53ee8cc1Swenshuai.xi         }
2736*53ee8cc1Swenshuai.xi         if(_s32CrcErrFlags[i] != -1)
2737*53ee8cc1Swenshuai.xi         {
2738*53ee8cc1Swenshuai.xi             TSP_OS_EventDelete(_s32CrcErrFlags[i]);
2739*53ee8cc1Swenshuai.xi             _s32CrcErrFlags[i] = -1;
2740*53ee8cc1Swenshuai.xi         }
2741*53ee8cc1Swenshuai.xi         if(_s32SecOvfFlags[i] != -1)
2742*53ee8cc1Swenshuai.xi         {
2743*53ee8cc1Swenshuai.xi             TSP_OS_EventDelete(_s32SecOvfFlags[i]);
2744*53ee8cc1Swenshuai.xi             _s32SecOvfFlags[i] = -1;
2745*53ee8cc1Swenshuai.xi         }
2746*53ee8cc1Swenshuai.xi         if(_s32FltDisFlags[i] != -1)
2747*53ee8cc1Swenshuai.xi         {
2748*53ee8cc1Swenshuai.xi             TSP_OS_EventDelete(_s32FltDisFlags[i]);
2749*53ee8cc1Swenshuai.xi             _s32FltDisFlags[i] = -1;
2750*53ee8cc1Swenshuai.xi         }
2751*53ee8cc1Swenshuai.xi         if(_s32FreeFlags[i] != -1)
2752*53ee8cc1Swenshuai.xi         {
2753*53ee8cc1Swenshuai.xi             TSP_OS_EventDelete(_s32FreeFlags[i]);
2754*53ee8cc1Swenshuai.xi             _s32FreeFlags[i] = -1;
2755*53ee8cc1Swenshuai.xi         }
2756*53ee8cc1Swenshuai.xi         if(_s32DoneFlags[i] != -1)
2757*53ee8cc1Swenshuai.xi         {
2758*53ee8cc1Swenshuai.xi             TSP_OS_EventDelete(_s32DoneFlags[i]);
2759*53ee8cc1Swenshuai.xi             _s32DoneFlags[i] = -1;
2760*53ee8cc1Swenshuai.xi         }
2761*53ee8cc1Swenshuai.xi     }
2762*53ee8cc1Swenshuai.xi     _MDrv_TSP_FLT_ResetFltId();
2763*53ee8cc1Swenshuai.xi 
2764*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
2765*53ee8cc1Swenshuai.xi         MDrv_TSP_Ree_TeeCmdSystem_Exit();
2766*53ee8cc1Swenshuai.xi #endif
2767*53ee8cc1Swenshuai.xi 
2768*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.bSWInit = FALSE;
2769*53ee8cc1Swenshuai.xi }
2770*53ee8cc1Swenshuai.xi 
_TSP_Drv_DmxFlow2PVREng_Mapping(DRV_TSP_FLOW DmxFlow)2771*53ee8cc1Swenshuai.xi static MS_U32 _TSP_Drv_DmxFlow2PVREng_Mapping(DRV_TSP_FLOW DmxFlow)
2772*53ee8cc1Swenshuai.xi {
2773*53ee8cc1Swenshuai.xi     switch (DmxFlow)
2774*53ee8cc1Swenshuai.xi     {
2775*53ee8cc1Swenshuai.xi         case E_DRV_TSP_FLOW_PVR0:
2776*53ee8cc1Swenshuai.xi             return 0;
2777*53ee8cc1Swenshuai.xi             break;
2778*53ee8cc1Swenshuai.xi         case E_DRV_TSP_FLOW_PVR1:
2779*53ee8cc1Swenshuai.xi             return 1;
2780*53ee8cc1Swenshuai.xi             break;
2781*53ee8cc1Swenshuai.xi         case E_DRV_TSP_FLOW_PVR2:
2782*53ee8cc1Swenshuai.xi             return 2;
2783*53ee8cc1Swenshuai.xi             break;
2784*53ee8cc1Swenshuai.xi         case E_DRV_TSP_FLOW_PVR3:
2785*53ee8cc1Swenshuai.xi             return 3;
2786*53ee8cc1Swenshuai.xi             break;
2787*53ee8cc1Swenshuai.xi         default:
2788*53ee8cc1Swenshuai.xi             return 0xFFFFFFFF;
2789*53ee8cc1Swenshuai.xi             break;
2790*53ee8cc1Swenshuai.xi     }
2791*53ee8cc1Swenshuai.xi }
2792*53ee8cc1Swenshuai.xi 
2793*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
2794*53ee8cc1Swenshuai.xi //  Global Functions
2795*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
2796*53ee8cc1Swenshuai.xi 
2797*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
2798*53ee8cc1Swenshuai.xi /// Initialize lib resource API
2799*53ee8cc1Swenshuai.xi /// @param pu32ResMemAddr                \b IN: Pointer to store resource memory address
2800*53ee8cc1Swenshuai.xi /// @return TSP_Result
2801*53ee8cc1Swenshuai.xi /// @note
2802*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_InitLibResource(void * pu32ResMemAddr)2803*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_InitLibResource(void *pu32ResMemAddr)
2804*53ee8cc1Swenshuai.xi {
2805*53ee8cc1Swenshuai.xi     TSP_CHECK((pu32ResMemAddr != 0),
2806*53ee8cc1Swenshuai.xi         "[TSP_ERROR][%s][%06d] pointer is NULL!\n", __FUNCTION__, __LINE__);
2807*53ee8cc1Swenshuai.xi 
2808*53ee8cc1Swenshuai.xi     MS_VIRT u32Base;
2809*53ee8cc1Swenshuai.xi     MS_PHY u32Size;
2810*53ee8cc1Swenshuai.xi 
2811*53ee8cc1Swenshuai.xi     _ptsp_res = (TSP_RESOURCE_PRIVATE*)pu32ResMemAddr;
2812*53ee8cc1Swenshuai.xi 
2813*53ee8cc1Swenshuai.xi     //  For multi-process use case, driver will direct return to avoid re-init HW again on api layer thus the second process will not set bank.
2814*53ee8cc1Swenshuai.xi     // And the parameter on hal layer is static (ex:bank base), so the bank base on the second process will be NULL.
2815*53ee8cc1Swenshuai.xi     // We need to avoid this case thus we set bank again on initLibResource function.
2816*53ee8cc1Swenshuai.xi     if(_ptsp_res->_tspInfo.bSWInit != TRUE)
2817*53ee8cc1Swenshuai.xi     {
2818*53ee8cc1Swenshuai.xi         if(_TSP_InitResource(_ptsp_res) == FALSE)
2819*53ee8cc1Swenshuai.xi             return E_TSP_FAIL;
2820*53ee8cc1Swenshuai.xi     }
2821*53ee8cc1Swenshuai.xi     else
2822*53ee8cc1Swenshuai.xi     {
2823*53ee8cc1Swenshuai.xi         if(_bBankInit == FALSE)
2824*53ee8cc1Swenshuai.xi         {
2825*53ee8cc1Swenshuai.xi             MDrv_MMIO_Init();
2826*53ee8cc1Swenshuai.xi             if (FALSE == MDrv_MMIO_GetBASE(&u32Base, &u32Size, MS_MODULE_HW))
2827*53ee8cc1Swenshuai.xi             {
2828*53ee8cc1Swenshuai.xi                 TSP_OS_Print("Get MS_MODULE_PM fail\n");
2829*53ee8cc1Swenshuai.xi                 MS_ASSERT(0);
2830*53ee8cc1Swenshuai.xi             }
2831*53ee8cc1Swenshuai.xi             HAL_TSP_SetBank(u32Base);
2832*53ee8cc1Swenshuai.xi             _bBankInit = TRUE;
2833*53ee8cc1Swenshuai.xi         }
2834*53ee8cc1Swenshuai.xi     }
2835*53ee8cc1Swenshuai.xi 
2836*53ee8cc1Swenshuai.xi     return E_TSP_OK;
2837*53ee8cc1Swenshuai.xi }
2838*53ee8cc1Swenshuai.xi 
2839*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
2840*53ee8cc1Swenshuai.xi /// Initialize TSP driver and TSP engine
2841*53ee8cc1Swenshuai.xi /// @return TSP_Result
2842*53ee8cc1Swenshuai.xi /// @note
2843*53ee8cc1Swenshuai.xi /// It should be called before calling any other TSP DDI functions.
2844*53ee8cc1Swenshuai.xi /// Driver task is in @ref E_TASK_PRI_SYS level.
2845*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Init(TSP_InitParam * pParam)2846*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Init(TSP_InitParam *pParam)
2847*53ee8cc1Swenshuai.xi {
2848*53ee8cc1Swenshuai.xi     MS_VIRT             u32Base;
2849*53ee8cc1Swenshuai.xi     MS_PHY              u32Size;
2850*53ee8cc1Swenshuai.xi     MS_U32              *u32Check;
2851*53ee8cc1Swenshuai.xi     TSP_Result          ret;
2852*53ee8cc1Swenshuai.xi 
2853*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
2854*53ee8cc1Swenshuai.xi     if(MDrv_TSP_Ree_TeeCmdSystem_Init() == E_TSP_FAIL)
2855*53ee8cc1Swenshuai.xi     {
2856*53ee8cc1Swenshuai.xi         MS_DEBUG_MSG(TSP_DBG ("[%s] Register Mailbox failed!\n", __FUNCTION__));
2857*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
2858*53ee8cc1Swenshuai.xi     }
2859*53ee8cc1Swenshuai.xi #endif //SECURE_PVR_ENABLE
2860*53ee8cc1Swenshuai.xi 
2861*53ee8cc1Swenshuai.xi     // MDrv_DSCMB_Init(); // sometimes good/bad // random
2862*53ee8cc1Swenshuai.xi     MDrv_MMIO_Init();
2863*53ee8cc1Swenshuai.xi #if 1
2864*53ee8cc1Swenshuai.xi     if (FALSE == MDrv_MMIO_GetBASE(&u32Base, &u32Size, MS_MODULE_HW))
2865*53ee8cc1Swenshuai.xi     {
2866*53ee8cc1Swenshuai.xi         TSP_OS_Print("Get MS_MODULE_PM fail\n");
2867*53ee8cc1Swenshuai.xi         MS_ASSERT(0);
2868*53ee8cc1Swenshuai.xi     }
2869*53ee8cc1Swenshuai.xi     HAL_TSP_SetBank(u32Base);
2870*53ee8cc1Swenshuai.xi 
2871*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_INFO, "MMIO(MS_MODULE_PM) 0x%08x\n", u32Base);
2872*53ee8cc1Swenshuai.xi #else
2873*53ee8cc1Swenshuai.xi     if (FALSE == MDrv_MMIO_GetBASE(&u32Base, &u32Size, MS_MODULE_TSP))
2874*53ee8cc1Swenshuai.xi     {
2875*53ee8cc1Swenshuai.xi         TSP_OS_Print("Get MS_MODULE_TSP fail\n");
2876*53ee8cc1Swenshuai.xi         MS_ASSERT(0);
2877*53ee8cc1Swenshuai.xi     }
2878*53ee8cc1Swenshuai.xi     HAL_TSP_RegMap(u32Base);
2879*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_INFO, "MMIO(MS_MODULE_TSP) 0x%08lx\n", u32Base);
2880*53ee8cc1Swenshuai.xi 
2881*53ee8cc1Swenshuai.xi     if (FALSE == MDrv_MMIO_GetBASE(&u32Base, &u32Size, MS_MODULE_HW))
2882*53ee8cc1Swenshuai.xi     {
2883*53ee8cc1Swenshuai.xi         TSP_OS_Print("Get MS_MODULE_HW fail\n");
2884*53ee8cc1Swenshuai.xi         MS_ASSERT(0);
2885*53ee8cc1Swenshuai.xi     }
2886*53ee8cc1Swenshuai.xi     // MDrv_DSCMB_Init(); // sometimes good/bad // random
2887*53ee8cc1Swenshuai.xi     HAL_TSP_HW_RegMap(u32Base);
2888*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_INFO, "MMIO(MS_MODULE_HW) 0x%08lx\n", u32Base);
2889*53ee8cc1Swenshuai.xi 
2890*53ee8cc1Swenshuai.xi 
2891*53ee8cc1Swenshuai.xi     if (FALSE == MDrv_MMIO_GetBASE(&u32Base, &u32Size, MS_MODULE_PM))
2892*53ee8cc1Swenshuai.xi     {
2893*53ee8cc1Swenshuai.xi         TSP_OS_Print("Get MS_MODULE_PM fail\n");
2894*53ee8cc1Swenshuai.xi         MS_ASSERT(0);
2895*53ee8cc1Swenshuai.xi     }
2896*53ee8cc1Swenshuai.xi     HAL_TSP_PM_RegMap(u32Base);
2897*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_INFO, "MMIO(MS_MODULE_PM) 0x%08lx\n", u32Base);
2898*53ee8cc1Swenshuai.xi #endif
2899*53ee8cc1Swenshuai.xi 
2900*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_MUST, "************************ Start TSP_Init ************************\n");
2901*53ee8cc1Swenshuai.xi 
2902*53ee8cc1Swenshuai.xi 
2903*53ee8cc1Swenshuai.xi 
2904*53ee8cc1Swenshuai.xi     u32Check = (MS_U32*)MsOS_PA2KSEG1(pParam->phyFWAddr);
2905*53ee8cc1Swenshuai.xi 
2906*53ee8cc1Swenshuai.xi     if (strcmp((char*)u32Check,FWTSP_CHECK_CODE) != 0 )
2907*53ee8cc1Swenshuai.xi     {
2908*53ee8cc1Swenshuai.xi         TSP_OS_Print("**** [TSP Firmware] Check Fail ****\n");
2909*53ee8cc1Swenshuai.xi     }
2910*53ee8cc1Swenshuai.xi     TSP_OS_Print(" %s : ",(char*)u32Check);
2911*53ee8cc1Swenshuai.xi 
2912*53ee8cc1Swenshuai.xi     memcpy(&(_ptsp_res->_tspInfo.Param), pParam, sizeof(TSP_InitParam));
2913*53ee8cc1Swenshuai.xi     if (E_TSP_OK != (ret = _TSP_Init(TRUE, FALSE)))
2914*53ee8cc1Swenshuai.xi     {
2915*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "************************   TSP [FAIL]   ************************\n");
2916*53ee8cc1Swenshuai.xi         return ret;
2917*53ee8cc1Swenshuai.xi     }
2918*53ee8cc1Swenshuai.xi     // MDrv_DSCMB_Init(); // bad
2919*53ee8cc1Swenshuai.xi 
2920*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_MUST, "************************* End TSP_Init *************************\n");
2921*53ee8cc1Swenshuai.xi 
2922*53ee8cc1Swenshuai.xi 
2923*53ee8cc1Swenshuai.xi     //[NOTE] Switch Uart0 port to TSP
2924*53ee8cc1Swenshuai.xi     #if SWITCH_TSP_UART
2925*53ee8cc1Swenshuai.xi     _TSP_Switch_Uart();
2926*53ee8cc1Swenshuai.xi     #endif
2927*53ee8cc1Swenshuai.xi 
2928*53ee8cc1Swenshuai.xi     return E_TSP_OK;
2929*53ee8cc1Swenshuai.xi }
2930*53ee8cc1Swenshuai.xi 
2931*53ee8cc1Swenshuai.xi 
2932*53ee8cc1Swenshuai.xi 
2933*53ee8cc1Swenshuai.xi 
2934*53ee8cc1Swenshuai.xi 
2935*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
2936*53ee8cc1Swenshuai.xi /// Close TSP driver and reset software/register state
2937*53ee8cc1Swenshuai.xi /// @return TSP_Result
2938*53ee8cc1Swenshuai.xi /// @note
2939*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Exit(void)2940*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Exit(void)
2941*53ee8cc1Swenshuai.xi {
2942*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK , "%s\n", __FUNCTION__);
2943*53ee8cc1Swenshuai.xi 
2944*53ee8cc1Swenshuai.xi     MS_PHY  u32Size=0;
2945*53ee8cc1Swenshuai.xi     MS_VIRT u32Base=0;
2946*53ee8cc1Swenshuai.xi     MS_BOOL bEnterEntry = FALSE;
2947*53ee8cc1Swenshuai.xi     MS_U32  i = 0;
2948*53ee8cc1Swenshuai.xi 
2949*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_MUST, "============[%s] TSP Exit Start ==============\n",__FUNCTION__);
2950*53ee8cc1Swenshuai.xi 
2951*53ee8cc1Swenshuai.xi     if (_ptsp_res->_s32MutexId != -1 )
2952*53ee8cc1Swenshuai.xi     {
2953*53ee8cc1Swenshuai.xi         TSP_ENTRY();
2954*53ee8cc1Swenshuai.xi         bEnterEntry = TRUE;
2955*53ee8cc1Swenshuai.xi     }
2956*53ee8cc1Swenshuai.xi 
2957*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
2958*53ee8cc1Swenshuai.xi     if (_ptsp_res->_s32IntRegMutexId != -1 )
2959*53ee8cc1Swenshuai.xi     {
2960*53ee8cc1Swenshuai.xi         _TSP_INT_LOCK();
2961*53ee8cc1Swenshuai.xi     }
2962*53ee8cc1Swenshuai.xi #endif
2963*53ee8cc1Swenshuai.xi 
2964*53ee8cc1Swenshuai.xi     if (_ptsp_res->_s32PvrMutexId != -1 )
2965*53ee8cc1Swenshuai.xi     {
2966*53ee8cc1Swenshuai.xi         TSP_PVR_ENTRY();
2967*53ee8cc1Swenshuai.xi     }
2968*53ee8cc1Swenshuai.xi 
2969*53ee8cc1Swenshuai.xi 
2970*53ee8cc1Swenshuai.xi     if (FALSE == MDrv_MMIO_GetBASE(&u32Base, &u32Size, MS_MODULE_HW))
2971*53ee8cc1Swenshuai.xi     {
2972*53ee8cc1Swenshuai.xi         TSP_OS_Print("Get MS_MODULE_PM fail\n");
2973*53ee8cc1Swenshuai.xi         MS_ASSERT(0);
2974*53ee8cc1Swenshuai.xi     }
2975*53ee8cc1Swenshuai.xi     HAL_TSP_SetBank(u32Base);
2976*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_INFO, "MMIO(MS_MODULE_PM) 0x" MPRI_VIRT "\n", u32Base);
2977*53ee8cc1Swenshuai.xi 
2978*53ee8cc1Swenshuai.xi 
2979*53ee8cc1Swenshuai.xi     if (!HAL_TSP_HCMD_Alive())
2980*53ee8cc1Swenshuai.xi     {
2981*53ee8cc1Swenshuai.xi 
2982*53ee8cc1Swenshuai.xi         MS_U32                 Pcr_H, Pcr;
2983*53ee8cc1Swenshuai.xi 
2984*53ee8cc1Swenshuai.xi         HAL_TSP_Power(1);
2985*53ee8cc1Swenshuai.xi 
2986*53ee8cc1Swenshuai.xi         HAL_TSP_INT_Disable(TSP_HWINT_ALL|(TSP_HWINT2_ALL<<8)|(TSP_HWINT3_ALL<<16));
2987*53ee8cc1Swenshuai.xi 
2988*53ee8cc1Swenshuai.xi         //always read PCR after PCR interrupt has been disabled or cleared to avoid that interrupt's not trggering again.
2989*53ee8cc1Swenshuai.xi         for (i = 0; i < TSP_PCRFLT_NUM; i++)
2990*53ee8cc1Swenshuai.xi         {
2991*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_GetPcr(i, &Pcr_H, &Pcr);
2992*53ee8cc1Swenshuai.xi         }
2993*53ee8cc1Swenshuai.xi         //HAL_TSP_HW_Lock_Init(); //@F_TODO HW lock is a mechanism we use to avoid race between HK and TSP CPU for those register like filter disable and stc but we dont need that anymore
2994*53ee8cc1Swenshuai.xi 
2995*53ee8cc1Swenshuai.xi         HAL_TSP_Reset(1);
2996*53ee8cc1Swenshuai.xi         HAL_TSP_Reset(0); // indirect access activated, WB reset, CMDQ reset
2997*53ee8cc1Swenshuai.xi     }
2998*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.Status = E_TSP_SW_EXIT;
2999*53ee8cc1Swenshuai.xi 
3000*53ee8cc1Swenshuai.xi     // SW driver state
3001*53ee8cc1Swenshuai.xi     _TSP_SW_ResetState();
3002*53ee8cc1Swenshuai.xi     // HW filter state
3003*53ee8cc1Swenshuai.xi     _TSP_HW_ResetState();
3004*53ee8cc1Swenshuai.xi 
3005*53ee8cc1Swenshuai.xi     _TSP_Exit();
3006*53ee8cc1Swenshuai.xi     _TSP_SW_Exit();
3007*53ee8cc1Swenshuai.xi 
3008*53ee8cc1Swenshuai.xi     if ( TRUE == bEnterEntry )
3009*53ee8cc1Swenshuai.xi     {
3010*53ee8cc1Swenshuai.xi         MDrv_SEM_Unlock(E_SEM_CA);
3011*53ee8cc1Swenshuai.xi     }
3012*53ee8cc1Swenshuai.xi 
3013*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_MUST, "============[%s] TSP Exit End ============\n",__FUNCTION__);
3014*53ee8cc1Swenshuai.xi 
3015*53ee8cc1Swenshuai.xi     return E_TSP_OK;
3016*53ee8cc1Swenshuai.xi }
3017*53ee8cc1Swenshuai.xi 
3018*53ee8cc1Swenshuai.xi 
3019*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3020*53ee8cc1Swenshuai.xi /// Poweroff TSP driver and TSP engine
3021*53ee8cc1Swenshuai.xi /// @return TSP_Result
3022*53ee8cc1Swenshuai.xi /// @note
3023*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PowerOff(void)3024*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PowerOff(void)
3025*53ee8cc1Swenshuai.xi {
3026*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
3027*53ee8cc1Swenshuai.xi 
3028*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3029*53ee8cc1Swenshuai.xi 
3030*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.Status = E_TSP_SW_POWEROFF;
3031*53ee8cc1Swenshuai.xi 
3032*53ee8cc1Swenshuai.xi     _TSP_Exit();
3033*53ee8cc1Swenshuai.xi     _TSP_SW_Exit();
3034*53ee8cc1Swenshuai.xi     MDrv_SEM_Unlock(E_SEM_CA);
3035*53ee8cc1Swenshuai.xi 
3036*53ee8cc1Swenshuai.xi     return E_TSP_OK;
3037*53ee8cc1Swenshuai.xi }
3038*53ee8cc1Swenshuai.xi 
3039*53ee8cc1Swenshuai.xi 
3040*53ee8cc1Swenshuai.xi ///[RESERVED]
MDrv_TSP_Reset(void)3041*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Reset(void)
3042*53ee8cc1Swenshuai.xi {
3043*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
3044*53ee8cc1Swenshuai.xi 
3045*53ee8cc1Swenshuai.xi     if(_ptsp_res->_tspInfo.bSWInit != TRUE)
3046*53ee8cc1Swenshuai.xi     {
3047*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[%s][%d] Please call MDrv_TSP_Init() first\n", __FUNCTION__, __LINE__);
3048*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
3049*53ee8cc1Swenshuai.xi     }
3050*53ee8cc1Swenshuai.xi 
3051*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3052*53ee8cc1Swenshuai.xi 
3053*53ee8cc1Swenshuai.xi     _TSP_Init(TRUE, FALSE);
3054*53ee8cc1Swenshuai.xi 
3055*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
3056*53ee8cc1Swenshuai.xi 
3057*53ee8cc1Swenshuai.xi }
3058*53ee8cc1Swenshuai.xi 
3059*53ee8cc1Swenshuai.xi 
3060*53ee8cc1Swenshuai.xi //[RESERVED]
MDrv_TSP_Suspend(void)3061*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Suspend(void)
3062*53ee8cc1Swenshuai.xi {
3063*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
3064*53ee8cc1Swenshuai.xi 
3065*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3066*53ee8cc1Swenshuai.xi 
3067*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.Status = E_TSP_SW_SUSPEND;
3068*53ee8cc1Swenshuai.xi 
3069*53ee8cc1Swenshuai.xi     HAL_TSP_SaveFltState();
3070*53ee8cc1Swenshuai.xi 
3071*53ee8cc1Swenshuai.xi     _TSP_Exit();
3072*53ee8cc1Swenshuai.xi     _TSP_SW_Exit();
3073*53ee8cc1Swenshuai.xi 
3074*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.bSuspend = TRUE;
3075*53ee8cc1Swenshuai.xi 
3076*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
3077*53ee8cc1Swenshuai.xi }
3078*53ee8cc1Swenshuai.xi 
3079*53ee8cc1Swenshuai.xi 
3080*53ee8cc1Swenshuai.xi //[RESERVED]
MDrv_TSP_Resume(MS_U32 u32FWAddr,MS_U32 u32FWSize)3081*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Resume(MS_U32 u32FWAddr, MS_U32 u32FWSize)
3082*53ee8cc1Swenshuai.xi {
3083*53ee8cc1Swenshuai.xi     TSP_Result          ret;
3084*53ee8cc1Swenshuai.xi 
3085*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
3086*53ee8cc1Swenshuai.xi 
3087*53ee8cc1Swenshuai.xi     // we can't operate TSP register before power on
3088*53ee8cc1Swenshuai.xi     // HAL_TSP_Reset(1);
3089*53ee8cc1Swenshuai.xi     // HAL_TSP_Reset(0);
3090*53ee8cc1Swenshuai.xi     // HAL_TSP_HwPatch();
3091*53ee8cc1Swenshuai.xi     // MsOS_DelayTask(500);
3092*53ee8cc1Swenshuai.xi 
3093*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.Status = E_TSP_SW_RESUME;
3094*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.bSuspend = FALSE;
3095*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.Param.phyFWAddr = u32FWAddr;
3096*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.Param.u32FWSize = u32FWSize;
3097*53ee8cc1Swenshuai.xi 
3098*53ee8cc1Swenshuai.xi     ret = _TSP_Init(FALSE, TRUE);
3099*53ee8cc1Swenshuai.xi 
3100*53ee8cc1Swenshuai.xi     return ret;
3101*53ee8cc1Swenshuai.xi }
3102*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_SetFlowSource(MS_U32 u32Eng,MS_U32 u32PvrSrc)3103*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_SetFlowSource(MS_U32 u32Eng, MS_U32 u32PvrSrc)
3104*53ee8cc1Swenshuai.xi {
3105*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
3106*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3107*53ee8cc1Swenshuai.xi 
3108*53ee8cc1Swenshuai.xi     MS_U32 u32FltSrc = E_TSP_FLT_SRC_MASK & u32PvrSrc;
3109*53ee8cc1Swenshuai.xi     TSP_PIDFLT_SRC ePidFltSrc = _TSP_DrvHal_FltSrcMapping(u32FltSrc);
3110*53ee8cc1Swenshuai.xi     MS_U32 u32Tid = HAL_TSP_FltSrc2PktDmx_Mapping(ePidFltSrc);
3111*53ee8cc1Swenshuai.xi 
3112*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(u32Tid);
3113*53ee8cc1Swenshuai.xi 
3114*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
3115*53ee8cc1Swenshuai.xi     {
3116*53ee8cc1Swenshuai.xi         HAL_PVR_Init(u32Eng, u32Tid);
3117*53ee8cc1Swenshuai.xi     }
3118*53ee8cc1Swenshuai.xi     else
3119*53ee8cc1Swenshuai.xi     {
3120*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
3121*53ee8cc1Swenshuai.xi     }
3122*53ee8cc1Swenshuai.xi 
3123*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
3124*53ee8cc1Swenshuai.xi }
3125*53ee8cc1Swenshuai.xi 
MDrv_TSP_SetFlowSource(DRV_TSP_FLOW DmxFlow,TSP_TSId eTid)3126*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetFlowSource(DRV_TSP_FLOW DmxFlow, TSP_TSId eTid)
3127*53ee8cc1Swenshuai.xi {
3128*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
3129*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3130*53ee8cc1Swenshuai.xi 
3131*53ee8cc1Swenshuai.xi     // @F_TODO add another layer for adaption, concider for flexibility
3132*53ee8cc1Swenshuai.xi     // @NOTE PVR has no source mmfi take care
3133*53ee8cc1Swenshuai.xi     // @NOTE setting FIFO SRC is moved to MDrv_TSP_FLT_Enable()
3134*53ee8cc1Swenshuai.xi     // @NOTE because setting flowset playback may be for record...
3135*53ee8cc1Swenshuai.xi     if (   (DmxFlow == E_DRV_TSP_FLOW_PLAYBACK0) || (DmxFlow == E_DRV_TSP_FLOW_PLAYBACK1)
3136*53ee8cc1Swenshuai.xi         || (DmxFlow == E_DRV_TSP_FLOW_PLAYBACK2) || (DmxFlow == E_DRV_TSP_FLOW_PLAYBACK3)
3137*53ee8cc1Swenshuai.xi         || (DmxFlow == E_DRV_TSP_FLOW_PLAYBACK4) || (DmxFlow == E_DRV_TSP_FLOW_PLAYBACK5)
3138*53ee8cc1Swenshuai.xi         || (DmxFlow == E_DRV_TSP_FLOW_PLAYBACK6)    )
3139*53ee8cc1Swenshuai.xi     {
3140*53ee8cc1Swenshuai.xi         /*
3141*53ee8cc1Swenshuai.xi         if (DmxFlow == E_DRV_TSP_FLOW_PLAYBACK0)
3142*53ee8cc1Swenshuai.xi         {
3143*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_SetSrc(E_TSP_DST_FIFO_AUDIO, eTid); //@FIXME change pktdmx id don't use drv.h enum as parameter to hal layer
3144*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_SetSrc(E_TSP_DST_FIFO_VIDEO, eTid);
3145*53ee8cc1Swenshuai.xi         }
3146*53ee8cc1Swenshuai.xi         else if (DmxFlow == E_DRV_TSP_FLOW_PLAYBACK1)
3147*53ee8cc1Swenshuai.xi         {
3148*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_SetSrc(E_TSP_DST_FIFO_AUDIO2 , eTid); //@FIXME change pktdmx id don't use drv.h enum as parameter to hal layer
3149*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_SetSrc(E_TSP_DST_FIFO_VIDEO3D, eTid);
3150*53ee8cc1Swenshuai.xi         }
3151*53ee8cc1Swenshuai.xi         */
3152*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_OK);
3153*53ee8cc1Swenshuai.xi     }
3154*53ee8cc1Swenshuai.xi     else if ((DmxFlow == E_DRV_TSP_FLOW_PVR0) || (DmxFlow == E_DRV_TSP_FLOW_PVR1) || (DmxFlow == E_DRV_TSP_FLOW_PVR2) || (DmxFlow == E_DRV_TSP_FLOW_PVR3))
3155*53ee8cc1Swenshuai.xi     {
3156*53ee8cc1Swenshuai.xi         MS_U32 u32pktDmxId = (MS_U32)eTid;
3157*53ee8cc1Swenshuai.xi         MS_U32 u32Eng = _TSP_Drv_DmxFlow2PVREng_Mapping(DmxFlow);
3158*53ee8cc1Swenshuai.xi         TSP_SRC_SEQ ePktDmx = HAL_TSP_Eng2PktDmx_Mapping(u32Eng);
3159*53ee8cc1Swenshuai.xi         switch(ePktDmx)
3160*53ee8cc1Swenshuai.xi         {
3161*53ee8cc1Swenshuai.xi             case E_TSP_SRC_PKTDMX0:
3162*53ee8cc1Swenshuai.xi                 u32pktDmxId = 0;
3163*53ee8cc1Swenshuai.xi                 break;
3164*53ee8cc1Swenshuai.xi             case E_TSP_SRC_PKTDMX1:
3165*53ee8cc1Swenshuai.xi                 u32pktDmxId = 1;
3166*53ee8cc1Swenshuai.xi                 break;
3167*53ee8cc1Swenshuai.xi             case E_TSP_SRC_PKTDMX2:
3168*53ee8cc1Swenshuai.xi                 u32pktDmxId = 2;
3169*53ee8cc1Swenshuai.xi                 break;
3170*53ee8cc1Swenshuai.xi             case E_TSP_SRC_PKTDMX3:
3171*53ee8cc1Swenshuai.xi                 u32pktDmxId = 3;
3172*53ee8cc1Swenshuai.xi                 break;
3173*53ee8cc1Swenshuai.xi             case E_TSP_SRC_PKTDMX4:
3174*53ee8cc1Swenshuai.xi                 u32pktDmxId = 4;
3175*53ee8cc1Swenshuai.xi                 break;
3176*53ee8cc1Swenshuai.xi             case E_TSP_SRC_PKTDMX5:
3177*53ee8cc1Swenshuai.xi                 u32pktDmxId = 5;
3178*53ee8cc1Swenshuai.xi                 break;
3179*53ee8cc1Swenshuai.xi             default:
3180*53ee8cc1Swenshuai.xi                 u32pktDmxId = 0;
3181*53ee8cc1Swenshuai.xi                 TSP_DBG(E_TSP_DBG_MUST, "[TSP_ERR][%s][%d] Wrong PktDmx type!!!\n",__FUNCTION__,__LINE__);
3182*53ee8cc1Swenshuai.xi                 break;
3183*53ee8cc1Swenshuai.xi         }
3184*53ee8cc1Swenshuai.xi 
3185*53ee8cc1Swenshuai.xi         if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
3186*53ee8cc1Swenshuai.xi         {
3187*53ee8cc1Swenshuai.xi             HAL_PVR_Init(u32Eng, u32pktDmxId);
3188*53ee8cc1Swenshuai.xi         }
3189*53ee8cc1Swenshuai.xi         else
3190*53ee8cc1Swenshuai.xi         {
3191*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
3192*53ee8cc1Swenshuai.xi         }
3193*53ee8cc1Swenshuai.xi     }
3194*53ee8cc1Swenshuai.xi     else if ((DmxFlow == E_DRV_TSP_FLOW_TSO0) || (DmxFlow == E_DRV_TSP_FLOW_TSO1))
3195*53ee8cc1Swenshuai.xi     {
3196*53ee8cc1Swenshuai.xi         //@F_TODO not implement yet
3197*53ee8cc1Swenshuai.xi         //@F_TODO remember to change TSO src to pktdmx
3198*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL);
3199*53ee8cc1Swenshuai.xi     }
3200*53ee8cc1Swenshuai.xi     else
3201*53ee8cc1Swenshuai.xi     {
3202*53ee8cc1Swenshuai.xi         // @FIXME add error msg
3203*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL);
3204*53ee8cc1Swenshuai.xi     }
3205*53ee8cc1Swenshuai.xi 
3206*53ee8cc1Swenshuai.xi 
3207*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
3208*53ee8cc1Swenshuai.xi }
3209*53ee8cc1Swenshuai.xi 
3210*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3211*53ee8cc1Swenshuai.xi /// Select ChipTop PAD for ts0 and ts1
3212*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
3213*53ee8cc1Swenshuai.xi /// @param  eIf                     \b IN: TSP TS interface
3214*53ee8cc1Swenshuai.xi /// @param  pIfSet                  \b IN: TS interface setting
3215*53ee8cc1Swenshuai.xi /// @return TSP_Result
3216*53ee8cc1Swenshuai.xi /// @note
3217*53ee8cc1Swenshuai.xi /// Uranus: only can select pad0/pad1 to ts0
3218*53ee8cc1Swenshuai.xi /// Oberon: can select pad0/pad1 to ts0, pad0/pad1 to ts1.
3219*53ee8cc1Swenshuai.xi ///         Default setting was pad0->ts0, pad1->ts1.
3220*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SelPad(TSP_TSIF eTSIF,TSP_TSPad eTSPad)3221*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SelPad(TSP_TSIF eTSIF, TSP_TSPad eTSPad)
3222*53ee8cc1Swenshuai.xi {
3223*53ee8cc1Swenshuai.xi     TSP_Result          ret;
3224*53ee8cc1Swenshuai.xi     TSP_TS_PAD          ePad = E_TSP_TS_PAD_INVALID;
3225*53ee8cc1Swenshuai.xi     MS_U32 u32TSIF = 0;
3226*53ee8cc1Swenshuai.xi 
3227*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
3228*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3229*53ee8cc1Swenshuai.xi 
3230*53ee8cc1Swenshuai.xi     ePad = _TSP_DrvHal_PadMapping(eTSPad);
3231*53ee8cc1Swenshuai.xi 
3232*53ee8cc1Swenshuai.xi     if((eTSPad >= E_TSP_TS_PAD0_3WIRE) && (eTSPad <= E_TSP_TS_PAD7_3WIRE))
3233*53ee8cc1Swenshuai.xi     {
3234*53ee8cc1Swenshuai.xi         HAL_TSP_PAD_3Wire(ePad, TRUE);
3235*53ee8cc1Swenshuai.xi     }
3236*53ee8cc1Swenshuai.xi     else
3237*53ee8cc1Swenshuai.xi     {
3238*53ee8cc1Swenshuai.xi         HAL_TSP_PAD_3Wire(ePad, FALSE);
3239*53ee8cc1Swenshuai.xi     }
3240*53ee8cc1Swenshuai.xi 
3241*53ee8cc1Swenshuai.xi     TSP_HAL_TSIF eHalTSIF = _TSP_DrvHal_TSIFMapping(eTSIF);
3242*53ee8cc1Swenshuai.xi     u32TSIF = HAL_TSP_TsifMapping(eHalTSIF, FALSE);
3243*53ee8cc1Swenshuai.xi 
3244*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(u32TSIF);
3245*53ee8cc1Swenshuai.xi 
3246*53ee8cc1Swenshuai.xi     if (HAL_TSP_TSIF_SelPad(u32TSIF, ePad))
3247*53ee8cc1Swenshuai.xi     {
3248*53ee8cc1Swenshuai.xi         _ptsp_res->TsIf_Src[u32TSIF].ePad= eTSPad;
3249*53ee8cc1Swenshuai.xi         ret = E_TSP_OK;
3250*53ee8cc1Swenshuai.xi     }
3251*53ee8cc1Swenshuai.xi     else
3252*53ee8cc1Swenshuai.xi     {
3253*53ee8cc1Swenshuai.xi         ret = E_TSP_FAIL;
3254*53ee8cc1Swenshuai.xi     }
3255*53ee8cc1Swenshuai.xi 
3256*53ee8cc1Swenshuai.xi     TSP_RETURN(ret);
3257*53ee8cc1Swenshuai.xi }
3258*53ee8cc1Swenshuai.xi 
3259*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3260*53ee8cc1Swenshuai.xi ///// Set TSP MUX Clk Invert mode
3261*53ee8cc1Swenshuai.xi ///// @param  u16TSIF                \b IN: TS MUX Index
3262*53ee8cc1Swenshuai.xi ///// @param  bClkInv                \b IN: Clock Invert
3263*53ee8cc1Swenshuai.xi ///// @return TSP_Result
3264*53ee8cc1Swenshuai.xi ///// @note
3265*53ee8cc1Swenshuai.xi ///// Set TSP PAD Clk gen invert if the bClkInv is TRUE
3266*53ee8cc1Swenshuai.xi ///// u16TSIF = TSMux0 , TSMux1 ,TSMux2
3267*53ee8cc1Swenshuai.xi /////
3268*53ee8cc1Swenshuai.xi ///// @sa
3269*53ee8cc1Swenshuai.xi ////-------------------------------------------------------------------------------------------------
MDrv_TSP_SelPad_ClkInv(TSP_TSIF eTSIF,MS_BOOL bClkInv)3270*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SelPad_ClkInv(TSP_TSIF eTSIF ,MS_BOOL bClkInv)
3271*53ee8cc1Swenshuai.xi {
3272*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
3273*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3274*53ee8cc1Swenshuai.xi 
3275*53ee8cc1Swenshuai.xi     MS_U32 u32TSIF;
3276*53ee8cc1Swenshuai.xi     TSP_HAL_TSIF eHalTSIF = _TSP_DrvHal_TSIFMapping(eTSIF);
3277*53ee8cc1Swenshuai.xi     u32TSIF = HAL_TSP_TsifMapping(eHalTSIF, FALSE);
3278*53ee8cc1Swenshuai.xi 
3279*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(u32TSIF);
3280*53ee8cc1Swenshuai.xi 
3281*53ee8cc1Swenshuai.xi     _ptsp_res->TsIf_Src[u32TSIF].bClkInv = bClkInv;
3282*53ee8cc1Swenshuai.xi 
3283*53ee8cc1Swenshuai.xi     HAL_TSP_TSIF_SelPad_ClkInv(u32TSIF , bClkInv);
3284*53ee8cc1Swenshuai.xi 
3285*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
3286*53ee8cc1Swenshuai.xi }
3287*53ee8cc1Swenshuai.xi 
3288*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3289*53ee8cc1Swenshuai.xi ///// Set TSP MUX Clk disable mode
3290*53ee8cc1Swenshuai.xi ///// @param  u16TSIF                \b IN: TS MUX Index
3291*53ee8cc1Swenshuai.xi ///// @param  bClkdis                \b IN: Clock Disable
3292*53ee8cc1Swenshuai.xi ///// @return TSP_Result
3293*53ee8cc1Swenshuai.xi ///// @note
3294*53ee8cc1Swenshuai.xi ///// Set TSP PAD Clk gen disabled if the bClkDis is TRUE
3295*53ee8cc1Swenshuai.xi ///// u16TSIF = TSMux0 , TSMux1 ,TSMux2
3296*53ee8cc1Swenshuai.xi /////
3297*53ee8cc1Swenshuai.xi ///// @sa
3298*53ee8cc1Swenshuai.xi ////-------------------------------------------------------------------------------------------------
MDrv_TSP_SelPad_ClkDis(TSP_TSIF eTSIF,MS_BOOL bClkDis)3299*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SelPad_ClkDis(TSP_TSIF eTSIF ,MS_BOOL bClkDis)
3300*53ee8cc1Swenshuai.xi {
3301*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
3302*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3303*53ee8cc1Swenshuai.xi 
3304*53ee8cc1Swenshuai.xi     MS_U32 u32TSIF;
3305*53ee8cc1Swenshuai.xi     TSP_HAL_TSIF eHalTSIF = _TSP_DrvHal_TSIFMapping(eTSIF);
3306*53ee8cc1Swenshuai.xi     u32TSIF = HAL_TSP_TsifMapping(eHalTSIF, FALSE);
3307*53ee8cc1Swenshuai.xi 
3308*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(u32TSIF);
3309*53ee8cc1Swenshuai.xi 
3310*53ee8cc1Swenshuai.xi     HAL_TSP_TSIF_SelPad_ClkDis(u32TSIF , bClkDis);
3311*53ee8cc1Swenshuai.xi 
3312*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
3313*53ee8cc1Swenshuai.xi }
3314*53ee8cc1Swenshuai.xi 
3315*53ee8cc1Swenshuai.xi 
MDrv_TSP_TSO_ConfigPad(MS_U32 u32TSOEng,TSP_TSPad eTSPad)3316*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_TSO_ConfigPad(MS_U32 u32TSOEng, TSP_TSPad eTSPad)
3317*53ee8cc1Swenshuai.xi {
3318*53ee8cc1Swenshuai.xi     TSP_Result eRet = E_TSP_OK;
3319*53ee8cc1Swenshuai.xi     TSP_TS_PAD ePad = E_TSP_TS_PAD_INVALID;
3320*53ee8cc1Swenshuai.xi 
3321*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
3322*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3323*53ee8cc1Swenshuai.xi 
3324*53ee8cc1Swenshuai.xi     HAL_TSO_SetTSOOutMUX(TRUE);
3325*53ee8cc1Swenshuai.xi 
3326*53ee8cc1Swenshuai.xi     ePad = _TSP_DrvHal_PadMapping(eTSPad);
3327*53ee8cc1Swenshuai.xi     if(!HAL_TSP_TSO_TSIF_SelPad(u32TSOEng, ePad))
3328*53ee8cc1Swenshuai.xi         eRet = E_TSP_FAIL;
3329*53ee8cc1Swenshuai.xi 
3330*53ee8cc1Swenshuai.xi     TSP_RETURN(eRet);
3331*53ee8cc1Swenshuai.xi }
3332*53ee8cc1Swenshuai.xi 
3333*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3334*53ee8cc1Swenshuai.xi /// Set TSP engine operating mode
3335*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
3336*53ee8cc1Swenshuai.xi /// @param  eCtrlMode               \b IN: TSP engine operating mode
3337*53ee8cc1Swenshuai.xi /// @return TSP_Result
3338*53ee8cc1Swenshuai.xi /// @note
3339*53ee8cc1Swenshuai.xi /// Only one engine can be set to use memory stream input mode, and all kinds
3340*53ee8cc1Swenshuai.xi /// of input are mutually exclusive for each engine.\n
3341*53ee8cc1Swenshuai.xi /// Only one engine can output to MAD. The TSP engine which is not selected to
3342*53ee8cc1Swenshuai.xi /// MAD can not filter any audio stream, it will block the stream.
3343*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PidFlt_Alloc, MDrv_TSP_PidFlt_Enable, E_TSP_FLT_TYPE_AUDIO
3344*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SetTSIF(TSP_TSIF eTSIF,TSP_TSIFCfg u32Cfg,MS_BOOL bFileIn)3345*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetTSIF(TSP_TSIF eTSIF, TSP_TSIFCfg u32Cfg, MS_BOOL bFileIn)
3346*53ee8cc1Swenshuai.xi {
3347*53ee8cc1Swenshuai.xi     TSP_Result          ret;
3348*53ee8cc1Swenshuai.xi     TSP_TSIF_CFG        cfg = E_TSP_TSIF_CFG_DIS;
3349*53ee8cc1Swenshuai.xi 
3350*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
3351*53ee8cc1Swenshuai.xi 
3352*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3353*53ee8cc1Swenshuai.xi 
3354*53ee8cc1Swenshuai.xi     if (u32Cfg & E_TSP_TSIF_EN)
3355*53ee8cc1Swenshuai.xi     {
3356*53ee8cc1Swenshuai.xi         cfg |= E_TSP_TSIF_CFG_EN;
3357*53ee8cc1Swenshuai.xi     }
3358*53ee8cc1Swenshuai.xi     if (u32Cfg & E_TSP_TSIF_PARL)
3359*53ee8cc1Swenshuai.xi     {
3360*53ee8cc1Swenshuai.xi         cfg |= E_TSP_TSIF_CFG_PARA;
3361*53ee8cc1Swenshuai.xi     }
3362*53ee8cc1Swenshuai.xi     if (u32Cfg & E_TSP_TSIF_EXTSYNC)
3363*53ee8cc1Swenshuai.xi     {
3364*53ee8cc1Swenshuai.xi         cfg |= E_TSP_TSIF_CFG_EXTSYNC;
3365*53ee8cc1Swenshuai.xi     }
3366*53ee8cc1Swenshuai.xi     if (u32Cfg & E_TSP_TSIF_CFG_BITSWAP)
3367*53ee8cc1Swenshuai.xi     {
3368*53ee8cc1Swenshuai.xi         cfg |= E_TSP_TSIF_CFG_BITSWAP;
3369*53ee8cc1Swenshuai.xi     }
3370*53ee8cc1Swenshuai.xi     if (u32Cfg & E_TSP_TSIF_3WIRE)
3371*53ee8cc1Swenshuai.xi     {
3372*53ee8cc1Swenshuai.xi         cfg |= E_TSP_TSIF_CFG_3WIRE;
3373*53ee8cc1Swenshuai.xi     }
3374*53ee8cc1Swenshuai.xi 
3375*53ee8cc1Swenshuai.xi     TSP_HAL_TSIF eHalTSIF = _TSP_DrvHal_TSIFMapping(eTSIF);
3376*53ee8cc1Swenshuai.xi     MS_U32 u32TSIF = HAL_TSP_TsifMapping(eHalTSIF, bFileIn);
3377*53ee8cc1Swenshuai.xi 
3378*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(u32TSIF);
3379*53ee8cc1Swenshuai.xi 
3380*53ee8cc1Swenshuai.xi     if(!bFileIn)
3381*53ee8cc1Swenshuai.xi     {
3382*53ee8cc1Swenshuai.xi         _ptsp_res->TsIf_Src[u32TSIF].bExtSync = !!(u32Cfg & E_TSP_TSIF_EXTSYNC);
3383*53ee8cc1Swenshuai.xi         _ptsp_res->TsIf_Src[u32TSIF].bParallel = !!(u32Cfg & E_TSP_TSIF_PARL);
3384*53ee8cc1Swenshuai.xi     }
3385*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
3386*53ee8cc1Swenshuai.xi     else
3387*53ee8cc1Swenshuai.xi         HAL_TSP_Reset_TSIF_MergeSetting(u32TSIF);
3388*53ee8cc1Swenshuai.xi #endif
3389*53ee8cc1Swenshuai.xi     if (HAL_TSP_SetTSIF(u32TSIF, cfg, bFileIn))
3390*53ee8cc1Swenshuai.xi     {
3391*53ee8cc1Swenshuai.xi         ret = E_TSP_OK;
3392*53ee8cc1Swenshuai.xi     }
3393*53ee8cc1Swenshuai.xi     else
3394*53ee8cc1Swenshuai.xi     {
3395*53ee8cc1Swenshuai.xi         ret = E_TSP_FAIL;
3396*53ee8cc1Swenshuai.xi     }
3397*53ee8cc1Swenshuai.xi 
3398*53ee8cc1Swenshuai.xi     TSP_RETURN(ret);
3399*53ee8cc1Swenshuai.xi }
3400*53ee8cc1Swenshuai.xi 
3401*53ee8cc1Swenshuai.xi /*
3402*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetOperateMode(MS_U32 u32EngId, TSP_CtrlMode eCtrlMode) // @FIXME
3403*53ee8cc1Swenshuai.xi {
3404*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3405*53ee8cc1Swenshuai.xi 
3406*53ee8cc1Swenshuai.xi     if (u32EngId >= TSP_ENGINE_NUM)
3407*53ee8cc1Swenshuai.xi     {
3408*53ee8cc1Swenshuai.xi         TSP_RETURN(TSP_FAIL);
3409*53ee8cc1Swenshuai.xi     }
3410*53ee8cc1Swenshuai.xi 
3411*53ee8cc1Swenshuai.xi     if ((HAL_TSP_GetCtrlMode() & TSP_CTRL_TSIF0_FILE_EN) ||
3412*53ee8cc1Swenshuai.xi         (eCtrlMode == E_TSP_CTRL_MODE_MEM))
3413*53ee8cc1Swenshuai.xi     {
3414*53ee8cc1Swenshuai.xi         if (!HAL_TSP_CmdQ_IsEmpty())
3415*53ee8cc1Swenshuai.xi         {
3416*53ee8cc1Swenshuai.xi             TSP_RETURN(TSP_FAIL);
3417*53ee8cc1Swenshuai.xi         }
3418*53ee8cc1Swenshuai.xi         HAL_TSP_CmdQ_TsDma_Reset();
3419*53ee8cc1Swenshuai.xi     }
3420*53ee8cc1Swenshuai.xi 
3421*53ee8cc1Swenshuai.xi     switch (eCtrlMode)
3422*53ee8cc1Swenshuai.xi     {
3423*53ee8cc1Swenshuai.xi     case E_TSP_CTRL_MODE_TS0:
3424*53ee8cc1Swenshuai.xi         HAL_TSP_PS_Path_Disable();
3425*53ee8cc1Swenshuai.xi         HAL_TSP_SetCA(TSP_CA_INPUT_TSIF0_LIVEIN|TSP_CA_OUTPUT_PLAY_LIVE); //|TSP_CA_AVPAUSE);
3426*53ee8cc1Swenshuai.xi #if 0
3427*53ee8cc1Swenshuai.xi         HAL_TSP_DoubleBuf_Disable();
3428*53ee8cc1Swenshuai.xi         HAL_TSP_SetCtrlMode(TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 0);
3429*53ee8cc1Swenshuai.xi #else
3430*53ee8cc1Swenshuai.xi         HAL_TSP_SetTSIF(0, TSP_TSIF0_EN  | TSP_TSIFx_EXTSYNC | TSP_TSIFx_PARL, FALSE);
3431*53ee8cc1Swenshuai.xi #endif
3432*53ee8cc1Swenshuai.xi         break;
3433*53ee8cc1Swenshuai.xi     case E_TSP_CTRL_MODE_TS1:
3434*53ee8cc1Swenshuai.xi         HAL_TSP_PS_Path_Disable();
3435*53ee8cc1Swenshuai.xi         HAL_TSP_DoubleBuf_Disable();
3436*53ee8cc1Swenshuai.xi         HAL_TSP_SetCtrlMode(TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 1);
3437*53ee8cc1Swenshuai.xi         break;
3438*53ee8cc1Swenshuai.xi     case E_TSP_CTRL_MODE_MEM:
3439*53ee8cc1Swenshuai.xi         HAL_TSP_PS_Path_Disable();
3440*53ee8cc1Swenshuai.xi         HAL_TSP_DoubleBuf_En(DOUBLE_BUFFER_SWITCH);        // [OBERON]:Enable double buffer, set filein->pinpon livein->single
3441*53ee8cc1Swenshuai.xi         HAL_TSP_SetCA(TSP_CA_INPUT_TSIF0_FILEIN|TSP_CA_OUTPUT_PLAY_FILE|TSP_CA_AVPAUSE);
3442*53ee8cc1Swenshuai.xi         HAL_TSP_SetCtrlMode(TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST| TSP_CTRL_TSIF0_FILE_EN, 2);
3443*53ee8cc1Swenshuai.xi         break;
3444*53ee8cc1Swenshuai.xi     default:
3445*53ee8cc1Swenshuai.xi         TSP_RETURN(TSP_FAIL);
3446*53ee8cc1Swenshuai.xi         break;
3447*53ee8cc1Swenshuai.xi     }
3448*53ee8cc1Swenshuai.xi 
3449*53ee8cc1Swenshuai.xi     TSP_RETURN(TSP_OK);
3450*53ee8cc1Swenshuai.xi 
3451*53ee8cc1Swenshuai.xi }
3452*53ee8cc1Swenshuai.xi */
3453*53ee8cc1Swenshuai.xi 
3454*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3455*53ee8cc1Swenshuai.xi // Ask TSP to process section/pvr data for Non-OS driver. Calling this function in OS environment causes nothing
3456*53ee8cc1Swenshuai.xi // @OBSOLETED
3457*53ee8cc1Swenshuai.xi // @param  u32EngId                 \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
3458*53ee8cc1Swenshuai.xi // @param  u32FltId                 \b IN: Which filter id to process. 0xFFFFFFFF means process all filters
3459*53ee8cc1Swenshuai.xi // @param  u32Timeout               \b IN: Max time for TSP to process
3460*53ee8cc1Swenshuai.xi // @return TSP_Result
3461*53ee8cc1Swenshuai.xi // @note
3462*53ee8cc1Swenshuai.xi // It's only for backward compatible
3463*53ee8cc1Swenshuai.xi // @seealso
3464*53ee8cc1Swenshuai.xi // MDrv_TSP_FLT_SetCallback
3465*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Proc(MS_U32 u32TSPId,MS_U32 u32FltId,TSP_Event * pEvent)3466*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Proc(MS_U32 u32TSPId, MS_U32 u32FltId, TSP_Event* pEvent)                        // for non-OS TSP scheduling
3467*53ee8cc1Swenshuai.xi {
3468*53ee8cc1Swenshuai.xi     MS_U32              events = 0;
3469*53ee8cc1Swenshuai.xi 
3470*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32PidFltIdAll > u32FltId, "[%04d] Invalid u32FltId %d\n", __LINE__, (unsigned int)u32FltId);
3471*53ee8cc1Swenshuai.xi 
3472*53ee8cc1Swenshuai.xi     //HAL_TSP_GetCaps(E_TSP_HAL_CAP_TYPE_RECFLT_IDX, &u32RecFltIdx);
3473*53ee8cc1Swenshuai.xi 
3474*53ee8cc1Swenshuai.xi     if((u32FltId >= _tspFltIdMap.u32PcrFltId_Start) && (u32FltId <= _tspFltIdMap.u32RecFltIdx))
3475*53ee8cc1Swenshuai.xi         return E_TSP_OK;
3476*53ee8cc1Swenshuai.xi 
3477*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3478*53ee8cc1Swenshuai.xi 
3479*53ee8cc1Swenshuai.xi     if (_ptsp_res->_tspInfo.FltState[u32FltId] == E_TSP_FLT_STATE_NA)
3480*53ee8cc1Swenshuai.xi     {
3481*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL);
3482*53ee8cc1Swenshuai.xi     }
3483*53ee8cc1Swenshuai.xi 
3484*53ee8cc1Swenshuai.xi     if (E_TSP_EVENT_CB_AUTO == (_ptsp_res->_tspInfo.FltEvent[u32FltId] & E_TSP_EVENT_CB_MASK))
3485*53ee8cc1Swenshuai.xi     {
3486*53ee8cc1Swenshuai.xi         TSP_OS_Print("[%s] Flt %d is CallBack Mode Filter, Polling this filter will cause unexpected result !!\n",__FUNCTION__,(unsigned int)u32FltId);
3487*53ee8cc1Swenshuai.xi         //*pEvent = E_TSP_EVENT_DATA_IDLE ;
3488*53ee8cc1Swenshuai.xi         //TSP_RETURN(E_TSP_FAIL_NODATA);
3489*53ee8cc1Swenshuai.xi     }// Driver do not support Callback mode and Polling mode coexistance at the same filter.
3490*53ee8cc1Swenshuai.xi 
3491*53ee8cc1Swenshuai.xi 
3492*53ee8cc1Swenshuai.xi     // @FIXME Jerry
3493*53ee8cc1Swenshuai.xi     // For legacy driver compatibility, it call polling and hopes polling will call it back in the same context.
3494*53ee8cc1Swenshuai.xi     // Does this kind of misbehavior still live?
3495*53ee8cc1Swenshuai.xi     TSP_UNLOCK();
3496*53ee8cc1Swenshuai.xi     // @NOTE Jerry
3497*53ee8cc1Swenshuai.xi     // Clear poll events directly in case there has any incoming event before _TSP_ISR_Proc to clear
3498*53ee8cc1Swenshuai.xi     TSP_GetEvent(_s32EventId, &events, TSP_POLL_EVENTS, TSP_OS_EVENT_OR_CLEAR, 0);
3499*53ee8cc1Swenshuai.xi     _TSP_POLL_Proc(events, u32FltId, pEvent);
3500*53ee8cc1Swenshuai.xi     TSP_LOCK();
3501*53ee8cc1Swenshuai.xi 
3502*53ee8cc1Swenshuai.xi     if (*pEvent == E_TSP_EVENT_DATA_IDLE )
3503*53ee8cc1Swenshuai.xi     {
3504*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_NODATA);
3505*53ee8cc1Swenshuai.xi     }
3506*53ee8cc1Swenshuai.xi     else
3507*53ee8cc1Swenshuai.xi     {
3508*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_OK);
3509*53ee8cc1Swenshuai.xi     }
3510*53ee8cc1Swenshuai.xi }
3511*53ee8cc1Swenshuai.xi 
3512*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3513*53ee8cc1Swenshuai.xi /// Allocate TSP Path Id
3514*53ee8cc1Swenshuai.xi /// @param  eResType        \b IN: TSP path type
3515*53ee8cc1Swenshuai.xi /// @param  pu32PathId      \b OUT: TSP path id. If no free path ID, it will be 0xFFFFFFFF and return FAIL.
3516*53ee8cc1Swenshuai.xi /// @return TSP_Result
3517*53ee8cc1Swenshuai.xi /// @note
3518*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Path_Alloc(DRV_TSP_PATH_TYPE eResType,MS_U32 * pu32PathId)3519*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Path_Alloc(DRV_TSP_PATH_TYPE eResType, MS_U32 *pu32PathId)
3520*53ee8cc1Swenshuai.xi {
3521*53ee8cc1Swenshuai.xi     TSP_Result  ret = E_TSP_FAIL;
3522*53ee8cc1Swenshuai.xi 
3523*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3524*53ee8cc1Swenshuai.xi 
3525*53ee8cc1Swenshuai.xi     ret = _TSP_Path_Alloc(eResType, pu32PathId);
3526*53ee8cc1Swenshuai.xi 
3527*53ee8cc1Swenshuai.xi     if(ret == E_TSP_OK)
3528*53ee8cc1Swenshuai.xi     {
3529*53ee8cc1Swenshuai.xi         if( (eResType == E_DRV_TSP_PATH_LIVE) || (eResType == E_DRV_TSP_PATH_FILE) )
3530*53ee8cc1Swenshuai.xi         {
3531*53ee8cc1Swenshuai.xi             _ptsp_res->_bIsTspPathEverAlloc = TRUE;
3532*53ee8cc1Swenshuai.xi         }
3533*53ee8cc1Swenshuai.xi     }
3534*53ee8cc1Swenshuai.xi 
3535*53ee8cc1Swenshuai.xi     TSP_RETURN(ret);
3536*53ee8cc1Swenshuai.xi }
3537*53ee8cc1Swenshuai.xi 
3538*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3539*53ee8cc1Swenshuai.xi /// Free TSP Path Id
3540*53ee8cc1Swenshuai.xi /// @param  eResType        \b IN: TSP path type
3541*53ee8cc1Swenshuai.xi /// @param  u32PathId       \b IN: TSP path id
3542*53ee8cc1Swenshuai.xi /// @return TSP_Result
3543*53ee8cc1Swenshuai.xi /// @note
3544*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Path_Free(DRV_TSP_PATH_TYPE eResType,TSP_TSIF ePath)3545*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Path_Free(DRV_TSP_PATH_TYPE eResType, TSP_TSIF ePath)
3546*53ee8cc1Swenshuai.xi {
3547*53ee8cc1Swenshuai.xi     TSP_Result  ret = E_TSP_FAIL;
3548*53ee8cc1Swenshuai.xi 
3549*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3550*53ee8cc1Swenshuai.xi 
3551*53ee8cc1Swenshuai.xi     ret = _TSP_Path_Free(eResType, ePath);
3552*53ee8cc1Swenshuai.xi 
3553*53ee8cc1Swenshuai.xi     TSP_RETURN(ret);
3554*53ee8cc1Swenshuai.xi }
3555*53ee8cc1Swenshuai.xi 
3556*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3557*53ee8cc1Swenshuai.xi /// Allocate STC engine.
3558*53ee8cc1Swenshuai.xi /// @param  pu32EngId                  \b OUT: STC engine id. If no free STC engine, it will be 0xFFFFFFFF and return FAIL.
3559*53ee8cc1Swenshuai.xi /// @return TSP_Result
3560*53ee8cc1Swenshuai.xi /// @note
3561*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_STC_Alloc(MS_U32 * pu32EngId)3562*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_STC_Alloc(MS_U32 *pu32EngId)
3563*53ee8cc1Swenshuai.xi {
3564*53ee8cc1Swenshuai.xi     TSP_Result ret;
3565*53ee8cc1Swenshuai.xi 
3566*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3567*53ee8cc1Swenshuai.xi 
3568*53ee8cc1Swenshuai.xi     ret = _TSP_STC_Alloc(pu32EngId);
3569*53ee8cc1Swenshuai.xi 
3570*53ee8cc1Swenshuai.xi     if(ret == E_TSP_OK)
3571*53ee8cc1Swenshuai.xi     {
3572*53ee8cc1Swenshuai.xi         _ptsp_res->_bIsStcEverAlloc = TRUE;
3573*53ee8cc1Swenshuai.xi     }
3574*53ee8cc1Swenshuai.xi 
3575*53ee8cc1Swenshuai.xi     TSP_RETURN(ret);
3576*53ee8cc1Swenshuai.xi }
3577*53ee8cc1Swenshuai.xi 
3578*53ee8cc1Swenshuai.xi 
3579*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3580*53ee8cc1Swenshuai.xi /// Free STC engine
3581*53ee8cc1Swenshuai.xi /// @param  u32EngId                  \b IN: index of STC engine to be free
3582*53ee8cc1Swenshuai.xi /// @return TSP_Result
3583*53ee8cc1Swenshuai.xi /// @note
3584*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_STC_Free(MS_U32 u32EngId)3585*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_STC_Free(MS_U32 u32EngId)
3586*53ee8cc1Swenshuai.xi {
3587*53ee8cc1Swenshuai.xi     TSP_Result ret = E_TSP_FAIL;
3588*53ee8cc1Swenshuai.xi 
3589*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3590*53ee8cc1Swenshuai.xi 
3591*53ee8cc1Swenshuai.xi     ret = _TSP_STC_Free(u32EngId);
3592*53ee8cc1Swenshuai.xi 
3593*53ee8cc1Swenshuai.xi     TSP_RETURN(ret);
3594*53ee8cc1Swenshuai.xi }
3595*53ee8cc1Swenshuai.xi 
3596*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3597*53ee8cc1Swenshuai.xi /// Free STC engine
3598*53ee8cc1Swenshuai.xi /// @param  u32PcrFltId                  \b IN: index of PCR PID filter
3599*53ee8cc1Swenshuai.xi /// @param  pu32EngId                    \b Out: index of STC engine which u32PcrFltId mapping to
3600*53ee8cc1Swenshuai.xi /// @return TSP_Result
3601*53ee8cc1Swenshuai.xi /// @note
3602*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PcrId_To_StcId(MS_U32 u32PcrFltId,MS_U32 * pu32EngId)3603*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PcrId_To_StcId(MS_U32 u32PcrFltId,MS_U32 *pu32EngId)
3604*53ee8cc1Swenshuai.xi {
3605*53ee8cc1Swenshuai.xi     TSP_Result ret = E_TSP_FAIL;
3606*53ee8cc1Swenshuai.xi 
3607*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3608*53ee8cc1Swenshuai.xi 
3609*53ee8cc1Swenshuai.xi     ret = _TSP_PcrId_To_StcId(u32PcrFltId, pu32EngId);
3610*53ee8cc1Swenshuai.xi 
3611*53ee8cc1Swenshuai.xi     TSP_RETURN(ret);
3612*53ee8cc1Swenshuai.xi }
3613*53ee8cc1Swenshuai.xi 
_MDrv_TSP_FLT_RemapFltId(void)3614*53ee8cc1Swenshuai.xi void _MDrv_TSP_FLT_RemapFltId(void)
3615*53ee8cc1Swenshuai.xi {
3616*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "[%s][%d]\n", __FUNCTION__, __LINE__);
3617*53ee8cc1Swenshuai.xi     // 255 for Err Flt
3618*53ee8cc1Swenshuai.xi     // 254 for REC Flt
3619*53ee8cc1Swenshuai.xi     // 253 ~ (254 - PCR_NUM) for PCR Flt
3620*53ee8cc1Swenshuai.xi     // others for Pid Flt/Sec Flt/Sec Buf
3621*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32PidFltIdAll = 254;
3622*53ee8cc1Swenshuai.xi 
3623*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32RecFltIdx = 254;
3624*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32PcrFltId_End = _tspFltIdMap.u32RecFltIdx;
3625*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32PcrFltId_Start = _tspFltIdMap.u32PcrFltId_End - TSP_PCRFLT_NUM;
3626*53ee8cc1Swenshuai.xi 
3627*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32PidFltId_End = _tspFltIdMap.u32PcrFltId_Start;
3628*53ee8cc1Swenshuai.xi 
3629*53ee8cc1Swenshuai.xi #if (TSP_SECFLT_END_ID > 255)
3630*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32SecFltId_End = _tspFltIdMap.u32PcrFltId_Start;
3631*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32SecBufId_End = _tspFltIdMap.u32PcrFltId_Start;
3632*53ee8cc1Swenshuai.xi #endif
3633*53ee8cc1Swenshuai.xi 
3634*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32PidFltId_Start = TSP_PIDFLT_START_ID;
3635*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32SecFltId_Start = TSP_SECFLT_START_ID;
3636*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32SecBufId_Start = TSP_SECBUF_START_ID;
3637*53ee8cc1Swenshuai.xi 
3638*53ee8cc1Swenshuai.xi }
_MDrv_TSP_FLT_ResetFltId()3639*53ee8cc1Swenshuai.xi void _MDrv_TSP_FLT_ResetFltId()
3640*53ee8cc1Swenshuai.xi {
3641*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "[%s][%d]\n", __FUNCTION__, __LINE__);
3642*53ee8cc1Swenshuai.xi 
3643*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32SecFltId_Start    = TSP_SECFLT_START_ID;
3644*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32SecFltId_End      = TSP_SECFLT_END_ID;
3645*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32SecBufId_Start    = TSP_SECBUF_START_ID;
3646*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32SecBufId_End      = TSP_SECBUF_END_ID;
3647*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32PidFltId_Start    = TSP_PIDFLT_START_ID;
3648*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32PidFltId_End      = TSP_PIDFLT_END_ID;
3649*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32PcrFltId_Start    = TSP_PCRFLT_START_ID;
3650*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32PcrFltId_End      = TSP_PCRFLT_END_ID;
3651*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32RecFltIdx         = TSP_RECFLT_IDX;
3652*53ee8cc1Swenshuai.xi 
3653*53ee8cc1Swenshuai.xi     _tspFltIdMap.u32PidFltIdAll       = TSP_PIDFLT_NUM_ALL;
3654*53ee8cc1Swenshuai.xi 
3655*53ee8cc1Swenshuai.xi 
3656*53ee8cc1Swenshuai.xi 
3657*53ee8cc1Swenshuai.xi }
3658*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3659*53ee8cc1Swenshuai.xi /// Allocate a PID filter of a TSP unit
3660*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
3661*53ee8cc1Swenshuai.xi /// @param  eFilterType             \b IN: type of PID filter to be allocated
3662*53ee8cc1Swenshuai.xi /// @param  pu32PidFltId            \b OUT: pointer of PID filter id return
3663*53ee8cc1Swenshuai.xi /// @return TSP_Result
3664*53ee8cc1Swenshuai.xi /// @note
3665*53ee8cc1Swenshuai.xi /// These filter types have to select a section filter\n
3666*53ee8cc1Swenshuai.xi /// @ref E_TSP_FLT_TYPE_SECTION\n
3667*53ee8cc1Swenshuai.xi /// @ref E_TSP_FLT_TYPE_PCR\n
3668*53ee8cc1Swenshuai.xi /// @ref E_TSP_FLT_TYPE_PES\n
3669*53ee8cc1Swenshuai.xi /// @note
3670*53ee8cc1Swenshuai.xi /// These filter types also have to setup section buffer for data output\n
3671*53ee8cc1Swenshuai.xi /// @ref E_TSP_FLT_TYPE_SECTION\n
3672*53ee8cc1Swenshuai.xi /// @ref E_TSP_FLT_TYPE_PES\n
3673*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PidFlt_SelSecFlt, MDrv_TSP_SecFlt_SetBuffer
3674*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FLT_Alloc(MS_U32 u32TSPId,TSP_FltType eFltType,MS_U32 * pu32FltId)3675*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_Alloc(MS_U32 u32TSPId, TSP_FltType eFltType, MS_U32 *pu32FltId)
3676*53ee8cc1Swenshuai.xi {
3677*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "[%s][%d]\n", __FUNCTION__, __LINE__);
3678*53ee8cc1Swenshuai.xi     TSP_Result eResult = E_TSP_FAIL;
3679*53ee8cc1Swenshuai.xi     if(!_bIsFltMapped)
3680*53ee8cc1Swenshuai.xi     {
3681*53ee8cc1Swenshuai.xi         MS_U32  u32CapInfo[2] = {0};
3682*53ee8cc1Swenshuai.xi 
3683*53ee8cc1Swenshuai.xi         HAL_TSP_GetCaps(E_TSP_HAL_CAP_TYPE_RECFLT_IDX, u32CapInfo);
3684*53ee8cc1Swenshuai.xi         if(u32CapInfo[0] > 0xFF)
3685*53ee8cc1Swenshuai.xi         {
3686*53ee8cc1Swenshuai.xi             _MDrv_TSP_FLT_RemapFltId();
3687*53ee8cc1Swenshuai.xi         }
3688*53ee8cc1Swenshuai.xi         _bIsFltMapped = TRUE;
3689*53ee8cc1Swenshuai.xi     }
3690*53ee8cc1Swenshuai.xi 
3691*53ee8cc1Swenshuai.xi     eResult = MDrv_TSP_FLT_Alloc_Common(u32TSPId, eFltType, pu32FltId);
3692*53ee8cc1Swenshuai.xi 
3693*53ee8cc1Swenshuai.xi     if( eResult !=  E_TSP_OK)
3694*53ee8cc1Swenshuai.xi     {
3695*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
3696*53ee8cc1Swenshuai.xi     }
3697*53ee8cc1Swenshuai.xi     return E_TSP_OK;
3698*53ee8cc1Swenshuai.xi }
3699*53ee8cc1Swenshuai.xi 
MDrv_TSP_FLT_Alloc_Ex(MS_U32 u32TSPId,TSP_FltType eFltType,MS_U32 * pu32FltId)3700*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_Alloc_Ex(MS_U32 u32TSPId, TSP_FltType eFltType, MS_U32 *pu32FltId)
3701*53ee8cc1Swenshuai.xi {
3702*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "[%s][%d]\n", __FUNCTION__, __LINE__);
3703*53ee8cc1Swenshuai.xi     TSP_Result eResult = E_TSP_FAIL;
3704*53ee8cc1Swenshuai.xi     eResult = MDrv_TSP_FLT_Alloc_Common(u32TSPId, eFltType, pu32FltId);
3705*53ee8cc1Swenshuai.xi     if( eResult !=  E_TSP_OK)
3706*53ee8cc1Swenshuai.xi     {
3707*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
3708*53ee8cc1Swenshuai.xi     }
3709*53ee8cc1Swenshuai.xi     return E_TSP_OK;
3710*53ee8cc1Swenshuai.xi 
3711*53ee8cc1Swenshuai.xi }
3712*53ee8cc1Swenshuai.xi 
MDrv_TSP_FLT_Alloc_Common(MS_U32 u32TSPId,TSP_FltType eFltType,MS_U32 * pu32FltId)3713*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_Alloc_Common(MS_U32 u32TSPId, TSP_FltType eFltType, MS_U32 *pu32FltId)
3714*53ee8cc1Swenshuai.xi {
3715*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "[%s][%d]\n", __FUNCTION__, __LINE__);
3716*53ee8cc1Swenshuai.xi     //We do nothing when create dmx flt to record
3717*53ee8cc1Swenshuai.xi     if( E_TSP_FLT_FIFO_REC == (eFltType & E_TSP_FLT_FIFO_MASK) )
3718*53ee8cc1Swenshuai.xi     {
3719*53ee8cc1Swenshuai.xi         MS_U32 u32CapInfo[2] = {0};
3720*53ee8cc1Swenshuai.xi 
3721*53ee8cc1Swenshuai.xi         HAL_TSP_GetCaps(E_TSP_HAL_CAP_TYPE_RECFLT_IDX, u32CapInfo);
3722*53ee8cc1Swenshuai.xi         *pu32FltId = u32CapInfo[0];
3723*53ee8cc1Swenshuai.xi         return E_TSP_OK;
3724*53ee8cc1Swenshuai.xi     }
3725*53ee8cc1Swenshuai.xi 
3726*53ee8cc1Swenshuai.xi     REG_SecFlt *        pSecFlt=0;
3727*53ee8cc1Swenshuai.xi     MS_U32              type;
3728*53ee8cc1Swenshuai.xi     int                 start_id, end_id, i;
3729*53ee8cc1Swenshuai.xi     MS_U32              u32StcEng = 0xFFFFFFFF;
3730*53ee8cc1Swenshuai.xi 
3731*53ee8cc1Swenshuai.xi     TSP_ENTRY();
3732*53ee8cc1Swenshuai.xi 
3733*53ee8cc1Swenshuai.xi     *pu32FltId = 0xFFFFFFFF;
3734*53ee8cc1Swenshuai.xi 
3735*53ee8cc1Swenshuai.xi     if ( E_TSP_FLT_USER_PCR == (eFltType & E_TSP_FLT_USER_MASK) )
3736*53ee8cc1Swenshuai.xi     {
3737*53ee8cc1Swenshuai.xi         if(_TSP_STC_Alloc(&u32StcEng) == FALSE)
3738*53ee8cc1Swenshuai.xi         {
3739*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_ERROR, "[%04d] No free STC !!\n", __LINE__);
3740*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL);
3741*53ee8cc1Swenshuai.xi         }
3742*53ee8cc1Swenshuai.xi 
3743*53ee8cc1Swenshuai.xi         start_id = _tspFltIdMap.u32PcrFltId_Start;
3744*53ee8cc1Swenshuai.xi         end_id   = _tspFltIdMap.u32PcrFltId_End;
3745*53ee8cc1Swenshuai.xi     }
3746*53ee8cc1Swenshuai.xi     else if( (E_TSP_FLT_USER_SEC == (eFltType & E_TSP_FLT_USER_MASK)) ||
3747*53ee8cc1Swenshuai.xi         (E_TSP_FLT_USER_PES == (eFltType & E_TSP_FLT_USER_MASK)) ||
3748*53ee8cc1Swenshuai.xi         (E_TSP_FLT_USER_PKT == (eFltType & E_TSP_FLT_USER_MASK)) ||
3749*53ee8cc1Swenshuai.xi         (E_TSP_FLT_USER_TTX == (eFltType & E_TSP_FLT_USER_MASK)) )
3750*53ee8cc1Swenshuai.xi     {
3751*53ee8cc1Swenshuai.xi         start_id = _tspFltIdMap.u32SecFltId_Start;
3752*53ee8cc1Swenshuai.xi         end_id   = _tspFltIdMap.u32SecFltId_End;
3753*53ee8cc1Swenshuai.xi     }
3754*53ee8cc1Swenshuai.xi     else
3755*53ee8cc1Swenshuai.xi     {
3756*53ee8cc1Swenshuai.xi         end_id = _tspFltIdMap.u32PidFltId_End;
3757*53ee8cc1Swenshuai.xi #if 0
3758*53ee8cc1Swenshuai.xi         if (E_TSP_FLT_FLAG_CA & eFltType)
3759*53ee8cc1Swenshuai.xi         {
3760*53ee8cc1Swenshuai.xi             start_id = TSP_CAFLT_0;
3761*53ee8cc1Swenshuai.xi         }
3762*53ee8cc1Swenshuai.xi         else
3763*53ee8cc1Swenshuai.xi         {
3764*53ee8cc1Swenshuai.xi             start_id = 0;
3765*53ee8cc1Swenshuai.xi         }
3766*53ee8cc1Swenshuai.xi #else
3767*53ee8cc1Swenshuai.xi         start_id = _tspFltIdMap.u32PidFltId_Start;
3768*53ee8cc1Swenshuai.xi #endif
3769*53ee8cc1Swenshuai.xi     }
3770*53ee8cc1Swenshuai.xi 
3771*53ee8cc1Swenshuai.xi     if(TSP_NEED_SEC_FILTER(eFltType))
3772*53ee8cc1Swenshuai.xi     {
3773*53ee8cc1Swenshuai.xi         for (i = start_id; i < end_id; i++) // check which filter is free
3774*53ee8cc1Swenshuai.xi         {
3775*53ee8cc1Swenshuai.xi             if (_ptsp_res->_tspInfo.FltState[i] == E_TSP_FLT_STATE_FREE)
3776*53ee8cc1Swenshuai.xi             {
3777*53ee8cc1Swenshuai.xi             //if TSP support PCR hardware , we don't use section filter to capture PCR from TS packet
3778*53ee8cc1Swenshuai.xi             //otherwise , try to allocate it
3779*53ee8cc1Swenshuai.xi             #if HW_PCRFLT_ENABLE
3780*53ee8cc1Swenshuai.xi                 if(_tspFltIdMap.u32PcrFltId_Start <= start_id)
3781*53ee8cc1Swenshuai.xi                 {
3782*53ee8cc1Swenshuai.xi                     break;
3783*53ee8cc1Swenshuai.xi                 }
3784*53ee8cc1Swenshuai.xi             #endif
3785*53ee8cc1Swenshuai.xi                 pSecFlt = &(_REGSec->Flt[i]);
3786*53ee8cc1Swenshuai.xi                 if (HAL_TSP_SecFlt_TryAlloc(pSecFlt, (MS_U16)u32TSPId))
3787*53ee8cc1Swenshuai.xi                 {
3788*53ee8cc1Swenshuai.xi                     break;
3789*53ee8cc1Swenshuai.xi                 }
3790*53ee8cc1Swenshuai.xi             }
3791*53ee8cc1Swenshuai.xi         }
3792*53ee8cc1Swenshuai.xi         if (i >= end_id)
3793*53ee8cc1Swenshuai.xi         {
3794*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_ERROR, "[%04d] No free fitler found 0x%02x\n", __LINE__, (MS_U32)i);
3795*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL);
3796*53ee8cc1Swenshuai.xi         }
3797*53ee8cc1Swenshuai.xi 
3798*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
3799*53ee8cc1Swenshuai.xi         MS_U32 u32ii;
3800*53ee8cc1Swenshuai.xi 
3801*53ee8cc1Swenshuai.xi         for(u32ii = 0; u32ii < DRVTSP_MAX_PROCESS_NUM; u32ii++)
3802*53ee8cc1Swenshuai.xi         {
3803*53ee8cc1Swenshuai.xi             if(_u32KPrcEvtTblUseFlag & (1 << u32ii))
3804*53ee8cc1Swenshuai.xi             {
3805*53ee8cc1Swenshuai.xi                 if(_stKModePrcEvtTbl[u32ii].tgid == current->tgid)
3806*53ee8cc1Swenshuai.xi                 {
3807*53ee8cc1Swenshuai.xi                     _ptsp_res->_tspInfo.s32TspEvtId[i] = _stKModePrcEvtTbl[u32ii].s32TspEvtId;
3808*53ee8cc1Swenshuai.xi                     break;
3809*53ee8cc1Swenshuai.xi                 }
3810*53ee8cc1Swenshuai.xi             }
3811*53ee8cc1Swenshuai.xi         }
3812*53ee8cc1Swenshuai.xi #else
3813*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.s32TspEvtId[i] = _s32EventId;
3814*53ee8cc1Swenshuai.xi #endif
3815*53ee8cc1Swenshuai.xi     }
3816*53ee8cc1Swenshuai.xi     else
3817*53ee8cc1Swenshuai.xi     {
3818*53ee8cc1Swenshuai.xi         for (i = end_id - 1; i >= start_id; i--) // check which filter is free, allocate from back
3819*53ee8cc1Swenshuai.xi             if (_ptsp_res->_tspInfo.FltState[i] == E_TSP_FLT_STATE_FREE)
3820*53ee8cc1Swenshuai.xi                 break;
3821*53ee8cc1Swenshuai.xi         //when section filters are less than PID filters
3822*53ee8cc1Swenshuai.xi     #if (TSP_SECFLT_END_ID != TSP_PIDFLT_REC_NUM) // for coverity
3823*53ee8cc1Swenshuai.xi         if ((i < _tspFltIdMap.u32SecFltId_End) && (_tspFltIdMap.u32SecFltId_End < _tspFltIdMap.u32PidFltId_End))
3824*53ee8cc1Swenshuai.xi     #else
3825*53ee8cc1Swenshuai.xi         if (i < _tspFltIdMap.u32SecFltId_End)
3826*53ee8cc1Swenshuai.xi     #endif
3827*53ee8cc1Swenshuai.xi         {
3828*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_ERROR, "[%04d] Warning, PID filter 0x%02x for section is allocated for non-section usage. \n", __LINE__, (MS_U32)i);
3829*53ee8cc1Swenshuai.xi         }
3830*53ee8cc1Swenshuai.xi         if (i < start_id)
3831*53ee8cc1Swenshuai.xi         {
3832*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_ERROR, "[%04d] No free fitler found 0x%02x\n", __LINE__, (MS_U32)i);
3833*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL);
3834*53ee8cc1Swenshuai.xi         }
3835*53ee8cc1Swenshuai.xi     }
3836*53ee8cc1Swenshuai.xi 
3837*53ee8cc1Swenshuai.xi 
3838*53ee8cc1Swenshuai.xi     //[NOTE] Referace the comment of definition of _ptsp_res->_Current_Live.
3839*53ee8cc1Swenshuai.xi #if 0    //@F_TODO do we have to support this here?
3840*53ee8cc1Swenshuai.xi     if ((eFltType & E_TSP_FLT_SRC_TSIF0) && (_ptsp_res->_Current_Live != E_TSP_FLT_SRC_TSIF0)) // if current live not @ playback channel
3841*53ee8cc1Swenshuai.xi     {
3842*53ee8cc1Swenshuai.xi         if (FALSE == (E_TSP_FLT_FIFO_MASK & eFltType ))  // For A/V/PCR are always belone to channel playback.
3843*53ee8cc1Swenshuai.xi         {
3844*53ee8cc1Swenshuai.xi             eFltType = (eFltType & ~E_TSP_FLT_SRC_MASK) | _ptsp_res->_Current_Live ;
3845*53ee8cc1Swenshuai.xi         }
3846*53ee8cc1Swenshuai.xi     }
3847*53ee8cc1Swenshuai.xi #endif
3848*53ee8cc1Swenshuai.xi 
3849*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.FltType[i]  = eFltType;
3850*53ee8cc1Swenshuai.xi 
3851*53ee8cc1Swenshuai.xi     _TSP_FLT_Init(i);
3852*53ee8cc1Swenshuai.xi 
3853*53ee8cc1Swenshuai.xi     if ( E_TSP_FLT_USER_PCR == (eFltType & E_TSP_FLT_USER_MASK) )
3854*53ee8cc1Swenshuai.xi     {
3855*53ee8cc1Swenshuai.xi         _TSP_STC_SetPcrFlt(u32StcEng, (MS_U32)i);
3856*53ee8cc1Swenshuai.xi     }
3857*53ee8cc1Swenshuai.xi 
3858*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.FltState[i] = E_TSP_FLT_STATE_ALLOC;
3859*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.OwnerId[i]  = (EN_TSP_Id)u32TSPId;
3860*53ee8cc1Swenshuai.xi 
3861*53ee8cc1Swenshuai.xi     // Select FLT in
3862*53ee8cc1Swenshuai.xi     //pPidFlt = &(_REGPid->Flt[i]);
3863*53ee8cc1Swenshuai.xi 
3864*53ee8cc1Swenshuai.xi     MS_U32 u32FltSrc = E_TSP_FLT_SRC_MASK & eFltType;
3865*53ee8cc1Swenshuai.xi     TSP_PIDFLT_SRC eTspPidSrc = _TSP_DrvHal_FltSrcMapping(u32FltSrc);
3866*53ee8cc1Swenshuai.xi     MS_U32 u32PktDmx = HAL_TSP_FltSrc2PktDmx_Mapping(eTspPidSrc);
3867*53ee8cc1Swenshuai.xi 
3868*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(u32PktDmx);
3869*53ee8cc1Swenshuai.xi 
3870*53ee8cc1Swenshuai.xi     //if TSP support PCR hardware , we don't use section filter to capture PCR from TS packet
3871*53ee8cc1Swenshuai.xi     //otherwise , set source paket demux of section filter
3872*53ee8cc1Swenshuai.xi #if HW_PCRFLT_ENABLE
3873*53ee8cc1Swenshuai.xi     if(E_TSP_FLT_USER_PCR != (eFltType & E_TSP_FLT_USER_MASK))
3874*53ee8cc1Swenshuai.xi #endif
3875*53ee8cc1Swenshuai.xi         HAL_TSP_PidFlt_SetFltIn(i,u32PktDmx);
3876*53ee8cc1Swenshuai.xi 
3877*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
3878*53ee8cc1Swenshuai.xi     {
3879*53ee8cc1Swenshuai.xi         MS_U32 u32SrcId = (eFltType & E_TSP_FLT_SRCID_MASK) >> E_TSP_FLT_SRCID_SHIFT;
3880*53ee8cc1Swenshuai.xi 
3881*53ee8cc1Swenshuai.xi         if(u32SrcId >= TSP_MERGESTREAM_NUM)
3882*53ee8cc1Swenshuai.xi         {
3883*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST,"[%s][%d] Stream index out of range!!\n",__FUNCTION__,__LINE__);
3884*53ee8cc1Swenshuai.xi         }
3885*53ee8cc1Swenshuai.xi 
3886*53ee8cc1Swenshuai.xi     #if HW_PCRFLT_ENABLE
3887*53ee8cc1Swenshuai.xi         if(E_TSP_FLT_USER_PCR == (eFltType & E_TSP_FLT_USER_MASK))
3888*53ee8cc1Swenshuai.xi         {
3889*53ee8cc1Swenshuai.xi             if ((i >= HAL_TSP_PCRFLT_GET_ID(0)) && (i <= HAL_TSP_PCRFLT_GET_ID(TSP_PCRFLT_NUM - 1)))
3890*53ee8cc1Swenshuai.xi             {
3891*53ee8cc1Swenshuai.xi                 MS_U32 u32PcrId = i - _tspFltIdMap.u32PcrFltId_Start;;
3892*53ee8cc1Swenshuai.xi 
3893*53ee8cc1Swenshuai.xi                 HAL_TSP_PcrFlt_SetSrcId(u32PcrId, u32SrcId);
3894*53ee8cc1Swenshuai.xi             }
3895*53ee8cc1Swenshuai.xi         }
3896*53ee8cc1Swenshuai.xi         else
3897*53ee8cc1Swenshuai.xi     #endif // end HW_PCRFLT_ENABLE
3898*53ee8cc1Swenshuai.xi         {
3899*53ee8cc1Swenshuai.xi             HAL_TSP_PidFlt_SetSrcID(i,u32SrcId);
3900*53ee8cc1Swenshuai.xi         }
3901*53ee8cc1Swenshuai.xi     }
3902*53ee8cc1Swenshuai.xi #endif // end MERGE_STR_SUPPORT
3903*53ee8cc1Swenshuai.xi 
3904*53ee8cc1Swenshuai.xi 
3905*53ee8cc1Swenshuai.xi     // Select FLT out
3906*53ee8cc1Swenshuai.xi     // MDrv_TSP_FLT_Enable
3907*53ee8cc1Swenshuai.xi 
3908*53ee8cc1Swenshuai.xi     // Set FLT_USR Type
3909*53ee8cc1Swenshuai.xi     type = E_TSP_FLT_USER_MASK & _ptsp_res->_tspInfo.FltType[i];
3910*53ee8cc1Swenshuai.xi     if (type)
3911*53ee8cc1Swenshuai.xi     {
3912*53ee8cc1Swenshuai.xi         switch (type)
3913*53ee8cc1Swenshuai.xi         {
3914*53ee8cc1Swenshuai.xi         case E_TSP_FLT_USER_SEC:
3915*53ee8cc1Swenshuai.xi         case E_TSP_FLT_USER_PES:
3916*53ee8cc1Swenshuai.xi         case E_TSP_FLT_USER_PKT:
3917*53ee8cc1Swenshuai.xi         case E_TSP_FLT_USER_TTX:
3918*53ee8cc1Swenshuai.xi             HAL_TSP_SecFlt_SetType(pSecFlt, type >> E_TSP_FLT_USER_SHFT);
3919*53ee8cc1Swenshuai.xi             break;
3920*53ee8cc1Swenshuai.xi         case E_TSP_FLT_USER_PCR:
3921*53ee8cc1Swenshuai.xi         //if TSP support PCR hardware , we don't use section filter to capture PCR from TS packet
3922*53ee8cc1Swenshuai.xi         //otherwise , set operation type of section filter to PCR
3923*53ee8cc1Swenshuai.xi         #if !HW_PCRFLT_ENABLE
3924*53ee8cc1Swenshuai.xi             HAL_TSP_SecFlt_SetType(pSecFlt, type >> E_TSP_FLT_USER_SHFT);
3925*53ee8cc1Swenshuai.xi         #endif
3926*53ee8cc1Swenshuai.xi             break;
3927*53ee8cc1Swenshuai.xi         // Non-SECFLT allocated : PIDFLT & special FLT only
3928*53ee8cc1Swenshuai.xi         case E_TSP_FLT_USER_EMM:
3929*53ee8cc1Swenshuai.xi         case E_TSP_FLT_USER_ECM:
3930*53ee8cc1Swenshuai.xi             // select no section type;
3931*53ee8cc1Swenshuai.xi             HAL_TSP_SecFlt_SetType(pSecFlt, 0);
3932*53ee8cc1Swenshuai.xi             break;
3933*53ee8cc1Swenshuai.xi #if defined(__LEGACY__)
3934*53ee8cc1Swenshuai.xi         case E_TSP_FLT_USER_OAD:
3935*53ee8cc1Swenshuai.xi #endif
3936*53ee8cc1Swenshuai.xi         default:
3937*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_WARNING, "[%04d] Unsupport FlType = %x\n", __LINE__, type);
3938*53ee8cc1Swenshuai.xi             HAL_TSP_SecFlt_SetType(pSecFlt, 0);
3939*53ee8cc1Swenshuai.xi             break;
3940*53ee8cc1Swenshuai.xi         }
3941*53ee8cc1Swenshuai.xi     }
3942*53ee8cc1Swenshuai.xi 
3943*53ee8cc1Swenshuai.xi     *pu32FltId = i;
3944*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
3945*53ee8cc1Swenshuai.xi }
3946*53ee8cc1Swenshuai.xi 
3947*53ee8cc1Swenshuai.xi 
3948*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3949*53ee8cc1Swenshuai.xi /// Free a PID filter of a TSP unit
3950*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
3951*53ee8cc1Swenshuai.xi /// @param  u32PidFltId             \b IN: index of PID filter to be free
3952*53ee8cc1Swenshuai.xi /// @return TSP_Result
3953*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FLT_Free(MS_U32 u32FltId)3954*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_Free(MS_U32 u32FltId)
3955*53ee8cc1Swenshuai.xi {
3956*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
3957*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32PidFltIdAll > u32FltId, "[%04d] Invalid u32FltId %d\n", __LINE__, (unsigned int)u32FltId);
3958*53ee8cc1Swenshuai.xi     //We do nothing when create dmx flt to record
3959*53ee8cc1Swenshuai.xi     //HAL_TSP_GetCaps(E_TSP_HAL_CAP_TYPE_RECFLT_IDX, &u32RecFltIdx);
3960*53ee8cc1Swenshuai.xi     if(u32FltId == _tspFltIdMap.u32RecFltIdx)
3961*53ee8cc1Swenshuai.xi         return E_TSP_OK;
3962*53ee8cc1Swenshuai.xi 
3963*53ee8cc1Swenshuai.xi     MS_U32              flags;
3964*53ee8cc1Swenshuai.xi // NO Blocking check in blocking TSP_FLT_Free
3965*53ee8cc1Swenshuai.xi //    TSP_ENTRY();
3966*53ee8cc1Swenshuai.xi 
3967*53ee8cc1Swenshuai.xi     if (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.FltState[u32FltId])
3968*53ee8cc1Swenshuai.xi     {
3969*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_FAIL, "[%04d] Invalid Filter\n", __LINE__);
3970*53ee8cc1Swenshuai.xi         return E_TSP_OK ;
3971*53ee8cc1Swenshuai.xi     }
3972*53ee8cc1Swenshuai.xi 
3973*53ee8cc1Swenshuai.xi     // The conditon is used to distinguish the u32FltId is section filter or not.
3974*53ee8cc1Swenshuai.xi     // Here we free all filter type except section filter, including stream filters, PCR filters, etc.
3975*53ee8cc1Swenshuai.xi     // Free non-section filter do not call _TSP_FLT_Free
3976*53ee8cc1Swenshuai.xi     if(u32FltId >= _tspFltIdMap.u32SecFltId_End)
3977*53ee8cc1Swenshuai.xi     {
3978*53ee8cc1Swenshuai.xi         TSP_LOCK();
3979*53ee8cc1Swenshuai.xi         _TSP_FLT_Disable(u32FltId); // disable output
3980*53ee8cc1Swenshuai.xi         _TSP_FLT_Init(u32FltId); // reset pid & status
3981*53ee8cc1Swenshuai.xi 
3982*53ee8cc1Swenshuai.xi         if ((_ptsp_res->_tspInfo.FltType[u32FltId]& E_TSP_FLT_USER_MASK)== E_TSP_FLT_USER_PCR)
3983*53ee8cc1Swenshuai.xi         {
3984*53ee8cc1Swenshuai.xi             MS_U32 u32STCEng;
3985*53ee8cc1Swenshuai.xi 
3986*53ee8cc1Swenshuai.xi             if(_TSP_PcrId_To_StcId(u32FltId, &u32STCEng) == E_TSP_OK)
3987*53ee8cc1Swenshuai.xi             {
3988*53ee8cc1Swenshuai.xi                 _TSP_STC_Free(u32STCEng);
3989*53ee8cc1Swenshuai.xi             }
3990*53ee8cc1Swenshuai.xi         }
3991*53ee8cc1Swenshuai.xi 
3992*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.OwnerId[u32FltId]  = E_TSP_ID_NULL;
3993*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.FltState[u32FltId] = E_TSP_FLT_STATE_FREE;
3994*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.FltType[u32FltId] = E_TSP_FLT_USER_NULL;
3995*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.s32TspEvtId[u32FltId] = -1;
3996*53ee8cc1Swenshuai.xi         TSP_UNLOCK();
3997*53ee8cc1Swenshuai.xi         return E_TSP_OK ;
3998*53ee8cc1Swenshuai.xi     }
3999*53ee8cc1Swenshuai.xi 
4000*53ee8cc1Swenshuai.xi     // Free section filter need to call _TSP_FLT_Free
4001*53ee8cc1Swenshuai.xi     if (E_TSP_EVENT_CB_POLL == (_ptsp_res->_tspInfo.FltEvent[u32FltId] & E_TSP_EVENT_CB_MASK))
4002*53ee8cc1Swenshuai.xi     {
4003*53ee8cc1Swenshuai.xi         TSP_LOCK();
4004*53ee8cc1Swenshuai.xi         _TSP_FLT_Disable(u32FltId); // disable output
4005*53ee8cc1Swenshuai.xi         _TSP_FLT_Init(u32FltId); // reset pid & status
4006*53ee8cc1Swenshuai.xi         _TSP_FLT_Free(u32FltId);
4007*53ee8cc1Swenshuai.xi         TSP_UNLOCK();
4008*53ee8cc1Swenshuai.xi         TSP_FLAG_GetFltDis(u32FltId, &flags, TSP_OS_EVENT_OR_CLEAR);
4009*53ee8cc1Swenshuai.xi         TSP_FLAG_GetSecOvf(u32FltId, &flags, TSP_OS_EVENT_OR_CLEAR);
4010*53ee8cc1Swenshuai.xi         TSP_FLAG_GetSecRdy(u32FltId, &flags, TSP_OS_EVENT_OR_CLEAR);
4011*53ee8cc1Swenshuai.xi 
4012*53ee8cc1Swenshuai.xi     }
4013*53ee8cc1Swenshuai.xi     else if (E_TSP_EVENT_CB_AUTO == (_ptsp_res->_tspInfo.FltEvent[u32FltId] & E_TSP_EVENT_CB_MASK))
4014*53ee8cc1Swenshuai.xi     {
4015*53ee8cc1Swenshuai.xi         if (_ptsp_res->_tspInfo.FltState[u32FltId] == E_TSP_FLT_STATE_ISR_FREE)
4016*53ee8cc1Swenshuai.xi         {
4017*53ee8cc1Swenshuai.xi             // it's freeing
4018*53ee8cc1Swenshuai.xi         }
4019*53ee8cc1Swenshuai.xi         else
4020*53ee8cc1Swenshuai.xi         {
4021*53ee8cc1Swenshuai.xi             TSP_LOCK();
4022*53ee8cc1Swenshuai.xi             _ptsp_res->_tspInfo.FltState[u32FltId] = E_TSP_FLT_STATE_ISR_FREE;
4023*53ee8cc1Swenshuai.xi             TSP_UNLOCK();
4024*53ee8cc1Swenshuai.xi 
4025*53ee8cc1Swenshuai.xi             // Add to FREE list
4026*53ee8cc1Swenshuai.xi             TSP_FLAG_SetFree(u32FltId);
4027*53ee8cc1Swenshuai.xi         }
4028*53ee8cc1Swenshuai.xi         // Wakeup Task
4029*53ee8cc1Swenshuai.xi         TSP_SetEvent(_ptsp_res->_tspInfo.s32TspEvtId[u32FltId], TSP_EVENT_FREEFLT);
4030*53ee8cc1Swenshuai.xi 
4031*53ee8cc1Swenshuai.xi         //Since MApi_DMX_Close() already has a mechanism to wait free done without continuously blocking the mutex.
4032*53ee8cc1Swenshuai.xi         //Here we only return the result of free event is finished or not to MApi_DMX_Close().
4033*53ee8cc1Swenshuai.xi         if (FALSE == TSP_FLAG_GetDone(u32FltId, &flags, TSP_OS_EVENT_OR_CLEAR))
4034*53ee8cc1Swenshuai.xi         {
4035*53ee8cc1Swenshuai.xi             return E_TSP_FAIL;
4036*53ee8cc1Swenshuai.xi         }
4037*53ee8cc1Swenshuai.xi 
4038*53ee8cc1Swenshuai.xi         //To avoid the filter being allocated during ISR free process,
4039*53ee8cc1Swenshuai.xi         //_TSP_FLT_Init and _TSP_FLT_Free are moved from ISR free process to here.
4040*53ee8cc1Swenshuai.xi         //During the ISR free process, we use E_TSP_FLT_STATE_ISR_FREE instead of E_TSP_FLT_STATE_FREE to indicate a freeing filter.
4041*53ee8cc1Swenshuai.xi         TSP_LOCK();
4042*53ee8cc1Swenshuai.xi         _TSP_FLT_Init(u32FltId); // reset pid & status
4043*53ee8cc1Swenshuai.xi         _TSP_FLT_Free(u32FltId);
4044*53ee8cc1Swenshuai.xi         TSP_UNLOCK();
4045*53ee8cc1Swenshuai.xi     }
4046*53ee8cc1Swenshuai.xi     else
4047*53ee8cc1Swenshuai.xi     {
4048*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST,"[DMX_ERR][%s][%d] Free flt error!\n", __FUNCTION__,__LINE__);
4049*53ee8cc1Swenshuai.xi     }
4050*53ee8cc1Swenshuai.xi 
4051*53ee8cc1Swenshuai.xi 
4052*53ee8cc1Swenshuai.xi // NO Blocking check in blocking TSP_FLT_Free
4053*53ee8cc1Swenshuai.xi //    TSP_RETURN(E_TSP_OK);
4054*53ee8cc1Swenshuai.xi     return E_TSP_OK;
4055*53ee8cc1Swenshuai.xi }
4056*53ee8cc1Swenshuai.xi 
4057*53ee8cc1Swenshuai.xi 
4058*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4059*53ee8cc1Swenshuai.xi /// Select section filter of PID filter
4060*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4061*53ee8cc1Swenshuai.xi /// @param  u32PidFltId             \b IN: index of PID filter\n
4062*53ee8cc1Swenshuai.xi /// @param  u32SecFltId             \b IN: index of section filter
4063*53ee8cc1Swenshuai.xi /// @return TSP_Result
4064*53ee8cc1Swenshuai.xi /// @note
4065*53ee8cc1Swenshuai.xi /// The PID filter and section filter pair is one-to-one mapping. User has to
4066*53ee8cc1Swenshuai.xi /// allocate other PID filters if user have more than one section filter for same
4067*53ee8cc1Swenshuai.xi /// PID packet.\n
4068*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PidFlt_Alloc
4069*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FLT_SelSEC(MS_U32 u32FltId,MS_U32 u32BufId)4070*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_SelSEC(MS_U32 u32FltId, MS_U32 u32BufId)
4071*53ee8cc1Swenshuai.xi {
4072*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4073*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32PidFltIdAll > u32FltId, "[%04d] Invalid u32FltId %d\n", __LINE__, (unsigned int)u32FltId);
4074*53ee8cc1Swenshuai.xi 
4075*53ee8cc1Swenshuai.xi     //HAL_TSP_GetCaps(E_TSP_HAL_CAP_TYPE_RECFLT_IDX, &u32RecFltIdx);
4076*53ee8cc1Swenshuai.xi     if(u32FltId == _tspFltIdMap.u32RecFltIdx)
4077*53ee8cc1Swenshuai.xi     {
4078*53ee8cc1Swenshuai.xi         _ptsp_res->u32RecFltBufId = u32BufId;
4079*53ee8cc1Swenshuai.xi         return E_TSP_OK;
4080*53ee8cc1Swenshuai.xi     }
4081*53ee8cc1Swenshuai.xi 
4082*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4083*53ee8cc1Swenshuai.xi     if ( (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.FltState[u32FltId]) ||
4084*53ee8cc1Swenshuai.xi          (E_TSP_FLT_USER_PCR   == (_ptsp_res->_tspInfo.FltType[u32FltId] & E_TSP_FLT_USER_MASK)) )
4085*53ee8cc1Swenshuai.xi     {
4086*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_FAIL, "[%04d] Invalid Filter\n", __LINE__);
4087*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4088*53ee8cc1Swenshuai.xi     }
4089*53ee8cc1Swenshuai.xi 
4090*53ee8cc1Swenshuai.xi     HAL_TSP_SecFlt_SelSecBuf(&(_REGSec->Flt[u32FltId]), u32BufId);
4091*53ee8cc1Swenshuai.xi 
4092*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.Flt2Buf[u32FltId] = u32BufId;
4093*53ee8cc1Swenshuai.xi 
4094*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.MulFlt2Buf[u32BufId] += 1;
4095*53ee8cc1Swenshuai.xi 
4096*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.Buf2Flt[u32BufId] = u32FltId;
4097*53ee8cc1Swenshuai.xi     //ULOGD("TSP", "[%s] MulFlt2Buf %ld = %d \n",__FUNCTION__ ,u32BufId ,_ptsp_res->_tspInfo.MulFlt2Buf[u32BufId]);
4098*53ee8cc1Swenshuai.xi 
4099*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4100*53ee8cc1Swenshuai.xi }
4101*53ee8cc1Swenshuai.xi 
4102*53ee8cc1Swenshuai.xi 
4103*53ee8cc1Swenshuai.xi ///RESERVED
MDrv_TSP_FLT_GetSEC(MS_U32 u32FltId,MS_U32 * pu32BufId)4104*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_GetSEC(MS_U32 u32FltId, MS_U32 *pu32BufId)
4105*53ee8cc1Swenshuai.xi {
4106*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4107*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32PidFltIdAll > u32FltId, "[%04d] Invalid u32FltId %d\n", __LINE__, (unsigned int)u32FltId);
4108*53ee8cc1Swenshuai.xi 
4109*53ee8cc1Swenshuai.xi     //HAL_TSP_GetCaps(E_TSP_HAL_CAP_TYPE_RECFLT_IDX, &u32RecFltIdx);
4110*53ee8cc1Swenshuai.xi     if(u32FltId == _tspFltIdMap.u32RecFltIdx)
4111*53ee8cc1Swenshuai.xi     {
4112*53ee8cc1Swenshuai.xi         *pu32BufId = _ptsp_res->u32RecFltBufId;
4113*53ee8cc1Swenshuai.xi         return E_TSP_OK;
4114*53ee8cc1Swenshuai.xi     }
4115*53ee8cc1Swenshuai.xi 
4116*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4117*53ee8cc1Swenshuai.xi     if ( (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.FltState[u32FltId]) ||
4118*53ee8cc1Swenshuai.xi          (E_TSP_FLT_USER_PCR   == (_ptsp_res->_tspInfo.FltType[u32FltId] & E_TSP_FLT_USER_MASK)) )
4119*53ee8cc1Swenshuai.xi     {
4120*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_FAIL, "[%04d] Invalid Filter\n", __LINE__);
4121*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4122*53ee8cc1Swenshuai.xi     }
4123*53ee8cc1Swenshuai.xi 
4124*53ee8cc1Swenshuai.xi     //u32BufId = _ptsp_res->_tspInfo.Flt2Buf[u32Fltid];
4125*53ee8cc1Swenshuai.xi     *pu32BufId = (MS_U32)HAL_TSP_SecFlt_GetSecBuf(&(_REGSec->Flt[u32FltId]));
4126*53ee8cc1Swenshuai.xi 
4127*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4128*53ee8cc1Swenshuai.xi }
4129*53ee8cc1Swenshuai.xi ///RESERVED
4130*53ee8cc1Swenshuai.xi 
MDrv_TSP_FLT_SetPCRSrc(MS_U32 u32FltId,MS_U32 u32PCRSrc)4131*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_SetPCRSrc(MS_U32 u32FltId,MS_U32 u32PCRSrc)
4132*53ee8cc1Swenshuai.xi {
4133*53ee8cc1Swenshuai.xi     // @TODO need to take care PCR SRC from MM here
4134*53ee8cc1Swenshuai.xi     MS_U32 u32FltSrc = E_TSP_FLT_SRC_MASK & u32PCRSrc;
4135*53ee8cc1Swenshuai.xi     TSP_PIDFLT_SRC ePidFltSrc = _TSP_DrvHal_FltSrcMapping(u32FltSrc);
4136*53ee8cc1Swenshuai.xi     TSP_PCR_SRC ePcrSrc = HAL_TSP_FltSrc2PCRSrc_Mapping(ePidFltSrc);
4137*53ee8cc1Swenshuai.xi 
4138*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4139*53ee8cc1Swenshuai.xi 
4140*53ee8cc1Swenshuai.xi     if ((u32FltId >= TSP_PCRFLT_GET_ID(0)) && (u32FltId <= TSP_PCRFLT_GET_ID(TSP_PCRFLT_NUM - 1)))
4141*53ee8cc1Swenshuai.xi     {
4142*53ee8cc1Swenshuai.xi         HAL_TSP_PcrFlt_SetSrc((u32FltId - _tspFltIdMap.u32PcrFltId_Start), ePcrSrc);
4143*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_OK);
4144*53ee8cc1Swenshuai.xi     }
4145*53ee8cc1Swenshuai.xi     else
4146*53ee8cc1Swenshuai.xi     {
4147*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL);
4148*53ee8cc1Swenshuai.xi     }
4149*53ee8cc1Swenshuai.xi }
4150*53ee8cc1Swenshuai.xi 
MDrv_TSP_FLT_SetFltRushPass(MS_U32 u32FltId,MS_U8 u8Enable)4151*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_SetFltRushPass(MS_U32 u32FltId, MS_U8 u8Enable)
4152*53ee8cc1Swenshuai.xi {
4153*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4154*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32PidFltIdAll > u32FltId, "[%04d] Invalid u32FltId %d\n", __LINE__, (unsigned int)u32FltId);
4155*53ee8cc1Swenshuai.xi 
4156*53ee8cc1Swenshuai.xi     //HAL_TSP_GetCaps(E_TSP_HAL_CAP_TYPE_RECFLT_IDX, &u32RecFltIdx);
4157*53ee8cc1Swenshuai.xi     if(u32FltId == _tspFltIdMap.u32RecFltIdx)
4158*53ee8cc1Swenshuai.xi         return E_TSP_OK;
4159*53ee8cc1Swenshuai.xi 
4160*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4161*53ee8cc1Swenshuai.xi     if ( (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.FltState[u32FltId]) ||
4162*53ee8cc1Swenshuai.xi          (E_TSP_FLT_USER_PCR   == (_ptsp_res->_tspInfo.FltType[u32FltId] & E_TSP_FLT_USER_MASK)) )
4163*53ee8cc1Swenshuai.xi     {
4164*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_FAIL, "[%04d] Invalid Filter\n", __LINE__);
4165*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4166*53ee8cc1Swenshuai.xi     }
4167*53ee8cc1Swenshuai.xi 
4168*53ee8cc1Swenshuai.xi     HAL_TSP_PidFlt_SetFltRushPass(u32FltId, u8Enable);
4169*53ee8cc1Swenshuai.xi 
4170*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4171*53ee8cc1Swenshuai.xi }
4172*53ee8cc1Swenshuai.xi 
4173*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4174*53ee8cc1Swenshuai.xi /// Set PID to a PID filter
4175*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4176*53ee8cc1Swenshuai.xi /// @param  u32PidFltId             \b IN: index of PID filter to be set
4177*53ee8cc1Swenshuai.xi /// @param  u32PID                  \b IN: PID value
4178*53ee8cc1Swenshuai.xi /// @return TSP_Result
4179*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FLT_SetPID(MS_U32 u32FltId,MS_U32 u32PID)4180*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_SetPID(MS_U32 u32FltId, MS_U32 u32PID)
4181*53ee8cc1Swenshuai.xi {
4182*53ee8cc1Swenshuai.xi    TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4183*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32PidFltIdAll > u32FltId, "[%04d] Invalid u32FltId %d\n", __LINE__, (unsigned int)u32FltId);
4184*53ee8cc1Swenshuai.xi 
4185*53ee8cc1Swenshuai.xi     //HAL_TSP_GetCaps(E_TSP_HAL_CAP_TYPE_RECFLT_IDX ,&u32RecFltIdx);
4186*53ee8cc1Swenshuai.xi     if(u32FltId == _tspFltIdMap.u32RecFltIdx)
4187*53ee8cc1Swenshuai.xi     {
4188*53ee8cc1Swenshuai.xi         _ptsp_res->u32RecFltPID = u32PID;
4189*53ee8cc1Swenshuai.xi         return E_TSP_OK;
4190*53ee8cc1Swenshuai.xi     }
4191*53ee8cc1Swenshuai.xi 
4192*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4193*53ee8cc1Swenshuai.xi     if (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.FltState[u32FltId])
4194*53ee8cc1Swenshuai.xi     {
4195*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_FAIL, "[%04d] Invalid Filter\n", __LINE__);
4196*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4197*53ee8cc1Swenshuai.xi     }
4198*53ee8cc1Swenshuai.xi 
4199*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.Pid[u32FltId] = u32PID ;
4200*53ee8cc1Swenshuai.xi 
4201*53ee8cc1Swenshuai.xi     if(u32FltId < _tspFltIdMap.u32PidFltId_End)
4202*53ee8cc1Swenshuai.xi     {
4203*53ee8cc1Swenshuai.xi         HAL_TSP_PidFlt_SetPid(u32FltId, u32PID);
4204*53ee8cc1Swenshuai.xi     }
4205*53ee8cc1Swenshuai.xi 
4206*53ee8cc1Swenshuai.xi     if ((_ptsp_res->_tspInfo.FltType[u32FltId]& E_TSP_FLT_USER_MASK) == E_TSP_FLT_USER_PCR )
4207*53ee8cc1Swenshuai.xi     {
4208*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "Set PCR FLT=%d PID = %8X \n\n",(unsigned int)u32FltId,(unsigned int)u32PID);
4209*53ee8cc1Swenshuai.xi 
4210*53ee8cc1Swenshuai.xi          if ((u32FltId >= TSP_PCRFLT_GET_ID(0)) && (u32FltId <= TSP_PCRFLT_GET_ID(TSP_PCRFLT_NUM - 1)))
4211*53ee8cc1Swenshuai.xi         {
4212*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_SetPid((u32FltId - _tspFltIdMap.u32PcrFltId_Start), u32PID);
4213*53ee8cc1Swenshuai.xi             //HAL_TSP_PcrFlt_Enable((u32FltId - TSP_PCRFLT_START_ID), TRUE);
4214*53ee8cc1Swenshuai.xi         }
4215*53ee8cc1Swenshuai.xi         else
4216*53ee8cc1Swenshuai.xi         {
4217*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[%s][%d] Incorrect PCR filter ID !!\n",__FUNCTION__,__LINE__);
4218*53ee8cc1Swenshuai.xi         }
4219*53ee8cc1Swenshuai.xi     }
4220*53ee8cc1Swenshuai.xi 
4221*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4222*53ee8cc1Swenshuai.xi }
4223*53ee8cc1Swenshuai.xi 
4224*53ee8cc1Swenshuai.xi 
4225*53ee8cc1Swenshuai.xi ///RESERVED
MDrv_TSP_FLT_GetPID(MS_U32 u32FltId,MS_U32 * pu32PID)4226*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_GetPID(MS_U32 u32FltId, MS_U32 *pu32PID)
4227*53ee8cc1Swenshuai.xi {
4228*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4229*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32PidFltIdAll > u32FltId, "[%04d] Invalid u32FltId %d\n", __LINE__, (unsigned int)u32FltId);
4230*53ee8cc1Swenshuai.xi 
4231*53ee8cc1Swenshuai.xi    // HAL_TSP_GetCaps(E_TSP_HAL_CAP_TYPE_RECFLT_IDX, &u32RecFltIdx);
4232*53ee8cc1Swenshuai.xi     if(u32FltId == _tspFltIdMap.u32RecFltIdx)
4233*53ee8cc1Swenshuai.xi     {
4234*53ee8cc1Swenshuai.xi         *pu32PID = _ptsp_res->u32RecFltPID;
4235*53ee8cc1Swenshuai.xi         return E_TSP_OK;
4236*53ee8cc1Swenshuai.xi     }
4237*53ee8cc1Swenshuai.xi 
4238*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4239*53ee8cc1Swenshuai.xi     if (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.FltState[u32FltId])
4240*53ee8cc1Swenshuai.xi     {
4241*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_FAIL, "[%04d] Invalid Filter\n", __LINE__);
4242*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4243*53ee8cc1Swenshuai.xi     }
4244*53ee8cc1Swenshuai.xi     else
4245*53ee8cc1Swenshuai.xi     {
4246*53ee8cc1Swenshuai.xi     #if HW_PCRFLT_ENABLE
4247*53ee8cc1Swenshuai.xi         if((_ptsp_res->_tspInfo.FltType[u32FltId]& E_TSP_FLT_USER_MASK) == E_TSP_FLT_USER_PCR)
4248*53ee8cc1Swenshuai.xi         {
4249*53ee8cc1Swenshuai.xi             if ((u32FltId >= HAL_TSP_PCRFLT_GET_ID(0)) && (u32FltId <= HAL_TSP_PCRFLT_GET_ID(TSP_PCRFLT_NUM - 1)))
4250*53ee8cc1Swenshuai.xi             {
4251*53ee8cc1Swenshuai.xi                 *pu32PID = HAL_TSP_PcrFlt_GetPid(u32FltId - _tspFltIdMap.u32PcrFltId_Start);
4252*53ee8cc1Swenshuai.xi             }
4253*53ee8cc1Swenshuai.xi         }
4254*53ee8cc1Swenshuai.xi         else
4255*53ee8cc1Swenshuai.xi     #endif
4256*53ee8cc1Swenshuai.xi         {
4257*53ee8cc1Swenshuai.xi             *pu32PID = HAL_TSP_PidFlt_GetPid(&(_REGPid0->Flt[u32FltId]));
4258*53ee8cc1Swenshuai.xi         }
4259*53ee8cc1Swenshuai.xi     }
4260*53ee8cc1Swenshuai.xi 
4261*53ee8cc1Swenshuai.xi     if (_ptsp_res->_tspInfo.Pid[u32FltId] != *pu32PID)
4262*53ee8cc1Swenshuai.xi         TSP_OS_Print("[%s] Sw/Hw conflict => Pid Value mismatch \n",__FUNCTION__);
4263*53ee8cc1Swenshuai.xi 
4264*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4265*53ee8cc1Swenshuai.xi }
4266*53ee8cc1Swenshuai.xi 
4267*53ee8cc1Swenshuai.xi ///RESERVED
4268*53ee8cc1Swenshuai.xi 
4269*53ee8cc1Swenshuai.xi 
4270*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4271*53ee8cc1Swenshuai.xi // Set section filtering mode
4272*53ee8cc1Swenshuai.xi // @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4273*53ee8cc1Swenshuai.xi // @param  u32SecFltId             \b IN: section filter of TSP to be free
4274*53ee8cc1Swenshuai.xi // @param  eSecFltMode             \b IN: continue/one-shot mode of section filter
4275*53ee8cc1Swenshuai.xi // @return TSP_Result
4276*53ee8cc1Swenshuai.xi // @attention
4277*53ee8cc1Swenshuai.xi // One-shot filter has the disadvantage of interrupt lost becuase it stops filter, a timeout
4278*53ee8cc1Swenshuai.xi // to check filter status is better for usage.
4279*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FLT_SetMode(MS_U32 u32FltId,TSP_FltMode eFltMode)4280*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_SetMode(MS_U32 u32FltId, TSP_FltMode eFltMode)
4281*53ee8cc1Swenshuai.xi {
4282*53ee8cc1Swenshuai.xi     MS_U32         uMode = 0;
4283*53ee8cc1Swenshuai.xi 
4284*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4285*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32SecFltId_End > u32FltId, "[%04d] Invalid u32FltId %d\n", __LINE__, (unsigned int)u32FltId);
4286*53ee8cc1Swenshuai.xi 
4287*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4288*53ee8cc1Swenshuai.xi     if (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.FltState[u32FltId])
4289*53ee8cc1Swenshuai.xi     {
4290*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_FAIL, "[%04d] Invalid Filter\n", __LINE__);
4291*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4292*53ee8cc1Swenshuai.xi     }
4293*53ee8cc1Swenshuai.xi 
4294*53ee8cc1Swenshuai.xi     if((eFltMode & E_TSP_FLT_MODE_CRCCHK) && (eFltMode & E_TSP_FLT_MODE_AUTO_CRCCHK))
4295*53ee8cc1Swenshuai.xi     {
4296*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_WARNING, "[%04d] E_TSP_FLT_MODE_CRCCHK and E_TSP_FLT_MODE_AUTO_CRCCHK can't be set together. \n", __LINE__);
4297*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4298*53ee8cc1Swenshuai.xi     }
4299*53ee8cc1Swenshuai.xi 
4300*53ee8cc1Swenshuai.xi     if (eFltMode & E_TSP_FLT_MODE_ONESHOT)
4301*53ee8cc1Swenshuai.xi     {
4302*53ee8cc1Swenshuai.xi         uMode |= TSP_SECFLT_MODE_ONESHOT;
4303*53ee8cc1Swenshuai.xi     }
4304*53ee8cc1Swenshuai.xi 
4305*53ee8cc1Swenshuai.xi     if (eFltMode & E_TSP_FLT_MODE_CRCCHK)
4306*53ee8cc1Swenshuai.xi     {
4307*53ee8cc1Swenshuai.xi         uMode |= TSP_SECFLT_MODE_CRCCHK;
4308*53ee8cc1Swenshuai.xi     }
4309*53ee8cc1Swenshuai.xi 
4310*53ee8cc1Swenshuai.xi     if (eFltMode & E_TSP_FLT_MODE_AUTO_CRCCHK)
4311*53ee8cc1Swenshuai.xi         HAL_TSP_SecFlt_SetAutoCRCChk(&(_REGSec->Flt[u32FltId]), TRUE);
4312*53ee8cc1Swenshuai.xi     else
4313*53ee8cc1Swenshuai.xi         HAL_TSP_SecFlt_SetAutoCRCChk(&(_REGSec->Flt[u32FltId]), FALSE);
4314*53ee8cc1Swenshuai.xi 
4315*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.FltMode[u32FltId] = eFltMode;
4316*53ee8cc1Swenshuai.xi 
4317*53ee8cc1Swenshuai.xi     HAL_TSP_SecFlt_SetMode(&(_REGSec->Flt[u32FltId]), uMode);
4318*53ee8cc1Swenshuai.xi 
4319*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4320*53ee8cc1Swenshuai.xi }
4321*53ee8cc1Swenshuai.xi 
4322*53ee8cc1Swenshuai.xi 
4323*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4324*53ee8cc1Swenshuai.xi /// Set Match/Mask filter pattern of section filter
4325*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4326*53ee8cc1Swenshuai.xi /// @param  u32SecFltId             \b IN: index of filter to be set pattern
4327*53ee8cc1Swenshuai.xi /// @param  pu8Match                \b IN: pointer of filter pattern (in @ref DRVTSP_FILTER_DEPTH bytes)
4328*53ee8cc1Swenshuai.xi /// @param  pu8Mask                 \b IN: pointer of pattern bitmask (in @ref DRVTSP_FILTER_DEPTH bytes)
4329*53ee8cc1Swenshuai.xi /// @param  bNotMatch               \b IN: negative the result of comparion of filter
4330*53ee8cc1Swenshuai.xi /// @return TSP_Result
4331*53ee8cc1Swenshuai.xi /// note: match mask -- must set 0 to be compare (customer request)
4332*53ee8cc1Swenshuai.xi ///       not match mask -- must set 1 to compare
4333*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FLT_SetMatch(MS_U32 u32FltId,MS_U8 * pu8Match,MS_U8 * pu8Mask,MS_U8 * pu8NMask)4334*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_SetMatch(MS_U32 u32FltId, MS_U8 *pu8Match, MS_U8 *pu8Mask, MS_U8 *pu8NMask)
4335*53ee8cc1Swenshuai.xi {
4336*53ee8cc1Swenshuai.xi     static MS_U8        mask[TSP_FILTER_DEPTH];
4337*53ee8cc1Swenshuai.xi     int                 i;
4338*53ee8cc1Swenshuai.xi 
4339*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4340*53ee8cc1Swenshuai.xi 
4341*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32SecFltId_End  > u32FltId, "[%04d] Invalid u32FltId %d\n", __LINE__, (unsigned int)u32FltId);
4342*53ee8cc1Swenshuai.xi 
4343*53ee8cc1Swenshuai.xi     TSP_CHECK(pu8Match, "[%04d] Invalid Match Pointer\n", __LINE__);
4344*53ee8cc1Swenshuai.xi     TSP_CHECK(pu8Mask,  "[%04d] Invalid Mask  Pointer\n", __LINE__);
4345*53ee8cc1Swenshuai.xi     TSP_CHECK(pu8NMask, "[%04d] Invalid NMask Pointer\n", __LINE__);
4346*53ee8cc1Swenshuai.xi 
4347*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4348*53ee8cc1Swenshuai.xi     if (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.FltState[u32FltId])
4349*53ee8cc1Swenshuai.xi     {
4350*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_FAIL, "[%04d] Invalid Filter\n", __LINE__);
4351*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4352*53ee8cc1Swenshuai.xi     }
4353*53ee8cc1Swenshuai.xi 
4354*53ee8cc1Swenshuai.xi     for (i = 0 ; i < TSP_FILTER_DEPTH ; i++)
4355*53ee8cc1Swenshuai.xi     {   // invert the mask for HW specified
4356*53ee8cc1Swenshuai.xi         //*((MS_U32*)(mask+(i<<2))) = ~(*((MS_U32*)(pu8Mask+(i<<2))));
4357*53ee8cc1Swenshuai.xi          mask[i] = ~pu8Mask[i];
4358*53ee8cc1Swenshuai.xi     }
4359*53ee8cc1Swenshuai.xi 
4360*53ee8cc1Swenshuai.xi     HAL_TSP_SecFlt_SetMask (&(_REGSec->Flt[u32FltId]), mask);
4361*53ee8cc1Swenshuai.xi     HAL_TSP_SecFlt_SetMatch(&(_REGSec->Flt[u32FltId]), pu8Match);
4362*53ee8cc1Swenshuai.xi     HAL_TSP_SecFlt_SetNMask(&(_REGSec->Flt[u32FltId]), pu8NMask);
4363*53ee8cc1Swenshuai.xi 
4364*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4365*53ee8cc1Swenshuai.xi }
4366*53ee8cc1Swenshuai.xi 
4367*53ee8cc1Swenshuai.xi 
4368*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4369*53ee8cc1Swenshuai.xi /// Subscribe event notification callback function for specified section filter
4370*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4371*53ee8cc1Swenshuai.xi /// @param  u32SecFltId             \b IN: index of section buffer
4372*53ee8cc1Swenshuai.xi /// @param  eEvents                 \b IN: events need to be subscribed\n
4373*53ee8cc1Swenshuai.xi ///                                        @ref E_TSP_EVENT_DATA_READY\n
4374*53ee8cc1Swenshuai.xi ///                                        @ref E_TSP_EVENT_BUF_OVERFLOW
4375*53ee8cc1Swenshuai.xi /// @param  pfCallback              \b IN: callback function (NULL to disable)
4376*53ee8cc1Swenshuai.xi /// @return TSP_Result
4377*53ee8cc1Swenshuai.xi /// @note
4378*53ee8cc1Swenshuai.xi /// This function register a callback function for a section filter to TSP.
4379*53ee8cc1Swenshuai.xi /// TSP calls callback function each time when data is ready in section buffer.\n
4380*53ee8cc1Swenshuai.xi /// Data ready of section filter:\n
4381*53ee8cc1Swenshuai.xi /// @ref E_TSP_FLT_TYPE_SECTION : a section ready\n
4382*53ee8cc1Swenshuai.xi /// @ref E_TSP_FLT_TYPE_PES : PES packet ready or received data over than request size.
4383*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_SecFlt_SetReqCount
4384*53ee8cc1Swenshuai.xi /// @attention
4385*53ee8cc1Swenshuai.xi /// Callback function resides in OS TSP interrupt context, it recommends
4386*53ee8cc1Swenshuai.xi /// that callback function should not take too much time to block the system.
4387*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FLT_SetCallback(MS_U32 u32FltId,TSP_Event eEvents,P_TSP_Callback pfCallback)4388*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_SetCallback(MS_U32 u32FltId, TSP_Event eEvents, P_TSP_Callback pfCallback)
4389*53ee8cc1Swenshuai.xi {
4390*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4391*53ee8cc1Swenshuai.xi 
4392*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32SecFltId_End > u32FltId, "[%04d] Invalid u32FltId %d\n", __LINE__, (unsigned int)u32FltId);
4393*53ee8cc1Swenshuai.xi 
4394*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4395*53ee8cc1Swenshuai.xi 
4396*53ee8cc1Swenshuai.xi     if ((eEvents & (E_TSP_EVENT_DATA_READY | E_TSP_EVENT_BUF_OVERFLOW)) == 0)
4397*53ee8cc1Swenshuai.xi     {
4398*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_PARAMETER);
4399*53ee8cc1Swenshuai.xi     }
4400*53ee8cc1Swenshuai.xi 
4401*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.FltEvent[u32FltId]    = eEvents;
4402*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.FltCallback[u32FltId] = pfCallback;
4403*53ee8cc1Swenshuai.xi 
4404*53ee8cc1Swenshuai.xi     if (E_TSP_EVENT_CB_AUTO == (_ptsp_res->_tspInfo.FltEvent[u32FltId] & E_TSP_EVENT_CB_MASK))
4405*53ee8cc1Swenshuai.xi     {
4406*53ee8cc1Swenshuai.xi         TSP_FLAG_SetModeFlags(u32FltId);
4407*53ee8cc1Swenshuai.xi     }
4408*53ee8cc1Swenshuai.xi 
4409*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4410*53ee8cc1Swenshuai.xi }
4411*53ee8cc1Swenshuai.xi 
_MDrv_TSP_FLT_Enable(MS_U32 u32FltId,MS_BOOL bEnable)4412*53ee8cc1Swenshuai.xi TSP_Result _MDrv_TSP_FLT_Enable(MS_U32 u32FltId, MS_BOOL bEnable)
4413*53ee8cc1Swenshuai.xi {
4414*53ee8cc1Swenshuai.xi     REG_SecFlt *        pSecFlt = NULL;
4415*53ee8cc1Swenshuai.xi     REG_SecBuf *        pSecBuf = NULL;
4416*53ee8cc1Swenshuai.xi     MS_U32              type;
4417*53ee8cc1Swenshuai.xi     TSP_PIDFLT_SRC      ePidFltSrc = E_TSP_PIDFLT_INVALID;
4418*53ee8cc1Swenshuai.xi     MS_U32              u32Src, u32PvrLutDest = 0;
4419*53ee8cc1Swenshuai.xi     MS_U16              u16BufId = 0;
4420*53ee8cc1Swenshuai.xi     MS_U32              dummy;
4421*53ee8cc1Swenshuai.xi 
4422*53ee8cc1Swenshuai.xi     // Enable PVR I Frame LUT.
4423*53ee8cc1Swenshuai.xi     if( E_TSP_DST_IFRAME_LUT & _ptsp_res->_tspInfo.FltType[u32FltId])
4424*53ee8cc1Swenshuai.xi         u32PvrLutDest = TSP_PIDFLT_OUT_LUT;
4425*53ee8cc1Swenshuai.xi 
4426*53ee8cc1Swenshuai.xi     //HAL_TSP_GetCaps(E_TSP_HAL_CAP_TYPE_RECFLT_IDX, &u32RecFltIdx);
4427*53ee8cc1Swenshuai.xi     if(u32FltId == _tspFltIdMap.u32RecFltIdx)
4428*53ee8cc1Swenshuai.xi         return E_TSP_OK;
4429*53ee8cc1Swenshuai.xi 
4430*53ee8cc1Swenshuai.xi     if(u32FltId < _tspFltIdMap.u32SecFltId_End)
4431*53ee8cc1Swenshuai.xi     {
4432*53ee8cc1Swenshuai.xi         TSP_FLAG_GetFltDis(u32FltId, &dummy, TSP_OS_EVENT_OR_CLEAR);
4433*53ee8cc1Swenshuai.xi 
4434*53ee8cc1Swenshuai.xi         if (bEnable) //clear all filter event.
4435*53ee8cc1Swenshuai.xi         {
4436*53ee8cc1Swenshuai.xi             // MsOS_DelayTask(1); //[Note] For VQ flush,
4437*53ee8cc1Swenshuai.xi             TSP_FLAG_GetSecRdy(u32FltId, &dummy, TSP_OS_EVENT_OR_CLEAR);
4438*53ee8cc1Swenshuai.xi             TSP_FLAG_GetSecOvf(u32FltId, &dummy, TSP_OS_EVENT_OR_CLEAR);
4439*53ee8cc1Swenshuai.xi             TSP_FLAG_GetCrcErr(u32FltId, &dummy, TSP_OS_EVENT_OR_CLEAR);
4440*53ee8cc1Swenshuai.xi             TSP_FLAG_GetFltDis(u32FltId, &dummy, TSP_OS_EVENT_OR_CLEAR);
4441*53ee8cc1Swenshuai.xi             TSP_FLAG_ClrOvfRst(u32FltId);
4442*53ee8cc1Swenshuai.xi         }
4443*53ee8cc1Swenshuai.xi     }
4444*53ee8cc1Swenshuai.xi 
4445*53ee8cc1Swenshuai.xi 
4446*53ee8cc1Swenshuai.xi 
4447*53ee8cc1Swenshuai.xi     if (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.FltState[u32FltId])
4448*53ee8cc1Swenshuai.xi     {
4449*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_FAIL, "[%04d] Invalid Filter\n", __LINE__);
4450*53ee8cc1Swenshuai.xi         return E_TSP_FAIL_INVALID;
4451*53ee8cc1Swenshuai.xi     }
4452*53ee8cc1Swenshuai.xi 
4453*53ee8cc1Swenshuai.xi     // TSP_FLT_Disable
4454*53ee8cc1Swenshuai.xi     if (!bEnable)
4455*53ee8cc1Swenshuai.xi     {
4456*53ee8cc1Swenshuai.xi         if (_ptsp_res->_tspInfo.FltState[u32FltId] & E_TSP_FLT_STATE_ENABLE) // if enable
4457*53ee8cc1Swenshuai.xi         {
4458*53ee8cc1Swenshuai.xi             _TSP_FLT_Disable(u32FltId);
4459*53ee8cc1Swenshuai.xi         }
4460*53ee8cc1Swenshuai.xi         // TSP_DBG(E_TSP_DBG_FAIL, "[TSP_WARNNING][%04d] Enable an active PidFlt %d\n", __LINE__, u32FltId);
4461*53ee8cc1Swenshuai.xi 
4462*53ee8cc1Swenshuai.xi         return E_TSP_OK;
4463*53ee8cc1Swenshuai.xi     }
4464*53ee8cc1Swenshuai.xi 
4465*53ee8cc1Swenshuai.xi     // TSP_FLT_Enable
4466*53ee8cc1Swenshuai.xi     //connect avfifo to pid flt~
4467*53ee8cc1Swenshuai.xi     u32Src = E_TSP_FLT_SRC_MASK & _ptsp_res->_tspInfo.FltType[u32FltId];
4468*53ee8cc1Swenshuai.xi     ePidFltSrc = _TSP_DrvHal_FltSrcMapping(u32Src);
4469*53ee8cc1Swenshuai.xi     u32Src = HAL_TSP_FltSrc2PktDmx_Mapping(ePidFltSrc);
4470*53ee8cc1Swenshuai.xi 
4471*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(u32Src);
4472*53ee8cc1Swenshuai.xi 
4473*53ee8cc1Swenshuai.xi     type = E_TSP_FLT_FIFO_MASK & _ptsp_res->_tspInfo.FltType[u32FltId];
4474*53ee8cc1Swenshuai.xi 
4475*53ee8cc1Swenshuai.xi     if (type)
4476*53ee8cc1Swenshuai.xi     {
4477*53ee8cc1Swenshuai.xi         switch (type)
4478*53ee8cc1Swenshuai.xi         {
4479*53ee8cc1Swenshuai.xi             case E_TSP_FLT_FIFO_VIDEO ... E_TSP_FLT_FIFO_VIDEO8:
4480*53ee8cc1Swenshuai.xi                 HAL_TSP_FIFO_SetSrc((TSP_DST_SEQ)(E_TSP_DST_FIFO_VIDEO + (type - E_TSP_FLT_FIFO_VIDEO)), u32Src);
4481*53ee8cc1Swenshuai.xi                 HAL_TSP_PidFlt_SetFltOut(u32FltId, HAL_TSP_PidFltDstMapping(E_TSP_PIDFLT_DST_VIDEO, (type - E_TSP_FLT_FIFO_VIDEO)));
4482*53ee8cc1Swenshuai.xi                 break;
4483*53ee8cc1Swenshuai.xi             case E_TSP_FLT_FIFO_AUDIO ... E_TSP_FLT_FIFO_AUDIO6:
4484*53ee8cc1Swenshuai.xi                 HAL_TSP_FIFO_SetSrc((TSP_DST_SEQ)(E_TSP_DST_FIFO_AUDIO + (type - E_TSP_FLT_FIFO_AUDIO)), u32Src);
4485*53ee8cc1Swenshuai.xi                 HAL_TSP_PidFlt_SetFltOut(u32FltId, HAL_TSP_PidFltDstMapping(E_TSP_PIDFLT_DST_AUDIO, (type - E_TSP_FLT_FIFO_AUDIO)));
4486*53ee8cc1Swenshuai.xi                 break;
4487*53ee8cc1Swenshuai.xi             case E_TSP_FLT_FIFO_REC:
4488*53ee8cc1Swenshuai.xi                 // @F_TODO for old style. we might have to check the filter source and it's destination
4489*53ee8cc1Swenshuai.xi                 break;
4490*53ee8cc1Swenshuai.xi             case E_TSP_FLT_FIFO_PVR ... E_TSP_FLT_FIFO_PVR9:
4491*53ee8cc1Swenshuai.xi                 HAL_TSP_PidFlt_SetFltOut(u32FltId, HAL_TSP_PidFltDstMapping(E_TSP_PIDFLT_DST_PVR, (type - E_TSP_FLT_FIFO_PVR)) | u32PvrLutDest);
4492*53ee8cc1Swenshuai.xi                 break;
4493*53ee8cc1Swenshuai.xi 
4494*53ee8cc1Swenshuai.xi             default:
4495*53ee8cc1Swenshuai.xi     //            TSP_DBG(E_TSP_DBG_MUST, "[%04d] Wrong Destination type : %d!\n", __LINE__, type);
4496*53ee8cc1Swenshuai.xi     //            TSP_RETURN(E_TSP_FAIL);
4497*53ee8cc1Swenshuai.xi                 break;
4498*53ee8cc1Swenshuai.xi         }
4499*53ee8cc1Swenshuai.xi     }
4500*53ee8cc1Swenshuai.xi     else
4501*53ee8cc1Swenshuai.xi     {
4502*53ee8cc1Swenshuai.xi         type = E_TSP_FLT_USER_MASK & _ptsp_res->_tspInfo.FltType[u32FltId];
4503*53ee8cc1Swenshuai.xi         if (type)
4504*53ee8cc1Swenshuai.xi         {
4505*53ee8cc1Swenshuai.xi #if 0// defined(__LEGACY__)  we don't need this in kaiser we have bit to set for pvr eng
4506*53ee8cc1Swenshuai.xi             if (E_TSP_FLT_FIFO_PVR == type) // @FIXME WHY??????????
4507*53ee8cc1Swenshuai.xi             {
4508*53ee8cc1Swenshuai.xi                 TSP_DBG(0, "[%04d] Bad PidFltId %ld\n", __LINE__, u32FltId);
4509*53ee8cc1Swenshuai.xi             }
4510*53ee8cc1Swenshuai.xi             else
4511*53ee8cc1Swenshuai.xi #endif
4512*53ee8cc1Swenshuai.xi                 if(u32FltId < _tspFltIdMap.u32SecFltId_End)
4513*53ee8cc1Swenshuai.xi                 {
4514*53ee8cc1Swenshuai.xi                     pSecFlt = &(_REGSec->Flt[u32FltId]);
4515*53ee8cc1Swenshuai.xi                     u16BufId = HAL_TSP_SecFlt_GetSecBuf(pSecFlt);
4516*53ee8cc1Swenshuai.xi                     pSecBuf = &(_REGBuf->Buf[u16BufId]);
4517*53ee8cc1Swenshuai.xi                 }
4518*53ee8cc1Swenshuai.xi 
4519*53ee8cc1Swenshuai.xi                 //TSP_DBG(0, "[%04d] SecBufId = %d\n", __LINE__, u16BufId);
4520*53ee8cc1Swenshuai.xi 
4521*53ee8cc1Swenshuai.xi                 switch (type)
4522*53ee8cc1Swenshuai.xi                 {
4523*53ee8cc1Swenshuai.xi                     case E_TSP_FLT_USER_SEC:
4524*53ee8cc1Swenshuai.xi                     case E_TSP_FLT_USER_PES:
4525*53ee8cc1Swenshuai.xi                     case E_TSP_FLT_USER_PKT:
4526*53ee8cc1Swenshuai.xi                     case E_TSP_FLT_USER_TTX:
4527*53ee8cc1Swenshuai.xi                         if (_ptsp_res->_tspInfo.Flt2Buf[u32FltId] == TSP_FLT2BUF_NULL)
4528*53ee8cc1Swenshuai.xi                         {
4529*53ee8cc1Swenshuai.xi                             return E_TSP_FAIL_FUNCTION;
4530*53ee8cc1Swenshuai.xi                         }
4531*53ee8cc1Swenshuai.xi                         if(_ptsp_res->_tspInfo.MulFlt2Buf[u16BufId] == 1) // single filter and single buffer
4532*53ee8cc1Swenshuai.xi                         {
4533*53ee8cc1Swenshuai.xi                             HAL_TSP_SecBuf_Reset(pSecBuf);
4534*53ee8cc1Swenshuai.xi                         }
4535*53ee8cc1Swenshuai.xi                         if (E_TSP_EVENT_CB_POLL == (_ptsp_res->_tspInfo.FltEvent[u32FltId] & E_TSP_EVENT_CB_MASK))
4536*53ee8cc1Swenshuai.xi                         {
4537*53ee8cc1Swenshuai.xi     #ifdef MSOS_TYPE_LINUX_KERNEL
4538*53ee8cc1Swenshuai.xi                             HAL_TSP_HCMD_SecRdyInt_Disable(u32FltId,FALSE);
4539*53ee8cc1Swenshuai.xi     #else
4540*53ee8cc1Swenshuai.xi                             HAL_TSP_HCMD_SecRdyInt_Disable(u32FltId,TRUE);
4541*53ee8cc1Swenshuai.xi     #endif
4542*53ee8cc1Swenshuai.xi                         }
4543*53ee8cc1Swenshuai.xi                         else // E_TSP_EVENT_CB_AUTO
4544*53ee8cc1Swenshuai.xi                         {
4545*53ee8cc1Swenshuai.xi                             HAL_TSP_HCMD_SecRdyInt_Disable(u32FltId,FALSE);
4546*53ee8cc1Swenshuai.xi                         }
4547*53ee8cc1Swenshuai.xi 
4548*53ee8cc1Swenshuai.xi                         HAL_TSP_SecFlt_ResetState(pSecFlt);
4549*53ee8cc1Swenshuai.xi                         HAL_TSP_SecFlt_ResetRmnCnt(pSecFlt);
4550*53ee8cc1Swenshuai.xi                         HAL_TSP_PidFlt_SetFltOut(u32FltId, TSP_PIDFLT_OUT_SECFLT);
4551*53ee8cc1Swenshuai.xi                         break;
4552*53ee8cc1Swenshuai.xi                     case E_TSP_FLT_USER_EMM: // @NOTE LEGACY
4553*53ee8cc1Swenshuai.xi                     case E_TSP_FLT_USER_ECM:
4554*53ee8cc1Swenshuai.xi                         HAL_TSP_PidFlt_SetFltOut(u32FltId, TSP_PIDFLT_OUT_NONE);
4555*53ee8cc1Swenshuai.xi                         break;
4556*53ee8cc1Swenshuai.xi 
4557*53ee8cc1Swenshuai.xi                     case E_TSP_FLT_USER_PCR:
4558*53ee8cc1Swenshuai.xi                     #if HW_PCRFLT_ENABLE
4559*53ee8cc1Swenshuai.xi 
4560*53ee8cc1Swenshuai.xi                         if ((u32FltId >= HAL_TSP_PCRFLT_GET_ID(0)) && (u32FltId <= HAL_TSP_PCRFLT_GET_ID(TSP_PCRFLT_NUM - 1)))
4561*53ee8cc1Swenshuai.xi                         {
4562*53ee8cc1Swenshuai.xi                             MS_U32 u32PcrId = u32FltId - _tspFltIdMap.u32PcrFltId_Start;
4563*53ee8cc1Swenshuai.xi                             MS_U32 u32PcrUpdateEndEn = HAL_TSP_PcrFlt_GetIntMask(u32PcrId);
4564*53ee8cc1Swenshuai.xi 
4565*53ee8cc1Swenshuai.xi                             _TSP_SetHwPcrNotifyId(u32PcrId);
4566*53ee8cc1Swenshuai.xi                             _ptsp_res->_u8_ResetPcr[u32PcrId] = 3;
4567*53ee8cc1Swenshuai.xi                             _ptsp_res->_u32_PrevStcBase[u32PcrId] = 0;
4568*53ee8cc1Swenshuai.xi                             _ptsp_res->_u32_PrevPllControl[u32PcrId] = 0;
4569*53ee8cc1Swenshuai.xi                             _ptsp_res->_u32_StcOffset[u32PcrId].u32StcOffset = 0;
4570*53ee8cc1Swenshuai.xi                             _ptsp_res->_u32_StcOffset[u32PcrId].bAdd = TRUE;
4571*53ee8cc1Swenshuai.xi                             _ptsp_res->_u32_StcUpdateCtrl[u32PcrId].bEnable = TRUE;
4572*53ee8cc1Swenshuai.xi                             _ptsp_res->_u32_StcUpdateCtrl[u32PcrId].bUpdateOnce = FALSE;
4573*53ee8cc1Swenshuai.xi                             HAL_TSP_PcrFlt_Enable(u32PcrId, TRUE);
4574*53ee8cc1Swenshuai.xi                             HAL_TSP_INT_Enable(u32PcrUpdateEndEn);
4575*53ee8cc1Swenshuai.xi                         }
4576*53ee8cc1Swenshuai.xi                         else
4577*53ee8cc1Swenshuai.xi                         {
4578*53ee8cc1Swenshuai.xi                             TSP_DBG(E_TSP_DBG_MUST, "[%s][%d] Incorrect PCR filter ID !!\n", __FUNCTION__, __LINE__);
4579*53ee8cc1Swenshuai.xi                             return E_TSP_FAIL;
4580*53ee8cc1Swenshuai.xi                         }
4581*53ee8cc1Swenshuai.xi 
4582*53ee8cc1Swenshuai.xi                     #else // @F_TODO i think we do not have to support SW PCR update anymore
4583*53ee8cc1Swenshuai.xi                         HAL_TSP_SecFlt_ResetState(pSecFlt);
4584*53ee8cc1Swenshuai.xi                         HAL_TSP_PidFlt_SetFltOut(u32FltId, TSP_PIDFLT_OUT_SECFLT| TSP_PIDFLT_OUT_SECAF); //@NOTE what is SECAF for???? SECAF is for those who has adaption field packet usecase: SWPCR
4585*53ee8cc1Swenshuai.xi                     #endif
4586*53ee8cc1Swenshuai.xi                         break;
4587*53ee8cc1Swenshuai.xi                     default:
4588*53ee8cc1Swenshuai.xi                         TSP_DBG(E_TSP_DBG_MUST, "[%04d] Unsupport FlType = %x\n", __LINE__, _ptsp_res->_tspInfo.FltType[u32FltId]);
4589*53ee8cc1Swenshuai.xi                         return E_TSP_FAIL;
4590*53ee8cc1Swenshuai.xi                         break;
4591*53ee8cc1Swenshuai.xi                 }
4592*53ee8cc1Swenshuai.xi         }
4593*53ee8cc1Swenshuai.xi     }
4594*53ee8cc1Swenshuai.xi 
4595*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.FltState[u32FltId] |= E_TSP_FLT_STATE_ENABLE;
4596*53ee8cc1Swenshuai.xi     return E_TSP_OK;
4597*53ee8cc1Swenshuai.xi }
4598*53ee8cc1Swenshuai.xi 
4599*53ee8cc1Swenshuai.xi 
4600*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4601*53ee8cc1Swenshuai.xi /// Enable PID filter
4602*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4603*53ee8cc1Swenshuai.xi /// @param  u32PidFltId             \b IN: index of filter to be enable
4604*53ee8cc1Swenshuai.xi /// @param  bEnable                 \b IN: TRUE(enable), FALSE(disable)
4605*53ee8cc1Swenshuai.xi /// @return TSP_Result
4606*53ee8cc1Swenshuai.xi /// @note
4607*53ee8cc1Swenshuai.xi /// When PID filter enable, the section buffer pointer will be reset to buffer start address,
4608*53ee8cc1Swenshuai.xi /// overflow condition will be resolved if exist.
4609*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FLT_Enable(MS_U32 u32FltId,MS_BOOL bEnable)4610*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_Enable(MS_U32 u32FltId, MS_BOOL bEnable)
4611*53ee8cc1Swenshuai.xi {
4612*53ee8cc1Swenshuai.xi     TSP_Result eResult;
4613*53ee8cc1Swenshuai.xi 
4614*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4615*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32PidFltIdAll > u32FltId, "[%04d] Invalid u32FltId %d\n", __LINE__, (unsigned int)u32FltId);
4616*53ee8cc1Swenshuai.xi 
4617*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4618*53ee8cc1Swenshuai.xi 
4619*53ee8cc1Swenshuai.xi     eResult = _MDrv_TSP_FLT_Enable(u32FltId, bEnable);
4620*53ee8cc1Swenshuai.xi 
4621*53ee8cc1Swenshuai.xi     TSP_RETURN(eResult);
4622*53ee8cc1Swenshuai.xi }
4623*53ee8cc1Swenshuai.xi 
4624*53ee8cc1Swenshuai.xi 
4625*53ee8cc1Swenshuai.xi //[RESERVED] obsoleted
MDrv_TSP_FLT_SetOwner(MS_U32 u32EngId,MS_U32 u32FltStart,MS_U32 u32FltEnd,MS_BOOL bOwner)4626*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_SetOwner(MS_U32 u32EngId, MS_U32 u32FltStart, MS_U32 u32FltEnd, MS_BOOL bOwner)
4627*53ee8cc1Swenshuai.xi {
4628*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4629*53ee8cc1Swenshuai.xi     return E_TSP_FAIL_NOT_SUPPORTED;
4630*53ee8cc1Swenshuai.xi }
4631*53ee8cc1Swenshuai.xi 
4632*53ee8cc1Swenshuai.xi 
4633*53ee8cc1Swenshuai.xi //[RESERVED] obsoleted
MDrv_TSP_FLT_ChkOwner(MS_U32 u32EngId,MS_U32 u32FltId)4634*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_ChkOwner(MS_U32 u32EngId, MS_U32 u32FltId)
4635*53ee8cc1Swenshuai.xi {
4636*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4637*53ee8cc1Swenshuai.xi 
4638*53ee8cc1Swenshuai.xi     if (_ptsp_res->_tspInfo.FltState[u32FltId] & E_TSP_FLT_STATE_ALLOC)
4639*53ee8cc1Swenshuai.xi     {
4640*53ee8cc1Swenshuai.xi         if (_ptsp_res->_tspInfo.OwnerId[u32FltId] == u32EngId)
4641*53ee8cc1Swenshuai.xi         {
4642*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_OK);
4643*53ee8cc1Swenshuai.xi         }
4644*53ee8cc1Swenshuai.xi         else
4645*53ee8cc1Swenshuai.xi         {
4646*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL);
4647*53ee8cc1Swenshuai.xi         }
4648*53ee8cc1Swenshuai.xi     }
4649*53ee8cc1Swenshuai.xi     else
4650*53ee8cc1Swenshuai.xi     {
4651*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4652*53ee8cc1Swenshuai.xi     }
4653*53ee8cc1Swenshuai.xi }
4654*53ee8cc1Swenshuai.xi 
4655*53ee8cc1Swenshuai.xi 
4656*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4657*53ee8cc1Swenshuai.xi /// Get current PID filter status
4658*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4659*53ee8cc1Swenshuai.xi /// @param  u32PidFltId             \b IN: index of PID filter
4660*53ee8cc1Swenshuai.xi /// @param  peState                 \b OUT: current ORed state flag of PID filter\n
4661*53ee8cc1Swenshuai.xi ///                                         E_TSP_FLT_STATE_ALLOC\n
4662*53ee8cc1Swenshuai.xi ///                                         E_TSP_FLT_STATE_ENABLE\n
4663*53ee8cc1Swenshuai.xi ///                                         E_TSP_FLT_STATE_SCRAMBLED (last TS scrambling control status)
4664*53ee8cc1Swenshuai.xi /// @return TSP_Result
4665*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FLT_GetState(MS_U32 u32FltId,TSP_FltState * pState)4666*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_GetState(MS_U32 u32FltId, TSP_FltState *pState)
4667*53ee8cc1Swenshuai.xi {
4668*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4669*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32PidFltIdAll  > u32FltId, "[%04d] Invalid u32FltId %d\n", __LINE__, (unsigned int)u32FltId);
4670*53ee8cc1Swenshuai.xi     //We do nothing when create dmx flt to record
4671*53ee8cc1Swenshuai.xi     //HAL_TSP_GetCaps(E_TSP_HAL_CAP_TYPE_RECFLT_IDX, &u32RecFltIdx);
4672*53ee8cc1Swenshuai.xi     if(u32FltId == _tspFltIdMap.u32RecFltIdx)
4673*53ee8cc1Swenshuai.xi     {
4674*53ee8cc1Swenshuai.xi         *pState = E_TSP_FLT_STATE_NA;
4675*53ee8cc1Swenshuai.xi         return E_TSP_OK;
4676*53ee8cc1Swenshuai.xi     }
4677*53ee8cc1Swenshuai.xi 
4678*53ee8cc1Swenshuai.xi     MS_U32              u32BufId;
4679*53ee8cc1Swenshuai.xi 
4680*53ee8cc1Swenshuai.xi     // ALLOC / FREE / ENABLE
4681*53ee8cc1Swenshuai.xi     *pState =  _ptsp_res->_tspInfo.FltState[u32FltId];
4682*53ee8cc1Swenshuai.xi 
4683*53ee8cc1Swenshuai.xi #if 0  // HW remove scramble status register
4684*53ee8cc1Swenshuai.xi     // Scramble bit status
4685*53ee8cc1Swenshuai.xi     if (HAL_TSP_GetSCMB((MS_U16)u32FltId))
4686*53ee8cc1Swenshuai.xi     {
4687*53ee8cc1Swenshuai.xi         *pState |= E_TSP_FLT_STATE_SCRAMBLED;
4688*53ee8cc1Swenshuai.xi     }
4689*53ee8cc1Swenshuai.xi #endif
4690*53ee8cc1Swenshuai.xi 
4691*53ee8cc1Swenshuai.xi     // PidFlt Status
4692*53ee8cc1Swenshuai.xi     switch (_ptsp_res->_tspInfo.FltType[u32FltId])
4693*53ee8cc1Swenshuai.xi     {
4694*53ee8cc1Swenshuai.xi         case E_TSP_FLT_FIFO_VIDEO ... E_TSP_FLT_FIFO_VIDEO8:
4695*53ee8cc1Swenshuai.xi         case E_TSP_FLT_FIFO_AUDIO ... E_TSP_FLT_FIFO_AUDIO6:
4696*53ee8cc1Swenshuai.xi             break;
4697*53ee8cc1Swenshuai.xi         case E_TSP_FLT_USER_SEC:
4698*53ee8cc1Swenshuai.xi         case E_TSP_FLT_USER_PES:
4699*53ee8cc1Swenshuai.xi         case E_TSP_FLT_USER_PKT:
4700*53ee8cc1Swenshuai.xi         case E_TSP_FLT_USER_TTX:
4701*53ee8cc1Swenshuai.xi             u32BufId = HAL_TSP_SecFlt_GetSecBuf(&(_REGSec->Flt[u32FltId]));
4702*53ee8cc1Swenshuai.xi             if (HAL_TSP_SecFlt_GetState(&(_REGSec->Flt[u32BufId])) & TSP_SECFLT_STATE_OVERFLOW)
4703*53ee8cc1Swenshuai.xi             {
4704*53ee8cc1Swenshuai.xi                 *pState |= E_TSP_FLT_STATE_OVERFLOW;
4705*53ee8cc1Swenshuai.xi             }
4706*53ee8cc1Swenshuai.xi             if (HAL_TSP_SecBuf_GetRead(&(_REGBuf->Buf[u32BufId])) != HAL_TSP_SecBuf_GetWrite(&(_REGBuf->Buf[u32BufId])))
4707*53ee8cc1Swenshuai.xi             {
4708*53ee8cc1Swenshuai.xi                 *pState |= E_TSP_FLT_STATE_STREAM_AVAIL;
4709*53ee8cc1Swenshuai.xi             }
4710*53ee8cc1Swenshuai.xi             break;
4711*53ee8cc1Swenshuai.xi 
4712*53ee8cc1Swenshuai.xi         case E_TSP_FLT_USER_PCR:
4713*53ee8cc1Swenshuai.xi         default:
4714*53ee8cc1Swenshuai.xi             break;
4715*53ee8cc1Swenshuai.xi     }
4716*53ee8cc1Swenshuai.xi 
4717*53ee8cc1Swenshuai.xi     return E_TSP_OK;
4718*53ee8cc1Swenshuai.xi }
4719*53ee8cc1Swenshuai.xi 
4720*53ee8cc1Swenshuai.xi 
4721*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4722*53ee8cc1Swenshuai.xi /// Allocate a section filter of a PID filter
4723*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4724*53ee8cc1Swenshuai.xi /// @param  pu32SecFltId            \b OUT: pointer of section filter id return
4725*53ee8cc1Swenshuai.xi /// @return TSP_Result
4726*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SEC_Alloc(MS_U32 u32TSPId,MS_U32 * pu32BufId)4727*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SEC_Alloc(MS_U32 u32TSPId, MS_U32 *pu32BufId)
4728*53ee8cc1Swenshuai.xi {
4729*53ee8cc1Swenshuai.xi     REG_SecBuf *        pSecBuf;
4730*53ee8cc1Swenshuai.xi     int                 i;
4731*53ee8cc1Swenshuai.xi 
4732*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4733*53ee8cc1Swenshuai.xi 
4734*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4735*53ee8cc1Swenshuai.xi 
4736*53ee8cc1Swenshuai.xi     *pu32BufId = 0xFFFFFFFF;
4737*53ee8cc1Swenshuai.xi 
4738*53ee8cc1Swenshuai.xi     for (i = _tspFltIdMap.u32SecBufId_Start; i < _tspFltIdMap.u32SecBufId_End; i++)
4739*53ee8cc1Swenshuai.xi     {
4740*53ee8cc1Swenshuai.xi         if (_ptsp_res->_tspInfo.BufState[i] == E_TSP_FLT_STATE_FREE)
4741*53ee8cc1Swenshuai.xi         {
4742*53ee8cc1Swenshuai.xi             pSecBuf = &(_REGBuf->Buf[i]);
4743*53ee8cc1Swenshuai.xi             if (HAL_TSP_SecBuf_TryAlloc(pSecBuf, (MS_U16)u32TSPId))
4744*53ee8cc1Swenshuai.xi             {
4745*53ee8cc1Swenshuai.xi                 break;
4746*53ee8cc1Swenshuai.xi             }
4747*53ee8cc1Swenshuai.xi         }
4748*53ee8cc1Swenshuai.xi     }
4749*53ee8cc1Swenshuai.xi     if (i >= _tspFltIdMap.u32SecBufId_End)
4750*53ee8cc1Swenshuai.xi     {
4751*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_ERROR, "[%04d] No free buffer found 0x%02x\n", __LINE__, (MS_U32)i);
4752*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL);
4753*53ee8cc1Swenshuai.xi     }
4754*53ee8cc1Swenshuai.xi 
4755*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "[%04d] SEC_Alloc BUF %d\n", __LINE__, i);
4756*53ee8cc1Swenshuai.xi 
4757*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.BufState[i] = E_TSP_FLT_STATE_ALLOC;
4758*53ee8cc1Swenshuai.xi     _TSP_SEC_Init(i);
4759*53ee8cc1Swenshuai.xi 
4760*53ee8cc1Swenshuai.xi     *pu32BufId = i;
4761*53ee8cc1Swenshuai.xi     _TSP_SetSecNotifyId(*pu32BufId); //for isr processing checking
4762*53ee8cc1Swenshuai.xi 
4763*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4764*53ee8cc1Swenshuai.xi }
4765*53ee8cc1Swenshuai.xi 
4766*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4767*53ee8cc1Swenshuai.xi /// Free a section filter of a PID filter
4768*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4769*53ee8cc1Swenshuai.xi /// @param  u32SecFltId             \b IN: section filter of TSP to be free
4770*53ee8cc1Swenshuai.xi /// @return TSP_Result
4771*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SEC_Free(MS_U32 u32BufId)4772*53ee8cc1Swenshuai.xi TSP_Result  MDrv_TSP_SEC_Free(MS_U32 u32BufId)
4773*53ee8cc1Swenshuai.xi {
4774*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4775*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32SecFltId_End > u32BufId, "[%04d] Invalid u32BufId %d\n", __LINE__, (unsigned int)u32BufId);
4776*53ee8cc1Swenshuai.xi 
4777*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4778*53ee8cc1Swenshuai.xi     if (_ptsp_res->_tspInfo.MulFlt2Buf[u32BufId] == 1)
4779*53ee8cc1Swenshuai.xi     {
4780*53ee8cc1Swenshuai.xi         if (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.BufState[u32BufId])
4781*53ee8cc1Swenshuai.xi         {
4782*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_FAIL, "[%04d] Invalid Buffer\n", __LINE__);
4783*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_INFO, "[%04d] Invalid Buffer %x, %x\n", __LINE__, u32BufId, _ptsp_res->_tspInfo.BufState[u32BufId]);
4784*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL_INVALID);
4785*53ee8cc1Swenshuai.xi         }
4786*53ee8cc1Swenshuai.xi 
4787*53ee8cc1Swenshuai.xi         _TSP_SEC_Free(u32BufId);
4788*53ee8cc1Swenshuai.xi     }
4789*53ee8cc1Swenshuai.xi     else
4790*53ee8cc1Swenshuai.xi     {
4791*53ee8cc1Swenshuai.xi         _ptsp_res->_tspInfo.MulFlt2Buf[u32BufId] -= 1;
4792*53ee8cc1Swenshuai.xi     }
4793*53ee8cc1Swenshuai.xi 
4794*53ee8cc1Swenshuai.xi     //ULOGD("TSP", "[%s] MulFlt2Buf %ld = %d ", __FUNCTION__,u32BufId,_ptsp_res->_tspInfo.MulFlt2Buf[u32BufId]);
4795*53ee8cc1Swenshuai.xi 
4796*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4797*53ee8cc1Swenshuai.xi 
4798*53ee8cc1Swenshuai.xi }
4799*53ee8cc1Swenshuai.xi 
4800*53ee8cc1Swenshuai.xi 
4801*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4802*53ee8cc1Swenshuai.xi /// Set buffer start address and buffer size to section buffer
4803*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4804*53ee8cc1Swenshuai.xi /// @param  u32SecFltId             \b IN: index of section buffer to be set
4805*53ee8cc1Swenshuai.xi /// @param  u32StartAddr            \b IN: start address of section buffer
4806*53ee8cc1Swenshuai.xi /// @param  u32BufSize              \b IN: size of section buffer
4807*53ee8cc1Swenshuai.xi /// @return TSP_Result
4808*53ee8cc1Swenshuai.xi /// @note
4809*53ee8cc1Swenshuai.xi /// Buffer start address and buffer size should be 128-bit (16-byte) aligned.\n
4810*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PidFlt_Alloc
4811*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SEC_SetBuffer(MS_U32 u32BufId,MS_PHYADDR u32Start,MS_U32 u32Size)4812*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SEC_SetBuffer(MS_U32 u32BufId, MS_PHYADDR u32Start, MS_U32 u32Size)
4813*53ee8cc1Swenshuai.xi {
4814*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4815*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32SecFltId_End > u32BufId, "[%04d] Invalid u32BufId %d\n", __LINE__, (unsigned int)u32BufId);
4816*53ee8cc1Swenshuai.xi 
4817*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4818*53ee8cc1Swenshuai.xi     if (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.BufState[u32BufId])
4819*53ee8cc1Swenshuai.xi     {
4820*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4821*53ee8cc1Swenshuai.xi     }
4822*53ee8cc1Swenshuai.xi 
4823*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "SEC_SetBuffer addr 0x%08x, size  0x%08x\n", u32Start, u32Size);
4824*53ee8cc1Swenshuai.xi 
4825*53ee8cc1Swenshuai.xi     if (_ptsp_res->_tspInfo.MulFlt2Buf[u32BufId] == 1)
4826*53ee8cc1Swenshuai.xi     {
4827*53ee8cc1Swenshuai.xi         HAL_TSP_SecBuf_SetBuf(&(_REGBuf->Buf[u32BufId]), u32Start, u32Size);
4828*53ee8cc1Swenshuai.xi     }
4829*53ee8cc1Swenshuai.xi 
4830*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4831*53ee8cc1Swenshuai.xi }
4832*53ee8cc1Swenshuai.xi 
4833*53ee8cc1Swenshuai.xi 
4834*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4835*53ee8cc1Swenshuai.xi /// Reset the section buffer read/write pointer to start address and resolve overflow condition
4836*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4837*53ee8cc1Swenshuai.xi /// @param  u32SecFltId             \b IN: index of section buffer to be reset
4838*53ee8cc1Swenshuai.xi /// @return TSP_Result
4839*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SEC_Reset(MS_U32 u32BufId)4840*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SEC_Reset(MS_U32 u32BufId)
4841*53ee8cc1Swenshuai.xi {
4842*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4843*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32SecFltId_End > u32BufId, "[%04d] Invalid u32BufId %d\n", __LINE__, (unsigned int)u32BufId);
4844*53ee8cc1Swenshuai.xi 
4845*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4846*53ee8cc1Swenshuai.xi     if (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.BufState[u32BufId])
4847*53ee8cc1Swenshuai.xi     {
4848*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4849*53ee8cc1Swenshuai.xi     }
4850*53ee8cc1Swenshuai.xi 
4851*53ee8cc1Swenshuai.xi     HAL_TSP_SecBuf_Reset(&(_REGBuf->Buf[u32BufId]));
4852*53ee8cc1Swenshuai.xi 
4853*53ee8cc1Swenshuai.xi     HAL_TSP_SecFlt_ResetRmnCnt(&(_REGSec->Flt[(_ptsp_res->_tspInfo.Buf2Flt[u32BufId])]));
4854*53ee8cc1Swenshuai.xi 
4855*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4856*53ee8cc1Swenshuai.xi }
4857*53ee8cc1Swenshuai.xi 
4858*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4859*53ee8cc1Swenshuai.xi ///[RESERVED]
4860*53ee8cc1Swenshuai.xi /// Get buffer start address of setction buffer
4861*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4862*53ee8cc1Swenshuai.xi /// @param  u32SecFltId             \b IN: index of section buffer
4863*53ee8cc1Swenshuai.xi /// @param  pu32BufStart            \b OUT:  pointer of buffer start address return
4864*53ee8cc1Swenshuai.xi /// @return TSP_Result
4865*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SEC_GetStart(MS_U32 u32BufId,MS_PHY * pu32Start)4866*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SEC_GetStart(MS_U32 u32BufId, MS_PHY *pu32Start)
4867*53ee8cc1Swenshuai.xi {
4868*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4869*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32SecFltId_End > u32BufId, "[%04d] Invalid u32BufId %d\n", __LINE__, (unsigned int)u32BufId);
4870*53ee8cc1Swenshuai.xi     TSP_CHECK(pu32Start, "[%04d] NULL pointer\n", __LINE__);
4871*53ee8cc1Swenshuai.xi 
4872*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4873*53ee8cc1Swenshuai.xi     if (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.BufState[u32BufId])
4874*53ee8cc1Swenshuai.xi     {
4875*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4876*53ee8cc1Swenshuai.xi     }
4877*53ee8cc1Swenshuai.xi 
4878*53ee8cc1Swenshuai.xi     *pu32Start = HAL_TSP_SecBuf_GetStart(&(_REGBuf->Buf[u32BufId]));
4879*53ee8cc1Swenshuai.xi 
4880*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4881*53ee8cc1Swenshuai.xi }
4882*53ee8cc1Swenshuai.xi 
4883*53ee8cc1Swenshuai.xi 
4884*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4885*53ee8cc1Swenshuai.xi ///[RESERVED]
4886*53ee8cc1Swenshuai.xi /// Get buffer size of section buffer
4887*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4888*53ee8cc1Swenshuai.xi /// @param  u32SecFltId             \b IN: index of section buffer
4889*53ee8cc1Swenshuai.xi /// @param  pu32BufSize             \b OUT: pointer of buffer size return
4890*53ee8cc1Swenshuai.xi /// @return TSP_Result
4891*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SEC_GetSize(MS_U32 u32BufId,MS_U32 * pu32Size)4892*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SEC_GetSize(MS_U32 u32BufId, MS_U32 *pu32Size)
4893*53ee8cc1Swenshuai.xi {
4894*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4895*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32SecFltId_End > u32BufId, "[%04d] Invalid u32BufId %d\n", __LINE__, (unsigned int)u32BufId);
4896*53ee8cc1Swenshuai.xi     TSP_CHECK(pu32Size, "[%04d] NULL pointer\n", __LINE__);
4897*53ee8cc1Swenshuai.xi 
4898*53ee8cc1Swenshuai.xi     *pu32Size = 0;
4899*53ee8cc1Swenshuai.xi 
4900*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4901*53ee8cc1Swenshuai.xi     if (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.BufState[u32BufId])
4902*53ee8cc1Swenshuai.xi     {
4903*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4904*53ee8cc1Swenshuai.xi     }
4905*53ee8cc1Swenshuai.xi 
4906*53ee8cc1Swenshuai.xi     *pu32Size=  HAL_TSP_SecBuf_GetEnd(&(_REGBuf->Buf[u32BufId])) - HAL_TSP_SecBuf_GetStart(&(_REGBuf->Buf[u32BufId]));
4907*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4908*53ee8cc1Swenshuai.xi }
4909*53ee8cc1Swenshuai.xi 
4910*53ee8cc1Swenshuai.xi 
4911*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4912*53ee8cc1Swenshuai.xi /// Get current read address of section buffer
4913*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4914*53ee8cc1Swenshuai.xi /// @param  u32SecFltId             \b IN: index of section buffer
4915*53ee8cc1Swenshuai.xi /// @param  pu32ReadAddr            \b OUT: pointer of address return
4916*53ee8cc1Swenshuai.xi /// @return TSP_Result
4917*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SEC_GetRead(MS_U32 u32BufId,MS_PHY * pu32Read)4918*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SEC_GetRead(MS_U32 u32BufId, MS_PHY *pu32Read)
4919*53ee8cc1Swenshuai.xi {
4920*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4921*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32SecFltId_End > u32BufId, "[%04d] Invalid u32BufId %d\n", __LINE__, (unsigned int)u32BufId);
4922*53ee8cc1Swenshuai.xi     TSP_CHECK(pu32Read, "[%04d] NULL pointer\n", __LINE__);
4923*53ee8cc1Swenshuai.xi 
4924*53ee8cc1Swenshuai.xi     *pu32Read = 0;
4925*53ee8cc1Swenshuai.xi 
4926*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4927*53ee8cc1Swenshuai.xi     if (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.BufState[u32BufId])
4928*53ee8cc1Swenshuai.xi     {
4929*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4930*53ee8cc1Swenshuai.xi     }
4931*53ee8cc1Swenshuai.xi 
4932*53ee8cc1Swenshuai.xi     *pu32Read= (MS_PHY)HAL_TSP_SecBuf_GetRead(&(_REGBuf->Buf[u32BufId]));
4933*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4934*53ee8cc1Swenshuai.xi }
4935*53ee8cc1Swenshuai.xi 
4936*53ee8cc1Swenshuai.xi 
4937*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4938*53ee8cc1Swenshuai.xi /// Get current section data write address of section buffer
4939*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4940*53ee8cc1Swenshuai.xi /// @param  u32SecFltId             \b IN: index of section buffer
4941*53ee8cc1Swenshuai.xi /// @param  pu32WriteAddr           \b OUT: pointer of address return
4942*53ee8cc1Swenshuai.xi /// @return TSP_Result
4943*53ee8cc1Swenshuai.xi /// @note
4944*53ee8cc1Swenshuai.xi /// User can get current write address to know where is the end of section data
4945*53ee8cc1Swenshuai.xi /// received in the section buffer.
4946*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SEC_GetWrite(MS_U32 u32BufId,MS_PHY * pu32Write)4947*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SEC_GetWrite(MS_U32 u32BufId, MS_PHY *pu32Write)
4948*53ee8cc1Swenshuai.xi {
4949*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4950*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32SecFltId_End > u32BufId, "[%04d] Invalid u32BufId %d\n", __LINE__, (unsigned int)u32BufId);
4951*53ee8cc1Swenshuai.xi     TSP_CHECK(pu32Write, "[%04d] NULL pointer\n", __LINE__);
4952*53ee8cc1Swenshuai.xi 
4953*53ee8cc1Swenshuai.xi     *pu32Write = 0;
4954*53ee8cc1Swenshuai.xi 
4955*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4956*53ee8cc1Swenshuai.xi     if (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.BufState[u32BufId])
4957*53ee8cc1Swenshuai.xi     {
4958*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4959*53ee8cc1Swenshuai.xi     }
4960*53ee8cc1Swenshuai.xi 
4961*53ee8cc1Swenshuai.xi     *pu32Write= (MS_PHY)HAL_TSP_SecBuf_GetWrite(&(_REGBuf->Buf[u32BufId]));
4962*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4963*53ee8cc1Swenshuai.xi }
4964*53ee8cc1Swenshuai.xi 
4965*53ee8cc1Swenshuai.xi 
4966*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4967*53ee8cc1Swenshuai.xi /// Set current read address of section buffer
4968*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4969*53ee8cc1Swenshuai.xi /// @param  u32SecFltId             \b IN: index of section buffer
4970*53ee8cc1Swenshuai.xi /// @param  u32ReadAddr             \b IN: address of read pointer
4971*53ee8cc1Swenshuai.xi /// @return TSP_Result
4972*53ee8cc1Swenshuai.xi /// @note
4973*53ee8cc1Swenshuai.xi /// User can update the read address to notify TSP where is the end of section
4974*53ee8cc1Swenshuai.xi /// data already read back by user.
4975*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SEC_SetRead(MS_U32 u32BufId,MS_PHY u32Read)4976*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SEC_SetRead(MS_U32 u32BufId, MS_PHY u32Read)
4977*53ee8cc1Swenshuai.xi {
4978*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
4979*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32SecFltId_End > u32BufId, "[%04d] Invalid u32BufId %d\n", __LINE__, (unsigned int)u32BufId);
4980*53ee8cc1Swenshuai.xi 
4981*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4982*53ee8cc1Swenshuai.xi     if (E_TSP_FLT_STATE_FREE == _ptsp_res->_tspInfo.BufState[u32BufId])
4983*53ee8cc1Swenshuai.xi     {
4984*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_INVALID);
4985*53ee8cc1Swenshuai.xi     }
4986*53ee8cc1Swenshuai.xi 
4987*53ee8cc1Swenshuai.xi     HAL_TSP_SecBuf_SetRead(&(_REGBuf->Buf[u32BufId]), (MS_U32)u32Read);
4988*53ee8cc1Swenshuai.xi 
4989*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4990*53ee8cc1Swenshuai.xi }
4991*53ee8cc1Swenshuai.xi 
MDrv_TSP_SECFLT_BurstLen(MS_U32 u32BurstMode)4992*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SECFLT_BurstLen(MS_U32 u32BurstMode)
4993*53ee8cc1Swenshuai.xi {
4994*53ee8cc1Swenshuai.xi     TSP_ENTRY();
4995*53ee8cc1Swenshuai.xi 
4996*53ee8cc1Swenshuai.xi     HAL_TSP_SecFlt_BurstLen(u32BurstMode);
4997*53ee8cc1Swenshuai.xi 
4998*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
4999*53ee8cc1Swenshuai.xi }
5000*53ee8cc1Swenshuai.xi 
5001*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
MDrv_TSP_SEC_ClrEvent(MS_U32 u32BufId)5002*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SEC_ClrEvent(MS_U32 u32BufId)
5003*53ee8cc1Swenshuai.xi {
5004*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32SecFltId_End > u32BufId, "[%04d] Invalid u32BufId %d\n", __LINE__, (unsigned int)u32BufId);
5005*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5006*53ee8cc1Swenshuai.xi     _u32SecEvent[u32BufId] = 0;
5007*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5008*53ee8cc1Swenshuai.xi }
5009*53ee8cc1Swenshuai.xi 
MDrv_TSP_SEC_GetEvent(MS_U32 u32BufId,MS_U32 * pu32Event)5010*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SEC_GetEvent(MS_U32 u32BufId, MS_U32 *pu32Event)
5011*53ee8cc1Swenshuai.xi {
5012*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32SecFltId_End > u32BufId, "[%04d] Invalid u32BufId %d\n", __LINE__, (unsigned int)u32BufId);
5013*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5014*53ee8cc1Swenshuai.xi     *pu32Event = _u32SecEvent[u32BufId];
5015*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5016*53ee8cc1Swenshuai.xi }
5017*53ee8cc1Swenshuai.xi 
MDrv_TSP_SEC_SetEvent(MS_U32 u32BufId,MS_U32 u32Event)5018*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SEC_SetEvent(MS_U32 u32BufId, MS_U32 u32Event)
5019*53ee8cc1Swenshuai.xi {
5020*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32SecFltId_End > u32BufId, "[%04d] Invalid u32BufId %d\n", __LINE__, (unsigned int)u32BufId);
5021*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5022*53ee8cc1Swenshuai.xi     _u32SecEvent[u32BufId] |= u32Event;
5023*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5024*53ee8cc1Swenshuai.xi }
5025*53ee8cc1Swenshuai.xi #endif // MSOS_TYPE_LINUX_KERNEL
5026*53ee8cc1Swenshuai.xi 
5027*53ee8cc1Swenshuai.xi 
5028*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5029*53ee8cc1Swenshuai.xi /// Set packet size to TSP file
5030*53ee8cc1Swenshuai.xi /// @param  PacketMode                 \b IN: Mode of TSP file packet mode (192, 204, 188)
5031*53ee8cc1Swenshuai.xi /// @return TSP_Result
5032*53ee8cc1Swenshuai.xi /// @note
5033*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FILE_SetPktMode(TSP_PktMode mode)5034*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_SetPktMode(TSP_PktMode mode)
5035*53ee8cc1Swenshuai.xi {
5036*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5037*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
5038*53ee8cc1Swenshuai.xi 
5039*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5040*53ee8cc1Swenshuai.xi 
5041*53ee8cc1Swenshuai.xi     switch (mode)
5042*53ee8cc1Swenshuai.xi     {
5043*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_188:
5044*53ee8cc1Swenshuai.xi             HAL_TSP_Filein_PktSize(eFileEng,188);
5045*53ee8cc1Swenshuai.xi             break;
5046*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_192:
5047*53ee8cc1Swenshuai.xi             HAL_TSP_Filein_PktSize(eFileEng,192);
5048*53ee8cc1Swenshuai.xi             break;
5049*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_204:
5050*53ee8cc1Swenshuai.xi             HAL_TSP_Filein_PktSize(eFileEng,204);
5051*53ee8cc1Swenshuai.xi             break;
5052*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_130:
5053*53ee8cc1Swenshuai.xi             HAL_TSP_Filein_PktSize(eFileEng,130);
5054*53ee8cc1Swenshuai.xi             break;
5055*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_134:
5056*53ee8cc1Swenshuai.xi             HAL_TSP_Filein_PktSize(eFileEng,134);
5057*53ee8cc1Swenshuai.xi             break;
5058*53ee8cc1Swenshuai.xi         default:
5059*53ee8cc1Swenshuai.xi             break;
5060*53ee8cc1Swenshuai.xi     }
5061*53ee8cc1Swenshuai.xi 
5062*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5063*53ee8cc1Swenshuai.xi }
5064*53ee8cc1Swenshuai.xi 
5065*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5066*53ee8cc1Swenshuai.xi /// Set Memory to TSP Stream Input Rate
5067*53ee8cc1Swenshuai.xi /// @param  u32Div2                 \b IN: Divider of M2T stream input rate ([1 .. 31], default 10)
5068*53ee8cc1Swenshuai.xi /// @return TSP_Result
5069*53ee8cc1Swenshuai.xi /// @note
5070*53ee8cc1Swenshuai.xi /// <b>input_rate = stream_rate / (u32Div2 * 2)</b>\n
5071*53ee8cc1Swenshuai.xi /// @note
5072*53ee8cc1Swenshuai.xi /// It's not recommend to change input rate at run-time, because it conflict with
5073*53ee8cc1Swenshuai.xi /// the internal stream synchornization mechanism.
5074*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_GetM2tSlot
5075*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FILE_SetRate(MS_U32 u32Div2)5076*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_SetRate(MS_U32 u32Div2)
5077*53ee8cc1Swenshuai.xi {
5078*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5079*53ee8cc1Swenshuai.xi 
5080*53ee8cc1Swenshuai.xi     //[HW TODO][HW LIMIT]
5081*53ee8cc1Swenshuai.xi     // TsDma pause can be access by TSP CPU
5082*53ee8cc1Swenshuai.xi     // TsDma pause it's hard to control because read/write in different register
5083*53ee8cc1Swenshuai.xi     // When setting TsDma it should be disable interrupt to prevent ISR access
5084*53ee8cc1Swenshuai.xi     // but it still can't prevent TSP_cpu access at the same time.
5085*53ee8cc1Swenshuai.xi     //[SW PATCH] Add a special firmware command to lock TSP_cpu DMA pause/resume.
5086*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
5087*53ee8cc1Swenshuai.xi 
5088*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5089*53ee8cc1Swenshuai.xi 
5090*53ee8cc1Swenshuai.xi     TSP_OS_IntDisable();
5091*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_ByteDelay(eFileEng,u32Div2,TRUE);
5092*53ee8cc1Swenshuai.xi     TSP_OS_IntEnable();
5093*53ee8cc1Swenshuai.xi 
5094*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5095*53ee8cc1Swenshuai.xi }
5096*53ee8cc1Swenshuai.xi 
5097*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5098*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : Stream start address
5099*53ee8cc1Swenshuai.xi /// @param  u32StreamAddr           \b IN: pointer of transport stream in memory
5100*53ee8cc1Swenshuai.xi /// @return TSP_Result
5101*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FILE_CmdAddr(MS_U32 u32Addr)5102*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_CmdAddr(MS_U32 u32Addr)
5103*53ee8cc1Swenshuai.xi {
5104*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5105*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
5106*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5107*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_Addr(eFileEng, u32Addr);
5108*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5109*53ee8cc1Swenshuai.xi }
5110*53ee8cc1Swenshuai.xi 
5111*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5112*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : Stream data size
5113*53ee8cc1Swenshuai.xi /// @param  u32StreamSize           \b IN: size of transport stream data to be copied
5114*53ee8cc1Swenshuai.xi /// @return TSP_Result
5115*53ee8cc1Swenshuai.xi //  @note u32StreamSize must be larger than 16
5116*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FILE_CmdSize(MS_U32 u32Size)5117*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_CmdSize(MS_U32 u32Size)
5118*53ee8cc1Swenshuai.xi {
5119*53ee8cc1Swenshuai.xi     if(u32Size <= 16)
5120*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
5121*53ee8cc1Swenshuai.xi 
5122*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5123*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
5124*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5125*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_Size(eFileEng, u32Size);
5126*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5127*53ee8cc1Swenshuai.xi }
5128*53ee8cc1Swenshuai.xi 
5129*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5130*53ee8cc1Swenshuai.xi //[Reserved]
5131*53ee8cc1Swenshuai.xi // Memory to TSP stream command : Update Stream STC
5132*53ee8cc1Swenshuai.xi // @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5133*53ee8cc1Swenshuai.xi // @param  u32STC_32               \b IN: STC[32] for next input stream
5134*53ee8cc1Swenshuai.xi // @param  u32STC                  \b IN: STC[31:0] for next input stream
5135*53ee8cc1Swenshuai.xi // @return TSP_Result
5136*53ee8cc1Swenshuai.xi // @note M2T Command Size: 3
5137*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FILE_CmdSTC(MS_U32 u32EngId,MS_U32 u32STC_H,MS_U32 u32STC)5138*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_CmdSTC(MS_U32 u32EngId, MS_U32 u32STC_H, MS_U32 u32STC)
5139*53ee8cc1Swenshuai.xi {
5140*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5141*53ee8cc1Swenshuai.xi 
5142*53ee8cc1Swenshuai.xi     //[HW TODO][HW LIMIT]
5143*53ee8cc1Swenshuai.xi     // STC register mapping is different between MCU and CPU.
5144*53ee8cc1Swenshuai.xi     //HAL_TSP_CMDQ_SetSTC(u32STC_H, u32STC);
5145*53ee8cc1Swenshuai.xi     //HAL_TSP_SetSTC(u32STC_H, u32STC);
5146*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_STC_CHECK(u32EngId);
5147*53ee8cc1Swenshuai.xi     HAL_TSP_STC33_CmdQSet(u32STC_H, u32STC);
5148*53ee8cc1Swenshuai.xi 
5149*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5150*53ee8cc1Swenshuai.xi }
5151*53ee8cc1Swenshuai.xi 
5152*53ee8cc1Swenshuai.xi 
5153*53ee8cc1Swenshuai.xi 
5154*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5155*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : Start stream input
5156*53ee8cc1Swenshuai.xi /// @param  eM2tMode                \b IN: input source control of filein
5157*53ee8cc1Swenshuai.xi /// @return TSP_Result
5158*53ee8cc1Swenshuai.xi /// @note Filein Command Size: 1
5159*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_GetM2tSlot
5160*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FILE_CmdStart(TSP_FileMode mode)5161*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_CmdStart(TSP_FileMode mode)
5162*53ee8cc1Swenshuai.xi {
5163*53ee8cc1Swenshuai.xi      TSP_ENTRY();
5164*53ee8cc1Swenshuai.xi 
5165*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
5166*53ee8cc1Swenshuai.xi     MS_BOOL bBypass = TRUE;  // Enable PES file-in or not
5167*53ee8cc1Swenshuai.xi     TSP_DST_SEQ eDst = E_TSP_DST_INVALID;
5168*53ee8cc1Swenshuai.xi 
5169*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5170*53ee8cc1Swenshuai.xi 
5171*53ee8cc1Swenshuai.xi     for(eDst = E_TSP_DST_FIFO_VIDEO; eDst < E_TSP_DST_INVALID; eDst++)
5172*53ee8cc1Swenshuai.xi     {
5173*53ee8cc1Swenshuai.xi         HAL_TSP_FIFO_Bypass(eDst, FALSE); // for bypass clear
5174*53ee8cc1Swenshuai.xi     }
5175*53ee8cc1Swenshuai.xi 
5176*53ee8cc1Swenshuai.xi     // @FIXME: Good to assume enum and register definition identical?
5177*53ee8cc1Swenshuai.xi     switch (mode)
5178*53ee8cc1Swenshuai.xi     {
5179*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_TSP:
5180*53ee8cc1Swenshuai.xi             bBypass = FALSE;
5181*53ee8cc1Swenshuai.xi             break;
5182*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO:
5183*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO, TRUE);
5184*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO);
5185*53ee8cc1Swenshuai.xi             break;
5186*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO3D:
5187*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO3D, TRUE);
5188*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO3D);
5189*53ee8cc1Swenshuai.xi             break;
5190*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO3:
5191*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO3, TRUE);
5192*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO3);
5193*53ee8cc1Swenshuai.xi             break;
5194*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO4:
5195*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO4, TRUE);
5196*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO4);
5197*53ee8cc1Swenshuai.xi             break;
5198*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO5:
5199*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO5, TRUE);
5200*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO5);
5201*53ee8cc1Swenshuai.xi             break;
5202*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO6:
5203*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO6, TRUE);
5204*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO6);
5205*53ee8cc1Swenshuai.xi             break;
5206*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO7:
5207*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO7, TRUE);
5208*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO7);
5209*53ee8cc1Swenshuai.xi             break;
5210*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO8:
5211*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO8, TRUE);
5212*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO8);
5213*53ee8cc1Swenshuai.xi             break;
5214*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO:
5215*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO, TRUE);
5216*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_AUDIO);
5217*53ee8cc1Swenshuai.xi             break;
5218*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO2:
5219*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO2, TRUE);
5220*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_AUDIO2);
5221*53ee8cc1Swenshuai.xi             break;
5222*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO3:
5223*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO3, TRUE);
5224*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_AUDIO3);
5225*53ee8cc1Swenshuai.xi             break;
5226*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO4:
5227*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO4, TRUE);
5228*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_AUDIO4);
5229*53ee8cc1Swenshuai.xi             break;
5230*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO5:
5231*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO5, TRUE);
5232*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_AUDIO5);
5233*53ee8cc1Swenshuai.xi             break;
5234*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO6:
5235*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO6, TRUE);
5236*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_AUDIO6);
5237*53ee8cc1Swenshuai.xi             break;
5238*53ee8cc1Swenshuai.xi         default:
5239*53ee8cc1Swenshuai.xi             break;
5240*53ee8cc1Swenshuai.xi     }
5241*53ee8cc1Swenshuai.xi 
5242*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_Bypass(eFileEng, bBypass);
5243*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_Start(eFileEng);
5244*53ee8cc1Swenshuai.xi 
5245*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5246*53ee8cc1Swenshuai.xi }
5247*53ee8cc1Swenshuai.xi 
5248*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5249*53ee8cc1Swenshuai.xi /// Get the number of empty slot of M2T command
5250*53ee8cc1Swenshuai.xi /// @param  pu32EmptySlot           \b OUT: pointer of empty slot count return
5251*53ee8cc1Swenshuai.xi /// @return TSP_Result
5252*53ee8cc1Swenshuai.xi /// @note
5253*53ee8cc1Swenshuai.xi /// M2T is a command queue command, it can be queued by TSP when another M2T command
5254*53ee8cc1Swenshuai.xi /// is executing by TSP. The queued commands will be executed by order (FIFO)
5255*53ee8cc1Swenshuai.xi /// when previous M2T command execution is finished.
5256*53ee8cc1Swenshuai.xi /// @note
5257*53ee8cc1Swenshuai.xi /// User should call GetM2TSlot to make sure there is enough empty M2T command slot
5258*53ee8cc1Swenshuai.xi /// before sending any M2T command. (Each command has different command size)
5259*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_M2T_SetAddr, MDrv_TSP_M2T_SetSize, MDrv_TSP_M2T_Start,
5260*53ee8cc1Swenshuai.xi //[Reserved]    MDrv_TSP_M2T_SetSTC
5261*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FILE_GetCmdSlot(MS_U32 * pu32EmptySlot)5262*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_GetCmdSlot(MS_U32 *pu32EmptySlot)
5263*53ee8cc1Swenshuai.xi {
5264*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5265*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
5266*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5267*53ee8cc1Swenshuai.xi     *pu32EmptySlot = HAL_TSP_Filein_CmdQSlot(eFileEng);
5268*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5269*53ee8cc1Swenshuai.xi }
5270*53ee8cc1Swenshuai.xi 
5271*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5272*53ee8cc1Swenshuai.xi /// Reset command queue
5273*53ee8cc1Swenshuai.xi /// @return TSP_Result
5274*53ee8cc1Swenshuai.xi /// @note
5275*53ee8cc1Swenshuai.xi /// SW patch--wait command queue empty
5276*53ee8cc1Swenshuai.xi /// wait HW ECO
5277*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FILE_Reset(void)5278*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Reset(void)
5279*53ee8cc1Swenshuai.xi {
5280*53ee8cc1Swenshuai.xi     MS_U32 u32Counter;
5281*53ee8cc1Swenshuai.xi 
5282*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5283*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
5284*53ee8cc1Swenshuai.xi 
5285*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5286*53ee8cc1Swenshuai.xi 
5287*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_CmdQRst(eFileEng, TRUE);
5288*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_CmdQRst(eFileEng, FALSE);
5289*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_Abort(eFileEng, TRUE);
5290*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_Abort(eFileEng, FALSE);
5291*53ee8cc1Swenshuai.xi 
5292*53ee8cc1Swenshuai.xi     //reset the last data that hw is excuting --> HW new design
5293*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_WbFsmRst(eFileEng, TRUE);
5294*53ee8cc1Swenshuai.xi 
5295*53ee8cc1Swenshuai.xi     for(u32Counter = 0; u32Counter < 100; u32Counter++)
5296*53ee8cc1Swenshuai.xi     {
5297*53ee8cc1Swenshuai.xi         if(!HAL_TSP_Filein_Status(eFileEng))
5298*53ee8cc1Swenshuai.xi         {
5299*53ee8cc1Swenshuai.xi             break;
5300*53ee8cc1Swenshuai.xi         }
5301*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
5302*53ee8cc1Swenshuai.xi     }
5303*53ee8cc1Swenshuai.xi 
5304*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_WbFsmRst(eFileEng, FALSE);
5305*53ee8cc1Swenshuai.xi 
5306*53ee8cc1Swenshuai.xi     if(u32Counter == 100)
5307*53ee8cc1Swenshuai.xi     {
5308*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_ERROR, "[%s][%d] Wait file in done timeout\n", __FUNCTION__, __LINE__);
5309*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL);
5310*53ee8cc1Swenshuai.xi     }
5311*53ee8cc1Swenshuai.xi 
5312*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5313*53ee8cc1Swenshuai.xi }
5314*53ee8cc1Swenshuai.xi 
5315*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5316*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : pause stream input
5317*53ee8cc1Swenshuai.xi /// @return TSP_Result
5318*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FILE_Pause(void)5319*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Pause(void)
5320*53ee8cc1Swenshuai.xi {
5321*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5322*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
5323*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5324*53ee8cc1Swenshuai.xi     HAL_TSP_File_Pause(eFileEng);
5325*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5326*53ee8cc1Swenshuai.xi }
5327*53ee8cc1Swenshuai.xi 
5328*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5329*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : resume stream input
5330*53ee8cc1Swenshuai.xi /// @return TSP_Result
5331*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FILE_Resume(void)5332*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Resume(void)
5333*53ee8cc1Swenshuai.xi {
5334*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5335*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
5336*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5337*53ee8cc1Swenshuai.xi     HAL_TSP_File_Resume(eFileEng);
5338*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5339*53ee8cc1Swenshuai.xi }
5340*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Stop(void)5341*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Stop(void)
5342*53ee8cc1Swenshuai.xi {
5343*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5344*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
5345*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5346*53ee8cc1Swenshuai.xi     HAL_TSP_TSIF_FileEn(eFileEng, FALSE);                    // data port disable @FIXME in k2 we switch data port only but we close every file setting here will there be side effect?
5347*53ee8cc1Swenshuai.xi 
5348*53ee8cc1Swenshuai.xi     // @TODO Does it need to call HAL_TSP_FIFO_Bypass() function?
5349*53ee8cc1Swenshuai.xi     //HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO, FALSE); // for clear all bypass setting
5350*53ee8cc1Swenshuai.xi 
5351*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5352*53ee8cc1Swenshuai.xi }
5353*53ee8cc1Swenshuai.xi 
5354*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5355*53ee8cc1Swenshuai.xi /// Get current file in state
5356*53ee8cc1Swenshuai.xi /// @return TSP_M2tStatus
5357*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_GetM2tSlot
5358*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FILE_GetState(TSP_FileState * pState)5359*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_GetState(TSP_FileState *pState)
5360*53ee8cc1Swenshuai.xi {
5361*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5362*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
5363*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5364*53ee8cc1Swenshuai.xi     *pState = HAL_TSP_Filein_GetState(eFileEng);
5365*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5366*53ee8cc1Swenshuai.xi }
5367*53ee8cc1Swenshuai.xi 
5368*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5369*53ee8cc1Swenshuai.xi /// Enable timestamp block scheme
5370*53ee8cc1Swenshuai.xi /// @return TSP_Result
5371*53ee8cc1Swenshuai.xi /// @note
5372*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_192BlockScheme_En(MS_BOOL bEnable)5373*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_192BlockScheme_En(MS_BOOL bEnable)
5374*53ee8cc1Swenshuai.xi {
5375*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5376*53ee8cc1Swenshuai.xi //  HAL_TSP_FileIn_192BlockScheme_En(bEnable);
5377*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
5378*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5379*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_BlockTimeStamp(eFileEng, bEnable); //@F_TODO fix engine problen and make sure they are the same
5380*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5381*53ee8cc1Swenshuai.xi }
5382*53ee8cc1Swenshuai.xi 
5383*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5384*53ee8cc1Swenshuai.xi /// Setting PS path
5385*53ee8cc1Swenshuai.xi /// @param  eM2tMode                \b IN: input source control of filein
5386*53ee8cc1Swenshuai.xi /// @return TSP_Result
5387*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_FILE_PS_Path_Enable(TSP_FileMode mode)5388*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_PS_Path_Enable(TSP_FileMode mode)
5389*53ee8cc1Swenshuai.xi {
5390*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5391*53ee8cc1Swenshuai.xi 
5392*53ee8cc1Swenshuai.xi     HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO,   FALSE); // for bypass clear
5393*53ee8cc1Swenshuai.xi     HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO3D, FALSE); // for bypass clear
5394*53ee8cc1Swenshuai.xi     HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO3,  FALSE); // for bypass clear
5395*53ee8cc1Swenshuai.xi     HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO4,  FALSE); // for bypass clear
5396*53ee8cc1Swenshuai.xi     HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO,   FALSE); // for bypass clear
5397*53ee8cc1Swenshuai.xi     HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO2,  FALSE); // for bypass clear
5398*53ee8cc1Swenshuai.xi     HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO3,  FALSE); // for bypass clear
5399*53ee8cc1Swenshuai.xi     HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO4,  FALSE); // for bypass clear
5400*53ee8cc1Swenshuai.xi 
5401*53ee8cc1Swenshuai.xi     switch (mode)
5402*53ee8cc1Swenshuai.xi     {
5403*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_TSP:
5404*53ee8cc1Swenshuai.xi             break;
5405*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO:
5406*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO, TRUE);
5407*53ee8cc1Swenshuai.xi             break;
5408*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO3D:
5409*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO3D, TRUE);
5410*53ee8cc1Swenshuai.xi             break;
5411*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO3:
5412*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO3, TRUE);
5413*53ee8cc1Swenshuai.xi             break;
5414*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO4:
5415*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO4, TRUE);
5416*53ee8cc1Swenshuai.xi             break;
5417*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO:
5418*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO, TRUE);
5419*53ee8cc1Swenshuai.xi             break;
5420*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO2:
5421*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO2, TRUE);
5422*53ee8cc1Swenshuai.xi             break;
5423*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO3:
5424*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO3, TRUE);
5425*53ee8cc1Swenshuai.xi             break;
5426*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO4:
5427*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO4, TRUE);
5428*53ee8cc1Swenshuai.xi             break;
5429*53ee8cc1Swenshuai.xi         default:
5430*53ee8cc1Swenshuai.xi             break;
5431*53ee8cc1Swenshuai.xi     }
5432*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5433*53ee8cc1Swenshuai.xi }
5434*53ee8cc1Swenshuai.xi 
5435*53ee8cc1Swenshuai.xi // file driver with engine
MDrv_TSP_FILE_Eng_SetPktMode(TSP_FILE_ENG Eng,TSP_PktMode mode)5436*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_SetPktMode(TSP_FILE_ENG Eng, TSP_PktMode mode)
5437*53ee8cc1Swenshuai.xi {
5438*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5439*53ee8cc1Swenshuai.xi 
5440*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5441*53ee8cc1Swenshuai.xi     MS_U32 u32PktSize = 0;
5442*53ee8cc1Swenshuai.xi     switch (mode)
5443*53ee8cc1Swenshuai.xi     {
5444*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_188:
5445*53ee8cc1Swenshuai.xi             u32PktSize = 188;
5446*53ee8cc1Swenshuai.xi             break;
5447*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_192:
5448*53ee8cc1Swenshuai.xi             u32PktSize = 192;
5449*53ee8cc1Swenshuai.xi             break;
5450*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_204:
5451*53ee8cc1Swenshuai.xi             u32PktSize = 204;
5452*53ee8cc1Swenshuai.xi             break;
5453*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_130:
5454*53ee8cc1Swenshuai.xi             u32PktSize = 130;
5455*53ee8cc1Swenshuai.xi             break;
5456*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_134:
5457*53ee8cc1Swenshuai.xi             u32PktSize = 134;
5458*53ee8cc1Swenshuai.xi             break;
5459*53ee8cc1Swenshuai.xi         default:
5460*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "Invalid File-in Packet Size!\n");
5461*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL);
5462*53ee8cc1Swenshuai.xi             break;
5463*53ee8cc1Swenshuai.xi     }
5464*53ee8cc1Swenshuai.xi 
5465*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5466*53ee8cc1Swenshuai.xi 
5467*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5468*53ee8cc1Swenshuai.xi 
5469*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_PktSize(eFileEng, u32PktSize);
5470*53ee8cc1Swenshuai.xi 
5471*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5472*53ee8cc1Swenshuai.xi }
5473*53ee8cc1Swenshuai.xi 
5474*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
_TSP_DrvHal_PktConverter_PktModeMapping(TSP_PktMode ePktMode)5475*53ee8cc1Swenshuai.xi static TSP_HAL_PKT_MODE _TSP_DrvHal_PktConverter_PktModeMapping(TSP_PktMode ePktMode)
5476*53ee8cc1Swenshuai.xi {
5477*53ee8cc1Swenshuai.xi     TSP_HAL_PKT_MODE eOutPktMode = E_TSP_HAL_PKT_MODE_NORMAL;
5478*53ee8cc1Swenshuai.xi 
5479*53ee8cc1Swenshuai.xi     switch(ePktMode)
5480*53ee8cc1Swenshuai.xi     {
5481*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_CIPLUS:
5482*53ee8cc1Swenshuai.xi             eOutPktMode = E_TSP_HAL_PKT_MODE_CI;
5483*53ee8cc1Swenshuai.xi             break;
5484*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_ATS:
5485*53ee8cc1Swenshuai.xi             eOutPktMode = E_TSP_HAL_PKT_MODE_ATS;
5486*53ee8cc1Swenshuai.xi             break;
5487*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_OPENCABLE:
5488*53ee8cc1Swenshuai.xi             eOutPktMode = E_TSP_HAL_PKT_MODE_OPEN_CABLE;
5489*53ee8cc1Swenshuai.xi             break;
5490*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_MXL192:
5491*53ee8cc1Swenshuai.xi             eOutPktMode = E_TSP_HAL_PKT_MODE_MXL_192;
5492*53ee8cc1Swenshuai.xi             break;
5493*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_MXL196:
5494*53ee8cc1Swenshuai.xi             eOutPktMode = E_TSP_HAL_PKT_MODE_MXL_196;
5495*53ee8cc1Swenshuai.xi             break;
5496*53ee8cc1Swenshuai.xi         case E_TSP_PKTMODE_MXL200:
5497*53ee8cc1Swenshuai.xi             eOutPktMode = E_TSP_HAL_PKT_MODE_MXL_200;
5498*53ee8cc1Swenshuai.xi             break;
5499*53ee8cc1Swenshuai.xi         default:
5500*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[%s][%d] Invalid Packet Mode !!\n", __FUNCTION__, __LINE__);
5501*53ee8cc1Swenshuai.xi             break;
5502*53ee8cc1Swenshuai.xi     }
5503*53ee8cc1Swenshuai.xi 
5504*53ee8cc1Swenshuai.xi     return eOutPktMode;
5505*53ee8cc1Swenshuai.xi }
5506*53ee8cc1Swenshuai.xi #endif
5507*53ee8cc1Swenshuai.xi 
MDrv_TSP_SetPacketMode(TSP_TSIF u32TSIf,TSP_PktMode ePktMode)5508*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetPacketMode(TSP_TSIF u32TSIf, TSP_PktMode ePktMode)
5509*53ee8cc1Swenshuai.xi {
5510*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
5511*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5512*53ee8cc1Swenshuai.xi 
5513*53ee8cc1Swenshuai.xi     TSP_HAL_TSIF eHalTSIF = _TSP_DrvHal_TSIFMapping(u32TSIf);
5514*53ee8cc1Swenshuai.xi     MS_U32 u32TSIF = 0;
5515*53ee8cc1Swenshuai.xi 
5516*53ee8cc1Swenshuai.xi     if((ePktMode >= E_TSP_PKTMODE_LIVEIN_MIN) && (ePktMode <= E_TSP_PKTMODE_LIVEIN_MAX)) // live-in
5517*53ee8cc1Swenshuai.xi     {
5518*53ee8cc1Swenshuai.xi         u32TSIF = HAL_TSP_TsifMapping(eHalTSIF, FALSE);
5519*53ee8cc1Swenshuai.xi 
5520*53ee8cc1Swenshuai.xi         TSP_RES_ALLOC_TSPPATH_CHECK(u32TSIF);
5521*53ee8cc1Swenshuai.xi 
5522*53ee8cc1Swenshuai.xi         HAL_TSP_PktConverter_PktMode(u32TSIF, _TSP_DrvHal_PktConverter_PktModeMapping(ePktMode));
5523*53ee8cc1Swenshuai.xi     }
5524*53ee8cc1Swenshuai.xi 
5525*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5526*53ee8cc1Swenshuai.xi #else
5527*53ee8cc1Swenshuai.xi     return E_TSP_FAIL_NOT_SUPPORTED;
5528*53ee8cc1Swenshuai.xi #endif
5529*53ee8cc1Swenshuai.xi }
5530*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_SetRate(TSP_FILE_ENG Eng,MS_U32 u32Div2)5531*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_SetRate(TSP_FILE_ENG Eng, MS_U32 u32Div2)
5532*53ee8cc1Swenshuai.xi {
5533*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5534*53ee8cc1Swenshuai.xi 
5535*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5536*53ee8cc1Swenshuai.xi 
5537*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5538*53ee8cc1Swenshuai.xi 
5539*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5540*53ee8cc1Swenshuai.xi 
5541*53ee8cc1Swenshuai.xi     //[HW TODO][HW LIMIT]
5542*53ee8cc1Swenshuai.xi     // TsDma pause can be access by TSP CPU
5543*53ee8cc1Swenshuai.xi     // TsDma pause it's hard to control because read/write in different register
5544*53ee8cc1Swenshuai.xi     // When setting TsDma it should be disable interrupt to prevent ISR access
5545*53ee8cc1Swenshuai.xi     // but it still can't prevent TSP_cpu access at the same time.
5546*53ee8cc1Swenshuai.xi     //[SW PATCH] Add a special firmware command to lock TSP_cpu DMA pause/resume.
5547*53ee8cc1Swenshuai.xi     TSP_OS_IntDisable();
5548*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_ByteDelay(eFileEng, u32Div2, TRUE); //@F_TODO when to set false???
5549*53ee8cc1Swenshuai.xi     TSP_OS_IntEnable();
5550*53ee8cc1Swenshuai.xi 
5551*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5552*53ee8cc1Swenshuai.xi }
5553*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_CmdAddr(TSP_FILE_ENG Eng,MS_U32 u32Addr)5554*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_CmdAddr(TSP_FILE_ENG Eng, MS_U32 u32Addr)
5555*53ee8cc1Swenshuai.xi {
5556*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5557*53ee8cc1Swenshuai.xi 
5558*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5559*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5560*53ee8cc1Swenshuai.xi 
5561*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5562*53ee8cc1Swenshuai.xi 
5563*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_Addr((MS_U32)eFileEng, u32Addr);
5564*53ee8cc1Swenshuai.xi 
5565*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5566*53ee8cc1Swenshuai.xi }
5567*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_CmdSize(TSP_FILE_ENG Eng,MS_U32 u32Size)5568*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_CmdSize(TSP_FILE_ENG Eng, MS_U32 u32Size)
5569*53ee8cc1Swenshuai.xi {
5570*53ee8cc1Swenshuai.xi     if(u32Size <= 16)
5571*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
5572*53ee8cc1Swenshuai.xi 
5573*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5574*53ee8cc1Swenshuai.xi 
5575*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5576*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5577*53ee8cc1Swenshuai.xi 
5578*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5579*53ee8cc1Swenshuai.xi 
5580*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_Size(eFileEng, u32Size);
5581*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5582*53ee8cc1Swenshuai.xi }
5583*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_CmdSTC(TSP_FILE_ENG Eng,MS_U32 u32EngId,MS_U32 u32STC_H,MS_U32 u32STC)5584*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_CmdSTC(TSP_FILE_ENG Eng, MS_U32 u32EngId, MS_U32 u32STC_H, MS_U32 u32STC)
5585*53ee8cc1Swenshuai.xi {
5586*53ee8cc1Swenshuai.xi     return E_TSP_FAIL_NOT_SUPPORTED;
5587*53ee8cc1Swenshuai.xi }
5588*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_CmdStart(TSP_FILE_ENG Eng,TSP_FileMode mode)5589*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_CmdStart(TSP_FILE_ENG Eng, TSP_FileMode mode)
5590*53ee8cc1Swenshuai.xi {
5591*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5592*53ee8cc1Swenshuai.xi 
5593*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5594*53ee8cc1Swenshuai.xi 
5595*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5596*53ee8cc1Swenshuai.xi 
5597*53ee8cc1Swenshuai.xi     MS_BOOL bBypass = TRUE;  // Enable PES file-in or not
5598*53ee8cc1Swenshuai.xi     TSP_DST_SEQ eDst = E_TSP_DST_INVALID;
5599*53ee8cc1Swenshuai.xi 
5600*53ee8cc1Swenshuai.xi     for(eDst = E_TSP_DST_FIFO_VIDEO; eDst < E_TSP_DST_INVALID; eDst++)
5601*53ee8cc1Swenshuai.xi     {
5602*53ee8cc1Swenshuai.xi         HAL_TSP_FIFO_Bypass(eDst, FALSE); // for bypass clear
5603*53ee8cc1Swenshuai.xi     }
5604*53ee8cc1Swenshuai.xi 
5605*53ee8cc1Swenshuai.xi     switch (mode)
5606*53ee8cc1Swenshuai.xi     {
5607*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_TSP:
5608*53ee8cc1Swenshuai.xi             bBypass = FALSE;
5609*53ee8cc1Swenshuai.xi             break;
5610*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO:
5611*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO, TRUE);
5612*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO);
5613*53ee8cc1Swenshuai.xi             break;
5614*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO3D:
5615*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO3D, TRUE);
5616*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO3D);
5617*53ee8cc1Swenshuai.xi             break;
5618*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO3:
5619*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO3, TRUE);
5620*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO3);
5621*53ee8cc1Swenshuai.xi             break;
5622*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO4:
5623*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO4, TRUE);
5624*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO4);
5625*53ee8cc1Swenshuai.xi             break;
5626*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO5:
5627*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO5, TRUE);
5628*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO5);
5629*53ee8cc1Swenshuai.xi             break;
5630*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO6:
5631*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO6, TRUE);
5632*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO6);
5633*53ee8cc1Swenshuai.xi             break;
5634*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO7:
5635*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO7, TRUE);
5636*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO7);
5637*53ee8cc1Swenshuai.xi             break;
5638*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_VIDEO8:
5639*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO8, TRUE);
5640*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_VIDEO8);
5641*53ee8cc1Swenshuai.xi             break;
5642*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO:
5643*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO, TRUE);
5644*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_AUDIO);
5645*53ee8cc1Swenshuai.xi             break;
5646*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO2:
5647*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO2, TRUE);
5648*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_AUDIO2);
5649*53ee8cc1Swenshuai.xi             break;
5650*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO3:
5651*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO3, TRUE);
5652*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_AUDIO3);
5653*53ee8cc1Swenshuai.xi             break;
5654*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO4:
5655*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO4, TRUE);
5656*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_AUDIO4);
5657*53ee8cc1Swenshuai.xi             break;
5658*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO5:
5659*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO5, TRUE);
5660*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_AUDIO5);
5661*53ee8cc1Swenshuai.xi             break;
5662*53ee8cc1Swenshuai.xi         case E_TSP_FILE_2_AUDIO6:
5663*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_AUDIO6, TRUE);
5664*53ee8cc1Swenshuai.xi             HAL_TSP_FIFO_Bypass_Src(eFileEng, E_TSP_DST_FIFO_AUDIO6);
5665*53ee8cc1Swenshuai.xi             break;
5666*53ee8cc1Swenshuai.xi         default:
5667*53ee8cc1Swenshuai.xi             break;
5668*53ee8cc1Swenshuai.xi     }
5669*53ee8cc1Swenshuai.xi 
5670*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_Bypass(eFileEng, bBypass);
5671*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_Start(eFileEng);
5672*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5673*53ee8cc1Swenshuai.xi }
5674*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_Stop(TSP_FILE_ENG Eng)5675*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_Stop(TSP_FILE_ENG Eng)
5676*53ee8cc1Swenshuai.xi {
5677*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5678*53ee8cc1Swenshuai.xi 
5679*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5680*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5681*53ee8cc1Swenshuai.xi 
5682*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5683*53ee8cc1Swenshuai.xi 
5684*53ee8cc1Swenshuai.xi     HAL_TSP_TSIF_FileEn(eFileEng, FALSE);             // data port disable @FIXME in k2 we switch data port only but we close every file setting here will there be side effect?
5685*53ee8cc1Swenshuai.xi 
5686*53ee8cc1Swenshuai.xi     // @TODO not completely implement yet
5687*53ee8cc1Swenshuai.xi     // Fix Path : tsif 0 for video and tsif 1 for video3D
5688*53ee8cc1Swenshuai.xi     // need to flexible modification in the future
5689*53ee8cc1Swenshuai.xi    /*
5690*53ee8cc1Swenshuai.xi     if(eFileEng == E_FILEENG_TSIF0)
5691*53ee8cc1Swenshuai.xi     {
5692*53ee8cc1Swenshuai.xi         HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO, FALSE); // for clear all bypass setting
5693*53ee8cc1Swenshuai.xi     }
5694*53ee8cc1Swenshuai.xi     else if(eFileEng == E_FILEENG_TSIF2)
5695*53ee8cc1Swenshuai.xi     {
5696*53ee8cc1Swenshuai.xi         HAL_TSP_FIFO_Bypass(E_TSP_DST_FIFO_VIDEO3D, FALSE); // for clear all bypass setting
5697*53ee8cc1Swenshuai.xi     }
5698*53ee8cc1Swenshuai.xi     */
5699*53ee8cc1Swenshuai.xi 
5700*53ee8cc1Swenshuai.xi 
5701*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5702*53ee8cc1Swenshuai.xi }
5703*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_GetCmdSlot(TSP_FILE_ENG Eng,MS_U32 * pu32EmptySlot)5704*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_GetCmdSlot(TSP_FILE_ENG Eng, MS_U32 *pu32EmptySlot)
5705*53ee8cc1Swenshuai.xi {
5706*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5707*53ee8cc1Swenshuai.xi 
5708*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5709*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5710*53ee8cc1Swenshuai.xi 
5711*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5712*53ee8cc1Swenshuai.xi 
5713*53ee8cc1Swenshuai.xi     *pu32EmptySlot = HAL_TSP_Filein_CmdQSlot(eFileEng);
5714*53ee8cc1Swenshuai.xi 
5715*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5716*53ee8cc1Swenshuai.xi }
5717*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_Pause(TSP_FILE_ENG Eng)5718*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_Pause(TSP_FILE_ENG Eng)
5719*53ee8cc1Swenshuai.xi {
5720*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5721*53ee8cc1Swenshuai.xi 
5722*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5723*53ee8cc1Swenshuai.xi 
5724*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5725*53ee8cc1Swenshuai.xi 
5726*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5727*53ee8cc1Swenshuai.xi 
5728*53ee8cc1Swenshuai.xi     if(HAL_TSP_File_Pause(eFileEng))
5729*53ee8cc1Swenshuai.xi     {
5730*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_OK);
5731*53ee8cc1Swenshuai.xi     }
5732*53ee8cc1Swenshuai.xi     else
5733*53ee8cc1Swenshuai.xi     {
5734*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL);
5735*53ee8cc1Swenshuai.xi     }
5736*53ee8cc1Swenshuai.xi }
5737*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_Resume(TSP_FILE_ENG Eng)5738*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_Resume(TSP_FILE_ENG Eng)
5739*53ee8cc1Swenshuai.xi {
5740*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5741*53ee8cc1Swenshuai.xi 
5742*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5743*53ee8cc1Swenshuai.xi 
5744*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5745*53ee8cc1Swenshuai.xi 
5746*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5747*53ee8cc1Swenshuai.xi 
5748*53ee8cc1Swenshuai.xi     if(HAL_TSP_File_Resume(eFileEng))
5749*53ee8cc1Swenshuai.xi     {
5750*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_OK);
5751*53ee8cc1Swenshuai.xi     }
5752*53ee8cc1Swenshuai.xi     else
5753*53ee8cc1Swenshuai.xi     {
5754*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL);
5755*53ee8cc1Swenshuai.xi     }
5756*53ee8cc1Swenshuai.xi 
5757*53ee8cc1Swenshuai.xi }
5758*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_GetState(TSP_FILE_ENG Eng,TSP_FileState * pState)5759*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_GetState(TSP_FILE_ENG Eng, TSP_FileState *pState)
5760*53ee8cc1Swenshuai.xi {
5761*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5762*53ee8cc1Swenshuai.xi 
5763*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5764*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5765*53ee8cc1Swenshuai.xi 
5766*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5767*53ee8cc1Swenshuai.xi 
5768*53ee8cc1Swenshuai.xi     *pState = HAL_TSP_Filein_GetState(eFileEng);
5769*53ee8cc1Swenshuai.xi 
5770*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5771*53ee8cc1Swenshuai.xi }
5772*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_Reset(TSP_FILE_ENG Eng)5773*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_Reset(TSP_FILE_ENG Eng)
5774*53ee8cc1Swenshuai.xi {
5775*53ee8cc1Swenshuai.xi     MS_U32 u32Counter;
5776*53ee8cc1Swenshuai.xi 
5777*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5778*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5779*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5780*53ee8cc1Swenshuai.xi 
5781*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5782*53ee8cc1Swenshuai.xi 
5783*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_CmdQRst(eFileEng, TRUE);
5784*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_CmdQRst(eFileEng, FALSE);
5785*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_Abort(eFileEng, TRUE);
5786*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_Abort(eFileEng, FALSE);
5787*53ee8cc1Swenshuai.xi 
5788*53ee8cc1Swenshuai.xi     //reset the last data that hw is excuting --> HW new design
5789*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_WbFsmRst(eFileEng, TRUE);
5790*53ee8cc1Swenshuai.xi 
5791*53ee8cc1Swenshuai.xi     for(u32Counter = 0; u32Counter < 100; u32Counter++)
5792*53ee8cc1Swenshuai.xi     {
5793*53ee8cc1Swenshuai.xi         if(!HAL_TSP_Filein_Status(eFileEng))
5794*53ee8cc1Swenshuai.xi         {
5795*53ee8cc1Swenshuai.xi             break;
5796*53ee8cc1Swenshuai.xi         }
5797*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
5798*53ee8cc1Swenshuai.xi     }
5799*53ee8cc1Swenshuai.xi 
5800*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_WbFsmRst(eFileEng, FALSE);
5801*53ee8cc1Swenshuai.xi 
5802*53ee8cc1Swenshuai.xi     if(u32Counter == 100)
5803*53ee8cc1Swenshuai.xi     {
5804*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_ERROR, "[%s][%d] Wait file in done timeout\n", __FUNCTION__, __LINE__);
5805*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL);
5806*53ee8cc1Swenshuai.xi     }
5807*53ee8cc1Swenshuai.xi 
5808*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5809*53ee8cc1Swenshuai.xi }
5810*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_192BlockScheme_En(TSP_FILE_ENG Eng,MS_BOOL bEnable)5811*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_192BlockScheme_En(TSP_FILE_ENG Eng, MS_BOOL bEnable)
5812*53ee8cc1Swenshuai.xi {
5813*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5814*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5815*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5816*53ee8cc1Swenshuai.xi 
5817*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5818*53ee8cc1Swenshuai.xi 
5819*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_BlockTimeStamp(eFileEng, bEnable);
5820*53ee8cc1Swenshuai.xi 
5821*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5822*53ee8cc1Swenshuai.xi }
5823*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_PS_Path_Enable(TSP_FILE_ENG Eng,TSP_FileMode mode)5824*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_PS_Path_Enable(TSP_FILE_ENG Eng, TSP_FileMode mode)
5825*53ee8cc1Swenshuai.xi {
5826*53ee8cc1Swenshuai.xi     return E_TSP_FAIL_NOT_SUPPORTED;
5827*53ee8cc1Swenshuai.xi }
5828*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_CmdQFifo_Status(TSP_FILE_ENG Eng,MS_U8 * pu8FifoLevel)5829*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_CmdQFifo_Status(TSP_FILE_ENG Eng, MS_U8 *pu8FifoLevel)
5830*53ee8cc1Swenshuai.xi {
5831*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5832*53ee8cc1Swenshuai.xi 
5833*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5834*53ee8cc1Swenshuai.xi 
5835*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5836*53ee8cc1Swenshuai.xi 
5837*53ee8cc1Swenshuai.xi     *pu8FifoLevel = HAL_TSP_Filein_CmdQLv(eFileEng);
5838*53ee8cc1Swenshuai.xi 
5839*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5840*53ee8cc1Swenshuai.xi }
5841*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_TimeStampEnablePlaybackStamp(TSP_FILE_ENG Eng,MS_BOOL bEnable)5842*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_TimeStampEnablePlaybackStamp(TSP_FILE_ENG Eng,MS_BOOL bEnable)
5843*53ee8cc1Swenshuai.xi {
5844*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5845*53ee8cc1Swenshuai.xi 
5846*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5847*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5848*53ee8cc1Swenshuai.xi 
5849*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5850*53ee8cc1Swenshuai.xi 
5851*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_PacketMode(eFileEng,bEnable);
5852*53ee8cc1Swenshuai.xi 
5853*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5854*53ee8cc1Swenshuai.xi }
5855*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_TimeStampSetPlaybackStamp(TSP_FILE_ENG Eng,MS_U32 u32Stamp)5856*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_TimeStampSetPlaybackStamp(TSP_FILE_ENG Eng, MS_U32 u32Stamp)
5857*53ee8cc1Swenshuai.xi {
5858*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5859*53ee8cc1Swenshuai.xi 
5860*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5861*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5862*53ee8cc1Swenshuai.xi 
5863*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5864*53ee8cc1Swenshuai.xi 
5865*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_SetTimeStamp(eFileEng, u32Stamp);
5866*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5867*53ee8cc1Swenshuai.xi }
5868*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_TimeStampSetPlaybackStampClk(TSP_FILE_ENG Eng,TSP_TimeStamp_Clk eClk)5869*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_TimeStampSetPlaybackStampClk(TSP_FILE_ENG Eng, TSP_TimeStamp_Clk eClk)
5870*53ee8cc1Swenshuai.xi {
5871*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5872*53ee8cc1Swenshuai.xi 
5873*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5874*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5875*53ee8cc1Swenshuai.xi 
5876*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5877*53ee8cc1Swenshuai.xi 
5878*53ee8cc1Swenshuai.xi     TSP_HAL_TimeStamp_Clk eTimeStampClk = E_TSP_HAL_TIMESTAMP_CLK_INVALID;
5879*53ee8cc1Swenshuai.xi 
5880*53ee8cc1Swenshuai.xi     switch(eClk)
5881*53ee8cc1Swenshuai.xi     {
5882*53ee8cc1Swenshuai.xi         case E_TSP_TIMESTAMP_CLK_90K:
5883*53ee8cc1Swenshuai.xi             eTimeStampClk= E_TSP_HAL_TIMESTAMP_CLK_90K;
5884*53ee8cc1Swenshuai.xi             break;
5885*53ee8cc1Swenshuai.xi         case E_TSP_TIMESTAMP_CLK_27M:
5886*53ee8cc1Swenshuai.xi             eTimeStampClk= E_TSP_HAL_TIMESTAMP_CLK_27M;
5887*53ee8cc1Swenshuai.xi             break;
5888*53ee8cc1Swenshuai.xi         default:
5889*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d] UnSupport TimeStamp Clock!\n",__FUNCTION__,__LINE__);
5890*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL_PARAMETER);
5891*53ee8cc1Swenshuai.xi     }
5892*53ee8cc1Swenshuai.xi 
5893*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_SetTimeStampClk(eFileEng, eTimeStampClk);
5894*53ee8cc1Swenshuai.xi 
5895*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5896*53ee8cc1Swenshuai.xi }
5897*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_TimeStampGetPlaybackStamp(TSP_FILE_ENG Eng,MS_U32 * u32Stamp)5898*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_TimeStampGetPlaybackStamp(TSP_FILE_ENG Eng, MS_U32* u32Stamp)
5899*53ee8cc1Swenshuai.xi {
5900*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5901*53ee8cc1Swenshuai.xi 
5902*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5903*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5904*53ee8cc1Swenshuai.xi 
5905*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5906*53ee8cc1Swenshuai.xi 
5907*53ee8cc1Swenshuai.xi     *u32Stamp = HAL_TSP_Filein_GetTimeStamp(eFileEng);
5908*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5909*53ee8cc1Swenshuai.xi }
5910*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_GetFileInTimeStamp(TSP_FILE_ENG Eng,MS_U32 * u32TSLen)5911*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_GetFileInTimeStamp(TSP_FILE_ENG Eng, MS_U32* u32TSLen)
5912*53ee8cc1Swenshuai.xi {
5913*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5914*53ee8cc1Swenshuai.xi 
5915*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5916*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5917*53ee8cc1Swenshuai.xi 
5918*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5919*53ee8cc1Swenshuai.xi 
5920*53ee8cc1Swenshuai.xi     *u32TSLen = HAL_TSP_Filein_PktTimeStamp(eFileEng);
5921*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5922*53ee8cc1Swenshuai.xi }
5923*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_GetFileInCurReadAddr(TSP_FILE_ENG Eng,MS_PHY * pu32Addr)5924*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_GetFileInCurReadAddr(TSP_FILE_ENG Eng, MS_PHY *pu32Addr)
5925*53ee8cc1Swenshuai.xi {
5926*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5927*53ee8cc1Swenshuai.xi 
5928*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5929*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)Eng);
5930*53ee8cc1Swenshuai.xi 
5931*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5932*53ee8cc1Swenshuai.xi 
5933*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_GetCurAddr(eFileEng,pu32Addr);
5934*53ee8cc1Swenshuai.xi 
5935*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5936*53ee8cc1Swenshuai.xi }
5937*53ee8cc1Swenshuai.xi 
MDrv_TSP_FILE_Eng_MOBF_Enable(TSP_FILE_ENG eEng,MS_BOOL bEnable,MS_U32 u32Key)5938*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FILE_Eng_MOBF_Enable(TSP_FILE_ENG eEng, MS_BOOL bEnable, MS_U32 u32Key)
5939*53ee8cc1Swenshuai.xi {
5940*53ee8cc1Swenshuai.xi     TSP_ENTRY();
5941*53ee8cc1Swenshuai.xi 
5942*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = E_FILEENG_INVALID;
5943*53ee8cc1Swenshuai.xi     eFileEng = HAL_TSP_FilePath2Tsif_Mapping((MS_U32)eEng);
5944*53ee8cc1Swenshuai.xi 
5945*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(eFileEng);
5946*53ee8cc1Swenshuai.xi 
5947*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_MOBF_Enable(eFileEng, bEnable, u32Key);
5948*53ee8cc1Swenshuai.xi 
5949*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
5950*53ee8cc1Swenshuai.xi }
5951*53ee8cc1Swenshuai.xi 
5952*53ee8cc1Swenshuai.xi // -------------------------------------------------------------
5953*53ee8cc1Swenshuai.xi // Debug table
5954*53ee8cc1Swenshuai.xi // -------------------------------------------------------------
5955*53ee8cc1Swenshuai.xi #ifdef DEBUG_TABLE_SUPPORT
5956*53ee8cc1Swenshuai.xi 
_TSP_DrvHal_DstMapping(DrvTSP_AVFIFO eDebugFifo)5957*53ee8cc1Swenshuai.xi static TSP_DST_SEQ _TSP_DrvHal_DstMapping(DrvTSP_AVFIFO eDebugFifo)
5958*53ee8cc1Swenshuai.xi {
5959*53ee8cc1Swenshuai.xi     TSP_DST_SEQ eRetDst = E_TSP_DST_INVALID;
5960*53ee8cc1Swenshuai.xi 
5961*53ee8cc1Swenshuai.xi     switch(eDebugFifo)
5962*53ee8cc1Swenshuai.xi     {
5963*53ee8cc1Swenshuai.xi         case E_DRVTSP_AVFIFO_VIDEO ... E_DRVTSP_AVFIFO_VIDEO8:
5964*53ee8cc1Swenshuai.xi             eRetDst= (TSP_DST_SEQ)(E_TSP_DST_FIFO_VIDEO + (eDebugFifo - E_DRVTSP_AVFIFO_VIDEO));
5965*53ee8cc1Swenshuai.xi             break;
5966*53ee8cc1Swenshuai.xi         case E_DRVTSP_AVFIFO_AUDIO ... E_DRVTSP_AVFIFO_AUDIOF:
5967*53ee8cc1Swenshuai.xi             eRetDst = (TSP_DST_SEQ)(E_TSP_DST_FIFO_AUDIO + (eDebugFifo - E_DRVTSP_AVFIFO_AUDIO));
5968*53ee8cc1Swenshuai.xi             break;
5969*53ee8cc1Swenshuai.xi         default:
5970*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d] UnSupport Debug AV Type!\n",__FUNCTION__,__LINE__);
5971*53ee8cc1Swenshuai.xi             break;
5972*53ee8cc1Swenshuai.xi     }
5973*53ee8cc1Swenshuai.xi 
5974*53ee8cc1Swenshuai.xi     return eRetDst;
5975*53ee8cc1Swenshuai.xi }
5976*53ee8cc1Swenshuai.xi 
_TSP_DrvHal_FlowMapping(DrvTSP_Flow eDebugFlow)5977*53ee8cc1Swenshuai.xi static TSP_HAL_FLOW _TSP_DrvHal_FlowMapping(DrvTSP_Flow eDebugFlow)
5978*53ee8cc1Swenshuai.xi {
5979*53ee8cc1Swenshuai.xi     TSP_HAL_FLOW eHalFlow = E_TSP_HAL_FLOW_INVALID;
5980*53ee8cc1Swenshuai.xi 
5981*53ee8cc1Swenshuai.xi     switch(eDebugFlow)
5982*53ee8cc1Swenshuai.xi     {
5983*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_LIVE0:
5984*53ee8cc1Swenshuai.xi             eHalFlow= E_TSP_HAL_FLOW_LIVE0;
5985*53ee8cc1Swenshuai.xi             break;
5986*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_LIVE1:
5987*53ee8cc1Swenshuai.xi             eHalFlow= E_TSP_HAL_FLOW_LIVE1;
5988*53ee8cc1Swenshuai.xi             break;
5989*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_LIVE2:
5990*53ee8cc1Swenshuai.xi             eHalFlow= E_TSP_HAL_FLOW_LIVE2;
5991*53ee8cc1Swenshuai.xi             break;
5992*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_LIVE3:
5993*53ee8cc1Swenshuai.xi             eHalFlow= E_TSP_HAL_FLOW_LIVE3;
5994*53ee8cc1Swenshuai.xi             break;
5995*53ee8cc1Swenshuai.xi        case E_DRVTSP_FLOW_FILE0:
5996*53ee8cc1Swenshuai.xi             eHalFlow= E_TSP_HAL_FLOW_FILE0;
5997*53ee8cc1Swenshuai.xi             break;
5998*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_FILE1:
5999*53ee8cc1Swenshuai.xi             eHalFlow= E_TSP_HAL_FLOW_FILE1;
6000*53ee8cc1Swenshuai.xi             break;
6001*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_FILE2:
6002*53ee8cc1Swenshuai.xi             eHalFlow= E_TSP_HAL_FLOW_FILE2;
6003*53ee8cc1Swenshuai.xi             break;
6004*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_FILE3:
6005*53ee8cc1Swenshuai.xi             eHalFlow= E_TSP_HAL_FLOW_FILE3;
6006*53ee8cc1Swenshuai.xi             break;
6007*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_LIVE4:
6008*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_FILE4:
6009*53ee8cc1Swenshuai.xi             eHalFlow= E_TSP_HAL_FLOW_LIVE4;
6010*53ee8cc1Swenshuai.xi             break;
6011*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_LIVE5:
6012*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_FILE5:
6013*53ee8cc1Swenshuai.xi             eHalFlow= E_TSP_HAL_FLOW_LIVE5;
6014*53ee8cc1Swenshuai.xi             break;
6015*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_LIVE6:
6016*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_FILE6:
6017*53ee8cc1Swenshuai.xi             eHalFlow= E_TSP_HAL_FLOW_LIVE6;
6018*53ee8cc1Swenshuai.xi             break;
6019*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_MMFI0:
6020*53ee8cc1Swenshuai.xi             eHalFlow= E_TSP_HAL_FLOW_MMFI0;
6021*53ee8cc1Swenshuai.xi             break;
6022*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_MMFI1:
6023*53ee8cc1Swenshuai.xi             eHalFlow= E_TSP_HAL_FLOW_MMFI1;
6024*53ee8cc1Swenshuai.xi             break;
6025*53ee8cc1Swenshuai.xi         default:
6026*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d] UnSupport Debug Flow !\n",__FUNCTION__,__LINE__);
6027*53ee8cc1Swenshuai.xi             break;
6028*53ee8cc1Swenshuai.xi     }
6029*53ee8cc1Swenshuai.xi 
6030*53ee8cc1Swenshuai.xi     return eHalFlow;
6031*53ee8cc1Swenshuai.xi }
6032*53ee8cc1Swenshuai.xi 
MDrv_TSP_Get_DisContiCnt(DrvTSP_Debug_Cmd eCmd,DrvTSP_AVFIFO eAvType,DrvTSP_Flow eFlow,MS_U32 * pu32Cnt)6033*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_DisContiCnt(DrvTSP_Debug_Cmd eCmd, DrvTSP_AVFIFO eAvType, DrvTSP_Flow eFlow, MS_U32 *pu32Cnt)
6034*53ee8cc1Swenshuai.xi {
6035*53ee8cc1Swenshuai.xi     TSP_DST_SEQ  eDstType = _TSP_DrvHal_DstMapping(eAvType);
6036*53ee8cc1Swenshuai.xi     TSP_HAL_FLOW eHalFlow = _TSP_DrvHal_FlowMapping(eFlow);
6037*53ee8cc1Swenshuai.xi     TSP_SRC_SEQ  ePktDmx  = HAL_TSP_Debug_Flow2PktDmx_Mapping(eHalFlow);
6038*53ee8cc1Swenshuai.xi 
6039*53ee8cc1Swenshuai.xi     if(eDstType==E_TSP_DST_INVALID || eHalFlow==E_TSP_HAL_FLOW_INVALID || ePktDmx==E_TSP_SRC_INVALID)
6040*53ee8cc1Swenshuai.xi     {
6041*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
6042*53ee8cc1Swenshuai.xi     }
6043*53ee8cc1Swenshuai.xi 
6044*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6045*53ee8cc1Swenshuai.xi 
6046*53ee8cc1Swenshuai.xi     HAL_TSP_Debug_DropDisPktCnt_Src(eDstType,ePktDmx);
6047*53ee8cc1Swenshuai.xi     HAL_TSP_Debug_DisPktCnt_Load(eDstType,FALSE,TRUE);
6048*53ee8cc1Swenshuai.xi     *pu32Cnt = HAL_TSP_Debug_DropDisPktCnt_Get(ePktDmx, FALSE);
6049*53ee8cc1Swenshuai.xi 
6050*53ee8cc1Swenshuai.xi     switch(eCmd)
6051*53ee8cc1Swenshuai.xi     {
6052*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_NONE:
6053*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_DISABLE:
6054*53ee8cc1Swenshuai.xi             break;
6055*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_CLEAR:
6056*53ee8cc1Swenshuai.xi             HAL_TSP_Debug_ClrSrcSel(ePktDmx);
6057*53ee8cc1Swenshuai.xi             HAL_TSP_Debug_DisPktCnt_Clear(eDstType);
6058*53ee8cc1Swenshuai.xi             break;
6059*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_ENABLE:
6060*53ee8cc1Swenshuai.xi             HAL_TSP_Debug_DisPktCnt_Load(eDstType,TRUE,TRUE);
6061*53ee8cc1Swenshuai.xi             break;
6062*53ee8cc1Swenshuai.xi         default:
6063*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[%s][%d] UnSupported Debug Cmd  !!\n",__FUNCTION__,__LINE__);
6064*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL);
6065*53ee8cc1Swenshuai.xi     }
6066*53ee8cc1Swenshuai.xi 
6067*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6068*53ee8cc1Swenshuai.xi }
6069*53ee8cc1Swenshuai.xi 
MDrv_TSP_Get_DropPktCnt(DrvTSP_Debug_Cmd eCmd,DrvTSP_AVFIFO eAvType,DrvTSP_Flow eFlow,MS_U32 * pu32Cnt)6070*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_DropPktCnt(DrvTSP_Debug_Cmd eCmd, DrvTSP_AVFIFO eAvType, DrvTSP_Flow eFlow, MS_U32 *pu32Cnt)
6071*53ee8cc1Swenshuai.xi {
6072*53ee8cc1Swenshuai.xi     TSP_DST_SEQ  eDstType = _TSP_DrvHal_DstMapping(eAvType);
6073*53ee8cc1Swenshuai.xi     TSP_HAL_FLOW eHalFlow = _TSP_DrvHal_FlowMapping(eFlow);
6074*53ee8cc1Swenshuai.xi     TSP_SRC_SEQ  ePktDmx  = HAL_TSP_Debug_Flow2PktDmx_Mapping(eHalFlow);
6075*53ee8cc1Swenshuai.xi 
6076*53ee8cc1Swenshuai.xi     if(eDstType==E_TSP_DST_INVALID || eHalFlow==E_TSP_HAL_FLOW_INVALID || ePktDmx==E_TSP_SRC_INVALID)
6077*53ee8cc1Swenshuai.xi     {
6078*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
6079*53ee8cc1Swenshuai.xi     }
6080*53ee8cc1Swenshuai.xi 
6081*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6082*53ee8cc1Swenshuai.xi 
6083*53ee8cc1Swenshuai.xi     HAL_TSP_Debug_DropDisPktCnt_Src(eDstType,ePktDmx);
6084*53ee8cc1Swenshuai.xi     HAL_TSP_Debug_DropPktCnt_Load(eDstType, FALSE);
6085*53ee8cc1Swenshuai.xi     *pu32Cnt = HAL_TSP_Debug_DropDisPktCnt_Get(ePktDmx, TRUE);
6086*53ee8cc1Swenshuai.xi 
6087*53ee8cc1Swenshuai.xi     switch(eCmd)
6088*53ee8cc1Swenshuai.xi     {
6089*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_NONE:
6090*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_DISABLE:
6091*53ee8cc1Swenshuai.xi             break;
6092*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_CLEAR:
6093*53ee8cc1Swenshuai.xi             HAL_TSP_Debug_ClrSrcSel(ePktDmx);
6094*53ee8cc1Swenshuai.xi             HAL_TSP_Debug_DropPktCnt_Clear(eDstType);
6095*53ee8cc1Swenshuai.xi             break;
6096*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_ENABLE:
6097*53ee8cc1Swenshuai.xi             HAL_TSP_Debug_DropPktCnt_Load(eDstType, TRUE);
6098*53ee8cc1Swenshuai.xi             break;
6099*53ee8cc1Swenshuai.xi         default:
6100*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[%s][%d] UnSupported Debug Cmd  !!\n",__FUNCTION__,__LINE__);
6101*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL);
6102*53ee8cc1Swenshuai.xi     }
6103*53ee8cc1Swenshuai.xi 
6104*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6105*53ee8cc1Swenshuai.xi }
6106*53ee8cc1Swenshuai.xi 
MDrv_TSP_Get_LockPktCnt(DrvTSP_Debug_Cmd eCmd,DrvTSP_Flow eFlow,MS_U32 * pu32Cnt)6107*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_LockPktCnt(DrvTSP_Debug_Cmd eCmd, DrvTSP_Flow eFlow, MS_U32 *pu32Cnt)
6108*53ee8cc1Swenshuai.xi {
6109*53ee8cc1Swenshuai.xi     TSP_TSIF eTSIF;
6110*53ee8cc1Swenshuai.xi 
6111*53ee8cc1Swenshuai.xi     switch(eFlow)
6112*53ee8cc1Swenshuai.xi     {
6113*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_LIVE0:
6114*53ee8cc1Swenshuai.xi             eTSIF = E_TSP_TSIF_0;
6115*53ee8cc1Swenshuai.xi             break;
6116*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_LIVE1:
6117*53ee8cc1Swenshuai.xi             eTSIF = E_TSP_TSIF_1;
6118*53ee8cc1Swenshuai.xi             break;
6119*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_LIVE2:
6120*53ee8cc1Swenshuai.xi             eTSIF = E_TSP_TSIF_2;
6121*53ee8cc1Swenshuai.xi             break;
6122*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_LIVE3:
6123*53ee8cc1Swenshuai.xi             eTSIF = E_TSP_TSIF_3;
6124*53ee8cc1Swenshuai.xi             break;
6125*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_LIVE4:
6126*53ee8cc1Swenshuai.xi             eTSIF = E_TSP_TSIF_4;
6127*53ee8cc1Swenshuai.xi             break;
6128*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_LIVE5:
6129*53ee8cc1Swenshuai.xi             eTSIF = E_TSP_TSIF_5;
6130*53ee8cc1Swenshuai.xi             break;
6131*53ee8cc1Swenshuai.xi         case E_DRVTSP_FLOW_LIVE6:
6132*53ee8cc1Swenshuai.xi             eTSIF = E_TSP_TSIF_6;
6133*53ee8cc1Swenshuai.xi             break;
6134*53ee8cc1Swenshuai.xi         default:
6135*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[%s][%d] UnSupport Debug Flow !!\n",__FUNCTION__,__LINE__);
6136*53ee8cc1Swenshuai.xi             return E_TSP_FAIL;
6137*53ee8cc1Swenshuai.xi     }
6138*53ee8cc1Swenshuai.xi 
6139*53ee8cc1Swenshuai.xi     TSP_HAL_TSIF eHalTSIF = _TSP_DrvHal_TSIFMapping(eTSIF);
6140*53ee8cc1Swenshuai.xi 
6141*53ee8cc1Swenshuai.xi     if(eHalTSIF==E_TSP_HAL_TSIF_INVALID)
6142*53ee8cc1Swenshuai.xi     {
6143*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
6144*53ee8cc1Swenshuai.xi     }
6145*53ee8cc1Swenshuai.xi 
6146*53ee8cc1Swenshuai.xi     MS_U32 u32TSIF = HAL_TSP_TsifMapping(eHalTSIF, FALSE);
6147*53ee8cc1Swenshuai.xi 
6148*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(u32TSIF);
6149*53ee8cc1Swenshuai.xi 
6150*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6151*53ee8cc1Swenshuai.xi 
6152*53ee8cc1Swenshuai.xi     HAL_TSP_Debug_LockPktCnt_Src(u32TSIF);
6153*53ee8cc1Swenshuai.xi     HAL_TSP_Debug_LockPktCnt_Load(u32TSIF,FALSE);
6154*53ee8cc1Swenshuai.xi     *pu32Cnt = HAL_TSP_Debug_LockPktCnt_Get(u32TSIF, TRUE);
6155*53ee8cc1Swenshuai.xi 
6156*53ee8cc1Swenshuai.xi     switch(eCmd)
6157*53ee8cc1Swenshuai.xi     {
6158*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_NONE:
6159*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_DISABLE:
6160*53ee8cc1Swenshuai.xi             break;
6161*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_CLEAR:
6162*53ee8cc1Swenshuai.xi             HAL_TSP_Debug_LockPktCnt_Clear(u32TSIF);
6163*53ee8cc1Swenshuai.xi             break;
6164*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_ENABLE:
6165*53ee8cc1Swenshuai.xi             HAL_TSP_Debug_LockPktCnt_Load(u32TSIF,TRUE);
6166*53ee8cc1Swenshuai.xi             break;
6167*53ee8cc1Swenshuai.xi         default:
6168*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[%s][%d] UnSupported Debug Cmd !!\n",__FUNCTION__,__LINE__);
6169*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL);
6170*53ee8cc1Swenshuai.xi     }
6171*53ee8cc1Swenshuai.xi 
6172*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6173*53ee8cc1Swenshuai.xi }
6174*53ee8cc1Swenshuai.xi 
MDrv_TSP_Get_AVPktCnt(DrvTSP_Debug_Cmd eCmd,DrvTSP_AVFIFO eAvType,DrvTSP_Flow eFlow,MS_U32 * pu32Cnt)6175*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_AVPktCnt(DrvTSP_Debug_Cmd eCmd, DrvTSP_AVFIFO eAvType, DrvTSP_Flow eFlow, MS_U32 *pu32Cnt)
6176*53ee8cc1Swenshuai.xi {
6177*53ee8cc1Swenshuai.xi     TSP_DST_SEQ  eDstType = _TSP_DrvHal_DstMapping(eAvType);
6178*53ee8cc1Swenshuai.xi     TSP_HAL_FLOW eHalFlow = _TSP_DrvHal_FlowMapping(eFlow);
6179*53ee8cc1Swenshuai.xi     TSP_SRC_SEQ  ePktDmx  = HAL_TSP_Debug_Flow2PktDmx_Mapping(eHalFlow);
6180*53ee8cc1Swenshuai.xi 
6181*53ee8cc1Swenshuai.xi     if(eDstType==E_TSP_DST_INVALID || eHalFlow==E_TSP_HAL_FLOW_INVALID || ePktDmx==E_TSP_SRC_INVALID)
6182*53ee8cc1Swenshuai.xi     {
6183*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
6184*53ee8cc1Swenshuai.xi     }
6185*53ee8cc1Swenshuai.xi 
6186*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6187*53ee8cc1Swenshuai.xi 
6188*53ee8cc1Swenshuai.xi     HAL_TSP_Debug_AvPktCnt_Src(eDstType,ePktDmx);
6189*53ee8cc1Swenshuai.xi     HAL_TSP_Debug_AvPktCnt_Load(eDstType, FALSE);
6190*53ee8cc1Swenshuai.xi     *pu32Cnt = HAL_TSP_Debug_AvPktCnt_Get(eDstType);
6191*53ee8cc1Swenshuai.xi 
6192*53ee8cc1Swenshuai.xi     switch(eCmd)
6193*53ee8cc1Swenshuai.xi     {
6194*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_NONE:
6195*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_DISABLE:
6196*53ee8cc1Swenshuai.xi             break;
6197*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_CLEAR:
6198*53ee8cc1Swenshuai.xi             HAL_TSP_Debug_ClrSrcSel(ePktDmx);
6199*53ee8cc1Swenshuai.xi             HAL_TSP_Debug_AvPktCnt_Clear(eDstType);
6200*53ee8cc1Swenshuai.xi             break;
6201*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_ENABLE:
6202*53ee8cc1Swenshuai.xi             HAL_TSP_Debug_AvPktCnt_Load(eDstType, TRUE);
6203*53ee8cc1Swenshuai.xi             break;
6204*53ee8cc1Swenshuai.xi         default:
6205*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[%s][%d] UnSupported Debug Cmd !!\n",__FUNCTION__,__LINE__);
6206*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL);
6207*53ee8cc1Swenshuai.xi     }
6208*53ee8cc1Swenshuai.xi 
6209*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6210*53ee8cc1Swenshuai.xi 
6211*53ee8cc1Swenshuai.xi }
6212*53ee8cc1Swenshuai.xi 
6213*53ee8cc1Swenshuai.xi #if 0
6214*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_ErrPktCnt(DrvTSP_ErrPktCnt_info* tspInfo, MS_U32* pu32Cnt)
6215*53ee8cc1Swenshuai.xi {
6216*53ee8cc1Swenshuai.xi     MS_U32  u32SrcPath = 0;
6217*53ee8cc1Swenshuai.xi 
6218*53ee8cc1Swenshuai.xi     switch(tspInfo->TspTsif)
6219*53ee8cc1Swenshuai.xi     {
6220*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_TSIF_TS0:
6221*53ee8cc1Swenshuai.xi             u32SrcPath = 0;
6222*53ee8cc1Swenshuai.xi             break;
6223*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_TSIF_TS1:
6224*53ee8cc1Swenshuai.xi             u32SrcPath = 1;
6225*53ee8cc1Swenshuai.xi             break;
6226*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_TSIF_TS2:
6227*53ee8cc1Swenshuai.xi             u32SrcPath = 2;
6228*53ee8cc1Swenshuai.xi             break;
6229*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_TSIF_TS3:
6230*53ee8cc1Swenshuai.xi             u32SrcPath = 3;
6231*53ee8cc1Swenshuai.xi             break;
6232*53ee8cc1Swenshuai.xi         default:
6233*53ee8cc1Swenshuai.xi             break;
6234*53ee8cc1Swenshuai.xi     }
6235*53ee8cc1Swenshuai.xi 
6236*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6237*53ee8cc1Swenshuai.xi 
6238*53ee8cc1Swenshuai.xi     switch(tspInfo->TspCmd)
6239*53ee8cc1Swenshuai.xi     {
6240*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_NONE:
6241*53ee8cc1Swenshuai.xi             break;
6242*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_CLEAR:
6243*53ee8cc1Swenshuai.xi             HAL_TSP_Clr_Src_Set(u32SrcPath);
6244*53ee8cc1Swenshuai.xi             HAL_TSP_ERRPKTCnt_Clear(u32SrcPath);
6245*53ee8cc1Swenshuai.xi             break;
6246*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_ENABLE:
6247*53ee8cc1Swenshuai.xi         case E_DRVTSP_DEBUG_CMD_DISABLE:
6248*53ee8cc1Swenshuai.xi             HAL_TSP_ERRPKTCnt_Load_En(u32SrcPath,((tspInfo->TspCmd == E_DRVTSP_DEBUG_CMD_ENABLE)? TRUE : FALSE));
6249*53ee8cc1Swenshuai.xi             break;
6250*53ee8cc1Swenshuai.xi         default:
6251*53ee8cc1Swenshuai.xi             ULOGE("TSP", "[%s][%d] operation not support !!\n",__FUNCTION__,__LINE__);
6252*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL);
6253*53ee8cc1Swenshuai.xi     }
6254*53ee8cc1Swenshuai.xi 
6255*53ee8cc1Swenshuai.xi     HAL_TSP_ERRPKTCnt_Sel(u32SrcPath);
6256*53ee8cc1Swenshuai.xi     *pu32Cnt = HAL_TSP_ERRPKTCnt_Get();
6257*53ee8cc1Swenshuai.xi 
6258*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6259*53ee8cc1Swenshuai.xi }
6260*53ee8cc1Swenshuai.xi #endif
6261*53ee8cc1Swenshuai.xi 
6262*53ee8cc1Swenshuai.xi #endif
6263*53ee8cc1Swenshuai.xi 
6264*53ee8cc1Swenshuai.xi 
6265*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6266*53ee8cc1Swenshuai.xi ///Set or Get merge stream sync byte
6267*53ee8cc1Swenshuai.xi /// @param eIf                                 \b IN:  Eunm value of TSP TSIF selection
6268*53ee8cc1Swenshuai.xi /// @param u8StrId                           \b IN:  Stream index
6269*53ee8cc1Swenshuai.xi /// @param pu8SyncByte                   \b IN:  Pointer to store sync byte of merege streams
6270*53ee8cc1Swenshuai.xi /// @param bSet                              \b IN:  TRUE to setting data or FALSE to getting table
6271*53ee8cc1Swenshuai.xi /// @return DRVTSP_OK   - Success
6272*53ee8cc1Swenshuai.xi /// @return DRVTSP_FAIL - Failure
6273*53ee8cc1Swenshuai.xi /// @note: Currently, maxmum number is 8, and don't call this API when stream processing is started
6274*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_MStr_SyncByte(DrvTSP_If eTsIf,MS_U8 u8StrId,MS_U8 * pu8SyncByte,MS_BOOL bSet)6275*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_MStr_SyncByte(DrvTSP_If eTsIf, MS_U8 u8StrId, MS_U8* pu8SyncByte, MS_BOOL bSet)
6276*53ee8cc1Swenshuai.xi {
6277*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
6278*53ee8cc1Swenshuai.xi     MS_U8 u8Path = 0;
6279*53ee8cc1Swenshuai.xi 
6280*53ee8cc1Swenshuai.xi     if(u8StrId >= TSP_MERGESTREAM_NUM)
6281*53ee8cc1Swenshuai.xi     {
6282*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[%s][%d] Stream index out of range !!\n",__FUNCTION__,__LINE__);
6283*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
6284*53ee8cc1Swenshuai.xi     }
6285*53ee8cc1Swenshuai.xi     TSP_HAL_TSIF eHalTSIF = MDrv_TSP_TsifMapping(eTsIf);
6286*53ee8cc1Swenshuai.xi     u8Path = HAL_TSP_TsifMapping(eHalTSIF, FALSE);
6287*53ee8cc1Swenshuai.xi 
6288*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(u8Path);
6289*53ee8cc1Swenshuai.xi 
6290*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6291*53ee8cc1Swenshuai.xi 
6292*53ee8cc1Swenshuai.xi     if(HAL_TSP_PktConverter_SetSyncByte(u8Path, u8StrId, pu8SyncByte, bSet) == FALSE)
6293*53ee8cc1Swenshuai.xi     {
6294*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL);
6295*53ee8cc1Swenshuai.xi     }
6296*53ee8cc1Swenshuai.xi 
6297*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6298*53ee8cc1Swenshuai.xi 
6299*53ee8cc1Swenshuai.xi #else
6300*53ee8cc1Swenshuai.xi     return E_TSP_FAIL_NOT_SUPPORTED;
6301*53ee8cc1Swenshuai.xi #endif
6302*53ee8cc1Swenshuai.xi }
6303*53ee8cc1Swenshuai.xi 
6304*53ee8cc1Swenshuai.xi 
6305*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6306*53ee8cc1Swenshuai.xi /// Get current system time clock (STC) of TSP
6307*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
6308*53ee8cc1Swenshuai.xi /// @param  pu32STC_32              \b OUT: pointer of STC[32] return
6309*53ee8cc1Swenshuai.xi /// @param  pu32STC                 \b OUT: pointer of STC[31:0] return
6310*53ee8cc1Swenshuai.xi /// @return TSP_Result
6311*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_GetSTC(MS_U32 u32EngId,MS_U32 * pu32STC_H,MS_U32 * pu32STC)6312*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetSTC(MS_U32 u32EngId, MS_U32 *pu32STC_H, MS_U32 *pu32STC)
6313*53ee8cc1Swenshuai.xi {
6314*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
6315*53ee8cc1Swenshuai.xi     TSP_CHECK(pu32STC_H, "[%04d] NULL pointer\n", __LINE__);
6316*53ee8cc1Swenshuai.xi     TSP_CHECK(pu32STC, "[%04d] NULL pointer\n", __LINE__);
6317*53ee8cc1Swenshuai.xi 
6318*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6319*53ee8cc1Swenshuai.xi 
6320*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_STC_CHECK(u32EngId);
6321*53ee8cc1Swenshuai.xi     //HAL_TSP_CMDQ_GetSTC(pu32STC_H, pu32STC);
6322*53ee8cc1Swenshuai.xi     //HAL_TSP_GetSTC(pu32STC_H, pu32STC);
6323*53ee8cc1Swenshuai.xi     HAL_TSP_STC33_CmdQGet(pu32STC_H, pu32STC);
6324*53ee8cc1Swenshuai.xi 
6325*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6326*53ee8cc1Swenshuai.xi }
6327*53ee8cc1Swenshuai.xi 
6328*53ee8cc1Swenshuai.xi 
6329*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6330*53ee8cc1Swenshuai.xi /// Get PRC of TSP
6331*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
6332*53ee8cc1Swenshuai.xi /// @param  pu32Pcr_32              \b OUT: pointer of STC[32] return
6333*53ee8cc1Swenshuai.xi /// @param  pu32Pcr                 \b OUT: pointer of STC[31:0] return
6334*53ee8cc1Swenshuai.xi /// @return TSP_Result
6335*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_GetPCR(MS_U32 u32EngId,MS_U32 * pu32PCR_H,MS_U32 * pu32PCR)6336*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetPCR(MS_U32 u32EngId, MS_U32 *pu32PCR_H, MS_U32 *pu32PCR)
6337*53ee8cc1Swenshuai.xi {
6338*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
6339*53ee8cc1Swenshuai.xi     TSP_CHECK(pu32PCR_H, "[%04d] NULL pointer\n", __LINE__);
6340*53ee8cc1Swenshuai.xi     TSP_CHECK(pu32PCR, "[%04d] NULL pointer\n", __LINE__);
6341*53ee8cc1Swenshuai.xi 
6342*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6343*53ee8cc1Swenshuai.xi 
6344*53ee8cc1Swenshuai.xi     HAL_TSP_PcrFlt_GetPcr(u32EngId, pu32PCR_H, pu32PCR);
6345*53ee8cc1Swenshuai.xi 
6346*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6347*53ee8cc1Swenshuai.xi }
6348*53ee8cc1Swenshuai.xi 
6349*53ee8cc1Swenshuai.xi 
6350*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6351*53ee8cc1Swenshuai.xi /// Get TSP driver version
6352*53ee8cc1Swenshuai.xi /// @param <IN>        \b const MS_U8 **pVerString :
6353*53ee8cc1Swenshuai.xi /// @param <RET>       \b   : when get ok, return the pointer to the driver version
6354*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_GetLibVer(const MSIF_Version ** ppVersion)6355*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetLibVer(const MSIF_Version **ppVersion)
6356*53ee8cc1Swenshuai.xi {
6357*53ee8cc1Swenshuai.xi     // No mutex check, it can be called before Init
6358*53ee8cc1Swenshuai.xi     if (!ppVersion)
6359*53ee8cc1Swenshuai.xi     {
6360*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
6361*53ee8cc1Swenshuai.xi     }
6362*53ee8cc1Swenshuai.xi 
6363*53ee8cc1Swenshuai.xi     *ppVersion = &_drv_tsp_version;
6364*53ee8cc1Swenshuai.xi 
6365*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6366*53ee8cc1Swenshuai.xi }
6367*53ee8cc1Swenshuai.xi 
6368*53ee8cc1Swenshuai.xi 
MDrv_TSP_GetStatus(TSP_HW_Status * HW_Status,TSP_SW_Status * SW_Status)6369*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetStatus(TSP_HW_Status *HW_Status, TSP_SW_Status *SW_Status)
6370*53ee8cc1Swenshuai.xi {
6371*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6372*53ee8cc1Swenshuai.xi     if (HAL_TSP_HCMD_Alive())
6373*53ee8cc1Swenshuai.xi     {
6374*53ee8cc1Swenshuai.xi         *HW_Status = E_TSP_HW_ALIVE;
6375*53ee8cc1Swenshuai.xi     }
6376*53ee8cc1Swenshuai.xi     else
6377*53ee8cc1Swenshuai.xi     {
6378*53ee8cc1Swenshuai.xi         *HW_Status = E_TSP_HW_DEALIVE;
6379*53ee8cc1Swenshuai.xi     }
6380*53ee8cc1Swenshuai.xi     *SW_Status = _ptsp_res->_tspInfo.Status;
6381*53ee8cc1Swenshuai.xi 
6382*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6383*53ee8cc1Swenshuai.xi }
6384*53ee8cc1Swenshuai.xi 
MDrv_TSP_GetFWVER(MS_U32 * u32FWVer)6385*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetFWVER(MS_U32* u32FWVer)
6386*53ee8cc1Swenshuai.xi {
6387*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6388*53ee8cc1Swenshuai.xi     *u32FWVer = HAL_TSP_HCMD_GetInfo(INFO_FW_VERSION);
6389*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6390*53ee8cc1Swenshuai.xi }
6391*53ee8cc1Swenshuai.xi 
6392*53ee8cc1Swenshuai.xi //@F_TODO api layer throw a enum that we don't have. check u8IfUID
MDrv_TSP_GetTSIFStatus(TSP_TSIF eTSIF,TSP_TSPad * ePad,MS_BOOL * pbClkInv,MS_BOOL * pbExtSyc,MS_BOOL * pbParl)6393*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetTSIFStatus(TSP_TSIF eTSIF, TSP_TSPad* ePad, MS_BOOL* pbClkInv, MS_BOOL* pbExtSyc, MS_BOOL* pbParl)
6394*53ee8cc1Swenshuai.xi {
6395*53ee8cc1Swenshuai.xi     TSP_Result Res = E_TSP_OK;
6396*53ee8cc1Swenshuai.xi     MS_U32 u32TSIF;
6397*53ee8cc1Swenshuai.xi     TSP_HAL_TSIF eHalTSIF = _TSP_DrvHal_TSIFMapping(eTSIF);
6398*53ee8cc1Swenshuai.xi     //if live-in and file-in of a DmxFlow map to diff TSIF, return the status of the live-in one
6399*53ee8cc1Swenshuai.xi     u32TSIF = HAL_TSP_TsifMapping(eHalTSIF, FALSE);
6400*53ee8cc1Swenshuai.xi 
6401*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(u32TSIF);
6402*53ee8cc1Swenshuai.xi 
6403*53ee8cc1Swenshuai.xi     *ePad = _ptsp_res->TsIf_Src[u32TSIF].ePad;
6404*53ee8cc1Swenshuai.xi     *pbClkInv = _ptsp_res->TsIf_Src[u32TSIF].bClkInv;
6405*53ee8cc1Swenshuai.xi     *pbExtSyc = _ptsp_res->TsIf_Src[u32TSIF].bExtSync;
6406*53ee8cc1Swenshuai.xi     *pbParl = _ptsp_res->TsIf_Src[u32TSIF].bParallel;
6407*53ee8cc1Swenshuai.xi 
6408*53ee8cc1Swenshuai.xi     return Res;
6409*53ee8cc1Swenshuai.xi }
6410*53ee8cc1Swenshuai.xi 
6411*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
6412*53ee8cc1Swenshuai.xi /// Get command queue fifo level
6413*53ee8cc1Swenshuai.xi /// @param  pu8FifoLevel      \b OUT: fifo level, 0~3
6414*53ee8cc1Swenshuai.xi /// @return TSP_Result
6415*53ee8cc1Swenshuai.xi /// @note
6416*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_TSP_CmdQFifo_Status(MS_U8 * pu8FifoLevel)6417*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_CmdQFifo_Status(MS_U8 *pu8FifoLevel)
6418*53ee8cc1Swenshuai.xi {
6419*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6420*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
6421*53ee8cc1Swenshuai.xi     *pu8FifoLevel = HAL_TSP_Filein_CmdQLv(eFileEng);
6422*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6423*53ee8cc1Swenshuai.xi }
6424*53ee8cc1Swenshuai.xi 
MDrv_TSP_SetDbgLevel(TSP_DbgLevel DbgLevel)6425*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetDbgLevel(TSP_DbgLevel DbgLevel)
6426*53ee8cc1Swenshuai.xi {
6427*53ee8cc1Swenshuai.xi     _u32DbgLevel = DbgLevel;
6428*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6429*53ee8cc1Swenshuai.xi }
6430*53ee8cc1Swenshuai.xi 
_TSP_DrvHal_CapsMapping(TSP_Caps eCap)6431*53ee8cc1Swenshuai.xi static TSP_HAL_CAP_TYPE _TSP_DrvHal_CapsMapping(TSP_Caps eCap)
6432*53ee8cc1Swenshuai.xi {
6433*53ee8cc1Swenshuai.xi     TSP_HAL_CAP_TYPE eRetCapType = E_TSP_HAL_CAP_VAL_NULL;
6434*53ee8cc1Swenshuai.xi 
6435*53ee8cc1Swenshuai.xi     switch(eCap)
6436*53ee8cc1Swenshuai.xi     {
6437*53ee8cc1Swenshuai.xi         case E_TSP_CAP_PIDFLT_NUM:
6438*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_PIDFLT_NUM;
6439*53ee8cc1Swenshuai.xi             break;
6440*53ee8cc1Swenshuai.xi         case E_TSP_CAP_SECFLT_NUM:
6441*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_SECFLT_NUM;
6442*53ee8cc1Swenshuai.xi             break;
6443*53ee8cc1Swenshuai.xi         case E_TSP_CAP_SECBUF_NUM:
6444*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_SECBUF_NUM;
6445*53ee8cc1Swenshuai.xi             break;
6446*53ee8cc1Swenshuai.xi         case E_TSP_CAP_RECENG_NUM:
6447*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_RECENG_NUM;
6448*53ee8cc1Swenshuai.xi             break;
6449*53ee8cc1Swenshuai.xi         case E_TSP_CAP_RECFLT_NUM:
6450*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_RECFLT_NUM;
6451*53ee8cc1Swenshuai.xi             break;
6452*53ee8cc1Swenshuai.xi         case E_TSP_CAP_MMFI_AUDIO_FILTER_NUM:
6453*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_MMFI_AUDIO_FILTER_NUM;
6454*53ee8cc1Swenshuai.xi             break;
6455*53ee8cc1Swenshuai.xi         case E_TSP_CAP_MMFI_V3D_FILTER_NUM:
6456*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_MMFI_V3D_FILTER_NUM;
6457*53ee8cc1Swenshuai.xi             break;
6458*53ee8cc1Swenshuai.xi         case E_TSP_CAP_TSIF_NUM:
6459*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_TSIF_NUM;
6460*53ee8cc1Swenshuai.xi             break;
6461*53ee8cc1Swenshuai.xi         case E_TSP_CAP_DEMOD_NUM:
6462*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_DEMOD_NUM;
6463*53ee8cc1Swenshuai.xi             break;
6464*53ee8cc1Swenshuai.xi         case E_TSP_CAP_TSPAD_NUM:
6465*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_TSPAD_NUM;
6466*53ee8cc1Swenshuai.xi             break;
6467*53ee8cc1Swenshuai.xi         case E_TSP_CAP_VQ_NUM:
6468*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_VQ_NUM;
6469*53ee8cc1Swenshuai.xi             break;
6470*53ee8cc1Swenshuai.xi         case E_TSP_CAP_CAFLT_NUM:
6471*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_CAFLT_NUM;
6472*53ee8cc1Swenshuai.xi             break;
6473*53ee8cc1Swenshuai.xi         case E_TSP_CAP_FW_ALIGN:
6474*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_FW_ALIGN;
6475*53ee8cc1Swenshuai.xi             break;
6476*53ee8cc1Swenshuai.xi         case E_TSP_CAP_VQ_ALIGN:
6477*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_VQ_ALIGN;
6478*53ee8cc1Swenshuai.xi             break;
6479*53ee8cc1Swenshuai.xi         case E_TSP_CAP_VQ_PITCH:
6480*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_VQ_PITCH;
6481*53ee8cc1Swenshuai.xi             break;
6482*53ee8cc1Swenshuai.xi         case E_TSP_CAP_SECBUF_ALIGN:
6483*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_SECBUF_ALIGN;
6484*53ee8cc1Swenshuai.xi             break;
6485*53ee8cc1Swenshuai.xi         case E_TSP_CAP_PVR_ALIGN:
6486*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_PVR_ALIGN;
6487*53ee8cc1Swenshuai.xi             break;
6488*53ee8cc1Swenshuai.xi         case E_TSP_CAP_HW_TYPE:
6489*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_HW_TYPE;
6490*53ee8cc1Swenshuai.xi             break;
6491*53ee8cc1Swenshuai.xi         case E_TSP_CAP_VFIFO_NUM:
6492*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_VAL_VFIFO_NUM;
6493*53ee8cc1Swenshuai.xi             break;
6494*53ee8cc1Swenshuai.xi         case E_TSP_CAP_AFIFO_NUM:
6495*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_AFIFO_NUM;
6496*53ee8cc1Swenshuai.xi             break;
6497*53ee8cc1Swenshuai.xi         case E_TSP_CAP_HWPCR_SUPPORT:
6498*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_HWPCR_SUPPORT;
6499*53ee8cc1Swenshuai.xi             break;
6500*53ee8cc1Swenshuai.xi         case E_TSP_CAP_PCRFLT_START_IDX:
6501*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_PCRFLT_START_IDX;
6502*53ee8cc1Swenshuai.xi             break;
6503*53ee8cc1Swenshuai.xi         case E_TSP_CAP_FIQ_NUM:
6504*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_FIQ_NUM;
6505*53ee8cc1Swenshuai.xi             break;
6506*53ee8cc1Swenshuai.xi         case E_TSP_CAP_RECFLT_IDX:
6507*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_TYPE_RECFLT_IDX;
6508*53ee8cc1Swenshuai.xi             break;
6509*53ee8cc1Swenshuai.xi         case E_TSP_CAP_FW_BUF_SIZE:
6510*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_FW_BUF_SIZE;
6511*53ee8cc1Swenshuai.xi             break;
6512*53ee8cc1Swenshuai.xi         case E_TSP_CAP_FW_BUF_RANGE:
6513*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_FW_BUF_RANGE;
6514*53ee8cc1Swenshuai.xi             break;
6515*53ee8cc1Swenshuai.xi         case E_TSP_CAP_VQ_BUF_RANGE:
6516*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_VQ_BUF_RANGE;
6517*53ee8cc1Swenshuai.xi             break;
6518*53ee8cc1Swenshuai.xi         case E_TSP_CAP_SEC_BUF_RANGE:
6519*53ee8cc1Swenshuai.xi             eRetCapType = E_TSP_HAL_CAP_SEC_BUF_RANGE;
6520*53ee8cc1Swenshuai.xi             break;
6521*53ee8cc1Swenshuai.xi         default:
6522*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[%s][%d] Not support !!\n",__FUNCTION__,__LINE__);
6523*53ee8cc1Swenshuai.xi             break;
6524*53ee8cc1Swenshuai.xi     }
6525*53ee8cc1Swenshuai.xi 
6526*53ee8cc1Swenshuai.xi     return eRetCapType;
6527*53ee8cc1Swenshuai.xi }
6528*53ee8cc1Swenshuai.xi 
6529*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6530*53ee8cc1Swenshuai.xi /// Query CAPs and get it's information
6531*53ee8cc1Swenshuai.xi /// @return TSP_Result
6532*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_GetCaps(TSP_Caps eCap,MS_U32 * pu32CapInfo)6533*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetCaps(TSP_Caps eCap, MS_U32 *pu32CapInfo)
6534*53ee8cc1Swenshuai.xi {
6535*53ee8cc1Swenshuai.xi     TSP_HAL_CAP_TYPE _eCap;
6536*53ee8cc1Swenshuai.xi 
6537*53ee8cc1Swenshuai.xi     if (eCap >= E_TSP_CAP_NULL)
6538*53ee8cc1Swenshuai.xi     {
6539*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
6540*53ee8cc1Swenshuai.xi     }
6541*53ee8cc1Swenshuai.xi 
6542*53ee8cc1Swenshuai.xi     if(eCap == E_TSP_CAP_RESOURCE_SIZE)
6543*53ee8cc1Swenshuai.xi     {
6544*53ee8cc1Swenshuai.xi         *pu32CapInfo = sizeof(TSP_RESOURCE_PRIVATE);
6545*53ee8cc1Swenshuai.xi         return E_TSP_OK;
6546*53ee8cc1Swenshuai.xi     }
6547*53ee8cc1Swenshuai.xi 
6548*53ee8cc1Swenshuai.xi     _eCap = _TSP_DrvHal_CapsMapping(eCap);
6549*53ee8cc1Swenshuai.xi     if(_eCap == E_TSP_HAL_CAP_TYPE_NULL) //Not support
6550*53ee8cc1Swenshuai.xi     {
6551*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
6552*53ee8cc1Swenshuai.xi     }
6553*53ee8cc1Swenshuai.xi 
6554*53ee8cc1Swenshuai.xi     switch(_eCap)
6555*53ee8cc1Swenshuai.xi     {
6556*53ee8cc1Swenshuai.xi         case E_TSP_HAL_CAP_TYPE_PIDFLT_NUM:
6557*53ee8cc1Swenshuai.xi             *pu32CapInfo = (_tspFltIdMap.u32PcrFltId_End - _tspFltIdMap.u32PidFltId_Start);
6558*53ee8cc1Swenshuai.xi             return E_TSP_OK;
6559*53ee8cc1Swenshuai.xi         case E_TSP_HAL_CAP_TYPE_SECFLT_NUM:
6560*53ee8cc1Swenshuai.xi             *pu32CapInfo = (_tspFltIdMap.u32SecFltId_End - _tspFltIdMap.u32SecFltId_Start);
6561*53ee8cc1Swenshuai.xi             return E_TSP_OK;
6562*53ee8cc1Swenshuai.xi         case E_TSP_HAL_CAP_TYPE_SECBUF_NUM:
6563*53ee8cc1Swenshuai.xi             *pu32CapInfo = (_tspFltIdMap.u32SecBufId_End - _tspFltIdMap.u32SecBufId_Start);
6564*53ee8cc1Swenshuai.xi             return E_TSP_OK;
6565*53ee8cc1Swenshuai.xi         case E_TSP_HAL_CAP_TYPE_RECFLT_NUM:
6566*53ee8cc1Swenshuai.xi             *pu32CapInfo = _tspFltIdMap.u32PidFltId_End;
6567*53ee8cc1Swenshuai.xi             return E_TSP_OK;
6568*53ee8cc1Swenshuai.xi         case E_TSP_HAL_CAP_TYPE_CAFLT_NUM:
6569*53ee8cc1Swenshuai.xi             *pu32CapInfo = (_tspFltIdMap.u32PidFltId_End - _tspFltIdMap.u32PidFltId_Start);
6570*53ee8cc1Swenshuai.xi             return E_TSP_OK;
6571*53ee8cc1Swenshuai.xi         case E_TSP_HAL_CAP_TYPE_PCRFLT_START_IDX:
6572*53ee8cc1Swenshuai.xi             *pu32CapInfo = _tspFltIdMap.u32PcrFltId_Start;
6573*53ee8cc1Swenshuai.xi             return E_TSP_OK;
6574*53ee8cc1Swenshuai.xi         case E_TSP_HAL_CAP_TYPE_RECFLT_IDX:
6575*53ee8cc1Swenshuai.xi             *pu32CapInfo = _tspFltIdMap.u32RecFltIdx;
6576*53ee8cc1Swenshuai.xi             return E_TSP_OK;
6577*53ee8cc1Swenshuai.xi         default:
6578*53ee8cc1Swenshuai.xi             return (HAL_TSP_GetCaps(_eCap, pu32CapInfo) == FALSE)? E_TSP_FAIL : E_TSP_OK;
6579*53ee8cc1Swenshuai.xi     }
6580*53ee8cc1Swenshuai.xi 
6581*53ee8cc1Swenshuai.xi }
6582*53ee8cc1Swenshuai.xi 
MDrv_TSP_GetFileInTimeStamp(MS_U32 * u32TSLen)6583*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetFileInTimeStamp(MS_U32* u32TSLen)
6584*53ee8cc1Swenshuai.xi {
6585*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6586*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
6587*53ee8cc1Swenshuai.xi     *u32TSLen = HAL_TSP_Filein_PktTimeStamp(eFileEng);
6588*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6589*53ee8cc1Swenshuai.xi }
6590*53ee8cc1Swenshuai.xi 
6591*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6592*53ee8cc1Swenshuai.xi /// Get Last General Error Return Code
6593*53ee8cc1Swenshuai.xi /// @return TSP_Result
6594*53ee8cc1Swenshuai.xi /// @note
6595*53ee8cc1Swenshuai.xi /// Last error return code is reset after calling this function.
6596*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_GetLastErr(void)6597*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetLastErr(void)
6598*53ee8cc1Swenshuai.xi {
6599*53ee8cc1Swenshuai.xi     TSP_Result ret;
6600*53ee8cc1Swenshuai.xi     ret = (TSP_Result) _ptsp_res->_tspInfo.LastErr;
6601*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.LastErr = E_TSP_OK;
6602*53ee8cc1Swenshuai.xi     return ret;
6603*53ee8cc1Swenshuai.xi }
6604*53ee8cc1Swenshuai.xi 
MDRV_TSP_FAIL_NOT_SUPPORTED(void)6605*53ee8cc1Swenshuai.xi TSP_Result MDRV_TSP_FAIL_NOT_SUPPORTED(void)
6606*53ee8cc1Swenshuai.xi {
6607*53ee8cc1Swenshuai.xi     return E_TSP_FAIL_NOT_SUPPORTED;
6608*53ee8cc1Swenshuai.xi }
6609*53ee8cc1Swenshuai.xi 
6610*53ee8cc1Swenshuai.xi 
6611*53ee8cc1Swenshuai.xi //[RESERVED]
MDrv_TSP_Alive(MS_U32 u32EngId)6612*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Alive(MS_U32 u32EngId)
6613*53ee8cc1Swenshuai.xi {
6614*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6615*53ee8cc1Swenshuai.xi     if (HAL_TSP_HCMD_Alive())
6616*53ee8cc1Swenshuai.xi     {
6617*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_OK);
6618*53ee8cc1Swenshuai.xi     }
6619*53ee8cc1Swenshuai.xi     else
6620*53ee8cc1Swenshuai.xi     {
6621*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL);
6622*53ee8cc1Swenshuai.xi     }
6623*53ee8cc1Swenshuai.xi }
6624*53ee8cc1Swenshuai.xi 
6625*53ee8cc1Swenshuai.xi 
6626*53ee8cc1Swenshuai.xi //[RESERVED]
MDrv_TSP_DBG_GetDBGStatus(MS_U32 u32Sel,MS_U32 * u32Status)6627*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_DBG_GetDBGStatus(MS_U32 u32Sel, MS_U32* u32Status)
6628*53ee8cc1Swenshuai.xi {
6629*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6630*53ee8cc1Swenshuai.xi 
6631*53ee8cc1Swenshuai.xi    // *u32Status = HAL_TSP_GetDBGStatus((MS_U16)u32Sel);//@F_TODO not implement yet
6632*53ee8cc1Swenshuai.xi 
6633*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6634*53ee8cc1Swenshuai.xi }
6635*53ee8cc1Swenshuai.xi 
6636*53ee8cc1Swenshuai.xi 
6637*53ee8cc1Swenshuai.xi //[RESERVED]
MDrv_TSP_DBG_TaskLine(void)6638*53ee8cc1Swenshuai.xi MS_U32 MDrv_TSP_DBG_TaskLine(void)
6639*53ee8cc1Swenshuai.xi {
6640*53ee8cc1Swenshuai.xi     return _ptsp_res->_tspInfo.u32TaskLine;
6641*53ee8cc1Swenshuai.xi }
6642*53ee8cc1Swenshuai.xi 
6643*53ee8cc1Swenshuai.xi 
6644*53ee8cc1Swenshuai.xi //[RESERVED]
MDrv_TSP_DBG_FltInfo(MS_U32 u32FltId,MS_U32 u32BufId)6645*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_DBG_FltInfo(MS_U32 u32FltId, MS_U32 u32BufId)
6646*53ee8cc1Swenshuai.xi {
6647*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6648*53ee8cc1Swenshuai.xi 
6649*53ee8cc1Swenshuai.xi  //   HAL_TSP_DBG_DumpFlt((MS_U16)u32FltId, (MS_U16)u32BufId); //@F_TODO not implement yet
6650*53ee8cc1Swenshuai.xi 
6651*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6652*53ee8cc1Swenshuai.xi }
6653*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_FltAlloc(MS_U32 u32Eng,MS_U32 * pu32FltId)6654*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_FltAlloc(MS_U32 u32Eng, MS_U32 *pu32FltId)
6655*53ee8cc1Swenshuai.xi {
6656*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
6657*53ee8cc1Swenshuai.xi     MS_U32 ret = E_TSP_FAIL;
6658*53ee8cc1Swenshuai.xi 
6659*53ee8cc1Swenshuai.xi     TSP_SRC_SEQ eEngSrc = E_TSP_SRC_INVALID;
6660*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
6661*53ee8cc1Swenshuai.xi     {
6662*53ee8cc1Swenshuai.xi         HAL_PVR_GetEngSrc(u32Eng, &eEngSrc);
6663*53ee8cc1Swenshuai.xi         ret = _MDrv_FltAllocForRec(u32Eng, eEngSrc, pu32FltId);
6664*53ee8cc1Swenshuai.xi     }
6665*53ee8cc1Swenshuai.xi     else
6666*53ee8cc1Swenshuai.xi     {
6667*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
6668*53ee8cc1Swenshuai.xi     }
6669*53ee8cc1Swenshuai.xi 
6670*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(ret);
6671*53ee8cc1Swenshuai.xi }
6672*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_FltFree(MS_U32 u32Eng,MS_U32 u32FltId)6673*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_FltFree(MS_U32 u32Eng, MS_U32 u32FltId)
6674*53ee8cc1Swenshuai.xi {
6675*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
6676*53ee8cc1Swenshuai.xi     {
6677*53ee8cc1Swenshuai.xi         _MDrv_FltFreeForRec(u32FltId);
6678*53ee8cc1Swenshuai.xi     }
6679*53ee8cc1Swenshuai.xi     else
6680*53ee8cc1Swenshuai.xi     {
6681*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
6682*53ee8cc1Swenshuai.xi     }
6683*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6684*53ee8cc1Swenshuai.xi }
6685*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_FltSetPID(MS_U32 u32Eng,MS_U32 u32FltId,MS_U32 u32PID)6686*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_FltSetPID(MS_U32 u32Eng, MS_U32 u32FltId, MS_U32 u32PID)
6687*53ee8cc1Swenshuai.xi {
6688*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
6689*53ee8cc1Swenshuai.xi     {
6690*53ee8cc1Swenshuai.xi         _MDrv_FltSetPIDForRec(u32FltId, u32PID);
6691*53ee8cc1Swenshuai.xi     }
6692*53ee8cc1Swenshuai.xi     else
6693*53ee8cc1Swenshuai.xi     {
6694*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
6695*53ee8cc1Swenshuai.xi     }
6696*53ee8cc1Swenshuai.xi 
6697*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6698*53ee8cc1Swenshuai.xi }
6699*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_FltEnable(MS_U32 u32Eng,MS_U32 u32FltId,MS_BOOL bEnable)6700*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_FltEnable(MS_U32 u32Eng, MS_U32 u32FltId, MS_BOOL bEnable)
6701*53ee8cc1Swenshuai.xi {
6702*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
6703*53ee8cc1Swenshuai.xi     {
6704*53ee8cc1Swenshuai.xi         _MDrv_FltEnableForRec(u32FltId, bEnable);
6705*53ee8cc1Swenshuai.xi     }
6706*53ee8cc1Swenshuai.xi     else
6707*53ee8cc1Swenshuai.xi     {
6708*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
6709*53ee8cc1Swenshuai.xi     }
6710*53ee8cc1Swenshuai.xi 
6711*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6712*53ee8cc1Swenshuai.xi }
6713*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_FltGetPID(MS_U32 u32Eng,MS_U32 u32FltId,MS_U32 * u32PID)6714*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_FltGetPID(MS_U32 u32Eng, MS_U32 u32FltId, MS_U32* u32PID)
6715*53ee8cc1Swenshuai.xi {
6716*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
6717*53ee8cc1Swenshuai.xi     {
6718*53ee8cc1Swenshuai.xi         _MDrv_FltGetPIDForRec(u32FltId, u32PID);
6719*53ee8cc1Swenshuai.xi     }
6720*53ee8cc1Swenshuai.xi     else
6721*53ee8cc1Swenshuai.xi     {
6722*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
6723*53ee8cc1Swenshuai.xi     }
6724*53ee8cc1Swenshuai.xi 
6725*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6726*53ee8cc1Swenshuai.xi }
6727*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_SetBuffer(MS_U32 u32Eng,MS_PHYADDR u32Start0,MS_PHYADDR u32Start1,MS_U32 u32Size0,MS_U32 u32Size1)6728*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_SetBuffer(MS_U32 u32Eng, MS_PHYADDR u32Start0, MS_PHYADDR u32Start1, MS_U32 u32Size0, MS_U32 u32Size1)
6729*53ee8cc1Swenshuai.xi {
6730*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
6731*53ee8cc1Swenshuai.xi     {
6732*53ee8cc1Swenshuai.xi         _MDrv_PVR_Eng_SetBuffer(u32Eng, u32Start0, u32Start1, u32Size0, u32Size1);
6733*53ee8cc1Swenshuai.xi     }
6734*53ee8cc1Swenshuai.xi     else
6735*53ee8cc1Swenshuai.xi     {
6736*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
6737*53ee8cc1Swenshuai.xi     }
6738*53ee8cc1Swenshuai.xi 
6739*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6740*53ee8cc1Swenshuai.xi }
6741*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_Start(MS_U32 u32Eng,MS_BOOL bPvrAll,MS_BOOL bStart)6742*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_Start(MS_U32 u32Eng, MS_BOOL bPvrAll, MS_BOOL bStart)
6743*53ee8cc1Swenshuai.xi {
6744*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
6745*53ee8cc1Swenshuai.xi     {
6746*53ee8cc1Swenshuai.xi         if(bPvrAll)
6747*53ee8cc1Swenshuai.xi             _MDrv_PVR_Eng_Start(u32Eng, E_TSP_DRV_PVR_RecMode_ALL, bStart);
6748*53ee8cc1Swenshuai.xi         else
6749*53ee8cc1Swenshuai.xi             _MDrv_PVR_Eng_Start(u32Eng, E_TSP_DRV_PVR_RecMode_PID, bStart);
6750*53ee8cc1Swenshuai.xi     }
6751*53ee8cc1Swenshuai.xi     else
6752*53ee8cc1Swenshuai.xi     {
6753*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
6754*53ee8cc1Swenshuai.xi     }
6755*53ee8cc1Swenshuai.xi 
6756*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6757*53ee8cc1Swenshuai.xi }
6758*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_Pause(MS_U32 u32Eng,MS_BOOL bPause)6759*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_Pause(MS_U32 u32Eng, MS_BOOL bPause)
6760*53ee8cc1Swenshuai.xi {
6761*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
6762*53ee8cc1Swenshuai.xi     {
6763*53ee8cc1Swenshuai.xi         _MDrv_PVR_Eng_Pause(u32Eng, bPause);
6764*53ee8cc1Swenshuai.xi     }
6765*53ee8cc1Swenshuai.xi     else
6766*53ee8cc1Swenshuai.xi     {
6767*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
6768*53ee8cc1Swenshuai.xi     }
6769*53ee8cc1Swenshuai.xi 
6770*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6771*53ee8cc1Swenshuai.xi }
6772*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_GetWriteAddr(MS_U32 u32Eng,MS_PHY * pu32WriteAddr)6773*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_GetWriteAddr(MS_U32 u32Eng, MS_PHY *pu32WriteAddr)
6774*53ee8cc1Swenshuai.xi {
6775*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
6776*53ee8cc1Swenshuai.xi     {
6777*53ee8cc1Swenshuai.xi         _MDrv_PVR_Eng_GetWriteAddr(u32Eng, pu32WriteAddr);
6778*53ee8cc1Swenshuai.xi     }
6779*53ee8cc1Swenshuai.xi     else
6780*53ee8cc1Swenshuai.xi     {
6781*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
6782*53ee8cc1Swenshuai.xi     }
6783*53ee8cc1Swenshuai.xi 
6784*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6785*53ee8cc1Swenshuai.xi }
6786*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_Notify(MS_U32 u32Eng,TSP_Event eEvents,P_TSP_Callback pfCallback)6787*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_Notify(MS_U32 u32Eng, TSP_Event eEvents, P_TSP_Callback pfCallback)
6788*53ee8cc1Swenshuai.xi {
6789*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
6790*53ee8cc1Swenshuai.xi     {
6791*53ee8cc1Swenshuai.xi         _MDrv_PVR_Eng_Notify(u32Eng, eEvents, pfCallback);
6792*53ee8cc1Swenshuai.xi     }
6793*53ee8cc1Swenshuai.xi     else
6794*53ee8cc1Swenshuai.xi     {
6795*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
6796*53ee8cc1Swenshuai.xi     }
6797*53ee8cc1Swenshuai.xi 
6798*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6799*53ee8cc1Swenshuai.xi }
6800*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_SetPacketMode(MS_U32 u32Eng,MS_BOOL bSet)6801*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_SetPacketMode(MS_U32 u32Eng, MS_BOOL bSet)
6802*53ee8cc1Swenshuai.xi {
6803*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
6804*53ee8cc1Swenshuai.xi     {
6805*53ee8cc1Swenshuai.xi         _MDrv_PVR_Eng_SetPacketMode(u32Eng, bSet);
6806*53ee8cc1Swenshuai.xi     }
6807*53ee8cc1Swenshuai.xi     else
6808*53ee8cc1Swenshuai.xi     {
6809*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
6810*53ee8cc1Swenshuai.xi     }
6811*53ee8cc1Swenshuai.xi 
6812*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6813*53ee8cc1Swenshuai.xi }
6814*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_TimeStampSetRecordStamp(MS_U32 u32Eng,MS_U32 u32Stamp)6815*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_TimeStampSetRecordStamp(MS_U32 u32Eng, MS_U32 u32Stamp)
6816*53ee8cc1Swenshuai.xi {
6817*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
6818*53ee8cc1Swenshuai.xi     {
6819*53ee8cc1Swenshuai.xi         _MDrv_PVR_Eng_TimeStampSetRecordStamp(u32Eng, u32Stamp);
6820*53ee8cc1Swenshuai.xi     }
6821*53ee8cc1Swenshuai.xi     else
6822*53ee8cc1Swenshuai.xi     {
6823*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
6824*53ee8cc1Swenshuai.xi     }
6825*53ee8cc1Swenshuai.xi 
6826*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6827*53ee8cc1Swenshuai.xi }
6828*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_TimeStampGetRecordStamp(MS_U32 u32Eng,MS_U32 * u32Stamp)6829*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_TimeStampGetRecordStamp(MS_U32 u32Eng, MS_U32* u32Stamp)
6830*53ee8cc1Swenshuai.xi {
6831*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
6832*53ee8cc1Swenshuai.xi     {
6833*53ee8cc1Swenshuai.xi         _MDrv_PVR_Eng_TimeStampGetRecordStamp(u32Eng, u32Stamp);
6834*53ee8cc1Swenshuai.xi     }
6835*53ee8cc1Swenshuai.xi     else
6836*53ee8cc1Swenshuai.xi     {
6837*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
6838*53ee8cc1Swenshuai.xi     }
6839*53ee8cc1Swenshuai.xi 
6840*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6841*53ee8cc1Swenshuai.xi }
6842*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_SetCaMode(MS_U32 u32EngId,MS_U16 u16CaMode,MS_BOOL bSpsEnable)6843*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_SetCaMode(MS_U32 u32EngId, MS_U16 u16CaMode, MS_BOOL bSpsEnable)
6844*53ee8cc1Swenshuai.xi {
6845*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6846*53ee8cc1Swenshuai.xi 
6847*53ee8cc1Swenshuai.xi     if(HAL_TSP_CAPVR_SPSEnable(u32EngId, u16CaMode, bSpsEnable))
6848*53ee8cc1Swenshuai.xi     {
6849*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_OK);
6850*53ee8cc1Swenshuai.xi     }
6851*53ee8cc1Swenshuai.xi     else
6852*53ee8cc1Swenshuai.xi     {
6853*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_OK);
6854*53ee8cc1Swenshuai.xi     }
6855*53ee8cc1Swenshuai.xi }
6856*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_Eng_MOBF_Enable(MS_U32 u32Eng,MS_BOOL bEnable,MS_U32 u32Key)6857*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_MOBF_Enable(MS_U32 u32Eng, MS_BOOL bEnable, MS_U32 u32Key)
6858*53ee8cc1Swenshuai.xi {
6859*53ee8cc1Swenshuai.xi     TSP_ENTRY();
6860*53ee8cc1Swenshuai.xi 
6861*53ee8cc1Swenshuai.xi     if (E_TSP_PVR_PVRENG_END > u32Eng) // PVR Eng
6862*53ee8cc1Swenshuai.xi     {
6863*53ee8cc1Swenshuai.xi         HAL_PVR_MOBF_Enable(u32Eng, bEnable, u32Key);
6864*53ee8cc1Swenshuai.xi     }
6865*53ee8cc1Swenshuai.xi     else
6866*53ee8cc1Swenshuai.xi     {
6867*53ee8cc1Swenshuai.xi         TSP_DBG(E_TSP_DBG_MUST, "[ERROR][%s][%d]Incorrect Engine type!\n",__FUNCTION__,__LINE__);
6868*53ee8cc1Swenshuai.xi     }
6869*53ee8cc1Swenshuai.xi 
6870*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
6871*53ee8cc1Swenshuai.xi }
6872*53ee8cc1Swenshuai.xi 
_MDrv_FltAllocForRec(MS_U32 u32Eng,TSP_SRC_SEQ eEngSrc,MS_U32 * pu32FltId)6873*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_FltAllocForRec(MS_U32 u32Eng, TSP_SRC_SEQ eEngSrc, MS_U32 *pu32FltId)
6874*53ee8cc1Swenshuai.xi {
6875*53ee8cc1Swenshuai.xi     TSP_PIDFLT_SRC ePidFltSrc = HAL_TSP_PktDmx2FltSrc_Mapping(eEngSrc);
6876*53ee8cc1Swenshuai.xi     TSP_FltType eTspFltSrcType = E_TSP_FLT_SRC_LIVE0;
6877*53ee8cc1Swenshuai.xi     TSP_FltType eTspFltDstType = E_TSP_FLT_FIFO_PVR0;
6878*53ee8cc1Swenshuai.xi 
6879*53ee8cc1Swenshuai.xi     switch (ePidFltSrc)
6880*53ee8cc1Swenshuai.xi     {
6881*53ee8cc1Swenshuai.xi         case E_TSP_PIDFLT_LIVE0:
6882*53ee8cc1Swenshuai.xi             eTspFltSrcType = E_TSP_FLT_SRC_LIVE0;
6883*53ee8cc1Swenshuai.xi             break;
6884*53ee8cc1Swenshuai.xi         case E_TSP_PIDFLT_LIVE1:
6885*53ee8cc1Swenshuai.xi             eTspFltSrcType = E_TSP_FLT_SRC_LIVE1;
6886*53ee8cc1Swenshuai.xi             break;
6887*53ee8cc1Swenshuai.xi         case E_TSP_PIDFLT_LIVE2:
6888*53ee8cc1Swenshuai.xi             eTspFltSrcType = E_TSP_FLT_SRC_LIVE2;
6889*53ee8cc1Swenshuai.xi             break;
6890*53ee8cc1Swenshuai.xi         case E_TSP_PIDFLT_LIVE3:
6891*53ee8cc1Swenshuai.xi             eTspFltSrcType = E_TSP_FLT_SRC_LIVE3;
6892*53ee8cc1Swenshuai.xi             break;
6893*53ee8cc1Swenshuai.xi         case E_TSP_PIDFLT_FILE0:
6894*53ee8cc1Swenshuai.xi             eTspFltSrcType = E_TSP_FLT_SRC_FILE0;
6895*53ee8cc1Swenshuai.xi             break;
6896*53ee8cc1Swenshuai.xi         case E_TSP_PIDFLT_FILE1:
6897*53ee8cc1Swenshuai.xi             eTspFltSrcType = E_TSP_FLT_SRC_FILE1;
6898*53ee8cc1Swenshuai.xi             break;
6899*53ee8cc1Swenshuai.xi         case E_TSP_PIDFLT_FILE2:
6900*53ee8cc1Swenshuai.xi             eTspFltSrcType = E_TSP_FLT_SRC_FILE2;
6901*53ee8cc1Swenshuai.xi             break;
6902*53ee8cc1Swenshuai.xi         case E_TSP_PIDFLT_FILE3:
6903*53ee8cc1Swenshuai.xi             eTspFltSrcType = E_TSP_FLT_SRC_FILE3;
6904*53ee8cc1Swenshuai.xi             break;
6905*53ee8cc1Swenshuai.xi         case E_TSP_PIDFLT_LIVE4:
6906*53ee8cc1Swenshuai.xi         case E_TSP_PIDFLT_FILE4:
6907*53ee8cc1Swenshuai.xi             eTspFltSrcType = E_TSP_FLT_SRC_LIVE4;
6908*53ee8cc1Swenshuai.xi             break;
6909*53ee8cc1Swenshuai.xi         case E_TSP_PIDFLT_LIVE5:
6910*53ee8cc1Swenshuai.xi         case E_TSP_PIDFLT_FILE5:
6911*53ee8cc1Swenshuai.xi             eTspFltSrcType = E_TSP_FLT_SRC_LIVE5;
6912*53ee8cc1Swenshuai.xi             break;
6913*53ee8cc1Swenshuai.xi         case E_TSP_PIDFLT_LIVE6:
6914*53ee8cc1Swenshuai.xi         case E_TSP_PIDFLT_FILE6:
6915*53ee8cc1Swenshuai.xi             eTspFltSrcType = E_TSP_FLT_SRC_LIVE6;
6916*53ee8cc1Swenshuai.xi             break;
6917*53ee8cc1Swenshuai.xi         default:
6918*53ee8cc1Swenshuai.xi             break;
6919*53ee8cc1Swenshuai.xi     }
6920*53ee8cc1Swenshuai.xi 
6921*53ee8cc1Swenshuai.xi     if(u32Eng < TSP_PVRENG_NUM)
6922*53ee8cc1Swenshuai.xi     {
6923*53ee8cc1Swenshuai.xi         eTspFltDstType = E_TSP_FLT_FIFO_PVR0 + u32Eng;
6924*53ee8cc1Swenshuai.xi     }
6925*53ee8cc1Swenshuai.xi 
6926*53ee8cc1Swenshuai.xi     if (E_TSP_OK != MDrv_TSP_FLT_Alloc(0, (eTspFltSrcType | eTspFltDstType), pu32FltId))
6927*53ee8cc1Swenshuai.xi     {
6928*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
6929*53ee8cc1Swenshuai.xi     }
6930*53ee8cc1Swenshuai.xi 
6931*53ee8cc1Swenshuai.xi     return E_TSP_OK;
6932*53ee8cc1Swenshuai.xi }
6933*53ee8cc1Swenshuai.xi 
_MDrv_FltFreeForRec(MS_U32 u32FltId)6934*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_FltFreeForRec(MS_U32 u32FltId)
6935*53ee8cc1Swenshuai.xi {
6936*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
6937*53ee8cc1Swenshuai.xi 
6938*53ee8cc1Swenshuai.xi     //@NOTE shouldn't we modify sw flt status here? No, since it's maitain in fle_enable and flt_free
6939*53ee8cc1Swenshuai.xi     MDrv_TSP_FLT_Enable( u32FltId, FALSE);
6940*53ee8cc1Swenshuai.xi     MDrv_TSP_FLT_SetPID( u32FltId, TSP_PID_NULL);
6941*53ee8cc1Swenshuai.xi     MDrv_TSP_FLT_Free( u32FltId);
6942*53ee8cc1Swenshuai.xi 
6943*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(E_TSP_OK);
6944*53ee8cc1Swenshuai.xi }
6945*53ee8cc1Swenshuai.xi 
_MDrv_FltSetPIDForRec(MS_U32 u32FltId,MS_U32 u32PID)6946*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_FltSetPIDForRec(MS_U32 u32FltId, MS_U32 u32PID)
6947*53ee8cc1Swenshuai.xi {
6948*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
6949*53ee8cc1Swenshuai.xi     MDrv_TSP_FLT_SetPID( u32FltId, u32PID);
6950*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(E_TSP_OK);
6951*53ee8cc1Swenshuai.xi }
6952*53ee8cc1Swenshuai.xi 
_MDrv_FltGetPIDForRec(MS_U32 u32FltId,MS_U32 * pu32PID)6953*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_FltGetPIDForRec(MS_U32 u32FltId, MS_U32* pu32PID)
6954*53ee8cc1Swenshuai.xi {
6955*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
6956*53ee8cc1Swenshuai.xi     MDrv_TSP_FLT_GetPID(u32FltId, pu32PID);
6957*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(E_TSP_OK);
6958*53ee8cc1Swenshuai.xi }
6959*53ee8cc1Swenshuai.xi 
_MDrv_FltEnableForRec(MS_U32 u32FltId,MS_BOOL bEnable)6960*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_FltEnableForRec(MS_U32 u32FltId, MS_BOOL bEnable)
6961*53ee8cc1Swenshuai.xi {
6962*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
6963*53ee8cc1Swenshuai.xi     MDrv_TSP_FLT_Enable( u32FltId, bEnable);
6964*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(E_TSP_OK);
6965*53ee8cc1Swenshuai.xi }
6966*53ee8cc1Swenshuai.xi 
_MDrv_PVR_Eng_SetBuffer(MS_U32 u32Eng,MS_PHYADDR u32Start0,MS_PHYADDR u32Start1,MS_U32 u32Size0,MS_U32 u32Size1)6967*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_SetBuffer(MS_U32 u32Eng, MS_PHYADDR u32Start0, MS_PHYADDR u32Start1, MS_U32 u32Size0, MS_U32 u32Size1)
6968*53ee8cc1Swenshuai.xi {
6969*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
6970*53ee8cc1Swenshuai.xi     HAL_PVR_SetStr2Miu_StartAddr(u32Eng, u32Start0, u32Start1);
6971*53ee8cc1Swenshuai.xi     HAL_PVR_SetStr2Miu_MidAddr(u32Eng, u32Start0 + u32Size0 , u32Start1 + u32Size1 );
6972*53ee8cc1Swenshuai.xi     HAL_PVR_SetStr2Miu_EndAddr(u32Eng, u32Start0 + u32Size0 , u32Start1 + u32Size1 );
6973*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(E_TSP_OK);
6974*53ee8cc1Swenshuai.xi }
6975*53ee8cc1Swenshuai.xi 
_MDrv_PVR_Eng_Start(MS_U32 u32Eng,TSP_DRV_PVR_RecMode eRecMode,MS_BOOL bStart)6976*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_Start(MS_U32 u32Eng, TSP_DRV_PVR_RecMode eRecMode, MS_BOOL bStart)
6977*53ee8cc1Swenshuai.xi {
6978*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
6979*53ee8cc1Swenshuai.xi 
6980*53ee8cc1Swenshuai.xi     if (!bStart)
6981*53ee8cc1Swenshuai.xi     {
6982*53ee8cc1Swenshuai.xi         HAL_PVR_Stop(u32Eng);
6983*53ee8cc1Swenshuai.xi     }
6984*53ee8cc1Swenshuai.xi     else
6985*53ee8cc1Swenshuai.xi     {
6986*53ee8cc1Swenshuai.xi         switch (eRecMode)
6987*53ee8cc1Swenshuai.xi         {
6988*53ee8cc1Swenshuai.xi             case E_TSP_DRV_PVR_RecMode_PID:
6989*53ee8cc1Swenshuai.xi             {
6990*53ee8cc1Swenshuai.xi                 HAL_PVR_RecPid(u32Eng , TRUE);
6991*53ee8cc1Swenshuai.xi                 break;
6992*53ee8cc1Swenshuai.xi             }
6993*53ee8cc1Swenshuai.xi             case E_TSP_DRV_PVR_RecMode_ALL:
6994*53ee8cc1Swenshuai.xi             {
6995*53ee8cc1Swenshuai.xi                 HAL_PVR_RecPid(u32Eng , FALSE);
6996*53ee8cc1Swenshuai.xi                 break;
6997*53ee8cc1Swenshuai.xi             }
6998*53ee8cc1Swenshuai.xi             default :
6999*53ee8cc1Swenshuai.xi                 break;
7000*53ee8cc1Swenshuai.xi         }
7001*53ee8cc1Swenshuai.xi         HAL_PVR_Start(u32Eng);
7002*53ee8cc1Swenshuai.xi     }
7003*53ee8cc1Swenshuai.xi 
7004*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(E_TSP_OK);
7005*53ee8cc1Swenshuai.xi }
7006*53ee8cc1Swenshuai.xi 
_MDrv_PVR_Eng_Pause(MS_U32 u32Eng,MS_BOOL bPause)7007*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_Pause(MS_U32 u32Eng, MS_BOOL bPause)
7008*53ee8cc1Swenshuai.xi {
7009*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
7010*53ee8cc1Swenshuai.xi     HAL_PVR_Pause(u32Eng, bPause);
7011*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(E_TSP_OK);
7012*53ee8cc1Swenshuai.xi }
7013*53ee8cc1Swenshuai.xi 
_MDrv_PVR_Eng_GetWriteAddr(MS_U32 u32Eng,MS_PHY * pu32WriteAddr)7014*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_GetWriteAddr(MS_U32 u32Eng, MS_PHY *pu32WriteAddr)
7015*53ee8cc1Swenshuai.xi {
7016*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
7017*53ee8cc1Swenshuai.xi     *pu32WriteAddr = HAL_PVR_GetWritePtr(u32Eng);
7018*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(E_TSP_OK);
7019*53ee8cc1Swenshuai.xi }
7020*53ee8cc1Swenshuai.xi 
_MDrv_PVR_Eng_Notify(MS_U32 u32Eng,TSP_Event eEvents,P_TSP_Callback pfCallback)7021*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_Notify(MS_U32 u32Eng, TSP_Event eEvents, P_TSP_Callback pfCallback)
7022*53ee8cc1Swenshuai.xi {
7023*53ee8cc1Swenshuai.xi     #if 0
7024*53ee8cc1Swenshuai.xi     if(pfCallback)
7025*53ee8cc1Swenshuai.xi     {
7026*53ee8cc1Swenshuai.xi         _TSP_SetPvrNotifyId(u32Eng);
7027*53ee8cc1Swenshuai.xi     }
7028*53ee8cc1Swenshuai.xi     else
7029*53ee8cc1Swenshuai.xi     {
7030*53ee8cc1Swenshuai.xi         _TSP_RemovePvrNotifyId;
7031*53ee8cc1Swenshuai.xi     }
7032*53ee8cc1Swenshuai.xi     #endif
7033*53ee8cc1Swenshuai.xi 
7034*53ee8cc1Swenshuai.xi     return E_TSP_FAIL_NOT_SUPPORTED;
7035*53ee8cc1Swenshuai.xi }
7036*53ee8cc1Swenshuai.xi 
_MDrv_PVR_Eng_SetPacketMode(MS_U32 u32Eng,MS_BOOL bSet)7037*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_SetPacketMode(MS_U32 u32Eng, MS_BOOL bSet)
7038*53ee8cc1Swenshuai.xi {
7039*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
7040*53ee8cc1Swenshuai.xi     HAL_PVR_SetStrPacketMode(u32Eng, bSet);
7041*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(E_TSP_OK);
7042*53ee8cc1Swenshuai.xi }
7043*53ee8cc1Swenshuai.xi 
_MDrv_PVR_Eng_TimeStampSetRecordStamp(MS_U32 u32Eng,MS_U32 u32Stamp)7044*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_TimeStampSetRecordStamp(MS_U32 u32Eng, MS_U32 u32Stamp)
7045*53ee8cc1Swenshuai.xi {
7046*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
7047*53ee8cc1Swenshuai.xi     HAL_PVR_SetPVRTimeStamp(u32Eng, u32Stamp);
7048*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(E_TSP_OK);
7049*53ee8cc1Swenshuai.xi }
7050*53ee8cc1Swenshuai.xi 
_MDrv_PVR_Eng_TimeStampGetRecordStamp(MS_U32 u32Eng,MS_U32 * u32Stamp)7051*53ee8cc1Swenshuai.xi static TSP_Result _MDrv_PVR_Eng_TimeStampGetRecordStamp(MS_U32 u32Eng, MS_U32* u32Stamp)
7052*53ee8cc1Swenshuai.xi {
7053*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
7054*53ee8cc1Swenshuai.xi     *u32Stamp = HAL_PVR_GetPVRTimeStamp(u32Eng);
7055*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(E_TSP_OK);
7056*53ee8cc1Swenshuai.xi }
7057*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_TimeStampSetPlaybackStamp(MS_U32 u32Stamp)7058*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_TimeStampSetPlaybackStamp(MS_U32 u32Stamp)
7059*53ee8cc1Swenshuai.xi {
7060*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
7061*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
7062*53ee8cc1Swenshuai.xi     HAL_TSP_Filein_SetTimeStamp(eFileEng, u32Stamp);
7063*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(E_TSP_OK);
7064*53ee8cc1Swenshuai.xi }
7065*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_TimeStampGetPlaybackStamp(MS_U32 * u32Stamp)7066*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_TimeStampGetPlaybackStamp(MS_U32* u32Stamp)
7067*53ee8cc1Swenshuai.xi {
7068*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
7069*53ee8cc1Swenshuai.xi     FILEENG_SEQ eFileEng = HAL_TSP_GetDefaultFileinEng();
7070*53ee8cc1Swenshuai.xi     *u32Stamp = HAL_TSP_Filein_GetTimeStamp(eFileEng);
7071*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(E_TSP_OK);
7072*53ee8cc1Swenshuai.xi }
7073*53ee8cc1Swenshuai.xi 
MDrv_TSP_PVR_TimeStamp(MS_BOOL bEnable)7074*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_TimeStamp(MS_BOOL bEnable)
7075*53ee8cc1Swenshuai.xi {
7076*53ee8cc1Swenshuai.xi     TSP_PVR_ENTRY();
7077*53ee8cc1Swenshuai.xi     HAL_PVR_SetStrPacketMode(0,bEnable);
7078*53ee8cc1Swenshuai.xi     TSP_PVR_RETURN(E_TSP_OK);
7079*53ee8cc1Swenshuai.xi }
7080*53ee8cc1Swenshuai.xi 
7081*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7082*53ee8cc1Swenshuai.xi /// Enable remove duplicate A/V packets
7083*53ee8cc1Swenshuai.xi /// @param  bEnable                \b IN: Enable or Disable
7084*53ee8cc1Swenshuai.xi /// @return TSP_Result
7085*53ee8cc1Swenshuai.xi /// @note
7086*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_RemoveDupAVPkt(MS_BOOL bEnable)7087*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_RemoveDupAVPkt(MS_BOOL bEnable)
7088*53ee8cc1Swenshuai.xi {
7089*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7090*53ee8cc1Swenshuai.xi     HAL_TSP_PktDmx_RmDupAVPkt(bEnable);
7091*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
7092*53ee8cc1Swenshuai.xi }
7093*53ee8cc1Swenshuai.xi 
7094*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7095*53ee8cc1Swenshuai.xi /// Enable or Disable to remove audio,or vedio error packets.
7096*53ee8cc1Swenshuai.xi /// @param  bEnable                \b IN: Enable or Disable
7097*53ee8cc1Swenshuai.xi /// @return TSP_Result
7098*53ee8cc1Swenshuai.xi /// @note
7099*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_TEI_RemoveErrorPkt(TSP_DRV_TEI_RmPktType eDrvPktType,MS_BOOL bEnable)7100*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_TEI_RemoveErrorPkt(TSP_DRV_TEI_RmPktType eDrvPktType, MS_BOOL bEnable)
7101*53ee8cc1Swenshuai.xi {
7102*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7103*53ee8cc1Swenshuai.xi 
7104*53ee8cc1Swenshuai.xi     TSP_HAL_TEI_RmPktType eHalPktType = E_TSP_HAL_TEI_REMOVE_AUDIO_PKT;
7105*53ee8cc1Swenshuai.xi 
7106*53ee8cc1Swenshuai.xi     switch ( eDrvPktType )
7107*53ee8cc1Swenshuai.xi     {
7108*53ee8cc1Swenshuai.xi         case E_TSP_DRV_TEI_REMOVE_AUDIO_PKT:
7109*53ee8cc1Swenshuai.xi             eHalPktType = E_TSP_HAL_TEI_REMOVE_AUDIO_PKT;
7110*53ee8cc1Swenshuai.xi             break;
7111*53ee8cc1Swenshuai.xi         case E_TSP_DRV_TEI_REMOVE_VIDEO_PKT:
7112*53ee8cc1Swenshuai.xi             eHalPktType = E_TSP_HAL_TEI_REMOVE_VIDEO_PKT;
7113*53ee8cc1Swenshuai.xi             break;
7114*53ee8cc1Swenshuai.xi         default:
7115*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_WARNING, "[%04d] Unsupport PktType = %u\n", __LINE__, (MS_U32) eDrvPktType);
7116*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL);
7117*53ee8cc1Swenshuai.xi     }
7118*53ee8cc1Swenshuai.xi 
7119*53ee8cc1Swenshuai.xi     HAL_TSP_TEI_RemoveErrorPkt(eHalPktType, bEnable);
7120*53ee8cc1Swenshuai.xi 
7121*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
7122*53ee8cc1Swenshuai.xi }
7123*53ee8cc1Swenshuai.xi 
7124*53ee8cc1Swenshuai.xi 
7125*53ee8cc1Swenshuai.xi #ifdef STC64_SUPPORT
7126*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7127*53ee8cc1Swenshuai.xi /// Enable or Disable STC64 bit mode. Defalut is STC33 mode.
7128*53ee8cc1Swenshuai.xi /// @param  bEnable                 \b IN: STC64 system time mode enable
7129*53ee8cc1Swenshuai.xi /// @return TSP_Result
7130*53ee8cc1Swenshuai.xi /// @note
7131*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_STC64_Mode_Enable(MS_BOOL bEnable)7132*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_STC64_Mode_Enable(MS_BOOL bEnable)
7133*53ee8cc1Swenshuai.xi {
7134*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7135*53ee8cc1Swenshuai.xi //  HAL_TSP_STC64_Mode_En(bEnable); // @F_TODO not implement yet do we have to enable this in kaiser?
7136*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
7137*53ee8cc1Swenshuai.xi }
7138*53ee8cc1Swenshuai.xi 
7139*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7140*53ee8cc1Swenshuai.xi //[Reserved]
7141*53ee8cc1Swenshuai.xi // Memory to TSP stream command : Update Stream STC64
7142*53ee8cc1Swenshuai.xi // @param  u32EngId                  \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
7143*53ee8cc1Swenshuai.xi // @param  u32STC_32               \b IN: STC[63:32] for next input stream
7144*53ee8cc1Swenshuai.xi // @param  u32STC                    \b IN: STC[31:0] for next input stream
7145*53ee8cc1Swenshuai.xi // @return TSP_Result
7146*53ee8cc1Swenshuai.xi // @note M2T Command Size: 3
7147*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SetSTC64(MS_U32 u32EngId,MS_U32 u32STC_32,MS_U32 u32STC)7148*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetSTC64(MS_U32 u32EngId, MS_U32 u32STC_32, MS_U32 u32STC)
7149*53ee8cc1Swenshuai.xi {
7150*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7151*53ee8cc1Swenshuai.xi 
7152*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_STC_CHECK(u32EngId);
7153*53ee8cc1Swenshuai.xi     HAL_TSP_STC64_Set(u32EngId, u32STC_32, u32STC);
7154*53ee8cc1Swenshuai.xi 
7155*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
7156*53ee8cc1Swenshuai.xi }
7157*53ee8cc1Swenshuai.xi 
7158*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7159*53ee8cc1Swenshuai.xi /// Set STC control
7160*53ee8cc1Swenshuai.xi /// @param u8Eng \b         IN: STC Engine ID
7161*53ee8cc1Swenshuai.xi /// @param u8Opt \b         IN: STC update control options
7162*53ee8cc1Swenshuai.xi ///                                         0x00 -> Update STC by TSP FW (driver)
7163*53ee8cc1Swenshuai.xi ///                                         0x01 -> Update STC by HK (Set by AP)
7164*53ee8cc1Swenshuai.xi ///                                         0x02 -> Update STC Once by driver when PCR reset
7165*53ee8cc1Swenshuai.xi /// @note
7166*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_STC_UpdateCtrl(MS_U8 u8Eng,MS_U8 u8Mode)7167*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_STC_UpdateCtrl(MS_U8 u8Eng, MS_U8 u8Mode)
7168*53ee8cc1Swenshuai.xi {
7169*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7170*53ee8cc1Swenshuai.xi 
7171*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_STC_CHECK(u8Eng);
7172*53ee8cc1Swenshuai.xi     if (u8Mode ==0x00)
7173*53ee8cc1Swenshuai.xi     {
7174*53ee8cc1Swenshuai.xi         _ptsp_res->_u32_StcUpdateCtrl[u8Eng].bEnable = TRUE;
7175*53ee8cc1Swenshuai.xi         _ptsp_res->_u32_StcUpdateCtrl[u8Eng].bUpdateOnce = FALSE;
7176*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_OK);
7177*53ee8cc1Swenshuai.xi     }
7178*53ee8cc1Swenshuai.xi     else if( u8Mode ==0x01)
7179*53ee8cc1Swenshuai.xi     {
7180*53ee8cc1Swenshuai.xi         _ptsp_res->_u32_StcUpdateCtrl[u8Eng].bEnable = FALSE;
7181*53ee8cc1Swenshuai.xi         _ptsp_res->_u32_StcUpdateCtrl[u8Eng].bUpdateOnce = FALSE;
7182*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_OK);
7183*53ee8cc1Swenshuai.xi     }
7184*53ee8cc1Swenshuai.xi     else if( u8Mode ==0x02)
7185*53ee8cc1Swenshuai.xi     {
7186*53ee8cc1Swenshuai.xi         _ptsp_res->_u32_StcUpdateCtrl[u8Eng].bEnable = TRUE;
7187*53ee8cc1Swenshuai.xi         _ptsp_res->_u32_StcUpdateCtrl[u8Eng].bUpdateOnce = TRUE;
7188*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_OK);
7189*53ee8cc1Swenshuai.xi     }
7190*53ee8cc1Swenshuai.xi 
7191*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_FAIL);
7192*53ee8cc1Swenshuai.xi }
7193*53ee8cc1Swenshuai.xi 
MDrv_TSP_SetSTCOffset(MS_U32 u32EngId,MS_U32 u32Offset,MS_BOOL bAdd)7194*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetSTCOffset(MS_U32 u32EngId, MS_U32 u32Offset, MS_BOOL bAdd)
7195*53ee8cc1Swenshuai.xi {
7196*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7197*53ee8cc1Swenshuai.xi 
7198*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_STC_CHECK(u32EngId);
7199*53ee8cc1Swenshuai.xi     _ptsp_res->_u32_StcOffset[u32EngId].u32StcOffset = u32Offset;
7200*53ee8cc1Swenshuai.xi     _ptsp_res->_u32_StcOffset[u32EngId].bAdd= bAdd;
7201*53ee8cc1Swenshuai.xi 
7202*53ee8cc1Swenshuai.xi     TSP_RETURN (E_TSP_OK);
7203*53ee8cc1Swenshuai.xi }
7204*53ee8cc1Swenshuai.xi 
7205*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7206*53ee8cc1Swenshuai.xi /// Get current system time clock (STC64) of TSP
7207*53ee8cc1Swenshuai.xi /// @param  u32EngId                \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
7208*53ee8cc1Swenshuai.xi /// @param  pu32STC_32              \b OUT: pointer of STC[32:63] return
7209*53ee8cc1Swenshuai.xi /// @param  pu32STC                 \b OUT: pointer of STC[31:0] return
7210*53ee8cc1Swenshuai.xi /// @return TSP_Result
7211*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_GetSTC64(MS_U32 u32EngId,MS_U32 * pu32STC_32,MS_U32 * pu32STC)7212*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetSTC64(MS_U32 u32EngId, MS_U32 *pu32STC_32, MS_U32 *pu32STC)
7213*53ee8cc1Swenshuai.xi {
7214*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7215*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_STC_CHECK(u32EngId);
7216*53ee8cc1Swenshuai.xi 
7217*53ee8cc1Swenshuai.xi     HAL_TSP_STC64_Get(u32EngId, pu32STC_32, pu32STC);
7218*53ee8cc1Swenshuai.xi 
7219*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
7220*53ee8cc1Swenshuai.xi }
7221*53ee8cc1Swenshuai.xi 
7222*53ee8cc1Swenshuai.xi #endif
7223*53ee8cc1Swenshuai.xi 
7224*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7225*53ee8cc1Swenshuai.xi /// STC Clock Rate Adjust (27MHz clock)
7226*53ee8cc1Swenshuai.xi /// @param  u32EngId                        \b IN: STC engine ID
7227*53ee8cc1Swenshuai.xi /// @param bUpClk                            \b IN: If TRUE, Clk will be faster, and if FALSE, Clk will be slower
7228*53ee8cc1Swenshuai.xi /// @param u32Percentage                 \b IN: The percentage of STC clock ratio
7229*53ee8cc1Swenshuai.xi /// @return TSP_Result
7230*53ee8cc1Swenshuai.xi /// @note
7231*53ee8cc1Swenshuai.xi /// StcClk = (InClk * (2^27) /Stc_CW) * 3.2
7232*53ee8cc1Swenshuai.xi /// Stc_CW = Stc_CW_Def / P
7233*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_STCClk_Adjust(MS_U32 u32EngId,MS_BOOL bUpClk,MS_U32 u32Percentage)7234*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_STCClk_Adjust(MS_U32 u32EngId, MS_BOOL bUpClk, MS_U32 u32Percentage)
7235*53ee8cc1Swenshuai.xi {
7236*53ee8cc1Swenshuai.xi     if(u32Percentage == 0)
7237*53ee8cc1Swenshuai.xi     {
7238*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
7239*53ee8cc1Swenshuai.xi     }
7240*53ee8cc1Swenshuai.xi 
7241*53ee8cc1Swenshuai.xi     MS_U64 u64CW_New = 0;
7242*53ee8cc1Swenshuai.xi 
7243*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7244*53ee8cc1Swenshuai.xi 
7245*53ee8cc1Swenshuai.xi     u64CW_New = (((MS_U64)STC_SYNTH_DEFAULT) & 0xFFFFFFFFUL) * (((MS_U64)_ptsp_res->_u32StcAdjustUnit) & 0xFFFFFFFFUL) / (((MS_U64)u32Percentage) & 0xFFFFFFFFUL);
7246*53ee8cc1Swenshuai.xi 
7247*53ee8cc1Swenshuai.xi     //ULOGD("TSP", "[%s](%d, %d, %d) CW %d\n", __FUNCTION__, (unsigned int)u32EngId, (unsigned int)bUpClk, (unsigned int)u32Percentage, (unsigned int)u64CW_New);
7248*53ee8cc1Swenshuai.xi     HAL_TSP_SetSTCSynth(u32EngId, (MS_U32)u64CW_New);
7249*53ee8cc1Swenshuai.xi 
7250*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
7251*53ee8cc1Swenshuai.xi }
7252*53ee8cc1Swenshuai.xi 
7253*53ee8cc1Swenshuai.xi 
7254*53ee8cc1Swenshuai.xi 
_TSP_FLT_SrcSwitch(TSP_FltType SrcFlow,TSP_FltType TgtFlow)7255*53ee8cc1Swenshuai.xi TSP_Result _TSP_FLT_SrcSwitch(TSP_FltType SrcFlow ,TSP_FltType TgtFlow)
7256*53ee8cc1Swenshuai.xi {
7257*53ee8cc1Swenshuai.xi     MS_U32 i ;//,dummy;
7258*53ee8cc1Swenshuai.xi 
7259*53ee8cc1Swenshuai.xi     // Define check policy for filters //
7260*53ee8cc1Swenshuai.xi     #define CHECK_FILTER_PROPERTY(_idx_) ((_ptsp_res->_tspInfo.FltType[_idx_] & SrcFlow)\
7261*53ee8cc1Swenshuai.xi                                         && (_ptsp_res->_tspInfo.FltState[_idx_] & E_TSP_FLT_STATE_ALLOC) \
7262*53ee8cc1Swenshuai.xi                                         && (_ptsp_res->_tspInfo.FltState[_idx_] != E_TSP_FLT_STATE_NA) \
7263*53ee8cc1Swenshuai.xi                                         && (FALSE ==(_ptsp_res->_tspInfo.FltType[_idx_] & E_TSP_FLT_FIFO_MASK ))\
7264*53ee8cc1Swenshuai.xi                                         && (E_TSP_FLT_USER_PCR != (_ptsp_res->_tspInfo.FltType[_idx_]& E_TSP_FLT_USER_MASK )))
7265*53ee8cc1Swenshuai.xi 
7266*53ee8cc1Swenshuai.xi 
7267*53ee8cc1Swenshuai.xi     //ULOGD("TSP", "Src Flow = %08lX  -- TgtFlow = %08lx \n",SrcFlow,TgtFlow);
7268*53ee8cc1Swenshuai.xi #if 0 // @FIXME seeems we dont need this
7269*53ee8cc1Swenshuai.xi     if (TgtFlow & E_TSP_FLT_SRC_FILE )
7270*53ee8cc1Swenshuai.xi     {
7271*53ee8cc1Swenshuai.xi         TSP_OS_Print("[%s] Target Flow Error , Flow = %08lx \n",__FUNCTION__,TgtFlow);
7272*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
7273*53ee8cc1Swenshuai.xi     }
7274*53ee8cc1Swenshuai.xi #endif
7275*53ee8cc1Swenshuai.xi 
7276*53ee8cc1Swenshuai.xi     // Stop all target source Filter
7277*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < _tspFltIdMap.u32PidFltId_End  ; i ++)
7278*53ee8cc1Swenshuai.xi     {
7279*53ee8cc1Swenshuai.xi         if (CHECK_FILTER_PROPERTY(i))
7280*53ee8cc1Swenshuai.xi         {
7281*53ee8cc1Swenshuai.xi             TSP_LOCK();
7282*53ee8cc1Swenshuai.xi             HAL_TSP_PidFlt_SetFltOut(i, TSP_PIDFLT_OUT_NONE);
7283*53ee8cc1Swenshuai.xi             TSP_UNLOCK();
7284*53ee8cc1Swenshuai.xi         }
7285*53ee8cc1Swenshuai.xi     }
7286*53ee8cc1Swenshuai.xi 
7287*53ee8cc1Swenshuai.xi     // wait for all Task solved
7288*53ee8cc1Swenshuai.xi     MsOS_DelayTask(100);
7289*53ee8cc1Swenshuai.xi 
7290*53ee8cc1Swenshuai.xi 
7291*53ee8cc1Swenshuai.xi     for ( i = 0 ; i < _tspFltIdMap.u32PidFltId_End  ; i ++)
7292*53ee8cc1Swenshuai.xi     {
7293*53ee8cc1Swenshuai.xi         if (CHECK_FILTER_PROPERTY(i))
7294*53ee8cc1Swenshuai.xi         {
7295*53ee8cc1Swenshuai.xi 
7296*53ee8cc1Swenshuai.xi             TSP_LOCK();
7297*53ee8cc1Swenshuai.xi             // Setting new Filter input source.
7298*53ee8cc1Swenshuai.xi 
7299*53ee8cc1Swenshuai.xi             // @TODO  not review and implement yet: check everthing
7300*53ee8cc1Swenshuai.xi             #if 0
7301*53ee8cc1Swenshuai.xi             if (TgtFlow & E_TSP_FLT_SRC_LIVE0)
7302*53ee8cc1Swenshuai.xi             {
7303*53ee8cc1Swenshuai.xi                 HAL_TSP_PidFlt_SetFltIn(i, TSP_PIDFLT_TSIF0);
7304*53ee8cc1Swenshuai.xi             }
7305*53ee8cc1Swenshuai.xi             else if (TgtFlow & E_TSP_FLT_SRC_TSIF1)
7306*53ee8cc1Swenshuai.xi             {
7307*53ee8cc1Swenshuai.xi                 HAL_TSP_PidFlt_SetFltIn(i, TSP_PIDFLT_TSIF1);
7308*53ee8cc1Swenshuai.xi             }
7309*53ee8cc1Swenshuai.xi             else if (TgtFlow & E_TSP_FLT_SRC_TSIF2)
7310*53ee8cc1Swenshuai.xi             {
7311*53ee8cc1Swenshuai.xi                 HAL_TSP_PidFlt_SetFltIn(i, TSP_PIDFLT_TSIF2);
7312*53ee8cc1Swenshuai.xi             }
7313*53ee8cc1Swenshuai.xi             else
7314*53ee8cc1Swenshuai.xi             {
7315*53ee8cc1Swenshuai.xi                 TSP_OS_Print("[%s][%d]Error in target source = %lx \n",__FUNCTION__,__LINE__,TgtFlow);
7316*53ee8cc1Swenshuai.xi             }
7317*53ee8cc1Swenshuai.xi             #endif
7318*53ee8cc1Swenshuai.xi 
7319*53ee8cc1Swenshuai.xi             _ptsp_res->_tspInfo.FltType[i] = (_ptsp_res->_tspInfo.FltType[i] & ~E_TSP_FLT_SRC_MASK) | TgtFlow ;
7320*53ee8cc1Swenshuai.xi             TSP_UNLOCK();
7321*53ee8cc1Swenshuai.xi 
7322*53ee8cc1Swenshuai.xi             // Restart Running Filter
7323*53ee8cc1Swenshuai.xi             if (_ptsp_res->_tspInfo.FltState[i] & E_TSP_FLT_STATE_ENABLE)
7324*53ee8cc1Swenshuai.xi             {
7325*53ee8cc1Swenshuai.xi                 MDrv_TSP_FLT_Enable( i , TRUE );
7326*53ee8cc1Swenshuai.xi             }
7327*53ee8cc1Swenshuai.xi         }
7328*53ee8cc1Swenshuai.xi     }
7329*53ee8cc1Swenshuai.xi 
7330*53ee8cc1Swenshuai.xi     TSP_LOCK();
7331*53ee8cc1Swenshuai.xi     if (SrcFlow == _ptsp_res->_Current_Live)
7332*53ee8cc1Swenshuai.xi     {
7333*53ee8cc1Swenshuai.xi         _ptsp_res->_Current_Live = TgtFlow & E_TSP_FLT_SRC_MASK;
7334*53ee8cc1Swenshuai.xi     }
7335*53ee8cc1Swenshuai.xi     TSP_UNLOCK();
7336*53ee8cc1Swenshuai.xi 
7337*53ee8cc1Swenshuai.xi     return (E_TSP_OK);
7338*53ee8cc1Swenshuai.xi 
7339*53ee8cc1Swenshuai.xi     #undef CHECK_FILTER_PROPERTY
7340*53ee8cc1Swenshuai.xi 
7341*53ee8cc1Swenshuai.xi }
7342*53ee8cc1Swenshuai.xi 
MDrv_TSP_FLT_LiveSrcSwitch(TSP_FltType TgtFlow)7343*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_LiveSrcSwitch(TSP_FltType TgtFlow)
7344*53ee8cc1Swenshuai.xi {
7345*53ee8cc1Swenshuai.xi     //TSP_OS_Print("[%s][%d]\n",__FUNCTION__,__LINE__);
7346*53ee8cc1Swenshuai.xi 
7347*53ee8cc1Swenshuai.xi     TSP_Result ret = E_TSP_FAIL;
7348*53ee8cc1Swenshuai.xi 
7349*53ee8cc1Swenshuai.xi     if ((TgtFlow&E_TSP_FLT_SRC_MASK ) == _ptsp_res->_Current_Live)
7350*53ee8cc1Swenshuai.xi     {
7351*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
7352*53ee8cc1Swenshuai.xi     }
7353*53ee8cc1Swenshuai.xi 
7354*53ee8cc1Swenshuai.xi     ret = _TSP_FLT_SrcSwitch(_ptsp_res->_Current_Live, TgtFlow);
7355*53ee8cc1Swenshuai.xi 
7356*53ee8cc1Swenshuai.xi     return ret;
7357*53ee8cc1Swenshuai.xi }
7358*53ee8cc1Swenshuai.xi 
7359*53ee8cc1Swenshuai.xi 
MDrv_TSP_FLT_ChangeSource(MS_U32 u32FltId,TSP_FltType eTSPFltTypeSrc)7360*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_ChangeSource(MS_U32 u32FltId, TSP_FltType eTSPFltTypeSrc)
7361*53ee8cc1Swenshuai.xi {
7362*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32PidFltIdAll > u32FltId, "[%04d] Invalid u32FltId %d\n", __LINE__, (unsigned int)u32FltId);
7363*53ee8cc1Swenshuai.xi 
7364*53ee8cc1Swenshuai.xi    // HAL_TSP_GetCaps(E_TSP_HAL_CAP_TYPE_RECFLT_IDX, &u32RecFltIdx);
7365*53ee8cc1Swenshuai.xi     if(u32FltId == _tspFltIdMap.u32RecFltIdx)
7366*53ee8cc1Swenshuai.xi         return E_TSP_OK;
7367*53ee8cc1Swenshuai.xi 
7368*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7369*53ee8cc1Swenshuai.xi 
7370*53ee8cc1Swenshuai.xi     if ((_ptsp_res->_tspInfo.FltType[u32FltId]& E_TSP_FLT_USER_MASK)== E_TSP_FLT_USER_PCR)
7371*53ee8cc1Swenshuai.xi     {
7372*53ee8cc1Swenshuai.xi         //stop hw pcr
7373*53ee8cc1Swenshuai.xi         if ((u32FltId >= TSP_PCRFLT_GET_ID(0)) && (u32FltId <= HAL_TSP_PCRFLT_GET_ID(TSP_PCRFLT_NUM - 1)))
7374*53ee8cc1Swenshuai.xi         {
7375*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_Enable(u32FltId - _tspFltIdMap.u32PcrFltId_Start, FALSE);
7376*53ee8cc1Swenshuai.xi         }
7377*53ee8cc1Swenshuai.xi         else
7378*53ee8cc1Swenshuai.xi         {
7379*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[%s][%d] Incorrect PCR filter ID !!\n",__FUNCTION__,__LINE__);
7380*53ee8cc1Swenshuai.xi         }
7381*53ee8cc1Swenshuai.xi     }
7382*53ee8cc1Swenshuai.xi     else
7383*53ee8cc1Swenshuai.xi     {
7384*53ee8cc1Swenshuai.xi         //stop pid flts
7385*53ee8cc1Swenshuai.xi         HAL_TSP_PidFlt_SetFltOut(u32FltId, TSP_PIDFLT_OUT_NONE); // stop filter
7386*53ee8cc1Swenshuai.xi     }
7387*53ee8cc1Swenshuai.xi 
7388*53ee8cc1Swenshuai.xi     // wait for all Task solved
7389*53ee8cc1Swenshuai.xi     MsOS_DelayTask(20);
7390*53ee8cc1Swenshuai.xi 
7391*53ee8cc1Swenshuai.xi     MS_U32 u32FltSrc = E_TSP_FLT_SRC_MASK & eTSPFltTypeSrc;
7392*53ee8cc1Swenshuai.xi     TSP_PIDFLT_SRC eTspPidSrc = _TSP_DrvHal_FltSrcMapping(u32FltSrc);
7393*53ee8cc1Swenshuai.xi 
7394*53ee8cc1Swenshuai.xi     if ((_ptsp_res->_tspInfo.FltType[u32FltId]& E_TSP_FLT_USER_MASK)== E_TSP_FLT_USER_PCR)
7395*53ee8cc1Swenshuai.xi     {
7396*53ee8cc1Swenshuai.xi         //change hw pcr src
7397*53ee8cc1Swenshuai.xi         if ((u32FltId >= HAL_TSP_PCRFLT_GET_ID(0)) && (u32FltId <= HAL_TSP_PCRFLT_GET_ID(TSP_PCRFLT_NUM - 1)))
7398*53ee8cc1Swenshuai.xi         {
7399*53ee8cc1Swenshuai.xi             TSP_PCR_SRC ePcrSrc = HAL_TSP_FltSrc2PCRSrc_Mapping(eTspPidSrc);
7400*53ee8cc1Swenshuai.xi 
7401*53ee8cc1Swenshuai.xi             TSP_RES_ALLOC_TSPPATH_CHECK(ePcrSrc);
7402*53ee8cc1Swenshuai.xi 
7403*53ee8cc1Swenshuai.xi             HAL_TSP_PcrFlt_SetSrc(u32FltId - _tspFltIdMap.u32PcrFltId_Start, ePcrSrc);
7404*53ee8cc1Swenshuai.xi         }
7405*53ee8cc1Swenshuai.xi         else
7406*53ee8cc1Swenshuai.xi         {
7407*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_MUST, "[%s][%d] Incorrect PCR filter ID !!\n",__FUNCTION__,__LINE__);
7408*53ee8cc1Swenshuai.xi         }
7409*53ee8cc1Swenshuai.xi     }
7410*53ee8cc1Swenshuai.xi     else
7411*53ee8cc1Swenshuai.xi     {
7412*53ee8cc1Swenshuai.xi         //change pid flt src
7413*53ee8cc1Swenshuai.xi         MS_U32 u32PktDmx = HAL_TSP_FltSrc2PktDmx_Mapping(eTspPidSrc);
7414*53ee8cc1Swenshuai.xi 
7415*53ee8cc1Swenshuai.xi         TSP_RES_ALLOC_TSPPATH_CHECK(u32PktDmx);
7416*53ee8cc1Swenshuai.xi 
7417*53ee8cc1Swenshuai.xi         HAL_TSP_PidFlt_SetFltIn(u32FltId,u32PktDmx);
7418*53ee8cc1Swenshuai.xi     }
7419*53ee8cc1Swenshuai.xi 
7420*53ee8cc1Swenshuai.xi     _ptsp_res->_tspInfo.FltType[u32FltId] = (_ptsp_res->_tspInfo.FltType[u32FltId] & ~E_TSP_FLT_SRC_MASK) | eTSPFltTypeSrc ;
7421*53ee8cc1Swenshuai.xi 
7422*53ee8cc1Swenshuai.xi     if (_ptsp_res->_tspInfo.FltState[u32FltId] & E_TSP_FLT_STATE_ENABLE)
7423*53ee8cc1Swenshuai.xi     {
7424*53ee8cc1Swenshuai.xi         _MDrv_TSP_FLT_Enable( u32FltId, TRUE );
7425*53ee8cc1Swenshuai.xi     }
7426*53ee8cc1Swenshuai.xi 
7427*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
7428*53ee8cc1Swenshuai.xi }
7429*53ee8cc1Swenshuai.xi 
MDrv_TSP_PARL_BitOrderSwap(MS_U16 u16TSIF,MS_BOOL bInvert)7430*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PARL_BitOrderSwap(MS_U16 u16TSIF, MS_BOOL bInvert)
7431*53ee8cc1Swenshuai.xi {
7432*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(u16TSIF);
7433*53ee8cc1Swenshuai.xi 
7434*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7435*53ee8cc1Swenshuai.xi     HAL_TSP_TSIF_BitSwap(u16TSIF, bInvert); //@F_TODO check if this is the same with `HAL_TSP_SetDataSwap'
7436*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
7437*53ee8cc1Swenshuai.xi }
7438*53ee8cc1Swenshuai.xi 
MDrv_TSP_FQ_FltNullPkt(MS_U32 u32FQEng,MS_BOOL bFltNull)7439*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FQ_FltNullPkt(MS_U32 u32FQEng, MS_BOOL bFltNull)
7440*53ee8cc1Swenshuai.xi {
7441*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
7442*53ee8cc1Swenshuai.xi 
7443*53ee8cc1Swenshuai.xi     MS_U32 u32MapingFQEng = HAL_TSP_Tsif2Fq_Mapping(u32FQEng);
7444*53ee8cc1Swenshuai.xi     TSP_FQ_NUM_CHECK_RET(u32MapingFQEng);
7445*53ee8cc1Swenshuai.xi 
7446*53ee8cc1Swenshuai.xi     TSP_Result ret;
7447*53ee8cc1Swenshuai.xi 
7448*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7449*53ee8cc1Swenshuai.xi 
7450*53ee8cc1Swenshuai.xi     ret = HAL_TSP_FQ_FLT_NULL_PKT(u32MapingFQEng, bFltNull);
7451*53ee8cc1Swenshuai.xi 
7452*53ee8cc1Swenshuai.xi     if(ret==FALSE)
7453*53ee8cc1Swenshuai.xi     {
7454*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL_NOT_SUPPORTED);
7455*53ee8cc1Swenshuai.xi     }
7456*53ee8cc1Swenshuai.xi     else
7457*53ee8cc1Swenshuai.xi     {
7458*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_OK);
7459*53ee8cc1Swenshuai.xi     }
7460*53ee8cc1Swenshuai.xi }
7461*53ee8cc1Swenshuai.xi 
MDrv_TSP_FQ_SetMuxSwitch(MS_U32 u32FQEng,DrvFQ_SrcIf eTsSrc)7462*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FQ_SetMuxSwitch(MS_U32 u32FQEng, DrvFQ_SrcIf eTsSrc)
7463*53ee8cc1Swenshuai.xi {
7464*53ee8cc1Swenshuai.xi     TSP_DBG(E_TSP_DBG_TRACK, "%s\n", __FUNCTION__);
7465*53ee8cc1Swenshuai.xi     MS_U32 u32FQSrc = 0;
7466*53ee8cc1Swenshuai.xi 
7467*53ee8cc1Swenshuai.xi     TSP_FQ_NUM_CHECK_RET(u32FQEng);
7468*53ee8cc1Swenshuai.xi 
7469*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7470*53ee8cc1Swenshuai.xi 
7471*53ee8cc1Swenshuai.xi     switch(eTsSrc)
7472*53ee8cc1Swenshuai.xi     {
7473*53ee8cc1Swenshuai.xi         case E_DRVFQ_SRC_TSIF0:
7474*53ee8cc1Swenshuai.xi             u32FQSrc = 0;
7475*53ee8cc1Swenshuai.xi             break;
7476*53ee8cc1Swenshuai.xi         case E_DRVFQ_SRC_TSIF1:
7477*53ee8cc1Swenshuai.xi             u32FQSrc = 1;
7478*53ee8cc1Swenshuai.xi             break;
7479*53ee8cc1Swenshuai.xi         case E_DRVFQ_SRC_TSIF2:
7480*53ee8cc1Swenshuai.xi             u32FQSrc = 2;
7481*53ee8cc1Swenshuai.xi             break;
7482*53ee8cc1Swenshuai.xi         case E_DRVFQ_SRC_TSIF3:
7483*53ee8cc1Swenshuai.xi             u32FQSrc = 3;
7484*53ee8cc1Swenshuai.xi             break;
7485*53ee8cc1Swenshuai.xi         case E_DRVFQ_SRC_TSIFFI:
7486*53ee8cc1Swenshuai.xi             u32FQSrc = 7;
7487*53ee8cc1Swenshuai.xi             break;
7488*53ee8cc1Swenshuai.xi         case E_DRVFQ_SRC_DEFAULT:
7489*53ee8cc1Swenshuai.xi             u32FQSrc = HAL_TSP_Tsif2Fq_Mapping(u32FQEng);
7490*53ee8cc1Swenshuai.xi             break;
7491*53ee8cc1Swenshuai.xi         default:
7492*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL_PARAMETER);
7493*53ee8cc1Swenshuai.xi     }
7494*53ee8cc1Swenshuai.xi 
7495*53ee8cc1Swenshuai.xi     if(!HAL_TSP_FQ_SetMuxSwitch(u32FQEng,u32FQSrc))
7496*53ee8cc1Swenshuai.xi     {
7497*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL);
7498*53ee8cc1Swenshuai.xi     }
7499*53ee8cc1Swenshuai.xi     else
7500*53ee8cc1Swenshuai.xi     {
7501*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_OK);
7502*53ee8cc1Swenshuai.xi     }
7503*53ee8cc1Swenshuai.xi }
7504*53ee8cc1Swenshuai.xi 
MDrv_TSP_FQ_GetMuxSwitch(MS_U32 u32FQEng,DrvFQ_SrcIf * peTsSrc)7505*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FQ_GetMuxSwitch(MS_U32 u32FQEng, DrvFQ_SrcIf* peTsSrc)
7506*53ee8cc1Swenshuai.xi {
7507*53ee8cc1Swenshuai.xi     MS_U32 u32FQSrc = E_DRVFQ_SRC_DEFAULT;
7508*53ee8cc1Swenshuai.xi 
7509*53ee8cc1Swenshuai.xi     TSP_FQ_NUM_CHECK_RET(u32FQEng);
7510*53ee8cc1Swenshuai.xi 
7511*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7512*53ee8cc1Swenshuai.xi 
7513*53ee8cc1Swenshuai.xi     u32FQSrc = HAL_TSP_FQ_GetMuxSwitch(u32FQEng);
7514*53ee8cc1Swenshuai.xi 
7515*53ee8cc1Swenshuai.xi     switch(u32FQSrc)
7516*53ee8cc1Swenshuai.xi     {
7517*53ee8cc1Swenshuai.xi         case 0:
7518*53ee8cc1Swenshuai.xi             *peTsSrc = E_DRVFQ_SRC_TSIF0;
7519*53ee8cc1Swenshuai.xi             break;
7520*53ee8cc1Swenshuai.xi         case 1:
7521*53ee8cc1Swenshuai.xi             *peTsSrc = E_DRVFQ_SRC_TSIF1;
7522*53ee8cc1Swenshuai.xi             break;
7523*53ee8cc1Swenshuai.xi         case 2:
7524*53ee8cc1Swenshuai.xi             *peTsSrc = E_DRVFQ_SRC_TSIF2;
7525*53ee8cc1Swenshuai.xi             break;
7526*53ee8cc1Swenshuai.xi         case 3:
7527*53ee8cc1Swenshuai.xi             *peTsSrc = E_DRVFQ_SRC_TSIF3;
7528*53ee8cc1Swenshuai.xi             break;
7529*53ee8cc1Swenshuai.xi         case 7:
7530*53ee8cc1Swenshuai.xi             *peTsSrc = E_DRVFQ_SRC_TSIFFI;
7531*53ee8cc1Swenshuai.xi             break;
7532*53ee8cc1Swenshuai.xi         default:
7533*53ee8cc1Swenshuai.xi             *peTsSrc = E_DRVFQ_SRC_DEFAULT;
7534*53ee8cc1Swenshuai.xi             TSP_RETURN(E_TSP_FAIL);
7535*53ee8cc1Swenshuai.xi     }
7536*53ee8cc1Swenshuai.xi 
7537*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
7538*53ee8cc1Swenshuai.xi }
7539*53ee8cc1Swenshuai.xi 
7540*53ee8cc1Swenshuai.xi 
MDrv_TSP_CMD_Run(MS_U32 u32Cmd,MS_U32 u32Config0,MS_U32 u32Config1,void * pData)7541*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_CMD_Run(MS_U32 u32Cmd, MS_U32 u32Config0, MS_U32 u32Config1 ,void *pData)
7542*53ee8cc1Swenshuai.xi {
7543*53ee8cc1Swenshuai.xi 
7544*53ee8cc1Swenshuai.xi     if(u32Cmd == DRV_DMX_CMD_STC_ADJUST_UNIT)
7545*53ee8cc1Swenshuai.xi     {
7546*53ee8cc1Swenshuai.xi         _ptsp_res->_u32StcAdjustUnit = u32Config0;
7547*53ee8cc1Swenshuai.xi         return (E_TSP_OK);
7548*53ee8cc1Swenshuai.xi     }
7549*53ee8cc1Swenshuai.xi 
7550*53ee8cc1Swenshuai.xi     if(HAL_TSP_CMD_Run(u32Cmd, u32Config0, u32Config1,pData))
7551*53ee8cc1Swenshuai.xi         return (E_TSP_OK);
7552*53ee8cc1Swenshuai.xi     else
7553*53ee8cc1Swenshuai.xi         return (E_TSP_FAIL);
7554*53ee8cc1Swenshuai.xi }
7555*53ee8cc1Swenshuai.xi 
MDrv_TSP_DSCMB_Functionality(TSP_DSCMB_FuncCMD eCmd,MS_U32 u32Config0,MS_U32 u32Config1,void * pData)7556*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_DSCMB_Functionality(TSP_DSCMB_FuncCMD eCmd, MS_U32 u32Config0, MS_U32 u32Config1 ,void *pData)
7557*53ee8cc1Swenshuai.xi {//this func should only be called by DSCMB driver to do DSCMB functionality, and maintained by DSCMB owner
7558*53ee8cc1Swenshuai.xi //the mutex _s32MutexId is utilized to avoid race condition between DSCMB & TSP accessing shared registers
7559*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7560*53ee8cc1Swenshuai.xi 
7561*53ee8cc1Swenshuai.xi     switch(eCmd)
7562*53ee8cc1Swenshuai.xi     {
7563*53ee8cc1Swenshuai.xi         default:
7564*53ee8cc1Swenshuai.xi             break;
7565*53ee8cc1Swenshuai.xi     }
7566*53ee8cc1Swenshuai.xi 
7567*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
7568*53ee8cc1Swenshuai.xi }
7569*53ee8cc1Swenshuai.xi 
7570*53ee8cc1Swenshuai.xi 
MDrv_TSP_Flt_GetScmbSts(TSP_FltType eFltType,MS_U32 u32FltGroupId,MS_U32 PidFltId,MS_U32 * pu32ScmbSts)7571*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Flt_GetScmbSts(TSP_FltType eFltType, MS_U32 u32FltGroupId, MS_U32 PidFltId, MS_U32 *pu32ScmbSts)
7572*53ee8cc1Swenshuai.xi {
7573*53ee8cc1Swenshuai.xi     TSP_CHECK(_tspFltIdMap.u32PidFltId_End > PidFltId, "[%04d] Invalid u32FltId %d\n", __LINE__, (unsigned int)PidFltId);
7574*53ee8cc1Swenshuai.xi 
7575*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7576*53ee8cc1Swenshuai.xi 
7577*53ee8cc1Swenshuai.xi     MS_U32 u32FltSrc = E_TSP_FLT_SRC_MASK & eFltType;
7578*53ee8cc1Swenshuai.xi     TSP_PIDFLT_SRC eTspPidSrc = _TSP_DrvHal_FltSrcMapping(u32FltSrc);
7579*53ee8cc1Swenshuai.xi     MS_U32 u32PktDmx = HAL_TSP_FltSrc2PktDmx_Mapping(eTspPidSrc);
7580*53ee8cc1Swenshuai.xi 
7581*53ee8cc1Swenshuai.xi     TSP_RES_ALLOC_TSPPATH_CHECK(u32PktDmx);
7582*53ee8cc1Swenshuai.xi 
7583*53ee8cc1Swenshuai.xi     if( HAL_DSCMB_GetStatus( u32PktDmx, u32FltGroupId, PidFltId, pu32ScmbSts) )
7584*53ee8cc1Swenshuai.xi     {
7585*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_OK);
7586*53ee8cc1Swenshuai.xi     }
7587*53ee8cc1Swenshuai.xi     else
7588*53ee8cc1Swenshuai.xi     {
7589*53ee8cc1Swenshuai.xi         TSP_RETURN(E_TSP_FAIL);
7590*53ee8cc1Swenshuai.xi     }
7591*53ee8cc1Swenshuai.xi }
7592*53ee8cc1Swenshuai.xi 
MDrv_TSP_DropScmbPkt(TSP_FltType eFilterType,MS_BOOL bEnable)7593*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_DropScmbPkt(TSP_FltType eFilterType, MS_BOOL bEnable)
7594*53ee8cc1Swenshuai.xi {
7595*53ee8cc1Swenshuai.xi     TSP_DST_SEQ eDst = _TSP_DrvHal_FltType2DstMapping(eFilterType);
7596*53ee8cc1Swenshuai.xi 
7597*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7598*53ee8cc1Swenshuai.xi 
7599*53ee8cc1Swenshuai.xi     HAL_TSP_FIFO_Skip_Scrmb(eDst, bEnable);
7600*53ee8cc1Swenshuai.xi 
7601*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
7602*53ee8cc1Swenshuai.xi }
7603*53ee8cc1Swenshuai.xi 
MDrv_TSP_TsifMapping(TSP_TSIF eTSIF)7604*53ee8cc1Swenshuai.xi TSP_TSIF MDrv_TSP_TsifMapping(TSP_TSIF eTSIF)
7605*53ee8cc1Swenshuai.xi {
7606*53ee8cc1Swenshuai.xi     TSP_HAL_TSIF eHalTSIF = _TSP_DrvHal_TSIFMapping(eTSIF);
7607*53ee8cc1Swenshuai.xi     MS_U32 u32TSIF = HAL_TSP_TsifMapping(eHalTSIF,FALSE);
7608*53ee8cc1Swenshuai.xi 
7609*53ee8cc1Swenshuai.xi     switch(u32TSIF)
7610*53ee8cc1Swenshuai.xi     {
7611*53ee8cc1Swenshuai.xi         case TSP_TSIF0:
7612*53ee8cc1Swenshuai.xi             return E_TSP_TSIF_0;
7613*53ee8cc1Swenshuai.xi         case TSP_TSIF1:
7614*53ee8cc1Swenshuai.xi             return E_TSP_TSIF_1;
7615*53ee8cc1Swenshuai.xi         case TSP_TSIF2:
7616*53ee8cc1Swenshuai.xi             return E_TSP_TSIF_2;
7617*53ee8cc1Swenshuai.xi         case TSP_TSIF3:
7618*53ee8cc1Swenshuai.xi             return E_TSP_TSIF_3;
7619*53ee8cc1Swenshuai.xi         case TSP_TSIF4:
7620*53ee8cc1Swenshuai.xi             return E_TSP_TSIF_4;
7621*53ee8cc1Swenshuai.xi         case TSP_TSIF5:
7622*53ee8cc1Swenshuai.xi             return E_TSP_TSIF_5;
7623*53ee8cc1Swenshuai.xi         case TSP_TSIF6:
7624*53ee8cc1Swenshuai.xi             return E_TSP_TSIF_6;
7625*53ee8cc1Swenshuai.xi         default:
7626*53ee8cc1Swenshuai.xi             TSP_DBG(E_TSP_DBG_WARNING, "[%04d] TSIF %u is wrong !! \n", __LINE__, u32TSIF);
7627*53ee8cc1Swenshuai.xi             return E_TSP_TSIF_0;
7628*53ee8cc1Swenshuai.xi     }
7629*53ee8cc1Swenshuai.xi }
7630*53ee8cc1Swenshuai.xi 
MDrv_TSP_WriteProtect_Enable(MS_BOOL bEnable,MS_PHY * pphyStartAddr,MS_PHY * pphyEndAddr)7631*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_WriteProtect_Enable(MS_BOOL bEnable, MS_PHY *pphyStartAddr, MS_PHY *pphyEndAddr)
7632*53ee8cc1Swenshuai.xi {
7633*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7634*53ee8cc1Swenshuai.xi 
7635*53ee8cc1Swenshuai.xi     // SEC #0 , #1
7636*53ee8cc1Swenshuai.xi     HAL_TSP_SEC_Address_Protect(0, pphyEndAddr[0], pphyStartAddr[0]);
7637*53ee8cc1Swenshuai.xi     HAL_TSP_SEC_Address_Protect(1, pphyEndAddr[1], pphyStartAddr[1]);
7638*53ee8cc1Swenshuai.xi     HAL_TSP_SEC_Address_Protect_En(bEnable);
7639*53ee8cc1Swenshuai.xi 
7640*53ee8cc1Swenshuai.xi     // PVR #1 ~ #3
7641*53ee8cc1Swenshuai.xi     HAL_TSP_PVR_Address_Protect(0, pphyEndAddr[2], pphyStartAddr[2]);
7642*53ee8cc1Swenshuai.xi     HAL_TSP_PVR_Address_Protect_En(0,bEnable);
7643*53ee8cc1Swenshuai.xi     HAL_TSP_PVR_Address_Protect(1, pphyEndAddr[3], pphyStartAddr[3]);
7644*53ee8cc1Swenshuai.xi     HAL_TSP_PVR_Address_Protect_En(1,bEnable);
7645*53ee8cc1Swenshuai.xi     HAL_TSP_PVR_Address_Protect(2, pphyEndAddr[4], pphyStartAddr[4]);
7646*53ee8cc1Swenshuai.xi     HAL_TSP_PVR_Address_Protect_En(2,bEnable);
7647*53ee8cc1Swenshuai.xi 
7648*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
7649*53ee8cc1Swenshuai.xi }
7650*53ee8cc1Swenshuai.xi 
MDrv_TSP_OrzWriteProtect_Enable(MS_BOOL bEnable,MS_PHY phyStartAddr,MS_PHY phyEndAddr)7651*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_OrzWriteProtect_Enable(MS_BOOL bEnable, MS_PHY phyStartAddr, MS_PHY phyEndAddr)
7652*53ee8cc1Swenshuai.xi {
7653*53ee8cc1Swenshuai.xi     TSP_ENTRY();
7654*53ee8cc1Swenshuai.xi 
7655*53ee8cc1Swenshuai.xi     HAL_TSP_OR_Address_Protect(phyEndAddr, phyStartAddr);
7656*53ee8cc1Swenshuai.xi     HAL_TSP_OR_Address_Protect_En(bEnable);
7657*53ee8cc1Swenshuai.xi 
7658*53ee8cc1Swenshuai.xi     TSP_RETURN(E_TSP_OK);
7659*53ee8cc1Swenshuai.xi }
7660*53ee8cc1Swenshuai.xi 
7661*53ee8cc1Swenshuai.xi //for kernel mode multiple process support, create eventid of callback thread of user mode in fitst time
7662*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
7663*53ee8cc1Swenshuai.xi static char tspevt_name[] = "tspevt";
7664*53ee8cc1Swenshuai.xi #endif
MDrv_TSP_Create_IoSignal(DrvTSP_IoSignal * pstIoSignal)7665*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Create_IoSignal(DrvTSP_IoSignal *pstIoSignal)
7666*53ee8cc1Swenshuai.xi {
7667*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
7668*53ee8cc1Swenshuai.xi     MS_U32  u32ii = 0;
7669*53ee8cc1Swenshuai.xi 
7670*53ee8cc1Swenshuai.xi     for(u32ii = 0; u32ii < TSP_MAX_PVRSIGFLAG_NUM; u32ii++)
7671*53ee8cc1Swenshuai.xi     {
7672*53ee8cc1Swenshuai.xi         pstIoSignal->u32PvrBufFullFlag[u32ii] = 0;
7673*53ee8cc1Swenshuai.xi     }
7674*53ee8cc1Swenshuai.xi     for(u32ii = 0; u32ii < TSP_MAX_SIGFLAG_NUM; u32ii++)
7675*53ee8cc1Swenshuai.xi     {
7676*53ee8cc1Swenshuai.xi         pstIoSignal->u32SecRdyFlag[u32ii] = 0;
7677*53ee8cc1Swenshuai.xi         pstIoSignal->u32SecOvfFlag[u32ii] = 0;
7678*53ee8cc1Swenshuai.xi     }
7679*53ee8cc1Swenshuai.xi 
7680*53ee8cc1Swenshuai.xi     if(pstIoSignal->s32KerModeTspEvtId == -1)
7681*53ee8cc1Swenshuai.xi     {
7682*53ee8cc1Swenshuai.xi         if((pstIoSignal->s32KerModeTspEvtId = TSP_OS_EventCreate((MS_U8*)tspevt_name)) != -1)
7683*53ee8cc1Swenshuai.xi         {
7684*53ee8cc1Swenshuai.xi             for(u32ii = 0; u32ii < DRVTSP_MAX_PROCESS_NUM; u32ii++)
7685*53ee8cc1Swenshuai.xi             {
7686*53ee8cc1Swenshuai.xi                 if((_u32KPrcEvtTblUseFlag & (1 << u32ii)) == 0)
7687*53ee8cc1Swenshuai.xi                 {
7688*53ee8cc1Swenshuai.xi                     pstIoSignal->u32TblIndex = u32ii;
7689*53ee8cc1Swenshuai.xi                     _stKModePrcEvtTbl[u32ii].tgid = current->tgid;
7690*53ee8cc1Swenshuai.xi                     _stKModePrcEvtTbl[u32ii].s32TspEvtId = pstIoSignal->s32KerModeTspEvtId;
7691*53ee8cc1Swenshuai.xi                     _u32KPrcEvtTblUseFlag |= (1 << u32ii);
7692*53ee8cc1Swenshuai.xi                     break;
7693*53ee8cc1Swenshuai.xi                 }
7694*53ee8cc1Swenshuai.xi             }
7695*53ee8cc1Swenshuai.xi 
7696*53ee8cc1Swenshuai.xi             //printf("[%s][%d] _u32KPrcEvtTblUseFlag %x , s32TspEvtId %x \n", __FUNCTION__, __LINE__, (int)_u32KPrcEvtTblUseFlag, (int)pstIoSignal->s32KerModeTspEvtId);
7697*53ee8cc1Swenshuai.xi 
7698*53ee8cc1Swenshuai.xi             return E_TSP_OK;
7699*53ee8cc1Swenshuai.xi         }
7700*53ee8cc1Swenshuai.xi         else
7701*53ee8cc1Swenshuai.xi         {
7702*53ee8cc1Swenshuai.xi             return E_TSP_FAIL;
7703*53ee8cc1Swenshuai.xi         }
7704*53ee8cc1Swenshuai.xi     }
7705*53ee8cc1Swenshuai.xi 
7706*53ee8cc1Swenshuai.xi     return E_TSP_OK;
7707*53ee8cc1Swenshuai.xi #else
7708*53ee8cc1Swenshuai.xi     return E_TSP_FAIL_NOT_SUPPORTED;
7709*53ee8cc1Swenshuai.xi #endif
7710*53ee8cc1Swenshuai.xi }
7711*53ee8cc1Swenshuai.xi 
7712*53ee8cc1Swenshuai.xi // Send free event to end user mode callback thread, and delete event id
MDrv_TSP_Close_IoSignal(DrvTSP_IoSignal * pstIoSignal)7713*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Close_IoSignal(DrvTSP_IoSignal *pstIoSignal)
7714*53ee8cc1Swenshuai.xi {
7715*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
7716*53ee8cc1Swenshuai.xi 
7717*53ee8cc1Swenshuai.xi     MS_U32 u32ii = 0;
7718*53ee8cc1Swenshuai.xi 
7719*53ee8cc1Swenshuai.xi     pstIoSignal->s32KerModeTspEvtId = -1;
7720*53ee8cc1Swenshuai.xi     for(u32ii = 0; u32ii < DRVTSP_MAX_PROCESS_NUM; u32ii++)
7721*53ee8cc1Swenshuai.xi     {
7722*53ee8cc1Swenshuai.xi         if((_u32KPrcEvtTblUseFlag & (1 << u32ii)) != 0)
7723*53ee8cc1Swenshuai.xi         {
7724*53ee8cc1Swenshuai.xi             if(_stKModePrcEvtTbl[u32ii].tgid == current->tgid)
7725*53ee8cc1Swenshuai.xi             {
7726*53ee8cc1Swenshuai.xi                 pstIoSignal->s32KerModeTspEvtId = _stKModePrcEvtTbl[u32ii].s32TspEvtId;
7727*53ee8cc1Swenshuai.xi                 break;
7728*53ee8cc1Swenshuai.xi             }
7729*53ee8cc1Swenshuai.xi         }
7730*53ee8cc1Swenshuai.xi     }
7731*53ee8cc1Swenshuai.xi     if(pstIoSignal->s32KerModeTspEvtId == -1)
7732*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
7733*53ee8cc1Swenshuai.xi 
7734*53ee8cc1Swenshuai.xi     //printf("%s][%d] s32KerModeTspEvtId %x\n", __FUNCTION__, __LINE__, (int)pstIoSignal->s32KerModeTspEvtId);
7735*53ee8cc1Swenshuai.xi 
7736*53ee8cc1Swenshuai.xi     TSP_SetEvent(pstIoSignal->s32KerModeTspEvtId, TSP_EVENT_TASKEND);
7737*53ee8cc1Swenshuai.xi 
7738*53ee8cc1Swenshuai.xi     //to free CB process task, so send one event
7739*53ee8cc1Swenshuai.xi     MsOS_DelayTask(3);
7740*53ee8cc1Swenshuai.xi 
7741*53ee8cc1Swenshuai.xi     while(_s32_IsrTaskReturn != TRUE)
7742*53ee8cc1Swenshuai.xi     {
7743*53ee8cc1Swenshuai.xi         TSP_SetEvent(pstIoSignal->s32KerModeTspEvtId, TSP_EVENT_TASKEND);
7744*53ee8cc1Swenshuai.xi         MsOS_DelayTask(3);
7745*53ee8cc1Swenshuai.xi     }
7746*53ee8cc1Swenshuai.xi 
7747*53ee8cc1Swenshuai.xi     while(TSP_OS_EventDelete(pstIoSignal->s32KerModeTspEvtId) == FALSE)
7748*53ee8cc1Swenshuai.xi     {
7749*53ee8cc1Swenshuai.xi         TSP_SetEvent(pstIoSignal->s32KerModeTspEvtId, TSP_EVENT_TASKEND);
7750*53ee8cc1Swenshuai.xi         printf("Waiting for evet deleting... \n");
7751*53ee8cc1Swenshuai.xi         MsOS_DelayTask(3);
7752*53ee8cc1Swenshuai.xi     }
7753*53ee8cc1Swenshuai.xi     pstIoSignal->s32KerModeTspEvtId = -1;
7754*53ee8cc1Swenshuai.xi 
7755*53ee8cc1Swenshuai.xi     _u32KPrcEvtTblUseFlag &= ~(1 << u32ii);
7756*53ee8cc1Swenshuai.xi     _stKModePrcEvtTbl[u32ii].s32TspEvtId = -1;
7757*53ee8cc1Swenshuai.xi     _stKModePrcEvtTbl[u32ii].tgid = 0;
7758*53ee8cc1Swenshuai.xi 
7759*53ee8cc1Swenshuai.xi #endif
7760*53ee8cc1Swenshuai.xi 
7761*53ee8cc1Swenshuai.xi     return E_TSP_OK;
7762*53ee8cc1Swenshuai.xi }
7763*53ee8cc1Swenshuai.xi 
MDrv_TSP_Wait_IoSignal(DrvTSP_IoSignal * pstIoSignal)7764*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Wait_IoSignal(DrvTSP_IoSignal *pstIoSignal)
7765*53ee8cc1Swenshuai.xi {
7766*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
7767*53ee8cc1Swenshuai.xi     MS_U8 u8Index;
7768*53ee8cc1Swenshuai.xi     MS_S32 s32Ret = 0;
7769*53ee8cc1Swenshuai.xi     MS_U32 u32Event = 0;
7770*53ee8cc1Swenshuai.xi 
7771*53ee8cc1Swenshuai.xi     for(u8Index = 0; u8Index < TSP_MAX_PVRSIGFLAG_NUM; ++u8Index)
7772*53ee8cc1Swenshuai.xi     {
7773*53ee8cc1Swenshuai.xi         pstIoSignal->u32PvrBufFullFlag[u8Index] = 0;
7774*53ee8cc1Swenshuai.xi     }
7775*53ee8cc1Swenshuai.xi 
7776*53ee8cc1Swenshuai.xi     for(u8Index = 0; u8Index < TSP_MAX_SIGFLAG_NUM; ++u8Index)
7777*53ee8cc1Swenshuai.xi     {
7778*53ee8cc1Swenshuai.xi         pstIoSignal->u32SecRdyFlag[u8Index] = 0;
7779*53ee8cc1Swenshuai.xi         pstIoSignal->u32SecOvfFlag[u8Index] = 0;
7780*53ee8cc1Swenshuai.xi         pstIoSignal->u32SecCrcErrFlag[u8Index] = 0;
7781*53ee8cc1Swenshuai.xi     }
7782*53ee8cc1Swenshuai.xi 
7783*53ee8cc1Swenshuai.xi #if 1
7784*53ee8cc1Swenshuai.xi     if((s32Ret = MsOS_WaitEvent_Interrupt(pstIoSignal->s32KerModeTspEvtId, TSP_TASK_EVENTS, &u32Event, E_OR_CLEAR, MSOS_WAIT_FOREVER)) <= 0)
7785*53ee8cc1Swenshuai.xi     {
7786*53ee8cc1Swenshuai.xi         pstIoSignal->u32TspEvt = 0;
7787*53ee8cc1Swenshuai.xi 
7788*53ee8cc1Swenshuai.xi         if(s32Ret < 0) // -ERESTARTSYS
7789*53ee8cc1Swenshuai.xi         {
7790*53ee8cc1Swenshuai.xi             return E_TSP_FAIL_FUNCTION;
7791*53ee8cc1Swenshuai.xi         }
7792*53ee8cc1Swenshuai.xi         else
7793*53ee8cc1Swenshuai.xi         {
7794*53ee8cc1Swenshuai.xi             return E_TSP_FAIL;
7795*53ee8cc1Swenshuai.xi         }
7796*53ee8cc1Swenshuai.xi     }
7797*53ee8cc1Swenshuai.xi #else
7798*53ee8cc1Swenshuai.xi     s32Ret = TSP_GetEvent(_s32EventId, &u32Event, TSP_TASK_EVENTS, E_OR_CLEAR, MSOS_WAIT_FOREVER);
7799*53ee8cc1Swenshuai.xi     if((u32Event & TSP_TASK_EVENTS) == 0)
7800*53ee8cc1Swenshuai.xi     {
7801*53ee8cc1Swenshuai.xi         return E_TSP_FAIL;
7802*53ee8cc1Swenshuai.xi     }
7803*53ee8cc1Swenshuai.xi #endif
7804*53ee8cc1Swenshuai.xi 
7805*53ee8cc1Swenshuai.xi     if(u32Event & TSP_EVENT_TASKEND)
7806*53ee8cc1Swenshuai.xi     {
7807*53ee8cc1Swenshuai.xi         _s32_IsrTaskReturn = TRUE;
7808*53ee8cc1Swenshuai.xi     }
7809*53ee8cc1Swenshuai.xi 
7810*53ee8cc1Swenshuai.xi     pstIoSignal->u32TspEvt = u32Event;
7811*53ee8cc1Swenshuai.xi #endif
7812*53ee8cc1Swenshuai.xi 
7813*53ee8cc1Swenshuai.xi     return E_TSP_OK;
7814*53ee8cc1Swenshuai.xi }
7815*53ee8cc1Swenshuai.xi 
MDrv_TSP_Proc_IoSignal(DrvTSP_IoSignal * pstIoSignal)7816*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Proc_IoSignal(DrvTSP_IoSignal *pstIoSignal)
7817*53ee8cc1Swenshuai.xi {
7818*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
7819*53ee8cc1Swenshuai.xi     MS_U32  fltid, flags = 0, ModeMask, dummy, BaseFlt;
7820*53ee8cc1Swenshuai.xi     MS_U16  i, u16BufId;
7821*53ee8cc1Swenshuai.xi     MS_BOOL bData;
7822*53ee8cc1Swenshuai.xi 
7823*53ee8cc1Swenshuai.xi     if(pstIoSignal->u32TspEvt & TSP_EVENT_FREEFLT)
7824*53ee8cc1Swenshuai.xi     {
7825*53ee8cc1Swenshuai.xi         for (i = 0; i < ((TSP_SECFLT_NUM+31)>>5); i++)
7826*53ee8cc1Swenshuai.xi         {
7827*53ee8cc1Swenshuai.xi             // Add to FREE list
7828*53ee8cc1Swenshuai.xi             TSP_FLAG_GetModeFlags(i, ModeMask); // get CB mode Filter Mask
7829*53ee8cc1Swenshuai.xi             TSP_FLAG_ModeFree(i, ModeMask,&flags, TSP_OS_EVENT_OR_CLEAR);
7830*53ee8cc1Swenshuai.xi 
7831*53ee8cc1Swenshuai.xi             while (flags)
7832*53ee8cc1Swenshuai.xi             {
7833*53ee8cc1Swenshuai.xi                 BaseFlt = MAsm_CPU_GetTrailOne(flags);
7834*53ee8cc1Swenshuai.xi                 fltid = BaseFlt + (i<<5);
7835*53ee8cc1Swenshuai.xi                 TSP_LOCK();
7836*53ee8cc1Swenshuai.xi                 _TSP_FLT_Disable(fltid); // disable output
7837*53ee8cc1Swenshuai.xi                 TSP_UNLOCK();
7838*53ee8cc1Swenshuai.xi                 flags &= ~(1 << BaseFlt);
7839*53ee8cc1Swenshuai.xi                 TSP_FLAG_SetDone(fltid);
7840*53ee8cc1Swenshuai.xi 
7841*53ee8cc1Swenshuai.xi                 // Clear other filter activities
7842*53ee8cc1Swenshuai.xi                 TSP_FLAG_GetFltDis(fltid, &dummy, TSP_OS_EVENT_OR_CLEAR);
7843*53ee8cc1Swenshuai.xi                 TSP_FLAG_GetSecOvf(fltid, &dummy, TSP_OS_EVENT_OR_CLEAR);
7844*53ee8cc1Swenshuai.xi                 TSP_FLAG_GetSecRdy(fltid, &dummy, TSP_OS_EVENT_OR_CLEAR);
7845*53ee8cc1Swenshuai.xi             }
7846*53ee8cc1Swenshuai.xi         }
7847*53ee8cc1Swenshuai.xi     }
7848*53ee8cc1Swenshuai.xi 
7849*53ee8cc1Swenshuai.xi     MsOS_DelayTask(1);
7850*53ee8cc1Swenshuai.xi 
7851*53ee8cc1Swenshuai.xi     // Check all section avaiable filters
7852*53ee8cc1Swenshuai.xi     if (pstIoSignal->u32TspEvt & TSP_EVENT_SECTION)
7853*53ee8cc1Swenshuai.xi     {
7854*53ee8cc1Swenshuai.xi         for (i = 0; i < ((TSP_SECFLT_NUM+31)>>5); i++)
7855*53ee8cc1Swenshuai.xi         {
7856*53ee8cc1Swenshuai.xi             TSP_FLAG_GetModeFlags(i, ModeMask); // get CB mode Filter Mask
7857*53ee8cc1Swenshuai.xi 
7858*53ee8cc1Swenshuai.xi             TSP_FLAG_ModeCrcErr(i, ModeMask,&flags, TSP_OS_EVENT_OR_CLEAR);
7859*53ee8cc1Swenshuai.xi             while (flags)
7860*53ee8cc1Swenshuai.xi             {
7861*53ee8cc1Swenshuai.xi                 //(POLL) Check any possible filter should be disabled
7862*53ee8cc1Swenshuai.xi                 //(TASK) Check only one-shot filter and to disable
7863*53ee8cc1Swenshuai.xi                 BaseFlt = MAsm_CPU_GetTrailOne(flags);
7864*53ee8cc1Swenshuai.xi                 fltid = BaseFlt + (i<<5);
7865*53ee8cc1Swenshuai.xi 
7866*53ee8cc1Swenshuai.xi                 // cause we serve free event before section rdy
7867*53ee8cc1Swenshuai.xi                 if ((_ptsp_res->_tspInfo.FltState[fltid] != E_TSP_FLT_STATE_FREE) && (_ptsp_res->_tspInfo.FltState[fltid] != E_TSP_FLT_STATE_ISR_FREE))
7868*53ee8cc1Swenshuai.xi                 {
7869*53ee8cc1Swenshuai.xi                     if ((_ptsp_res->_tspInfo.FltState[fltid] & E_TSP_FLT_STATE_ENABLE) &&
7870*53ee8cc1Swenshuai.xi                         (_ptsp_res->_tspInfo.FltEvent[fltid] & E_TSP_EVENT_SEC_CRCERROR) &&
7871*53ee8cc1Swenshuai.xi                         (_ptsp_res->_tspInfo.FltCallback[fltid]))
7872*53ee8cc1Swenshuai.xi                     {
7873*53ee8cc1Swenshuai.xi                         pstIoSignal->u32SecCrcErrFlag[i] |= (1UL << (BaseFlt & 0x1FUL));
7874*53ee8cc1Swenshuai.xi                     }
7875*53ee8cc1Swenshuai.xi 
7876*53ee8cc1Swenshuai.xi                 }
7877*53ee8cc1Swenshuai.xi                 flags &= ~(1 << BaseFlt);
7878*53ee8cc1Swenshuai.xi             }
7879*53ee8cc1Swenshuai.xi 
7880*53ee8cc1Swenshuai.xi             TSP_FLAG_ModeSecRdy(i, ModeMask,&flags, TSP_OS_EVENT_OR_CLEAR);
7881*53ee8cc1Swenshuai.xi             while (flags)
7882*53ee8cc1Swenshuai.xi             {
7883*53ee8cc1Swenshuai.xi                 //(POLL) Check any possible filter should be disabled
7884*53ee8cc1Swenshuai.xi                 //(TASK) Check only one-shot filter and to disable
7885*53ee8cc1Swenshuai.xi                 BaseFlt = MAsm_CPU_GetTrailOne(flags);
7886*53ee8cc1Swenshuai.xi                 fltid = BaseFlt + (i<<5);
7887*53ee8cc1Swenshuai.xi 
7888*53ee8cc1Swenshuai.xi                 // cause we serve free event before section rdy
7889*53ee8cc1Swenshuai.xi                 if ((_ptsp_res->_tspInfo.FltState[fltid] != E_TSP_FLT_STATE_FREE) && (_ptsp_res->_tspInfo.FltState[fltid] != E_TSP_FLT_STATE_ISR_FREE))
7890*53ee8cc1Swenshuai.xi                 {
7891*53ee8cc1Swenshuai.xi                     TSP_LOCK();
7892*53ee8cc1Swenshuai.xi                     u16BufId = HAL_TSP_SecFlt_GetSecBuf(&(_REGSec->Flt[fltid]));
7893*53ee8cc1Swenshuai.xi                     bData = (HAL_TSP_SecBuf_GetRead(&(_REGBuf->Buf[u16BufId])) != HAL_TSP_SecBuf_GetWrite(&(_REGBuf->Buf[u16BufId]))) ? TRUE : FALSE;
7894*53ee8cc1Swenshuai.xi                     TSP_UNLOCK();
7895*53ee8cc1Swenshuai.xi 
7896*53ee8cc1Swenshuai.xi                     if(bData)
7897*53ee8cc1Swenshuai.xi                     {
7898*53ee8cc1Swenshuai.xi                         if ((_ptsp_res->_tspInfo.FltState[fltid] & E_TSP_FLT_STATE_ENABLE) &&
7899*53ee8cc1Swenshuai.xi                             (_ptsp_res->_tspInfo.FltEvent[fltid] & E_TSP_EVENT_DATA_READY) &&
7900*53ee8cc1Swenshuai.xi                             (_ptsp_res->_tspInfo.FltCallback[fltid]))
7901*53ee8cc1Swenshuai.xi                         {
7902*53ee8cc1Swenshuai.xi                             pstIoSignal->u32SecRdyFlag[i] |= (1UL << (BaseFlt & 0x1FUL));
7903*53ee8cc1Swenshuai.xi                         }
7904*53ee8cc1Swenshuai.xi 
7905*53ee8cc1Swenshuai.xi                     }
7906*53ee8cc1Swenshuai.xi 
7907*53ee8cc1Swenshuai.xi                     if (TSP_FLAG_GetFltDis(fltid, &dummy, TSP_OS_EVENT_OR_CLEAR))
7908*53ee8cc1Swenshuai.xi                     {
7909*53ee8cc1Swenshuai.xi                         TSP_LOCK();
7910*53ee8cc1Swenshuai.xi                         _TSP_FLT_Disable(fltid);
7911*53ee8cc1Swenshuai.xi                         TSP_UNLOCK();
7912*53ee8cc1Swenshuai.xi                     }
7913*53ee8cc1Swenshuai.xi                 }
7914*53ee8cc1Swenshuai.xi                 flags &= ~(1 << BaseFlt);
7915*53ee8cc1Swenshuai.xi             }
7916*53ee8cc1Swenshuai.xi 
7917*53ee8cc1Swenshuai.xi             TSP_FLAG_ModeSecOvf(i, ModeMask,&flags, TSP_OS_EVENT_OR_CLEAR);
7918*53ee8cc1Swenshuai.xi             while (flags)
7919*53ee8cc1Swenshuai.xi             {
7920*53ee8cc1Swenshuai.xi                 //(POLL) Check any possible filter should be disabled
7921*53ee8cc1Swenshuai.xi                 //(TASK) Check only overflowed filter and to disable
7922*53ee8cc1Swenshuai.xi                 BaseFlt = MAsm_CPU_GetTrailOne(flags);
7923*53ee8cc1Swenshuai.xi                 fltid = BaseFlt + (i<<5);
7924*53ee8cc1Swenshuai.xi 
7925*53ee8cc1Swenshuai.xi                 if ((_ptsp_res->_tspInfo.FltState[fltid] != E_TSP_FLT_STATE_FREE) &&
7926*53ee8cc1Swenshuai.xi                     (_ptsp_res->_tspInfo.FltState[fltid] != E_TSP_FLT_STATE_ISR_FREE) &&
7927*53ee8cc1Swenshuai.xi                     (!TSP_FLAG_GetOvfRst(fltid)))
7928*53ee8cc1Swenshuai.xi                 {
7929*53ee8cc1Swenshuai.xi                     TSP_LOCK();
7930*53ee8cc1Swenshuai.xi                     if (HAL_TSP_PidFlt_GetFltOutput(&(_REGPid1->Flt[fltid])) & TSP_PIDFLT_OUT_SECFLT)
7931*53ee8cc1Swenshuai.xi                     {
7932*53ee8cc1Swenshuai.xi                         _TSP_FLT_Disable(fltid);
7933*53ee8cc1Swenshuai.xi                     }
7934*53ee8cc1Swenshuai.xi                     TSP_FLAG_SetOvfRst(fltid);
7935*53ee8cc1Swenshuai.xi                     TSP_UNLOCK();
7936*53ee8cc1Swenshuai.xi 
7937*53ee8cc1Swenshuai.xi                     TSP_FLAG_GetFltDis(fltid, &dummy, TSP_OS_EVENT_OR_CLEAR);
7938*53ee8cc1Swenshuai.xi 
7939*53ee8cc1Swenshuai.xi                     if ((_ptsp_res->_tspInfo.FltEvent[fltid] & E_TSP_EVENT_BUF_OVERFLOW) &&
7940*53ee8cc1Swenshuai.xi                         (_ptsp_res->_tspInfo.FltCallback[fltid]))
7941*53ee8cc1Swenshuai.xi                     {
7942*53ee8cc1Swenshuai.xi                         pstIoSignal->u32SecOvfFlag[i] |= (1UL << (BaseFlt & 0x1FUL));
7943*53ee8cc1Swenshuai.xi                     }
7944*53ee8cc1Swenshuai.xi                 }
7945*53ee8cc1Swenshuai.xi                 flags &= ~(1 << BaseFlt);
7946*53ee8cc1Swenshuai.xi                 // Clear other filter activities
7947*53ee8cc1Swenshuai.xi                 TSP_FLAG_GetSecRdy(fltid, &dummy, TSP_OS_EVENT_OR_CLEAR); // Clear section ready also
7948*53ee8cc1Swenshuai.xi             }
7949*53ee8cc1Swenshuai.xi 
7950*53ee8cc1Swenshuai.xi             MsOS_DelayTask(1);
7951*53ee8cc1Swenshuai.xi         }
7952*53ee8cc1Swenshuai.xi     }
7953*53ee8cc1Swenshuai.xi 
7954*53ee8cc1Swenshuai.xi     MsOS_DelayTask(1);
7955*53ee8cc1Swenshuai.xi 
7956*53ee8cc1Swenshuai.xi     if (pstIoSignal->u32TspEvt & TSP_EVENT_DISABLEFLT) //Disable Polling mode filter,CB mode filter disable at SecRdy or SecOvf
7957*53ee8cc1Swenshuai.xi     {
7958*53ee8cc1Swenshuai.xi         for (i = 0; i < ((TSP_SECFLT_NUM+31)>>5); i++)
7959*53ee8cc1Swenshuai.xi         {
7960*53ee8cc1Swenshuai.xi             TSP_FLAG_GetModeFlags(i, ModeMask); // get CB mode Filter Mask
7961*53ee8cc1Swenshuai.xi             TSP_FLAG_ModeFltDis(i,~ModeMask, &flags ,TSP_OS_EVENT_OR_CLEAR); // Polling mode
7962*53ee8cc1Swenshuai.xi             while (flags)
7963*53ee8cc1Swenshuai.xi             {
7964*53ee8cc1Swenshuai.xi                 BaseFlt = MAsm_CPU_GetTrailOne(flags);
7965*53ee8cc1Swenshuai.xi                 fltid = BaseFlt + (i<<5);
7966*53ee8cc1Swenshuai.xi                 if (TSP_FLAG_GetFltDis(fltid, &dummy, TSP_OS_EVENT_OR_CLEAR))
7967*53ee8cc1Swenshuai.xi                 {
7968*53ee8cc1Swenshuai.xi                     TSP_LOCK();
7969*53ee8cc1Swenshuai.xi                     _TSP_FLT_Disable(fltid); // disable output
7970*53ee8cc1Swenshuai.xi                     TSP_UNLOCK();
7971*53ee8cc1Swenshuai.xi                 }
7972*53ee8cc1Swenshuai.xi                 flags &= ~(1 << BaseFlt);
7973*53ee8cc1Swenshuai.xi             }
7974*53ee8cc1Swenshuai.xi         }
7975*53ee8cc1Swenshuai.xi     }
7976*53ee8cc1Swenshuai.xi 
7977*53ee8cc1Swenshuai.xi #endif
7978*53ee8cc1Swenshuai.xi 
7979*53ee8cc1Swenshuai.xi     return E_TSP_OK;
7980*53ee8cc1Swenshuai.xi }
7981*53ee8cc1Swenshuai.xi 
7982*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
7983*53ee8cc1Swenshuai.xi 
MDrv_TSP_Ree_TeeCmdSystem_Init()7984*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Ree_TeeCmdSystem_Init()
7985*53ee8cc1Swenshuai.xi {
7986*53ee8cc1Swenshuai.xi     MDrv_SYS_ReadKernelCmdLine();
7987*53ee8cc1Swenshuai.xi     MDrv_SYS_GetTEEInfo(&_ptsp_res->_teemode);
7988*53ee8cc1Swenshuai.xi     //printf("[%s][%d] _teemode %x \n", __FUNCTION__, __LINE__, (int)_ptsp_res->_teemode.OsType);
7989*53ee8cc1Swenshuai.xi 
7990*53ee8cc1Swenshuai.xi     //_ptsp_res->_teemode.OsType = SYS_TEEINFO_OSTYPE_OPTEE;
7991*53ee8cc1Swenshuai.xi     if(_ptsp_res->_teemode.OsType == SYS_TEEINFO_OSTYPE_NUTTX)
7992*53ee8cc1Swenshuai.xi     {
7993*53ee8cc1Swenshuai.xi         if(_TSP_REE_RegisterMBX() == FALSE)
7994*53ee8cc1Swenshuai.xi         {
7995*53ee8cc1Swenshuai.xi             MS_DEBUG_MSG(TSP_DBG ("[%s] Register Mailbox failed!\n", __FUNCTION__));
7996*53ee8cc1Swenshuai.xi             return E_TSP_FAIL;
7997*53ee8cc1Swenshuai.xi         }
7998*53ee8cc1Swenshuai.xi     }
7999*53ee8cc1Swenshuai.xi 
8000*53ee8cc1Swenshuai.xi     return E_TSP_OK;
8001*53ee8cc1Swenshuai.xi }
8002*53ee8cc1Swenshuai.xi 
MDrv_TSP_Ree_TeeCmdSystem_Exit()8003*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Ree_TeeCmdSystem_Exit()
8004*53ee8cc1Swenshuai.xi {
8005*53ee8cc1Swenshuai.xi     _bTSPMbxInitFlag = FALSE;
8006*53ee8cc1Swenshuai.xi     _u8TSPMbxMsgClass = 0;
8007*53ee8cc1Swenshuai.xi 
8008*53ee8cc1Swenshuai.xi     return E_TSP_OK;
8009*53ee8cc1Swenshuai.xi }
8010*53ee8cc1Swenshuai.xi 
MDrv_TSP_Ree_SendTeeCmd(TSP_REE_TO_TEE_CMD_TYPE cmd_type,void * param,size_t datasize)8011*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Ree_SendTeeCmd(TSP_REE_TO_TEE_CMD_TYPE cmd_type, void* param, size_t datasize)
8012*53ee8cc1Swenshuai.xi {
8013*53ee8cc1Swenshuai.xi 
8014*53ee8cc1Swenshuai.xi     if(_ptsp_res->_teemode.OsType == SYS_TEEINFO_OSTYPE_NUTTX)
8015*53ee8cc1Swenshuai.xi     {
8016*53ee8cc1Swenshuai.xi         if(_TSP_Ree_SendMBXMsg(cmd_type, param) == TRUE)
8017*53ee8cc1Swenshuai.xi             return E_TSP_OK;
8018*53ee8cc1Swenshuai.xi         else
8019*53ee8cc1Swenshuai.xi             return E_TSP_FAIL;
8020*53ee8cc1Swenshuai.xi     }
8021*53ee8cc1Swenshuai.xi     else if(_ptsp_res->_teemode.OsType == SYS_TEEINFO_OSTYPE_OPTEE)
8022*53ee8cc1Swenshuai.xi     {
8023*53ee8cc1Swenshuai.xi         unsigned int ret, ret_orig= 0;
8024*53ee8cc1Swenshuai.xi 
8025*53ee8cc1Swenshuai.xi         if ((ret = MDrv_SYS_TEEC_InitializeContext(_dmx_device, &dmx_mstar_teec_ctx)) != TEEC_SUCCESS)
8026*53ee8cc1Swenshuai.xi         {
8027*53ee8cc1Swenshuai.xi             printf("%s %d: Init Context failed, err code: %x\n",__FUNCTION__,__LINE__, (int)ret);
8028*53ee8cc1Swenshuai.xi             return E_TSP_FAIL;
8029*53ee8cc1Swenshuai.xi         }
8030*53ee8cc1Swenshuai.xi         if ((ret = MDrv_SYS_TEEC_Open(&dmx_mstar_teec_ctx, &dmx_session, &dmx_uuid, TEEC_LOGIN_PUBLIC, NULL, NULL, &ret_orig)) != TEEC_SUCCESS)
8031*53ee8cc1Swenshuai.xi         {
8032*53ee8cc1Swenshuai.xi             printf("%s %d: TEEC Open session failed, err code: %x\n",__FUNCTION__,__LINE__, (int)ret);
8033*53ee8cc1Swenshuai.xi             return E_TSP_FAIL;
8034*53ee8cc1Swenshuai.xi         }
8035*53ee8cc1Swenshuai.xi 
8036*53ee8cc1Swenshuai.xi         if(datasize == 0)
8037*53ee8cc1Swenshuai.xi         {
8038*53ee8cc1Swenshuai.xi             dmx_op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE,TEEC_NONE, TEEC_NONE);
8039*53ee8cc1Swenshuai.xi         }
8040*53ee8cc1Swenshuai.xi         else
8041*53ee8cc1Swenshuai.xi         {
8042*53ee8cc1Swenshuai.xi             dmx_op.params[0].tmpref.buffer = param;
8043*53ee8cc1Swenshuai.xi             dmx_op.params[0].tmpref.size = datasize;
8044*53ee8cc1Swenshuai.xi             dmx_op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
8045*53ee8cc1Swenshuai.xi         }
8046*53ee8cc1Swenshuai.xi 
8047*53ee8cc1Swenshuai.xi         if ((ret = MDrv_SYS_TEEC_InvokeCmd(&dmx_session, cmd_type, &dmx_op, &ret_orig)) != TEEC_SUCCESS)
8048*53ee8cc1Swenshuai.xi         {
8049*53ee8cc1Swenshuai.xi             printf("%s %d: TEEC Invoke command failed, err code: %x\n",__FUNCTION__,__LINE__, (int)ret);
8050*53ee8cc1Swenshuai.xi         }
8051*53ee8cc1Swenshuai.xi         MDrv_SYS_TEEC_Close(&dmx_session);
8052*53ee8cc1Swenshuai.xi         MDrv_SYS_TEEC_FinalizeContext(&dmx_mstar_teec_ctx);
8053*53ee8cc1Swenshuai.xi         if(ret == TEEC_SUCCESS)
8054*53ee8cc1Swenshuai.xi         {
8055*53ee8cc1Swenshuai.xi             return E_TSP_OK;
8056*53ee8cc1Swenshuai.xi         }
8057*53ee8cc1Swenshuai.xi     }
8058*53ee8cc1Swenshuai.xi 
8059*53ee8cc1Swenshuai.xi     return E_TSP_FAIL;
8060*53ee8cc1Swenshuai.xi }
8061*53ee8cc1Swenshuai.xi 
8062*53ee8cc1Swenshuai.xi #endif //SECURE_PVR_ENABLE
8063