1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi // Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi // No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi // modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi // supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi // Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi // Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi // obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi // such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi // MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi // confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi // third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi // kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi // without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi // intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi // and in conformity with any international standard. You agree to waive any
38*53ee8cc1Swenshuai.xi // claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi // incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi // In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi // consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi // revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi // You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi // even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi // request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi // parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi // services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi // MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi // ("Services").
52*53ee8cc1Swenshuai.xi // You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi // writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi // disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi // or otherwise:
58*53ee8cc1Swenshuai.xi // (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi // mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi // (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi // including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi // of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi // (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi // of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi // Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi // settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi // Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi // with the said Rules.
72*53ee8cc1Swenshuai.xi // The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi // be English.
74*53ee8cc1Swenshuai.xi // The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2008-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 drvTSP.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
105*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
106*53ee8cc1Swenshuai.xi // Include Files
107*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
108*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
109*53ee8cc1Swenshuai.xi #include <linux/sched.h>
110*53ee8cc1Swenshuai.xi #include <linux/wait.h>
111*53ee8cc1Swenshuai.xi #include <linux/string.h>
112*53ee8cc1Swenshuai.xi #else
113*53ee8cc1Swenshuai.xi #include <string.h>
114*53ee8cc1Swenshuai.xi #endif
115*53ee8cc1Swenshuai.xi
116*53ee8cc1Swenshuai.xi // Common Definition
117*53ee8cc1Swenshuai.xi #include "MsCommon.h"
118*53ee8cc1Swenshuai.xi #include "MsVersion.h"
119*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
120*53ee8cc1Swenshuai.xi #include "drvSYS.h"
121*53ee8cc1Swenshuai.xi
122*53ee8cc1Swenshuai.xi // Internal Definition
123*53ee8cc1Swenshuai.xi #include "asmCPU.h"
124*53ee8cc1Swenshuai.xi #include "osalTSP.h"
125*53ee8cc1Swenshuai.xi #include "halTSP.h"
126*53ee8cc1Swenshuai.xi #include "drvTSP.h"
127*53ee8cc1Swenshuai.xi #include "ULog.h"
128*53ee8cc1Swenshuai.xi
129*53ee8cc1Swenshuai.xi #if DMX_DEBUG
130*53ee8cc1Swenshuai.xi #include "../../api/dmx/Internal_DMX_debug.h"
131*53ee8cc1Swenshuai.xi #endif
132*53ee8cc1Swenshuai.xi
133*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
134*53ee8cc1Swenshuai.xi #include <sys/ioctl.h>
135*53ee8cc1Swenshuai.xi #include <unistd.h>
136*53ee8cc1Swenshuai.xi #include <fcntl.h> // O_RDWR
137*53ee8cc1Swenshuai.xi #include "mdrv_firmware_io.h"
138*53ee8cc1Swenshuai.xi #endif
139*53ee8cc1Swenshuai.xi
140*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
141*53ee8cc1Swenshuai.xi // Driver Compiler Options
142*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
143*53ee8cc1Swenshuai.xi
144*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
145*53ee8cc1Swenshuai.xi // Global Variables
146*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
147*53ee8cc1Swenshuai.xi
148*53ee8cc1Swenshuai.xi
149*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
150*53ee8cc1Swenshuai.xi // Local Defines
151*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
152*53ee8cc1Swenshuai.xi #define _TSP_SetEvent(flag) OSAL_TSP_EventSet(_s32TspEventId, (flag))
153*53ee8cc1Swenshuai.xi #define _TSP_GetEvent(events, flag, opt, timeout) OSAL_TSP_EventGet(_s32TspEventId, (flag), &(events), (opt), (timeout))
154*53ee8cc1Swenshuai.xi
155*53ee8cc1Swenshuai.xi #define _TSP_SetSecRdyId(fltid) OSAL_TSP_EventSet(_s32TspSecRdyId[fltid>>5UL], (1UL<<(fltid&0x1FUL)))
156*53ee8cc1Swenshuai.xi #define _TSP_GetSecRdyId(fltid, events, opt) OSAL_TSP_EventGet(_s32TspSecRdyId[fltid>>5UL], (1UL<<(fltid&0x1FUL)), (events), (opt), 0)
157*53ee8cc1Swenshuai.xi #define _TSP_GetModeSecRdy(idx, mask,events, opt) OSAL_TSP_EventGet(_s32TspSecRdyId[idx], mask, (events), (opt), 0)
158*53ee8cc1Swenshuai.xi
159*53ee8cc1Swenshuai.xi #define _TSP_SetSecOvfId(fltid) OSAL_TSP_EventSet(_s32TspSecOvfId[fltid>>5UL], (1UL<<(fltid&0x1FUL)))
160*53ee8cc1Swenshuai.xi #define _TSP_GetSecOvfId(fltid, events, opt) OSAL_TSP_EventGet(_s32TspSecOvfId[fltid>>5UL], (1UL<<(fltid&0x1FUL)), (events), (opt), 0)
161*53ee8cc1Swenshuai.xi #define _TSP_GetModeSecOvf(idx, mask,events, opt) OSAL_TSP_EventGet(_s32TspSecOvfId[idx], mask, (events), (opt), 0)
162*53ee8cc1Swenshuai.xi
163*53ee8cc1Swenshuai.xi #define _TSP_SetSecCrcId(fltid) OSAL_TSP_EventSet(_s32TspSecCrcId[fltid>>5UL], (1UL<<(fltid&0x1FUL)))
164*53ee8cc1Swenshuai.xi #define _TSP_GetSecCrcId(fltid, events, opt) OSAL_TSP_EventGet(_s32TspSecCrcId[fltid>>5UL], (1UL<<(fltid&0x1FUL)), (events), (opt), 0)
165*53ee8cc1Swenshuai.xi #define _TSP_GetModeSecCrc(idx, mask,events, opt) OSAL_TSP_EventGet(_s32TspSecCrcId[idx], mask, (events), (opt), 0)
166*53ee8cc1Swenshuai.xi
167*53ee8cc1Swenshuai.xi #define _TSP_SetFltDisableId(fltid) OSAL_TSP_EventSet(_s32TspFltDisableId[fltid>>5UL], (1UL<<(fltid&0x1FUL)))
168*53ee8cc1Swenshuai.xi #define _TSP_GetFltDisableId(fltid, events, opt) OSAL_TSP_EventGet(_s32TspFltDisableId[fltid>>5UL], (1UL<<(fltid&0x1FUL)), (events), (opt), 0)
169*53ee8cc1Swenshuai.xi #define _TSP_GetModeFltDisable(idx, mask,events, opt) OSAL_TSP_EventGet(_s32TspFltDisableId[idx], mask, (events), (opt), 0)
170*53ee8cc1Swenshuai.xi
171*53ee8cc1Swenshuai.xi #if 0
172*53ee8cc1Swenshuai.xi #define _TSP_FLAG_FREE_TIMEOUT 4
173*53ee8cc1Swenshuai.xi #define _TSP_SetEventFree0Id(fltid) OSAL_TSP_EventSet(_s32EventFree0[fltid>>5], (1<<(fltid&0x1F)))
174*53ee8cc1Swenshuai.xi #define _TSP_GetEventFree0Id(fltid, events, opt) OSAL_TSP_EventGet(_s32EventFree0[fltid>>5], (1<<(fltid&0x1F)), (events), (opt), 0)
175*53ee8cc1Swenshuai.xi #define _TSP_GetModeEventFree0(idx, mask,events, opt) OSAL_TSP_EventGet(_s32EventFree0[idx], mask, (events), (opt), 0)
176*53ee8cc1Swenshuai.xi #define _TSP_FLAG_SetDone(fltid) OSAL_TSP_EventSet(_s32DoneFlags[fltid>>5], (1<<(fltid&0x1F)))
177*53ee8cc1Swenshuai.xi #define _TSP_FLAG_GetDone(fltid, events, opt) OSAL_TSP_EventGet(_s32DoneFlags[fltid>>5], (1<<(fltid&0x1F)), (events), (opt), _TSP_FLAG_FREE_TIMEOUT)
178*53ee8cc1Swenshuai.xi
179*53ee8cc1Swenshuai.xi #define _TSP_SetEventFreeDefer0Id(fltid) OSAL_TSP_EventSet(_s32EventFreeDefer0[fltid>>5], (1<<(fltid&0x1F)))
180*53ee8cc1Swenshuai.xi #define _TSP_GetEventFreeDefer0Id(fltid, events, opt) OSAL_TSP_EventGet(_s32EventFreeDefer0[fltid>>5], (1<<(fltid&0x1F)), (events), (opt), 0)
181*53ee8cc1Swenshuai.xi #define _TSP_GetEventFreeDefer0(idx, mask,events, opt) OSAL_TSP_EventGet(_s32EventFreeDefer0[idx], mask, (events), (opt), 0)
182*53ee8cc1Swenshuai.xi #endif
183*53ee8cc1Swenshuai.xi
184*53ee8cc1Swenshuai.xi // for mutiple process using, record which filter is enabled by this process
185*53ee8cc1Swenshuai.xi #define _TSP_SetSecNotifyId(fltid) (_u32SecNotifyId[(fltid>>5UL)] |= (1 << (fltid&0x1FUL)))
186*53ee8cc1Swenshuai.xi #define _TSP_RemoveSecNotifyId(fltid) (_u32SecNotifyId[(fltid>>5UL)] &= ~(1 << (fltid&0x1FUL)))
187*53ee8cc1Swenshuai.xi #define _TSP_ChkSecNotifyId(fltid) (_u32SecNotifyId[(fltid>>5UL)] & (1 << (fltid&0x1FUL)))
188*53ee8cc1Swenshuai.xi
189*53ee8cc1Swenshuai.xi // for mutiple process using, record which pvr engine is enabled by this process
190*53ee8cc1Swenshuai.xi #ifndef NO_PVR
191*53ee8cc1Swenshuai.xi #define _TSP_SetPvrNotifyId(fltid) (_u32PvrNotifyId[(fltid>>5UL)] |= (1 << (fltid&0x1FUL)))
192*53ee8cc1Swenshuai.xi #define _TSP_RemovePvrNotifyId(fltid) (_u32PvrNotifyId[(fltid>>5UL)] &= ~(1 << (fltid&0x1FUL)))
193*53ee8cc1Swenshuai.xi #define _TSP_ChkPvrNotifyId(fltid) (_u32PvrNotifyId[(fltid>>5UL)] & (1 << (fltid&0x1FUL)))
194*53ee8cc1Swenshuai.xi #endif
195*53ee8cc1Swenshuai.xi
196*53ee8cc1Swenshuai.xi // for mutiple process using, record which hw pcr is enabled by this process
197*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
198*53ee8cc1Swenshuai.xi #define _TSP_SetHwPcrNotifyId(fltid) (_u32HwPcrNotifyId[(fltid>>5UL)] |= (1 << (fltid&0x1FUL)))
199*53ee8cc1Swenshuai.xi #define _TSP_RemoveHwPcrNotifyId(fltid) (_u32HwPcrNotifyId[(fltid>>5UL)] &= ~(1 << (fltid&0x1FUL)))
200*53ee8cc1Swenshuai.xi #define _TSP_ChkHwPcrNotifyId(fltid) (_u32HwPcrNotifyId[(fltid>>5UL)] & (1 << (fltid&0x1FUL)))
201*53ee8cc1Swenshuai.xi #endif
202*53ee8cc1Swenshuai.xi
203*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
204*53ee8cc1Swenshuai.xi #define _TSP_GET_SECFLT_REG(fltid) ((fltid<TSP_SECFLT_NUM)? (&(_TspSec[0].Flt[fltid])):(&(_TspSec2[0].Flt[fltid-TSP_SECFLT_NUM])))
205*53ee8cc1Swenshuai.xi #else
206*53ee8cc1Swenshuai.xi #define _TSP_GET_SECFLT_REG(fltid) (&(_TspSec[0].Flt[fltid]))
207*53ee8cc1Swenshuai.xi #endif
208*53ee8cc1Swenshuai.xi
209*53ee8cc1Swenshuai.xi #define _TSP_MUTEX_TIMEOUT 10000UL //OSAL_TSP_MUTEX_TIMEOUT
210*53ee8cc1Swenshuai.xi
211*53ee8cc1Swenshuai.xi #define _TSP_ENTRY() do { \
212*53ee8cc1Swenshuai.xi while (!OSAL_TSP_MutexObtain(_ptsp_res->_s32TspMutexId , _TSP_MUTEX_TIMEOUT)) \
213*53ee8cc1Swenshuai.xi { \
214*53ee8cc1Swenshuai.xi _ptsp_res->_u32LastErr = DRVTSP_FUNC_ERROR; \
215*53ee8cc1Swenshuai.xi ULOGE("TSP", "[%s][%d] TSP mutex get error\n", __FUNCTION__, __LINE__); \
216*53ee8cc1Swenshuai.xi MsOS_DelayTask(1); \
217*53ee8cc1Swenshuai.xi } \
218*53ee8cc1Swenshuai.xi while(!OSAL_TSP_MutexObtain(_ptsp_res->_s32IndMutexId, _TSP_MUTEX_TIMEOUT)) \
219*53ee8cc1Swenshuai.xi { \
220*53ee8cc1Swenshuai.xi _ptsp_res->_u32LastErr = DRVTSP_FUNC_ERROR; \
221*53ee8cc1Swenshuai.xi ULOGE("TSP", "[%s][%d] IND mutex get error\n", __FUNCTION__, __LINE__); \
222*53ee8cc1Swenshuai.xi MsOS_DelayTask(1); \
223*53ee8cc1Swenshuai.xi } \
224*53ee8cc1Swenshuai.xi }while(0);
225*53ee8cc1Swenshuai.xi
226*53ee8cc1Swenshuai.xi #define _TSP_RETURN(_ret) do { \
227*53ee8cc1Swenshuai.xi if(!OSAL_TSP_MutexRelease(_ptsp_res->_s32IndMutexId)) \
228*53ee8cc1Swenshuai.xi { \
229*53ee8cc1Swenshuai.xi if (_u32TSPDGBLevel >= E_DRVTSP_DBG_L1) { ULOGE("TSP", "[%s][%d] IND mutex free error\n", __FUNCTION__, __LINE__);} \
230*53ee8cc1Swenshuai.xi } \
231*53ee8cc1Swenshuai.xi if(!OSAL_TSP_MutexRelease(_ptsp_res->_s32TspMutexId)) \
232*53ee8cc1Swenshuai.xi { \
233*53ee8cc1Swenshuai.xi if (_u32TSPDGBLevel >= E_DRVTSP_DBG_L1) {ULOGE("TSP", "[%s][%d] TSP mutex free error\n", __FUNCTION__, __LINE__); } \
234*53ee8cc1Swenshuai.xi } \
235*53ee8cc1Swenshuai.xi if (_ret != DRVTSP_OK) { _ptsp_res->_u32LastErr = _ret; } \
236*53ee8cc1Swenshuai.xi return _ret; \
237*53ee8cc1Swenshuai.xi }while(0); // Should be optimized by compiler
238*53ee8cc1Swenshuai.xi
239*53ee8cc1Swenshuai.xi #define _TSP_IND_LOCK() while(!OSAL_TSP_MutexObtain(_ptsp_res->_s32IndMutexId, _TSP_MUTEX_TIMEOUT)) \
240*53ee8cc1Swenshuai.xi { \
241*53ee8cc1Swenshuai.xi ULOGE("TSP", "[%s][%d] IND mutex get error\n", __FUNCTION__, __LINE__); \
242*53ee8cc1Swenshuai.xi MsOS_DelayTask(1); \
243*53ee8cc1Swenshuai.xi }
244*53ee8cc1Swenshuai.xi
245*53ee8cc1Swenshuai.xi #define _TSP_IND_UNLOCK() if(!OSAL_TSP_MutexRelease(_ptsp_res->_s32IndMutexId)) \
246*53ee8cc1Swenshuai.xi { \
247*53ee8cc1Swenshuai.xi ULOGE("TSP", "[%s][%d] IND mutex free error\n", __FUNCTION__, __LINE__); \
248*53ee8cc1Swenshuai.xi }
249*53ee8cc1Swenshuai.xi
250*53ee8cc1Swenshuai.xi #define _TSP_INT_LOCK() while(!OSAL_TSP_MutexObtain(_ptsp_res->_s32IntRegMutexId, _TSP_MUTEX_TIMEOUT)) \
251*53ee8cc1Swenshuai.xi { \
252*53ee8cc1Swenshuai.xi ULOGE("TSP", "[%s][%d] INT mutex get error\n", __FUNCTION__, __LINE__); \
253*53ee8cc1Swenshuai.xi MsOS_DelayTask(1); \
254*53ee8cc1Swenshuai.xi }
255*53ee8cc1Swenshuai.xi
256*53ee8cc1Swenshuai.xi #define _TSP_INT_UNLOCK() if(!OSAL_TSP_MutexRelease(_ptsp_res->_s32IntRegMutexId)) \
257*53ee8cc1Swenshuai.xi { \
258*53ee8cc1Swenshuai.xi ULOGE("TSP", "[%s][%d] INT mutex free error\n", __FUNCTION__, __LINE__); \
259*53ee8cc1Swenshuai.xi }
260*53ee8cc1Swenshuai.xi
261*53ee8cc1Swenshuai.xi #define _TSP_EXT_LOCK() while(!OSAL_TSP_MutexObtain(_s32ExtMutexId, _TSP_MUTEX_TIMEOUT)) \
262*53ee8cc1Swenshuai.xi { \
263*53ee8cc1Swenshuai.xi ULOGE("TSP", "[%s][%d] EXT mutex get error\n", __FUNCTION__, __LINE__); \
264*53ee8cc1Swenshuai.xi MsOS_DelayTask(1); \
265*53ee8cc1Swenshuai.xi }
266*53ee8cc1Swenshuai.xi
267*53ee8cc1Swenshuai.xi #define _TSP_EXT_UNLOCK() if(!OSAL_TSP_MutexRelease(_s32ExtMutexId)){ \
268*53ee8cc1Swenshuai.xi ULOGE("TSP", "[%s][%d] EXT mutex free error\n", __FUNCTION__, __LINE__); \
269*53ee8cc1Swenshuai.xi }
270*53ee8cc1Swenshuai.xi
271*53ee8cc1Swenshuai.xi #define TSP_ASSERT(_bool, _f) if(!(_bool)) { \
272*53ee8cc1Swenshuai.xi if (_u32TSPDGBLevel == E_DRVTSP_DBG_L1) { (_f); return DRVTSP_FAIL;} \
273*53ee8cc1Swenshuai.xi else if (_u32TSPDGBLevel == E_DRVTSP_DBG_L2) { (_f); ULOGE("TSP", "[%s][%d] ASSERT %d\n", __FUNCTION__, __LINE__,(unsigned int)MsOS_GetSystemTime()); MsOS_DelayTask(MSOS_WAIT_FOREVER); return DRVTSP_FAIL;} \
274*53ee8cc1Swenshuai.xi else { return DRVTSP_FAIL; } \
275*53ee8cc1Swenshuai.xi }while(0);
276*53ee8cc1Swenshuai.xi
277*53ee8cc1Swenshuai.xi #define TSP_ASSERT2(_bool, _f) if(!(_bool)) { \
278*53ee8cc1Swenshuai.xi if (_u32TSPDGBLevel == E_DRVTSP_DBG_L1) { (_f); _TSP_RETURN(DRVTSP_FAIL);} \
279*53ee8cc1Swenshuai.xi else if (_u32TSPDGBLevel == E_DRVTSP_DBG_L2) { (_f); ULOGE("TSP", "[%s][%d] ASSERT2 %d\n", __FUNCTION__, __LINE__,(unsigned int)MsOS_GetSystemTime()); MsOS_DelayTask(MSOS_WAIT_FOREVER); _TSP_RETURN(DRVTSP_FAIL);} \
280*53ee8cc1Swenshuai.xi else { _TSP_RETURN(DRVTSP_FAIL);} \
281*53ee8cc1Swenshuai.xi }while(0);
282*53ee8cc1Swenshuai.xi #define TSP_DBG(_f, _a...) { if ((_u32TSPDGBLevel == E_DRVTSP_DBG_L1)||(_u32TSPDGBLevel == E_DRVTSP_DBG_L2)) { OSAL_TSP_Print("[TSP_DBG]"); OSAL_TSP_Print(_f, ##_a); } }
283*53ee8cc1Swenshuai.xi
284*53ee8cc1Swenshuai.xi
285*53ee8cc1Swenshuai.xi #define DRVTSP_MAP_NULL 0xFFFFFFFFUL
286*53ee8cc1Swenshuai.xi
287*53ee8cc1Swenshuai.xi #define PVRCA_DBG(x) //x
288*53ee8cc1Swenshuai.xi
289*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
290*53ee8cc1Swenshuai.xi // Local Structures
291*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
292*53ee8cc1Swenshuai.xi
293*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
294*53ee8cc1Swenshuai.xi // HW architecture 1-1: 0~31: pid filters. 32~47: PVR filters.
295*53ee8cc1Swenshuai.xi // HW architecture 1-2: For Extend filter support, 0~63: pid filters, 64~83: PVR pid filter
296*53ee8cc1Swenshuai.xi // HW architecture 3 : General pid filters 0~127, only 0~63 for section filter
297*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
298*53ee8cc1Swenshuai.xi typedef struct _DrvTSP_State
299*53ee8cc1Swenshuai.xi {
300*53ee8cc1Swenshuai.xi DrvTSP_SW_Status TSPStatus;
301*53ee8cc1Swenshuai.xi DrvTSP_FltState FltState[TSP_PIDFLT_NUM_ALL];
302*53ee8cc1Swenshuai.xi DrvTSP_FltType FltType[TSP_PIDFLT_NUM_ALL];
303*53ee8cc1Swenshuai.xi MS_U32 FltSource[TSP_PIDFLT_NUM_ALL];
304*53ee8cc1Swenshuai.xi MS_U32 FltMap[TSP_PIDFLT_NUM_ALL];
305*53ee8cc1Swenshuai.xi DrvTSP_FltState SecFltState[TSP_SECFLT_NUM_All];
306*53ee8cc1Swenshuai.xi DrvTSP_Event SecFltEvtNotify[TSP_SECFLT_NUM_All];
307*53ee8cc1Swenshuai.xi P_DrvTSP_EvtCallback SecFltCallback[TSP_SECFLT_NUM_All];
308*53ee8cc1Swenshuai.xi DrvTSP_FltState SecBufState[TSP_SECFLT_NUM_All];
309*53ee8cc1Swenshuai.xi DrvTSP_FltMode SecFltMode[TSP_SECFLT_NUM_All];
310*53ee8cc1Swenshuai.xi } DrvTSP_State;
311*53ee8cc1Swenshuai.xi
312*53ee8cc1Swenshuai.xi typedef struct _DrvTSP_FW_DBG_INFO
313*53ee8cc1Swenshuai.xi {
314*53ee8cc1Swenshuai.xi MS_PHY phyBufAddr;
315*53ee8cc1Swenshuai.xi MS_U32 u32Size;
316*53ee8cc1Swenshuai.xi MS_U32 u32ReadPos;
317*53ee8cc1Swenshuai.xi MS_U32 u32WritePos;
318*53ee8cc1Swenshuai.xi MS_BOOL bEnable;
319*53ee8cc1Swenshuai.xi } DrvTSP_FW_DBG_INFO;
320*53ee8cc1Swenshuai.xi
321*53ee8cc1Swenshuai.xi #ifndef NO_PVR
322*53ee8cc1Swenshuai.xi typedef struct _DrvTSP_PVRCAParams
323*53ee8cc1Swenshuai.xi {
324*53ee8cc1Swenshuai.xi #ifndef NO_CA
325*53ee8cc1Swenshuai.xi MS_U16 _u16Flt1PidList[TSP_PIDFLT1_NUM]; //PIDs of PVR1 group filters
326*53ee8cc1Swenshuai.xi MS_U16 _u16Flt0DscmbPidList[DSCMB_FLT_NUM_ALL]; //PIDs of TS0 DSCMB group filters
327*53ee8cc1Swenshuai.xi MS_U32 _u32Flt1Flag_DscmbPVR; //bit flag of filter that are recording in PVR1 group filters
328*53ee8cc1Swenshuai.xi MS_U32 _u32Flt1Flag_DscmbRef; //bit flag of filter that are live descrambling PVR1 group filters
329*53ee8cc1Swenshuai.xi MS_BOOL _bFLT1Dup_Enable;
330*53ee8cc1Swenshuai.xi MS_BOOL _bCIPHSSMode;
331*53ee8cc1Swenshuai.xi MS_U16 _u16Flt2PidList[DSCMB_FLT_NUM_ALL];
332*53ee8cc1Swenshuai.xi #endif //end of NO_CA
333*53ee8cc1Swenshuai.xi
334*53ee8cc1Swenshuai.xi MS_BOOL _bPVRCA_Start;
335*53ee8cc1Swenshuai.xi
336*53ee8cc1Swenshuai.xi }DrvTSP_PVRCAParams;
337*53ee8cc1Swenshuai.xi #endif //end of NO_PVR
338*53ee8cc1Swenshuai.xi
339*53ee8cc1Swenshuai.xi typedef struct _TSP_RESOURCE_PRIVATE
340*53ee8cc1Swenshuai.xi {
341*53ee8cc1Swenshuai.xi MS_S32 _s32TspMutexId;
342*53ee8cc1Swenshuai.xi MS_S32 _s32IndMutexId;
343*53ee8cc1Swenshuai.xi MS_S32 _s32IntRegMutexId;
344*53ee8cc1Swenshuai.xi
345*53ee8cc1Swenshuai.xi MS_U32 _u32LastErr;
346*53ee8cc1Swenshuai.xi MS_BOOL _bSuspend;
347*53ee8cc1Swenshuai.xi DrvTSP_State _TspState[TSP_ENGINE_NUM];
348*53ee8cc1Swenshuai.xi
349*53ee8cc1Swenshuai.xi MS_U32 _u32ProcessNum;
350*53ee8cc1Swenshuai.xi
351*53ee8cc1Swenshuai.xi MS_BOOL _bSWInitReady;
352*53ee8cc1Swenshuai.xi MS_PHY _phyFwAddr;
353*53ee8cc1Swenshuai.xi MS_U32 _u32FwSize;
354*53ee8cc1Swenshuai.xi MS_U32 _u32DbgIntrCount;
355*53ee8cc1Swenshuai.xi
356*53ee8cc1Swenshuai.xi DrvTSP_If_Set _ifset_save;
357*53ee8cc1Swenshuai.xi
358*53ee8cc1Swenshuai.xi MS_BOOL _bLiveSING_FilePP; //live in tto single and file in to ping-pong
359*53ee8cc1Swenshuai.xi
360*53ee8cc1Swenshuai.xi #ifdef VQ_ENABLE
361*53ee8cc1Swenshuai.xi MS_U32 _u32NULLFileFilterID; //for switch live & file path
362*53ee8cc1Swenshuai.xi #endif //end of VQ_ENABLE
363*53ee8cc1Swenshuai.xi
364*53ee8cc1Swenshuai.xi #ifndef NO_PVR
365*53ee8cc1Swenshuai.xi DrvTSP_PVRCAParams TSPPvrcaParams;
366*53ee8cc1Swenshuai.xi DrvTSP_Event _PvrEvtNotify[TSP_PVR_IF_NUM];
367*53ee8cc1Swenshuai.xi P_DrvTSP_EvtCallback _PvrCallback[TSP_PVR_IF_NUM];
368*53ee8cc1Swenshuai.xi #endif //end of NO_PVR
369*53ee8cc1Swenshuai.xi
370*53ee8cc1Swenshuai.xi MS_PHY _phyTspFWDramBuf;
371*53ee8cc1Swenshuai.xi MS_U32 _u32TspFwDramBufSize;
372*53ee8cc1Swenshuai.xi
373*53ee8cc1Swenshuai.xi MS_U32 _u32OrgCAMode;
374*53ee8cc1Swenshuai.xi
375*53ee8cc1Swenshuai.xi }TSP_RESOURCE_PRIVATE;
376*53ee8cc1Swenshuai.xi
377*53ee8cc1Swenshuai.xi
378*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
379*53ee8cc1Swenshuai.xi // Local Variables
380*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
381*53ee8cc1Swenshuai.xi static MSIF_Version _drv_tsp_version = {
382*53ee8cc1Swenshuai.xi .DDI = { TSP_DRV_VERSION, },
383*53ee8cc1Swenshuai.xi };
384*53ee8cc1Swenshuai.xi
385*53ee8cc1Swenshuai.xi #ifndef TSP_UTOPIA_20
386*53ee8cc1Swenshuai.xi static TSP_RESOURCE_PRIVATE _tsp_res = {
387*53ee8cc1Swenshuai.xi ._s32TspMutexId = -1,
388*53ee8cc1Swenshuai.xi ._s32IndMutexId = -1,
389*53ee8cc1Swenshuai.xi ._s32IntRegMutexId = -1,
390*53ee8cc1Swenshuai.xi
391*53ee8cc1Swenshuai.xi ._u32LastErr = DRVTSP_OK,
392*53ee8cc1Swenshuai.xi ._bSuspend = FALSE,
393*53ee8cc1Swenshuai.xi ._u32ProcessNum = 0UL,
394*53ee8cc1Swenshuai.xi
395*53ee8cc1Swenshuai.xi ._bSWInitReady = FALSE,
396*53ee8cc1Swenshuai.xi ._u32FwAddr = 0UL,
397*53ee8cc1Swenshuai.xi ._u32FwSize = 0UL,
398*53ee8cc1Swenshuai.xi ._u32DbgIntrCount = 0UL,
399*53ee8cc1Swenshuai.xi ._ifset_save = {E_DRVTSP_PAD_EXT_INPUT0, FALSE, TRUE, TRUE},
400*53ee8cc1Swenshuai.xi ._bLiveSING_FilePP = FALSE,
401*53ee8cc1Swenshuai.xi
402*53ee8cc1Swenshuai.xi #ifdef VQ_ENABLE
403*53ee8cc1Swenshuai.xi ._u32NULLFileFilterID = 0xFFFFFFFFUL,
404*53ee8cc1Swenshuai.xi #endif
405*53ee8cc1Swenshuai.xi
406*53ee8cc1Swenshuai.xi #ifndef NO_PVR
407*53ee8cc1Swenshuai.xi .TSPPvrcaParams = {
408*53ee8cc1Swenshuai.xi #ifndef NO_CA
409*53ee8cc1Swenshuai.xi ._u16Flt1PidList = {[0 ... (TSP_PIDFLT1_NUM-1)] = DRVTSP_PID_NULL},
410*53ee8cc1Swenshuai.xi ._u16Flt0DscmbPidList = {[0 ... (DSCMB_FLT_NUM_ALL-1)] = DRVTSP_PID_NULL},
411*53ee8cc1Swenshuai.xi ._u32Flt1Flag_DscmbPVR = 0UL,
412*53ee8cc1Swenshuai.xi ._u32Flt1Flag_DscmbRef = 0UL,
413*53ee8cc1Swenshuai.xi ._bFLT1Dup_Enable = FALSE,
414*53ee8cc1Swenshuai.xi ._bCIPHSSMode = FALSE,
415*53ee8cc1Swenshuai.xi ._u16Flt2PidList = {[0 ... (DSCMB_FLT_NUM_ALL-1)] = DRVTSP_PID_NULL},
416*53ee8cc1Swenshuai.xi #endif
417*53ee8cc1Swenshuai.xi
418*53ee8cc1Swenshuai.xi ._bPVRCA_Start = FALSE,
419*53ee8cc1Swenshuai.xi
420*53ee8cc1Swenshuai.xi },
421*53ee8cc1Swenshuai.xi #endif
422*53ee8cc1Swenshuai.xi
423*53ee8cc1Swenshuai.xi #ifndef NO_PVR
424*53ee8cc1Swenshuai.xi ._PvrEvtNotify = {[0 ... (TSP_PVR_IF_NUM-1)] = E_DRVTSP_EVENT_DATA_INIT},
425*53ee8cc1Swenshuai.xi ._PvrCallback = {[0 ... (TSP_PVR_IF_NUM-1)] = 0},
426*53ee8cc1Swenshuai.xi #endif
427*53ee8cc1Swenshuai.xi
428*53ee8cc1Swenshuai.xi ._phyTspFWDramBuf = 0UL,
429*53ee8cc1Swenshuai.xi ._u32TspFwDramBufSize = 0UL,
430*53ee8cc1Swenshuai.xi
431*53ee8cc1Swenshuai.xi ._u32OrgCAMode = 0UL,
432*53ee8cc1Swenshuai.xi
433*53ee8cc1Swenshuai.xi };
434*53ee8cc1Swenshuai.xi
435*53ee8cc1Swenshuai.xi static TSP_RESOURCE_PRIVATE* _ptsp_res = &_tsp_res;
436*53ee8cc1Swenshuai.xi #else
437*53ee8cc1Swenshuai.xi static TSP_RESOURCE_PRIVATE* _ptsp_res = NULL;
438*53ee8cc1Swenshuai.xi #endif
439*53ee8cc1Swenshuai.xi
440*53ee8cc1Swenshuai.xi static MS_U8 _db_flag = 0;
441*53ee8cc1Swenshuai.xi static MS_S32 _s32ExtMutexId = -1; //For exiting ISR process task
442*53ee8cc1Swenshuai.xi
443*53ee8cc1Swenshuai.xi static MS_U32 _u32SecNotifyId[(TSP_SECFLT_NUM_All+31UL)>>5UL] = {0UL}; //for ISR processing
444*53ee8cc1Swenshuai.xi
445*53ee8cc1Swenshuai.xi #ifndef NO_PVR
446*53ee8cc1Swenshuai.xi static MS_U32 _u32PvrNotifyId[(TSP_PVR_IF_NUM+31UL)>>5UL] = {0UL};
447*53ee8cc1Swenshuai.xi #endif
448*53ee8cc1Swenshuai.xi
449*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
450*53ee8cc1Swenshuai.xi static MS_U32 _u32HwPcrNotifyId[(TSP_PCRFLT_NUM+31UL)>>5UL] = {0UL};
451*53ee8cc1Swenshuai.xi static MS_U8 _u8ResetPcr[TSP_PCRFLT_NUM] = {[0 ... (TSP_PCRFLT_NUM-1)] = 3UL};
452*53ee8cc1Swenshuai.xi static MS_U32 _u32PrevStcBase[TSP_PCRFLT_NUM] = {[0 ... (TSP_PCRFLT_NUM-1)] = 0UL};
453*53ee8cc1Swenshuai.xi static MS_U32 _u32PrevPllControl[TSP_PCRFLT_NUM] = {[0 ... (TSP_PCRFLT_NUM-1)] = 0UL};
454*53ee8cc1Swenshuai.xi #endif
455*53ee8cc1Swenshuai.xi
456*53ee8cc1Swenshuai.xi static MS_S32 _s32TspEventId = -1;
457*53ee8cc1Swenshuai.xi static MS_S32 _s32TspSecRdyId[(TSP_SECFLT_NUM_All+31UL)>>5UL] = {[0 ... (((TSP_SECFLT_NUM_All+31UL)>>5UL)-1UL)] = -1};
458*53ee8cc1Swenshuai.xi static MS_S32 _s32TspSecOvfId[(TSP_SECFLT_NUM_All+31UL)>>5UL] = {[0 ... (((TSP_SECFLT_NUM_All+31UL)>>5UL)-1UL)] = -1};
459*53ee8cc1Swenshuai.xi static MS_S32 _s32TspSecCrcId[(TSP_SECFLT_NUM_All+31UL)>>5UL] = {[0 ... (((TSP_SECFLT_NUM_All+31UL)>>5UL)-1UL)] = -1};
460*53ee8cc1Swenshuai.xi static MS_S32 _s32TspFltDisableId[(TSP_SECFLT_NUM_All+31UL)>>5UL] = {[0 ... (((TSP_SECFLT_NUM_All+31UL)>>5UL)-1UL)] = -1};
461*53ee8cc1Swenshuai.xi
462*53ee8cc1Swenshuai.xi #if 0
463*53ee8cc1Swenshuai.xi static MS_S32 _s32EventFree0[(TSP_PIDFLT_NUM_ALL+31)>>5] = {[0 ... (((TSP_PIDFLT_NUM_ALL+31)>>5)-1)] = -1};
464*53ee8cc1Swenshuai.xi static MS_S32 _s32EventFreeDefer0[(TSP_PIDFLT_NUM_ALL+31)>>5] = {[0 ... (((TSP_PIDFLT_NUM_ALL+31)>>5)-1)] = -1};
465*53ee8cc1Swenshuai.xi static MS_S32 _s32DoneFlags[(TSP_PIDFLT_NUM_ALL+31)>>5] = { [0 ... (((TSP_PIDFLT_NUM_ALL+31)>>5)-1)] = -1};
466*53ee8cc1Swenshuai.xi #endif
467*53ee8cc1Swenshuai.xi
468*53ee8cc1Swenshuai.xi static MS_S32 _s32TspTaskId = -1;
469*53ee8cc1Swenshuai.xi static DrvTSP_DbgLevel _u32TSPDGBLevel = E_DRVTSP_DBG_L1;
470*53ee8cc1Swenshuai.xi
471*53ee8cc1Swenshuai.xi static DrvTSP_FW_DBG_INFO _FwDbgInfo;
472*53ee8cc1Swenshuai.xi
473*53ee8cc1Swenshuai.xi static MS_BOOL _bBankInit = FALSE;
474*53ee8cc1Swenshuai.xi
475*53ee8cc1Swenshuai.xi MS_U32 _u32IntNum = E_INT_IRQ_TSP2HK; //for hal extern using
476*53ee8cc1Swenshuai.xi MS_U32 _u32TaskLine = 0UL;
477*53ee8cc1Swenshuai.xi
478*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
479*53ee8cc1Swenshuai.xi wait_queue_head_t tsp_wq_head[TSP_SECFLT_NUM_All];
480*53ee8cc1Swenshuai.xi #endif // MSOS_TYPE_LINUX_KERNEL
481*53ee8cc1Swenshuai.xi
482*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
483*53ee8cc1Swenshuai.xi // Local Functions prototype
484*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
485*53ee8cc1Swenshuai.xi
486*53ee8cc1Swenshuai.xi static void _DumpFwMsg(void);
487*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
488*53ee8cc1Swenshuai.xi // Local Functions
489*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
490*53ee8cc1Swenshuai.xi #if 0
_TSP_GetTrailOne64(MS_U64 u64Flags)491*53ee8cc1Swenshuai.xi static MS_U32 _TSP_GetTrailOne64(MS_U64 u64Flags)
492*53ee8cc1Swenshuai.xi {
493*53ee8cc1Swenshuai.xi MS_U32 u32Temp = (MS_U32)(u64Flags & 0xFFFFFFFF);
494*53ee8cc1Swenshuai.xi
495*53ee8cc1Swenshuai.xi if (u32Temp)
496*53ee8cc1Swenshuai.xi return MAsm_CPU_GetTrailOne(u32Temp);
497*53ee8cc1Swenshuai.xi return (32 + MAsm_CPU_GetTrailOne((MS_U32)(u64Flags>> 32)));
498*53ee8cc1Swenshuai.xi }
499*53ee8cc1Swenshuai.xi #endif
500*53ee8cc1Swenshuai.xi
501*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
502*53ee8cc1Swenshuai.xi extern int MDrv_FW_TSP_Addr(void);
503*53ee8cc1Swenshuai.xi extern int MDrv_FW_TSP_Size(void);
504*53ee8cc1Swenshuai.xi #endif
505*53ee8cc1Swenshuai.xi
_TSP_GetFirmware(MS_PHY * pphyAddr,MS_U32 * pu32Size)506*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_GetFirmware(MS_PHY* pphyAddr, MS_U32* pu32Size)
507*53ee8cc1Swenshuai.xi {
508*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
509*53ee8cc1Swenshuai.xi MS_S32 s32Fd;
510*53ee8cc1Swenshuai.xi #endif
511*53ee8cc1Swenshuai.xi
512*53ee8cc1Swenshuai.xi if (_ptsp_res->_u32FwSize)
513*53ee8cc1Swenshuai.xi {
514*53ee8cc1Swenshuai.xi *pphyAddr = _ptsp_res->_phyFwAddr;
515*53ee8cc1Swenshuai.xi *pu32Size = _ptsp_res->_u32FwSize;
516*53ee8cc1Swenshuai.xi return TRUE;
517*53ee8cc1Swenshuai.xi }
518*53ee8cc1Swenshuai.xi
519*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
520*53ee8cc1Swenshuai.xi if (0> (s32Fd = open("/dev/fw", O_RDWR)))
521*53ee8cc1Swenshuai.xi {
522*53ee8cc1Swenshuai.xi TSP_DBG("[%s][%d] open fail /dev/fw\n", __FUNCTION__, __LINE__);
523*53ee8cc1Swenshuai.xi MS_ASSERT(0);
524*53ee8cc1Swenshuai.xi return FALSE;
525*53ee8cc1Swenshuai.xi }
526*53ee8cc1Swenshuai.xi if (ioctl(s32Fd, FW_IOC_TSP_ADDR, pphyAddr))
527*53ee8cc1Swenshuai.xi {
528*53ee8cc1Swenshuai.xi TSP_DBG("[%s][%d] FW_IOC_TSP_ADDR\n", __FUNCTION__, __LINE__);
529*53ee8cc1Swenshuai.xi MS_ASSERT(0);
530*53ee8cc1Swenshuai.xi close(s32Fd);
531*53ee8cc1Swenshuai.xi return FALSE;
532*53ee8cc1Swenshuai.xi }
533*53ee8cc1Swenshuai.xi if (ioctl(s32Fd, FW_IOC_TSP_SIZE, pu32Size))
534*53ee8cc1Swenshuai.xi {
535*53ee8cc1Swenshuai.xi TSP_DBG("[%s][%d] FW_IOC_TSP_SIZE\n", __FUNCTION__, __LINE__);
536*53ee8cc1Swenshuai.xi MS_ASSERT(0);
537*53ee8cc1Swenshuai.xi close(s32Fd);
538*53ee8cc1Swenshuai.xi return FALSE;
539*53ee8cc1Swenshuai.xi }
540*53ee8cc1Swenshuai.xi close(s32Fd);
541*53ee8cc1Swenshuai.xi return TRUE;
542*53ee8cc1Swenshuai.xi #elif defined (MSOS_TYPE_LINUX_KERNEL)
543*53ee8cc1Swenshuai.xi //*pphyAddr = MDrv_FW_TSP_Addr();
544*53ee8cc1Swenshuai.xi //*pu32Size = MDrv_FW_TSP_Size();
545*53ee8cc1Swenshuai.xi return TRUE;
546*53ee8cc1Swenshuai.xi #else
547*53ee8cc1Swenshuai.xi return FALSE;
548*53ee8cc1Swenshuai.xi #endif
549*53ee8cc1Swenshuai.xi }
550*53ee8cc1Swenshuai.xi
551*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
_TSP_CmdQ_Init(void)552*53ee8cc1Swenshuai.xi static void _TSP_CmdQ_Init(void)
553*53ee8cc1Swenshuai.xi {
554*53ee8cc1Swenshuai.xi while (HAL_TSP_CmdQ_CmdCount()); // wait command finish
555*53ee8cc1Swenshuai.xi
556*53ee8cc1Swenshuai.xi }
557*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
558*53ee8cc1Swenshuai.xi
_TSP_InitResource(TSP_RESOURCE_PRIVATE * presource)559*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_InitResource(TSP_RESOURCE_PRIVATE* presource)
560*53ee8cc1Swenshuai.xi {
561*53ee8cc1Swenshuai.xi #ifndef NO_PVR
562*53ee8cc1Swenshuai.xi MS_U32 u32ii = 0;
563*53ee8cc1Swenshuai.xi #endif
564*53ee8cc1Swenshuai.xi
565*53ee8cc1Swenshuai.xi if(presource == NULL)
566*53ee8cc1Swenshuai.xi {
567*53ee8cc1Swenshuai.xi return FALSE;
568*53ee8cc1Swenshuai.xi }
569*53ee8cc1Swenshuai.xi
570*53ee8cc1Swenshuai.xi presource->_s32TspMutexId = -1;
571*53ee8cc1Swenshuai.xi presource->_s32IndMutexId = -1;
572*53ee8cc1Swenshuai.xi presource->_s32IntRegMutexId = -1;
573*53ee8cc1Swenshuai.xi
574*53ee8cc1Swenshuai.xi presource->_u32LastErr = 1;
575*53ee8cc1Swenshuai.xi presource->_bSuspend = FALSE;
576*53ee8cc1Swenshuai.xi
577*53ee8cc1Swenshuai.xi presource->_u32ProcessNum = 0UL;
578*53ee8cc1Swenshuai.xi
579*53ee8cc1Swenshuai.xi presource->_bSWInitReady = FALSE;
580*53ee8cc1Swenshuai.xi presource->_phyFwAddr = 0UL;
581*53ee8cc1Swenshuai.xi presource->_u32FwSize = 0UL;
582*53ee8cc1Swenshuai.xi presource->_u32DbgIntrCount = 0UL;
583*53ee8cc1Swenshuai.xi
584*53ee8cc1Swenshuai.xi presource->_ifset_save.ePad = E_DRVTSP_PAD_EXT_INPUT0;
585*53ee8cc1Swenshuai.xi presource->_ifset_save.bClkInv = FALSE;
586*53ee8cc1Swenshuai.xi presource->_ifset_save.bExtSync = TRUE;
587*53ee8cc1Swenshuai.xi presource->_ifset_save.bParallel = TRUE;
588*53ee8cc1Swenshuai.xi
589*53ee8cc1Swenshuai.xi presource->_bLiveSING_FilePP = FALSE; //live in single and file in ping-pong
590*53ee8cc1Swenshuai.xi
591*53ee8cc1Swenshuai.xi #ifdef VQ_ENABLE
592*53ee8cc1Swenshuai.xi presource->_u32NULLFileFilterID = 0xFFFFFFFFUL;
593*53ee8cc1Swenshuai.xi #endif
594*53ee8cc1Swenshuai.xi
595*53ee8cc1Swenshuai.xi #ifndef NO_PVR
596*53ee8cc1Swenshuai.xi #ifndef NO_CA
597*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_PIDFLT1_NUM; u32ii++)
598*53ee8cc1Swenshuai.xi {
599*53ee8cc1Swenshuai.xi presource->TSPPvrcaParams._u16Flt1PidList[u32ii] = DRVTSP_PID_NULL;
600*53ee8cc1Swenshuai.xi presource->TSPPvrcaParams._u16Flt2PidList[u32ii] = DRVTSP_PID_NULL;
601*53ee8cc1Swenshuai.xi }
602*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < (DSCMB_FLT_NUM + DSCMB_FLT_SHAREKEY_NUM); u32ii++)
603*53ee8cc1Swenshuai.xi {
604*53ee8cc1Swenshuai.xi presource->TSPPvrcaParams._u16Flt0DscmbPidList[u32ii] = DRVTSP_PID_NULL;
605*53ee8cc1Swenshuai.xi }
606*53ee8cc1Swenshuai.xi presource->TSPPvrcaParams._u32Flt1Flag_DscmbPVR = 0UL;
607*53ee8cc1Swenshuai.xi presource->TSPPvrcaParams._u32Flt1Flag_DscmbRef = 0UL;
608*53ee8cc1Swenshuai.xi presource->TSPPvrcaParams._bFLT1Dup_Enable = FALSE;
609*53ee8cc1Swenshuai.xi presource->TSPPvrcaParams._bCIPHSSMode = FALSE;
610*53ee8cc1Swenshuai.xi #endif
611*53ee8cc1Swenshuai.xi presource->TSPPvrcaParams._bPVRCA_Start = FALSE;
612*53ee8cc1Swenshuai.xi
613*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_PVR_IF_NUM; u32ii++)
614*53ee8cc1Swenshuai.xi {
615*53ee8cc1Swenshuai.xi presource->_PvrEvtNotify[u32ii] = E_DRVTSP_EVENT_DATA_INIT;
616*53ee8cc1Swenshuai.xi presource->_PvrCallback[u32ii] = 0;
617*53ee8cc1Swenshuai.xi }
618*53ee8cc1Swenshuai.xi #endif
619*53ee8cc1Swenshuai.xi
620*53ee8cc1Swenshuai.xi presource->_phyTspFWDramBuf = 0UL;
621*53ee8cc1Swenshuai.xi presource->_u32TspFwDramBufSize = 0UL;
622*53ee8cc1Swenshuai.xi
623*53ee8cc1Swenshuai.xi presource->_u32OrgCAMode = 0UL;
624*53ee8cc1Swenshuai.xi
625*53ee8cc1Swenshuai.xi return TRUE;
626*53ee8cc1Swenshuai.xi
627*53ee8cc1Swenshuai.xi }
628*53ee8cc1Swenshuai.xi
_TSP_SwStateReset(MS_BOOL bInited)629*53ee8cc1Swenshuai.xi static void _TSP_SwStateReset(MS_BOOL bInited)
630*53ee8cc1Swenshuai.xi {
631*53ee8cc1Swenshuai.xi MS_U32 u32EngId, u32FilterId;
632*53ee8cc1Swenshuai.xi MS_U32 u32SecId = 0;
633*53ee8cc1Swenshuai.xi
634*53ee8cc1Swenshuai.xi if(bInited == TRUE)
635*53ee8cc1Swenshuai.xi return;
636*53ee8cc1Swenshuai.xi
637*53ee8cc1Swenshuai.xi for (u32EngId = 0; u32EngId < TSP_ENGINE_NUM; u32EngId++)
638*53ee8cc1Swenshuai.xi {
639*53ee8cc1Swenshuai.xi //TS0 Pid filter
640*53ee8cc1Swenshuai.xi for (u32FilterId = 0; u32FilterId < TSP_SECFLT_NUM; u32FilterId++)
641*53ee8cc1Swenshuai.xi {
642*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32FilterId] = E_DRVTSP_FLT_STATE_NA;
643*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltType[u32FilterId] = E_DRVTSP_FLT_TYPE_SECTION; // for section filter
644*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltState[u32SecId] = E_DRVTSP_FLT_STATE_NA;
645*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecBufState[u32SecId] = E_DRVTSP_FLT_STATE_NA;
646*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltMode[u32SecId] = E_DRVTSP_FLT_MODE_CONTI;
647*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecId] = E_DRVTSP_EVENT_DATA_INIT;
648*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltCallback[u32SecId++] = NULL;
649*53ee8cc1Swenshuai.xi }
650*53ee8cc1Swenshuai.xi
651*53ee8cc1Swenshuai.xi //TS1 Pid filter
652*53ee8cc1Swenshuai.xi for (; u32FilterId < (TSP_SECFLT_NUM + TSP_PIDFLT1_NUM); u32FilterId++)
653*53ee8cc1Swenshuai.xi {
654*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32FilterId] = E_DRVTSP_FLT_STATE_FREE;
655*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltType[u32FilterId] = E_DRVTSP_FLT_TYPE_PVR;
656*53ee8cc1Swenshuai.xi }
657*53ee8cc1Swenshuai.xi
658*53ee8cc1Swenshuai.xi //TS2 Pid filter
659*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
660*53ee8cc1Swenshuai.xi
661*53ee8cc1Swenshuai.xi #ifndef TS2_LIVE_SUPPORT
662*53ee8cc1Swenshuai.xi for (; u32FilterId < (TSP_SECFLT_NUM + TSP_PIDFLT1_NUM + TSP_PIDFLT2_NUM); u32FilterId++)
663*53ee8cc1Swenshuai.xi #else
664*53ee8cc1Swenshuai.xi for (; u32FilterId < (TSP_SECFLT_NUM + TSP_PIDFLT1_NUM + TSP_SECFLT2_NUM); u32FilterId++)
665*53ee8cc1Swenshuai.xi #endif
666*53ee8cc1Swenshuai.xi {
667*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32FilterId] = E_DRVTSP_FLT_STATE_FREE;
668*53ee8cc1Swenshuai.xi
669*53ee8cc1Swenshuai.xi #ifndef TS2_LIVE_SUPPORT
670*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltType[u32FilterId] = E_DRVTSP_FLT_TYPE_CB;
671*53ee8cc1Swenshuai.xi #else
672*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltType[u32FilterId] = E_DRVTSP_FLT_TYPE_SECTION; // for section filter
673*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltState[u32SecId] = E_DRVTSP_FLT_STATE_NA;
674*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecBufState[u32SecId] = E_DRVTSP_FLT_STATE_NA;
675*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltMode[u32SecId] = E_DRVTSP_FLT_MODE_CONTI;
676*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecId] = E_DRVTSP_EVENT_DATA_INIT;
677*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltCallback[u32SecId++] = NULL;
678*53ee8cc1Swenshuai.xi #endif
679*53ee8cc1Swenshuai.xi }
680*53ee8cc1Swenshuai.xi #endif
681*53ee8cc1Swenshuai.xi
682*53ee8cc1Swenshuai.xi //HWPCR Pid filter
683*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
684*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltType[u32FilterId] = E_DRVTSP_FLT_TYPE_PCR;
685*53ee8cc1Swenshuai.xi #endif
686*53ee8cc1Swenshuai.xi
687*53ee8cc1Swenshuai.xi }
688*53ee8cc1Swenshuai.xi
689*53ee8cc1Swenshuai.xi }
690*53ee8cc1Swenshuai.xi
_TSP_SW_Exit(void)691*53ee8cc1Swenshuai.xi static void _TSP_SW_Exit(void)
692*53ee8cc1Swenshuai.xi {
693*53ee8cc1Swenshuai.xi MS_U8 u8ii;
694*53ee8cc1Swenshuai.xi
695*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
696*53ee8cc1Swenshuai.xi MS_U32 u32Timer, u32CurTime = 0;
697*53ee8cc1Swenshuai.xi
698*53ee8cc1Swenshuai.xi _TSP_EXT_LOCK();
699*53ee8cc1Swenshuai.xi _db_flag = 1;
700*53ee8cc1Swenshuai.xi _TSP_EXT_UNLOCK();
701*53ee8cc1Swenshuai.xi
702*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
703*53ee8cc1Swenshuai.xi u32Timer = MsOS_GetSystemTime();
704*53ee8cc1Swenshuai.xi // check _s32TspTaskId for NOS case
705*53ee8cc1Swenshuai.xi while(_s32TspTaskId > 0)
706*53ee8cc1Swenshuai.xi {
707*53ee8cc1Swenshuai.xi _TSP_SetEvent(TSP_TASK_EVENT_FLT_FREE);
708*53ee8cc1Swenshuai.xi _TSP_EXT_LOCK();
709*53ee8cc1Swenshuai.xi if (_db_flag == 2)
710*53ee8cc1Swenshuai.xi {
711*53ee8cc1Swenshuai.xi _TSP_EXT_UNLOCK();
712*53ee8cc1Swenshuai.xi break;
713*53ee8cc1Swenshuai.xi }
714*53ee8cc1Swenshuai.xi _TSP_EXT_UNLOCK();
715*53ee8cc1Swenshuai.xi
716*53ee8cc1Swenshuai.xi u32CurTime = MsOS_GetSystemTime();
717*53ee8cc1Swenshuai.xi if(u32CurTime < u32Timer)
718*53ee8cc1Swenshuai.xi {
719*53ee8cc1Swenshuai.xi ULOGD("TSP", "[%s][%d] Systemtime Change %d \n", __FUNCTION__, __LINE__, (unsigned int)u32CurTime);
720*53ee8cc1Swenshuai.xi u32Timer = u32CurTime;
721*53ee8cc1Swenshuai.xi }
722*53ee8cc1Swenshuai.xi if ((u32CurTime-u32Timer) > 1000)
723*53ee8cc1Swenshuai.xi {
724*53ee8cc1Swenshuai.xi ULOGE("TSP", "[%s][%d] TSP task exit timeout!!!!!!\n", __FUNCTION__, __LINE__);
725*53ee8cc1Swenshuai.xi break;
726*53ee8cc1Swenshuai.xi }
727*53ee8cc1Swenshuai.xi
728*53ee8cc1Swenshuai.xi }
729*53ee8cc1Swenshuai.xi
730*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
731*53ee8cc1Swenshuai.xi /*if(_s32TspTaskId > 0)
732*53ee8cc1Swenshuai.xi {
733*53ee8cc1Swenshuai.xi MsOS_DeleteTask(_s32TspTaskId);
734*53ee8cc1Swenshuai.xi _s32TspTaskId = -1;
735*53ee8cc1Swenshuai.xi }*/
736*53ee8cc1Swenshuai.xi #else
737*53ee8cc1Swenshuai.xi //to free CB process task, so send one event
738*53ee8cc1Swenshuai.xi _TSP_SetEvent(TSP_TASK_EVENT_GROUP_SELF);
739*53ee8cc1Swenshuai.xi #endif
740*53ee8cc1Swenshuai.xi
741*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < ((TSP_SECFLT_NUM_All+31)>>5); u8ii++)
742*53ee8cc1Swenshuai.xi {
743*53ee8cc1Swenshuai.xi if(_s32TspSecRdyId[u8ii] != -1)
744*53ee8cc1Swenshuai.xi {
745*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32TspSecRdyId[u8ii]);
746*53ee8cc1Swenshuai.xi _s32TspSecRdyId[u8ii] = -1;
747*53ee8cc1Swenshuai.xi }
748*53ee8cc1Swenshuai.xi if(_s32TspSecOvfId[u8ii] != -1)
749*53ee8cc1Swenshuai.xi {
750*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32TspSecOvfId[u8ii]);
751*53ee8cc1Swenshuai.xi _s32TspSecOvfId[u8ii] = -1;
752*53ee8cc1Swenshuai.xi }
753*53ee8cc1Swenshuai.xi if(_s32TspSecCrcId[u8ii] != -1)
754*53ee8cc1Swenshuai.xi {
755*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32TspSecCrcId[u8ii]);
756*53ee8cc1Swenshuai.xi _s32TspSecCrcId[u8ii] = -1;
757*53ee8cc1Swenshuai.xi }
758*53ee8cc1Swenshuai.xi if(_s32TspFltDisableId[u8ii] != -1)
759*53ee8cc1Swenshuai.xi {
760*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32TspFltDisableId[u8ii]);
761*53ee8cc1Swenshuai.xi _s32TspFltDisableId[u8ii] = -1;
762*53ee8cc1Swenshuai.xi }
763*53ee8cc1Swenshuai.xi }
764*53ee8cc1Swenshuai.xi
765*53ee8cc1Swenshuai.xi #if 0
766*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < ((TSP_PIDFLT_NUM_ALL+31)>>5); u8ii++)
767*53ee8cc1Swenshuai.xi {
768*53ee8cc1Swenshuai.xi if(_s32EventFree0[u8ii] != -1)
769*53ee8cc1Swenshuai.xi {
770*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32EventFree0[u8ii]);
771*53ee8cc1Swenshuai.xi _s32EventFree0[u8ii] = -1;
772*53ee8cc1Swenshuai.xi }
773*53ee8cc1Swenshuai.xi if(_s32EventFreeDefer0[u8ii] != -1)
774*53ee8cc1Swenshuai.xi {
775*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32EventFreeDefer0[u8ii]);
776*53ee8cc1Swenshuai.xi _s32EventFreeDefer0[u8ii] = -1;
777*53ee8cc1Swenshuai.xi }
778*53ee8cc1Swenshuai.xi if(_s32DoneFlags[u8ii] != -1)
779*53ee8cc1Swenshuai.xi {
780*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32DoneFlags[u8ii]);
781*53ee8cc1Swenshuai.xi _s32DoneFlags[u8ii] = -1;
782*53ee8cc1Swenshuai.xi }
783*53ee8cc1Swenshuai.xi }
784*53ee8cc1Swenshuai.xi #endif
785*53ee8cc1Swenshuai.xi
786*53ee8cc1Swenshuai.xi if (_s32ExtMutexId != -1)
787*53ee8cc1Swenshuai.xi {
788*53ee8cc1Swenshuai.xi _TSP_EXT_LOCK();
789*53ee8cc1Swenshuai.xi _TSP_EXT_UNLOCK();
790*53ee8cc1Swenshuai.xi MsOS_DeleteMutex(_s32ExtMutexId);
791*53ee8cc1Swenshuai.xi _s32ExtMutexId = -1;
792*53ee8cc1Swenshuai.xi _db_flag = 0;
793*53ee8cc1Swenshuai.xi }
794*53ee8cc1Swenshuai.xi
795*53ee8cc1Swenshuai.xi if (_s32TspEventId != -1)
796*53ee8cc1Swenshuai.xi {
797*53ee8cc1Swenshuai.xi #ifdef DMX_UTOPIA_2K
798*53ee8cc1Swenshuai.xi MsOS_DelayTask(3);
799*53ee8cc1Swenshuai.xi #endif
800*53ee8cc1Swenshuai.xi
801*53ee8cc1Swenshuai.xi while(OSAL_TSP_EventDelete(_s32TspEventId) == FALSE)
802*53ee8cc1Swenshuai.xi {
803*53ee8cc1Swenshuai.xi MsOS_DelayTask(3);
804*53ee8cc1Swenshuai.xi printf("Waiting for evet deleting... \n");
805*53ee8cc1Swenshuai.xi }
806*53ee8cc1Swenshuai.xi _s32TspEventId = -1;
807*53ee8cc1Swenshuai.xi }
808*53ee8cc1Swenshuai.xi
809*53ee8cc1Swenshuai.xi //checking if stiil there are other processes exist
810*53ee8cc1Swenshuai.xi if(--_ptsp_res->_u32ProcessNum > 0)
811*53ee8cc1Swenshuai.xi return;
812*53ee8cc1Swenshuai.xi
813*53ee8cc1Swenshuai.xi if (_ptsp_res->_s32IntRegMutexId != -1)
814*53ee8cc1Swenshuai.xi {
815*53ee8cc1Swenshuai.xi _TSP_INT_LOCK();
816*53ee8cc1Swenshuai.xi _TSP_INT_UNLOCK();
817*53ee8cc1Swenshuai.xi MsOS_DeleteMutex(_ptsp_res->_s32IntRegMutexId);
818*53ee8cc1Swenshuai.xi _ptsp_res->_s32IntRegMutexId = -1;
819*53ee8cc1Swenshuai.xi }
820*53ee8cc1Swenshuai.xi
821*53ee8cc1Swenshuai.xi if (_ptsp_res->_s32IndMutexId != -1)
822*53ee8cc1Swenshuai.xi {
823*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_ptsp_res->_s32IndMutexId);
824*53ee8cc1Swenshuai.xi MsOS_DeleteMutex(_ptsp_res->_s32IndMutexId);
825*53ee8cc1Swenshuai.xi _ptsp_res->_s32IndMutexId = -1;
826*53ee8cc1Swenshuai.xi }
827*53ee8cc1Swenshuai.xi
828*53ee8cc1Swenshuai.xi if (_ptsp_res->_s32TspMutexId != -1)
829*53ee8cc1Swenshuai.xi {
830*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_ptsp_res->_s32TspMutexId);
831*53ee8cc1Swenshuai.xi MsOS_DeleteMutex(_ptsp_res->_s32TspMutexId);
832*53ee8cc1Swenshuai.xi _ptsp_res->_s32TspMutexId = -1;
833*53ee8cc1Swenshuai.xi }
834*53ee8cc1Swenshuai.xi
835*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].TSPStatus = E_DRVTSP_SW_EXIT;
836*53ee8cc1Swenshuai.xi _ptsp_res->_bSWInitReady = FALSE;
837*53ee8cc1Swenshuai.xi
838*53ee8cc1Swenshuai.xi }
839*53ee8cc1Swenshuai.xi
840*53ee8cc1Swenshuai.xi
_TSP_Close(void)841*53ee8cc1Swenshuai.xi static void _TSP_Close(void)
842*53ee8cc1Swenshuai.xi {
843*53ee8cc1Swenshuai.xi HAL_TSP_Int_Disable(TSP_HWINT_ALL);
844*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
845*53ee8cc1Swenshuai.xi HAL_TSP_Int2_Disable(TSP_HWINT2_ALL);
846*53ee8cc1Swenshuai.xi #endif
847*53ee8cc1Swenshuai.xi OSAL_TSP_IntDisable();
848*53ee8cc1Swenshuai.xi OSAL_TSP_IntDetach();
849*53ee8cc1Swenshuai.xi HAL_TSP_WbDmaEnable(FALSE);
850*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(0, 0, TSP_IF_NUM);
851*53ee8cc1Swenshuai.xi _TSP_SW_Exit();
852*53ee8cc1Swenshuai.xi HAL_TSP_PowerCtrl(DISABLE);
853*53ee8cc1Swenshuai.xi HAL_TSP_HW_Lock_Release();
854*53ee8cc1Swenshuai.xi }
855*53ee8cc1Swenshuai.xi
856*53ee8cc1Swenshuai.xi
_TSP_RegStateStore(void)857*53ee8cc1Swenshuai.xi static void _TSP_RegStateStore(void)
858*53ee8cc1Swenshuai.xi {
859*53ee8cc1Swenshuai.xi HAL_TSP_Int_Disable(TSP_HWINT_ALL);
860*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
861*53ee8cc1Swenshuai.xi HAL_TSP_Int2_Disable(TSP_HWINT2_ALL);
862*53ee8cc1Swenshuai.xi #endif
863*53ee8cc1Swenshuai.xi OSAL_TSP_IntDisable();
864*53ee8cc1Swenshuai.xi OSAL_TSP_IntDetach();
865*53ee8cc1Swenshuai.xi HAL_TSP_SaveFltState();
866*53ee8cc1Swenshuai.xi }
867*53ee8cc1Swenshuai.xi
868*53ee8cc1Swenshuai.xi
_TSP_RegStateRestore(void)869*53ee8cc1Swenshuai.xi static void _TSP_RegStateRestore(void)
870*53ee8cc1Swenshuai.xi {
871*53ee8cc1Swenshuai.xi HAL_TSP_RestoreFltState();
872*53ee8cc1Swenshuai.xi }
873*53ee8cc1Swenshuai.xi
874*53ee8cc1Swenshuai.xi #ifndef NO_CA
875*53ee8cc1Swenshuai.xi
876*53ee8cc1Swenshuai.xi #if 0
_TSP_DumpDscmbDupArray(void)877*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_DumpDscmbDupArray(void)
878*53ee8cc1Swenshuai.xi {
879*53ee8cc1Swenshuai.xi MS_U32 u32ii = 0;
880*53ee8cc1Swenshuai.xi
881*53ee8cc1Swenshuai.xi ULOGD("TSP", "[%s][%d]\n", __FUNCTION__, __LINE__);
882*53ee8cc1Swenshuai.xi
883*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < DSCMB_FLT_NUM_ALL; u32ii++)
884*53ee8cc1Swenshuai.xi {
885*53ee8cc1Swenshuai.xi ULOGD("TSP", "FLT1 %ld, %x \n", u32ii, _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii]);
886*53ee8cc1Swenshuai.xi ULOGD("TSP", "FLT0 %ld, %x \n", u32ii, _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32ii]);
887*53ee8cc1Swenshuai.xi ULOGD("TSP", "FLT2 %ld, %x \n", u32ii, _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ii]);
888*53ee8cc1Swenshuai.xi }
889*53ee8cc1Swenshuai.xi ULOGD("TSP", "_u32Flt1Flag_DscmbRef %lx , _u32Flt1Flag_DscmbPVR %lx\n",
890*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef, _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR);
891*53ee8cc1Swenshuai.xi
892*53ee8cc1Swenshuai.xi return TRUE;
893*53ee8cc1Swenshuai.xi }
894*53ee8cc1Swenshuai.xi #endif
895*53ee8cc1Swenshuai.xi
_TSP_SetNewDscmbPid2FLT1(MS_U32 u32EngId,MS_U32 u32Flt1Id,MS_U16 u32Pid)896*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_SetNewDscmbPid2FLT1(MS_U32 u32EngId, MS_U32 u32Flt1Id, MS_U16 u32Pid)
897*53ee8cc1Swenshuai.xi {
898*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(HAL_TSP_GetPidFltReg(u32EngId, u32Flt1Id + TSP_SECFLT_NUM), u32Pid);
899*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32Flt1Id] = u32Pid;
900*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef |= (1 << u32Flt1Id);
901*53ee8cc1Swenshuai.xi
902*53ee8cc1Swenshuai.xi return TRUE;
903*53ee8cc1Swenshuai.xi }
904*53ee8cc1Swenshuai.xi
_TSP_FreeDscmbPid_In_FLT1(MS_U32 u32EngId,MS_U32 u32Flt1Id)905*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_FreeDscmbPid_In_FLT1(MS_U32 u32EngId, MS_U32 u32Flt1Id)
906*53ee8cc1Swenshuai.xi {
907*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32Flt1Id] = DRVTSP_PID_NULL;
908*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef &= ~(1 << u32Flt1Id);
909*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(HAL_TSP_GetPidFltReg(u32EngId, u32Flt1Id + TSP_SECFLT_NUM), DRVTSP_PID_NULL);
910*53ee8cc1Swenshuai.xi
911*53ee8cc1Swenshuai.xi return TRUE;
912*53ee8cc1Swenshuai.xi }
913*53ee8cc1Swenshuai.xi
_TSP_FreeDupDscmbPidFlt(MS_U32 u32EngId,MS_U32 u32FltGroupId,MS_U32 u32CaMode)914*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_FreeDupDscmbPidFlt(MS_U32 u32EngId, MS_U32 u32FltGroupId, MS_U32 u32CaMode)
915*53ee8cc1Swenshuai.xi {
916*53ee8cc1Swenshuai.xi MS_U32 u32ii = 0, u32jj = 0, u32kk = 0;
917*53ee8cc1Swenshuai.xi
918*53ee8cc1Swenshuai.xi #ifdef EXT_PVR1_FLT
919*53ee8cc1Swenshuai.xi MS_U32 u32DscmbFltNum = DSCMB_FLT_NUM_ALL;
920*53ee8cc1Swenshuai.xi #else
921*53ee8cc1Swenshuai.xi MS_U32 u32DscmbFltNum = DSCMB_FLT_NUM;
922*53ee8cc1Swenshuai.xi #endif
923*53ee8cc1Swenshuai.xi
924*53ee8cc1Swenshuai.xi //MS_BOOL bScmbLive0 = ((u32CaMode & TSP_CA_OUTPUT_PLAY_LIVE) ? TRUE: FALSE);
925*53ee8cc1Swenshuai.xi
926*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
927*53ee8cc1Swenshuai.xi MS_BOOL bScmbLive1 = (((u32CaMode & (TSP_CA_OUTPUT_PLAY_LIVE|TSP_CA_OUTPUT_PLAY_LIVE2)) == TSP_CA_OUTPUT_PLAY_LIVE2)? TRUE: FALSE);
928*53ee8cc1Swenshuai.xi MS_BOOL bScmbRc1 = ((u32CaMode &TSP_CA_OUTPUT_PLAY_LIVE2) ? TRUE: FALSE);
929*53ee8cc1Swenshuai.xi #endif
930*53ee8cc1Swenshuai.xi
931*53ee8cc1Swenshuai.xi if(((u32CaMode & TSP_CA_INPUT_TSIF1) == 0) || ((u32CaMode & TSP_CA_OUTPUT_REC) != 0))
932*53ee8cc1Swenshuai.xi return FALSE;
933*53ee8cc1Swenshuai.xi
934*53ee8cc1Swenshuai.xi //Free FLT0
935*53ee8cc1Swenshuai.xi if((u32FltGroupId == 0) &&
936*53ee8cc1Swenshuai.xi ((u32CaMode & (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE)) == (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE)))
937*53ee8cc1Swenshuai.xi {
938*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] Free FLT0 list \n", __FUNCTION__, __LINE__));
939*53ee8cc1Swenshuai.xi
940*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < u32DscmbFltNum; u32ii++)
941*53ee8cc1Swenshuai.xi {
942*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32ii] == DRVTSP_PID_NULL)
943*53ee8cc1Swenshuai.xi continue;
944*53ee8cc1Swenshuai.xi
945*53ee8cc1Swenshuai.xi //Remove all duplicate filter in Group1
946*53ee8cc1Swenshuai.xi for(u32jj = 0; u32jj < u32DscmbFltNum; u32jj++)
947*53ee8cc1Swenshuai.xi {
948*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32ii] == _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32jj])
949*53ee8cc1Swenshuai.xi {
950*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef &= ~(1 << u32jj);
951*53ee8cc1Swenshuai.xi if(((_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef|_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR) & (1 << u32jj)) == 0)
952*53ee8cc1Swenshuai.xi {
953*53ee8cc1Swenshuai.xi _TSP_FreeDscmbPid_In_FLT1(u32EngId, u32jj);
954*53ee8cc1Swenshuai.xi PVRCA_DBG(sd_print("Free Group0: FLT0 id %ld, FLT1 id %ld, PID 0x%x \n", u32ii, u32jj, _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32ii]));
955*53ee8cc1Swenshuai.xi }
956*53ee8cc1Swenshuai.xi }
957*53ee8cc1Swenshuai.xi }
958*53ee8cc1Swenshuai.xi
959*53ee8cc1Swenshuai.xi for(u32kk = 0; u32kk < u32DscmbFltNum; u32kk++)
960*53ee8cc1Swenshuai.xi {
961*53ee8cc1Swenshuai.xi if(u32kk == u32ii)
962*53ee8cc1Swenshuai.xi continue;
963*53ee8cc1Swenshuai.xi
964*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32kk] == _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32ii])
965*53ee8cc1Swenshuai.xi {
966*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s]Free Group0: FLT0 id %ld, FLT1 id %ld, PID 0x%x \n", __FUNCTION__, u32kk, u32jj, _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32kk]));
967*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32kk] = DRVTSP_PID_NULL;
968*53ee8cc1Swenshuai.xi }
969*53ee8cc1Swenshuai.xi }
970*53ee8cc1Swenshuai.xi
971*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s]Free Group0: FLT0 id %ld, FLT1 id %ld, PID 0x%x \n", __FUNCTION__, u32ii, u32jj, _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32ii]));
972*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32ii] = DRVTSP_PID_NULL;
973*53ee8cc1Swenshuai.xi
974*53ee8cc1Swenshuai.xi }
975*53ee8cc1Swenshuai.xi
976*53ee8cc1Swenshuai.xi return TRUE;
977*53ee8cc1Swenshuai.xi }
978*53ee8cc1Swenshuai.xi
979*53ee8cc1Swenshuai.xi //Free FLT2
980*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
981*53ee8cc1Swenshuai.xi if((u32FltGroupId == 2) &&
982*53ee8cc1Swenshuai.xi ((u32CaMode & (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE|TSP_CA_OUTPUT_PLAY_LIVE2)) == (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE2)))
983*53ee8cc1Swenshuai.xi {
984*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] Free FLT2 list \n", __FUNCTION__, __LINE__));
985*53ee8cc1Swenshuai.xi
986*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < DSCMB_FLT_NUM; u32ii++)
987*53ee8cc1Swenshuai.xi {
988*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ii] == DRVTSP_PID_NULL)
989*53ee8cc1Swenshuai.xi continue;
990*53ee8cc1Swenshuai.xi
991*53ee8cc1Swenshuai.xi //Remove all duplicate filter in Group1
992*53ee8cc1Swenshuai.xi for(u32jj = 0; u32jj < DSCMB_FLT_NUM; u32jj++)
993*53ee8cc1Swenshuai.xi {
994*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ii] == _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32jj])
995*53ee8cc1Swenshuai.xi {
996*53ee8cc1Swenshuai.xi if(bScmbLive1)
997*53ee8cc1Swenshuai.xi {
998*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef &= ~(1 << u32jj);
999*53ee8cc1Swenshuai.xi }
1000*53ee8cc1Swenshuai.xi if(bScmbRc1)
1001*53ee8cc1Swenshuai.xi {
1002*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR &= ~(1 << u32jj);
1003*53ee8cc1Swenshuai.xi }
1004*53ee8cc1Swenshuai.xi if(((_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef|_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR) & (1 << u32jj)) == 0)
1005*53ee8cc1Swenshuai.xi {
1006*53ee8cc1Swenshuai.xi _TSP_FreeDscmbPid_In_FLT1(u32EngId, u32jj);
1007*53ee8cc1Swenshuai.xi PVRCA_DBG(sd_print("Free Group2: FLT2 id %ld, FLT1 id %ld, PID 0x%x \n", u32ii, u32jj, _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ii]));
1008*53ee8cc1Swenshuai.xi }
1009*53ee8cc1Swenshuai.xi }
1010*53ee8cc1Swenshuai.xi }
1011*53ee8cc1Swenshuai.xi
1012*53ee8cc1Swenshuai.xi //check if any other FLT2 filter using the same pid
1013*53ee8cc1Swenshuai.xi for(u32kk = 0; u32kk < DSCMB_FLT_NUM; u32kk++)
1014*53ee8cc1Swenshuai.xi {
1015*53ee8cc1Swenshuai.xi if(u32kk == u32ii)
1016*53ee8cc1Swenshuai.xi continue;
1017*53ee8cc1Swenshuai.xi
1018*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32kk] == _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ii])
1019*53ee8cc1Swenshuai.xi {
1020*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s]Free Group2: FLT2 id %ld, FLT1 id %ld, PID 0x%x \n", __FUNCTION__, u32kk, u32jj, _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32kk]));
1021*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32kk] = DRVTSP_PID_NULL;
1022*53ee8cc1Swenshuai.xi }
1023*53ee8cc1Swenshuai.xi }
1024*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s]Free Group2: FLT2 id %ld, FLT1 id %ld, PID 0x%x \n", __FUNCTION__, u32ii, u32jj, _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ii]));
1025*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ii] = DRVTSP_PID_NULL;
1026*53ee8cc1Swenshuai.xi
1027*53ee8cc1Swenshuai.xi }
1028*53ee8cc1Swenshuai.xi
1029*53ee8cc1Swenshuai.xi return TRUE;
1030*53ee8cc1Swenshuai.xi }
1031*53ee8cc1Swenshuai.xi #endif
1032*53ee8cc1Swenshuai.xi
1033*53ee8cc1Swenshuai.xi return FALSE;
1034*53ee8cc1Swenshuai.xi }
1035*53ee8cc1Swenshuai.xi
_TSP_DupDscmbPidFlt(MS_U32 u32EngId,MS_U32 OrgFltId,MS_U32 DupFltId)1036*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_DupDscmbPidFlt(MS_U32 u32EngId, MS_U32 OrgFltId, MS_U32 DupFltId)
1037*53ee8cc1Swenshuai.xi {
1038*53ee8cc1Swenshuai.xi MS_U32 u32pid = DRVTSP_PID_NULL, u32ii = 0;
1039*53ee8cc1Swenshuai.xi MS_U32 u32OrgFltListIdx = 0;
1040*53ee8cc1Swenshuai.xi
1041*53ee8cc1Swenshuai.xi #ifdef EXT_PVR1_FLT
1042*53ee8cc1Swenshuai.xi MS_U32 u32DscmbFltNum = DSCMB_FLT_NUM_ALL;
1043*53ee8cc1Swenshuai.xi #else
1044*53ee8cc1Swenshuai.xi MS_U32 u32DscmbFltNum = DSCMB_FLT_NUM;
1045*53ee8cc1Swenshuai.xi #endif
1046*53ee8cc1Swenshuai.xi
1047*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] OrgFltId %ld, DupFltId %ld, FltType %lx\n",
1048*53ee8cc1Swenshuai.xi __FUNCTION__, __LINE__, OrgFltId, DupFltId, _ptsp_res->_TspState[u32EngId].FltType[OrgFltId]));
1049*53ee8cc1Swenshuai.xi
1050*53ee8cc1Swenshuai.xi if( (_ptsp_res->_TspState[u32EngId].FltType[OrgFltId] == E_DRVTSP_FLT_TYPE_SECTION) ||
1051*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[OrgFltId] == E_DRVTSP_FLT_TYPE_SECTION_NO_PUSI) ||
1052*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[OrgFltId] == E_DRVTSP_FLT_TYPE_PACKET) ||
1053*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[OrgFltId] == E_DRVTSP_FLT_TYPE_SECTION_VER) ||
1054*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[OrgFltId] == E_DRVTSP_FLT_TYPE_PCR))
1055*53ee8cc1Swenshuai.xi {
1056*53ee8cc1Swenshuai.xi return FALSE;
1057*53ee8cc1Swenshuai.xi }
1058*53ee8cc1Swenshuai.xi
1059*53ee8cc1Swenshuai.xi u32pid = HAL_TSP_PidFlt_GetPid(HAL_TSP_GetPidFltReg(u32EngId, OrgFltId));
1060*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] Org pid %lx\n", __FUNCTION__, __LINE__, u32pid));
1061*53ee8cc1Swenshuai.xi if(u32pid == DRVTSP_PID_NULL)
1062*53ee8cc1Swenshuai.xi {
1063*53ee8cc1Swenshuai.xi return FALSE;
1064*53ee8cc1Swenshuai.xi }
1065*53ee8cc1Swenshuai.xi
1066*53ee8cc1Swenshuai.xi //Group TS0 -> Group TS1
1067*53ee8cc1Swenshuai.xi if(OrgFltId <= DSCMB_FLT_END_ID)
1068*53ee8cc1Swenshuai.xi {
1069*53ee8cc1Swenshuai.xi #ifdef EXT_PVR1_FLT
1070*53ee8cc1Swenshuai.xi if(OrgFltId < DSCMB_FLT_START_ID)
1071*53ee8cc1Swenshuai.xi {
1072*53ee8cc1Swenshuai.xi u32OrgFltListIdx = OrgFltId + DSCMB_FLT_NUM;
1073*53ee8cc1Swenshuai.xi }
1074*53ee8cc1Swenshuai.xi else
1075*53ee8cc1Swenshuai.xi #endif
1076*53ee8cc1Swenshuai.xi {
1077*53ee8cc1Swenshuai.xi u32OrgFltListIdx = OrgFltId - DSCMB_FLT_START_ID;
1078*53ee8cc1Swenshuai.xi }
1079*53ee8cc1Swenshuai.xi
1080*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] #1 u32OrgFltListIdx %ld \n" ,__FUNCTION__, __LINE__, u32OrgFltListIdx));
1081*53ee8cc1Swenshuai.xi
1082*53ee8cc1Swenshuai.xi //searching the same pid in FLT1
1083*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < u32DscmbFltNum; u32ii++)
1084*53ee8cc1Swenshuai.xi {
1085*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii] == u32pid)
1086*53ee8cc1Swenshuai.xi {
1087*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef |= (1 << u32ii);
1088*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32OrgFltListIdx] = u32pid;
1089*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s] Repeate: OrgFltId %ld, DupFltId %ld, u32pid 0x%lx\n", __FUNCTION__, OrgFltId, u32ii+TSP_SECFLT_NUM, u32pid));
1090*53ee8cc1Swenshuai.xi return TRUE;
1091*53ee8cc1Swenshuai.xi }
1092*53ee8cc1Swenshuai.xi }
1093*53ee8cc1Swenshuai.xi
1094*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32OrgFltListIdx] = u32pid;
1095*53ee8cc1Swenshuai.xi
1096*53ee8cc1Swenshuai.xi }
1097*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
1098*53ee8cc1Swenshuai.xi else if((OrgFltId >= (TSP_SECFLT_NUM+TSP_PIDFLT1_NUM)) && (OrgFltId < (TSP_SECFLT_NUM+TSP_PIDFLT1_NUM + DSCMB_FLT_NUM)))//Group TS2 -> Group TS1
1099*53ee8cc1Swenshuai.xi {
1100*53ee8cc1Swenshuai.xi u32OrgFltListIdx = OrgFltId - TSP_SECFLT_NUM - TSP_PIDFLT1_NUM;
1101*53ee8cc1Swenshuai.xi
1102*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] #2 u32OrgFltListIdx %ld \n" , __FUNCTION__, __LINE__, u32OrgFltListIdx));
1103*53ee8cc1Swenshuai.xi
1104*53ee8cc1Swenshuai.xi //TS2 has no share key filters
1105*53ee8cc1Swenshuai.xi if(u32OrgFltListIdx >= DSCMB_FLT_NUM)
1106*53ee8cc1Swenshuai.xi {
1107*53ee8cc1Swenshuai.xi return FALSE;
1108*53ee8cc1Swenshuai.xi }
1109*53ee8cc1Swenshuai.xi
1110*53ee8cc1Swenshuai.xi //searching the same pid in FLT1 and before current index
1111*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < DSCMB_FLT_NUM; u32ii++)
1112*53ee8cc1Swenshuai.xi {
1113*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii] == u32pid)
1114*53ee8cc1Swenshuai.xi {
1115*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef |= (1 << u32ii);
1116*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32OrgFltListIdx] = u32pid;
1117*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] Repeate: OrgFltId %ld, DupFltId %ld, u32pid 0x%lx\n", __FUNCTION__, __LINE__, OrgFltId, u32ii+TSP_SECFLT_NUM+TSP_PIDFLT1_NUM, u32pid));
1118*53ee8cc1Swenshuai.xi return TRUE;
1119*53ee8cc1Swenshuai.xi }
1120*53ee8cc1Swenshuai.xi }
1121*53ee8cc1Swenshuai.xi
1122*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32OrgFltListIdx] = u32pid;
1123*53ee8cc1Swenshuai.xi }
1124*53ee8cc1Swenshuai.xi #endif
1125*53ee8cc1Swenshuai.xi else
1126*53ee8cc1Swenshuai.xi {
1127*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] 333 OrgFltId %ld \n" , __FUNCTION__, __LINE__, OrgFltId));
1128*53ee8cc1Swenshuai.xi return FALSE;
1129*53ee8cc1Swenshuai.xi }
1130*53ee8cc1Swenshuai.xi
1131*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(HAL_TSP_GetPidFltReg(u32EngId, DupFltId), u32pid);
1132*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[DupFltId - TSP_SECFLT_NUM] = u32pid;
1133*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef |= (1 << (DupFltId - TSP_SECFLT_NUM));
1134*53ee8cc1Swenshuai.xi
1135*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] OrgFltId %ld, DupFltId %ld, u32pid 0x%lx\n", __FUNCTION__, __LINE__, OrgFltId, DupFltId, u32pid));
1136*53ee8cc1Swenshuai.xi
1137*53ee8cc1Swenshuai.xi return TRUE;
1138*53ee8cc1Swenshuai.xi }
1139*53ee8cc1Swenshuai.xi
1140*53ee8cc1Swenshuai.xi // If dscmb source from TS1, when live filter PIDs changing, also change dscmb PID mapping. (PVR filters)
_TSP_FLT1_DupFLT0_Pid(MS_U32 u32EngId,MS_U32 u32Flt0Id,MS_U32 u32Pid)1141*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_FLT1_DupFLT0_Pid(MS_U32 u32EngId, MS_U32 u32Flt0Id, MS_U32 u32Pid)
1142*53ee8cc1Swenshuai.xi {
1143*53ee8cc1Swenshuai.xi MS_U32 u32ii = 0, u32jj = 0, u32kk = 0, u32Flt1_id = 0;
1144*53ee8cc1Swenshuai.xi MS_U32 u32mask = 0, u32Flt0ListId = 0;
1145*53ee8cc1Swenshuai.xi MS_BOOL bFreeDscmbPid = FALSE;
1146*53ee8cc1Swenshuai.xi
1147*53ee8cc1Swenshuai.xi #ifdef EXT_PVR1_FLT
1148*53ee8cc1Swenshuai.xi MS_U32 u32DscmbFltNum = DSCMB_FLT_NUM_ALL;
1149*53ee8cc1Swenshuai.xi #else
1150*53ee8cc1Swenshuai.xi MS_U32 u32DscmbFltNum = DSCMB_FLT_NUM;
1151*53ee8cc1Swenshuai.xi #endif
1152*53ee8cc1Swenshuai.xi
1153*53ee8cc1Swenshuai.xi if( (_ptsp_res->_TspState[u32EngId].FltType[u32Flt0Id] == E_DRVTSP_FLT_TYPE_SECTION) ||
1154*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt0Id] == E_DRVTSP_FLT_TYPE_SECTION_NO_PUSI) ||
1155*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt0Id] == E_DRVTSP_FLT_TYPE_PACKET) ||
1156*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt0Id] == E_DRVTSP_FLT_TYPE_SECTION_VER) ||
1157*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt0Id] == E_DRVTSP_FLT_TYPE_PCR))
1158*53ee8cc1Swenshuai.xi {
1159*53ee8cc1Swenshuai.xi return FALSE;
1160*53ee8cc1Swenshuai.xi }
1161*53ee8cc1Swenshuai.xi
1162*53ee8cc1Swenshuai.xi // Not in TS1 CA mode , not need to duplicate FLT0 pid to FLT1
1163*53ee8cc1Swenshuai.xi if((HAL_TSP_CSA_Get_ScrmPath() & TSP_CA_INPUT_TSIF1) == 0)
1164*53ee8cc1Swenshuai.xi {
1165*53ee8cc1Swenshuai.xi return FALSE;
1166*53ee8cc1Swenshuai.xi }
1167*53ee8cc1Swenshuai.xi
1168*53ee8cc1Swenshuai.xi //If CA output to TS2 only, not need to duplicate FLT0 to FLT1
1169*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
1170*53ee8cc1Swenshuai.xi if((HAL_TSP_CSA_Get_ScrmPath() & (TSP_CA_OUTPUT_PLAY_LIVE|TSP_CA_OUTPUT_PLAY_LIVE2)) == TSP_CA_OUTPUT_PLAY_LIVE2)
1171*53ee8cc1Swenshuai.xi {
1172*53ee8cc1Swenshuai.xi return FALSE;
1173*53ee8cc1Swenshuai.xi }
1174*53ee8cc1Swenshuai.xi #endif
1175*53ee8cc1Swenshuai.xi
1176*53ee8cc1Swenshuai.xi //If Not PVRCA case, just duplicate FLT0 to FLT1 directly
1177*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._bFLT1Dup_Enable == FALSE)
1178*53ee8cc1Swenshuai.xi {
1179*53ee8cc1Swenshuai.xi if((HAL_TSP_CSA_Get_ScrmPath() & TSP_CA_OUTPUT_PLAY_LIVE) == 0)
1180*53ee8cc1Swenshuai.xi {
1181*53ee8cc1Swenshuai.xi return FALSE;
1182*53ee8cc1Swenshuai.xi }
1183*53ee8cc1Swenshuai.xi
1184*53ee8cc1Swenshuai.xi if(u32Flt0Id > DSCMB_FLT_END_ID)
1185*53ee8cc1Swenshuai.xi {
1186*53ee8cc1Swenshuai.xi return FALSE;
1187*53ee8cc1Swenshuai.xi }
1188*53ee8cc1Swenshuai.xi #ifdef EXT_PVR1_FLT
1189*53ee8cc1Swenshuai.xi // mapping FLT0 #0~#15 to FLT1 #16~#31
1190*53ee8cc1Swenshuai.xi if(u32Flt0Id <= DSCMB_FLT_SHAREKEY_END_ID)
1191*53ee8cc1Swenshuai.xi {
1192*53ee8cc1Swenshuai.xi u32Flt1_id = DSCMB_FLT_NUM + u32Flt0Id;
1193*53ee8cc1Swenshuai.xi }
1194*53ee8cc1Swenshuai.xi #endif
1195*53ee8cc1Swenshuai.xi
1196*53ee8cc1Swenshuai.xi // mapping FLT0 #16~#31 to FLT1 #0~#15
1197*53ee8cc1Swenshuai.xi if((u32Flt0Id <= DSCMB_FLT_END_ID) && (u32Flt0Id >= DSCMB_FLT_START_ID))
1198*53ee8cc1Swenshuai.xi {
1199*53ee8cc1Swenshuai.xi u32Flt1_id = u32Flt0Id - DSCMB_FLT_START_ID;
1200*53ee8cc1Swenshuai.xi }
1201*53ee8cc1Swenshuai.xi u32Flt0ListId = u32Flt1_id;
1202*53ee8cc1Swenshuai.xi
1203*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s] u32Flt0Id %ld, New PID 0x%lx, Old PID 0x%x\n",
1204*53ee8cc1Swenshuai.xi __FUNCTION__, u32Flt0Id, u32Pid, _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt0Id]));
1205*53ee8cc1Swenshuai.xi
1206*53ee8cc1Swenshuai.xi //=============================================//
1207*53ee8cc1Swenshuai.xi // Only put one pid in DSCMB list //
1208*53ee8cc1Swenshuai.xi //=============================================//
1209*53ee8cc1Swenshuai.xi
1210*53ee8cc1Swenshuai.xi //Free PID filter
1211*53ee8cc1Swenshuai.xi if(u32Pid == DRVTSP_PID_NULL)
1212*53ee8cc1Swenshuai.xi {
1213*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt0ListId] == DRVTSP_PID_NULL)
1214*53ee8cc1Swenshuai.xi {
1215*53ee8cc1Swenshuai.xi return FALSE;
1216*53ee8cc1Swenshuai.xi }
1217*53ee8cc1Swenshuai.xi
1218*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < u32DscmbFltNum; u32ii++)
1219*53ee8cc1Swenshuai.xi {
1220*53ee8cc1Swenshuai.xi // Find the same Pid in FLT1 list
1221*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt0ListId] == _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii])
1222*53ee8cc1Swenshuai.xi {
1223*53ee8cc1Swenshuai.xi //Check if the sam pid in FLT0, still use for dscmbling...
1224*53ee8cc1Swenshuai.xi for(u32jj = 0; u32jj < u32DscmbFltNum; u32jj++)
1225*53ee8cc1Swenshuai.xi {
1226*53ee8cc1Swenshuai.xi if(u32jj == u32Flt0ListId)
1227*53ee8cc1Swenshuai.xi continue;
1228*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32jj] == _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii])
1229*53ee8cc1Swenshuai.xi {
1230*53ee8cc1Swenshuai.xi break; //dscmb pid is still used
1231*53ee8cc1Swenshuai.xi }
1232*53ee8cc1Swenshuai.xi }
1233*53ee8cc1Swenshuai.xi if(u32jj == u32DscmbFltNum)
1234*53ee8cc1Swenshuai.xi {
1235*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef &= ~(1 << u32ii);
1236*53ee8cc1Swenshuai.xi }
1237*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt0ListId] = DRVTSP_PID_NULL;
1238*53ee8cc1Swenshuai.xi
1239*53ee8cc1Swenshuai.xi if(((_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR|_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef) & (1 << u32ii)) != 0)
1240*53ee8cc1Swenshuai.xi {
1241*53ee8cc1Swenshuai.xi return FALSE;
1242*53ee8cc1Swenshuai.xi }
1243*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(HAL_TSP_GetPidFltReg(u32EngId, u32ii + TSP_SECFLT_NUM), DRVTSP_PID_NULL);
1244*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii] = DRVTSP_PID_NULL;
1245*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s] Free Null pid, u32Flt0Id %ld, Flt1Id 0x%ld\n", __FUNCTION__, u32Flt0Id, u32ii));
1246*53ee8cc1Swenshuai.xi return TRUE;
1247*53ee8cc1Swenshuai.xi }
1248*53ee8cc1Swenshuai.xi }
1249*53ee8cc1Swenshuai.xi
1250*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt0ListId] = DRVTSP_PID_NULL;
1251*53ee8cc1Swenshuai.xi return FALSE;
1252*53ee8cc1Swenshuai.xi }
1253*53ee8cc1Swenshuai.xi
1254*53ee8cc1Swenshuai.xi //--- Checking mapping position first ----
1255*53ee8cc1Swenshuai.xi
1256*53ee8cc1Swenshuai.xi //--- 1st, find the same pid already in FLT1 list.....
1257*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < u32DscmbFltNum; u32ii++)
1258*53ee8cc1Swenshuai.xi {
1259*53ee8cc1Swenshuai.xi // Find the same Pid in FLT1 list
1260*53ee8cc1Swenshuai.xi if(u32Pid == _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii])
1261*53ee8cc1Swenshuai.xi {
1262*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef |= (1 << u32ii);
1263*53ee8cc1Swenshuai.xi break;
1264*53ee8cc1Swenshuai.xi }
1265*53ee8cc1Swenshuai.xi }
1266*53ee8cc1Swenshuai.xi
1267*53ee8cc1Swenshuai.xi //Sam pid found, check if the mapping position pid used, if not, free it
1268*53ee8cc1Swenshuai.xi if(u32ii < u32DscmbFltNum)
1269*53ee8cc1Swenshuai.xi {
1270*53ee8cc1Swenshuai.xi //ckeck if current pid is still for dscmbling....
1271*53ee8cc1Swenshuai.xi for(u32jj = 0; u32jj < u32DscmbFltNum; u32jj++)
1272*53ee8cc1Swenshuai.xi {
1273*53ee8cc1Swenshuai.xi if(u32jj == u32Flt0ListId)
1274*53ee8cc1Swenshuai.xi continue;
1275*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt0ListId] == _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32jj])
1276*53ee8cc1Swenshuai.xi {
1277*53ee8cc1Swenshuai.xi break;
1278*53ee8cc1Swenshuai.xi }
1279*53ee8cc1Swenshuai.xi }
1280*53ee8cc1Swenshuai.xi //if mapping dscmb pid is not used....
1281*53ee8cc1Swenshuai.xi if(u32jj == u32DscmbFltNum)
1282*53ee8cc1Swenshuai.xi {
1283*53ee8cc1Swenshuai.xi for(u32kk = 0; u32kk < u32DscmbFltNum; u32kk++)
1284*53ee8cc1Swenshuai.xi {
1285*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt0ListId] == _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32kk])
1286*53ee8cc1Swenshuai.xi {
1287*53ee8cc1Swenshuai.xi break;
1288*53ee8cc1Swenshuai.xi }
1289*53ee8cc1Swenshuai.xi }
1290*53ee8cc1Swenshuai.xi
1291*53ee8cc1Swenshuai.xi if(u32kk < u32DscmbFltNum)
1292*53ee8cc1Swenshuai.xi {
1293*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef &= ~(1 << u32kk);
1294*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(HAL_TSP_GetPidFltReg(u32EngId, u32kk + TSP_SECFLT_NUM), DRVTSP_PID_NULL);
1295*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32kk] = DRVTSP_PID_NULL;
1296*53ee8cc1Swenshuai.xi }
1297*53ee8cc1Swenshuai.xi }
1298*53ee8cc1Swenshuai.xi
1299*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s]Du32Flt0ListId %ld , u32Flt1_id %ld ---------------------\n", __FUNCTION__, u32Flt0ListId, u32ii));
1300*53ee8cc1Swenshuai.xi
1301*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt0ListId] = u32Pid;
1302*53ee8cc1Swenshuai.xi return TRUE;
1303*53ee8cc1Swenshuai.xi }
1304*53ee8cc1Swenshuai.xi //--- 1st, end...
1305*53ee8cc1Swenshuai.xi
1306*53ee8cc1Swenshuai.xi //2nd, find mapping position if empty, use it
1307*53ee8cc1Swenshuai.xi if(((_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR| _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef) & (1 << u32Flt1_id)) == 0)
1308*53ee8cc1Swenshuai.xi {
1309*53ee8cc1Swenshuai.xi goto UPDATE_PARAM;
1310*53ee8cc1Swenshuai.xi }
1311*53ee8cc1Swenshuai.xi
1312*53ee8cc1Swenshuai.xi //--- 3rd, if mapping position is not empty, checking if the dscmb pid still used...
1313*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < u32DscmbFltNum; u32ii++)
1314*53ee8cc1Swenshuai.xi {
1315*53ee8cc1Swenshuai.xi if(u32ii == u32Flt0ListId)
1316*53ee8cc1Swenshuai.xi continue;
1317*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32Flt1_id] == _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32ii])
1318*53ee8cc1Swenshuai.xi {
1319*53ee8cc1Swenshuai.xi break;
1320*53ee8cc1Swenshuai.xi }
1321*53ee8cc1Swenshuai.xi }
1322*53ee8cc1Swenshuai.xi if(u32ii == u32DscmbFltNum)
1323*53ee8cc1Swenshuai.xi {
1324*53ee8cc1Swenshuai.xi goto UPDATE_PARAM;
1325*53ee8cc1Swenshuai.xi }
1326*53ee8cc1Swenshuai.xi //--- 3rd, end...
1327*53ee8cc1Swenshuai.xi
1328*53ee8cc1Swenshuai.xi //4th, find any empty position for new pid, because mapping postion is occupied
1329*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < u32DscmbFltNum; u32ii++)
1330*53ee8cc1Swenshuai.xi {
1331*53ee8cc1Swenshuai.xi if(((_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR| _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef) & (1 << u32ii)) == 0)
1332*53ee8cc1Swenshuai.xi {
1333*53ee8cc1Swenshuai.xi u32Flt1_id = u32ii;
1334*53ee8cc1Swenshuai.xi goto UPDATE_PARAM;
1335*53ee8cc1Swenshuai.xi }
1336*53ee8cc1Swenshuai.xi }
1337*53ee8cc1Swenshuai.xi
1338*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] failed \n", __FUNCTION__, __LINE__));
1339*53ee8cc1Swenshuai.xi
1340*53ee8cc1Swenshuai.xi return FALSE;
1341*53ee8cc1Swenshuai.xi
1342*53ee8cc1Swenshuai.xi UPDATE_PARAM:
1343*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef |= (1 << u32Flt1_id);
1344*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt0ListId] = u32Pid;
1345*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32Flt1_id] = u32Pid;
1346*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(HAL_TSP_GetPidFltReg(u32EngId, u32Flt1_id + TSP_SECFLT_NUM), u32Pid);
1347*53ee8cc1Swenshuai.xi
1348*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s] u32Flt0Id %ld, u32Flt1_id %ld, PID 0x%lx\n", __FUNCTION__, u32Flt0Id, u32Flt1_id, u32Pid));
1349*53ee8cc1Swenshuai.xi
1350*53ee8cc1Swenshuai.xi return TRUE;
1351*53ee8cc1Swenshuai.xi }
1352*53ee8cc1Swenshuai.xi
1353*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s] u32Flt0Id %ld, PID 0x%lx\n", __FUNCTION__, u32Flt0Id, u32Pid));
1354*53ee8cc1Swenshuai.xi
1355*53ee8cc1Swenshuai.xi // transfer FLT0 index to FLT1 index
1356*53ee8cc1Swenshuai.xi if((u32Flt0Id >= DSCMB_FLT_START_ID) && (u32Flt0Id <= DSCMB_FLT_END_ID))
1357*53ee8cc1Swenshuai.xi {
1358*53ee8cc1Swenshuai.xi u32Flt1_id = u32Flt0Id - DSCMB_FLT_START_ID;
1359*53ee8cc1Swenshuai.xi }
1360*53ee8cc1Swenshuai.xi #ifdef EXT_PVR1_FLT
1361*53ee8cc1Swenshuai.xi else if((u32Flt0Id >= DSCMB_FLT_SHAREKEY_START_ID) && (u32Flt0Id <= DSCMB_FLT_SHAREKEY_END_ID))
1362*53ee8cc1Swenshuai.xi {
1363*53ee8cc1Swenshuai.xi u32Flt1_id = DSCMB_FLT_NUM + u32Flt0Id - DSCMB_FLT_SHAREKEY_START_ID;
1364*53ee8cc1Swenshuai.xi }
1365*53ee8cc1Swenshuai.xi #endif
1366*53ee8cc1Swenshuai.xi else
1367*53ee8cc1Swenshuai.xi {
1368*53ee8cc1Swenshuai.xi return FALSE; //not in dscmb filter range, not need to duplicate
1369*53ee8cc1Swenshuai.xi }
1370*53ee8cc1Swenshuai.xi
1371*53ee8cc1Swenshuai.xi // if pid is null or section type, free this dscmb pid setting
1372*53ee8cc1Swenshuai.xi if( (u32Pid == DRVTSP_PID_NULL) ||
1373*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt0Id] == E_DRVTSP_FLT_TYPE_SECTION) ||
1374*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt0Id] == E_DRVTSP_FLT_TYPE_SECTION_NO_PUSI) ||
1375*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt0Id] == E_DRVTSP_FLT_TYPE_PACKET) ||
1376*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt0Id] == E_DRVTSP_FLT_TYPE_SECTION_VER))
1377*53ee8cc1Swenshuai.xi {
1378*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt1_id] == DRVTSP_PID_NULL)
1379*53ee8cc1Swenshuai.xi {
1380*53ee8cc1Swenshuai.xi return TRUE;
1381*53ee8cc1Swenshuai.xi }
1382*53ee8cc1Swenshuai.xi else
1383*53ee8cc1Swenshuai.xi {
1384*53ee8cc1Swenshuai.xi bFreeDscmbPid = TRUE;
1385*53ee8cc1Swenshuai.xi }
1386*53ee8cc1Swenshuai.xi }
1387*53ee8cc1Swenshuai.xi
1388*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32Flt0Id %ld, PID 0x%lx\n", __FUNCTION__, __LINE__, u32Flt0Id, u32Pid));
1389*53ee8cc1Swenshuai.xi
1390*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------ //
1391*53ee8cc1Swenshuai.xi
1392*53ee8cc1Swenshuai.xi // Finding the same pid with live dscmb pid in PVR pid list, and release it
1393*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt1_id] != DRVTSP_PID_NULL)
1394*53ee8cc1Swenshuai.xi {
1395*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < u32DscmbFltNum; u32ii++)
1396*53ee8cc1Swenshuai.xi {
1397*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii] == DRVTSP_PID_NULL)
1398*53ee8cc1Swenshuai.xi continue;
1399*53ee8cc1Swenshuai.xi
1400*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii] == _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt1_id])
1401*53ee8cc1Swenshuai.xi {
1402*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef &= ~(1 << u32ii);
1403*53ee8cc1Swenshuai.xi if((_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR & (1 << u32ii)) == 0)
1404*53ee8cc1Swenshuai.xi {
1405*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii] = DRVTSP_PID_NULL;
1406*53ee8cc1Swenshuai.xi if(bFreeDscmbPid)
1407*53ee8cc1Swenshuai.xi {
1408*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(HAL_TSP_GetPidFltReg(u32EngId, u32ii + TSP_SECFLT_NUM), DRVTSP_PID_NULL);
1409*53ee8cc1Swenshuai.xi }
1410*53ee8cc1Swenshuai.xi }
1411*53ee8cc1Swenshuai.xi break;
1412*53ee8cc1Swenshuai.xi }
1413*53ee8cc1Swenshuai.xi }
1414*53ee8cc1Swenshuai.xi }
1415*53ee8cc1Swenshuai.xi
1416*53ee8cc1Swenshuai.xi // free dscmb pid
1417*53ee8cc1Swenshuai.xi if(bFreeDscmbPid)
1418*53ee8cc1Swenshuai.xi {
1419*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt1_id] = DRVTSP_PID_NULL;
1420*53ee8cc1Swenshuai.xi
1421*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "_u32Flt1Flag_DscmbRef 0x%lx, _u32Flt1Flag_DscmbPVR 0x%lx\n", \
1422*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef, _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR));
1423*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "#1 _u16Flt0DscmbPidList[%ld] 0x%x\n", u32Flt1_id, _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt1_id]));
1424*53ee8cc1Swenshuai.xi return TRUE;
1425*53ee8cc1Swenshuai.xi }
1426*53ee8cc1Swenshuai.xi
1427*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt1_id] = u32Pid;
1428*53ee8cc1Swenshuai.xi
1429*53ee8cc1Swenshuai.xi // Searching new pid in FLT1 list
1430*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < u32DscmbFltNum; u32ii++)
1431*53ee8cc1Swenshuai.xi {
1432*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii] == DRVTSP_PID_NULL)
1433*53ee8cc1Swenshuai.xi continue;
1434*53ee8cc1Swenshuai.xi
1435*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii] == u32Pid)
1436*53ee8cc1Swenshuai.xi {
1437*53ee8cc1Swenshuai.xi // If the same pid index is in the back, free it and setting the new pid in the front
1438*53ee8cc1Swenshuai.xi if((u32ii > u32Flt1_id) && ((_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR & (1 << u32Flt1_id)) == 0))
1439*53ee8cc1Swenshuai.xi {
1440*53ee8cc1Swenshuai.xi _TSP_SetNewDscmbPid2FLT1(u32EngId, u32Flt1_id, u32Pid);
1441*53ee8cc1Swenshuai.xi _TSP_FreeDscmbPid_In_FLT1(u32EngId, u32ii);
1442*53ee8cc1Swenshuai.xi }
1443*53ee8cc1Swenshuai.xi else
1444*53ee8cc1Swenshuai.xi {
1445*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef |= (1 << u32ii);
1446*53ee8cc1Swenshuai.xi }
1447*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "_u32Flt1Flag_DscmbRef 0x%lx, _u32Flt1Flag_DscmbPVR 0x%lx\n", \
1448*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef, _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR));
1449*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "#2 _u16Flt0DscmbPidList[%ld] 0x%x, _u16Flt1PidList[%ld] 0x%x\n", \
1450*53ee8cc1Swenshuai.xi u32Flt1_id, _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt1_id], u32ii, _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii]));
1451*53ee8cc1Swenshuai.xi return TRUE;
1452*53ee8cc1Swenshuai.xi }
1453*53ee8cc1Swenshuai.xi }
1454*53ee8cc1Swenshuai.xi
1455*53ee8cc1Swenshuai.xi // If not found the new pid in FLT1 list, setting one to FLT1 list
1456*53ee8cc1Swenshuai.xi if(u32ii == u32DscmbFltNum)
1457*53ee8cc1Swenshuai.xi {
1458*53ee8cc1Swenshuai.xi u32mask = _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef | _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR;
1459*53ee8cc1Swenshuai.xi
1460*53ee8cc1Swenshuai.xi //check corresponding position first
1461*53ee8cc1Swenshuai.xi if((u32mask & (1 << u32Flt1_id)) == 0)
1462*53ee8cc1Swenshuai.xi {
1463*53ee8cc1Swenshuai.xi u32ii = u32Flt1_id;
1464*53ee8cc1Swenshuai.xi }
1465*53ee8cc1Swenshuai.xi else
1466*53ee8cc1Swenshuai.xi {
1467*53ee8cc1Swenshuai.xi //finding a new empty position
1468*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < u32DscmbFltNum; u32ii++)
1469*53ee8cc1Swenshuai.xi {
1470*53ee8cc1Swenshuai.xi if((u32mask & 0x01) == 0)
1471*53ee8cc1Swenshuai.xi {
1472*53ee8cc1Swenshuai.xi break;
1473*53ee8cc1Swenshuai.xi }
1474*53ee8cc1Swenshuai.xi u32mask >>= 1;
1475*53ee8cc1Swenshuai.xi }
1476*53ee8cc1Swenshuai.xi }
1477*53ee8cc1Swenshuai.xi
1478*53ee8cc1Swenshuai.xi if(u32ii < u32DscmbFltNum)
1479*53ee8cc1Swenshuai.xi {
1480*53ee8cc1Swenshuai.xi _TSP_SetNewDscmbPid2FLT1(u32EngId, u32ii, u32Pid);
1481*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "_u32Flt1Flag_DscmbRef 0x%lx, _u32Flt1Flag_DscmbPVR 0x%lx\n", \
1482*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef, _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR));
1483*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "#3 _u16Flt0DscmbPidList[%ld] 0x%x, _u16Flt1PidList[%ld] 0x%x\n", \
1484*53ee8cc1Swenshuai.xi u32Flt1_id, _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32Flt1_id], u32ii, _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii]));
1485*53ee8cc1Swenshuai.xi return TRUE;
1486*53ee8cc1Swenshuai.xi }
1487*53ee8cc1Swenshuai.xi else
1488*53ee8cc1Swenshuai.xi {
1489*53ee8cc1Swenshuai.xi return FALSE;
1490*53ee8cc1Swenshuai.xi }
1491*53ee8cc1Swenshuai.xi }
1492*53ee8cc1Swenshuai.xi
1493*53ee8cc1Swenshuai.xi return FALSE;
1494*53ee8cc1Swenshuai.xi }
1495*53ee8cc1Swenshuai.xi
1496*53ee8cc1Swenshuai.xi // If dscmb source from TS1, and output to TS2, must duplicate FLT2 Pid to FLT1
1497*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
_TSP_FLT1_DupFLT2_Pid(MS_U32 u32EngId,MS_U32 u32Flt2Id,MS_U32 u32Pid)1498*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_FLT1_DupFLT2_Pid(MS_U32 u32EngId, MS_U32 u32Flt2Id, MS_U32 u32Pid)
1499*53ee8cc1Swenshuai.xi {
1500*53ee8cc1Swenshuai.xi MS_U32 u32CaPath = 0;
1501*53ee8cc1Swenshuai.xi MS_U32 u32ArrayIdx = 0, u32ii = 0, u32jj = 0, u32kk = 0, u32FLt1Id = 0;
1502*53ee8cc1Swenshuai.xi
1503*53ee8cc1Swenshuai.xi //only process FLT2
1504*53ee8cc1Swenshuai.xi if(u32Flt2Id < (TSP_SECFLT_NUM + TSP_PIDFLT1_NUM))
1505*53ee8cc1Swenshuai.xi return FALSE;
1506*53ee8cc1Swenshuai.xi
1507*53ee8cc1Swenshuai.xi // if pid is section type, free this dscmb pid setting
1508*53ee8cc1Swenshuai.xi if( (_ptsp_res->_TspState[u32EngId].FltType[u32Flt2Id] == E_DRVTSP_FLT_TYPE_SECTION) ||
1509*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt2Id] == E_DRVTSP_FLT_TYPE_SECTION_NO_PUSI) ||
1510*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt2Id] == E_DRVTSP_FLT_TYPE_PACKET) ||
1511*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt2Id] == E_DRVTSP_FLT_TYPE_SECTION_VER) ||
1512*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt2Id] == E_DRVTSP_FLT_TYPE_PCR))
1513*53ee8cc1Swenshuai.xi {
1514*53ee8cc1Swenshuai.xi return FALSE;
1515*53ee8cc1Swenshuai.xi }
1516*53ee8cc1Swenshuai.xi
1517*53ee8cc1Swenshuai.xi u32CaPath = HAL_TSP_CSA_Get_ScrmPath();
1518*53ee8cc1Swenshuai.xi
1519*53ee8cc1Swenshuai.xi //If CA input is TS2, not need to duplicate FLT2 to FLT1
1520*53ee8cc1Swenshuai.xi if(u32CaPath & TSP_CA_INPUT_TSIF2_EN)
1521*53ee8cc1Swenshuai.xi {
1522*53ee8cc1Swenshuai.xi return FALSE;
1523*53ee8cc1Swenshuai.xi }
1524*53ee8cc1Swenshuai.xi
1525*53ee8cc1Swenshuai.xi if((u32CaPath & TSP_CA_OUTPUT_PLAY_LIVE2) == 0)
1526*53ee8cc1Swenshuai.xi {
1527*53ee8cc1Swenshuai.xi return FALSE;
1528*53ee8cc1Swenshuai.xi }
1529*53ee8cc1Swenshuai.xi
1530*53ee8cc1Swenshuai.xi //=============================================//
1531*53ee8cc1Swenshuai.xi // Only put one pid in DSCMB list //
1532*53ee8cc1Swenshuai.xi //=============================================//
1533*53ee8cc1Swenshuai.xi
1534*53ee8cc1Swenshuai.xi u32ArrayIdx = u32Flt2Id - TSP_PIDFLT1_NUM - TSP_SECFLT_NUM;
1535*53ee8cc1Swenshuai.xi
1536*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s] u32Flt2Id %ld, New PID 0x%lx, Old PID 0x%x\n",
1537*53ee8cc1Swenshuai.xi __FUNCTION__, u32Flt2Id, u32Pid, _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ArrayIdx]));
1538*53ee8cc1Swenshuai.xi
1539*53ee8cc1Swenshuai.xi //Free PID filter
1540*53ee8cc1Swenshuai.xi if(u32Pid == DRVTSP_PID_NULL)
1541*53ee8cc1Swenshuai.xi {
1542*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ArrayIdx] == DRVTSP_PID_NULL)
1543*53ee8cc1Swenshuai.xi {
1544*53ee8cc1Swenshuai.xi return FALSE;
1545*53ee8cc1Swenshuai.xi }
1546*53ee8cc1Swenshuai.xi
1547*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < DSCMB_FLT_NUM; u32ii++)
1548*53ee8cc1Swenshuai.xi {
1549*53ee8cc1Swenshuai.xi // Find the same Pid in FLT1 list
1550*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ArrayIdx] == _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii])
1551*53ee8cc1Swenshuai.xi {
1552*53ee8cc1Swenshuai.xi //Check if the sam pid in FLT2, still use this dscmb pid...
1553*53ee8cc1Swenshuai.xi for(u32jj = 0; u32jj < DSCMB_FLT_NUM; u32jj++)
1554*53ee8cc1Swenshuai.xi {
1555*53ee8cc1Swenshuai.xi if(u32jj == u32ArrayIdx)
1556*53ee8cc1Swenshuai.xi continue;
1557*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32jj] == _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii])
1558*53ee8cc1Swenshuai.xi {
1559*53ee8cc1Swenshuai.xi break; //dscmb pid is still used
1560*53ee8cc1Swenshuai.xi }
1561*53ee8cc1Swenshuai.xi }
1562*53ee8cc1Swenshuai.xi if(u32jj == DSCMB_FLT_NUM)
1563*53ee8cc1Swenshuai.xi {
1564*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltType[u32Flt2Id] == E_DRVTSP_FLT_TYPE_CB)
1565*53ee8cc1Swenshuai.xi {
1566*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR &= ~(1 << u32ii);
1567*53ee8cc1Swenshuai.xi }
1568*53ee8cc1Swenshuai.xi else
1569*53ee8cc1Swenshuai.xi {
1570*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef &= ~(1 << u32ii);
1571*53ee8cc1Swenshuai.xi }
1572*53ee8cc1Swenshuai.xi }
1573*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ArrayIdx] = DRVTSP_PID_NULL;
1574*53ee8cc1Swenshuai.xi if(((_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR|_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef) & (1 << u32ii)) != 0)
1575*53ee8cc1Swenshuai.xi {
1576*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGE("TSP", "[%s][%d] Free Null pid used, u32Flt2Id %ld, Flt1Id 0x%ld\n", __FUNCTION__, __LINE__, u32ArrayIdx, u32ii));
1577*53ee8cc1Swenshuai.xi return FALSE;
1578*53ee8cc1Swenshuai.xi }
1579*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s] Free Null pid, u32Flt2Id %ld, Flt1Id 0x%ld\n", __FUNCTION__, u32ArrayIdx, u32ii));
1580*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(HAL_TSP_GetPidFltReg(u32EngId, u32ii + TSP_SECFLT_NUM), DRVTSP_PID_NULL);
1581*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii] = DRVTSP_PID_NULL;
1582*53ee8cc1Swenshuai.xi return TRUE;
1583*53ee8cc1Swenshuai.xi }
1584*53ee8cc1Swenshuai.xi }
1585*53ee8cc1Swenshuai.xi
1586*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ArrayIdx] = DRVTSP_PID_NULL;
1587*53ee8cc1Swenshuai.xi
1588*53ee8cc1Swenshuai.xi return FALSE;
1589*53ee8cc1Swenshuai.xi }
1590*53ee8cc1Swenshuai.xi
1591*53ee8cc1Swenshuai.xi //--- Checking mapping position first ----
1592*53ee8cc1Swenshuai.xi
1593*53ee8cc1Swenshuai.xi //--- 1st, find the same pid already in FLT1 list.....
1594*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < DSCMB_FLT_NUM; u32ii++)
1595*53ee8cc1Swenshuai.xi {
1596*53ee8cc1Swenshuai.xi // Find the same Pid in FLT1 list
1597*53ee8cc1Swenshuai.xi if(u32Pid == _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii])
1598*53ee8cc1Swenshuai.xi {
1599*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltType[u32Flt2Id] == E_DRVTSP_FLT_TYPE_CB)
1600*53ee8cc1Swenshuai.xi {
1601*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR |= (1 << u32ii);
1602*53ee8cc1Swenshuai.xi }
1603*53ee8cc1Swenshuai.xi else
1604*53ee8cc1Swenshuai.xi {
1605*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef |= (1 << u32ii);
1606*53ee8cc1Swenshuai.xi }
1607*53ee8cc1Swenshuai.xi break;
1608*53ee8cc1Swenshuai.xi }
1609*53ee8cc1Swenshuai.xi }
1610*53ee8cc1Swenshuai.xi //Sam pid found, check if the mapping position pid used, if not, free it
1611*53ee8cc1Swenshuai.xi if(u32ii < DSCMB_FLT_NUM)
1612*53ee8cc1Swenshuai.xi {
1613*53ee8cc1Swenshuai.xi for(u32jj = 0; u32jj < DSCMB_FLT_NUM; u32jj++)
1614*53ee8cc1Swenshuai.xi {
1615*53ee8cc1Swenshuai.xi if(u32jj == u32ArrayIdx)
1616*53ee8cc1Swenshuai.xi continue;
1617*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ArrayIdx] == _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32jj])
1618*53ee8cc1Swenshuai.xi {
1619*53ee8cc1Swenshuai.xi break;
1620*53ee8cc1Swenshuai.xi }
1621*53ee8cc1Swenshuai.xi }
1622*53ee8cc1Swenshuai.xi //Finding the same dscmb pid, if it is not used any more..., free it
1623*53ee8cc1Swenshuai.xi if(u32jj == DSCMB_FLT_NUM)
1624*53ee8cc1Swenshuai.xi {
1625*53ee8cc1Swenshuai.xi for(u32kk = 0; u32kk < DSCMB_FLT_NUM; u32kk++)
1626*53ee8cc1Swenshuai.xi {
1627*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ArrayIdx] == _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32kk])
1628*53ee8cc1Swenshuai.xi {
1629*53ee8cc1Swenshuai.xi break;
1630*53ee8cc1Swenshuai.xi }
1631*53ee8cc1Swenshuai.xi }
1632*53ee8cc1Swenshuai.xi if(u32kk < DSCMB_FLT_NUM)
1633*53ee8cc1Swenshuai.xi {
1634*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltType[u32Flt2Id] == E_DRVTSP_FLT_TYPE_CB)
1635*53ee8cc1Swenshuai.xi {
1636*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR &= ~(1 << u32kk);
1637*53ee8cc1Swenshuai.xi }
1638*53ee8cc1Swenshuai.xi else
1639*53ee8cc1Swenshuai.xi {
1640*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef &= ~(1 << u32kk);
1641*53ee8cc1Swenshuai.xi }
1642*53ee8cc1Swenshuai.xi if(((_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR| _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef) & (1 << u32kk)) == 0)
1643*53ee8cc1Swenshuai.xi {
1644*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(HAL_TSP_GetPidFltReg(u32EngId, u32kk + TSP_SECFLT_NUM), DRVTSP_PID_NULL);
1645*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32kk] = DRVTSP_PID_NULL;
1646*53ee8cc1Swenshuai.xi }
1647*53ee8cc1Swenshuai.xi }
1648*53ee8cc1Swenshuai.xi }
1649*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ArrayIdx] = u32Pid;
1650*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32Flt2ListId %ld , u32Flt1_id %ld ---------------------\n",
1651*53ee8cc1Swenshuai.xi __FUNCTION__, __LINE__, u32ArrayIdx, u32ii));
1652*53ee8cc1Swenshuai.xi return TRUE;
1653*53ee8cc1Swenshuai.xi }
1654*53ee8cc1Swenshuai.xi //--- 1st, end...
1655*53ee8cc1Swenshuai.xi
1656*53ee8cc1Swenshuai.xi //2nd, find mapping position if empty, use it
1657*53ee8cc1Swenshuai.xi if(((_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR| _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef) & (1 << u32ArrayIdx)) == 0)
1658*53ee8cc1Swenshuai.xi {
1659*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltType[u32Flt2Id] == E_DRVTSP_FLT_TYPE_CB)
1660*53ee8cc1Swenshuai.xi {
1661*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR |= (1 << u32ArrayIdx);
1662*53ee8cc1Swenshuai.xi }
1663*53ee8cc1Swenshuai.xi else
1664*53ee8cc1Swenshuai.xi {
1665*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef |= (1 << u32ArrayIdx);
1666*53ee8cc1Swenshuai.xi }
1667*53ee8cc1Swenshuai.xi u32FLt1Id = u32ArrayIdx;
1668*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32Flt2ListId %ld , u32Flt1_id %ld ---------------------\n",
1669*53ee8cc1Swenshuai.xi __FUNCTION__, __LINE__, u32ArrayIdx, u32FLt1Id));
1670*53ee8cc1Swenshuai.xi goto SET_PID;
1671*53ee8cc1Swenshuai.xi }
1672*53ee8cc1Swenshuai.xi
1673*53ee8cc1Swenshuai.xi //--- 3rd, if mapping position is not empty, checking if the dscmb pid still used...
1674*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < DSCMB_FLT_NUM; u32ii++)
1675*53ee8cc1Swenshuai.xi {
1676*53ee8cc1Swenshuai.xi if(u32ii == u32ArrayIdx)
1677*53ee8cc1Swenshuai.xi continue;
1678*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ArrayIdx] == _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ii])
1679*53ee8cc1Swenshuai.xi {
1680*53ee8cc1Swenshuai.xi break;
1681*53ee8cc1Swenshuai.xi }
1682*53ee8cc1Swenshuai.xi }
1683*53ee8cc1Swenshuai.xi if(u32ii == DSCMB_FLT_NUM)
1684*53ee8cc1Swenshuai.xi {
1685*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltType[u32Flt2Id] == E_DRVTSP_FLT_TYPE_CB)
1686*53ee8cc1Swenshuai.xi {
1687*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR |= (1 << u32ArrayIdx);
1688*53ee8cc1Swenshuai.xi }
1689*53ee8cc1Swenshuai.xi else
1690*53ee8cc1Swenshuai.xi {
1691*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef |= (1 << u32ArrayIdx);
1692*53ee8cc1Swenshuai.xi }
1693*53ee8cc1Swenshuai.xi u32FLt1Id = u32ArrayIdx;
1694*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32Flt2ListId %ld , u32Flt1_id %ld ---------------------\n",
1695*53ee8cc1Swenshuai.xi __FUNCTION__, __LINE__, u32ArrayIdx, u32FLt1Id));
1696*53ee8cc1Swenshuai.xi goto SET_PID;
1697*53ee8cc1Swenshuai.xi }
1698*53ee8cc1Swenshuai.xi //--- 3rd, end...
1699*53ee8cc1Swenshuai.xi
1700*53ee8cc1Swenshuai.xi //4th, find any empty position for new pid, because mapping postion is occupied
1701*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < DSCMB_FLT_NUM; u32ii++)
1702*53ee8cc1Swenshuai.xi {
1703*53ee8cc1Swenshuai.xi if(((_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR| _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef) & (1 << u32ii)) == 0)
1704*53ee8cc1Swenshuai.xi {
1705*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltType[u32Flt2Id] == E_DRVTSP_FLT_TYPE_CB)
1706*53ee8cc1Swenshuai.xi {
1707*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR |= (1 << u32ii);
1708*53ee8cc1Swenshuai.xi }
1709*53ee8cc1Swenshuai.xi else
1710*53ee8cc1Swenshuai.xi {
1711*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef |= (1 << u32ii);
1712*53ee8cc1Swenshuai.xi }
1713*53ee8cc1Swenshuai.xi u32FLt1Id = u32ii;
1714*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32Flt2ListId %ld , u32Flt1_id %ld ---------------------\n",
1715*53ee8cc1Swenshuai.xi __FUNCTION__, __LINE__, u32ArrayIdx, u32FLt1Id));
1716*53ee8cc1Swenshuai.xi goto SET_PID;
1717*53ee8cc1Swenshuai.xi }
1718*53ee8cc1Swenshuai.xi }
1719*53ee8cc1Swenshuai.xi
1720*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGE("TSP", "[%s][%d] failed \n", __FUNCTION__, __LINE__));
1721*53ee8cc1Swenshuai.xi
1722*53ee8cc1Swenshuai.xi return FALSE;
1723*53ee8cc1Swenshuai.xi
1724*53ee8cc1Swenshuai.xi SET_PID:
1725*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(HAL_TSP_GetPidFltReg(u32EngId, u32FLt1Id + TSP_SECFLT_NUM), u32Pid);
1726*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32FLt1Id] = u32Pid;
1727*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt2PidList[u32ArrayIdx] = u32Pid;
1728*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32Flt2Id %ld, u32Flt1Id %ld, PID 0x%lx\n", __FUNCTION__, __LINE__, u32Flt2Id, u32FLt1Id, u32Pid));
1729*53ee8cc1Swenshuai.xi return TRUE;
1730*53ee8cc1Swenshuai.xi
1731*53ee8cc1Swenshuai.xi }
1732*53ee8cc1Swenshuai.xi #endif //end TS2_IF_SUPPORT
1733*53ee8cc1Swenshuai.xi
1734*53ee8cc1Swenshuai.xi #endif
1735*53ee8cc1Swenshuai.xi
_TSP_PidFlt_Init(MS_U32 u32EngId,MS_U32 u32PidFltId)1736*53ee8cc1Swenshuai.xi static void _TSP_PidFlt_Init(MS_U32 u32EngId, MS_U32 u32PidFltId)
1737*53ee8cc1Swenshuai.xi {
1738*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
1739*53ee8cc1Swenshuai.xi if(u32PidFltId >= TSP_HWPCR_FLT_START_ID)
1740*53ee8cc1Swenshuai.xi {
1741*53ee8cc1Swenshuai.xi MS_U32 idx = u32PidFltId - TSP_HWPCR_FLT_START_ID;
1742*53ee8cc1Swenshuai.xi
1743*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_HWPcrFlt_Enable(idx, FALSE);
1744*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetHWPcrPid(idx, DRVTSP_PID_NULL);
1745*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_SelSrc(idx, 0);
1746*53ee8cc1Swenshuai.xi }
1747*53ee8cc1Swenshuai.xi else
1748*53ee8cc1Swenshuai.xi {
1749*53ee8cc1Swenshuai.xi #endif
1750*53ee8cc1Swenshuai.xi REG_PidFlt *pPidFilter = HAL_TSP_GetPidFltReg(u32EngId, u32PidFltId);
1751*53ee8cc1Swenshuai.xi
1752*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(pPidFilter, DRVTSP_PID_NULL);
1753*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(pPidFilter, TSP_PIDFLT_OUT_NONE);
1754*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelSecFlt(pPidFilter, TSP_PIDFLT_SECFLT_NULL);
1755*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltMap[u32PidFltId] = DRVTSP_MAP_NULL;
1756*53ee8cc1Swenshuai.xi
1757*53ee8cc1Swenshuai.xi #ifndef NO_CA
1758*53ee8cc1Swenshuai.xi _TSP_FLT1_DupFLT0_Pid(0, u32PidFltId, DRVTSP_PID_NULL);
1759*53ee8cc1Swenshuai.xi #endif
1760*53ee8cc1Swenshuai.xi
1761*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
1762*53ee8cc1Swenshuai.xi }
1763*53ee8cc1Swenshuai.xi #endif
1764*53ee8cc1Swenshuai.xi }
1765*53ee8cc1Swenshuai.xi
_TSP_PidFlt_Disable(MS_U32 u32EngId,MS_U32 u32PidFltId)1766*53ee8cc1Swenshuai.xi static void _TSP_PidFlt_Disable(MS_U32 u32EngId, MS_U32 u32PidFltId)
1767*53ee8cc1Swenshuai.xi {
1768*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
1769*53ee8cc1Swenshuai.xi if(u32PidFltId >= TSP_HWPCR_FLT_START_ID)
1770*53ee8cc1Swenshuai.xi {
1771*53ee8cc1Swenshuai.xi MS_U32 u32Idx = u32PidFltId - TSP_HWPCR_FLT_START_ID;
1772*53ee8cc1Swenshuai.xi
1773*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_HWPcrFlt_Enable(u32Idx, FALSE);
1774*53ee8cc1Swenshuai.xi #if (TSP_HWPCR_BY_HK == 1)
1775*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_Int_Enable(u32Idx, FALSE);
1776*53ee8cc1Swenshuai.xi _TSP_RemoveHwPcrNotifyId(u32Idx);
1777*53ee8cc1Swenshuai.xi #endif
1778*53ee8cc1Swenshuai.xi }
1779*53ee8cc1Swenshuai.xi else
1780*53ee8cc1Swenshuai.xi {
1781*53ee8cc1Swenshuai.xi #endif
1782*53ee8cc1Swenshuai.xi
1783*53ee8cc1Swenshuai.xi REG_PidFlt *pPidFilter = HAL_TSP_GetPidFltReg(u32EngId, u32PidFltId);
1784*53ee8cc1Swenshuai.xi
1785*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(pPidFilter, TSP_PIDFLT_OUT_NONE);
1786*53ee8cc1Swenshuai.xi //HAL_TSP_SecFlt_SetRmnCount(&(_TspSec[u32EngId].Flt[u32PidFltId]), 0);
1787*53ee8cc1Swenshuai.xi
1788*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
1789*53ee8cc1Swenshuai.xi }
1790*53ee8cc1Swenshuai.xi #endif
1791*53ee8cc1Swenshuai.xi
1792*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] &= (DrvTSP_FltState)(~E_DRVTSP_FLT_STATE_ENABLE);
1793*53ee8cc1Swenshuai.xi }
1794*53ee8cc1Swenshuai.xi
1795*53ee8cc1Swenshuai.xi //Note: This is only for PID filter & Section filter to be one by one mapping, and section filter number is equal to pid filter number.
_TSP_PidFlt_Alloc(MS_U32 u32EngId,DrvTSP_FltType eFilterType,MS_U32 * pu32PidFltId)1796*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_PidFlt_Alloc(MS_U32 u32EngId, DrvTSP_FltType eFilterType, MS_U32 *pu32PidFltId)
1797*53ee8cc1Swenshuai.xi {
1798*53ee8cc1Swenshuai.xi int i = 0;
1799*53ee8cc1Swenshuai.xi MS_U32 pid_idx_start = 0;
1800*53ee8cc1Swenshuai.xi MS_U32 pid_idx_end = 0;
1801*53ee8cc1Swenshuai.xi MS_BOOL bFound = FALSE;
1802*53ee8cc1Swenshuai.xi
1803*53ee8cc1Swenshuai.xi *pu32PidFltId = 0xFFFFFFFF;
1804*53ee8cc1Swenshuai.xi
1805*53ee8cc1Swenshuai.xi // input parameter validation
1806*53ee8cc1Swenshuai.xi if ( (u32EngId >= TSP_ENGINE_NUM) ||
1807*53ee8cc1Swenshuai.xi ((eFilterType&~E_DRVTSP_FLT_MASK) >= E_DRVTSP_FLT_TYPE_LAST_ENUM) )
1808*53ee8cc1Swenshuai.xi {
1809*53ee8cc1Swenshuai.xi TSP_ASSERT(0, TSP_DBG("[TSP_ERROR][%06d] (EngId, FilterType)= (%d %x)\n", __LINE__, (unsigned int)u32EngId, (unsigned int)eFilterType));
1810*53ee8cc1Swenshuai.xi return FALSE;
1811*53ee8cc1Swenshuai.xi }
1812*53ee8cc1Swenshuai.xi
1813*53ee8cc1Swenshuai.xi //TS2 live pid filter allocate
1814*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
1815*53ee8cc1Swenshuai.xi if ((E_DRVTSP_FLT_TYPE_CB== (eFilterType&~E_DRVTSP_FLT_MASK))
1816*53ee8cc1Swenshuai.xi || ((eFilterType & E_DRVTSP_FLT_SOURCE_TYPE_TS2) &&
1817*53ee8cc1Swenshuai.xi ((E_DRVTSP_FLT_TYPE_PCR == (eFilterType&~E_DRVTSP_FLT_MASK)) || ((eFilterType & E_DRVTSP_FLT_TYPE_SECTION_MASK) == 0))))
1818*53ee8cc1Swenshuai.xi {
1819*53ee8cc1Swenshuai.xi pid_idx_start = (TSP_PIDFLT_NUM_ALL & 0xFFFFFFFE) - 1; //except of HW PCR
1820*53ee8cc1Swenshuai.xi pid_idx_end = TSP_SECFLT_NUM + TSP_PIDFLT1_NUM;
1821*53ee8cc1Swenshuai.xi for(i = (int)pid_idx_start; i >= (int)pid_idx_end; i--)
1822*53ee8cc1Swenshuai.xi {
1823*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1824*53ee8cc1Swenshuai.xi {
1825*53ee8cc1Swenshuai.xi bFound = TRUE;
1826*53ee8cc1Swenshuai.xi break;
1827*53ee8cc1Swenshuai.xi }
1828*53ee8cc1Swenshuai.xi }
1829*53ee8cc1Swenshuai.xi }
1830*53ee8cc1Swenshuai.xi else if((eFilterType&E_DRVTSP_FLT_MASK) == E_DRVTSP_FLT_SOURCE_TYPE_TS2)
1831*53ee8cc1Swenshuai.xi {
1832*53ee8cc1Swenshuai.xi pid_idx_start = TSP_SECFLT_NUM+TSP_PIDFLT1_NUM;
1833*53ee8cc1Swenshuai.xi pid_idx_end = TSP_PIDFLT_NUM_ALL & 0xFFFFFFFE; //except of HW PCR
1834*53ee8cc1Swenshuai.xi for(i = (int)pid_idx_start; i < (int)pid_idx_end; i++)
1835*53ee8cc1Swenshuai.xi {
1836*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1837*53ee8cc1Swenshuai.xi {
1838*53ee8cc1Swenshuai.xi bFound = TRUE;
1839*53ee8cc1Swenshuai.xi break;
1840*53ee8cc1Swenshuai.xi }
1841*53ee8cc1Swenshuai.xi }
1842*53ee8cc1Swenshuai.xi }
1843*53ee8cc1Swenshuai.xi else
1844*53ee8cc1Swenshuai.xi #endif
1845*53ee8cc1Swenshuai.xi
1846*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
1847*53ee8cc1Swenshuai.xi if(E_DRVTSP_FLT_TYPE_PCR == (eFilterType&~E_DRVTSP_FLT_MASK))
1848*53ee8cc1Swenshuai.xi {
1849*53ee8cc1Swenshuai.xi for(i = TSP_HWPCR_FLT_START_ID; i < TSP_PIDFLT_NUM_ALL; i++)
1850*53ee8cc1Swenshuai.xi {
1851*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1852*53ee8cc1Swenshuai.xi {
1853*53ee8cc1Swenshuai.xi bFound = TRUE;
1854*53ee8cc1Swenshuai.xi break;
1855*53ee8cc1Swenshuai.xi }
1856*53ee8cc1Swenshuai.xi }
1857*53ee8cc1Swenshuai.xi }
1858*53ee8cc1Swenshuai.xi else
1859*53ee8cc1Swenshuai.xi #endif
1860*53ee8cc1Swenshuai.xi #ifdef DSCMB_SHAREKEY_FLT
1861*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_TYPE_SCMB_SHAREKEY == (eFilterType & E_DRVTSP_FLT_TYPE_SCMB_SHAREKEY))
1862*53ee8cc1Swenshuai.xi {
1863*53ee8cc1Swenshuai.xi for (i = DSCMB_FLT_SHAREKEY_END_ID; i >= DSCMB_FLT_SHAREKEY_START_ID; i--)
1864*53ee8cc1Swenshuai.xi {
1865*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1866*53ee8cc1Swenshuai.xi {
1867*53ee8cc1Swenshuai.xi bFound = TRUE;
1868*53ee8cc1Swenshuai.xi break;
1869*53ee8cc1Swenshuai.xi }
1870*53ee8cc1Swenshuai.xi }
1871*53ee8cc1Swenshuai.xi }
1872*53ee8cc1Swenshuai.xi else
1873*53ee8cc1Swenshuai.xi #endif
1874*53ee8cc1Swenshuai.xi if ((E_DRVTSP_FLT_TYPE_SCMB == (eFilterType & E_DRVTSP_FLT_SCMB_MASK)) ||
1875*53ee8cc1Swenshuai.xi #ifndef HWPCR_ENABLE
1876*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_PCR == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
1877*53ee8cc1Swenshuai.xi #endif
1878*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_VIDEO == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
1879*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_AUDIO == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
1880*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_AUDIO2 == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
1881*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_VIDEO3D == (eFilterType&~E_DRVTSP_FLT_MASK)) )
1882*53ee8cc1Swenshuai.xi {
1883*53ee8cc1Swenshuai.xi #ifndef NO_CA
1884*53ee8cc1Swenshuai.xi for (i = DSCMB_FLT_END_ID; i >= DSCMB_FLT_START_ID; i--)
1885*53ee8cc1Swenshuai.xi #else
1886*53ee8cc1Swenshuai.xi for (i = TSP_SECFLT_NUM - 1; i >= 0; i--)
1887*53ee8cc1Swenshuai.xi #endif
1888*53ee8cc1Swenshuai.xi {
1889*53ee8cc1Swenshuai.xi //Reserved filter #31 for NMatch temp writting, can not be used for section data
1890*53ee8cc1Swenshuai.xi if((i == 31) && (!((E_DRVTSP_FLT_TYPE_VIDEO == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
1891*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_AUDIO == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
1892*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_AUDIO2 == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
1893*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_VIDEO3D == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
1894*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_PCR == (eFilterType&~E_DRVTSP_FLT_MASK)))))
1895*53ee8cc1Swenshuai.xi {
1896*53ee8cc1Swenshuai.xi continue;
1897*53ee8cc1Swenshuai.xi }
1898*53ee8cc1Swenshuai.xi
1899*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1900*53ee8cc1Swenshuai.xi {
1901*53ee8cc1Swenshuai.xi bFound = TRUE;
1902*53ee8cc1Swenshuai.xi break;
1903*53ee8cc1Swenshuai.xi }
1904*53ee8cc1Swenshuai.xi }
1905*53ee8cc1Swenshuai.xi
1906*53ee8cc1Swenshuai.xi if((bFound == FALSE) && (eFilterType & E_DRVTSP_FLT_SCMB_MASK))
1907*53ee8cc1Swenshuai.xi {
1908*53ee8cc1Swenshuai.xi TSP_ASSERT(0, TSP_DBG("[TSP_ERROR][%06d] No Free dscmb filters !!!\n", __LINE__));
1909*53ee8cc1Swenshuai.xi }
1910*53ee8cc1Swenshuai.xi
1911*53ee8cc1Swenshuai.xi //if not scmb type, find another filter range
1912*53ee8cc1Swenshuai.xi #ifndef NO_CA
1913*53ee8cc1Swenshuai.xi if((bFound == FALSE) && ((eFilterType & E_DRVTSP_FLT_SCMB_MASK) == 0))
1914*53ee8cc1Swenshuai.xi {
1915*53ee8cc1Swenshuai.xi pid_idx_start= TSP_SECFLT_NUM - 1;
1916*53ee8cc1Swenshuai.xi pid_idx_end= 0;
1917*53ee8cc1Swenshuai.xi for (i = (int)pid_idx_start; i >= (int)pid_idx_end; i--)
1918*53ee8cc1Swenshuai.xi {
1919*53ee8cc1Swenshuai.xi //dscmb range has checked, skip
1920*53ee8cc1Swenshuai.xi if(i == DSCMB_FLT_END_ID)
1921*53ee8cc1Swenshuai.xi {
1922*53ee8cc1Swenshuai.xi i = DSCMB_FLT_START_ID;
1923*53ee8cc1Swenshuai.xi continue;
1924*53ee8cc1Swenshuai.xi }
1925*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1926*53ee8cc1Swenshuai.xi {
1927*53ee8cc1Swenshuai.xi bFound = TRUE;
1928*53ee8cc1Swenshuai.xi break;
1929*53ee8cc1Swenshuai.xi }
1930*53ee8cc1Swenshuai.xi }
1931*53ee8cc1Swenshuai.xi }
1932*53ee8cc1Swenshuai.xi #endif
1933*53ee8cc1Swenshuai.xi }
1934*53ee8cc1Swenshuai.xi else
1935*53ee8cc1Swenshuai.xi {
1936*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_TYPE_PVR== (eFilterType&~E_DRVTSP_FLT_MASK))
1937*53ee8cc1Swenshuai.xi {
1938*53ee8cc1Swenshuai.xi #ifndef NO_PVR
1939*53ee8cc1Swenshuai.xi if ((eFilterType&E_DRVTSP_FLT_SOURCE_TYPE_MASK) == E_DRVTSP_FLT_SOURCE_TYPE_FILE)
1940*53ee8cc1Swenshuai.xi {
1941*53ee8cc1Swenshuai.xi pid_idx_start= 0;
1942*53ee8cc1Swenshuai.xi pid_idx_end= TSP_SECFLT_NUM;
1943*53ee8cc1Swenshuai.xi }
1944*53ee8cc1Swenshuai.xi else
1945*53ee8cc1Swenshuai.xi {
1946*53ee8cc1Swenshuai.xi pid_idx_start= TSP_SECFLT_NUM;
1947*53ee8cc1Swenshuai.xi pid_idx_end= TSP_SECFLT_NUM + TSP_PIDFLT1_NUM;
1948*53ee8cc1Swenshuai.xi }
1949*53ee8cc1Swenshuai.xi #endif
1950*53ee8cc1Swenshuai.xi }
1951*53ee8cc1Swenshuai.xi else
1952*53ee8cc1Swenshuai.xi {
1953*53ee8cc1Swenshuai.xi pid_idx_start= 0;
1954*53ee8cc1Swenshuai.xi pid_idx_end= TSP_SECFLT_NUM;
1955*53ee8cc1Swenshuai.xi }
1956*53ee8cc1Swenshuai.xi
1957*53ee8cc1Swenshuai.xi for (i = (int)pid_idx_start; i < (int)pid_idx_end; i++)
1958*53ee8cc1Swenshuai.xi {
1959*53ee8cc1Swenshuai.xi //Reserved filter #31 for NMatch temp writting, can not be used for section data
1960*53ee8cc1Swenshuai.xi if(i == 31)
1961*53ee8cc1Swenshuai.xi {
1962*53ee8cc1Swenshuai.xi continue;
1963*53ee8cc1Swenshuai.xi }
1964*53ee8cc1Swenshuai.xi
1965*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1966*53ee8cc1Swenshuai.xi {
1967*53ee8cc1Swenshuai.xi bFound = TRUE;
1968*53ee8cc1Swenshuai.xi break;
1969*53ee8cc1Swenshuai.xi }
1970*53ee8cc1Swenshuai.xi }
1971*53ee8cc1Swenshuai.xi
1972*53ee8cc1Swenshuai.xi }
1973*53ee8cc1Swenshuai.xi
1974*53ee8cc1Swenshuai.xi if (bFound == FALSE)
1975*53ee8cc1Swenshuai.xi {
1976*53ee8cc1Swenshuai.xi TSP_ASSERT(0, TSP_DBG("[TSP_ERROR][%06d] No free fitler found 0x%02x\n", __LINE__, i));
1977*53ee8cc1Swenshuai.xi return FALSE;
1978*53ee8cc1Swenshuai.xi }
1979*53ee8cc1Swenshuai.xi
1980*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[i] = E_DRVTSP_FLT_STATE_ALLOC;
1981*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltType[i] = (eFilterType&(DrvTSP_FltType)(~E_DRVTSP_FLT_MASK));
1982*53ee8cc1Swenshuai.xi
1983*53ee8cc1Swenshuai.xi if ((eFilterType&E_DRVTSP_FLT_SOURCE_TYPE_MASK) == E_DRVTSP_FLT_SOURCE_TYPE_LIVE)
1984*53ee8cc1Swenshuai.xi {
1985*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[i] = E_DRVTSP_FLT_SOURCE_TYPE_LIVE;
1986*53ee8cc1Swenshuai.xi }
1987*53ee8cc1Swenshuai.xi else if ((eFilterType&E_DRVTSP_FLT_SOURCE_TYPE_MASK) == E_DRVTSP_FLT_SOURCE_TYPE_FILE)
1988*53ee8cc1Swenshuai.xi {
1989*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[i] = E_DRVTSP_FLT_SOURCE_TYPE_FILE;
1990*53ee8cc1Swenshuai.xi }
1991*53ee8cc1Swenshuai.xi else if ((eFilterType&E_DRVTSP_FLT_SOURCE_TYPE_MASK) == E_DRVTSP_FLT_SOURCE_TYPE_TS2)
1992*53ee8cc1Swenshuai.xi {
1993*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[i] = E_DRVTSP_FLT_SOURCE_TYPE_TS2;
1994*53ee8cc1Swenshuai.xi }
1995*53ee8cc1Swenshuai.xi
1996*53ee8cc1Swenshuai.xi _TSP_PidFlt_Init(u32EngId, i);
1997*53ee8cc1Swenshuai.xi *pu32PidFltId = i;
1998*53ee8cc1Swenshuai.xi
1999*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s] eFilterType %lx , id %d\n", __FUNCTION__, eFilterType, i);
2000*53ee8cc1Swenshuai.xi
2001*53ee8cc1Swenshuai.xi return TRUE;
2002*53ee8cc1Swenshuai.xi }
2003*53ee8cc1Swenshuai.xi
_TSP_PidFlt_Free(MS_U32 u32EngId,MS_U32 u32PidFltId,MS_BOOL bResetState)2004*53ee8cc1Swenshuai.xi static TSP_Result _TSP_PidFlt_Free(MS_U32 u32EngId, MS_U32 u32PidFltId, MS_BOOL bResetState)
2005*53ee8cc1Swenshuai.xi {
2006*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId = _ptsp_res->_TspState[u32EngId].FltMap[u32PidFltId];
2007*53ee8cc1Swenshuai.xi
2008*53ee8cc1Swenshuai.xi if ( (u32EngId >= TSP_ENGINE_NUM) ||
2009*53ee8cc1Swenshuai.xi (u32PidFltId >= TSP_PIDFLT_NUM_ALL) ||
2010*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] == E_DRVTSP_FLT_STATE_FREE) )
2011*53ee8cc1Swenshuai.xi {
2012*53ee8cc1Swenshuai.xi //TSP_DBG("[TSP_ERROR][%06d] (EngId, PidFltId, FilterState)= (%ld %ld %d)\n", __LINE__, u32EngId, u32PidFltId, _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId]);
2013*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("[TSP_ERROR][%06d] Bad free parmeter\n",__LINE__));;
2014*53ee8cc1Swenshuai.xi return (TSP_Result)FALSE;
2015*53ee8cc1Swenshuai.xi }
2016*53ee8cc1Swenshuai.xi
2017*53ee8cc1Swenshuai.xi _TSP_PidFlt_Disable(u32EngId, u32PidFltId);
2018*53ee8cc1Swenshuai.xi
2019*53ee8cc1Swenshuai.xi // Release Filter
2020*53ee8cc1Swenshuai.xi _TSP_PidFlt_Init(u32EngId, u32PidFltId);
2021*53ee8cc1Swenshuai.xi
2022*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
2023*53ee8cc1Swenshuai.xi if(u32PidFltId < TSP_HWPCR_FLT_START_ID)
2024*53ee8cc1Swenshuai.xi {
2025*53ee8cc1Swenshuai.xi #endif
2026*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelSecFlt(HAL_TSP_GetPidFltReg(u32EngId, u32PidFltId), TSP_PIDFLT_SECFLT_NULL);
2027*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltMap[u32PidFltId] = DRVTSP_MAP_NULL;
2028*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
2029*53ee8cc1Swenshuai.xi }
2030*53ee8cc1Swenshuai.xi #endif
2031*53ee8cc1Swenshuai.xi
2032*53ee8cc1Swenshuai.xi // clear all event while filter free
2033*53ee8cc1Swenshuai.xi if(u32SecFltId < TSP_SECFLT_NUM_All)
2034*53ee8cc1Swenshuai.xi {
2035*53ee8cc1Swenshuai.xi MS_U32 u32Dummy = 0;
2036*53ee8cc1Swenshuai.xi _TSP_GetSecOvfId (u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
2037*53ee8cc1Swenshuai.xi _TSP_GetSecCrcId (u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
2038*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId (u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
2039*53ee8cc1Swenshuai.xi _TSP_GetFltDisableId(u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
2040*53ee8cc1Swenshuai.xi }
2041*53ee8cc1Swenshuai.xi
2042*53ee8cc1Swenshuai.xi if (bResetState)
2043*53ee8cc1Swenshuai.xi {
2044*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] = E_DRVTSP_FLT_STATE_FREE;
2045*53ee8cc1Swenshuai.xi }
2046*53ee8cc1Swenshuai.xi
2047*53ee8cc1Swenshuai.xi // Reset call back function without PVR
2048*53ee8cc1Swenshuai.xi if (u32SecFltId < TSP_SECFLT_NUM_All)
2049*53ee8cc1Swenshuai.xi {
2050*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltCallback[u32SecFltId] = NULL;
2051*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltMode[u32SecFltId] = E_DRVTSP_FLT_MODE_CONTI;
2052*53ee8cc1Swenshuai.xi }
2053*53ee8cc1Swenshuai.xi
2054*53ee8cc1Swenshuai.xi return (TSP_Result)TRUE;
2055*53ee8cc1Swenshuai.xi }
2056*53ee8cc1Swenshuai.xi
_TSP_PidFlt_StateGet(MS_U32 u32EngId,MS_U32 u32PidFltId,DrvTSP_FltState * peState)2057*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_PidFlt_StateGet(MS_U32 u32EngId, MS_U32 u32PidFltId, DrvTSP_FltState *peState)
2058*53ee8cc1Swenshuai.xi {
2059*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId;
2060*53ee8cc1Swenshuai.xi MS_U32 u32GroupId = (((u32PidFltId & 0x1f) > 0) ? 1: 0);
2061*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
2062*53ee8cc1Swenshuai.xi REG_PidFlt *pPidFilter = NULL;
2063*53ee8cc1Swenshuai.xi
2064*53ee8cc1Swenshuai.xi TSP_ASSERT(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
2065*53ee8cc1Swenshuai.xi TSP_ASSERT(TSP_PIDFLT_NUM_ALL> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFlt Id %d\n", __LINE__, (unsigned int)u32PidFltId));
2066*53ee8cc1Swenshuai.xi TSP_ASSERT(peState, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
2067*53ee8cc1Swenshuai.xi
2068*53ee8cc1Swenshuai.xi *peState= _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId];
2069*53ee8cc1Swenshuai.xi
2070*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
2071*53ee8cc1Swenshuai.xi if(u32PidFltId >= TSP_HWPCR_FLT_START_ID)
2072*53ee8cc1Swenshuai.xi {
2073*53ee8cc1Swenshuai.xi return TRUE;
2074*53ee8cc1Swenshuai.xi }
2075*53ee8cc1Swenshuai.xi #endif
2076*53ee8cc1Swenshuai.xi
2077*53ee8cc1Swenshuai.xi pPidFilter= HAL_TSP_GetPidFltReg(u32EngId, u32PidFltId);
2078*53ee8cc1Swenshuai.xi if(u32PidFltId < TSP_SECFLT_NUM)
2079*53ee8cc1Swenshuai.xi {
2080*53ee8cc1Swenshuai.xi if (HAL_TSP_Scmb_Status(0, u32GroupId, u32PidFltId) || HAL_TSP_Scmb_Status(1, u32GroupId, u32PidFltId))
2081*53ee8cc1Swenshuai.xi {
2082*53ee8cc1Swenshuai.xi *peState |= E_DRVTSP_FLT_STATE_SCRAMBLED;
2083*53ee8cc1Swenshuai.xi }
2084*53ee8cc1Swenshuai.xi }
2085*53ee8cc1Swenshuai.xi
2086*53ee8cc1Swenshuai.xi switch (_ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
2087*53ee8cc1Swenshuai.xi {
2088*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO:
2089*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO:
2090*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO2:
2091*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO3D:
2092*53ee8cc1Swenshuai.xi break;
2093*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION:
2094*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PES:
2095*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PACKET:
2096*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_TELETEXT:
2097*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION_VER:
2098*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION_NO_PUSI:
2099*53ee8cc1Swenshuai.xi u32SecFltId = HAL_TSP_PidFlt_GetSecFlt(pPidFilter);
2100*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
2101*53ee8cc1Swenshuai.xi if (HAL_TSP_SecBuf_GetBufRead(pSecFilter) != HAL_TSP_SecBuf_GetBufWrite(pSecFilter))
2102*53ee8cc1Swenshuai.xi {
2103*53ee8cc1Swenshuai.xi *peState |= E_DRVTSP_FLT_STATE_STREAM_AVAIL;
2104*53ee8cc1Swenshuai.xi }
2105*53ee8cc1Swenshuai.xi break;
2106*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PCR:
2107*53ee8cc1Swenshuai.xi default:
2108*53ee8cc1Swenshuai.xi break;
2109*53ee8cc1Swenshuai.xi }
2110*53ee8cc1Swenshuai.xi return TRUE;
2111*53ee8cc1Swenshuai.xi }
2112*53ee8cc1Swenshuai.xi
2113*53ee8cc1Swenshuai.xi
_TSP_SecFlt_SetType(REG_SecFlt * pSecFilter,DrvTSP_FltType eSecFltType)2114*53ee8cc1Swenshuai.xi static void _TSP_SecFlt_SetType(REG_SecFlt *pSecFilter, DrvTSP_FltType eSecFltType)
2115*53ee8cc1Swenshuai.xi {
2116*53ee8cc1Swenshuai.xi MS_U32 u32FltType = TSP_SECFLT_TYPE_SEC;
2117*53ee8cc1Swenshuai.xi
2118*53ee8cc1Swenshuai.xi switch (eSecFltType)
2119*53ee8cc1Swenshuai.xi {
2120*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_TELETEXT:
2121*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_TTX;
2122*53ee8cc1Swenshuai.xi break;
2123*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PCR:
2124*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_PCR;
2125*53ee8cc1Swenshuai.xi break;
2126*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PES:
2127*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_PES;
2128*53ee8cc1Swenshuai.xi break;
2129*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION:
2130*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_SEC;
2131*53ee8cc1Swenshuai.xi break;
2132*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PACKET:
2133*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_PKT;
2134*53ee8cc1Swenshuai.xi break;
2135*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_ECM:
2136*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_ECM;
2137*53ee8cc1Swenshuai.xi break;
2138*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_EMM:
2139*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_EMM;
2140*53ee8cc1Swenshuai.xi break;
2141*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION_VER:
2142*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_VER;
2143*53ee8cc1Swenshuai.xi break;
2144*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION_NO_PUSI:
2145*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_SEC_NO_PUSI;
2146*53ee8cc1Swenshuai.xi break;
2147*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PVR:
2148*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
2149*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_CB:
2150*53ee8cc1Swenshuai.xi #endif
2151*53ee8cc1Swenshuai.xi default:
2152*53ee8cc1Swenshuai.xi break;
2153*53ee8cc1Swenshuai.xi }
2154*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetType(pSecFilter, u32FltType);
2155*53ee8cc1Swenshuai.xi }
2156*53ee8cc1Swenshuai.xi
_TSP_SecFlt_StateGet(MS_U32 u32EngId,MS_U32 u32SecFltId,DrvTSP_FltState * peState)2157*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_SecFlt_StateGet(MS_U32 u32EngId, MS_U32 u32SecFltId, DrvTSP_FltState *peState)
2158*53ee8cc1Swenshuai.xi {
2159*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
2160*53ee8cc1Swenshuai.xi
2161*53ee8cc1Swenshuai.xi TSP_ASSERT(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
2162*53ee8cc1Swenshuai.xi TSP_ASSERT(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)u32SecFltId));
2163*53ee8cc1Swenshuai.xi TSP_ASSERT(peState, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
2164*53ee8cc1Swenshuai.xi
2165*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
2166*53ee8cc1Swenshuai.xi *peState = _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId];
2167*53ee8cc1Swenshuai.xi if (HAL_TSP_SecFlt_GetState(pSecFilter) & TSP_SECFLT_STATE_OVERFLOW)
2168*53ee8cc1Swenshuai.xi {
2169*53ee8cc1Swenshuai.xi *peState |= E_DRVTSP_FLT_STATE_OVERFLOW;
2170*53ee8cc1Swenshuai.xi }
2171*53ee8cc1Swenshuai.xi return TRUE;
2172*53ee8cc1Swenshuai.xi }
2173*53ee8cc1Swenshuai.xi
_TSP_SecFlt_Init(MS_U32 u32EngId,MS_U32 u32SecFltId)2174*53ee8cc1Swenshuai.xi static void _TSP_SecFlt_Init(MS_U32 u32EngId, MS_U32 u32SecFltId)
2175*53ee8cc1Swenshuai.xi {
2176*53ee8cc1Swenshuai.xi static MS_U8 u8Mask[TSP_FILTER_DEPTH] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2177*53ee8cc1Swenshuai.xi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
2178*53ee8cc1Swenshuai.xi static MS_U8 u8NMask[TSP_FILTER_DEPTH] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2179*53ee8cc1Swenshuai.xi 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
2180*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
2181*53ee8cc1Swenshuai.xi
2182*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_ClrCtrl(pSecFilter);
2183*53ee8cc1Swenshuai.xi
2184*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SelSecBuf(pSecFilter, TSP_SECFLT_BUF_NULL, FALSE);
2185*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetMatch(pSecFilter, u8Mask);
2186*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetMask(pSecFilter, u8NMask);
2187*53ee8cc1Swenshuai.xi //HAL_TSP_SecFlt_SetNMask(&(_TspSec[u32EngId].Flt[u32SecFltId]), u8Mask);
2188*53ee8cc1Swenshuai.xi _TSP_SecFlt_SetType(pSecFilter, E_DRVTSP_FLT_TYPE_SECTION);
2189*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetReqCount(pSecFilter, 0);
2190*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_ResetState(pSecFilter);
2191*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].SecFltEvtNotify[u32SecFltId] = E_DRVTSP_EVENT_DATA_INIT;
2192*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].SecFltCallback[u32SecFltId] = NULL;
2193*53ee8cc1Swenshuai.xi }
2194*53ee8cc1Swenshuai.xi
_TSP_SecFlt_Alloc(MS_U32 u32EngId,DrvTSP_FltType eFilterType,MS_U32 * pu32SecFltId)2195*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_SecFlt_Alloc(MS_U32 u32EngId, DrvTSP_FltType eFilterType, MS_U32 *pu32SecFltId)
2196*53ee8cc1Swenshuai.xi {
2197*53ee8cc1Swenshuai.xi int i = 0, flt_idx_start = 0, flt_idx_end = 0;
2198*53ee8cc1Swenshuai.xi MS_BOOL bFound = FALSE;
2199*53ee8cc1Swenshuai.xi MS_U8 u8SecFlt_num = TSP_SECFLT_NUM;
2200*53ee8cc1Swenshuai.xi
2201*53ee8cc1Swenshuai.xi i = *pu32SecFltId;
2202*53ee8cc1Swenshuai.xi *pu32SecFltId = 0xFFFFFFFF;
2203*53ee8cc1Swenshuai.xi
2204*53ee8cc1Swenshuai.xi if ((i < TSP_SECFLT_NUM_All) && (_ptsp_res->_TspState[u32EngId].SecFltState[i] == E_DRVTSP_FLT_STATE_FREE))
2205*53ee8cc1Swenshuai.xi {
2206*53ee8cc1Swenshuai.xi bFound = TRUE;
2207*53ee8cc1Swenshuai.xi goto SECFLT_ALC_END;
2208*53ee8cc1Swenshuai.xi }
2209*53ee8cc1Swenshuai.xi
2210*53ee8cc1Swenshuai.xi #ifdef DSCMB_SHAREKEY_FLT
2211*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_TYPE_SCMB_SHAREKEY == (eFilterType & E_DRVTSP_FLT_TYPE_SCMB_SHAREKEY))
2212*53ee8cc1Swenshuai.xi {
2213*53ee8cc1Swenshuai.xi for (i = DSCMB_FLT_SHAREKEY_END_ID; i >= DSCMB_FLT_SHAREKEY_START_ID; i--)
2214*53ee8cc1Swenshuai.xi {
2215*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].SecFltState[i] == E_DRVTSP_FLT_STATE_FREE)
2216*53ee8cc1Swenshuai.xi {
2217*53ee8cc1Swenshuai.xi bFound = TRUE;
2218*53ee8cc1Swenshuai.xi break;
2219*53ee8cc1Swenshuai.xi }
2220*53ee8cc1Swenshuai.xi }
2221*53ee8cc1Swenshuai.xi }
2222*53ee8cc1Swenshuai.xi else
2223*53ee8cc1Swenshuai.xi #endif
2224*53ee8cc1Swenshuai.xi if ((E_DRVTSP_FLT_TYPE_SCMB == (eFilterType & E_DRVTSP_FLT_SCMB_MASK)) ||
2225*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_VIDEO== (eFilterType&~E_DRVTSP_FLT_MASK))||
2226*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_AUDIO== (eFilterType&~E_DRVTSP_FLT_MASK))||
2227*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_AUDIO2== (eFilterType&~E_DRVTSP_FLT_MASK))||
2228*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_VIDEO3D== (eFilterType&~E_DRVTSP_FLT_MASK))||
2229*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_PCR== (eFilterType&~E_DRVTSP_FLT_MASK)))
2230*53ee8cc1Swenshuai.xi {
2231*53ee8cc1Swenshuai.xi for (i = DSCMB_FLT_END_ID; i >= 0; i--)
2232*53ee8cc1Swenshuai.xi {
2233*53ee8cc1Swenshuai.xi //Reserved filter #31 for NMatch temp writting, can not be used for section data
2234*53ee8cc1Swenshuai.xi if((i == 31) && (!((E_DRVTSP_FLT_TYPE_VIDEO == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
2235*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_AUDIO == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
2236*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_AUDIO2 == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
2237*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_VIDEO3D == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
2238*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_PCR == (eFilterType&~E_DRVTSP_FLT_MASK)))))
2239*53ee8cc1Swenshuai.xi {
2240*53ee8cc1Swenshuai.xi continue;
2241*53ee8cc1Swenshuai.xi }
2242*53ee8cc1Swenshuai.xi
2243*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].SecFltState[i] == E_DRVTSP_FLT_STATE_FREE)
2244*53ee8cc1Swenshuai.xi {
2245*53ee8cc1Swenshuai.xi bFound = TRUE;
2246*53ee8cc1Swenshuai.xi break;
2247*53ee8cc1Swenshuai.xi }
2248*53ee8cc1Swenshuai.xi }
2249*53ee8cc1Swenshuai.xi if((bFound == FALSE) && (u8SecFlt_num > (DSCMB_FLT_END_ID+1)))
2250*53ee8cc1Swenshuai.xi {
2251*53ee8cc1Swenshuai.xi flt_idx_start= TSP_SECFLT_NUM - 1;
2252*53ee8cc1Swenshuai.xi flt_idx_end= DSCMB_FLT_END_ID;
2253*53ee8cc1Swenshuai.xi for (i = flt_idx_start ; i > flt_idx_end ; i--)
2254*53ee8cc1Swenshuai.xi {
2255*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].SecFltState[i] == E_DRVTSP_FLT_STATE_FREE)
2256*53ee8cc1Swenshuai.xi {
2257*53ee8cc1Swenshuai.xi bFound = TRUE;
2258*53ee8cc1Swenshuai.xi break;
2259*53ee8cc1Swenshuai.xi }
2260*53ee8cc1Swenshuai.xi }
2261*53ee8cc1Swenshuai.xi }
2262*53ee8cc1Swenshuai.xi }
2263*53ee8cc1Swenshuai.xi else
2264*53ee8cc1Swenshuai.xi {
2265*53ee8cc1Swenshuai.xi for (i = 0; i < TSP_SECFLT_NUM; i++)
2266*53ee8cc1Swenshuai.xi {
2267*53ee8cc1Swenshuai.xi //Reserved filter #31 for NMatch temp writting, can not be used for section data
2268*53ee8cc1Swenshuai.xi if(i == 31)
2269*53ee8cc1Swenshuai.xi {
2270*53ee8cc1Swenshuai.xi continue;
2271*53ee8cc1Swenshuai.xi }
2272*53ee8cc1Swenshuai.xi
2273*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].SecFltState[i] == E_DRVTSP_FLT_STATE_FREE)
2274*53ee8cc1Swenshuai.xi {
2275*53ee8cc1Swenshuai.xi bFound = TRUE;
2276*53ee8cc1Swenshuai.xi break;
2277*53ee8cc1Swenshuai.xi }
2278*53ee8cc1Swenshuai.xi }
2279*53ee8cc1Swenshuai.xi }
2280*53ee8cc1Swenshuai.xi
2281*53ee8cc1Swenshuai.xi SECFLT_ALC_END:
2282*53ee8cc1Swenshuai.xi
2283*53ee8cc1Swenshuai.xi if (bFound == FALSE)
2284*53ee8cc1Swenshuai.xi {
2285*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%06d] Allocate Sec Filter Failed\n", __LINE__);
2286*53ee8cc1Swenshuai.xi return FALSE;
2287*53ee8cc1Swenshuai.xi }
2288*53ee8cc1Swenshuai.xi
2289*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltState[i] = E_DRVTSP_FLT_STATE_ALLOC;
2290*53ee8cc1Swenshuai.xi _TSP_SecFlt_Init(u32EngId, i);
2291*53ee8cc1Swenshuai.xi *pu32SecFltId = i;
2292*53ee8cc1Swenshuai.xi _TSP_SetSecNotifyId(*pu32SecFltId); //for isr processing checking
2293*53ee8cc1Swenshuai.xi
2294*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s] %d \n", __FUNCTION__, i);
2295*53ee8cc1Swenshuai.xi
2296*53ee8cc1Swenshuai.xi return TRUE;
2297*53ee8cc1Swenshuai.xi }
2298*53ee8cc1Swenshuai.xi
_TSP_SecFlt_Free(MS_U32 u32EngId,MS_U32 u32SecFltId,MS_BOOL bResetState)2299*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_SecFlt_Free(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_BOOL bResetState)
2300*53ee8cc1Swenshuai.xi {
2301*53ee8cc1Swenshuai.xi //REG_SecFlt *pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
2302*53ee8cc1Swenshuai.xi
2303*53ee8cc1Swenshuai.xi //HAL_TSP_SecFlt_ResetEmmIdx(pSecFilter);
2304*53ee8cc1Swenshuai.xi //HAL_TSP_SecFlt_SelSecBuf(pSecFilter, TSP_SECFLT_BUF_NULL, FALSE);
2305*53ee8cc1Swenshuai.xi if (bResetState)
2306*53ee8cc1Swenshuai.xi {
2307*53ee8cc1Swenshuai.xi // clear all event while filter free,
2308*53ee8cc1Swenshuai.xi MS_U32 u32Dummy = 0;
2309*53ee8cc1Swenshuai.xi _TSP_GetSecOvfId (u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
2310*53ee8cc1Swenshuai.xi _TSP_GetSecCrcId (u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
2311*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId (u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
2312*53ee8cc1Swenshuai.xi _TSP_GetFltDisableId(u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
2313*53ee8cc1Swenshuai.xi
2314*53ee8cc1Swenshuai.xi _TSP_RemoveSecNotifyId(u32SecFltId);
2315*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId] = E_DRVTSP_FLT_STATE_FREE;
2316*53ee8cc1Swenshuai.xi
2317*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s] %ld \n", __FUNCTION__, u32SecFltId);
2318*53ee8cc1Swenshuai.xi }
2319*53ee8cc1Swenshuai.xi
2320*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] = E_DRVTSP_EVENT_DATA_INIT;
2321*53ee8cc1Swenshuai.xi return TRUE;
2322*53ee8cc1Swenshuai.xi }
2323*53ee8cc1Swenshuai.xi
2324*53ee8cc1Swenshuai.xi
_TSP_SecBuf_Init(MS_U32 u32EngId,MS_U32 u32SecBufId)2325*53ee8cc1Swenshuai.xi static void _TSP_SecBuf_Init(MS_U32 u32EngId, MS_U32 u32SecBufId)
2326*53ee8cc1Swenshuai.xi {
2327*53ee8cc1Swenshuai.xi REG_SecFlt *pSecBuf= _TSP_GET_SECFLT_REG(u32SecBufId);
2328*53ee8cc1Swenshuai.xi
2329*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_SetBuffer(pSecBuf, 0UL, 0UL);
2330*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_ResetBuffer(pSecBuf);
2331*53ee8cc1Swenshuai.xi }
2332*53ee8cc1Swenshuai.xi
_TSP_SecBuf_Alloc(MS_U32 u32EngId,MS_U32 * pu32SecBufId)2333*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_SecBuf_Alloc(MS_U32 u32EngId, MS_U32 *pu32SecBufId)
2334*53ee8cc1Swenshuai.xi {
2335*53ee8cc1Swenshuai.xi int i = *pu32SecBufId;
2336*53ee8cc1Swenshuai.xi
2337*53ee8cc1Swenshuai.xi *pu32SecBufId = 0xFFFFFFFF;
2338*53ee8cc1Swenshuai.xi
2339*53ee8cc1Swenshuai.xi if ((i < TSP_SECBUF_NUM) && (_ptsp_res->_TspState[u32EngId].SecBufState[i] == E_DRVTSP_FLT_STATE_FREE))
2340*53ee8cc1Swenshuai.xi {
2341*53ee8cc1Swenshuai.xi goto SECBUF_ALC_END;
2342*53ee8cc1Swenshuai.xi }
2343*53ee8cc1Swenshuai.xi
2344*53ee8cc1Swenshuai.xi for (i = 0; i < TSP_SECBUF_NUM; i++)
2345*53ee8cc1Swenshuai.xi {
2346*53ee8cc1Swenshuai.xi //Reserved filter #31 for NMatch temp writting, can not be used for section data
2347*53ee8cc1Swenshuai.xi if(i == 31)
2348*53ee8cc1Swenshuai.xi {
2349*53ee8cc1Swenshuai.xi continue;
2350*53ee8cc1Swenshuai.xi }
2351*53ee8cc1Swenshuai.xi
2352*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].SecBufState[i] == E_DRVTSP_FLT_STATE_FREE)
2353*53ee8cc1Swenshuai.xi {
2354*53ee8cc1Swenshuai.xi break;
2355*53ee8cc1Swenshuai.xi }
2356*53ee8cc1Swenshuai.xi }
2357*53ee8cc1Swenshuai.xi if (i == TSP_SECBUF_NUM)
2358*53ee8cc1Swenshuai.xi {
2359*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%06d] Allocate Sec Buf Failed\n", __LINE__);
2360*53ee8cc1Swenshuai.xi return FALSE;
2361*53ee8cc1Swenshuai.xi }
2362*53ee8cc1Swenshuai.xi
2363*53ee8cc1Swenshuai.xi SECBUF_ALC_END:
2364*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecBufState[i] = E_DRVTSP_FLT_STATE_ALLOC;
2365*53ee8cc1Swenshuai.xi *pu32SecBufId = i;
2366*53ee8cc1Swenshuai.xi
2367*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s] %d \n", __FUNCTION__, i);
2368*53ee8cc1Swenshuai.xi return TRUE;
2369*53ee8cc1Swenshuai.xi }
2370*53ee8cc1Swenshuai.xi
_TSP_SecBuf_Free(MS_U32 u32EngId,MS_U32 u32SecBufId)2371*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_SecBuf_Free(MS_U32 u32EngId, MS_U32 u32SecBufId)
2372*53ee8cc1Swenshuai.xi {
2373*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecBufState[u32SecBufId] = E_DRVTSP_FLT_STATE_FREE;
2374*53ee8cc1Swenshuai.xi return TRUE;
2375*53ee8cc1Swenshuai.xi }
2376*53ee8cc1Swenshuai.xi
_TSP_RegStateReset(void)2377*53ee8cc1Swenshuai.xi static void _TSP_RegStateReset(void)
2378*53ee8cc1Swenshuai.xi {
2379*53ee8cc1Swenshuai.xi MS_U32 u32EngId;
2380*53ee8cc1Swenshuai.xi MS_U32 u32FilterId;
2381*53ee8cc1Swenshuai.xi
2382*53ee8cc1Swenshuai.xi for (u32EngId = 0; u32EngId < TSP_ENGINE_NUM; u32EngId++)
2383*53ee8cc1Swenshuai.xi {
2384*53ee8cc1Swenshuai.xi for (u32FilterId = 0; u32FilterId < TSP_PIDFLT_NUM_ALL; u32FilterId++)
2385*53ee8cc1Swenshuai.xi {
2386*53ee8cc1Swenshuai.xi _TSP_PidFlt_Init(u32EngId, u32FilterId);
2387*53ee8cc1Swenshuai.xi }
2388*53ee8cc1Swenshuai.xi for (u32FilterId = 0; u32FilterId < TSP_SECFLT_NUM_All; u32FilterId++)
2389*53ee8cc1Swenshuai.xi {
2390*53ee8cc1Swenshuai.xi _TSP_SecBuf_Init(u32EngId, u32FilterId);
2391*53ee8cc1Swenshuai.xi //HAL_TSP_SecBuf_SetBuffer(&(_TspSec[u32EngId].Flt[u32FilterId]), 0, 0);
2392*53ee8cc1Swenshuai.xi _TSP_SecFlt_Init(u32EngId, u32FilterId);
2393*53ee8cc1Swenshuai.xi }
2394*53ee8cc1Swenshuai.xi }
2395*53ee8cc1Swenshuai.xi }
2396*53ee8cc1Swenshuai.xi
_TSP_SelPad(MS_U32 u32EngId,DrvTSP_If eIf,DrvTSP_If_Set * pIfSet)2397*53ee8cc1Swenshuai.xi static TSP_Result _TSP_SelPad(MS_U32 u32EngId, DrvTSP_If eIf, DrvTSP_If_Set* pIfSet)
2398*53ee8cc1Swenshuai.xi {
2399*53ee8cc1Swenshuai.xi MS_U32 u32Flow = 0;
2400*53ee8cc1Swenshuai.xi
2401*53ee8cc1Swenshuai.xi if (u32EngId>= TSP_ENGINE_NUM)
2402*53ee8cc1Swenshuai.xi {
2403*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
2404*53ee8cc1Swenshuai.xi }
2405*53ee8cc1Swenshuai.xi
2406*53ee8cc1Swenshuai.xi switch (eIf)
2407*53ee8cc1Swenshuai.xi {
2408*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_PLAYBACK:
2409*53ee8cc1Swenshuai.xi u32Flow = 0;
2410*53ee8cc1Swenshuai.xi break;
2411*53ee8cc1Swenshuai.xi #ifndef NO_PVR
2412*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_PVR0:
2413*53ee8cc1Swenshuai.xi u32Flow = 1;
2414*53ee8cc1Swenshuai.xi break;
2415*53ee8cc1Swenshuai.xi #endif
2416*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
2417*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_PVR1:
2418*53ee8cc1Swenshuai.xi u32Flow = 2;
2419*53ee8cc1Swenshuai.xi break;
2420*53ee8cc1Swenshuai.xi #endif
2421*53ee8cc1Swenshuai.xi default:
2422*53ee8cc1Swenshuai.xi MS_ASSERT(0);
2423*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
2424*53ee8cc1Swenshuai.xi }
2425*53ee8cc1Swenshuai.xi
2426*53ee8cc1Swenshuai.xi HAL_TSP_SelPad(u32EngId, u32Flow, (MS_U32)pIfSet->ePad);
2427*53ee8cc1Swenshuai.xi HAL_TSP_SelPad_ClkInv(u32EngId, u32Flow, pIfSet->bClkInv);
2428*53ee8cc1Swenshuai.xi HAL_TSP_SelPad_ExtSync(u32EngId, pIfSet->bExtSync, u32Flow);
2429*53ee8cc1Swenshuai.xi HAL_TSP_SelPad_Parl(u32EngId, pIfSet->bParallel, u32Flow);
2430*53ee8cc1Swenshuai.xi
2431*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
2432*53ee8cc1Swenshuai.xi if((pIfSet->bParallel == FALSE) && (pIfSet->ePad == E_DRVTSP_PAD_EXT_INPUT2))
2433*53ee8cc1Swenshuai.xi {
2434*53ee8cc1Swenshuai.xi HAL_TSP_TS2Out_En(TRUE);
2435*53ee8cc1Swenshuai.xi }
2436*53ee8cc1Swenshuai.xi else
2437*53ee8cc1Swenshuai.xi {
2438*53ee8cc1Swenshuai.xi HAL_TSP_TS2Out_En(FALSE);
2439*53ee8cc1Swenshuai.xi }
2440*53ee8cc1Swenshuai.xi #endif
2441*53ee8cc1Swenshuai.xi
2442*53ee8cc1Swenshuai.xi return DRVTSP_OK;
2443*53ee8cc1Swenshuai.xi }
2444*53ee8cc1Swenshuai.xi
2445*53ee8cc1Swenshuai.xi #if 0
_TSP_IsPidFltFreeDefer(MS_U32 u32PidFltId)2446*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_IsPidFltFreeDefer(MS_U32 u32PidFltId)
2447*53ee8cc1Swenshuai.xi {
2448*53ee8cc1Swenshuai.xi MS_U32 u32Flag = 0;
2449*53ee8cc1Swenshuai.xi
2450*53ee8cc1Swenshuai.xi if (u32PidFltId < TSP_SECFLT_NUM)
2451*53ee8cc1Swenshuai.xi {
2452*53ee8cc1Swenshuai.xi _TSP_GetEventFreeDefer0Id(u32PidFltId, &u32Flag, E_AND);
2453*53ee8cc1Swenshuai.xi return ((u32Flag & (1 << (u32PidFltId & 0x1F))) ? TRUE: FALSE);
2454*53ee8cc1Swenshuai.xi }
2455*53ee8cc1Swenshuai.xi else
2456*53ee8cc1Swenshuai.xi {
2457*53ee8cc1Swenshuai.xi return FALSE;
2458*53ee8cc1Swenshuai.xi }
2459*53ee8cc1Swenshuai.xi }
2460*53ee8cc1Swenshuai.xi
_TSP_SetPidFltFreeDefer(MS_U32 u32PidFltId)2461*53ee8cc1Swenshuai.xi static void _TSP_SetPidFltFreeDefer(MS_U32 u32PidFltId)
2462*53ee8cc1Swenshuai.xi {
2463*53ee8cc1Swenshuai.xi if (u32PidFltId < TSP_SECFLT_NUM)
2464*53ee8cc1Swenshuai.xi {
2465*53ee8cc1Swenshuai.xi _TSP_SetEventFreeDefer0Id(u32PidFltId);
2466*53ee8cc1Swenshuai.xi }
2467*53ee8cc1Swenshuai.xi }
2468*53ee8cc1Swenshuai.xi
_TSP_ResetPidFltFreeDefer(MS_U32 u32PidFltId)2469*53ee8cc1Swenshuai.xi static void _TSP_ResetPidFltFreeDefer(MS_U32 u32PidFltId)
2470*53ee8cc1Swenshuai.xi {
2471*53ee8cc1Swenshuai.xi MS_U32 u32Flag = 0;
2472*53ee8cc1Swenshuai.xi
2473*53ee8cc1Swenshuai.xi if (u32PidFltId < TSP_SECFLT_NUM)
2474*53ee8cc1Swenshuai.xi {
2475*53ee8cc1Swenshuai.xi _TSP_GetEventFreeDefer0Id(u32PidFltId, &u32Flag, E_OR_CLEAR);
2476*53ee8cc1Swenshuai.xi }
2477*53ee8cc1Swenshuai.xi }
2478*53ee8cc1Swenshuai.xi #endif
2479*53ee8cc1Swenshuai.xi
2480*53ee8cc1Swenshuai.xi #if 0
_TSP_IsAskPidFltFree(MS_U32 u32PidFltId)2481*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_IsAskPidFltFree(MS_U32 u32PidFltId)
2482*53ee8cc1Swenshuai.xi {
2483*53ee8cc1Swenshuai.xi MS_U32 u32Flag = 0;
2484*53ee8cc1Swenshuai.xi
2485*53ee8cc1Swenshuai.xi //PVR pid filter, not set to section filter free queue
2486*53ee8cc1Swenshuai.xi #ifndef TS2_LIVE_SUPPORT
2487*53ee8cc1Swenshuai.xi if(u32PidFltId >= TSP_SECFLT_NUM)
2488*53ee8cc1Swenshuai.xi return TRUE;
2489*53ee8cc1Swenshuai.xi #else
2490*53ee8cc1Swenshuai.xi if((u32PidFltId >= TSP_SECFLT_NUM) && (u32PidFltId < (TSP_SECFLT_NUM + TSP_PIDFLT1_NUM)))
2491*53ee8cc1Swenshuai.xi return TRUE;
2492*53ee8cc1Swenshuai.xi #endif
2493*53ee8cc1Swenshuai.xi
2494*53ee8cc1Swenshuai.xi _TSP_GetEventFree0Id(u32PidFltId, &u32Flag, E_AND);
2495*53ee8cc1Swenshuai.xi return ((u32Flag & (1 << (u32PidFltId & 0x1F))) ? TRUE: FALSE);
2496*53ee8cc1Swenshuai.xi }
2497*53ee8cc1Swenshuai.xi
_TSP_AskPidFltFree(MS_U32 u32PidFltId)2498*53ee8cc1Swenshuai.xi static void _TSP_AskPidFltFree(MS_U32 u32PidFltId)
2499*53ee8cc1Swenshuai.xi {
2500*53ee8cc1Swenshuai.xi //PVR pid filter, not set to section filter free queue
2501*53ee8cc1Swenshuai.xi #ifndef TS2_LIVE_SUPPORT
2502*53ee8cc1Swenshuai.xi if(u32PidFltId >= TSP_SECFLT_NUM)
2503*53ee8cc1Swenshuai.xi return;
2504*53ee8cc1Swenshuai.xi #else
2505*53ee8cc1Swenshuai.xi if((u32PidFltId >= TSP_SECFLT_NUM) && (u32PidFltId < (TSP_SECFLT_NUM + TSP_PIDFLT1_NUM)))
2506*53ee8cc1Swenshuai.xi return;
2507*53ee8cc1Swenshuai.xi #endif
2508*53ee8cc1Swenshuai.xi
2509*53ee8cc1Swenshuai.xi _TSP_SetEventFree0Id(u32PidFltId);
2510*53ee8cc1Swenshuai.xi
2511*53ee8cc1Swenshuai.xi }
2512*53ee8cc1Swenshuai.xi
2513*53ee8cc1Swenshuai.xi //Free Section PID filters, 32 filters for one group
2514*53ee8cc1Swenshuai.xi //For 64 pid filters, there are 2 gropus
2515*53ee8cc1Swenshuai.xi //For 128 pid filters, there are 4 groups
2516*53ee8cc1Swenshuai.xi //Free Section PID filters
_TSP_GetAskPidFltFree0List(MS_U32 u32Group)2517*53ee8cc1Swenshuai.xi static MS_U32 _TSP_GetAskPidFltFree0List(MS_U32 u32Group)
2518*53ee8cc1Swenshuai.xi {
2519*53ee8cc1Swenshuai.xi MS_U32 u32Flag = 0;
2520*53ee8cc1Swenshuai.xi
2521*53ee8cc1Swenshuai.xi _TSP_GetModeEventFree0(u32Group, 0xFFFFFFFF, &u32Flag, E_OR);
2522*53ee8cc1Swenshuai.xi
2523*53ee8cc1Swenshuai.xi return u32Flag;
2524*53ee8cc1Swenshuai.xi }
2525*53ee8cc1Swenshuai.xi
2526*53ee8cc1Swenshuai.xi //Free Section PID filters
2527*53ee8cc1Swenshuai.xi //For 64 pid filters, there are 2 gropus
2528*53ee8cc1Swenshuai.xi //For 128 pid filters, there are 4 groups
_TSP_ClrAskPidFltFree0List(MS_U32 u32Group,MS_U32 u32Mask)2529*53ee8cc1Swenshuai.xi static void _TSP_ClrAskPidFltFree0List(MS_U32 u32Group, MS_U32 u32Mask)
2530*53ee8cc1Swenshuai.xi {
2531*53ee8cc1Swenshuai.xi MS_U32 u32Flag;
2532*53ee8cc1Swenshuai.xi
2533*53ee8cc1Swenshuai.xi _TSP_GetModeEventFree0(u32Group, u32Mask, &u32Flag, E_OR_CLEAR);
2534*53ee8cc1Swenshuai.xi }
2535*53ee8cc1Swenshuai.xi
2536*53ee8cc1Swenshuai.xi #endif
2537*53ee8cc1Swenshuai.xi
2538*53ee8cc1Swenshuai.xi //For pid filter and section filter are one by one mappig
_TSP_Flt_StateGet(MS_U32 u32EngId,MS_U32 u32FltId,DrvTSP_FltState * peState)2539*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_Flt_StateGet(MS_U32 u32EngId, MS_U32 u32FltId, DrvTSP_FltState *peState)
2540*53ee8cc1Swenshuai.xi {
2541*53ee8cc1Swenshuai.xi MS_U32 u32SecId = u32FltId;
2542*53ee8cc1Swenshuai.xi DrvTSP_FltState PidFltState;
2543*53ee8cc1Swenshuai.xi DrvTSP_FltState SecFltState;
2544*53ee8cc1Swenshuai.xi
2545*53ee8cc1Swenshuai.xi if (!_TSP_PidFlt_StateGet(u32EngId, u32FltId, &PidFltState))
2546*53ee8cc1Swenshuai.xi {
2547*53ee8cc1Swenshuai.xi return FALSE;
2548*53ee8cc1Swenshuai.xi }
2549*53ee8cc1Swenshuai.xi *peState= PidFltState;
2550*53ee8cc1Swenshuai.xi
2551*53ee8cc1Swenshuai.xi if (u32FltId >= TSP_SECFLT_NUM
2552*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
2553*53ee8cc1Swenshuai.xi && (u32FltId < (TSP_SECFLT_NUM+TSP_PIDFLT1_NUM))
2554*53ee8cc1Swenshuai.xi #endif
2555*53ee8cc1Swenshuai.xi )
2556*53ee8cc1Swenshuai.xi {
2557*53ee8cc1Swenshuai.xi return TRUE;
2558*53ee8cc1Swenshuai.xi }
2559*53ee8cc1Swenshuai.xi
2560*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
2561*53ee8cc1Swenshuai.xi if (u32FltId >= TSP_SECFLT_NUM)
2562*53ee8cc1Swenshuai.xi {
2563*53ee8cc1Swenshuai.xi u32SecId -= TSP_PIDFLT1_NUM;
2564*53ee8cc1Swenshuai.xi }
2565*53ee8cc1Swenshuai.xi #endif
2566*53ee8cc1Swenshuai.xi
2567*53ee8cc1Swenshuai.xi if (!_TSP_SecFlt_StateGet(u32EngId, u32SecId, &SecFltState))
2568*53ee8cc1Swenshuai.xi {
2569*53ee8cc1Swenshuai.xi return FALSE;
2570*53ee8cc1Swenshuai.xi }
2571*53ee8cc1Swenshuai.xi *peState|= SecFltState;
2572*53ee8cc1Swenshuai.xi return TRUE;
2573*53ee8cc1Swenshuai.xi }
2574*53ee8cc1Swenshuai.xi
2575*53ee8cc1Swenshuai.xi #ifndef NO_CA
2576*53ee8cc1Swenshuai.xi // Duplicate live dscmb PIDs to FLT1 for DSCMB reference when siwtcing to TS1 PVRCA
2577*53ee8cc1Swenshuai.xi // Paired with _TSP_Free_AllFLT1
2578*53ee8cc1Swenshuai.xi //
2579*53ee8cc1Swenshuai.xi // PVR1 filter arrange
2580*53ee8cc1Swenshuai.xi // ----------------- 0
2581*53ee8cc1Swenshuai.xi // | DSCM |
2582*53ee8cc1Swenshuai.xi // ----------------- 16
2583*53ee8cc1Swenshuai.xi // | Share DSCMB |
2584*53ee8cc1Swenshuai.xi // ----------------- 32
_TSP_FLT1_Duplicate_FLT0(MS_U32 u32EngId)2585*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_FLT1_Duplicate_FLT0(MS_U32 u32EngId)
2586*53ee8cc1Swenshuai.xi {
2587*53ee8cc1Swenshuai.xi MS_U32 u32ii, u32jj;
2588*53ee8cc1Swenshuai.xi MS_U32 u32DMXID = 0, u32PID = DRVTSP_PID_NULL;
2589*53ee8cc1Swenshuai.xi MS_U32 u32Flt0Id = 0;
2590*53ee8cc1Swenshuai.xi
2591*53ee8cc1Swenshuai.xi #ifdef EXT_PVR1_FLT
2592*53ee8cc1Swenshuai.xi MS_U32 u32DscmbFltNume = DSCMB_FLT_NUM_ALL;
2593*53ee8cc1Swenshuai.xi #else
2594*53ee8cc1Swenshuai.xi MS_U32 u32DscmbFltNume = DSCMB_FLT_NUM;
2595*53ee8cc1Swenshuai.xi #endif
2596*53ee8cc1Swenshuai.xi
2597*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "\n[%s]\n", __FUNCTION__));
2598*53ee8cc1Swenshuai.xi
2599*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._bFLT1Dup_Enable == TRUE)
2600*53ee8cc1Swenshuai.xi {
2601*53ee8cc1Swenshuai.xi return FALSE;
2602*53ee8cc1Swenshuai.xi }
2603*53ee8cc1Swenshuai.xi
2604*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef = 0;
2605*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR = 0;
2606*53ee8cc1Swenshuai.xi
2607*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_PIDFLT1_NUM; u32ii++)
2608*53ee8cc1Swenshuai.xi {
2609*53ee8cc1Swenshuai.xi u32DMXID = u32ii + TSP_SECFLT_NUM;
2610*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].FltState[u32ii + TSP_SECFLT_NUM] = E_DRVTSP_FLT_STATE_ALLOC;
2611*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].FltType[u32ii + TSP_SECFLT_NUM] = E_DRVTSP_FLT_TYPE_PVR;
2612*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].FltSource[u32ii + TSP_SECFLT_NUM] = E_DRVTSP_FLT_SOURCE_TYPE_LIVE;
2613*53ee8cc1Swenshuai.xi
2614*53ee8cc1Swenshuai.xi //Getting PIDs of PVR1 filter, if pid filter is allocated for recording
2615*53ee8cc1Swenshuai.xi u32PID = HAL_TSP_PidFlt_GetPid(HAL_TSP_GetPidFltReg(u32EngId, u32DMXID));
2616*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii] = u32PID;
2617*53ee8cc1Swenshuai.xi
2618*53ee8cc1Swenshuai.xi if(u32ii < DSCMB_FLT_NUM)
2619*53ee8cc1Swenshuai.xi {
2620*53ee8cc1Swenshuai.xi u32Flt0Id = u32ii + DSCMB_FLT_START_ID;
2621*53ee8cc1Swenshuai.xi }
2622*53ee8cc1Swenshuai.xi #ifdef EXT_PVR1_FLT
2623*53ee8cc1Swenshuai.xi else if (u32ii < u32DscmbFltNume)//share dscmb filter
2624*53ee8cc1Swenshuai.xi {
2625*53ee8cc1Swenshuai.xi u32Flt0Id = u32ii - DSCMB_FLT_NUM + DSCMB_FLT_SHAREKEY_START_ID;
2626*53ee8cc1Swenshuai.xi }
2627*53ee8cc1Swenshuai.xi #endif
2628*53ee8cc1Swenshuai.xi else
2629*53ee8cc1Swenshuai.xi {
2630*53ee8cc1Swenshuai.xi continue;
2631*53ee8cc1Swenshuai.xi }
2632*53ee8cc1Swenshuai.xi
2633*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s]u32Flt0Id %ld\n", __FUNCTION__, u32Flt0Id));
2634*53ee8cc1Swenshuai.xi
2635*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[u32Flt0Id] == E_DRVTSP_FLT_STATE_FREE)
2636*53ee8cc1Swenshuai.xi continue;
2637*53ee8cc1Swenshuai.xi
2638*53ee8cc1Swenshuai.xi if((_ptsp_res->_TspState[u32EngId].FltType[u32Flt0Id] == E_DRVTSP_FLT_TYPE_SECTION) ||
2639*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt0Id] == E_DRVTSP_FLT_TYPE_SECTION_NO_PUSI) ||
2640*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt0Id] == E_DRVTSP_FLT_TYPE_PACKET) ||
2641*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltType[u32Flt0Id] == E_DRVTSP_FLT_TYPE_SECTION_VER))
2642*53ee8cc1Swenshuai.xi {
2643*53ee8cc1Swenshuai.xi //not dscmb type
2644*53ee8cc1Swenshuai.xi continue;
2645*53ee8cc1Swenshuai.xi }
2646*53ee8cc1Swenshuai.xi
2647*53ee8cc1Swenshuai.xi u32PID = HAL_TSP_PidFlt_GetPid(HAL_TSP_GetPidFltReg(u32EngId, u32Flt0Id));
2648*53ee8cc1Swenshuai.xi
2649*53ee8cc1Swenshuai.xi if(u32PID == DRVTSP_PID_NULL)
2650*53ee8cc1Swenshuai.xi {
2651*53ee8cc1Swenshuai.xi continue;
2652*53ee8cc1Swenshuai.xi }
2653*53ee8cc1Swenshuai.xi
2654*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32ii] = (MS_U16)u32PID;
2655*53ee8cc1Swenshuai.xi
2656*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s]u32Flt0Id %ld, u32PID %lx \n", __FUNCTION__, u32Flt0Id, u32PID));
2657*53ee8cc1Swenshuai.xi
2658*53ee8cc1Swenshuai.xi // Searching FLT1 list, if pid repeated, do not set it again
2659*53ee8cc1Swenshuai.xi for(u32jj = 0; u32jj < u32DscmbFltNume; u32jj++)
2660*53ee8cc1Swenshuai.xi {
2661*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32jj] == DRVTSP_PID_NULL)
2662*53ee8cc1Swenshuai.xi continue;
2663*53ee8cc1Swenshuai.xi
2664*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32jj] == (MS_U16)u32PID)
2665*53ee8cc1Swenshuai.xi {
2666*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef |= (1 << u32jj);
2667*53ee8cc1Swenshuai.xi break;
2668*53ee8cc1Swenshuai.xi }
2669*53ee8cc1Swenshuai.xi }
2670*53ee8cc1Swenshuai.xi
2671*53ee8cc1Swenshuai.xi // If not exsit in FLT1 list, setting a new one
2672*53ee8cc1Swenshuai.xi if(u32jj == u32DscmbFltNume)
2673*53ee8cc1Swenshuai.xi {
2674*53ee8cc1Swenshuai.xi _TSP_SetNewDscmbPid2FLT1(u32EngId, u32ii, u32PID);
2675*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s]FLT %ld: PID 0x%lx, _u32Flt1Flag_DscmbRef 0x%lx\n", __FUNCTION__,u32ii, u32PID, _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef));
2676*53ee8cc1Swenshuai.xi }
2677*53ee8cc1Swenshuai.xi }
2678*53ee8cc1Swenshuai.xi
2679*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._bFLT1Dup_Enable = TRUE;
2680*53ee8cc1Swenshuai.xi
2681*53ee8cc1Swenshuai.xi return TRUE;
2682*53ee8cc1Swenshuai.xi }
2683*53ee8cc1Swenshuai.xi
2684*53ee8cc1Swenshuai.xi // Free all FLT1 when PVRCA close
2685*53ee8cc1Swenshuai.xi // Paired with _TSP_FLT1_Duplicate_FLT0
_TSP_Free_AllFLT1(void)2686*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_Free_AllFLT1(void)
2687*53ee8cc1Swenshuai.xi {
2688*53ee8cc1Swenshuai.xi MS_U32 u32ii, u32Dmxid;
2689*53ee8cc1Swenshuai.xi TSP_Result Res = DRVTSP_OK;
2690*53ee8cc1Swenshuai.xi
2691*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s]\n", __FUNCTION__));
2692*53ee8cc1Swenshuai.xi
2693*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._bFLT1Dup_Enable == FALSE)
2694*53ee8cc1Swenshuai.xi {
2695*53ee8cc1Swenshuai.xi return TRUE;
2696*53ee8cc1Swenshuai.xi }
2697*53ee8cc1Swenshuai.xi
2698*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_PIDFLT1_NUM; u32ii++)
2699*53ee8cc1Swenshuai.xi {
2700*53ee8cc1Swenshuai.xi u32Dmxid = u32ii+TSP_SECFLT_NUM;
2701*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(HAL_TSP_GetPidFltReg(0, u32Dmxid), DRVTSP_PID_NULL);
2702*53ee8cc1Swenshuai.xi if(_TSP_PidFlt_Free(0, u32Dmxid, TRUE) != DRVTSP_OK)
2703*53ee8cc1Swenshuai.xi {
2704*53ee8cc1Swenshuai.xi Res = DRVTSP_FAIL;
2705*53ee8cc1Swenshuai.xi }
2706*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii] = DRVTSP_PID_NULL;
2707*53ee8cc1Swenshuai.xi }
2708*53ee8cc1Swenshuai.xi
2709*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < DSCMB_FLT_NUM_ALL; u32ii++)
2710*53ee8cc1Swenshuai.xi {
2711*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32ii] = DRVTSP_PID_NULL;
2712*53ee8cc1Swenshuai.xi }
2713*53ee8cc1Swenshuai.xi
2714*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR = 0;
2715*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef = 0;
2716*53ee8cc1Swenshuai.xi
2717*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._bFLT1Dup_Enable = FALSE;
2718*53ee8cc1Swenshuai.xi
2719*53ee8cc1Swenshuai.xi return (Res == DRVTSP_OK);
2720*53ee8cc1Swenshuai.xi }
2721*53ee8cc1Swenshuai.xi
2722*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
2723*53ee8cc1Swenshuai.xi
2724*53ee8cc1Swenshuai.xi
2725*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
_TSP_PCR_Adjust(MS_U32 u32EngId)2726*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_PCR_Adjust(MS_U32 u32EngId)
2727*53ee8cc1Swenshuai.xi {
2728*53ee8cc1Swenshuai.xi MS_U32 u32Pcr = 0, u32Pcr_H = 0, u32Diff = 0, u32STC = 0;
2729*53ee8cc1Swenshuai.xi
2730*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_Read(u32EngId, &u32Pcr, &u32Pcr_H);
2731*53ee8cc1Swenshuai.xi
2732*53ee8cc1Swenshuai.xi if(_u8ResetPcr[u32EngId] >= 2)
2733*53ee8cc1Swenshuai.xi {
2734*53ee8cc1Swenshuai.xi if(_u8ResetPcr[u32EngId] == 3)
2735*53ee8cc1Swenshuai.xi {
2736*53ee8cc1Swenshuai.xi HAL_TSP_Stc_ctrl(u32EngId, STC_SYNTH_DEFAULT);
2737*53ee8cc1Swenshuai.xi }
2738*53ee8cc1Swenshuai.xi HAL_TSP_SetSTC(u32EngId, u32Pcr, u32Pcr_H);
2739*53ee8cc1Swenshuai.xi _u8ResetPcr[u32EngId] = 0;
2740*53ee8cc1Swenshuai.xi _u32PrevStcBase[u32EngId] = u32Pcr;
2741*53ee8cc1Swenshuai.xi _u32PrevPllControl[u32EngId] = HAL_TSP_GetSTCSynth(u32EngId);
2742*53ee8cc1Swenshuai.xi }
2743*53ee8cc1Swenshuai.xi
2744*53ee8cc1Swenshuai.xi HAL_TSP_STC_Update_Disable(u32EngId, TRUE);
2745*53ee8cc1Swenshuai.xi u32STC = HAL_TSP_GetSTC(u32EngId);
2746*53ee8cc1Swenshuai.xi HAL_TSP_STC_Update_Disable(u32EngId, FALSE);
2747*53ee8cc1Swenshuai.xi
2748*53ee8cc1Swenshuai.xi //ULOGD("TSP", "Pcr %08lx, STC %08lx \n", u32Pcr, u32STC);
2749*53ee8cc1Swenshuai.xi if((u32STC - _u32PrevStcBase[u32EngId]) > 0x4000)
2750*53ee8cc1Swenshuai.xi {
2751*53ee8cc1Swenshuai.xi //ULOGD("TSP", "STC_DIFF = %08lx ==== \n\n",u32STC -_u32PrevStcBase[u32EngId]);
2752*53ee8cc1Swenshuai.xi _u32PrevStcBase[u32EngId] = u32STC;
2753*53ee8cc1Swenshuai.xi
2754*53ee8cc1Swenshuai.xi if(_u32PrevStcBase[u32EngId] > u32Pcr)
2755*53ee8cc1Swenshuai.xi {
2756*53ee8cc1Swenshuai.xi u32Diff = _u32PrevStcBase[u32EngId] - u32Pcr;
2757*53ee8cc1Swenshuai.xi if( u32Diff <= 0x02)
2758*53ee8cc1Swenshuai.xi {
2759*53ee8cc1Swenshuai.xi _u8ResetPcr[u32EngId] = 0;
2760*53ee8cc1Swenshuai.xi }
2761*53ee8cc1Swenshuai.xi else if( u32Diff < 0x1000)
2762*53ee8cc1Swenshuai.xi {
2763*53ee8cc1Swenshuai.xi _u32PrevPllControl[u32EngId] += ((u32Diff) >> 3 ); //now = error x alpha + prev
2764*53ee8cc1Swenshuai.xi HAL_TSP_Stc_ctrl(u32EngId, _u32PrevPllControl[u32EngId] + ((u32Diff)>>6)); //out = now + error x beta
2765*53ee8cc1Swenshuai.xi _u8ResetPcr[u32EngId] = 0;
2766*53ee8cc1Swenshuai.xi //ULOGD("TSP", "======== Set STC CONTROL <++> %08lx PCR/Diff = %08lx/%08lx \n",
2767*53ee8cc1Swenshuai.xi // _u32PrevPllControl[u32EngId] + ((_u32PrevStcBase[u32EngId] - u32Pcr)>>6),u32Pcr,_u32PrevStcBase[u32EngId]-u32Pcr);
2768*53ee8cc1Swenshuai.xi }
2769*53ee8cc1Swenshuai.xi else
2770*53ee8cc1Swenshuai.xi {
2771*53ee8cc1Swenshuai.xi _u8ResetPcr[u32EngId]++;
2772*53ee8cc1Swenshuai.xi }
2773*53ee8cc1Swenshuai.xi }
2774*53ee8cc1Swenshuai.xi else
2775*53ee8cc1Swenshuai.xi {
2776*53ee8cc1Swenshuai.xi u32Diff = u32Pcr - _u32PrevStcBase[u32EngId] ;
2777*53ee8cc1Swenshuai.xi if(( u32Diff) <= 0x02)
2778*53ee8cc1Swenshuai.xi {
2779*53ee8cc1Swenshuai.xi _u8ResetPcr[u32EngId] = 0;
2780*53ee8cc1Swenshuai.xi }
2781*53ee8cc1Swenshuai.xi else if((u32Diff) < 0x1000)
2782*53ee8cc1Swenshuai.xi {
2783*53ee8cc1Swenshuai.xi _u32PrevPllControl[u32EngId] -= ((u32Diff)>> 3); //now = error x alpha + prev
2784*53ee8cc1Swenshuai.xi HAL_TSP_Stc_ctrl(u32EngId, _u32PrevPllControl[u32EngId] - ((u32Diff)>> 6)); //out = now + error x beta
2785*53ee8cc1Swenshuai.xi _u8ResetPcr[u32EngId] = 0;
2786*53ee8cc1Swenshuai.xi //ULOGD("TSP", "======== Set STC CONTROL <--> %08lx PCR/Diff = %08lx/%08lx \n",
2787*53ee8cc1Swenshuai.xi // _u32PrevPllControl[u32EngId] - ((u32Pcr - _u32PrevStcBase[u32EngId] )>>6),u32Pcr,u32Pcr-_u32PrevStcBase[u32EngId] );
2788*53ee8cc1Swenshuai.xi }
2789*53ee8cc1Swenshuai.xi else
2790*53ee8cc1Swenshuai.xi {
2791*53ee8cc1Swenshuai.xi _u8ResetPcr[u32EngId]++;
2792*53ee8cc1Swenshuai.xi }
2793*53ee8cc1Swenshuai.xi }
2794*53ee8cc1Swenshuai.xi }
2795*53ee8cc1Swenshuai.xi
2796*53ee8cc1Swenshuai.xi return TRUE;
2797*53ee8cc1Swenshuai.xi }
2798*53ee8cc1Swenshuai.xi
2799*53ee8cc1Swenshuai.xi #endif //HWPCR_ENABLE
2800*53ee8cc1Swenshuai.xi
2801*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
2802*53ee8cc1Swenshuai.xi // Interrupt service routine of TSP
2803*53ee8cc1Swenshuai.xi // Arguments: None
2804*53ee8cc1Swenshuai.xi // Return: None
2805*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
2806*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2807*53ee8cc1Swenshuai.xi //static irqreturn_t _TSP_Isr(int irq,void *dev_id)
_TSP_Isr(void)2808*53ee8cc1Swenshuai.xi static void _TSP_Isr(void)
2809*53ee8cc1Swenshuai.xi #else
2810*53ee8cc1Swenshuai.xi static void _TSP_Isr(void)
2811*53ee8cc1Swenshuai.xi #endif
2812*53ee8cc1Swenshuai.xi {
2813*53ee8cc1Swenshuai.xi MS_U32 u32HwInt;
2814*53ee8cc1Swenshuai.xi MS_U32 u32SwInt;
2815*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
2816*53ee8cc1Swenshuai.xi MS_U32 u32HwInt2;
2817*53ee8cc1Swenshuai.xi #endif
2818*53ee8cc1Swenshuai.xi
2819*53ee8cc1Swenshuai.xi _ptsp_res->_u32DbgIntrCount++;
2820*53ee8cc1Swenshuai.xi //HAL_TSP_ISR_SAVE_ALL();
2821*53ee8cc1Swenshuai.xi
2822*53ee8cc1Swenshuai.xi _TSP_INT_LOCK();
2823*53ee8cc1Swenshuai.xi u32HwInt = HAL_TSP_HW_INT_STATUS();
2824*53ee8cc1Swenshuai.xi u32SwInt = HAL_TSP_SW_INT_STATUS();
2825*53ee8cc1Swenshuai.xi
2826*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
2827*53ee8cc1Swenshuai.xi u32HwInt2 = HAL_TSP_HW_INT2_STATUS();
2828*53ee8cc1Swenshuai.xi #endif
2829*53ee8cc1Swenshuai.xi
2830*53ee8cc1Swenshuai.xi _TSP_INT_UNLOCK();
2831*53ee8cc1Swenshuai.xi
2832*53ee8cc1Swenshuai.xi //ULOGD("TSP", "u32HwInt %lx, u32SwInt %lx\n", u32HwInt, u32SwInt);
2833*53ee8cc1Swenshuai.xi
2834*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
2835*53ee8cc1Swenshuai.xi if (u32HwInt2 & TSP_HWINT2_PCR_UPDATE_END)
2836*53ee8cc1Swenshuai.xi {
2837*53ee8cc1Swenshuai.xi if(_TSP_ChkHwPcrNotifyId(0)
2838*53ee8cc1Swenshuai.xi {
2839*53ee8cc1Swenshuai.xi _TSP_PCR_Adjust(0);
2840*53ee8cc1Swenshuai.xi }
2841*53ee8cc1Swenshuai.xi else
2842*53ee8cc1Swenshuai.xi {
2843*53ee8cc1Swenshuai.xi u32HwInt2 &= ~TSP_HWINT2_PCR_UPDATE_END;
2844*53ee8cc1Swenshuai.xi }
2845*53ee8cc1Swenshuai.xi }
2846*53ee8cc1Swenshuai.xi #endif
2847*53ee8cc1Swenshuai.xi
2848*53ee8cc1Swenshuai.xi #ifndef NO_PVR
2849*53ee8cc1Swenshuai.xi if (HAS_FLAG(u32HwInt, TSP_HWINT_HW_PVR_MASK))
2850*53ee8cc1Swenshuai.xi {
2851*53ee8cc1Swenshuai.xi if(_TSP_ChkPvrNotifyId(0))
2852*53ee8cc1Swenshuai.xi {
2853*53ee8cc1Swenshuai.xi _TSP_SetEvent(HAS_FLAG(u32HwInt, TSP_HWINT_HW_PVR_MASK)); // Trigger task
2854*53ee8cc1Swenshuai.xi }
2855*53ee8cc1Swenshuai.xi else
2856*53ee8cc1Swenshuai.xi {
2857*53ee8cc1Swenshuai.xi u32HwInt &= ~TSP_HWINT_HW_PVR_MASK;
2858*53ee8cc1Swenshuai.xi }
2859*53ee8cc1Swenshuai.xi }
2860*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
2861*53ee8cc1Swenshuai.xi
2862*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
2863*53ee8cc1Swenshuai.xi if (HAS_FLAG(u32HwInt2, TSP_HWINT2_HW_PVR1_MASK))
2864*53ee8cc1Swenshuai.xi {
2865*53ee8cc1Swenshuai.xi if(_TSP_ChkPvrNotifyId(1))
2866*53ee8cc1Swenshuai.xi {
2867*53ee8cc1Swenshuai.xi _TSP_SetEvent(HAS_FLAG(u32HwInt2, TSP_HWINT2_HW_PVR1_MASK)); // Trigger task
2868*53ee8cc1Swenshuai.xi }
2869*53ee8cc1Swenshuai.xi else
2870*53ee8cc1Swenshuai.xi {
2871*53ee8cc1Swenshuai.xi u32HwInt2 &= ~TSP_HWINT2_HW_PVR1_MASK;
2872*53ee8cc1Swenshuai.xi }
2873*53ee8cc1Swenshuai.xi }
2874*53ee8cc1Swenshuai.xi #endif
2875*53ee8cc1Swenshuai.xi
2876*53ee8cc1Swenshuai.xi if (u32SwInt & TSP_SWINT_CTRL_FIRE)
2877*53ee8cc1Swenshuai.xi {
2878*53ee8cc1Swenshuai.xi MS_U32 u32EngId;
2879*53ee8cc1Swenshuai.xi //MS_U32 u32PidFltId;
2880*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId;
2881*53ee8cc1Swenshuai.xi MS_U32 u32IntStat;
2882*53ee8cc1Swenshuai.xi //REG_SecFlt* pSecFilter;
2883*53ee8cc1Swenshuai.xi
2884*53ee8cc1Swenshuai.xi u32EngId = (u32SwInt & TSP_SWINT_INFO_ENG_MASK) >> TSP_SWINT_INFO_ENG_SHFT;
2885*53ee8cc1Swenshuai.xi u32IntStat = (u32SwInt & TSP_SWINT_STATUS_CMD_MASK) >> TSP_SWINT_STATUS_CMD_SHFT;
2886*53ee8cc1Swenshuai.xi u32SecFltId = (u32SwInt & TSP_SWINT_INFO_SEC_MASK) >> TSP_SWINT_INFO_SEC_SHFT;
2887*53ee8cc1Swenshuai.xi //pSecFilter = &(_TspSec[u32EngId].Flt[u32SecFltId]);
2888*53ee8cc1Swenshuai.xi
2889*53ee8cc1Swenshuai.xi #if DMX_DEBUG
2890*53ee8cc1Swenshuai.xi extern DMX_FLT_DBG_INFO stDmxDbgInfo[];
2891*53ee8cc1Swenshuai.xi
2892*53ee8cc1Swenshuai.xi if(u32IntStat == TSP_SWINT_STATUS_SEC_RDY ||
2893*53ee8cc1Swenshuai.xi u32IntStat == TSP_SWINT_STATUS_REQ_RDY )
2894*53ee8cc1Swenshuai.xi {
2895*53ee8cc1Swenshuai.xi stDmxDbgInfo[u32SecFltId].u32Int_rdy ++;
2896*53ee8cc1Swenshuai.xi }
2897*53ee8cc1Swenshuai.xi else if(u32IntStat == TSP_SWINT_STATUS_BUF_OVFLOW)
2898*53ee8cc1Swenshuai.xi {
2899*53ee8cc1Swenshuai.xi stDmxDbgInfo[u32SecFltId].u32Int_ovf ++;
2900*53ee8cc1Swenshuai.xi }
2901*53ee8cc1Swenshuai.xi else if(u32IntStat == TSP_SWINT_STATUS_SEC_CRCERR)
2902*53ee8cc1Swenshuai.xi {
2903*53ee8cc1Swenshuai.xi stDmxDbgInfo[u32SecFltId].u32Int_crc ++;
2904*53ee8cc1Swenshuai.xi }
2905*53ee8cc1Swenshuai.xi #endif
2906*53ee8cc1Swenshuai.xi
2907*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId] == E_DRVTSP_FLT_STATE_FREE)
2908*53ee8cc1Swenshuai.xi goto CLEAR_INT;
2909*53ee8cc1Swenshuai.xi
2910*53ee8cc1Swenshuai.xi if(_TSP_ChkSecNotifyId(u32SecFltId) == FALSE)
2911*53ee8cc1Swenshuai.xi {
2912*53ee8cc1Swenshuai.xi u32SwInt = 0;
2913*53ee8cc1Swenshuai.xi u32IntStat = 0;
2914*53ee8cc1Swenshuai.xi u32HwInt &= ~TSP_HWINT_TSP_SW_INT_STATUS;
2915*53ee8cc1Swenshuai.xi }
2916*53ee8cc1Swenshuai.xi
2917*53ee8cc1Swenshuai.xi switch (u32IntStat)
2918*53ee8cc1Swenshuai.xi {
2919*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
2920*53ee8cc1Swenshuai.xi case TSP_SWINT_CMD_DMA_PAUSE:
2921*53ee8cc1Swenshuai.xi HAL_TSP_TsDma_Pause();
2922*53ee8cc1Swenshuai.xi break;
2923*53ee8cc1Swenshuai.xi
2924*53ee8cc1Swenshuai.xi case TSP_SWINT_CMD_DMA_RESUME:
2925*53ee8cc1Swenshuai.xi HAL_TSP_TsDma_Resume();
2926*53ee8cc1Swenshuai.xi break;
2927*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
2928*53ee8cc1Swenshuai.xi case TSP_SWINT_STATUS_SEC_RDY:
2929*53ee8cc1Swenshuai.xi case TSP_SWINT_STATUS_REQ_RDY:
2930*53ee8cc1Swenshuai.xi case TSP_SWINT_STATUS_SEC_CRCERR:
2931*53ee8cc1Swenshuai.xi //ULOGD("TSP", "SEC %ld\n", u32SecFltId);
2932*53ee8cc1Swenshuai.xi if (TSP_SWINT_STATUS_SEC_CRCERR == u32IntStat && (_ptsp_res->_TspState[u32EngId].SecFltMode[u32SecFltId] & E_DRVTSP_FLT_MODE_CRCCHK))
2933*53ee8cc1Swenshuai.xi {
2934*53ee8cc1Swenshuai.xi //printf("ERR %d\n", (int)u32SecFltId);
2935*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] & E_DRVTSP_EVENT_SEC_CRCERR)
2936*53ee8cc1Swenshuai.xi {
2937*53ee8cc1Swenshuai.xi _TSP_SetSecCrcId(u32SecFltId); // Set section event flag
2938*53ee8cc1Swenshuai.xi }
2939*53ee8cc1Swenshuai.xi else
2940*53ee8cc1Swenshuai.xi {
2941*53ee8cc1Swenshuai.xi break;
2942*53ee8cc1Swenshuai.xi }
2943*53ee8cc1Swenshuai.xi }
2944*53ee8cc1Swenshuai.xi else
2945*53ee8cc1Swenshuai.xi {
2946*53ee8cc1Swenshuai.xi //printf("SEC %d\n", (int)u32SecFltId);
2947*53ee8cc1Swenshuai.xi _TSP_SetSecRdyId(u32SecFltId); // Set section event flag
2948*53ee8cc1Swenshuai.xi }
2949*53ee8cc1Swenshuai.xi
2950*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] & E_DRVTSP_EVENT_CB_MASK) == E_DRVTSP_EVENT_CB_POLL)
2951*53ee8cc1Swenshuai.xi {
2952*53ee8cc1Swenshuai.xi _TSP_SetEvent(TSP_TASK_EVENT_SECTION_POLL); // Trigger task
2953*53ee8cc1Swenshuai.xi }
2954*53ee8cc1Swenshuai.xi else if ((_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] & E_DRVTSP_EVENT_CB_MASK) == E_DRVTSP_EVENT_CB_SELF)
2955*53ee8cc1Swenshuai.xi {
2956*53ee8cc1Swenshuai.xi _TSP_SetEvent(TSP_TASK_EVENT_SECTION_SELF); // Trigger task
2957*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2958*53ee8cc1Swenshuai.xi wake_up_interruptible(&(tsp_wq_head[u32SecFltId]));
2959*53ee8cc1Swenshuai.xi #endif
2960*53ee8cc1Swenshuai.xi }
2961*53ee8cc1Swenshuai.xi break;
2962*53ee8cc1Swenshuai.xi
2963*53ee8cc1Swenshuai.xi case TSP_SWINT_STATUS_BUF_OVFLOW:
2964*53ee8cc1Swenshuai.xi //ULOGD("TSP", "OVF %ld\n", u32SecFltId);
2965*53ee8cc1Swenshuai.xi _TSP_SetSecOvfId(u32SecFltId); // Set section event flag
2966*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] & E_DRVTSP_EVENT_CB_MASK) == E_DRVTSP_EVENT_CB_POLL)
2967*53ee8cc1Swenshuai.xi {
2968*53ee8cc1Swenshuai.xi _TSP_SetEvent(TSP_TASK_EVENT_SECTION_POLL); // Trigger task
2969*53ee8cc1Swenshuai.xi }
2970*53ee8cc1Swenshuai.xi else if ((_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] & E_DRVTSP_EVENT_CB_MASK) == E_DRVTSP_EVENT_CB_SELF)
2971*53ee8cc1Swenshuai.xi {
2972*53ee8cc1Swenshuai.xi _TSP_SetEvent(TSP_TASK_EVENT_SECTION_SELF); // Trigger task
2973*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2974*53ee8cc1Swenshuai.xi wake_up_interruptible(&(tsp_wq_head[u32SecFltId]));
2975*53ee8cc1Swenshuai.xi #endif
2976*53ee8cc1Swenshuai.xi
2977*53ee8cc1Swenshuai.xi }
2978*53ee8cc1Swenshuai.xi break;
2979*53ee8cc1Swenshuai.xi
2980*53ee8cc1Swenshuai.xi case TSP_SWINT_STATUS_PKT_OVRUN:
2981*53ee8cc1Swenshuai.xi //[TODO] Enable debug message when PCR filter can be handle by hardware.
2982*53ee8cc1Swenshuai.xi // TSP_DBG("Packet Overrun %d\n", u32EngId);
2983*53ee8cc1Swenshuai.xi break;
2984*53ee8cc1Swenshuai.xi
2985*53ee8cc1Swenshuai.xi case TSP_SWINT_STATUS_SEC_ERROR:
2986*53ee8cc1Swenshuai.xi //[ISR print]
2987*53ee8cc1Swenshuai.xi // TSP_DBG("SEC error %d-0x%02X\n", u32EngId, u32SecFltId);
2988*53ee8cc1Swenshuai.xi break;
2989*53ee8cc1Swenshuai.xi
2990*53ee8cc1Swenshuai.xi case TSP_SWINT_STATUS_DEBUG:
2991*53ee8cc1Swenshuai.xi //[ISR print]
2992*53ee8cc1Swenshuai.xi // TSP_DBG("DEBUG %d-0x%02X\n", u32EngId, u32SecFltId);
2993*53ee8cc1Swenshuai.xi if(_FwDbgInfo.bEnable)
2994*53ee8cc1Swenshuai.xi {
2995*53ee8cc1Swenshuai.xi //@TODO : after init/exit tsp drvier couple times, event _s32TspEventId creating will fail
2996*53ee8cc1Swenshuai.xi _TSP_SetEvent(TSP_TASK_EVENT_FWMSG);
2997*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2998*53ee8cc1Swenshuai.xi wake_up_interruptible(&(tsp_wq_head[u32SecFltId]));
2999*53ee8cc1Swenshuai.xi #endif
3000*53ee8cc1Swenshuai.xi
3001*53ee8cc1Swenshuai.xi }
3002*53ee8cc1Swenshuai.xi break;
3003*53ee8cc1Swenshuai.xi
3004*53ee8cc1Swenshuai.xi default:
3005*53ee8cc1Swenshuai.xi //[ISR print]
3006*53ee8cc1Swenshuai.xi //DBG_TSP(TSP_DBG("Unknown TSP interrupt %d\n", u32EngId));
3007*53ee8cc1Swenshuai.xi break;
3008*53ee8cc1Swenshuai.xi }
3009*53ee8cc1Swenshuai.xi }
3010*53ee8cc1Swenshuai.xi
3011*53ee8cc1Swenshuai.xi CLEAR_INT:
3012*53ee8cc1Swenshuai.xi
3013*53ee8cc1Swenshuai.xi //If it still has interrupt status, it should be processed by another process again, do not clear interrupt status
3014*53ee8cc1Swenshuai.xi
3015*53ee8cc1Swenshuai.xi _TSP_INT_LOCK();
3016*53ee8cc1Swenshuai.xi
3017*53ee8cc1Swenshuai.xi if(u32SwInt)
3018*53ee8cc1Swenshuai.xi {
3019*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearSw();
3020*53ee8cc1Swenshuai.xi }
3021*53ee8cc1Swenshuai.xi
3022*53ee8cc1Swenshuai.xi if(u32HwInt)
3023*53ee8cc1Swenshuai.xi {
3024*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearHw(u32HwInt);
3025*53ee8cc1Swenshuai.xi }
3026*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
3027*53ee8cc1Swenshuai.xi if(u32HwInt2)
3028*53ee8cc1Swenshuai.xi {
3029*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearHw2(u32HwInt2);
3030*53ee8cc1Swenshuai.xi }
3031*53ee8cc1Swenshuai.xi #endif
3032*53ee8cc1Swenshuai.xi
3033*53ee8cc1Swenshuai.xi _TSP_INT_UNLOCK();
3034*53ee8cc1Swenshuai.xi
3035*53ee8cc1Swenshuai.xi //HAL_TSP_ISR_RESTORE_ALL();
3036*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
3037*53ee8cc1Swenshuai.xi //return IRQ_HANDLED;
3038*53ee8cc1Swenshuai.xi #endif
3039*53ee8cc1Swenshuai.xi
3040*53ee8cc1Swenshuai.xi OSAL_TSP_IntEnable();
3041*53ee8cc1Swenshuai.xi }
3042*53ee8cc1Swenshuai.xi
3043*53ee8cc1Swenshuai.xi void MDrv_TSP_SecFlt_Update(MS_U32 u32EngId, MS_U32 u32SecFltId)
3044*53ee8cc1Swenshuai.xi {
3045*53ee8cc1Swenshuai.xi _TSP_SetSecRdyId(u32SecFltId);
3046*53ee8cc1Swenshuai.xi }
3047*53ee8cc1Swenshuai.xi
3048*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_Isr_Proc_SecRdyCrc(MS_U32 u32EngId, MS_U32 u32FltId, MS_U32 u32CbOpt, MS_U32* pu32Evt)
3049*53ee8cc1Swenshuai.xi {
3050*53ee8cc1Swenshuai.xi MS_BOOL bData = 0;
3051*53ee8cc1Swenshuai.xi MS_U32 u32Event;
3052*53ee8cc1Swenshuai.xi MS_U32 u32Events;
3053*53ee8cc1Swenshuai.xi MS_U32 u32EvtNotify;
3054*53ee8cc1Swenshuai.xi P_DrvTSP_EvtCallback pfEvtCallback = NULL;
3055*53ee8cc1Swenshuai.xi static DrvTSP_Msg msg;
3056*53ee8cc1Swenshuai.xi MS_PHY phyRead;
3057*53ee8cc1Swenshuai.xi MS_U32 u32PIDFlt;
3058*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = _TSP_GET_SECFLT_REG(u32FltId);
3059*53ee8cc1Swenshuai.xi
3060*53ee8cc1Swenshuai.xi *pu32Evt = (MS_U32)E_DRVTSP_EVENT_DATA_INIT;
3061*53ee8cc1Swenshuai.xi
3062*53ee8cc1Swenshuai.xi if (E_DRVTSP_EVENT_CB_POLL == u32CbOpt)
3063*53ee8cc1Swenshuai.xi {
3064*53ee8cc1Swenshuai.xi _TSP_GetEvent(u32Events, TSP_TASK_EVENT_SECTION_POLL, OSAL_EVENT_OR_CLEAR, 0);
3065*53ee8cc1Swenshuai.xi }
3066*53ee8cc1Swenshuai.xi
3067*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
3068*53ee8cc1Swenshuai.xi
3069*53ee8cc1Swenshuai.xi //using section filter ID to find the mapping pid filter id
3070*53ee8cc1Swenshuai.xi for(u32PIDFlt = 0; u32PIDFlt < TSP_PIDFLT_NUM; u32PIDFlt++)
3071*53ee8cc1Swenshuai.xi {
3072*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltMap[u32PIDFlt] == u32FltId)
3073*53ee8cc1Swenshuai.xi {
3074*53ee8cc1Swenshuai.xi break;
3075*53ee8cc1Swenshuai.xi }
3076*53ee8cc1Swenshuai.xi }
3077*53ee8cc1Swenshuai.xi
3078*53ee8cc1Swenshuai.xi if (TSP_PIDFLT_NUM == u32PIDFlt)
3079*53ee8cc1Swenshuai.xi goto PRCSEC_END;
3080*53ee8cc1Swenshuai.xi
3081*53ee8cc1Swenshuai.xi if (!(_ptsp_res->_TspState[u32EngId].FltState[u32PIDFlt] & E_DRVTSP_FLT_STATE_ENABLE))
3082*53ee8cc1Swenshuai.xi {
3083*53ee8cc1Swenshuai.xi // TSP_DBG("[%s][%d] %d 0x%08x\n", __FUNCTION__, __LINE__,
3084*53ee8cc1Swenshuai.xi //(int)u32FltId, (int)_ptsp_res->_TspState[u32EngId].FltState[u32FltId]);
3085*53ee8cc1Swenshuai.xi goto PRCSEC_END;
3086*53ee8cc1Swenshuai.xi }
3087*53ee8cc1Swenshuai.xi
3088*53ee8cc1Swenshuai.xi if (_TSP_GetFltDisableId(u32FltId, &u32Event, OSAL_EVENT_OR_CLEAR))
3089*53ee8cc1Swenshuai.xi {
3090*53ee8cc1Swenshuai.xi //No need to disable filter here or Overflow callback will miss.
3091*53ee8cc1Swenshuai.xi _TSP_PidFlt_Disable(u32EngId, u32PIDFlt); // critical section
3092*53ee8cc1Swenshuai.xi //_TSP_GetSecRdyId(u32FltId, &u32Event, OSAL_EVENT_OR_CLEAR);
3093*53ee8cc1Swenshuai.xi //_TSP_GetSecOvfId(u32FltId, &u32Event, OSAL_EVENT_OR_CLEAR);
3094*53ee8cc1Swenshuai.xi }
3095*53ee8cc1Swenshuai.xi phyRead = HAL_TSP_SecBuf_GetBufRead(pSecFilter);
3096*53ee8cc1Swenshuai.xi bData = (phyRead != HAL_TSP_SecBuf_GetBufWrite(pSecFilter))? TRUE: FALSE; // critical section
3097*53ee8cc1Swenshuai.xi
3098*53ee8cc1Swenshuai.xi if (bData)
3099*53ee8cc1Swenshuai.xi {
3100*53ee8cc1Swenshuai.xi if (E_DRVTSP_EVENT_CB_POLL == u32CbOpt)
3101*53ee8cc1Swenshuai.xi {
3102*53ee8cc1Swenshuai.xi *pu32Evt = (MS_U32)E_DRVTSP_EVENT_DATA_READY;
3103*53ee8cc1Swenshuai.xi }
3104*53ee8cc1Swenshuai.xi else
3105*53ee8cc1Swenshuai.xi {
3106*53ee8cc1Swenshuai.xi //_TSP_SECFLT_LOCK(u32EngId, u32FltId);
3107*53ee8cc1Swenshuai.xi u32EvtNotify = _ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32FltId];
3108*53ee8cc1Swenshuai.xi pfEvtCallback = _ptsp_res->_TspState[u32EngId].SecFltCallback[u32FltId];
3109*53ee8cc1Swenshuai.xi if ((u32EvtNotify & E_DRVTSP_EVENT_DATA_READY) && pfEvtCallback)
3110*53ee8cc1Swenshuai.xi {
3111*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltState[u32PIDFlt] & E_DRVTSP_FLT_STATE_FREEING)
3112*53ee8cc1Swenshuai.xi {
3113*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s][%d]Warning!! Filter %u is closing %x\n", __FUNCTION__, __LINE__, (unsigned int)u32PIDFlt, (unsigned int)stDrvState);
3114*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
3115*53ee8cc1Swenshuai.xi return FALSE;
3116*53ee8cc1Swenshuai.xi }
3117*53ee8cc1Swenshuai.xi else
3118*53ee8cc1Swenshuai.xi {
3119*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PIDFlt] |= E_DRVTSP_FLT_STATE_CBRUN;
3120*53ee8cc1Swenshuai.xi }
3121*53ee8cc1Swenshuai.xi
3122*53ee8cc1Swenshuai.xi msg.FltInfo = (u32EngId <<MSG_FLTINFO_ENG_ID_SHFT) | (u32FltId <<MSG_FLTINFO_SEC_ID_SHFT);
3123*53ee8cc1Swenshuai.xi _u32TaskLine = __LINE__;
3124*53ee8cc1Swenshuai.xi //_TSP_SECFLT_UNLOCK(u32EngId, u32FltId);
3125*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
3126*53ee8cc1Swenshuai.xi pfEvtCallback(E_DRVTSP_EVENT_DATA_READY, &msg);
3127*53ee8cc1Swenshuai.xi _u32TaskLine = __LINE__;
3128*53ee8cc1Swenshuai.xi
3129*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
3130*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PIDFlt] &= ~E_DRVTSP_FLT_STATE_CBRUN;
3131*53ee8cc1Swenshuai.xi if (phyRead == HAL_TSP_SecBuf_GetBufRead(pSecFilter))
3132*53ee8cc1Swenshuai.xi {
3133*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId(u32FltId, &u32Event, OSAL_EVENT_OR_CLEAR);
3134*53ee8cc1Swenshuai.xi }
3135*53ee8cc1Swenshuai.xi }
3136*53ee8cc1Swenshuai.xi }
3137*53ee8cc1Swenshuai.xi }
3138*53ee8cc1Swenshuai.xi else
3139*53ee8cc1Swenshuai.xi {
3140*53ee8cc1Swenshuai.xi //_TSP_GetSecRdyId(u32FltId, &u32Event, OSAL_EVENT_OR_CLEAR);
3141*53ee8cc1Swenshuai.xi }
3142*53ee8cc1Swenshuai.xi
3143*53ee8cc1Swenshuai.xi //Clear evets,
3144*53ee8cc1Swenshuai.xi if (E_DRVTSP_EVENT_CB_POLL == u32CbOpt)
3145*53ee8cc1Swenshuai.xi {
3146*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId(u32FltId, &u32Event, OSAL_EVENT_OR_CLEAR);
3147*53ee8cc1Swenshuai.xi }
3148*53ee8cc1Swenshuai.xi
3149*53ee8cc1Swenshuai.xi PRCSEC_END:
3150*53ee8cc1Swenshuai.xi
3151*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
3152*53ee8cc1Swenshuai.xi
3153*53ee8cc1Swenshuai.xi if (bData)
3154*53ee8cc1Swenshuai.xi {
3155*53ee8cc1Swenshuai.xi return TRUE;
3156*53ee8cc1Swenshuai.xi }
3157*53ee8cc1Swenshuai.xi
3158*53ee8cc1Swenshuai.xi return FALSE;
3159*53ee8cc1Swenshuai.xi }
3160*53ee8cc1Swenshuai.xi
3161*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_Isr_Proc_SecCrcErr(MS_U32 u32EngId, MS_U32 u32FltId, MS_U32 u32CbOpt, MS_U32* pu32Evt)
3162*53ee8cc1Swenshuai.xi {
3163*53ee8cc1Swenshuai.xi MS_U32 u32Events;
3164*53ee8cc1Swenshuai.xi MS_U32 u32EvtNotify;
3165*53ee8cc1Swenshuai.xi P_DrvTSP_EvtCallback pfEvtCallback = NULL;
3166*53ee8cc1Swenshuai.xi static DrvTSP_Msg msg;
3167*53ee8cc1Swenshuai.xi MS_U32 u32PIDFlt;
3168*53ee8cc1Swenshuai.xi
3169*53ee8cc1Swenshuai.xi *pu32Evt = (MS_U32)E_DRVTSP_EVENT_DATA_INIT;
3170*53ee8cc1Swenshuai.xi
3171*53ee8cc1Swenshuai.xi if (E_DRVTSP_EVENT_CB_POLL == u32CbOpt)
3172*53ee8cc1Swenshuai.xi {
3173*53ee8cc1Swenshuai.xi _TSP_GetEvent(u32Events, TSP_TASK_EVENT_SECTION_POLL, OSAL_EVENT_OR_CLEAR, 0);
3174*53ee8cc1Swenshuai.xi }
3175*53ee8cc1Swenshuai.xi
3176*53ee8cc1Swenshuai.xi //using section filter ID to find the mapping pid filter id
3177*53ee8cc1Swenshuai.xi for(u32PIDFlt = 0; u32PIDFlt < TSP_PIDFLT_NUM; u32PIDFlt++)
3178*53ee8cc1Swenshuai.xi {
3179*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltMap[u32PIDFlt] == u32FltId)
3180*53ee8cc1Swenshuai.xi break;
3181*53ee8cc1Swenshuai.xi }
3182*53ee8cc1Swenshuai.xi if(u32PIDFlt == TSP_PIDFLT_NUM)
3183*53ee8cc1Swenshuai.xi {
3184*53ee8cc1Swenshuai.xi return FALSE;
3185*53ee8cc1Swenshuai.xi }
3186*53ee8cc1Swenshuai.xi
3187*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32FltId] & E_DRVTSP_EVENT_SEC_CRCERR) == 0)
3188*53ee8cc1Swenshuai.xi {
3189*53ee8cc1Swenshuai.xi return FALSE;
3190*53ee8cc1Swenshuai.xi }
3191*53ee8cc1Swenshuai.xi
3192*53ee8cc1Swenshuai.xi if (E_DRVTSP_EVENT_CB_POLL == u32CbOpt)
3193*53ee8cc1Swenshuai.xi {
3194*53ee8cc1Swenshuai.xi *pu32Evt = (MS_U32)E_DRVTSP_EVENT_SEC_CRCERR;
3195*53ee8cc1Swenshuai.xi }
3196*53ee8cc1Swenshuai.xi else
3197*53ee8cc1Swenshuai.xi {
3198*53ee8cc1Swenshuai.xi //_TSP_SECFLT_LOCK(u32EngId, u32SecFltId);
3199*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
3200*53ee8cc1Swenshuai.xi u32EvtNotify = _ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32FltId];
3201*53ee8cc1Swenshuai.xi pfEvtCallback = _ptsp_res->_TspState[u32EngId].SecFltCallback[u32FltId];
3202*53ee8cc1Swenshuai.xi if ((u32EvtNotify & E_DRVTSP_EVENT_SEC_CRCERR) && pfEvtCallback)
3203*53ee8cc1Swenshuai.xi {
3204*53ee8cc1Swenshuai.xi msg.FltInfo = (u32EngId <<MSG_FLTINFO_ENG_ID_SHFT) | (u32FltId <<MSG_FLTINFO_SEC_ID_SHFT);
3205*53ee8cc1Swenshuai.xi //_TSP_SECFLT_UNLOCK(u32EngId, u32SecFltId);
3206*53ee8cc1Swenshuai.xi _u32TaskLine = __LINE__;
3207*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
3208*53ee8cc1Swenshuai.xi pfEvtCallback(E_DRVTSP_EVENT_SEC_CRCERR, &msg);
3209*53ee8cc1Swenshuai.xi _u32TaskLine = __LINE__;
3210*53ee8cc1Swenshuai.xi }
3211*53ee8cc1Swenshuai.xi else
3212*53ee8cc1Swenshuai.xi {
3213*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
3214*53ee8cc1Swenshuai.xi }
3215*53ee8cc1Swenshuai.xi }
3216*53ee8cc1Swenshuai.xi
3217*53ee8cc1Swenshuai.xi return TRUE;
3218*53ee8cc1Swenshuai.xi }
3219*53ee8cc1Swenshuai.xi
3220*53ee8cc1Swenshuai.xi #ifndef NO_PVR
3221*53ee8cc1Swenshuai.xi static void _TSP_Isr_Proc_Pvr(MS_U32 u32CbOpt)
3222*53ee8cc1Swenshuai.xi {
3223*53ee8cc1Swenshuai.xi MS_U32 u32Events = 0;
3224*53ee8cc1Swenshuai.xi static DrvTSP_Msg msg;
3225*53ee8cc1Swenshuai.xi
3226*53ee8cc1Swenshuai.xi if (((_ptsp_res->_PvrEvtNotify[0] & E_DRVTSP_EVENT_CB_MASK) != u32CbOpt)
3227*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
3228*53ee8cc1Swenshuai.xi && ((_ptsp_res->_PvrEvtNotify[1] & E_DRVTSP_EVENT_CB_MASK) != u32CbOpt)
3229*53ee8cc1Swenshuai.xi #endif
3230*53ee8cc1Swenshuai.xi )
3231*53ee8cc1Swenshuai.xi {
3232*53ee8cc1Swenshuai.xi return;
3233*53ee8cc1Swenshuai.xi }
3234*53ee8cc1Swenshuai.xi
3235*53ee8cc1Swenshuai.xi if (u32CbOpt == E_DRVTSP_EVENT_CB_POLL)
3236*53ee8cc1Swenshuai.xi {
3237*53ee8cc1Swenshuai.xi _TSP_GetEvent(u32Events, TSP_TASK_EVENT_PVR0_RDY_POLL | TSP_TASK_EVENT_PVR1_RDY_POLL |
3238*53ee8cc1Swenshuai.xi TSP_TASK_EVENT_CBPVR0_RDY_POLL, OSAL_EVENT_OR_CLEAR, 0);
3239*53ee8cc1Swenshuai.xi }
3240*53ee8cc1Swenshuai.xi else
3241*53ee8cc1Swenshuai.xi {
3242*53ee8cc1Swenshuai.xi _TSP_GetEvent(u32Events, TSP_TASK_EVENT_PVR0_RDY_SELF | TSP_TASK_EVENT_PVR1_RDY_SELF |
3243*53ee8cc1Swenshuai.xi TSP_TASK_EVENT_CBPVR0_RDY_SELF, OSAL_EVENT_OR_CLEAR, 0);
3244*53ee8cc1Swenshuai.xi }
3245*53ee8cc1Swenshuai.xi
3246*53ee8cc1Swenshuai.xi if (_ptsp_res->_PvrEvtNotify[0] && _ptsp_res->_PvrCallback[0])
3247*53ee8cc1Swenshuai.xi {
3248*53ee8cc1Swenshuai.xi switch (u32Events & (TSP_TASK_EVENT_PVR0_RDY_POLL | TSP_TASK_EVENT_PVR1_RDY_POLL | TSP_TASK_EVENT_PVR0_RDY_SELF | TSP_TASK_EVENT_PVR1_RDY_SELF))
3249*53ee8cc1Swenshuai.xi {
3250*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR0_RDY_SELF:
3251*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR0_RDY_POLL:
3252*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[0], E_DRVTSP_EVENT_PVRBUF_FULL))
3253*53ee8cc1Swenshuai.xi {
3254*53ee8cc1Swenshuai.xi msg.PvrBufId = (0x0 << MSG_PVRBUF_ID_SHFT);
3255*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[0](E_DRVTSP_EVENT_PVRBUF_FULL, &msg);
3256*53ee8cc1Swenshuai.xi }
3257*53ee8cc1Swenshuai.xi break;
3258*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR1_RDY_SELF:
3259*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR1_RDY_POLL:
3260*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[0], E_DRVTSP_EVENT_PVRBUF_FULL))
3261*53ee8cc1Swenshuai.xi {
3262*53ee8cc1Swenshuai.xi msg.PvrBufId = (0x1 << MSG_PVRBUF_ID_SHFT);
3263*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[0](E_DRVTSP_EVENT_PVRBUF_FULL, &msg);
3264*53ee8cc1Swenshuai.xi }
3265*53ee8cc1Swenshuai.xi break;
3266*53ee8cc1Swenshuai.xi case (TSP_TASK_EVENT_PVR0_RDY_SELF | TSP_TASK_EVENT_PVR1_RDY_SELF):
3267*53ee8cc1Swenshuai.xi case (TSP_TASK_EVENT_PVR0_RDY_POLL | TSP_TASK_EVENT_PVR1_RDY_POLL):
3268*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[0], E_DRVTSP_EVENT_PVRBUF_OVERFLOW))
3269*53ee8cc1Swenshuai.xi {
3270*53ee8cc1Swenshuai.xi msg.PvrBufId = (MSG_PVRBUF_ID_NULL << MSG_PVRBUF_ID_SHFT);
3271*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[0](E_DRVTSP_EVENT_PVRBUF_OVERFLOW, &msg);
3272*53ee8cc1Swenshuai.xi }
3273*53ee8cc1Swenshuai.xi break;
3274*53ee8cc1Swenshuai.xi default:
3275*53ee8cc1Swenshuai.xi break;
3276*53ee8cc1Swenshuai.xi }
3277*53ee8cc1Swenshuai.xi }
3278*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
3279*53ee8cc1Swenshuai.xi if (_ptsp_res->_PvrEvtNotify[1] && _ptsp_res->_PvrCallback[1])
3280*53ee8cc1Swenshuai.xi {
3281*53ee8cc1Swenshuai.xi switch (u32Events & (TSP_TASK_EVENT_CBPVR0_RDY_POLL | TSP_TASK_EVENT_CBPVR0_RDY_SELF))
3282*53ee8cc1Swenshuai.xi {
3283*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_CBPVR0_RDY_POLL:
3284*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[1], E_DRVTSP_EVENT_CBBUF_FULL))
3285*53ee8cc1Swenshuai.xi {
3286*53ee8cc1Swenshuai.xi msg.Pvr1BufId = (0x0 << MSG_PVRBUF_ID_SHFT);
3287*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[1](E_DRVTSP_EVENT_CBBUF_FULL, &msg);
3288*53ee8cc1Swenshuai.xi }
3289*53ee8cc1Swenshuai.xi break;
3290*53ee8cc1Swenshuai.xi }
3291*53ee8cc1Swenshuai.xi }
3292*53ee8cc1Swenshuai.xi #endif
3293*53ee8cc1Swenshuai.xi }
3294*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
3295*53ee8cc1Swenshuai.xi
3296*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_Isr_Proc_SecOvf(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_U32 u32CbOpt, MS_U32* pu32Evt)
3297*53ee8cc1Swenshuai.xi {
3298*53ee8cc1Swenshuai.xi static DrvTSP_Msg msg;
3299*53ee8cc1Swenshuai.xi MS_U32 u32EvtNotify, u32Events = 0;
3300*53ee8cc1Swenshuai.xi P_DrvTSP_EvtCallback pfEvtCallback = NULL;
3301*53ee8cc1Swenshuai.xi MS_U32 u32PidFltId;
3302*53ee8cc1Swenshuai.xi MS_BOOL bDisabled = FALSE;
3303*53ee8cc1Swenshuai.xi
3304*53ee8cc1Swenshuai.xi *pu32Evt = (MS_U32)E_DRVTSP_EVENT_DATA_INIT;
3305*53ee8cc1Swenshuai.xi
3306*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
3307*53ee8cc1Swenshuai.xi for (u32PidFltId = 0; u32PidFltId < TSP_PIDFLT_NUM; u32PidFltId++)
3308*53ee8cc1Swenshuai.xi {
3309*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltMap[u32PidFltId] == 0xFF)
3310*53ee8cc1Swenshuai.xi continue;
3311*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltMap[u32PidFltId] == u32SecFltId)
3312*53ee8cc1Swenshuai.xi {
3313*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] & E_DRVTSP_FLT_STATE_ENABLE)
3314*53ee8cc1Swenshuai.xi {
3315*53ee8cc1Swenshuai.xi _TSP_PidFlt_Disable(u32EngId, u32PidFltId); // ???? move out --> OK // // critical section
3316*53ee8cc1Swenshuai.xi bDisabled = TRUE;
3317*53ee8cc1Swenshuai.xi }
3318*53ee8cc1Swenshuai.xi break;
3319*53ee8cc1Swenshuai.xi }
3320*53ee8cc1Swenshuai.xi }
3321*53ee8cc1Swenshuai.xi
3322*53ee8cc1Swenshuai.xi if(u32PidFltId == TSP_PIDFLT_NUM)
3323*53ee8cc1Swenshuai.xi {
3324*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
3325*53ee8cc1Swenshuai.xi return TRUE;
3326*53ee8cc1Swenshuai.xi }
3327*53ee8cc1Swenshuai.xi
3328*53ee8cc1Swenshuai.xi if (E_DRVTSP_EVENT_CB_POLL == u32CbOpt)
3329*53ee8cc1Swenshuai.xi {
3330*53ee8cc1Swenshuai.xi *pu32Evt = (MS_U32)E_DRVTSP_EVENT_BUF_OVERFLOW;
3331*53ee8cc1Swenshuai.xi
3332*53ee8cc1Swenshuai.xi //---- if overflow, clear evets to wait restarting--------
3333*53ee8cc1Swenshuai.xi _TSP_GetSecOvfId (u32SecFltId, &u32Events, OSAL_EVENT_OR_CLEAR);
3334*53ee8cc1Swenshuai.xi _TSP_GetSecCrcId (u32SecFltId, &u32Events, OSAL_EVENT_OR_CLEAR);
3335*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId (u32SecFltId, &u32Events, OSAL_EVENT_OR_CLEAR);
3336*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------
3337*53ee8cc1Swenshuai.xi }
3338*53ee8cc1Swenshuai.xi else
3339*53ee8cc1Swenshuai.xi {
3340*53ee8cc1Swenshuai.xi //_TSP_SECFLT_LOCK(u32EngId, u32SecFltId);
3341*53ee8cc1Swenshuai.xi u32EvtNotify = _ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId];
3342*53ee8cc1Swenshuai.xi pfEvtCallback = _ptsp_res->_TspState[u32EngId].SecFltCallback[u32SecFltId];
3343*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] == E_DRVTSP_FLT_STATE_FREE && (bDisabled == FALSE))
3344*53ee8cc1Swenshuai.xi {
3345*53ee8cc1Swenshuai.xi goto PROC_END;
3346*53ee8cc1Swenshuai.xi }
3347*53ee8cc1Swenshuai.xi
3348*53ee8cc1Swenshuai.xi if ((u32EvtNotify & E_DRVTSP_EVENT_BUF_OVERFLOW) && pfEvtCallback)
3349*53ee8cc1Swenshuai.xi {
3350*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] & E_DRVTSP_FLT_STATE_FREEING)
3351*53ee8cc1Swenshuai.xi {
3352*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s][%d]Warning!! Filter %u is closing %x\n", __FUNCTION__, __LINE__, (unsigned int)u32PidFltId, (unsigned int)stDrvState);
3353*53ee8cc1Swenshuai.xi goto PROC_END;
3354*53ee8cc1Swenshuai.xi }
3355*53ee8cc1Swenshuai.xi else
3356*53ee8cc1Swenshuai.xi {
3357*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] |= E_DRVTSP_FLT_STATE_CBRUN;
3358*53ee8cc1Swenshuai.xi }
3359*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
3360*53ee8cc1Swenshuai.xi msg.FltInfo = (u32EngId <<MSG_FLTINFO_ENG_ID_SHFT) | (u32SecFltId <<MSG_FLTINFO_SEC_ID_SHFT);
3361*53ee8cc1Swenshuai.xi _u32TaskLine = __LINE__;
3362*53ee8cc1Swenshuai.xi pfEvtCallback(E_DRVTSP_EVENT_BUF_OVERFLOW, &msg);
3363*53ee8cc1Swenshuai.xi _u32TaskLine = __LINE__;
3364*53ee8cc1Swenshuai.xi
3365*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
3366*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] &= ~E_DRVTSP_FLT_STATE_CBRUN;
3367*53ee8cc1Swenshuai.xi }
3368*53ee8cc1Swenshuai.xi }
3369*53ee8cc1Swenshuai.xi
3370*53ee8cc1Swenshuai.xi PROC_END:
3371*53ee8cc1Swenshuai.xi
3372*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
3373*53ee8cc1Swenshuai.xi return TRUE;
3374*53ee8cc1Swenshuai.xi }
3375*53ee8cc1Swenshuai.xi
3376*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
3377*53ee8cc1Swenshuai.xi static void _TSP_Isr_ProcSelf(MS_U32 u32PrcEvt, TSP_Result* pRet)
3378*53ee8cc1Swenshuai.xi {
3379*53ee8cc1Swenshuai.xi #else
3380*53ee8cc1Swenshuai.xi static void _TSP_Isr_ProcSelf(OSAL_TSP_ProcTypeParam* pData)
3381*53ee8cc1Swenshuai.xi {
3382*53ee8cc1Swenshuai.xi TSP_Result* pRet = (TSP_Result*)pData->pRet;
3383*53ee8cc1Swenshuai.xi #endif
3384*53ee8cc1Swenshuai.xi MS_U32 u32Events = 0, u32SecRdy = 0, u32SecOvf = 0, u32SecCrc = 0;;//, u32SecFree = 0;
3385*53ee8cc1Swenshuai.xi MS_U32 i = 0, j = 0;
3386*53ee8cc1Swenshuai.xi MS_U32 u32Evt = 0;
3387*53ee8cc1Swenshuai.xi //MS_U32 u32PidFltId;
3388*53ee8cc1Swenshuai.xi //MS_U32 u32Mask, u32AskFreeFltList = 0;
3389*53ee8cc1Swenshuai.xi //MS_U32 u32GroupNum = (TSP_PIDFLT_NUM_ALL+31)>>5;
3390*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId = 0;
3391*53ee8cc1Swenshuai.xi //MS_U32 u32TempEvent = 0;
3392*53ee8cc1Swenshuai.xi
3393*53ee8cc1Swenshuai.xi #if 0
3394*53ee8cc1Swenshuai.xi _TSP_GetEvent(u32TempEvent, TSP_TASK_EVENT_FWMSG, OSAL_EVENT_OR_CLEAR, 0);
3395*53ee8cc1Swenshuai.xi if(u32TempEvent & (TSP_TASK_EVENT_FWMSG))
3396*53ee8cc1Swenshuai.xi {
3397*53ee8cc1Swenshuai.xi _DumpFwMsg();
3398*53ee8cc1Swenshuai.xi }
3399*53ee8cc1Swenshuai.xi #endif
3400*53ee8cc1Swenshuai.xi
3401*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
3402*53ee8cc1Swenshuai.xi u32Events = u32PrcEvt;
3403*53ee8cc1Swenshuai.xi #else
3404*53ee8cc1Swenshuai.xi _TSP_GetEvent(u32Events, TSP_TASK_EVENT_GROUP_SELF | TSP_TASK_EVENT_FLT_FREE, OSAL_EVENT_OR_CLEAR, MSOS_WAIT_FOREVER);
3405*53ee8cc1Swenshuai.xi *pRet = DRVTSP_FAIL;
3406*53ee8cc1Swenshuai.xi #endif
3407*53ee8cc1Swenshuai.xi
3408*53ee8cc1Swenshuai.xi //ULOGD("TSP", "TSP Evt %lx %ld\n", u32Events, MsOS_GetSystemTime());
3409*53ee8cc1Swenshuai.xi
3410*53ee8cc1Swenshuai.xi _u32TaskLine = __LINE__;
3411*53ee8cc1Swenshuai.xi
3412*53ee8cc1Swenshuai.xi #ifndef NO_PVR
3413*53ee8cc1Swenshuai.xi if (u32Events & (TSP_TASK_EVENT_PVR0_RDY_POLL|TSP_TASK_EVENT_PVR1_RDY_POLL))
3414*53ee8cc1Swenshuai.xi {
3415*53ee8cc1Swenshuai.xi _TSP_Isr_Proc_Pvr(E_DRVTSP_EVENT_CB_SELF);
3416*53ee8cc1Swenshuai.xi }
3417*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
3418*53ee8cc1Swenshuai.xi if (u32Events & TSP_TASK_EVENT_SECTION_SELF)
3419*53ee8cc1Swenshuai.xi {
3420*53ee8cc1Swenshuai.xi for (i = 0; i < TSP_ENGINE_NUM; i++)
3421*53ee8cc1Swenshuai.xi {
3422*53ee8cc1Swenshuai.xi for (j = 0; j < ((TSP_SECFLT_NUM_All+31)>>5); j++)
3423*53ee8cc1Swenshuai.xi {
3424*53ee8cc1Swenshuai.xi _TSP_GetModeSecOvf(j, 0xFFFFFFFF, &u32SecOvf, OSAL_EVENT_OR_CLEAR);
3425*53ee8cc1Swenshuai.xi _TSP_GetModeSecRdy(j, 0xFFFFFFFF, &u32SecRdy, OSAL_EVENT_OR_CLEAR);
3426*53ee8cc1Swenshuai.xi _TSP_GetModeSecCrc(j, 0xFFFFFFFF, &u32SecCrc, OSAL_EVENT_OR_CLEAR);
3427*53ee8cc1Swenshuai.xi while (u32SecRdy)
3428*53ee8cc1Swenshuai.xi {
3429*53ee8cc1Swenshuai.xi u32SecFltId = MAsm_CPU_GetTrailOne(u32SecRdy) + (j << 5); //[TODO] balance every filter priority
3430*53ee8cc1Swenshuai.xi //[NOTE] it may be already balance for long term running
3431*53ee8cc1Swenshuai.xi *pRet = (_TSP_Isr_Proc_SecRdyCrc(i, u32SecFltId, E_DRVTSP_EVENT_CB_SELF, &u32Evt))? DRVTSP_OK: DRVTSP_FAIL;
3432*53ee8cc1Swenshuai.xi u32SecRdy &= ~(1 << (u32SecFltId & 0x1F));
3433*53ee8cc1Swenshuai.xi }
3434*53ee8cc1Swenshuai.xi
3435*53ee8cc1Swenshuai.xi while (u32SecCrc)
3436*53ee8cc1Swenshuai.xi {
3437*53ee8cc1Swenshuai.xi u32SecFltId = MAsm_CPU_GetTrailOne(u32SecCrc) + (j << 5); //[TODO] balance every filter priority
3438*53ee8cc1Swenshuai.xi //[NOTE] it may be already balance for long term running
3439*53ee8cc1Swenshuai.xi *pRet = (_TSP_Isr_Proc_SecCrcErr(i, u32SecFltId, E_DRVTSP_EVENT_CB_SELF, &u32Evt))? DRVTSP_OK: DRVTSP_FAIL;
3440*53ee8cc1Swenshuai.xi u32SecCrc &= ~(1 << (u32SecFltId & 0x1F));
3441*53ee8cc1Swenshuai.xi }
3442*53ee8cc1Swenshuai.xi
3443*53ee8cc1Swenshuai.xi while(u32SecOvf)
3444*53ee8cc1Swenshuai.xi {
3445*53ee8cc1Swenshuai.xi u32SecFltId = MAsm_CPU_GetTrailOne(u32SecOvf) + (j << 5); //[TODO] balance every filter priority
3446*53ee8cc1Swenshuai.xi //[NOTE] it may be already balance for long term running
3447*53ee8cc1Swenshuai.xi *pRet = (_TSP_Isr_Proc_SecOvf(i, u32SecFltId, E_DRVTSP_EVENT_CB_SELF, &u32Evt))? DRVTSP_OK: DRVTSP_FAIL;
3448*53ee8cc1Swenshuai.xi u32SecOvf &= ~(1 << (u32SecFltId & 0x1F));
3449*53ee8cc1Swenshuai.xi }
3450*53ee8cc1Swenshuai.xi }
3451*53ee8cc1Swenshuai.xi }
3452*53ee8cc1Swenshuai.xi }
3453*53ee8cc1Swenshuai.xi
3454*53ee8cc1Swenshuai.xi #if 0
3455*53ee8cc1Swenshuai.xi if (u32Events & TSP_TASK_EVENT_FLT_FREE)
3456*53ee8cc1Swenshuai.xi {
3457*53ee8cc1Swenshuai.xi for (j = 0; j < u32GroupNum; j++)
3458*53ee8cc1Swenshuai.xi {
3459*53ee8cc1Swenshuai.xi u32Mask = u32AskFreeFltList = _TSP_GetAskPidFltFree0List(j);
3460*53ee8cc1Swenshuai.xi
3461*53ee8cc1Swenshuai.xi if (u32Mask)
3462*53ee8cc1Swenshuai.xi {
3463*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
3464*53ee8cc1Swenshuai.xi }
3465*53ee8cc1Swenshuai.xi
3466*53ee8cc1Swenshuai.xi while (u32AskFreeFltList)
3467*53ee8cc1Swenshuai.xi {
3468*53ee8cc1Swenshuai.xi u32PidFltId = MAsm_CPU_GetTrailOne(u32AskFreeFltList) + (j << 5);
3469*53ee8cc1Swenshuai.xi
3470*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[0].FltState[u32PidFltId] != E_DRVTSP_FLT_STATE_FREE)
3471*53ee8cc1Swenshuai.xi {
3472*53ee8cc1Swenshuai.xi u32SecFltId = HAL_TSP_PidFlt_GetSecFlt(HAL_TSP_GetPidFltReg(0, u32PidFltId));
3473*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId(u32SecFltId, &u32SecRdy, OSAL_EVENT_OR_CLEAR);
3474*53ee8cc1Swenshuai.xi _TSP_GetSecOvfId(u32SecFltId, &u32SecOvf, OSAL_EVENT_OR_CLEAR);
3475*53ee8cc1Swenshuai.xi _TSP_SecBuf_Free(0, u32SecFltId);
3476*53ee8cc1Swenshuai.xi _TSP_SecFlt_Free(0, u32SecFltId, TRUE);
3477*53ee8cc1Swenshuai.xi _TSP_PidFlt_Free(0, u32PidFltId, FALSE);
3478*53ee8cc1Swenshuai.xi }
3479*53ee8cc1Swenshuai.xi _TSP_FLAG_SetDone(u32PidFltId);
3480*53ee8cc1Swenshuai.xi u32AskFreeFltList &= (~(1<<(u32PidFltId & 0x1F)));
3481*53ee8cc1Swenshuai.xi }
3482*53ee8cc1Swenshuai.xi if (u32Mask)
3483*53ee8cc1Swenshuai.xi {
3484*53ee8cc1Swenshuai.xi _TSP_ClrAskPidFltFree0List(j, u32Mask);
3485*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
3486*53ee8cc1Swenshuai.xi }
3487*53ee8cc1Swenshuai.xi }
3488*53ee8cc1Swenshuai.xi }
3489*53ee8cc1Swenshuai.xi #endif
3490*53ee8cc1Swenshuai.xi }
3491*53ee8cc1Swenshuai.xi
3492*53ee8cc1Swenshuai.xi static void _TSP_Isr_ProcPoll(OSAL_TSP_ProcTypeParam* pData, MS_U32* pu32Evt)
3493*53ee8cc1Swenshuai.xi {
3494*53ee8cc1Swenshuai.xi MS_U32 u32Events = 0, u32SecOvf = 0, u32SecCrc = 0;
3495*53ee8cc1Swenshuai.xi MS_U32 i = 0;
3496*53ee8cc1Swenshuai.xi MS_U32 u32FltId = pData->u32FltId;
3497*53ee8cc1Swenshuai.xi TSP_Result* pRet = (TSP_Result*)pData->pRet;
3498*53ee8cc1Swenshuai.xi MS_BOOL bRes;
3499*53ee8cc1Swenshuai.xi MS_U32 u32FwEvent = 0;
3500*53ee8cc1Swenshuai.xi
3501*53ee8cc1Swenshuai.xi _TSP_GetEvent(u32FwEvent, TSP_TASK_EVENT_FWMSG, OSAL_EVENT_OR_CLEAR, 0);
3502*53ee8cc1Swenshuai.xi if(u32FwEvent & (TSP_TASK_EVENT_FWMSG))
3503*53ee8cc1Swenshuai.xi {
3504*53ee8cc1Swenshuai.xi _DumpFwMsg();
3505*53ee8cc1Swenshuai.xi }
3506*53ee8cc1Swenshuai.xi
3507*53ee8cc1Swenshuai.xi _TSP_GetEvent(u32Events, TSP_TASK_EVENT_GROUP_POLL, OSAL_EVENT_OR, 0);
3508*53ee8cc1Swenshuai.xi
3509*53ee8cc1Swenshuai.xi *pRet = DRVTSP_FAIL;
3510*53ee8cc1Swenshuai.xi
3511*53ee8cc1Swenshuai.xi #ifndef NO_PVR
3512*53ee8cc1Swenshuai.xi if ((u32Events & (TSP_TASK_EVENT_PVR0_RDY_POLL|TSP_TASK_EVENT_PVR1_RDY_POLL|TSP_TASK_EVENT_CBPVR0_RDY_POLL))
3513*53ee8cc1Swenshuai.xi && (u32FltId >= TSP_SECFLT_NUM) && (u32FltId < (TSP_SECFLT_NUM+ TSP_PIDFLT1_NUM)))
3514*53ee8cc1Swenshuai.xi {
3515*53ee8cc1Swenshuai.xi _TSP_Isr_Proc_Pvr(E_DRVTSP_EVENT_CB_POLL);
3516*53ee8cc1Swenshuai.xi return;
3517*53ee8cc1Swenshuai.xi }
3518*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
3519*53ee8cc1Swenshuai.xi
3520*53ee8cc1Swenshuai.xi for (i = 0; i < TSP_ENGINE_NUM; i++)
3521*53ee8cc1Swenshuai.xi {
3522*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId;
3523*53ee8cc1Swenshuai.xi
3524*53ee8cc1Swenshuai.xi REG_PidFlt *pPidFilter = HAL_TSP_GetPidFltReg(i, u32FltId);
3525*53ee8cc1Swenshuai.xi u32SecFltId = HAL_TSP_PidFlt_GetSecFlt(pPidFilter);
3526*53ee8cc1Swenshuai.xi
3527*53ee8cc1Swenshuai.xi *pRet = (_TSP_Isr_Proc_SecRdyCrc(i, u32SecFltId, E_DRVTSP_EVENT_CB_POLL, pu32Evt))? DRVTSP_OK: DRVTSP_FAIL;
3528*53ee8cc1Swenshuai.xi if (DRVTSP_FAIL == *pRet)
3529*53ee8cc1Swenshuai.xi {
3530*53ee8cc1Swenshuai.xi bRes = _TSP_GetSecCrcId(u32SecFltId, &u32SecCrc, OSAL_EVENT_OR);
3531*53ee8cc1Swenshuai.xi
3532*53ee8cc1Swenshuai.xi if (bRes)
3533*53ee8cc1Swenshuai.xi {
3534*53ee8cc1Swenshuai.xi *pRet = (_TSP_Isr_Proc_SecCrcErr(i, u32SecFltId, E_DRVTSP_EVENT_CB_POLL, pu32Evt))? DRVTSP_OK: DRVTSP_FAIL;
3535*53ee8cc1Swenshuai.xi }
3536*53ee8cc1Swenshuai.xi }
3537*53ee8cc1Swenshuai.xi if (DRVTSP_FAIL == *pRet)
3538*53ee8cc1Swenshuai.xi {
3539*53ee8cc1Swenshuai.xi bRes = _TSP_GetSecOvfId(u32SecFltId, &u32SecOvf, OSAL_EVENT_OR);
3540*53ee8cc1Swenshuai.xi
3541*53ee8cc1Swenshuai.xi if (bRes)
3542*53ee8cc1Swenshuai.xi {
3543*53ee8cc1Swenshuai.xi *pRet = (_TSP_Isr_Proc_SecOvf(i, u32SecFltId, E_DRVTSP_EVENT_CB_POLL, pu32Evt))? DRVTSP_OK: DRVTSP_FAIL;
3544*53ee8cc1Swenshuai.xi }
3545*53ee8cc1Swenshuai.xi }
3546*53ee8cc1Swenshuai.xi }
3547*53ee8cc1Swenshuai.xi }
3548*53ee8cc1Swenshuai.xi
3549*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
3550*53ee8cc1Swenshuai.xi static void _TSP_Isr_Proc_Task(OSAL_TSP_ProcTypeParam* pDummy, MS_U32* pu32Dummy)
3551*53ee8cc1Swenshuai.xi {
3552*53ee8cc1Swenshuai.xi TSP_Result Ret;
3553*53ee8cc1Swenshuai.xi OSAL_TSP_ProcTypeParam Data;
3554*53ee8cc1Swenshuai.xi
3555*53ee8cc1Swenshuai.xi Data.u32FltId = 0xFFFFFFFF;
3556*53ee8cc1Swenshuai.xi Data.pRet = (void*)&Ret;
3557*53ee8cc1Swenshuai.xi Data.bInfiniteWait = TRUE;
3558*53ee8cc1Swenshuai.xi Data.bFromTask = TRUE;
3559*53ee8cc1Swenshuai.xi
3560*53ee8cc1Swenshuai.xi while (1)
3561*53ee8cc1Swenshuai.xi {
3562*53ee8cc1Swenshuai.xi _TSP_EXT_LOCK();
3563*53ee8cc1Swenshuai.xi if (_db_flag == 1)
3564*53ee8cc1Swenshuai.xi {
3565*53ee8cc1Swenshuai.xi _db_flag = 2;
3566*53ee8cc1Swenshuai.xi _TSP_EXT_UNLOCK();
3567*53ee8cc1Swenshuai.xi break;
3568*53ee8cc1Swenshuai.xi }
3569*53ee8cc1Swenshuai.xi _TSP_EXT_UNLOCK();
3570*53ee8cc1Swenshuai.xi _TSP_Isr_ProcSelf(&Data);
3571*53ee8cc1Swenshuai.xi } // Task while loop
3572*53ee8cc1Swenshuai.xi
3573*53ee8cc1Swenshuai.xi _s32TspTaskId = -1;
3574*53ee8cc1Swenshuai.xi TSP_DBG("TSP ISR Proc End!!!\n");
3575*53ee8cc1Swenshuai.xi
3576*53ee8cc1Swenshuai.xi }
3577*53ee8cc1Swenshuai.xi #endif
3578*53ee8cc1Swenshuai.xi
3579*53ee8cc1Swenshuai.xi static char tsp_mutex[] = "TSP_Mutex";
3580*53ee8cc1Swenshuai.xi static char tsp_ind_mutex[] = "TSP_Ind_Mutex";
3581*53ee8cc1Swenshuai.xi static char tsp_int_mutex[] = "TSP_Int_Mutex";
3582*53ee8cc1Swenshuai.xi static char tsp_ext_mutex[] = "TSP_Ext_Mutex";
3583*53ee8cc1Swenshuai.xi static char tsp_event[] = "TSP_Event";
3584*53ee8cc1Swenshuai.xi
3585*53ee8cc1Swenshuai.xi static char tsp_secRdy[] = "TSP_SecRdy";
3586*53ee8cc1Swenshuai.xi static char tsp_crcerr[] = "TSP_CrcErr";
3587*53ee8cc1Swenshuai.xi static char tsp_secovf[] = "TSP_SecOvf";
3588*53ee8cc1Swenshuai.xi static char tsp_fltdis[] = "TSP_FltDis";
3589*53ee8cc1Swenshuai.xi //static char freelist0[] = "TSP_FreeList0";
3590*53ee8cc1Swenshuai.xi //static char freelistdefer0[] = "TSP_FreeListDefer0";
3591*53ee8cc1Swenshuai.xi //static char tsp_done[] = "TSP_Done";
3592*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
3593*53ee8cc1Swenshuai.xi static char tsp_isr_task[] = "TSP_ISR_Task";
3594*53ee8cc1Swenshuai.xi #endif
3595*53ee8cc1Swenshuai.xi
3596*53ee8cc1Swenshuai.xi static TSP_Result _TSP_Init(MS_BOOL bResetSwState, MS_BOOL bRestoreRegState)
3597*53ee8cc1Swenshuai.xi {
3598*53ee8cc1Swenshuai.xi MS_VIRT virtTspBank,virtIRBank;
3599*53ee8cc1Swenshuai.xi MS_PHY phyTspBankSize,phyIrBankSize;
3600*53ee8cc1Swenshuai.xi MS_BOOL bAlive;
3601*53ee8cc1Swenshuai.xi MS_U32 u32FwSize = 0;
3602*53ee8cc1Swenshuai.xi MS_PHY phyFwAddr = 0;
3603*53ee8cc1Swenshuai.xi MS_U8 u8ii;
3604*53ee8cc1Swenshuai.xi
3605*53ee8cc1Swenshuai.xi if (FALSE == MDrv_MMIO_GetBASE(&virtTspBank, &phyTspBankSize, MS_MODULE_TSP))
3606*53ee8cc1Swenshuai.xi {
3607*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("MDrv_MMIO_GetBASE fail\n"));
3608*53ee8cc1Swenshuai.xi MS_ASSERT(0);
3609*53ee8cc1Swenshuai.xi }
3610*53ee8cc1Swenshuai.xi if (FALSE == MDrv_MMIO_GetBASE(&virtIRBank, &phyIrBankSize, MS_MODULE_IR))
3611*53ee8cc1Swenshuai.xi {
3612*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("MDrv_MMIO_GetBASE (PM base)fail\n"));
3613*53ee8cc1Swenshuai.xi MS_ASSERT(0);
3614*53ee8cc1Swenshuai.xi }
3615*53ee8cc1Swenshuai.xi
3616*53ee8cc1Swenshuai.xi HAL_TSP_SetBank(virtTspBank, virtIRBank);
3617*53ee8cc1Swenshuai.xi
3618*53ee8cc1Swenshuai.xi #ifdef STC64_SUPPORT
3619*53ee8cc1Swenshuai.xi HAL_TSP_STC64_Mode_En(TRUE);
3620*53ee8cc1Swenshuai.xi #endif
3621*53ee8cc1Swenshuai.xi
3622*53ee8cc1Swenshuai.xi bAlive = HAL_TSP_Alive();
3623*53ee8cc1Swenshuai.xi if (!bAlive)
3624*53ee8cc1Swenshuai.xi {
3625*53ee8cc1Swenshuai.xi HAL_TSP_PowerCtrl(ENABLE);
3626*53ee8cc1Swenshuai.xi HAL_TSP_Reset(0);
3627*53ee8cc1Swenshuai.xi // Diable interrupt
3628*53ee8cc1Swenshuai.xi HAL_TSP_Int_Disable(TSP_HWINT_ALL);
3629*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
3630*53ee8cc1Swenshuai.xi HAL_TSP_Int2_Disable(TSP_HWINT2_STATUS_MASK);
3631*53ee8cc1Swenshuai.xi #endif
3632*53ee8cc1Swenshuai.xi }
3633*53ee8cc1Swenshuai.xi else if(bResetSwState == FALSE)
3634*53ee8cc1Swenshuai.xi {
3635*53ee8cc1Swenshuai.xi HAL_ResetAll();
3636*53ee8cc1Swenshuai.xi MsOS_DelayTask(5);
3637*53ee8cc1Swenshuai.xi }
3638*53ee8cc1Swenshuai.xi
3639*53ee8cc1Swenshuai.xi // IntDisable
3640*53ee8cc1Swenshuai.xi // IntDetach
3641*53ee8cc1Swenshuai.xi OSAL_TSP_IntDisable();
3642*53ee8cc1Swenshuai.xi //#ifndef MSOS_TYPE_LINUX_KERNEL
3643*53ee8cc1Swenshuai.xi OSAL_TSP_IntDetach();
3644*53ee8cc1Swenshuai.xi //#endif
3645*53ee8cc1Swenshuai.xi
3646*53ee8cc1Swenshuai.xi if (!bAlive)
3647*53ee8cc1Swenshuai.xi {
3648*53ee8cc1Swenshuai.xi // Disable CPU
3649*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(0, 0x0, TSP_IF_NUM); // Disable TSP0(Reset CPU), Software_Reset
3650*53ee8cc1Swenshuai.xi
3651*53ee8cc1Swenshuai.xi // Richard: Enable indirect access
3652*53ee8cc1Swenshuai.xi HAL_TSP_Ind_Enable();
3653*53ee8cc1Swenshuai.xi HAL_TSP_HW_Lock_Init(); //Note: SW_Reset must be free first, then XIU can be written
3654*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
3655*53ee8cc1Swenshuai.xi _TSP_CmdQ_Init();
3656*53ee8cc1Swenshuai.xi #endif
3657*53ee8cc1Swenshuai.xi HAL_TSP_WbDmaEnable(TRUE);
3658*53ee8cc1Swenshuai.xi
3659*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
3660*53ee8cc1Swenshuai.xi HAL_TSP_Scmb_Detect(TRUE);
3661*53ee8cc1Swenshuai.xi #endif
3662*53ee8cc1Swenshuai.xi HAL_TSP_DoubleBuf_Disable();
3663*53ee8cc1Swenshuai.xi
3664*53ee8cc1Swenshuai.xi // Mark : Byte enable setting, fix HW bug. (Important)
3665*53ee8cc1Swenshuai.xi HAL_TSP_HwPatch();
3666*53ee8cc1Swenshuai.xi }
3667*53ee8cc1Swenshuai.xi
3668*53ee8cc1Swenshuai.xi if (bResetSwState)
3669*53ee8cc1Swenshuai.xi {
3670*53ee8cc1Swenshuai.xi _TSP_SwStateReset(FALSE);
3671*53ee8cc1Swenshuai.xi }
3672*53ee8cc1Swenshuai.xi
3673*53ee8cc1Swenshuai.xi if (!bAlive)
3674*53ee8cc1Swenshuai.xi {
3675*53ee8cc1Swenshuai.xi //if(bRestoreRegState == 0)
3676*53ee8cc1Swenshuai.xi {
3677*53ee8cc1Swenshuai.xi _TSP_RegStateReset();
3678*53ee8cc1Swenshuai.xi }
3679*53ee8cc1Swenshuai.xi
3680*53ee8cc1Swenshuai.xi if (_TSP_GetFirmware(&phyFwAddr, &u32FwSize) == FALSE)
3681*53ee8cc1Swenshuai.xi {
3682*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG ("TSP init fail: Please set FW address and size\n"));
3683*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3684*53ee8cc1Swenshuai.xi }
3685*53ee8cc1Swenshuai.xi
3686*53ee8cc1Swenshuai.xi //TSP_DBG("[%s][%d]Reset CMDQ\n",__FUNCTION__,__LINE__);
3687*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
3688*53ee8cc1Swenshuai.xi if(!HAL_TSP_CmdQ_Reset())
3689*53ee8cc1Swenshuai.xi {
3690*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3691*53ee8cc1Swenshuai.xi }
3692*53ee8cc1Swenshuai.xi #endif
3693*53ee8cc1Swenshuai.xi
3694*53ee8cc1Swenshuai.xi HAL_TSP_CPU_SetBase(phyFwAddr, u32FwSize);
3695*53ee8cc1Swenshuai.xi // Synthesizer Tuning
3696*53ee8cc1Swenshuai.xi // For difference : 100 - 4000 STC
3697*53ee8cc1Swenshuai.xi // Step: 10 STC
3698*53ee8cc1Swenshuai.xi // HAL_TSP_SetFwMsg(0x03A4); // Catch up n*10 STC in 1/20 sec
3699*53ee8cc1Swenshuai.xi
3700*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(0, TSP_CTRL_SW_RST, 0);// | TSP_CTRL_CLK_GATING_DISABLE); // Enable TSP CPU
3701*53ee8cc1Swenshuai.xi
3702*53ee8cc1Swenshuai.xi //TSP_DBG ("**************************DDD TSP protect miu00000000000000000\n");
3703*53ee8cc1Swenshuai.xi HAL_TSP_OrzWriteProtect_Enable(TRUE, 0, 0);
3704*53ee8cc1Swenshuai.xi
3705*53ee8cc1Swenshuai.xi HAL_Reset_WB();
3706*53ee8cc1Swenshuai.xi
3707*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(0, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 0);// | TSP_CTRL_CLK_GATING_DISABLE); // Enable TSP CPU
3708*53ee8cc1Swenshuai.xi
3709*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearSw();
3710*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearHw(TSP_HWINT_ALL);
3711*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
3712*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearHw2(TSP_HWINT2_STATUS_MASK);
3713*53ee8cc1Swenshuai.xi #endif
3714*53ee8cc1Swenshuai.xi
3715*53ee8cc1Swenshuai.xi while (FALSE == HAL_TSP_Alive())
3716*53ee8cc1Swenshuai.xi {
3717*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("Reset TSP CPU fail\n"));
3718*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(0, 0, TSP_IF_NUM);
3719*53ee8cc1Swenshuai.xi HAL_TSP_CPU_SetBase(phyFwAddr, u32FwSize);
3720*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(0, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 0);// | TSP_CTRL_CLK_GATING_DISABLE); // Enable TSP CPU
3721*53ee8cc1Swenshuai.xi }
3722*53ee8cc1Swenshuai.xi
3723*53ee8cc1Swenshuai.xi HAL_TSP_Check_FW_VER();
3724*53ee8cc1Swenshuai.xi
3725*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearSw();
3726*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearHw(TSP_HWINT_ALL);
3727*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
3728*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearHw2(TSP_HWINT2_STATUS_MASK);
3729*53ee8cc1Swenshuai.xi #endif
3730*53ee8cc1Swenshuai.xi
3731*53ee8cc1Swenshuai.xi // Implicity MDrv_TSP_Reset()
3732*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
3733*53ee8cc1Swenshuai.xi HAL_TSP_TsDma_SetDelay(0x0A); // Set TsDma delay, //jyliu.tsp, how come the value?
3734*53ee8cc1Swenshuai.xi #endif
3735*53ee8cc1Swenshuai.xi
3736*53ee8cc1Swenshuai.xi _FwDbgInfo.bEnable = FALSE;
3737*53ee8cc1Swenshuai.xi _FwDbgInfo.phyBufAddr = 0x0;
3738*53ee8cc1Swenshuai.xi _FwDbgInfo.u32Size = 0x0;
3739*53ee8cc1Swenshuai.xi _FwDbgInfo.u32ReadPos = 0x0;
3740*53ee8cc1Swenshuai.xi _FwDbgInfo.u32WritePos = 0x0;
3741*53ee8cc1Swenshuai.xi
3742*53ee8cc1Swenshuai.xi }
3743*53ee8cc1Swenshuai.xi
3744*53ee8cc1Swenshuai.xi // STC control by TSP need indirect R/W enable
3745*53ee8cc1Swenshuai.xi for(u8ii = 0; u8ii < STC_SYNTH_NUM; u8ii++)
3746*53ee8cc1Swenshuai.xi {
3747*53ee8cc1Swenshuai.xi HAL_TSP_Stc_ctrl(u8ii, STC_SYNTH_DEFAULT);
3748*53ee8cc1Swenshuai.xi }
3749*53ee8cc1Swenshuai.xi
3750*53ee8cc1Swenshuai.xi // Enable SYNC_RISING_DETECT and VALID_FALLING_DETECT for Serial mode
3751*53ee8cc1Swenshuai.xi HAL_TSP_Enable_ValidSync_Dectect();
3752*53ee8cc1Swenshuai.xi
3753*53ee8cc1Swenshuai.xi // Disable TSIF1
3754*53ee8cc1Swenshuai.xi #ifndef NO_PVR
3755*53ee8cc1Swenshuai.xi //HAL_TSP_PVR_Enable(FALSE);
3756*53ee8cc1Swenshuai.xi #endif
3757*53ee8cc1Swenshuai.xi
3758*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
3759*53ee8cc1Swenshuai.xi for (u8ii= 0; u8ii< TSP_SECFLT_NUM_All; u8ii++)
3760*53ee8cc1Swenshuai.xi {
3761*53ee8cc1Swenshuai.xi init_waitqueue_head(&(tsp_wq_head[u8ii]));
3762*53ee8cc1Swenshuai.xi }
3763*53ee8cc1Swenshuai.xi #endif
3764*53ee8cc1Swenshuai.xi
3765*53ee8cc1Swenshuai.xi OSAL_TSP_IntAttach(_TSP_Isr);
3766*53ee8cc1Swenshuai.xi //#ifndef MSOS_TYPE_LINUX_KERNEL
3767*53ee8cc1Swenshuai.xi OSAL_TSP_IntEnable();
3768*53ee8cc1Swenshuai.xi //#endif
3769*53ee8cc1Swenshuai.xi
3770*53ee8cc1Swenshuai.xi if (!bAlive)
3771*53ee8cc1Swenshuai.xi {
3772*53ee8cc1Swenshuai.xi // [URANUS] Richard: Refine the interrupt selection later.
3773*53ee8cc1Swenshuai.xi HAL_TSP_Int_Enable(TSP_HWINT_TSP_SW_INT_STATUS); // Enable TSP hardware interrupt
3774*53ee8cc1Swenshuai.xi }
3775*53ee8cc1Swenshuai.xi
3776*53ee8cc1Swenshuai.xi #ifndef NO_PVR
3777*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < TSP_PVR_IF_NUM; u8ii++)
3778*53ee8cc1Swenshuai.xi {
3779*53ee8cc1Swenshuai.xi _ptsp_res->_PvrEvtNotify[u8ii] = E_DRVTSP_EVENT_DATA_INIT;
3780*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[u8ii] = NULL;
3781*53ee8cc1Swenshuai.xi }
3782*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < ((TSP_PVR_IF_NUM+31)>>5); u8ii++)
3783*53ee8cc1Swenshuai.xi {
3784*53ee8cc1Swenshuai.xi _u32PvrNotifyId[u8ii] = 0;
3785*53ee8cc1Swenshuai.xi }
3786*53ee8cc1Swenshuai.xi #endif
3787*53ee8cc1Swenshuai.xi
3788*53ee8cc1Swenshuai.xi _ptsp_res->_s32TspMutexId = OSAL_TSP_MutexCreate((MS_U8*)tsp_mutex); // MsOS_CreateMutex(E_MSOS_FIFO, "TSP_Mutex");
3789*53ee8cc1Swenshuai.xi _ptsp_res->_s32IndMutexId = OSAL_TSP_MutexCreate((MS_U8*)tsp_ind_mutex); // MsOS_CreateMutex(E_MSOS_FIFO, "TSP_Mutex");
3790*53ee8cc1Swenshuai.xi _ptsp_res->_s32IntRegMutexId = OSAL_TSP_MutexCreate((MS_U8*)tsp_int_mutex);
3791*53ee8cc1Swenshuai.xi _s32ExtMutexId = OSAL_TSP_MutexCreate((MS_U8*)tsp_ext_mutex);
3792*53ee8cc1Swenshuai.xi _s32TspEventId = OSAL_TSP_EventCreate((MS_U8*)tsp_event); // MsOS_CreateEventGroup("TSP_Event");
3793*53ee8cc1Swenshuai.xi
3794*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < (MS_U8)((TSP_SECFLT_NUM_All+31)>>5); u8ii++)
3795*53ee8cc1Swenshuai.xi {
3796*53ee8cc1Swenshuai.xi _s32TspSecRdyId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_secRdy);
3797*53ee8cc1Swenshuai.xi _s32TspSecOvfId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_crcerr);
3798*53ee8cc1Swenshuai.xi _s32TspSecCrcId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_secovf);
3799*53ee8cc1Swenshuai.xi _s32TspFltDisableId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_fltdis);
3800*53ee8cc1Swenshuai.xi
3801*53ee8cc1Swenshuai.xi if(bResetSwState)
3802*53ee8cc1Swenshuai.xi {
3803*53ee8cc1Swenshuai.xi _u32SecNotifyId[u8ii] = 0;
3804*53ee8cc1Swenshuai.xi }
3805*53ee8cc1Swenshuai.xi }
3806*53ee8cc1Swenshuai.xi
3807*53ee8cc1Swenshuai.xi #if 0
3808*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < ((TSP_PIDFLT_NUM_ALL+31)>>5); u8ii++)
3809*53ee8cc1Swenshuai.xi {
3810*53ee8cc1Swenshuai.xi _s32EventFree0[u8ii] = OSAL_TSP_EventCreate((MS_U8*)freelist0);
3811*53ee8cc1Swenshuai.xi _s32EventFreeDefer0[u8ii] = OSAL_TSP_EventCreate((MS_U8*)freelistdefer0);
3812*53ee8cc1Swenshuai.xi _s32DoneFlags[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_done);
3813*53ee8cc1Swenshuai.xi }
3814*53ee8cc1Swenshuai.xi #endif
3815*53ee8cc1Swenshuai.xi
3816*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
3817*53ee8cc1Swenshuai.xi if(bResetSwState)
3818*53ee8cc1Swenshuai.xi {
3819*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < (MS_U8)((TSP_PCRFLT_NUM+31)>>5); u8ii++)
3820*53ee8cc1Swenshuai.xi {
3821*53ee8cc1Swenshuai.xi _u32HwPcrNotifyId[u8ii] = 0;
3822*53ee8cc1Swenshuai.xi }
3823*53ee8cc1Swenshuai.xi }
3824*53ee8cc1Swenshuai.xi #endif
3825*53ee8cc1Swenshuai.xi
3826*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
3827*53ee8cc1Swenshuai.xi _s32TspTaskId = OSAL_TSP_TaskCreate(_TSP_Isr_Proc_Task, (MS_U8*)tsp_isr_task);
3828*53ee8cc1Swenshuai.xi #endif
3829*53ee8cc1Swenshuai.xi
3830*53ee8cc1Swenshuai.xi _ptsp_res->_bSWInitReady = TRUE;
3831*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].TSPStatus = E_DRVTSP_SW_INIT;
3832*53ee8cc1Swenshuai.xi _ptsp_res->_u32LastErr = DRVTSP_OK;
3833*53ee8cc1Swenshuai.xi _ptsp_res->_u32ProcessNum = 1UL;
3834*53ee8cc1Swenshuai.xi
3835*53ee8cc1Swenshuai.xi if(bResetSwState)
3836*53ee8cc1Swenshuai.xi {
3837*53ee8cc1Swenshuai.xi #ifdef VQ_ENABLE
3838*53ee8cc1Swenshuai.xi _ptsp_res->_u32NULLFileFilterID = 0xFFFFFFFFUL;
3839*53ee8cc1Swenshuai.xi #endif
3840*53ee8cc1Swenshuai.xi _ptsp_res->_bLiveSING_FilePP = FALSE;
3841*53ee8cc1Swenshuai.xi }
3842*53ee8cc1Swenshuai.xi #ifdef VQ_ENABLE
3843*53ee8cc1Swenshuai.xi else
3844*53ee8cc1Swenshuai.xi {
3845*53ee8cc1Swenshuai.xi _ptsp_res->_u32NULLFileFilterID = 15UL;
3846*53ee8cc1Swenshuai.xi }
3847*53ee8cc1Swenshuai.xi #endif
3848*53ee8cc1Swenshuai.xi
3849*53ee8cc1Swenshuai.xi if (bRestoreRegState)
3850*53ee8cc1Swenshuai.xi {
3851*53ee8cc1Swenshuai.xi if((_ptsp_res->_phyTspFWDramBuf > 0) && (_ptsp_res->_u32TspFwDramBufSize > 0))
3852*53ee8cc1Swenshuai.xi {
3853*53ee8cc1Swenshuai.xi HAL_TSP_OrzWriteProtect_Enable(TRUE, _ptsp_res->_phyTspFWDramBuf, _ptsp_res->_u32TspFwDramBufSize);
3854*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetDataAddr(_ptsp_res->_phyTspFWDramBuf);
3855*53ee8cc1Swenshuai.xi }
3856*53ee8cc1Swenshuai.xi _TSP_RegStateRestore();
3857*53ee8cc1Swenshuai.xi }
3858*53ee8cc1Swenshuai.xi
3859*53ee8cc1Swenshuai.xi return (TSP_Result)(_ptsp_res->_u32LastErr);
3860*53ee8cc1Swenshuai.xi }
3861*53ee8cc1Swenshuai.xi
3862*53ee8cc1Swenshuai.xi
3863*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3864*53ee8cc1Swenshuai.xi // Global Functions
3865*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3866*53ee8cc1Swenshuai.xi
3867*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3868*53ee8cc1Swenshuai.xi /// Poweroff TSP driver and TSP engine
3869*53ee8cc1Swenshuai.xi /// @return TSP_Result
3870*53ee8cc1Swenshuai.xi /// @note
3871*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3872*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PowerOff(void)
3873*53ee8cc1Swenshuai.xi {
3874*53ee8cc1Swenshuai.xi _TSP_ENTRY();
3875*53ee8cc1Swenshuai.xi _TSP_Close();
3876*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].TSPStatus = E_DRVTSP_SW_POWEROFF;
3877*53ee8cc1Swenshuai.xi // this is not a bug. Intend to lock to mutex to prevent alive task accessing TSP after power off
3878*53ee8cc1Swenshuai.xi return DRVTSP_OK;
3879*53ee8cc1Swenshuai.xi }
3880*53ee8cc1Swenshuai.xi
3881*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3882*53ee8cc1Swenshuai.xi /// Relsase TSP indirect register read/write semaphone
3883*53ee8cc1Swenshuai.xi /// @return TSP_Result
3884*53ee8cc1Swenshuai.xi /// @note
3885*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3886*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_HW_Lock_Release(void)
3887*53ee8cc1Swenshuai.xi {
3888*53ee8cc1Swenshuai.xi HAL_TSP_HW_Lock_Release();
3889*53ee8cc1Swenshuai.xi
3890*53ee8cc1Swenshuai.xi return DRVTSP_OK;
3891*53ee8cc1Swenshuai.xi }
3892*53ee8cc1Swenshuai.xi
3893*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3894*53ee8cc1Swenshuai.xi /// Close TSP driver and reset software/register state
3895*53ee8cc1Swenshuai.xi /// @return TSP_Result
3896*53ee8cc1Swenshuai.xi /// @note
3897*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3898*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Exit(void)
3899*53ee8cc1Swenshuai.xi {
3900*53ee8cc1Swenshuai.xi MS_U8 i;
3901*53ee8cc1Swenshuai.xi
3902*53ee8cc1Swenshuai.xi _TSP_ENTRY();
3903*53ee8cc1Swenshuai.xi
3904*53ee8cc1Swenshuai.xi //checking if stiil other process exist, only close sw thread
3905*53ee8cc1Swenshuai.xi if(_ptsp_res->_u32ProcessNum > 1)
3906*53ee8cc1Swenshuai.xi {
3907*53ee8cc1Swenshuai.xi _TSP_SW_Exit();
3908*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
3909*53ee8cc1Swenshuai.xi }
3910*53ee8cc1Swenshuai.xi
3911*53ee8cc1Swenshuai.xi for (i = 0; i < TSP_ENGINE_NUM; i++)
3912*53ee8cc1Swenshuai.xi {
3913*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[i].TSPStatus = E_DRVTSP_SW_EXIT;
3914*53ee8cc1Swenshuai.xi }
3915*53ee8cc1Swenshuai.xi
3916*53ee8cc1Swenshuai.xi if(HAL_TSP_Alive())
3917*53ee8cc1Swenshuai.xi {
3918*53ee8cc1Swenshuai.xi _TSP_SwStateReset(TRUE);
3919*53ee8cc1Swenshuai.xi }
3920*53ee8cc1Swenshuai.xi else
3921*53ee8cc1Swenshuai.xi {
3922*53ee8cc1Swenshuai.xi _TSP_SwStateReset(FALSE);
3923*53ee8cc1Swenshuai.xi }
3924*53ee8cc1Swenshuai.xi _TSP_RegStateReset();
3925*53ee8cc1Swenshuai.xi _TSP_Close();
3926*53ee8cc1Swenshuai.xi
3927*53ee8cc1Swenshuai.xi // this is not a bug. Intend to lock to mutex to prevent alive task accessing TSP after power off
3928*53ee8cc1Swenshuai.xi return DRVTSP_OK;
3929*53ee8cc1Swenshuai.xi }
3930*53ee8cc1Swenshuai.xi
3931*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3932*53ee8cc1Swenshuai.xi /// Suspend TSP driver
3933*53ee8cc1Swenshuai.xi /// @return TSP_Result
3934*53ee8cc1Swenshuai.xi /// @note
3935*53ee8cc1Swenshuai.xi /// Save TSP driver states to DRAM
3936*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3937*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Suspend(void)
3938*53ee8cc1Swenshuai.xi {
3939*53ee8cc1Swenshuai.xi MS_U16 u16Clk = 0;
3940*53ee8cc1Swenshuai.xi
3941*53ee8cc1Swenshuai.xi if(!((_ptsp_res->_TspState[0].TSPStatus == E_DRVTSP_SW_INIT) || (_ptsp_res->_TspState[0].TSPStatus == E_DRVTSP_SW_RESUME)))
3942*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3943*53ee8cc1Swenshuai.xi
3944*53ee8cc1Swenshuai.xi MDrv_TSP_GetTSIFStatus(E_DRVTSP_IF_PLAYBACK, &(_ptsp_res->_ifset_save), &u16Clk);
3945*53ee8cc1Swenshuai.xi
3946*53ee8cc1Swenshuai.xi _TSP_ENTRY();
3947*53ee8cc1Swenshuai.xi
3948*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].TSPStatus = E_DRVTSP_SW_SUSPEND;
3949*53ee8cc1Swenshuai.xi _ptsp_res->_bSuspend = TRUE;
3950*53ee8cc1Swenshuai.xi _TSP_RegStateStore();
3951*53ee8cc1Swenshuai.xi HAL_TSP_WbDmaEnable(FALSE);
3952*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(0, 0, TSP_IF_NUM);
3953*53ee8cc1Swenshuai.xi _TSP_SW_Exit();
3954*53ee8cc1Swenshuai.xi HAL_TSP_HW_Lock_Release();
3955*53ee8cc1Swenshuai.xi if(_ptsp_res->_u32ProcessNum > 0)
3956*53ee8cc1Swenshuai.xi {
3957*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
3958*53ee8cc1Swenshuai.xi }
3959*53ee8cc1Swenshuai.xi // this is not a bug. Intend to lock to mutex to prevent alive task accessing TSP after power off
3960*53ee8cc1Swenshuai.xi return DRVTSP_OK;
3961*53ee8cc1Swenshuai.xi }
3962*53ee8cc1Swenshuai.xi
3963*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3964*53ee8cc1Swenshuai.xi /// Resume TSP driver
3965*53ee8cc1Swenshuai.xi /// @return TSP_Result
3966*53ee8cc1Swenshuai.xi /// @note
3967*53ee8cc1Swenshuai.xi /// Restore TSP driver states from DRAM
3968*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3969*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Resume(MS_PHY phyFWAddr, MS_U32 u32FWSize)
3970*53ee8cc1Swenshuai.xi {
3971*53ee8cc1Swenshuai.xi TSP_Result ret;
3972*53ee8cc1Swenshuai.xi
3973*53ee8cc1Swenshuai.xi // Reset TSP register
3974*53ee8cc1Swenshuai.xi //HAL_ResetAll();
3975*53ee8cc1Swenshuai.xi //MsOS_DelayTask(5);
3976*53ee8cc1Swenshuai.xi
3977*53ee8cc1Swenshuai.xi _ptsp_res->_bSuspend = FALSE;
3978*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].TSPStatus = E_DRVTSP_SW_RESUME;
3979*53ee8cc1Swenshuai.xi
3980*53ee8cc1Swenshuai.xi _ptsp_res->_phyFwAddr = phyFWAddr;
3981*53ee8cc1Swenshuai.xi _ptsp_res->_u32FwSize = u32FWSize;
3982*53ee8cc1Swenshuai.xi
3983*53ee8cc1Swenshuai.xi if(_TSP_Init(FALSE, TRUE) != DRVTSP_OK)
3984*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3985*53ee8cc1Swenshuai.xi
3986*53ee8cc1Swenshuai.xi if(MDrv_TSP_SetOperateMode(0, E_DRVTSP_CTRL_MODE_TS0) != DRVTSP_OK)
3987*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3988*53ee8cc1Swenshuai.xi
3989*53ee8cc1Swenshuai.xi _TSP_ENTRY();
3990*53ee8cc1Swenshuai.xi ret = _TSP_SelPad(0, E_DRVTSP_IF_PLAYBACK, &(_ptsp_res->_ifset_save));
3991*53ee8cc1Swenshuai.xi _TSP_RETURN(ret);
3992*53ee8cc1Swenshuai.xi }
3993*53ee8cc1Swenshuai.xi
3994*53ee8cc1Swenshuai.xi // Misc API
3995*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3996*53ee8cc1Swenshuai.xi /// Set TSP engine operating mode
3997*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
3998*53ee8cc1Swenshuai.xi /// @param eCtrlMode \b IN: TSP engine operating mode
3999*53ee8cc1Swenshuai.xi /// @return TSP_Result
4000*53ee8cc1Swenshuai.xi /// @note
4001*53ee8cc1Swenshuai.xi /// Only one engine can be set to use memory stream input mode, and all kinds
4002*53ee8cc1Swenshuai.xi /// of input are mutually exclusive for each engine.\n
4003*53ee8cc1Swenshuai.xi /// Only one engine can output to MAD. The TSP engine which is not selected to
4004*53ee8cc1Swenshuai.xi /// MAD can not filter any audio stream, it will block the stream.
4005*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PidFlt_Alloc, MDrv_TSP_PidFlt_Enable, E_DRVTSP_FLT_TYPE_AUDIO
4006*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4007*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetOperateMode(MS_U32 u32EngId, DrvTSP_CtrlMode eCtrlMode) // Set TSP internal operate
4008*53ee8cc1Swenshuai.xi {
4009*53ee8cc1Swenshuai.xi MS_U32 u32CaMode = 0,u32ii = 0;
4010*53ee8cc1Swenshuai.xi REG_PidFlt *pPidFilter = NULL;
4011*53ee8cc1Swenshuai.xi
4012*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] eCtrlMode %ld\n", __FUNCTION__, __LINE__, (MS_U32)eCtrlMode));
4013*53ee8cc1Swenshuai.xi
4014*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4015*53ee8cc1Swenshuai.xi
4016*53ee8cc1Swenshuai.xi if (u32EngId >= TSP_ENGINE_NUM)
4017*53ee8cc1Swenshuai.xi {
4018*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4019*53ee8cc1Swenshuai.xi }
4020*53ee8cc1Swenshuai.xi
4021*53ee8cc1Swenshuai.xi // Since VQ enable, using single buffer for live, ping-pong buffer for file as deault path, becase file has no VQ
4022*53ee8cc1Swenshuai.xi // If no VQ, using ping-pong buffer for live, single buffer for file as default path.
4023*53ee8cc1Swenshuai.xi // when VQ enable, reserve filter 15 for NULL file section PID filter for switch live to single buffer
4024*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4025*53ee8cc1Swenshuai.xi // For new VQ architecture with file VQ, not need to create dummy file filter for switch section buffer path
4026*53ee8cc1Swenshuai.xi #ifdef VQ_ENABLE
4027*53ee8cc1Swenshuai.xi if((_ptsp_res->_u32NULLFileFilterID == 0xFFFFFFFF) && _ptsp_res->_bLiveSING_FilePP)
4028*53ee8cc1Swenshuai.xi {
4029*53ee8cc1Swenshuai.xi HAL_TSP_DoubleBuf_En(DOUBLE_BUFFER_SWITCH);
4030*53ee8cc1Swenshuai.xi
4031*53ee8cc1Swenshuai.xi _ptsp_res->_u32NULLFileFilterID = 15;
4032*53ee8cc1Swenshuai.xi pPidFilter = HAL_TSP_GetPidFltReg(0, _ptsp_res->_u32NULLFileFilterID);
4033*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(pPidFilter, DRVTSP_PID_NULL);
4034*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelSecFlt(pPidFilter, _ptsp_res->_u32NULLFileFilterID);
4035*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(pPidFilter, TSP_PIDFLT_OUT_SECFLT | TSP_PIDFLT_OUT_SECFLT_AF);
4036*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(pPidFilter, TSP_PIDFLT_IN_FILE);
4037*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltMap[_ptsp_res->_u32NULLFileFilterID] = DRVTSP_MAP_NULL;
4038*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[_ptsp_res->_u32NULLFileFilterID] = E_DRVTSP_FLT_STATE_ALLOC;
4039*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[_ptsp_res->_u32NULLFileFilterID]|= E_DRVTSP_FLT_STATE_ENABLE;
4040*53ee8cc1Swenshuai.xi }
4041*53ee8cc1Swenshuai.xi #endif
4042*53ee8cc1Swenshuai.xi
4043*53ee8cc1Swenshuai.xi //reset audio BD mode
4044*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
4045*53ee8cc1Swenshuai.xi HAL_TSP_AU_BD_Mode_Enable(FALSE);
4046*53ee8cc1Swenshuai.xi #endif
4047*53ee8cc1Swenshuai.xi
4048*53ee8cc1Swenshuai.xi switch (eCtrlMode)
4049*53ee8cc1Swenshuai.xi {
4050*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS0_AUD:
4051*53ee8cc1Swenshuai.xi //HAL_TSP_SelAudOut(u32EngId);
4052*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS0:
4053*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
4054*53ee8cc1Swenshuai.xi if(!_ptsp_res->_bLiveSING_FilePP)
4055*53ee8cc1Swenshuai.xi {
4056*53ee8cc1Swenshuai.xi HAL_TSP_DoubleBuf_Disable();
4057*53ee8cc1Swenshuai.xi }
4058*53ee8cc1Swenshuai.xi #ifndef NO_CA
4059*53ee8cc1Swenshuai.xi
4060*53ee8cc1Swenshuai.xi u32CaMode = HAL_TSP_CSA_Get_ScrmPath();
4061*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] Org u32CaMode %lx\n", __FUNCTION__, __LINE__, u32CaMode));
4062*53ee8cc1Swenshuai.xi if((u32CaMode & (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE)) != (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE)) //if TS1 dscmb, not change it...
4063*53ee8cc1Swenshuai.xi {
4064*53ee8cc1Swenshuai.xi if((u32CaMode & TSP_CA_OUTPUT_REC) == 0)
4065*53ee8cc1Swenshuai.xi {
4066*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(TSP_CA_INPUT_TSIF0_LIVEIN|TSP_CA_OUTPUT_PLAY_LIVE); //|TSP_CA_AVPAUSE);
4067*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32CaMode %lx\n", __FUNCTION__, __LINE__, u32CaMode));
4068*53ee8cc1Swenshuai.xi }
4069*53ee8cc1Swenshuai.xi }
4070*53ee8cc1Swenshuai.xi
4071*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._bCIPHSSMode)
4072*53ee8cc1Swenshuai.xi {
4073*53ee8cc1Swenshuai.xi HAL_TSP_TSIF1_Enable(FALSE);
4074*53ee8cc1Swenshuai.xi _TSP_Free_AllFLT1();
4075*53ee8cc1Swenshuai.xi HAL_TSP_LiveAB_En(FALSE);
4076*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._bCIPHSSMode = FALSE;
4077*53ee8cc1Swenshuai.xi }
4078*53ee8cc1Swenshuai.xi #endif
4079*53ee8cc1Swenshuai.xi
4080*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(u32EngId, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 0);
4081*53ee8cc1Swenshuai.xi break;
4082*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS0_NOCA:
4083*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
4084*53ee8cc1Swenshuai.xi if(!_ptsp_res->_bLiveSING_FilePP)
4085*53ee8cc1Swenshuai.xi {
4086*53ee8cc1Swenshuai.xi HAL_TSP_DoubleBuf_Disable();
4087*53ee8cc1Swenshuai.xi }
4088*53ee8cc1Swenshuai.xi u32CaMode = HAL_TSP_CSA_Get_ScrmPath();
4089*53ee8cc1Swenshuai.xi _TSP_FreeDupDscmbPidFlt(u32EngId, 0, u32CaMode);
4090*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
4091*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(u32CaMode & ~(TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE2|TSP_CA_OUTPUT_PLAY_LIVE));
4092*53ee8cc1Swenshuai.xi #else
4093*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(u32CaMode & ~(TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE));
4094*53ee8cc1Swenshuai.xi #endif
4095*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(u32EngId, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 0);
4096*53ee8cc1Swenshuai.xi break;
4097*53ee8cc1Swenshuai.xi
4098*53ee8cc1Swenshuai.xi #ifndef NO_PVR
4099*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS1_OUT_LIVE0:
4100*53ee8cc1Swenshuai.xi _ptsp_res->_u32OrgCAMode = HAL_TSP_CSA_Get_ScrmPath(); //record CACtrl before switch CA input from TSIF1
4101*53ee8cc1Swenshuai.xi //Free duplicate FLT2
4102*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
4103*53ee8cc1Swenshuai.xi if((_ptsp_res->_u32OrgCAMode & (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE|TSP_CA_OUTPUT_PLAY_LIVE2))
4104*53ee8cc1Swenshuai.xi == (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE2))
4105*53ee8cc1Swenshuai.xi {
4106*53ee8cc1Swenshuai.xi _TSP_FreeDupDscmbPidFlt(u32EngId, 2, _ptsp_res->_u32OrgCAMode);
4107*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(_ptsp_res->_u32OrgCAMode & ~TSP_CA_OUTPUT_PLAY_LIVE2);
4108*53ee8cc1Swenshuai.xi }
4109*53ee8cc1Swenshuai.xi #endif
4110*53ee8cc1Swenshuai.xi
4111*53ee8cc1Swenshuai.xi //duplicateFLT 0 to FLT1
4112*53ee8cc1Swenshuai.xi if((_ptsp_res->_u32OrgCAMode & (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE)) != (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE))
4113*53ee8cc1Swenshuai.xi {
4114*53ee8cc1Swenshuai.xi for(u32ii = DSCMB_FLT_START_ID; u32ii <= DSCMB_FLT_END_ID; u32ii++)
4115*53ee8cc1Swenshuai.xi {
4116*53ee8cc1Swenshuai.xi _TSP_DupDscmbPidFlt(u32EngId, u32ii, TSP_SECFLT_NUM+u32ii-DSCMB_FLT_START_ID);
4117*53ee8cc1Swenshuai.xi }
4118*53ee8cc1Swenshuai.xi #ifdef EXT_PVR1_FLT
4119*53ee8cc1Swenshuai.xi for(u32ii = DSCMB_FLT_SHAREKEY_START_ID; u32ii <= DSCMB_FLT_SHAREKEY_END_ID; u32ii++)
4120*53ee8cc1Swenshuai.xi {
4121*53ee8cc1Swenshuai.xi _TSP_DupDscmbPidFlt(u32EngId, u32ii, TSP_SECFLT_NUM+DSCMB_FLT_NUM+u32ii);
4122*53ee8cc1Swenshuai.xi }
4123*53ee8cc1Swenshuai.xi #endif
4124*53ee8cc1Swenshuai.xi }
4125*53ee8cc1Swenshuai.xi if(_ptsp_res->_u32OrgCAMode & TSP_CA_INPUT_TSIF1)
4126*53ee8cc1Swenshuai.xi {
4127*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(_ptsp_res->_u32OrgCAMode|TSP_CA_OUTPUT_PLAY_LIVE);
4128*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32CaMode 0x%lx\n", __FUNCTION__, __LINE__, _ptsp_res->_u32OrgCAMode|TSP_CA_OUTPUT_PLAY_LIVE));
4129*53ee8cc1Swenshuai.xi }
4130*53ee8cc1Swenshuai.xi else
4131*53ee8cc1Swenshuai.xi {
4132*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE);
4133*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32CaMode 0x%x\n", __FUNCTION__, __LINE__, TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE));
4134*53ee8cc1Swenshuai.xi }
4135*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS1_AUD:
4136*53ee8cc1Swenshuai.xi //HAL_TSP_SelAudOut(u32EngId);
4137*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS1:
4138*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS1_FILEFLT:
4139*53ee8cc1Swenshuai.xi if(eCtrlMode == E_DRVTSP_CTRL_MODE_TS1_FILEFLT)
4140*53ee8cc1Swenshuai.xi {
4141*53ee8cc1Swenshuai.xi HAL_TSP_LiveAB_En(TRUE);
4142*53ee8cc1Swenshuai.xi HAL_TSP_TSIF1_Enable(TRUE);
4143*53ee8cc1Swenshuai.xi
4144*53ee8cc1Swenshuai.xi #ifndef NO_CA
4145*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._bCIPHSSMode = TRUE;
4146*53ee8cc1Swenshuai.xi _TSP_FLT1_Duplicate_FLT0(0);
4147*53ee8cc1Swenshuai.xi _ptsp_res->_u32OrgCAMode = HAL_TSP_CSA_Get_ScrmPath(); //record CACtrl before switch CA input from TSIF1
4148*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._bPVRCA_Start == TRUE)
4149*53ee8cc1Swenshuai.xi {
4150*53ee8cc1Swenshuai.xi
4151*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_FILE|TSP_CA_OUTPUT_REC);
4152*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32CaMode 0x%x\n", __FUNCTION__, __LINE__, TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_FILE|TSP_CA_OUTPUT_REC));
4153*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4154*53ee8cc1Swenshuai.xi }
4155*53ee8cc1Swenshuai.xi else
4156*53ee8cc1Swenshuai.xi {
4157*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_FILE);
4158*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32CaMode 0x%x\n", __FUNCTION__, __LINE__, TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_FILE));
4159*53ee8cc1Swenshuai.xi }
4160*53ee8cc1Swenshuai.xi #endif
4161*53ee8cc1Swenshuai.xi
4162*53ee8cc1Swenshuai.xi }
4163*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
4164*53ee8cc1Swenshuai.xi if(!_ptsp_res->_bLiveSING_FilePP)
4165*53ee8cc1Swenshuai.xi {
4166*53ee8cc1Swenshuai.xi HAL_TSP_DoubleBuf_Disable();
4167*53ee8cc1Swenshuai.xi }
4168*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(u32EngId, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 1);
4169*53ee8cc1Swenshuai.xi break;
4170*53ee8cc1Swenshuai.xi #endif
4171*53ee8cc1Swenshuai.xi
4172*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
4173*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_MEM_AUD:
4174*53ee8cc1Swenshuai.xi //HAL_TSP_SelAudOut(u32EngId);
4175*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_MEM_PVR:
4176*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_MEM:
4177*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_MEM_NOCA:
4178*53ee8cc1Swenshuai.xi HAL_TSP_LiveAB_En(FALSE);
4179*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
4180*53ee8cc1Swenshuai.xi
4181*53ee8cc1Swenshuai.xi #ifndef FIVQ_ENABLE
4182*53ee8cc1Swenshuai.xi if(!_ptsp_res->_bLiveSING_FilePP)
4183*53ee8cc1Swenshuai.xi {
4184*53ee8cc1Swenshuai.xi HAL_TSP_DoubleBuf_En(DOUBLE_BUFFER_SWITCH); // [OBERON]:Enable double buffer, set filein->pinpon livein->single
4185*53ee8cc1Swenshuai.xi }
4186*53ee8cc1Swenshuai.xi #endif
4187*53ee8cc1Swenshuai.xi
4188*53ee8cc1Swenshuai.xi #ifndef NO_CA
4189*53ee8cc1Swenshuai.xi
4190*53ee8cc1Swenshuai.xi _ptsp_res->_u32OrgCAMode = HAL_TSP_CSA_Get_ScrmPath(); //record CACtrl before switch CA input from File0
4191*53ee8cc1Swenshuai.xi if(eCtrlMode == E_DRVTSP_CTRL_MODE_MEM_PVR)
4192*53ee8cc1Swenshuai.xi {
4193*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(TSP_CA_INPUT_TSIF0_FILEIN|TSP_CA_OUTPUT_PLAY_FILE|TSP_CA_OUTPUT_REC|TSP_CA_AVPAUSE);
4194*53ee8cc1Swenshuai.xi }
4195*53ee8cc1Swenshuai.xi else if ((eCtrlMode == E_DRVTSP_CTRL_MODE_MEM) && ((_ptsp_res->_u32OrgCAMode & TSP_CA_OUTPUT_REC) == 0))
4196*53ee8cc1Swenshuai.xi {
4197*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(TSP_CA_INPUT_TSIF0_FILEIN|TSP_CA_OUTPUT_PLAY_FILE|TSP_CA_AVPAUSE);
4198*53ee8cc1Swenshuai.xi }
4199*53ee8cc1Swenshuai.xi else
4200*53ee8cc1Swenshuai.xi {
4201*53ee8cc1Swenshuai.xi //ts2 record ts0, free live0 duplicate
4202*53ee8cc1Swenshuai.xi if(((_ptsp_res->_u32OrgCAMode & (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE)) == (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE)) &&
4203*53ee8cc1Swenshuai.xi ((_ptsp_res->_u32OrgCAMode & TSP_CA_OUTPUT_REC) == 0))
4204*53ee8cc1Swenshuai.xi {
4205*53ee8cc1Swenshuai.xi _TSP_FreeDupDscmbPidFlt(u32EngId, 0, _ptsp_res->_u32OrgCAMode);
4206*53ee8cc1Swenshuai.xi }
4207*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
4208*53ee8cc1Swenshuai.xi if((_ptsp_res->_u32OrgCAMode & TSP_CA_INPUT_TSIF1) &&
4209*53ee8cc1Swenshuai.xi ((_ptsp_res->_u32OrgCAMode & (TSP_CA_OUTPUT_PLAY_LIVE|TSP_CA_OUTPUT_PLAY_LIVE2|TSP_CA_OUTPUT_REC)) == 0))
4210*53ee8cc1Swenshuai.xi #else
4211*53ee8cc1Swenshuai.xi if((_ptsp_res->_u32OrgCAMode & TSP_CA_INPUT_TSIF1) &&
4212*53ee8cc1Swenshuai.xi ((_ptsp_res->_u32OrgCAMode & (TSP_CA_OUTPUT_PLAY_LIVE|TSP_CA_OUTPUT_REC)) == 0))
4213*53ee8cc1Swenshuai.xi #endif
4214*53ee8cc1Swenshuai.xi {
4215*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(_ptsp_res->_u32OrgCAMode & ~TSP_CA_INPUT_TSIF1);
4216*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32CaMode 0x%lx\n", __FUNCTION__, __LINE__, _ptsp_res->_u32OrgCAMode & ~TSP_CA_INPUT_TSIF1));
4217*53ee8cc1Swenshuai.xi }
4218*53ee8cc1Swenshuai.xi else
4219*53ee8cc1Swenshuai.xi {
4220*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(_ptsp_res->_u32OrgCAMode & ~TSP_CA_OUTPUT_PLAY_LIVE);
4221*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32CaMode 0x%lx\n", __FUNCTION__, __LINE__, _ptsp_res->_u32OrgCAMode & ~TSP_CA_OUTPUT_PLAY_LIVE));
4222*53ee8cc1Swenshuai.xi }
4223*53ee8cc1Swenshuai.xi }
4224*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] _ptsp_res->_u32OrgCAMode 0x%lx\n", __FUNCTION__, __LINE__, _ptsp_res->_u32OrgCAMode));
4225*53ee8cc1Swenshuai.xi
4226*53ee8cc1Swenshuai.xi #endif
4227*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(u32EngId, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST| TSP_CTRL_TSFILE_EN, TSP_IF_NUM);
4228*53ee8cc1Swenshuai.xi break;
4229*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
4230*53ee8cc1Swenshuai.xi
4231*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_VID:
4232*53ee8cc1Swenshuai.xi #ifndef NO_CA
4233*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(0);
4234*53ee8cc1Swenshuai.xi #endif
4235*53ee8cc1Swenshuai.xi if(!_ptsp_res->_bLiveSING_FilePP)
4236*53ee8cc1Swenshuai.xi {
4237*53ee8cc1Swenshuai.xi HAL_TSP_DoubleBuf_Disable();
4238*53ee8cc1Swenshuai.xi }
4239*53ee8cc1Swenshuai.xi break;
4240*53ee8cc1Swenshuai.xi
4241*53ee8cc1Swenshuai.xi #ifndef NO_PVR
4242*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_PVR_TS0:
4243*53ee8cc1Swenshuai.xi break;
4244*53ee8cc1Swenshuai.xi #ifndef NO_CA
4245*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_PVR_TS0_CA:
4246*53ee8cc1Swenshuai.xi _ptsp_res->_u32OrgCAMode = HAL_TSP_CSA_Get_ScrmPath(); //record CACtrl before set CA ouput from Rec0
4247*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(HAL_TSP_CSA_Get_ScrmPath() | TSP_CA_OUTPUT_REC);
4248*53ee8cc1Swenshuai.xi break;
4249*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_PVR_CA:
4250*53ee8cc1Swenshuai.xi //switch CA form TS0 to TS1
4251*53ee8cc1Swenshuai.xi HAL_TSP_TSIF1_Enable(TRUE);
4252*53ee8cc1Swenshuai.xi _TSP_FLT1_Duplicate_FLT0(0);
4253*53ee8cc1Swenshuai.xi _ptsp_res->_u32OrgCAMode = HAL_TSP_CSA_Get_ScrmPath(); //record CACtrl before set CA input from TSIF1
4254*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE|TSP_CA_OUTPUT_REC/*|TSP_CA_AVPAUSE*/);
4255*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32CaMode 0x%x\n", __FUNCTION__, __LINE__, TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE|TSP_CA_OUTPUT_REC));
4256*53ee8cc1Swenshuai.xi
4257*53ee8cc1Swenshuai.xi break;
4258*53ee8cc1Swenshuai.xi
4259*53ee8cc1Swenshuai.xi #endif //udef NO_CA
4260*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
4261*53ee8cc1Swenshuai.xi
4262*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
4263*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_PVR_TS2_CA:
4264*53ee8cc1Swenshuai.xi _ptsp_res->_u32OrgCAMode = HAL_TSP_CSA_Get_ScrmPath(); //record CACtrl before set CA input from TSIF1
4265*53ee8cc1Swenshuai.xi if(((_ptsp_res->_u32OrgCAMode & TSP_CA_INPUT_TSIF1) != 0) &&
4266*53ee8cc1Swenshuai.xi ((_ptsp_res->_u32OrgCAMode & TSP_CA_OUTPUT_REC) != 0))
4267*53ee8cc1Swenshuai.xi {
4268*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(_ptsp_res->_u32OrgCAMode|TSP_CA_OUTPUT_PLAY_LIVE2);
4269*53ee8cc1Swenshuai.xi break;
4270*53ee8cc1Swenshuai.xi }
4271*53ee8cc1Swenshuai.xi //Free duplicate FLT0
4272*53ee8cc1Swenshuai.xi #if 0
4273*53ee8cc1Swenshuai.xi if(_TSP_FreeDupDscmbPidFlt(u32EngId, 0, _ptsp_res->_u32OrgCAMode))
4274*53ee8cc1Swenshuai.xi {
4275*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(_ptsp_res->_u32OrgCAMode & ~TSP_CA_OUTPUT_PLAY_LIVE);
4276*53ee8cc1Swenshuai.xi }
4277*53ee8cc1Swenshuai.xi #endif
4278*53ee8cc1Swenshuai.xi //duplicateFLT 2 to FLT1
4279*53ee8cc1Swenshuai.xi if((_ptsp_res->_u32OrgCAMode & (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE|TSP_CA_OUTPUT_PLAY_LIVE2))
4280*53ee8cc1Swenshuai.xi != (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE2))
4281*53ee8cc1Swenshuai.xi {
4282*53ee8cc1Swenshuai.xi for(u32ii = (TSP_SECFLT_NUM + TSP_PIDFLT1_NUM); u32ii < (TSP_SECFLT_NUM + TSP_PIDFLT1_NUM + DSCMB_FLT_NUM); u32ii++)
4283*53ee8cc1Swenshuai.xi {
4284*53ee8cc1Swenshuai.xi _TSP_DupDscmbPidFlt(u32EngId, u32ii, u32ii-TSP_PIDFLT1_NUM);
4285*53ee8cc1Swenshuai.xi }
4286*53ee8cc1Swenshuai.xi HAL_TSP_TSIF1_Enable(TRUE);
4287*53ee8cc1Swenshuai.xi if((_ptsp_res->_u32OrgCAMode & (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE)) == (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE))
4288*53ee8cc1Swenshuai.xi {
4289*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE|TSP_CA_OUTPUT_PLAY_LIVE2);
4290*53ee8cc1Swenshuai.xi }
4291*53ee8cc1Swenshuai.xi else
4292*53ee8cc1Swenshuai.xi {
4293*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE2);
4294*53ee8cc1Swenshuai.xi }
4295*53ee8cc1Swenshuai.xi }
4296*53ee8cc1Swenshuai.xi
4297*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32CaMode 0x%lx\n", __FUNCTION__, __LINE__, _ptsp_res->_u32OrgCAMode));
4298*53ee8cc1Swenshuai.xi break;
4299*53ee8cc1Swenshuai.xi
4300*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS2_AUD:
4301*53ee8cc1Swenshuai.xi HAL_TSP_SelAudOut(u32EngId);
4302*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS2:
4303*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
4304*53ee8cc1Swenshuai.xi if(!_ptsp_res->_bLiveSING_FilePP)
4305*53ee8cc1Swenshuai.xi {
4306*53ee8cc1Swenshuai.xi HAL_TSP_DoubleBuf_Disable();
4307*53ee8cc1Swenshuai.xi }
4308*53ee8cc1Swenshuai.xi #if 0
4309*53ee8cc1Swenshuai.xi u32CaMode = HAL_TSP_CSA_Get_ScrmPath();
4310*53ee8cc1Swenshuai.xi if((u32CaMode & (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE2|TSP_CA_OUTPUT_PLAY_LIVE)) == (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE2))
4311*53ee8cc1Swenshuai.xi {
4312*53ee8cc1Swenshuai.xi _TSP_FreeDupDscmbPidFlt(u32EngId, 2, _ptsp_res->_u32OrgCAMode);
4313*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(_ptsp_res->_u32OrgCAMode & ~TSP_CA_OUTPUT_PLAY_LIVE2);
4314*53ee8cc1Swenshuai.xi }
4315*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32CaMode 0x%lx\n", __FUNCTION__, __LINE__, _ptsp_res->_u32OrgCAMode & ~TSP_CA_OUTPUT_PLAY_LIVE2));
4316*53ee8cc1Swenshuai.xi #endif
4317*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(u32EngId, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 2);
4318*53ee8cc1Swenshuai.xi break;
4319*53ee8cc1Swenshuai.xi
4320*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
4321*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_PVR1_CA:
4322*53ee8cc1Swenshuai.xi //switch CA to TS1
4323*53ee8cc1Swenshuai.xi HAL_TSP_CMD_Run(HAL_CMD_CHK_TSIF2_DSCMB_EN, 0, 0, &u32CaMode);
4324*53ee8cc1Swenshuai.xi if(u32CaMode != 0)
4325*53ee8cc1Swenshuai.xi {
4326*53ee8cc1Swenshuai.xi _ptsp_res->_u32OrgCAMode = HAL_TSP_CSA_Get_ScrmPath(); //record CACtrl before set CA input from TSIF2
4327*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(TSP_CA_INPUT_TSIF2_EN|TSP_CA_OUTPUT_PLAY_LIVE2);
4328*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s][%d] u32CaMode 0x%x\n", __FUNCTION__, __LINE__, TSP_CA_INPUT_TSIF2_EN|TSP_CA_OUTPUT_PLAY_LIVE2));
4329*53ee8cc1Swenshuai.xi }
4330*53ee8cc1Swenshuai.xi break;
4331*53ee8cc1Swenshuai.xi #endif
4332*53ee8cc1Swenshuai.xi #endif
4333*53ee8cc1Swenshuai.xi default:
4334*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4335*53ee8cc1Swenshuai.xi }
4336*53ee8cc1Swenshuai.xi
4337*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4338*53ee8cc1Swenshuai.xi }
4339*53ee8cc1Swenshuai.xi
4340*53ee8cc1Swenshuai.xi
4341*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4342*53ee8cc1Swenshuai.xi /// Select ChipTop PAD for ts0 and ts1
4343*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4344*53ee8cc1Swenshuai.xi /// @param eIf \b IN: TSP TS interface
4345*53ee8cc1Swenshuai.xi /// @param pIfSet \b IN: TS interface setting
4346*53ee8cc1Swenshuai.xi /// @return TSP_Result
4347*53ee8cc1Swenshuai.xi /// @note
4348*53ee8cc1Swenshuai.xi /// Uranus: only can select pad0/pad1 to ts0
4349*53ee8cc1Swenshuai.xi /// Oberon: can select pad0/pad1 to ts0, pad0/pad1 to ts1.
4350*53ee8cc1Swenshuai.xi /// Default setting was pad0->ts0, pad1->ts1.
4351*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4352*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SelPad(MS_U32 u32EngId, DrvTSP_If eIf, DrvTSP_If_Set* pIfSet)
4353*53ee8cc1Swenshuai.xi {
4354*53ee8cc1Swenshuai.xi TSP_Result bRet;
4355*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4356*53ee8cc1Swenshuai.xi bRet = _TSP_SelPad(u32EngId, eIf, pIfSet);
4357*53ee8cc1Swenshuai.xi _TSP_RETURN(bRet);
4358*53ee8cc1Swenshuai.xi }
4359*53ee8cc1Swenshuai.xi
4360*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4361*53ee8cc1Swenshuai.xi // Inverting bit order of TS parallel input
4362*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4363*53ee8cc1Swenshuai.xi // @param eIf \b IN: TSP TS interface
4364*53ee8cc1Swenshuai.xi // @param bInvert \b IN: bit order invert [1:invert 0:not invert]
4365*53ee8cc1Swenshuai.xi // @return TSP_Result
4366*53ee8cc1Swenshuai.xi // @note
4367*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4368*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Parl_BitOrderSwap(MS_U32 u32EngId, DrvTSP_If eIf, MS_BOOL bInvert)
4369*53ee8cc1Swenshuai.xi {
4370*53ee8cc1Swenshuai.xi MS_U32 u32Flow = 0;
4371*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4372*53ee8cc1Swenshuai.xi if (u32EngId>= TSP_ENGINE_NUM)
4373*53ee8cc1Swenshuai.xi {
4374*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4375*53ee8cc1Swenshuai.xi }
4376*53ee8cc1Swenshuai.xi switch (eIf)
4377*53ee8cc1Swenshuai.xi {
4378*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_PLAYBACK:
4379*53ee8cc1Swenshuai.xi u32Flow = 0;
4380*53ee8cc1Swenshuai.xi break;
4381*53ee8cc1Swenshuai.xi
4382*53ee8cc1Swenshuai.xi #ifndef NO_PVR
4383*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_PVR0:
4384*53ee8cc1Swenshuai.xi u32Flow = 1;
4385*53ee8cc1Swenshuai.xi break;
4386*53ee8cc1Swenshuai.xi #endif
4387*53ee8cc1Swenshuai.xi
4388*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
4389*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_PVR1:
4390*53ee8cc1Swenshuai.xi u32Flow = 2;
4391*53ee8cc1Swenshuai.xi break;
4392*53ee8cc1Swenshuai.xi #endif
4393*53ee8cc1Swenshuai.xi default:
4394*53ee8cc1Swenshuai.xi MS_ASSERT(0);
4395*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4396*53ee8cc1Swenshuai.xi }
4397*53ee8cc1Swenshuai.xi HAL_TSP_Parl_BitOrderSwap(u32EngId, u32Flow, bInvert);
4398*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4399*53ee8cc1Swenshuai.xi }
4400*53ee8cc1Swenshuai.xi
4401*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4402*53ee8cc1Swenshuai.xi /// Reset audio/video fifo or not
4403*53ee8cc1Swenshuai.xi /// @return TSP_Result
4404*53ee8cc1Swenshuai.xi /// @note
4405*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4406*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_AVFifo_Reset(DrvTSP_FltType eFilterType, MS_BOOL bFlush)
4407*53ee8cc1Swenshuai.xi {
4408*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4409*53ee8cc1Swenshuai.xi switch (eFilterType)
4410*53ee8cc1Swenshuai.xi {
4411*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO:
4412*53ee8cc1Swenshuai.xi HAL_TSP_Flush_AV_FIFO(0, bFlush);
4413*53ee8cc1Swenshuai.xi break;
4414*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO:
4415*53ee8cc1Swenshuai.xi HAL_TSP_Flush_AV_FIFO(1, bFlush);
4416*53ee8cc1Swenshuai.xi break;
4417*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO2:
4418*53ee8cc1Swenshuai.xi HAL_TSP_Flush_AV_FIFO(2, bFlush);
4419*53ee8cc1Swenshuai.xi break;
4420*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO3D:
4421*53ee8cc1Swenshuai.xi HAL_TSP_Flush_AV_FIFO(3, bFlush);
4422*53ee8cc1Swenshuai.xi break;
4423*53ee8cc1Swenshuai.xi default:
4424*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4425*53ee8cc1Swenshuai.xi }
4426*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4427*53ee8cc1Swenshuai.xi }
4428*53ee8cc1Swenshuai.xi
4429*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_AVFifo_Status(DrvTSP_FltType eFilterType, MS_U32 *u32FifoLevel)
4430*53ee8cc1Swenshuai.xi {
4431*53ee8cc1Swenshuai.xi *u32FifoLevel = -1;
4432*53ee8cc1Swenshuai.xi
4433*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4434*53ee8cc1Swenshuai.xi switch (eFilterType)
4435*53ee8cc1Swenshuai.xi {
4436*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO:
4437*53ee8cc1Swenshuai.xi *u32FifoLevel = HAL_TSP_Get_AVFifoLevel(0);
4438*53ee8cc1Swenshuai.xi break;
4439*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO:
4440*53ee8cc1Swenshuai.xi *u32FifoLevel = HAL_TSP_Get_AVFifoLevel(1);
4441*53ee8cc1Swenshuai.xi break;
4442*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO2:
4443*53ee8cc1Swenshuai.xi *u32FifoLevel = HAL_TSP_Get_AVFifoLevel(2);
4444*53ee8cc1Swenshuai.xi break;
4445*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO3D:
4446*53ee8cc1Swenshuai.xi *u32FifoLevel = HAL_TSP_Get_AVFifoLevel(3);
4447*53ee8cc1Swenshuai.xi break;
4448*53ee8cc1Swenshuai.xi default:
4449*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4450*53ee8cc1Swenshuai.xi }
4451*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4452*53ee8cc1Swenshuai.xi }
4453*53ee8cc1Swenshuai.xi
4454*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4455*53ee8cc1Swenshuai.xi /// Get Last General Error Return Code
4456*53ee8cc1Swenshuai.xi /// @return TSP_Result
4457*53ee8cc1Swenshuai.xi /// @note
4458*53ee8cc1Swenshuai.xi /// Last error return code is reset after calling this function.
4459*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4460*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetLastErr(void)
4461*53ee8cc1Swenshuai.xi {
4462*53ee8cc1Swenshuai.xi TSP_Result ret;
4463*53ee8cc1Swenshuai.xi ret = (TSP_Result)(_ptsp_res->_u32LastErr);
4464*53ee8cc1Swenshuai.xi _ptsp_res->_u32LastErr = DRVTSP_OK;
4465*53ee8cc1Swenshuai.xi return ret;
4466*53ee8cc1Swenshuai.xi }
4467*53ee8cc1Swenshuai.xi
4468*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4469*53ee8cc1Swenshuai.xi /// Get TSP Flt states
4470*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4471*53ee8cc1Swenshuai.xi /// @param u32FltId \b IN: index of Pid Filter [ 0 .. (@ref TSP_PIDFLT_NUM_ALL-1) ]
4472*53ee8cc1Swenshuai.xi /// @param peState \b OUT: Flter status
4473*53ee8cc1Swenshuai.xi /// @return TSP_Result
4474*53ee8cc1Swenshuai.xi /// @note
4475*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4476*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Flt_GetState(MS_U32 u32EngId, MS_U32 u32FltId, DrvTSP_FltState *peState)
4477*53ee8cc1Swenshuai.xi {
4478*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4479*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL> u32FltId, TSP_DBG("[TSP_ERROR][%06d] Bad FltId %d\n", __LINE__, (unsigned int)u32FltId));
4480*53ee8cc1Swenshuai.xi if (_TSP_Flt_StateGet(0, u32FltId, peState))
4481*53ee8cc1Swenshuai.xi {
4482*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4483*53ee8cc1Swenshuai.xi }
4484*53ee8cc1Swenshuai.xi else
4485*53ee8cc1Swenshuai.xi {
4486*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4487*53ee8cc1Swenshuai.xi }
4488*53ee8cc1Swenshuai.xi }
4489*53ee8cc1Swenshuai.xi
4490*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4491*53ee8cc1Swenshuai.xi /// Set TS Interface packet mode
4492*53ee8cc1Swenshuai.xi /// @param u32TSIf \b IN: TSIF
4493*53ee8cc1Swenshuai.xi /// @param eDrvPktMode \b IN: Packet mode
4494*53ee8cc1Swenshuai.xi /// @return TSP_Result
4495*53ee8cc1Swenshuai.xi /// @note
4496*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4497*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetPacketMode(MS_U32 u32TSIf, DrvTSP_PacketMode eDrvPktMode)
4498*53ee8cc1Swenshuai.xi {
4499*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4500*53ee8cc1Swenshuai.xi HAL_TSP_SetPacketMode(u32TSIf, (MS_U32)eDrvPktMode);
4501*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4502*53ee8cc1Swenshuai.xi }
4503*53ee8cc1Swenshuai.xi
4504*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4505*53ee8cc1Swenshuai.xi /// Set Sync Byte value to Stream source ID or TS source ID
4506*53ee8cc1Swenshuai.xi /// @param u32SrcID \b IN: Index of stream source id or TS source id
4507*53ee8cc1Swenshuai.xi /// Stream source ID is from 0 ~7
4508*53ee8cc1Swenshuai.xi /// TS source ID is mapping TSIF index
4509*53ee8cc1Swenshuai.xi /// @param u8SyncByte \b IN: Sync byte, defalut value is 0x47
4510*53ee8cc1Swenshuai.xi ///
4511*53ee8cc1Swenshuai.xi /// @return TSP_Result
4512*53ee8cc1Swenshuai.xi /// @note
4513*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4514*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetMergeStrSyncByte(MS_U32 u32SrcID, MS_U8 u8SyncByte)
4515*53ee8cc1Swenshuai.xi {
4516*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4517*53ee8cc1Swenshuai.xi HAL_TSP_SetMergeStrSyncByte(u32SrcID, u8SyncByte);
4518*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4519*53ee8cc1Swenshuai.xi }
4520*53ee8cc1Swenshuai.xi
4521*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4522*53ee8cc1Swenshuai.xi /// Enable remove duplicate A/V packets
4523*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: Enable or Disable
4524*53ee8cc1Swenshuai.xi /// @return TSP_Result
4525*53ee8cc1Swenshuai.xi /// @note
4526*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4527*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_RemoveDupAVPkt(MS_BOOL bEnable)
4528*53ee8cc1Swenshuai.xi {
4529*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4530*53ee8cc1Swenshuai.xi HAL_TSP_RemoveDupAVPkt(bEnable);
4531*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4532*53ee8cc1Swenshuai.xi }
4533*53ee8cc1Swenshuai.xi
4534*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4535*53ee8cc1Swenshuai.xi /// Enable remove duplicate A/V packets
4536*53ee8cc1Swenshuai.xi /// @param flttype \b IN: FIFO type
4537*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: Enable or Disable
4538*53ee8cc1Swenshuai.xi /// @return TSP_Result
4539*53ee8cc1Swenshuai.xi /// @note
4540*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4541*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_RemoveDupAVFifoPkt(DrvTSP_FltType flttype, MS_BOOL bEnable)
4542*53ee8cc1Swenshuai.xi {
4543*53ee8cc1Swenshuai.xi MS_U32 u32FifoIdx = 0;
4544*53ee8cc1Swenshuai.xi
4545*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4546*53ee8cc1Swenshuai.xi
4547*53ee8cc1Swenshuai.xi if(flttype == E_DRVTSP_FLT_TYPE_VIDEO)
4548*53ee8cc1Swenshuai.xi {
4549*53ee8cc1Swenshuai.xi u32FifoIdx = 0;
4550*53ee8cc1Swenshuai.xi }
4551*53ee8cc1Swenshuai.xi else if(flttype == E_DRVTSP_FLT_TYPE_AUDIO)
4552*53ee8cc1Swenshuai.xi {
4553*53ee8cc1Swenshuai.xi u32FifoIdx = 1;
4554*53ee8cc1Swenshuai.xi }
4555*53ee8cc1Swenshuai.xi else if(flttype == E_DRVTSP_FLT_TYPE_AUDIO2)
4556*53ee8cc1Swenshuai.xi {
4557*53ee8cc1Swenshuai.xi u32FifoIdx = 2;
4558*53ee8cc1Swenshuai.xi }
4559*53ee8cc1Swenshuai.xi else if(flttype == E_DRVTSP_FLT_TYPE_VIDEO3D)
4560*53ee8cc1Swenshuai.xi {
4561*53ee8cc1Swenshuai.xi u32FifoIdx = 3;
4562*53ee8cc1Swenshuai.xi }
4563*53ee8cc1Swenshuai.xi else
4564*53ee8cc1Swenshuai.xi {
4565*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_INVALID_PARAM);
4566*53ee8cc1Swenshuai.xi }
4567*53ee8cc1Swenshuai.xi
4568*53ee8cc1Swenshuai.xi HAL_TSP_RemoveDupAVFifoPkt(u32FifoIdx, bEnable);
4569*53ee8cc1Swenshuai.xi
4570*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4571*53ee8cc1Swenshuai.xi }
4572*53ee8cc1Swenshuai.xi
4573*53ee8cc1Swenshuai.xi #ifdef STC64_SUPPORT
4574*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4575*53ee8cc1Swenshuai.xi /// Enable or Disable STC64 bit mode. Defalut is STC33 mode.
4576*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: STC64 system time mode enable
4577*53ee8cc1Swenshuai.xi /// @return TSP_Result
4578*53ee8cc1Swenshuai.xi /// @note
4579*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4580*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_STC64_Mode_Enable(MS_BOOL bEnable)
4581*53ee8cc1Swenshuai.xi {
4582*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4583*53ee8cc1Swenshuai.xi HAL_TSP_STC64_Mode_En(bEnable);
4584*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4585*53ee8cc1Swenshuai.xi }
4586*53ee8cc1Swenshuai.xi #endif //STC64_SUPPORT
4587*53ee8cc1Swenshuai.xi
4588*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4589*53ee8cc1Swenshuai.xi /// STC Clock Rate Adjust (27MHz clock)
4590*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: STC engine ID
4591*53ee8cc1Swenshuai.xi /// @param u32Percentage \b IN: The percentage of STC clock ratio
4592*53ee8cc1Swenshuai.xi /// @return TSP_Result
4593*53ee8cc1Swenshuai.xi /// @note
4594*53ee8cc1Swenshuai.xi /// StcClk = (InClk * (Stc_CW / (2^27))) / 3.2
4595*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4596*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_STCClk_Adjust(MS_U32 u32EngId, MS_BOOL bUpClk, MS_U32 u32Percentage)
4597*53ee8cc1Swenshuai.xi {
4598*53ee8cc1Swenshuai.xi MS_U32 u32CW_New = 0;
4599*53ee8cc1Swenshuai.xi
4600*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4601*53ee8cc1Swenshuai.xi
4602*53ee8cc1Swenshuai.xi if(bUpClk)
4603*53ee8cc1Swenshuai.xi {
4604*53ee8cc1Swenshuai.xi u32CW_New = (((STC_SYNTH_DEFAULT >> 16) * 100) / u32Percentage) << 16;
4605*53ee8cc1Swenshuai.xi u32CW_New += (((STC_SYNTH_DEFAULT & 0xFFFF) * 100) / u32Percentage);
4606*53ee8cc1Swenshuai.xi }
4607*53ee8cc1Swenshuai.xi else
4608*53ee8cc1Swenshuai.xi {
4609*53ee8cc1Swenshuai.xi u32CW_New = (((STC_SYNTH_DEFAULT >> 16) * u32Percentage) / 100) << 16;
4610*53ee8cc1Swenshuai.xi u32CW_New += (((STC_SYNTH_DEFAULT & 0xFFFF) * u32Percentage) / 100);
4611*53ee8cc1Swenshuai.xi }
4612*53ee8cc1Swenshuai.xi
4613*53ee8cc1Swenshuai.xi HAL_TSP_Stc_ctrl(u32EngId, u32CW_New);
4614*53ee8cc1Swenshuai.xi
4615*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4616*53ee8cc1Swenshuai.xi }
4617*53ee8cc1Swenshuai.xi
4618*53ee8cc1Swenshuai.xi // Hidden interface. For Mstar use only
4619*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4620*53ee8cc1Swenshuai.xi // Set/Get TSP filter information
4621*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4622*53ee8cc1Swenshuai.xi // @param pu32StartFlt \b IN/OUT: starting filter id which is availabe
4623*53ee8cc1Swenshuai.xi // @param pu32EndFlt \b IN/OUT: starting filter id which is availabe
4624*53ee8cc1Swenshuai.xi // @param bSet \b IN: TRUE set, and FALSE for get
4625*53ee8cc1Swenshuai.xi // @return TSP_Result
4626*53ee8cc1Swenshuai.xi // @note
4627*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4628*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Flt_SetOwner(MS_U32 u32EngId, MS_U32 u32FltIdStart, MS_U32 u32FltIdEnd, MS_BOOL bOwner)
4629*53ee8cc1Swenshuai.xi {
4630*53ee8cc1Swenshuai.xi MS_U32 i = 0, u32PidFltId = 0;
4631*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
4632*53ee8cc1Swenshuai.xi
4633*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4634*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32FltIdStart, TSP_DBG("[TSP_ERROR][%06d] Bad FltIdStart\n", __LINE__));
4635*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All > u32FltIdEnd, TSP_DBG("[TSP_ERROR][%06d] Bad FltIdEnd\n", __LINE__));
4636*53ee8cc1Swenshuai.xi TSP_ASSERT2(u32FltIdEnd >= u32FltIdStart, TSP_DBG("[TSP_ERROR][%06d] u32FltIdEnd < u32FltIdStart\n", __LINE__));
4637*53ee8cc1Swenshuai.xi
4638*53ee8cc1Swenshuai.xi for (i = u32FltIdStart; i <= u32FltIdEnd; i++)
4639*53ee8cc1Swenshuai.xi {
4640*53ee8cc1Swenshuai.xi u32PidFltId = i;
4641*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
4642*53ee8cc1Swenshuai.xi if(i >= TSP_SECFLT_NUM)
4643*53ee8cc1Swenshuai.xi {
4644*53ee8cc1Swenshuai.xi u32PidFltId += TSP_PIDFLT1_NUM;
4645*53ee8cc1Swenshuai.xi }
4646*53ee8cc1Swenshuai.xi #endif
4647*53ee8cc1Swenshuai.xi
4648*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] != E_DRVTSP_FLT_STATE_FREE) &&
4649*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] != E_DRVTSP_FLT_STATE_NA))
4650*53ee8cc1Swenshuai.xi {
4651*53ee8cc1Swenshuai.xi MS_ASSERT(0);
4652*53ee8cc1Swenshuai.xi }
4653*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[u32EngId].SecFltState[i] != E_DRVTSP_FLT_STATE_FREE) &&
4654*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].SecFltState[i] != E_DRVTSP_FLT_STATE_NA))
4655*53ee8cc1Swenshuai.xi {
4656*53ee8cc1Swenshuai.xi MS_ASSERT(0);
4657*53ee8cc1Swenshuai.xi }
4658*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[u32EngId].SecBufState[i] != E_DRVTSP_FLT_STATE_FREE) &&
4659*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].SecBufState[i] != E_DRVTSP_FLT_STATE_NA))
4660*53ee8cc1Swenshuai.xi {
4661*53ee8cc1Swenshuai.xi MS_ASSERT(0);
4662*53ee8cc1Swenshuai.xi }
4663*53ee8cc1Swenshuai.xi
4664*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(i);
4665*53ee8cc1Swenshuai.xi if (bOwner)
4666*53ee8cc1Swenshuai.xi {
4667*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] = E_DRVTSP_FLT_STATE_FREE;
4668*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltState[i] = E_DRVTSP_FLT_STATE_FREE;
4669*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecBufState[i] = E_DRVTSP_FLT_STATE_FREE;
4670*53ee8cc1Swenshuai.xi HAL_TSP_SetOwner(pSecFilter, TRUE);
4671*53ee8cc1Swenshuai.xi }
4672*53ee8cc1Swenshuai.xi else
4673*53ee8cc1Swenshuai.xi {
4674*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] = E_DRVTSP_FLT_STATE_NA;
4675*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltState[i] = E_DRVTSP_FLT_STATE_NA;
4676*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecBufState[i] = E_DRVTSP_FLT_STATE_NA;
4677*53ee8cc1Swenshuai.xi HAL_TSP_SetOwner(pSecFilter, FALSE);
4678*53ee8cc1Swenshuai.xi }
4679*53ee8cc1Swenshuai.xi
4680*53ee8cc1Swenshuai.xi }
4681*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4682*53ee8cc1Swenshuai.xi }
4683*53ee8cc1Swenshuai.xi
4684*53ee8cc1Swenshuai.xi
4685*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4686*53ee8cc1Swenshuai.xi // Ask TSP to process section/pvr data for Non-OS driver. Calling this function in OS environment causes nothing
4687*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4688*53ee8cc1Swenshuai.xi // @param u32FltId \b IN: Which filter id to process. 0xFFFFFFFF means process all filters (DMXID)
4689*53ee8cc1Swenshuai.xi // @param u32Timeout \b IN: Max time for TSP to process
4690*53ee8cc1Swenshuai.xi // @return TSP_Result
4691*53ee8cc1Swenshuai.xi // @note
4692*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4693*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Proc(MS_U32 u32EngId, MS_U32 u32FltId, TSP_Result* pRet, DrvTSP_Event* pEvt) // for non-OS TSP scheduling
4694*53ee8cc1Swenshuai.xi {
4695*53ee8cc1Swenshuai.xi OSAL_TSP_ProcTypeParam Data;
4696*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4697*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL > u32FltId, TSP_DBG("[TSP_ERROR][%06d] Bad FltId %d\n", __LINE__, (unsigned int)u32FltId));
4698*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[u32FltId] == E_DRVTSP_FLT_STATE_NA)
4699*53ee8cc1Swenshuai.xi {
4700*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4701*53ee8cc1Swenshuai.xi }
4702*53ee8cc1Swenshuai.xi Data.u32FltId = u32FltId;
4703*53ee8cc1Swenshuai.xi Data.pRet = (void*)pRet;
4704*53ee8cc1Swenshuai.xi Data.bInfiniteWait = FALSE;
4705*53ee8cc1Swenshuai.xi Data.bFromTask = FALSE;
4706*53ee8cc1Swenshuai.xi
4707*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
4708*53ee8cc1Swenshuai.xi OSAL_TSP_Proc(_TSP_Isr_ProcPoll, &Data, (MS_U32*)pEvt);
4709*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
4710*53ee8cc1Swenshuai.xi
4711*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4712*53ee8cc1Swenshuai.xi }
4713*53ee8cc1Swenshuai.xi
4714*53ee8cc1Swenshuai.xi
4715*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4716*53ee8cc1Swenshuai.xi /// Get current system time clock (STC) of TSP
4717*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of STC engine
4718*53ee8cc1Swenshuai.xi /// @param pu32STC_32 \b OUT: pointer of STC[32] return
4719*53ee8cc1Swenshuai.xi /// @param pu32STC \b OUT: pointer of STC[31:0] return
4720*53ee8cc1Swenshuai.xi /// @return TSP_Result
4721*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4722*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetSTC(MS_U32 u32EngId, MS_U32 *pu32STC_32, MS_U32 *pu32STC)
4723*53ee8cc1Swenshuai.xi {
4724*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4725*53ee8cc1Swenshuai.xi
4726*53ee8cc1Swenshuai.xi //TSP_ASSERT2(TSP_ENGINE_NUM > u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad EngId %ld\n", __LINE__, u32EngId));
4727*53ee8cc1Swenshuai.xi TSP_ASSERT2(NULL != pu32STC_32, TSP_DBG("[TSP_ERROR][%06d] Null pointer: pu32STC_32\n", __LINE__));
4728*53ee8cc1Swenshuai.xi TSP_ASSERT2(NULL != pu32STC, TSP_DBG("[TSP_ERROR][%06d] Null pointer: pu32STC\n", __LINE__));
4729*53ee8cc1Swenshuai.xi
4730*53ee8cc1Swenshuai.xi HAL_TSP_STC_Update_Disable(u32EngId, TRUE);
4731*53ee8cc1Swenshuai.xi *pu32STC = HAL_TSP_GetSTC(u32EngId);
4732*53ee8cc1Swenshuai.xi *pu32STC_32 = HAL_TSP_GetSTC_32(u32EngId);
4733*53ee8cc1Swenshuai.xi HAL_TSP_STC_Update_Disable(u32EngId, FALSE);
4734*53ee8cc1Swenshuai.xi
4735*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4736*53ee8cc1Swenshuai.xi }
4737*53ee8cc1Swenshuai.xi
4738*53ee8cc1Swenshuai.xi
4739*53ee8cc1Swenshuai.xi
4740*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4741*53ee8cc1Swenshuai.xi /// Set STC control
4742*53ee8cc1Swenshuai.xi /// @param u8Eng \b IN: STC Engine ID
4743*53ee8cc1Swenshuai.xi /// @param u8Opt \b IN: STC update control options
4744*53ee8cc1Swenshuai.xi /// 0x00 -> Update STC by TSP FW
4745*53ee8cc1Swenshuai.xi /// 0x01 -> Update STC by HK
4746*53ee8cc1Swenshuai.xi /// 0x02 -> Update STC Once when PCR reset
4747*53ee8cc1Swenshuai.xi /// @return TSP_Result
4748*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4749*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_STC_UpdateCtrl(MS_U8 u8Eng, MS_U8 u8Opt)
4750*53ee8cc1Swenshuai.xi {
4751*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4752*53ee8cc1Swenshuai.xi if (HAL_TSP_STC_UpdateCtrl(u8Eng, u8Opt))
4753*53ee8cc1Swenshuai.xi {
4754*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4755*53ee8cc1Swenshuai.xi }
4756*53ee8cc1Swenshuai.xi else
4757*53ee8cc1Swenshuai.xi {
4758*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4759*53ee8cc1Swenshuai.xi }
4760*53ee8cc1Swenshuai.xi }
4761*53ee8cc1Swenshuai.xi
4762*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4763*53ee8cc1Swenshuai.xi /// Get PRC of TSP
4764*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of STC engine
4765*53ee8cc1Swenshuai.xi /// @param pu32Pcr_32 \b OUT: pointer of STC[32] return
4766*53ee8cc1Swenshuai.xi /// @param pu32Pcr \b OUT: pointer of STC[31:0] return
4767*53ee8cc1Swenshuai.xi /// @return TSP_Result
4768*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4769*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetPCR(MS_U32 u32EngId, MS_U32 *pu32Pcr_32, MS_U32 *pu32Pcr)
4770*53ee8cc1Swenshuai.xi {
4771*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4772*53ee8cc1Swenshuai.xi
4773*53ee8cc1Swenshuai.xi //TSP_ASSERT2(TSP_ENGINE_NUM > u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad EngId %ld\n", __LINE__, u32EngId));
4774*53ee8cc1Swenshuai.xi TSP_ASSERT2(NULL != pu32Pcr_32, TSP_DBG("[TSP_ERROR][%06d] Null pointer: pu32Pcr_32\n", __LINE__));
4775*53ee8cc1Swenshuai.xi TSP_ASSERT2(NULL != pu32Pcr, TSP_DBG("[TSP_ERROR][%06d] Null pointer: pu32Pcr\n", __LINE__));
4776*53ee8cc1Swenshuai.xi
4777*53ee8cc1Swenshuai.xi if (HAL_TSP_GetPcr(u32EngId, pu32Pcr_32, pu32Pcr))
4778*53ee8cc1Swenshuai.xi {
4779*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4780*53ee8cc1Swenshuai.xi }
4781*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4782*53ee8cc1Swenshuai.xi }
4783*53ee8cc1Swenshuai.xi
4784*53ee8cc1Swenshuai.xi
4785*53ee8cc1Swenshuai.xi // PIDFlt API
4786*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4787*53ee8cc1Swenshuai.xi /// Allocate a PID filter of a TSP unit
4788*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4789*53ee8cc1Swenshuai.xi /// @param eFilterType \b IN: type of PID filter to be allocated
4790*53ee8cc1Swenshuai.xi /// @param pu32PidFltId \b OUT: pointer of PID filter id return
4791*53ee8cc1Swenshuai.xi /// @return TSP_Result
4792*53ee8cc1Swenshuai.xi /// @note
4793*53ee8cc1Swenshuai.xi /// These filter types have to select a section filter\n
4794*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_SECTION\n
4795*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_PCR\n
4796*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_PES\n
4797*53ee8cc1Swenshuai.xi /// @note
4798*53ee8cc1Swenshuai.xi /// These filter types also have to setup section buffer for data output\n
4799*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_SECTION\n
4800*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_PES\n
4801*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PidFlt_SelSecFlt, MDrv_TSP_SecFlt_SetBuffer
4802*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4803*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_Alloc(MS_U32 u32EngId, DrvTSP_FltType eFilterType, MS_U32 *pu32PidFltId)
4804*53ee8cc1Swenshuai.xi {
4805*53ee8cc1Swenshuai.xi
4806*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
4807*53ee8cc1Swenshuai.xi if(MDrv_SYS_Query(E_SYS_QUERY_DTV_SUPPORTED) == FALSE)
4808*53ee8cc1Swenshuai.xi {
4809*53ee8cc1Swenshuai.xi if((eFilterType & E_DRVTSP_FLT_SOURCE_TYPE_MASK) == E_DRVTSP_FLT_SOURCE_TYPE_LIVE)
4810*53ee8cc1Swenshuai.xi {
4811*53ee8cc1Swenshuai.xi // block DTV function
4812*53ee8cc1Swenshuai.xi ULOGE("TSP", "[TSP_ERROR][%06d] DTV function not supported on this chip\n", __LINE__);
4813*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
4814*53ee8cc1Swenshuai.xi }
4815*53ee8cc1Swenshuai.xi }
4816*53ee8cc1Swenshuai.xi #endif //end of undef MSOS_TYPE_LINUX_KERNEL
4817*53ee8cc1Swenshuai.xi
4818*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4819*53ee8cc1Swenshuai.xi
4820*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
4821*53ee8cc1Swenshuai.xi
4822*53ee8cc1Swenshuai.xi *pu32PidFltId= 0xFFFFFFFF;
4823*53ee8cc1Swenshuai.xi if (!_TSP_PidFlt_Alloc(u32EngId, eFilterType, pu32PidFltId))
4824*53ee8cc1Swenshuai.xi {
4825*53ee8cc1Swenshuai.xi TSP_ASSERT2(0, TSP_DBG("[TSP_ERROR][%06d] Allocate Pid Filter fail\n", __LINE__));
4826*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4827*53ee8cc1Swenshuai.xi }
4828*53ee8cc1Swenshuai.xi _TSP_PidFlt_Init(u32EngId, *pu32PidFltId);
4829*53ee8cc1Swenshuai.xi
4830*53ee8cc1Swenshuai.xi #ifndef HWPCR_ENABLE
4831*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_TYPE_PCR == (eFilterType&~E_DRVTSP_FLT_MASK))
4832*53ee8cc1Swenshuai.xi {
4833*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId = *pu32PidFltId;
4834*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
4835*53ee8cc1Swenshuai.xi
4836*53ee8cc1Swenshuai.xi if(*pu32PidFltId >= TSP_SECFLT_NUM)
4837*53ee8cc1Swenshuai.xi {
4838*53ee8cc1Swenshuai.xi u32SecFltId -= TSP_PIDFLT1_NUM;
4839*53ee8cc1Swenshuai.xi }
4840*53ee8cc1Swenshuai.xi if (!_TSP_SecFlt_Alloc(u32EngId, eFilterType, &u32SecFltId))
4841*53ee8cc1Swenshuai.xi {
4842*53ee8cc1Swenshuai.xi TSP_ASSERT2(0, TSP_DBG("[TSP_ERROR][%06d] Allocate Section Filter fail\n", __LINE__));
4843*53ee8cc1Swenshuai.xi }
4844*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelSecFlt(HAL_TSP_GetPidFltReg(u32EngId, *pu32PidFltId), u32SecFltId);
4845*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltMap[*pu32PidFltId] = u32SecFltId;
4846*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
4847*53ee8cc1Swenshuai.xi _TSP_SecFlt_SetType(pSecFilter, _ptsp_res->_TspState[u32EngId].FltType[*pu32PidFltId]);
4848*53ee8cc1Swenshuai.xi }
4849*53ee8cc1Swenshuai.xi #endif
4850*53ee8cc1Swenshuai.xi
4851*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4852*53ee8cc1Swenshuai.xi }
4853*53ee8cc1Swenshuai.xi
4854*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4855*53ee8cc1Swenshuai.xi /// Free a PID filter of a TSP unit
4856*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4857*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of PID filter to be free
4858*53ee8cc1Swenshuai.xi /// @return TSP_Result
4859*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4860*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_Free(MS_U32 u32EngId, MS_U32 u32PidFltId)
4861*53ee8cc1Swenshuai.xi {
4862*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId, u32Flag;
4863*53ee8cc1Swenshuai.xi TSP_Result tRes = DRVTSP_FAIL;
4864*53ee8cc1Swenshuai.xi
4865*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4866*53ee8cc1Swenshuai.xi
4867*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
4868*53ee8cc1Swenshuai.xi // this API only free pidflt which had section
4869*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %d\n", __LINE__, (unsigned int)u32PidFltId));
4870*53ee8cc1Swenshuai.xi
4871*53ee8cc1Swenshuai.xi //_TSP_IND_UNLOCK();
4872*53ee8cc1Swenshuai.xi
4873*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_STATE_FREE == _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId])
4874*53ee8cc1Swenshuai.xi {
4875*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4876*53ee8cc1Swenshuai.xi }
4877*53ee8cc1Swenshuai.xi
4878*53ee8cc1Swenshuai.xi // PVR pid filters and AV filters do not have SecFltEvtNotify, so call free function directly.
4879*53ee8cc1Swenshuai.xi u32SecFltId = _ptsp_res->_TspState[u32EngId].FltMap[u32PidFltId];
4880*53ee8cc1Swenshuai.xi #ifndef TS2_LIVE_SUPPORT
4881*53ee8cc1Swenshuai.xi if((u32PidFltId >= TSP_SECFLT_NUM)
4882*53ee8cc1Swenshuai.xi #else
4883*53ee8cc1Swenshuai.xi if(((u32PidFltId >= TSP_SECFLT_NUM) && (u32PidFltId < (TSP_SECFLT_NUM+TSP_PIDFLT1_NUM)))
4884*53ee8cc1Swenshuai.xi #endif
4885*53ee8cc1Swenshuai.xi || ((_ptsp_res->_TspState[u32EngId].FltType[u32PidFltId] & E_DRVTSP_FLT_TYPE_SECTION_MASK) == 0))
4886*53ee8cc1Swenshuai.xi {
4887*53ee8cc1Swenshuai.xi //_TSP_IND_LOCK();
4888*53ee8cc1Swenshuai.xi _TSP_PidFlt_Free(u32EngId, u32PidFltId, TRUE);
4889*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4890*53ee8cc1Swenshuai.xi }
4891*53ee8cc1Swenshuai.xi
4892*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] & E_DRVTSP_EVENT_CB_MASK) == E_DRVTSP_EVENT_CB_POLL)
4893*53ee8cc1Swenshuai.xi {
4894*53ee8cc1Swenshuai.xi //_TSP_IND_LOCK();
4895*53ee8cc1Swenshuai.xi _TSP_SecBuf_Free(0, u32SecFltId);
4896*53ee8cc1Swenshuai.xi _TSP_SecFlt_Free(0, u32SecFltId, TRUE);
4897*53ee8cc1Swenshuai.xi _TSP_PidFlt_Free(u32EngId, u32PidFltId, TRUE);
4898*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4899*53ee8cc1Swenshuai.xi }
4900*53ee8cc1Swenshuai.xi else if ((_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] & E_DRVTSP_EVENT_CB_MASK) == E_DRVTSP_EVENT_CB_SELF)
4901*53ee8cc1Swenshuai.xi {
4902*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_STATE_FREE == _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId])
4903*53ee8cc1Swenshuai.xi {
4904*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4905*53ee8cc1Swenshuai.xi }
4906*53ee8cc1Swenshuai.xi
4907*53ee8cc1Swenshuai.xi #if 1
4908*53ee8cc1Swenshuai.xi if((_s32TspTaskId != -1) && (_s32TspTaskId == MsOS_GetOSThreadID()))
4909*53ee8cc1Swenshuai.xi {
4910*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%06d] Don't call %s in Callback function!!!", __LINE__, __FUNCTION__);
4911*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4912*53ee8cc1Swenshuai.xi }
4913*53ee8cc1Swenshuai.xi #endif
4914*53ee8cc1Swenshuai.xi
4915*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] & E_DRVTSP_FLT_STATE_CBRUN)
4916*53ee8cc1Swenshuai.xi {
4917*53ee8cc1Swenshuai.xi //ULOGE("TSP", "[%s][%d]Warning !! Filter %d callback is running %x! Try Again!\n", __FUNCTION__, __LINE__, (unsigned int)u32PidFltId, (unsigned int)stDrvState);
4918*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4919*53ee8cc1Swenshuai.xi }
4920*53ee8cc1Swenshuai.xi
4921*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] |= E_DRVTSP_FLT_STATE_FREEING;
4922*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId(u32SecFltId, &u32Flag, OSAL_EVENT_OR_CLEAR);
4923*53ee8cc1Swenshuai.xi _TSP_GetSecOvfId(u32SecFltId, &u32Flag, OSAL_EVENT_OR_CLEAR);
4924*53ee8cc1Swenshuai.xi _TSP_SecBuf_Free(u32EngId, u32SecFltId);
4925*53ee8cc1Swenshuai.xi _TSP_SecFlt_Free(u32EngId, u32SecFltId, TRUE);
4926*53ee8cc1Swenshuai.xi _TSP_PidFlt_Free(u32EngId, u32PidFltId, TRUE);
4927*53ee8cc1Swenshuai.xi
4928*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4929*53ee8cc1Swenshuai.xi
4930*53ee8cc1Swenshuai.xi }
4931*53ee8cc1Swenshuai.xi //_TSP_IND_LOCK();
4932*53ee8cc1Swenshuai.xi _TSP_RETURN(tRes);
4933*53ee8cc1Swenshuai.xi }
4934*53ee8cc1Swenshuai.xi
4935*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4936*53ee8cc1Swenshuai.xi /// Set PID to a PID filter
4937*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4938*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of PID filter to be set
4939*53ee8cc1Swenshuai.xi /// @param u32PID \b IN: PID value
4940*53ee8cc1Swenshuai.xi /// @return TSP_Result
4941*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4942*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_SetPid(MS_U32 u32EngId, MS_U32 u32PidFltId, MS_U32 u32PID)
4943*53ee8cc1Swenshuai.xi {
4944*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4945*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
4946*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %d\n", __LINE__, (unsigned int)u32PidFltId));
4947*53ee8cc1Swenshuai.xi TSP_ASSERT2(E_DRVTSP_FLT_STATE_FREE!= _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId], TSP_DBG("[TSP_ERROR][%06d] Bad Flt state\n", __LINE__));
4948*53ee8cc1Swenshuai.xi
4949*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
4950*53ee8cc1Swenshuai.xi if(u32PidFltId >= TSP_HWPCR_FLT_START_ID)
4951*53ee8cc1Swenshuai.xi {
4952*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetHWPcrPid(u32PidFltId - TSP_HWPCR_FLT_START_ID, u32PID);
4953*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4954*53ee8cc1Swenshuai.xi }
4955*53ee8cc1Swenshuai.xi else
4956*53ee8cc1Swenshuai.xi {
4957*53ee8cc1Swenshuai.xi #endif
4958*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(HAL_TSP_GetPidFltReg(u32EngId, u32PidFltId), u32PID);
4959*53ee8cc1Swenshuai.xi
4960*53ee8cc1Swenshuai.xi #ifndef NO_CA
4961*53ee8cc1Swenshuai.xi _TSP_FLT1_DupFLT0_Pid(0, u32PidFltId, u32PID);
4962*53ee8cc1Swenshuai.xi
4963*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
4964*53ee8cc1Swenshuai.xi //Duplicate FLT2 pid to FLT1 for dscmb
4965*53ee8cc1Swenshuai.xi _TSP_FLT1_DupFLT2_Pid(0, u32PidFltId, u32PID);
4966*53ee8cc1Swenshuai.xi #endif //end TS2_IF_SUPPORT define
4967*53ee8cc1Swenshuai.xi
4968*53ee8cc1Swenshuai.xi #endif //end NO_CA define
4969*53ee8cc1Swenshuai.xi
4970*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
4971*53ee8cc1Swenshuai.xi }
4972*53ee8cc1Swenshuai.xi #endif
4973*53ee8cc1Swenshuai.xi
4974*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4975*53ee8cc1Swenshuai.xi }
4976*53ee8cc1Swenshuai.xi
4977*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4978*53ee8cc1Swenshuai.xi /// Set PID to a PID filter
4979*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4980*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of PID filter to be set
4981*53ee8cc1Swenshuai.xi /// @param pu32PID \b OUT: the output PID
4982*53ee8cc1Swenshuai.xi /// @return TSP_Result
4983*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4984*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_GetPid(MS_U32 u32EngId, MS_U32 u32PidFltId, MS_U32* pu32PID)
4985*53ee8cc1Swenshuai.xi {
4986*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4987*53ee8cc1Swenshuai.xi
4988*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
4989*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %d\n", __LINE__, (unsigned int)u32PidFltId));
4990*53ee8cc1Swenshuai.xi //TSP_ASSERT2(E_DRVTSP_FLT_STATE_FREE!= _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId], TSP_DBG("[TSP_ERROR][%06d] Bad Flt state\n", __LINE__));
4991*53ee8cc1Swenshuai.xi
4992*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
4993*53ee8cc1Swenshuai.xi if(u32PidFltId >= TSP_HWPCR_FLT_START_ID)
4994*53ee8cc1Swenshuai.xi {
4995*53ee8cc1Swenshuai.xi *pu32PID = HAL_TSP_PidFlt_GetHWPcrPid(u32PidFltId - TSP_HWPCR_FLT_START_ID);
4996*53ee8cc1Swenshuai.xi }
4997*53ee8cc1Swenshuai.xi else
4998*53ee8cc1Swenshuai.xi {
4999*53ee8cc1Swenshuai.xi #endif
5000*53ee8cc1Swenshuai.xi
5001*53ee8cc1Swenshuai.xi *pu32PID = HAL_TSP_PidFlt_GetPid(HAL_TSP_GetPidFltReg(u32EngId, u32PidFltId));
5002*53ee8cc1Swenshuai.xi
5003*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
5004*53ee8cc1Swenshuai.xi }
5005*53ee8cc1Swenshuai.xi #endif
5006*53ee8cc1Swenshuai.xi
5007*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5008*53ee8cc1Swenshuai.xi }
5009*53ee8cc1Swenshuai.xi
5010*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5011*53ee8cc1Swenshuai.xi /// Select section filter of PID filter
5012*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5013*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of PID filter\n
5014*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section filter
5015*53ee8cc1Swenshuai.xi /// @return TSP_Result
5016*53ee8cc1Swenshuai.xi /// @note
5017*53ee8cc1Swenshuai.xi /// The PID filter and section filter pair is one-to-one mapping. User has to
5018*53ee8cc1Swenshuai.xi /// allocate other PID filters if user have more than one section filter for same
5019*53ee8cc1Swenshuai.xi /// PID packet.\n
5020*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PidFlt_Alloc
5021*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5022*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_SelSecFlt(MS_U32 u32EngId, MS_U32 u32PidFltId, MS_U32 u32SecFltId)
5023*53ee8cc1Swenshuai.xi {
5024*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
5025*53ee8cc1Swenshuai.xi
5026*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5027*53ee8cc1Swenshuai.xi
5028*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5029*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %d\n", __LINE__, (unsigned int)u32PidFltId));
5030*53ee8cc1Swenshuai.xi TSP_ASSERT2(E_DRVTSP_FLT_STATE_FREE!= _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId], TSP_DBG("[TSP_ERROR][%06d] Bad Flt state\n", __LINE__));
5031*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] SecFltId= %d\n", __LINE__, (unsigned int)u32SecFltId));
5032*53ee8cc1Swenshuai.xi
5033*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
5034*53ee8cc1Swenshuai.xi
5035*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelSecFlt(HAL_TSP_GetPidFltReg(u32EngId, u32PidFltId), u32SecFltId);
5036*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltMap[u32PidFltId] = u32SecFltId;
5037*53ee8cc1Swenshuai.xi _TSP_SecFlt_SetType(pSecFilter, _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId]);
5038*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5039*53ee8cc1Swenshuai.xi }
5040*53ee8cc1Swenshuai.xi
5041*53ee8cc1Swenshuai.xi
5042*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5043*53ee8cc1Swenshuai.xi /// Enable PID filter
5044*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5045*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of filter to be enable
5046*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: TRUE(enable), FALSE(disable)
5047*53ee8cc1Swenshuai.xi /// @return TSP_Result
5048*53ee8cc1Swenshuai.xi /// @note
5049*53ee8cc1Swenshuai.xi /// When PID filter enable, the section buffer pointer will be reset to buffer start address,
5050*53ee8cc1Swenshuai.xi /// overflow condition will be resolved if exist.
5051*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5052*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_Enable(MS_U32 u32EngId, MS_U32 u32PidFltId, MS_BOOL bEnable)
5053*53ee8cc1Swenshuai.xi {
5054*53ee8cc1Swenshuai.xi REG_PidFlt* pPidFilter= NULL;
5055*53ee8cc1Swenshuai.xi
5056*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5057*53ee8cc1Swenshuai.xi
5058*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5059*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %d\n", __LINE__, (unsigned int)u32PidFltId));
5060*53ee8cc1Swenshuai.xi TSP_ASSERT2(E_DRVTSP_FLT_STATE_FREE!= _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId], TSP_DBG("[TSP_ERROR][%06d] Bad Flt state\n", __LINE__));
5061*53ee8cc1Swenshuai.xi
5062*53ee8cc1Swenshuai.xi if (!bEnable)
5063*53ee8cc1Swenshuai.xi {
5064*53ee8cc1Swenshuai.xi if (!HAS_FLAG(_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId], E_DRVTSP_FLT_STATE_ENABLE))
5065*53ee8cc1Swenshuai.xi {
5066*53ee8cc1Swenshuai.xi // TSP_DBG("[TSP_WARNNING][%06d] disable an inactive PidFlt %d\n", __LINE__, u32PidFltId);
5067*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5068*53ee8cc1Swenshuai.xi }
5069*53ee8cc1Swenshuai.xi
5070*53ee8cc1Swenshuai.xi _TSP_PidFlt_Disable(u32EngId, u32PidFltId);
5071*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5072*53ee8cc1Swenshuai.xi }
5073*53ee8cc1Swenshuai.xi
5074*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId], E_DRVTSP_FLT_STATE_ENABLE))
5075*53ee8cc1Swenshuai.xi {
5076*53ee8cc1Swenshuai.xi // TSP_DBG("[TSP_WARNNING][%06d] Enable an active PidFlt %d\n", __LINE__, u32PidFltId);
5077*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5078*53ee8cc1Swenshuai.xi }
5079*53ee8cc1Swenshuai.xi
5080*53ee8cc1Swenshuai.xi pPidFilter= HAL_TSP_GetPidFltReg(u32EngId, u32PidFltId);
5081*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_TYPE_PVR == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5082*53ee8cc1Swenshuai.xi {
5083*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_SOURCE_TYPE_FILE == _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId])
5084*53ee8cc1Swenshuai.xi {
5085*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(pPidFilter, TSP_PIDFLT_PVR_ENABLE);
5086*53ee8cc1Swenshuai.xi }
5087*53ee8cc1Swenshuai.xi #ifdef EXT_PVR1_FLT
5088*53ee8cc1Swenshuai.xi else
5089*53ee8cc1Swenshuai.xi {
5090*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(pPidFilter, TSP_PIDFLT_OUT_SECFLT);
5091*53ee8cc1Swenshuai.xi }
5092*53ee8cc1Swenshuai.xi #endif
5093*53ee8cc1Swenshuai.xi
5094*53ee8cc1Swenshuai.xi #ifndef NO_PVR
5095*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM <= u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %d\n", __LINE__, (unsigned int)u32PidFltId));
5096*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
5097*53ee8cc1Swenshuai.xi }
5098*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
5099*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_CB == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5100*53ee8cc1Swenshuai.xi {
5101*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
5102*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(pPidFilter, TSP_PIDFLT_OUT_REC);
5103*53ee8cc1Swenshuai.xi #endif
5104*53ee8cc1Swenshuai.xi TSP_ASSERT2((TSP_PIDFLT_BASE0_NUM+TSP_PIDFLT_BASE1_NUM) <= u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %d\n", __LINE__, (unsigned int)u32PidFltId));
5105*53ee8cc1Swenshuai.xi }
5106*53ee8cc1Swenshuai.xi #endif
5107*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_VIDEO == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5108*53ee8cc1Swenshuai.xi {
5109*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
5110*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Src_SelTs2(TSP_FIFO_VD, (E_DRVTSP_FLT_SOURCE_TYPE_TS2 == _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId]));
5111*53ee8cc1Swenshuai.xi #endif
5112*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(pPidFilter, TSP_PIDFLT_OUT_VFIFO);
5113*53ee8cc1Swenshuai.xi }
5114*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_AUDIO == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5115*53ee8cc1Swenshuai.xi {
5116*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
5117*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Src_SelTs2(TSP_FIFO_AU, (E_DRVTSP_FLT_SOURCE_TYPE_TS2 == _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId]));
5118*53ee8cc1Swenshuai.xi #endif
5119*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(pPidFilter, TSP_PIDFLT_OUT_AFIFO);
5120*53ee8cc1Swenshuai.xi }
5121*53ee8cc1Swenshuai.xi #ifndef NO_AUBFIFO
5122*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_AUDIO2 == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5123*53ee8cc1Swenshuai.xi {
5124*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
5125*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Src_SelTs2(TSP_FIFO_AUB, (E_DRVTSP_FLT_SOURCE_TYPE_TS2 == _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId]));
5126*53ee8cc1Swenshuai.xi #endif
5127*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(pPidFilter, TSP_PIDFLT_OUT_AFIFO2);
5128*53ee8cc1Swenshuai.xi }
5129*53ee8cc1Swenshuai.xi #endif
5130*53ee8cc1Swenshuai.xi #ifdef MMFI_VD3D
5131*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_VIDEO3D == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5132*53ee8cc1Swenshuai.xi {
5133*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
5134*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Src_SelTs2(TSP_FIFO_V3D, (E_DRVTSP_FLT_SOURCE_TYPE_TS2 == _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId]));
5135*53ee8cc1Swenshuai.xi #endif
5136*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(pPidFilter, TSP_PIDFLT_OUT_VFIFO3D);
5137*53ee8cc1Swenshuai.xi }
5138*53ee8cc1Swenshuai.xi #endif
5139*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
5140*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_PCR == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5141*53ee8cc1Swenshuai.xi {
5142*53ee8cc1Swenshuai.xi MS_U32 u32Idx = u32PidFltId - TSP_HWPCR_FLT_START_ID;
5143*53ee8cc1Swenshuai.xi MS_U32 u32PktSrc = TSP_SRC_FROM_PKTDMX0;
5144*53ee8cc1Swenshuai.xi
5145*53ee8cc1Swenshuai.xi switch(_ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId])
5146*53ee8cc1Swenshuai.xi {
5147*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_LIVE:
5148*53ee8cc1Swenshuai.xi u32PktSrc = TSP_SRC_FROM_PKTDMX0;
5149*53ee8cc1Swenshuai.xi break;
5150*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE:
5151*53ee8cc1Swenshuai.xi u32PktSrc = TSP_SRC_FROM_PKTDMXFL;
5152*53ee8cc1Swenshuai.xi break;
5153*53ee8cc1Swenshuai.xi }
5154*53ee8cc1Swenshuai.xi
5155*53ee8cc1Swenshuai.xi #if (TSP_HWPCR_BY_HK == 1)
5156*53ee8cc1Swenshuai.xi _u8ResetPcr[u32Idx] = 3;
5157*53ee8cc1Swenshuai.xi _u32PrevStcBase[u32Idx] = 0;
5158*53ee8cc1Swenshuai.xi _u32PrevPllControl[u32Idx] = 0;
5159*53ee8cc1Swenshuai.xi #endif
5160*53ee8cc1Swenshuai.xi
5161*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_Reset(u32Idx, TRUE);
5162*53ee8cc1Swenshuai.xi #if (TSP_HWPCR_BY_HK == 1)
5163*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_Reset(u32Idx, FALSE);
5164*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_Int_Enable(u32Idx, TRUE);
5165*53ee8cc1Swenshuai.xi _TSP_SetHwPcrNotifyId(u32Idx);
5166*53ee8cc1Swenshuai.xi #endif
5167*53ee8cc1Swenshuai.xi
5168*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_SelSrc(u32Idx, u32PktSrc);
5169*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_HWPcrFlt_Enable(u32Idx, TRUE);
5170*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId]|= E_DRVTSP_FLT_STATE_ENABLE;
5171*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5172*53ee8cc1Swenshuai.xi }
5173*53ee8cc1Swenshuai.xi #endif
5174*53ee8cc1Swenshuai.xi else
5175*53ee8cc1Swenshuai.xi {
5176*53ee8cc1Swenshuai.xi REG_SecFlt* pSecFilter = NULL;
5177*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId;
5178*53ee8cc1Swenshuai.xi
5179*53ee8cc1Swenshuai.xi REG_SecFlt* pSecBufFilter = NULL;
5180*53ee8cc1Swenshuai.xi MS_U32 u32SecBufId;
5181*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %d\n", __LINE__, (unsigned int)u32PidFltId));
5182*53ee8cc1Swenshuai.xi
5183*53ee8cc1Swenshuai.xi u32SecFltId = HAL_TSP_PidFlt_GetSecFlt(pPidFilter);
5184*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] SecFltId= %d\n", __LINE__, (unsigned int)u32SecFltId));
5185*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);;
5186*53ee8cc1Swenshuai.xi //u32SecBufId = HAL_TSP_SecFlt_GetSecBuf(pSecFilter);
5187*53ee8cc1Swenshuai.xi u32SecBufId = u32SecFltId;
5188*53ee8cc1Swenshuai.xi
5189*53ee8cc1Swenshuai.xi // reset ver/crc check
5190*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltType[u32PidFltId] == E_DRVTSP_FLT_TYPE_SECTION_VER)
5191*53ee8cc1Swenshuai.xi {
5192*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_VerReset(u32SecFltId);
5193*53ee8cc1Swenshuai.xi }
5194*53ee8cc1Swenshuai.xi
5195*53ee8cc1Swenshuai.xi switch (_ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5196*53ee8cc1Swenshuai.xi {
5197*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION:
5198*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PES:
5199*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PACKET:
5200*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_TELETEXT:
5201*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION_VER:
5202*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION_NO_PUSI:
5203*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecBufId, TSP_DBG("[TSP_ERROR][%06d] SecBufId= %d\n", __LINE__, (unsigned int)u32SecBufId));
5204*53ee8cc1Swenshuai.xi pSecBufFilter= _TSP_GET_SECFLT_REG(u32SecBufId);;
5205*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_ResetBuffer(pSecBufFilter);
5206*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_ResetState(pSecFilter);
5207*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetRmnCount(pSecFilter, 0);
5208*53ee8cc1Swenshuai.xi //HAL_TSP_Reset_SecDisCont_PktCount(u32PidFltId);
5209*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(pPidFilter, TSP_PIDFLT_OUT_SECFLT);
5210*53ee8cc1Swenshuai.xi break;
5211*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_EMM:
5212*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_ECM:
5213*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_ResetState(pSecFilter);
5214*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetRmnCount(pSecFilter, 0);
5215*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_ResetBuffer(pSecFilter);
5216*53ee8cc1Swenshuai.xi //HAL_TSP_Reset_SecDisCont_PktCount(u32PidFltId);
5217*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(pPidFilter, TSP_PIDFLT_OUT_SECFLT);
5218*53ee8cc1Swenshuai.xi break;
5219*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PCR:
5220*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_PcrReset(pSecFilter);
5221*53ee8cc1Swenshuai.xi #if (defined(NO_FILEIN) || !defined(VQ_ENABLE))
5222*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(pPidFilter, TSP_PIDFLT_OUT_SECFLT|TSP_PIDFLT_OUT_SECFLT_AF);
5223*53ee8cc1Swenshuai.xi #else
5224*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(pPidFilter, TSP_PIDFLT_OUT_SECFLT_AF);
5225*53ee8cc1Swenshuai.xi #endif
5226*53ee8cc1Swenshuai.xi break;
5227*53ee8cc1Swenshuai.xi default:
5228*53ee8cc1Swenshuai.xi break;
5229*53ee8cc1Swenshuai.xi }
5230*53ee8cc1Swenshuai.xi }
5231*53ee8cc1Swenshuai.xi
5232*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_SOURCE_TYPE_LIVE == _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId])
5233*53ee8cc1Swenshuai.xi {
5234*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(pPidFilter, TSP_PIDFLT_IN_LIVE);
5235*53ee8cc1Swenshuai.xi }
5236*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
5237*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_SOURCE_TYPE_FILE == _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId])
5238*53ee8cc1Swenshuai.xi {
5239*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(pPidFilter, TSP_PIDFLT_IN_FILE);
5240*53ee8cc1Swenshuai.xi }
5241*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
5242*53ee8cc1Swenshuai.xi
5243*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId]|= E_DRVTSP_FLT_STATE_ENABLE;
5244*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5245*53ee8cc1Swenshuai.xi }
5246*53ee8cc1Swenshuai.xi
5247*53ee8cc1Swenshuai.xi
5248*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5249*53ee8cc1Swenshuai.xi /// Get current PID filter status
5250*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5251*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of PID filter
5252*53ee8cc1Swenshuai.xi /// @param peState \b OUT: current ORed state flag of PID filter\n
5253*53ee8cc1Swenshuai.xi /// E_DRVTSP_FLT_STATE_ALLOC\n
5254*53ee8cc1Swenshuai.xi /// E_DRVTSP_FLT_STATE_ENABLE\n
5255*53ee8cc1Swenshuai.xi /// E_DRVTSP_FLT_STATE_SCRAMBLED ([VENUS]: TS level scramble status)
5256*53ee8cc1Swenshuai.xi /// @return TSP_Result
5257*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5258*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_GetState(MS_U32 u32EngId, MS_U32 u32PidFltId, DrvTSP_FltState *peState)
5259*53ee8cc1Swenshuai.xi {
5260*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5261*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5262*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %d\n", __LINE__, (unsigned int)u32PidFltId));
5263*53ee8cc1Swenshuai.xi if (_TSP_PidFlt_StateGet(u32EngId, u32PidFltId, peState))
5264*53ee8cc1Swenshuai.xi {
5265*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5266*53ee8cc1Swenshuai.xi }
5267*53ee8cc1Swenshuai.xi else
5268*53ee8cc1Swenshuai.xi {
5269*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5270*53ee8cc1Swenshuai.xi }
5271*53ee8cc1Swenshuai.xi }
5272*53ee8cc1Swenshuai.xi
5273*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5274*53ee8cc1Swenshuai.xi /// Check current PID filter owner
5275*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5276*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of PID filter
5277*53ee8cc1Swenshuai.xi /// @return TSP_Result
5278*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5279*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_ChkOwner(MS_U32 u32EngId, MS_U32 u32PidFltId)
5280*53ee8cc1Swenshuai.xi {
5281*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5282*53ee8cc1Swenshuai.xi
5283*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] == E_DRVTSP_FLT_STATE_NA)
5284*53ee8cc1Swenshuai.xi {
5285*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5286*53ee8cc1Swenshuai.xi }
5287*53ee8cc1Swenshuai.xi
5288*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5289*53ee8cc1Swenshuai.xi }
5290*53ee8cc1Swenshuai.xi
5291*53ee8cc1Swenshuai.xi //only for debug
5292*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_PVREnable(MS_U32 u32EngId, MS_U32 u32PidFltId)
5293*53ee8cc1Swenshuai.xi {
5294*53ee8cc1Swenshuai.xi #ifndef NO_PVR
5295*53ee8cc1Swenshuai.xi REG_PidFlt* pPidFilter= NULL;
5296*53ee8cc1Swenshuai.xi
5297*53ee8cc1Swenshuai.xi pPidFilter= HAL_TSP_GetPidFltReg(u32EngId, u32PidFltId);
5298*53ee8cc1Swenshuai.xi
5299*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_PVREnable(pPidFilter);
5300*53ee8cc1Swenshuai.xi
5301*53ee8cc1Swenshuai.xi return DRVTSP_OK;
5302*53ee8cc1Swenshuai.xi #else
5303*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
5304*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
5305*53ee8cc1Swenshuai.xi }
5306*53ee8cc1Swenshuai.xi
5307*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5308*53ee8cc1Swenshuai.xi /// Change PID filter source
5309*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5310*53ee8cc1Swenshuai.xi /// @param eFilterType \b IN: index of filter to be enable
5311*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: New filter source type to change
5312*53ee8cc1Swenshuai.xi /// @return TSP_Result
5313*53ee8cc1Swenshuai.xi /// @note
5314*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5315*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_ChangeSource(MS_U32 u32EngId, MS_U32 u32PidFltId, DrvTSP_FltType eFilterType)
5316*53ee8cc1Swenshuai.xi {
5317*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5318*53ee8cc1Swenshuai.xi if ((eFilterType&E_DRVTSP_FLT_SOURCE_TYPE_MASK) == E_DRVTSP_FLT_SOURCE_TYPE_LIVE)
5319*53ee8cc1Swenshuai.xi {
5320*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId] = E_DRVTSP_FLT_SOURCE_TYPE_LIVE;
5321*53ee8cc1Swenshuai.xi }
5322*53ee8cc1Swenshuai.xi else if ((eFilterType&E_DRVTSP_FLT_SOURCE_TYPE_MASK) == E_DRVTSP_FLT_SOURCE_TYPE_FILE)
5323*53ee8cc1Swenshuai.xi {
5324*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId] = E_DRVTSP_FLT_SOURCE_TYPE_FILE;
5325*53ee8cc1Swenshuai.xi }
5326*53ee8cc1Swenshuai.xi else if ((eFilterType&E_DRVTSP_FLT_SOURCE_TYPE_MASK) == E_DRVTSP_FLT_SOURCE_TYPE_TS2)
5327*53ee8cc1Swenshuai.xi {
5328*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId] = E_DRVTSP_FLT_SOURCE_TYPE_TS2;
5329*53ee8cc1Swenshuai.xi }
5330*53ee8cc1Swenshuai.xi
5331*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5332*53ee8cc1Swenshuai.xi }
5333*53ee8cc1Swenshuai.xi
5334*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5335*53ee8cc1Swenshuai.xi /// Get PID filter scramble status
5336*53ee8cc1Swenshuai.xi /// @param FltSrc \b IN : Filter source
5337*53ee8cc1Swenshuai.xi /// @param u32FltGroupId \b IN : Pid filter group id, every 32 filter for 1 group. 0: filter 0~31, 1: 32~63
5338*53ee8cc1Swenshuai.xi /// @param PidFltId \b IN : Pid filter id for getting. If 0xFFFFFFFF, means getting the status of all filters of the same group
5339*53ee8cc1Swenshuai.xi /// @param pu32ScmbSts \b OUT : The scrmabling status of pid filter. If getting all group status, every bit means one status of every filter
5340*53ee8cc1Swenshuai.xi /// If only checking one filter, 1 means scrambled status and 0 means non-scrambled status
5341*53ee8cc1Swenshuai.xi /// @return TSP_Result
5342*53ee8cc1Swenshuai.xi /// @note
5343*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5344*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_GetScmbSts(DrvTSP_FltType FltSrc, MS_U32 u32FltGroupId, MS_U32 PidFltId, MS_U32 *pu32ScmbSts)
5345*53ee8cc1Swenshuai.xi {
5346*53ee8cc1Swenshuai.xi MS_U32 u32Src = 0;
5347*53ee8cc1Swenshuai.xi
5348*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5349*53ee8cc1Swenshuai.xi
5350*53ee8cc1Swenshuai.xi *pu32ScmbSts = 0;
5351*53ee8cc1Swenshuai.xi
5352*53ee8cc1Swenshuai.xi switch(FltSrc)
5353*53ee8cc1Swenshuai.xi {
5354*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_LIVE:
5355*53ee8cc1Swenshuai.xi u32Src = 0;
5356*53ee8cc1Swenshuai.xi break;
5357*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE:
5358*53ee8cc1Swenshuai.xi u32Src = 1;
5359*53ee8cc1Swenshuai.xi break;
5360*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS2:
5361*53ee8cc1Swenshuai.xi *pu32ScmbSts = 0;
5362*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5363*53ee8cc1Swenshuai.xi default:
5364*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_INVALID_PARAM);
5365*53ee8cc1Swenshuai.xi }
5366*53ee8cc1Swenshuai.xi
5367*53ee8cc1Swenshuai.xi *pu32ScmbSts = HAL_TSP_Scmb_Status(u32Src, u32FltGroupId, PidFltId);
5368*53ee8cc1Swenshuai.xi
5369*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5370*53ee8cc1Swenshuai.xi }
5371*53ee8cc1Swenshuai.xi
5372*53ee8cc1Swenshuai.xi
5373*53ee8cc1Swenshuai.xi // SecFlt API
5374*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5375*53ee8cc1Swenshuai.xi /// Allocate a section filter of a PID filter
5376*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5377*53ee8cc1Swenshuai.xi /// @param pu32SecFltId \b OUT: pointer of section filter id return
5378*53ee8cc1Swenshuai.xi /// @return TSP_Result
5379*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5380*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_Alloc(MS_U32 u32EngId, MS_U32 *pu32SecFltId)
5381*53ee8cc1Swenshuai.xi {
5382*53ee8cc1Swenshuai.xi MS_U32 u32SecBufId;
5383*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
5384*53ee8cc1Swenshuai.xi
5385*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5386*53ee8cc1Swenshuai.xi
5387*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM > u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5388*53ee8cc1Swenshuai.xi TSP_ASSERT2(pu32SecFltId, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
5389*53ee8cc1Swenshuai.xi
5390*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
5391*53ee8cc1Swenshuai.xi if(*pu32SecFltId >= TSP_SECFLT_NUM)
5392*53ee8cc1Swenshuai.xi {
5393*53ee8cc1Swenshuai.xi *pu32SecFltId -= TSP_PIDFLT1_NUM;
5394*53ee8cc1Swenshuai.xi }
5395*53ee8cc1Swenshuai.xi #endif
5396*53ee8cc1Swenshuai.xi
5397*53ee8cc1Swenshuai.xi if (FALSE== _TSP_SecFlt_Alloc(u32EngId, E_DRVTSP_FLT_TYPE_SECTION, pu32SecFltId))
5398*53ee8cc1Swenshuai.xi {
5399*53ee8cc1Swenshuai.xi TSP_ASSERT2(0, TSP_DBG("[TSP_ERROR][%06d] Allocate section filter fail\n", __LINE__));
5400*53ee8cc1Swenshuai.xi }
5401*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> *pu32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)*pu32SecFltId));
5402*53ee8cc1Swenshuai.xi u32SecBufId = *pu32SecFltId;
5403*53ee8cc1Swenshuai.xi if (FALSE == _TSP_SecBuf_Alloc(u32EngId, &u32SecBufId))
5404*53ee8cc1Swenshuai.xi {
5405*53ee8cc1Swenshuai.xi TSP_ASSERT2(0, TSP_DBG("[TSP_ERROR][%06d] Allocate section buffer fail\n", __LINE__));
5406*53ee8cc1Swenshuai.xi }
5407*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECBUF_NUM > u32SecBufId, TSP_DBG("[TSP_ERROR][%06d] Bad SecBufId %d\n", __LINE__, (unsigned int)u32SecBufId));
5408*53ee8cc1Swenshuai.xi TSP_ASSERT2(u32SecBufId == *pu32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId/SecFltId alignment\n", __LINE__));
5409*53ee8cc1Swenshuai.xi _TSP_SecBuf_Init(u32EngId, u32SecBufId);
5410*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(*pu32SecFltId);
5411*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SelSecBuf(pSecFilter, u32SecBufId, TRUE);
5412*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5413*53ee8cc1Swenshuai.xi }
5414*53ee8cc1Swenshuai.xi
5415*53ee8cc1Swenshuai.xi
5416*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5417*53ee8cc1Swenshuai.xi /// Free a section filter of a PID filter
5418*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5419*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: section filter of TSP to be free
5420*53ee8cc1Swenshuai.xi /// @return TSP_Result
5421*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5422*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_Free(MS_U32 u32EngId, MS_U32 u32SecFltId)
5423*53ee8cc1Swenshuai.xi {
5424*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5425*53ee8cc1Swenshuai.xi
5426*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5427*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)u32SecFltId));
5428*53ee8cc1Swenshuai.xi TSP_ASSERT2(E_DRVTSP_FLT_STATE_FREE!= _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId],
5429*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%06d] Bad SecFlt state\n", __LINE__));
5430*53ee8cc1Swenshuai.xi
5431*53ee8cc1Swenshuai.xi _TSP_SecBuf_Free(u32EngId, u32SecFltId);
5432*53ee8cc1Swenshuai.xi _TSP_SecFlt_Free(u32EngId, u32SecFltId, TRUE);
5433*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5434*53ee8cc1Swenshuai.xi }
5435*53ee8cc1Swenshuai.xi
5436*53ee8cc1Swenshuai.xi
5437*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5438*53ee8cc1Swenshuai.xi //[Reserved]
5439*53ee8cc1Swenshuai.xi // Set section filtering mode
5440*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5441*53ee8cc1Swenshuai.xi // @param u32SecFltId \b IN: section filter of TSP to be free
5442*53ee8cc1Swenshuai.xi // @param eSecFltMode \b IN: continue/one-shot mode of section filter
5443*53ee8cc1Swenshuai.xi // @return TSP_Result
5444*53ee8cc1Swenshuai.xi // @attention
5445*53ee8cc1Swenshuai.xi // One-shot filter has the disadvantage of interrupt lost becuase it stops filter, a timeout
5446*53ee8cc1Swenshuai.xi // to check filter status is better for usage.
5447*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5448*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_SetMode(MS_U32 u32EngId, MS_U32 u32SecFltId, DrvTSP_FltMode eSecFltMode)
5449*53ee8cc1Swenshuai.xi {
5450*53ee8cc1Swenshuai.xi MS_U32 uMode = 0;
5451*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
5452*53ee8cc1Swenshuai.xi
5453*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5454*53ee8cc1Swenshuai.xi
5455*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5456*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)u32SecFltId));
5457*53ee8cc1Swenshuai.xi
5458*53ee8cc1Swenshuai.xi if (eSecFltMode & E_DRVTSP_FLT_MODE_ONESHOT)
5459*53ee8cc1Swenshuai.xi {
5460*53ee8cc1Swenshuai.xi uMode |= TSP_SECFLT_MODE_ONESHOT;
5461*53ee8cc1Swenshuai.xi }
5462*53ee8cc1Swenshuai.xi
5463*53ee8cc1Swenshuai.xi if (eSecFltMode & E_DRVTSP_FLT_MODE_CRCCHK)
5464*53ee8cc1Swenshuai.xi {
5465*53ee8cc1Swenshuai.xi uMode |= TSP_SECFLT_MODE_CRCCHK;
5466*53ee8cc1Swenshuai.xi }
5467*53ee8cc1Swenshuai.xi
5468*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltMode[u32SecFltId] = eSecFltMode;
5469*53ee8cc1Swenshuai.xi
5470*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetMode(pSecFilter, uMode);
5471*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5472*53ee8cc1Swenshuai.xi }
5473*53ee8cc1Swenshuai.xi
5474*53ee8cc1Swenshuai.xi
5475*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5476*53ee8cc1Swenshuai.xi /// Set Match/Mask filter pattern of section filter
5477*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5478*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of filter to be set pattern
5479*53ee8cc1Swenshuai.xi /// @param pu8Match \b IN: pointer of filter pattern (in @ref DRVTSP_FILTER_DEPTH bytes)
5480*53ee8cc1Swenshuai.xi /// @param pu8Mask \b IN: pointer of pattern bitmask (in @ref DRVTSP_FILTER_DEPTH bytes)
5481*53ee8cc1Swenshuai.xi /// @param bNotMatch \b IN: negative the result of comparion of filter
5482*53ee8cc1Swenshuai.xi /// @return TSP_Result
5483*53ee8cc1Swenshuai.xi /// note: match mask -- must set 0 to be compare (customer request)
5484*53ee8cc1Swenshuai.xi /// not match mask -- must set 1 to compare
5485*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5486*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_SetPattern(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_U8 *pu8Match, MS_U8 *pu8Mask, MS_U8 *pu8NotMask)
5487*53ee8cc1Swenshuai.xi {
5488*53ee8cc1Swenshuai.xi int i = 0;
5489*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
5490*53ee8cc1Swenshuai.xi
5491*53ee8cc1Swenshuai.xi if((pu8Match == NULL) || (pu8Mask == NULL) || (pu8NotMask == NULL))
5492*53ee8cc1Swenshuai.xi {
5493*53ee8cc1Swenshuai.xi return (DRVTSP_INVALID_PARAM);
5494*53ee8cc1Swenshuai.xi }
5495*53ee8cc1Swenshuai.xi
5496*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5497*53ee8cc1Swenshuai.xi
5498*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5499*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)u32SecFltId));
5500*53ee8cc1Swenshuai.xi
5501*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
5502*53ee8cc1Swenshuai.xi for (i = 0 ; i < 16 ; i++)
5503*53ee8cc1Swenshuai.xi {
5504*53ee8cc1Swenshuai.xi *(pu8Mask+i) = 0xFF^(*(pu8Mask+i));
5505*53ee8cc1Swenshuai.xi }
5506*53ee8cc1Swenshuai.xi
5507*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetMask(pSecFilter, pu8Mask);
5508*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetMatch(pSecFilter, pu8Match);
5509*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetNMask(pSecFilter, pu8NotMask);
5510*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5511*53ee8cc1Swenshuai.xi }
5512*53ee8cc1Swenshuai.xi
5513*53ee8cc1Swenshuai.xi
5514*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5515*53ee8cc1Swenshuai.xi /// Reset the section buffer read/write pointer to start address and resolve overflow condition
5516*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5517*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer to be reset
5518*53ee8cc1Swenshuai.xi /// @return TSP_Result
5519*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5520*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_ResetBuffer(MS_U32 u32EngId, MS_U32 u32SecFltId)
5521*53ee8cc1Swenshuai.xi {
5522*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
5523*53ee8cc1Swenshuai.xi
5524*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5525*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5526*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)u32SecFltId));
5527*53ee8cc1Swenshuai.xi // Richard: Be careful since it works based the assumption that SecFltId is equal to SecBufId
5528*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
5529*53ee8cc1Swenshuai.xi
5530*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_ResetBuffer(pSecFilter);
5531*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_ResetState(pSecFilter);
5532*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_ResetEmmIdx(pSecFilter);
5533*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5534*53ee8cc1Swenshuai.xi }
5535*53ee8cc1Swenshuai.xi
5536*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5537*53ee8cc1Swenshuai.xi /// Set buffer start address and buffer size to section buffer
5538*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5539*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer to be set
5540*53ee8cc1Swenshuai.xi /// @param u32StartAddr \b IN: start address of section buffer
5541*53ee8cc1Swenshuai.xi /// @param u32BufSize \b IN: size of section buffer
5542*53ee8cc1Swenshuai.xi /// @return TSP_Result
5543*53ee8cc1Swenshuai.xi /// @note
5544*53ee8cc1Swenshuai.xi /// Buffer start address and buffer size should be 128-bit (16-byte) aligned.\n
5545*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PidFlt_Alloc
5546*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5547*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_SetBuffer(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_PHY phyStartAddr, MS_U32 u32BufSize)
5548*53ee8cc1Swenshuai.xi {
5549*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
5550*53ee8cc1Swenshuai.xi
5551*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5552*53ee8cc1Swenshuai.xi
5553*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5554*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)u32SecFltId));
5555*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
5556*53ee8cc1Swenshuai.xi
5557*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_SetBuffer(pSecFilter, phyStartAddr, u32BufSize);
5558*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5559*53ee8cc1Swenshuai.xi }
5560*53ee8cc1Swenshuai.xi
5561*53ee8cc1Swenshuai.xi
5562*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5563*53ee8cc1Swenshuai.xi /// Set request data size to trigger interrupt
5564*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5565*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer to be set
5566*53ee8cc1Swenshuai.xi /// @param u32ReqCount \b IN: received data size to trigger interrupt
5567*53ee8cc1Swenshuai.xi /// @return TSP_Result
5568*53ee8cc1Swenshuai.xi /// @note
5569*53ee8cc1Swenshuai.xi /// TSP always calls section callback function when a completed section data is
5570*53ee8cc1Swenshuai.xi /// ready at section buffer.
5571*53ee8cc1Swenshuai.xi /// It can set a request value other than 0 and TSP will also notify user when
5572*53ee8cc1Swenshuai.xi /// request size of data is ready at buffer. Only support @ref E_DRVTSP_FLT_TYPE_PES.
5573*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_SecFlt_Notify
5574*53ee8cc1Swenshuai.xi /// @attention
5575*53ee8cc1Swenshuai.xi /// The maximum request count is 0xFFFF
5576*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5577*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_SetReqCount(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_U32 u32ReqCount)
5578*53ee8cc1Swenshuai.xi {
5579*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
5580*53ee8cc1Swenshuai.xi
5581*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5582*53ee8cc1Swenshuai.xi
5583*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5584*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)u32SecFltId));
5585*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
5586*53ee8cc1Swenshuai.xi
5587*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetReqCount(pSecFilter, u32ReqCount);
5588*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5589*53ee8cc1Swenshuai.xi }
5590*53ee8cc1Swenshuai.xi
5591*53ee8cc1Swenshuai.xi
5592*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5593*53ee8cc1Swenshuai.xi /// Set ECM index
5594*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5595*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer
5596*53ee8cc1Swenshuai.xi /// @param u32EcmIdx \b IN: Index of ECM
5597*53ee8cc1Swenshuai.xi /// @return TSP_Result
5598*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5599*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_SetEcmIdx(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_U32 u32EcmIdx)
5600*53ee8cc1Swenshuai.xi {
5601*53ee8cc1Swenshuai.xi #if 0
5602*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5603*53ee8cc1Swenshuai.xi
5604*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %ld\n", __LINE__, u32EngId));
5605*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %ld\n", __LINE__, u32SecFltId));
5606*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
5607*53ee8cc1Swenshuai.xi
5608*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetEcmIdx(pSecFilter, u32EcmIdx);
5609*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5610*53ee8cc1Swenshuai.xi #else
5611*53ee8cc1Swenshuai.xi return DRVTSP_OK;
5612*53ee8cc1Swenshuai.xi #endif
5613*53ee8cc1Swenshuai.xi }
5614*53ee8cc1Swenshuai.xi
5615*53ee8cc1Swenshuai.xi
5616*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5617*53ee8cc1Swenshuai.xi /// Get buffer start address of setction buffer
5618*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5619*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer
5620*53ee8cc1Swenshuai.xi /// @param pu32BufStart \b OUT: pointer of buffer start address return
5621*53ee8cc1Swenshuai.xi /// @return TSP_Result
5622*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5623*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_GetBufStart(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_PHY *pphyBufStart)
5624*53ee8cc1Swenshuai.xi {
5625*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
5626*53ee8cc1Swenshuai.xi
5627*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5628*53ee8cc1Swenshuai.xi
5629*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5630*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)u32SecFltId));
5631*53ee8cc1Swenshuai.xi TSP_ASSERT2(pphyBufStart, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
5632*53ee8cc1Swenshuai.xi
5633*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
5634*53ee8cc1Swenshuai.xi
5635*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_STATE_FREE == _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId])
5636*53ee8cc1Swenshuai.xi {
5637*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5638*53ee8cc1Swenshuai.xi }
5639*53ee8cc1Swenshuai.xi *pphyBufStart= HAL_TSP_SecBuf_GetBufStart(pSecFilter);
5640*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5641*53ee8cc1Swenshuai.xi }
5642*53ee8cc1Swenshuai.xi
5643*53ee8cc1Swenshuai.xi
5644*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5645*53ee8cc1Swenshuai.xi /// Get buffer size of section buffer
5646*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5647*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer
5648*53ee8cc1Swenshuai.xi /// @param pu32BufSize \b OUT: pointer of buffer size return
5649*53ee8cc1Swenshuai.xi /// @return TSP_Result
5650*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5651*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_GetBufSize(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_U32 *pu32BufSize)
5652*53ee8cc1Swenshuai.xi {
5653*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
5654*53ee8cc1Swenshuai.xi
5655*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5656*53ee8cc1Swenshuai.xi
5657*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5658*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)u32SecFltId));
5659*53ee8cc1Swenshuai.xi TSP_ASSERT2(pu32BufSize, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
5660*53ee8cc1Swenshuai.xi
5661*53ee8cc1Swenshuai.xi *pu32BufSize = 0;
5662*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_STATE_FREE == _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId])
5663*53ee8cc1Swenshuai.xi {
5664*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5665*53ee8cc1Swenshuai.xi }
5666*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
5667*53ee8cc1Swenshuai.xi
5668*53ee8cc1Swenshuai.xi *pu32BufSize= (MS_U32)(HAL_TSP_SecBuf_GetBufEnd(pSecFilter)- HAL_TSP_SecBuf_GetBufStart(pSecFilter));
5669*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5670*53ee8cc1Swenshuai.xi }
5671*53ee8cc1Swenshuai.xi
5672*53ee8cc1Swenshuai.xi
5673*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5674*53ee8cc1Swenshuai.xi /// Get current read address of section buffer
5675*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5676*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer
5677*53ee8cc1Swenshuai.xi /// @param pu32ReadAddr \b OUT: pointer of address return
5678*53ee8cc1Swenshuai.xi /// @return TSP_Result
5679*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5680*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_GetReadAddr(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_PHY *pphyReadAddr)
5681*53ee8cc1Swenshuai.xi {
5682*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
5683*53ee8cc1Swenshuai.xi
5684*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5685*53ee8cc1Swenshuai.xi
5686*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5687*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)u32SecFltId));
5688*53ee8cc1Swenshuai.xi TSP_ASSERT2(pphyReadAddr, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
5689*53ee8cc1Swenshuai.xi
5690*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_STATE_FREE == _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId])
5691*53ee8cc1Swenshuai.xi {
5692*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5693*53ee8cc1Swenshuai.xi }
5694*53ee8cc1Swenshuai.xi
5695*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
5696*53ee8cc1Swenshuai.xi
5697*53ee8cc1Swenshuai.xi // move write point to read point while E_DRVTSP_FLT_MODE_AUTO_ADDR mode
5698*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].SecFltMode[u32SecFltId]&E_DRVTSP_FLT_MODE_AUTO_ADDR)
5699*53ee8cc1Swenshuai.xi {
5700*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_SetBufRead(pSecFilter, HAL_TSP_SecBuf_GetBufWrite(pSecFilter));
5701*53ee8cc1Swenshuai.xi }
5702*53ee8cc1Swenshuai.xi *pphyReadAddr= HAL_TSP_SecBuf_GetBufRead(pSecFilter);
5703*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5704*53ee8cc1Swenshuai.xi }
5705*53ee8cc1Swenshuai.xi
5706*53ee8cc1Swenshuai.xi
5707*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5708*53ee8cc1Swenshuai.xi /// Get current section data write address of section buffer
5709*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5710*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer
5711*53ee8cc1Swenshuai.xi /// @param pu32WriteAddr \b OUT: pointer of address return
5712*53ee8cc1Swenshuai.xi /// @return TSP_Result
5713*53ee8cc1Swenshuai.xi /// @note
5714*53ee8cc1Swenshuai.xi /// User can get current write address to know where is the end of section data
5715*53ee8cc1Swenshuai.xi /// received in the section buffer.
5716*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5717*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_GetWriteAddr(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_PHY *pphyWriteAddr)
5718*53ee8cc1Swenshuai.xi {
5719*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
5720*53ee8cc1Swenshuai.xi
5721*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5722*53ee8cc1Swenshuai.xi
5723*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5724*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)u32SecFltId));
5725*53ee8cc1Swenshuai.xi TSP_ASSERT2(pphyWriteAddr, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
5726*53ee8cc1Swenshuai.xi
5727*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_STATE_FREE == _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId])
5728*53ee8cc1Swenshuai.xi {
5729*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5730*53ee8cc1Swenshuai.xi }
5731*53ee8cc1Swenshuai.xi
5732*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
5733*53ee8cc1Swenshuai.xi
5734*53ee8cc1Swenshuai.xi // move write point to read point while E_DRVTSP_FLT_MODE_AUTO_ADDR mode
5735*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].SecFltMode[u32SecFltId]&E_DRVTSP_FLT_MODE_AUTO_ADDR)
5736*53ee8cc1Swenshuai.xi {
5737*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_SetBufRead(pSecFilter, HAL_TSP_SecBuf_GetBufWrite(pSecFilter));
5738*53ee8cc1Swenshuai.xi }
5739*53ee8cc1Swenshuai.xi *pphyWriteAddr= HAL_TSP_SecBuf_GetBufWrite(pSecFilter);
5740*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5741*53ee8cc1Swenshuai.xi }
5742*53ee8cc1Swenshuai.xi
5743*53ee8cc1Swenshuai.xi
5744*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5745*53ee8cc1Swenshuai.xi /// Set current read address of section buffer
5746*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5747*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer
5748*53ee8cc1Swenshuai.xi /// @param u32ReadAddr \b IN: address of read pointer
5749*53ee8cc1Swenshuai.xi /// @return TSP_Result
5750*53ee8cc1Swenshuai.xi /// @note
5751*53ee8cc1Swenshuai.xi /// User can update the read address to notify TSP where is the end of section
5752*53ee8cc1Swenshuai.xi /// data already read back by user.
5753*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5754*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_SetReadAddr(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_PHY phyReadAddr)
5755*53ee8cc1Swenshuai.xi {
5756*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
5757*53ee8cc1Swenshuai.xi
5758*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5759*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5760*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)u32SecFltId));
5761*53ee8cc1Swenshuai.xi
5762*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_STATE_FREE == _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId])
5763*53ee8cc1Swenshuai.xi {
5764*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5765*53ee8cc1Swenshuai.xi }
5766*53ee8cc1Swenshuai.xi
5767*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
5768*53ee8cc1Swenshuai.xi
5769*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_SetBufRead(pSecFilter, phyReadAddr);
5770*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5771*53ee8cc1Swenshuai.xi }
5772*53ee8cc1Swenshuai.xi
5773*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5774*53ee8cc1Swenshuai.xi /// Subscribe event notification callback function for specified section filter
5775*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5776*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer
5777*53ee8cc1Swenshuai.xi /// @param eEvents \b IN: events need to be subscribed\n
5778*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_EVENT_DATA_READY\n
5779*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_EVENT_BUF_OVERFLOW
5780*53ee8cc1Swenshuai.xi /// @param pfCallback \b IN: callback function (NULL to disable)
5781*53ee8cc1Swenshuai.xi /// @return TSP_Result
5782*53ee8cc1Swenshuai.xi /// @note
5783*53ee8cc1Swenshuai.xi /// This function register a callback function for a section filter to TSP.
5784*53ee8cc1Swenshuai.xi /// TSP calls callback function each time when data is ready in section buffer.\n
5785*53ee8cc1Swenshuai.xi /// Data ready of section filter:\n
5786*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_SECTION : a section ready\n
5787*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_PES : PES packet ready or received data over than request size.
5788*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_SecFlt_SetReqCount
5789*53ee8cc1Swenshuai.xi /// @attention
5790*53ee8cc1Swenshuai.xi /// Callback function resides in OS TSP interrupt context, it recommends
5791*53ee8cc1Swenshuai.xi /// that callback function should not take too much time to block the system.
5792*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5793*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_Notify(MS_U32 u32EngId, MS_U32 u32SecFltId, DrvTSP_Event eEvents, P_DrvTSP_EvtCallback pfCallback)
5794*53ee8cc1Swenshuai.xi {
5795*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5796*53ee8cc1Swenshuai.xi
5797*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5798*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__,(unsigned int)u32SecFltId));
5799*53ee8cc1Swenshuai.xi
5800*53ee8cc1Swenshuai.xi if ((eEvents & (E_DRVTSP_EVENT_DATA_READY |
5801*53ee8cc1Swenshuai.xi E_DRVTSP_EVENT_BUF_OVERFLOW | E_DRVTSP_EVENT_SEC_CRCERR)) == 0)
5802*53ee8cc1Swenshuai.xi {
5803*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5804*53ee8cc1Swenshuai.xi }
5805*53ee8cc1Swenshuai.xi
5806*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] = eEvents;
5807*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltCallback[u32SecFltId] = pfCallback;
5808*53ee8cc1Swenshuai.xi
5809*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5810*53ee8cc1Swenshuai.xi }
5811*53ee8cc1Swenshuai.xi
5812*53ee8cc1Swenshuai.xi
5813*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5814*53ee8cc1Swenshuai.xi //[Reserved]
5815*53ee8cc1Swenshuai.xi // Get current section filter status
5816*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5817*53ee8cc1Swenshuai.xi // @param u32SecFltId \b IN: index of section filter
5818*53ee8cc1Swenshuai.xi // @param peState \b OUT: current ORed state flag of section filter
5819*53ee8cc1Swenshuai.xi // E_DRVTSP_FLT_STATE_ALLOC\n
5820*53ee8cc1Swenshuai.xi // E_DRVTSP_FLT_STATE_ENABLE\n
5821*53ee8cc1Swenshuai.xi // E_DRVTSP_FLT_STATE_OVERFLOW
5822*53ee8cc1Swenshuai.xi // @return TSP_Result
5823*53ee8cc1Swenshuai.xi // @note
5824*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5825*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_GetState(MS_U32 u32EngId, MS_U32 u32SecFltId, DrvTSP_FltState *peState)
5826*53ee8cc1Swenshuai.xi {
5827*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5828*53ee8cc1Swenshuai.xi
5829*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5830*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)u32SecFltId));
5831*53ee8cc1Swenshuai.xi TSP_ASSERT2(peState, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
5832*53ee8cc1Swenshuai.xi
5833*53ee8cc1Swenshuai.xi if (_TSP_SecFlt_StateGet(u32EngId, u32SecFltId, peState))
5834*53ee8cc1Swenshuai.xi {
5835*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5836*53ee8cc1Swenshuai.xi }
5837*53ee8cc1Swenshuai.xi else
5838*53ee8cc1Swenshuai.xi {
5839*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5840*53ee8cc1Swenshuai.xi }
5841*53ee8cc1Swenshuai.xi }
5842*53ee8cc1Swenshuai.xi
5843*53ee8cc1Swenshuai.xi
5844*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_TTX_SecFlt_GetWriteAddr(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_PHY *pphyWriteAddr)
5845*53ee8cc1Swenshuai.xi {
5846*53ee8cc1Swenshuai.xi REG_SecFlt *pSecFilter = NULL;
5847*53ee8cc1Swenshuai.xi
5848*53ee8cc1Swenshuai.xi TSP_ASSERT(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %d\n", __LINE__, (unsigned int)u32EngId));
5849*53ee8cc1Swenshuai.xi TSP_ASSERT(TSP_SECFLT_NUM_All> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %d\n", __LINE__, (unsigned int)u32SecFltId));
5850*53ee8cc1Swenshuai.xi TSP_ASSERT(pphyWriteAddr, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
5851*53ee8cc1Swenshuai.xi // move write point to read point while E_DRVTSP_FLT_MODE_AUTO_ADDR mode
5852*53ee8cc1Swenshuai.xi
5853*53ee8cc1Swenshuai.xi pSecFilter = _TSP_GET_SECFLT_REG(u32SecFltId);
5854*53ee8cc1Swenshuai.xi
5855*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].SecFltMode[u32SecFltId]&E_DRVTSP_FLT_MODE_AUTO_ADDR)
5856*53ee8cc1Swenshuai.xi {
5857*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_SetBufRead_tmp(pSecFilter, HAL_TSP_SecBuf_GetBufWrite_tmp(pSecFilter));
5858*53ee8cc1Swenshuai.xi }
5859*53ee8cc1Swenshuai.xi *pphyWriteAddr= HAL_TSP_SecBuf_GetBufWrite_tmp(pSecFilter);
5860*53ee8cc1Swenshuai.xi return DRVTSP_OK;
5861*53ee8cc1Swenshuai.xi }
5862*53ee8cc1Swenshuai.xi
5863*53ee8cc1Swenshuai.xi
5864*53ee8cc1Swenshuai.xi // PVR API
5865*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5866*53ee8cc1Swenshuai.xi /// Set PVR double record buffer start addresses and buffer size
5867*53ee8cc1Swenshuai.xi /// @param u32BufStart0 \b IN: start address of PVR buffer 0
5868*53ee8cc1Swenshuai.xi /// @param u32BufStart1 \b IN: start address of PVR buffer 1
5869*53ee8cc1Swenshuai.xi /// @param u32BufSize0 \b IN: size of PVR buffer 0
5870*53ee8cc1Swenshuai.xi /// @param u32BufSize1 \b IN: size of PVR buffer 1
5871*53ee8cc1Swenshuai.xi /// @return TSP_Result
5872*53ee8cc1Swenshuai.xi /// @note
5873*53ee8cc1Swenshuai.xi /// Buffer start address and size should be 128-bit (16-byte) aligned\n
5874*53ee8cc1Swenshuai.xi /// The maximum support size is 0xFFFF0 (1048560 bytes).
5875*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PVR_Notify
5876*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5877*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_SetBuffer(MS_PHY phyBufStart0, MS_PHY phyBufStart1, MS_U32 u32BufSize0, MS_U32 u32BufSize1)
5878*53ee8cc1Swenshuai.xi {
5879*53ee8cc1Swenshuai.xi #ifndef NO_PVR
5880*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5881*53ee8cc1Swenshuai.xi HAL_TSP_PVR_SetBuffer(phyBufStart0, phyBufStart1, u32BufSize0, u32BufSize1);
5882*53ee8cc1Swenshuai.xi
5883*53ee8cc1Swenshuai.xi // flush PVR buffer
5884*53ee8cc1Swenshuai.xi HAL_TSP_PVR_WaitFlush();
5885*53ee8cc1Swenshuai.xi
5886*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5887*53ee8cc1Swenshuai.xi #else
5888*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
5889*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
5890*53ee8cc1Swenshuai.xi }
5891*53ee8cc1Swenshuai.xi
5892*53ee8cc1Swenshuai.xi
5893*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5894*53ee8cc1Swenshuai.xi /// Set PVR record mode and START/STOP recording.
5895*53ee8cc1Swenshuai.xi /// @param eRecMode \b IN: mode of recording
5896*53ee8cc1Swenshuai.xi /// @param bStart \b IN: TRUE(START), FALSE(STOP)
5897*53ee8cc1Swenshuai.xi /// @return TSP_Result
5898*53ee8cc1Swenshuai.xi /// @note
5899*53ee8cc1Swenshuai.xi /// Parameter eRecMode will be ignored when bStart is FALSE(STOP)\n
5900*53ee8cc1Swenshuai.xi /// @note
5901*53ee8cc1Swenshuai.xi /// It's a synchronous function. When STOP, it flushs internal record fifo
5902*53ee8cc1Swenshuai.xi /// and update current PVR record buffer write address before function return.\n
5903*53ee8cc1Swenshuai.xi /// User can call MDrv_TSP_PVR_GetWriteAddr to get the final valid data address
5904*53ee8cc1Swenshuai.xi /// after recording.
5905*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5906*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Start(DrvTSP_RecMode eRecMode, MS_BOOL bStart)
5907*53ee8cc1Swenshuai.xi {
5908*53ee8cc1Swenshuai.xi #ifndef NO_PVR
5909*53ee8cc1Swenshuai.xi
5910*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5911*53ee8cc1Swenshuai.xi if (bStart)
5912*53ee8cc1Swenshuai.xi {
5913*53ee8cc1Swenshuai.xi //HAL_TSP_PVR_WaitFlush();
5914*53ee8cc1Swenshuai.xi if(eRecMode == E_DRVTSP_REC_MODE_ENG0_FI_BYPASS)
5915*53ee8cc1Swenshuai.xi {
5916*53ee8cc1Swenshuai.xi HAL_TSP_PVR_Filein_Enable(TRUE, TRUE, TRUE);
5917*53ee8cc1Swenshuai.xi HAL_TSP_PVR_All(TRUE);
5918*53ee8cc1Swenshuai.xi }
5919*53ee8cc1Swenshuai.xi else if(eRecMode == E_DRVTSP_REC_MODE_ENG0_FI_FLTTYPE)
5920*53ee8cc1Swenshuai.xi {
5921*53ee8cc1Swenshuai.xi HAL_TSP_PVR_Filein_Enable(TRUE, TRUE, FALSE);
5922*53ee8cc1Swenshuai.xi HAL_TSP_PVR_All(FALSE);
5923*53ee8cc1Swenshuai.xi }
5924*53ee8cc1Swenshuai.xi else if(eRecMode == E_DRVTSP_REC_MODE_ENG0_FLT1CA)
5925*53ee8cc1Swenshuai.xi {
5926*53ee8cc1Swenshuai.xi //HAL_TSP_TSIF1_Enable(TRUE);
5927*53ee8cc1Swenshuai.xi HAL_TSP_PVR_REC_FLT_Enable(TRUE);
5928*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._bPVRCA_Start = TRUE;
5929*53ee8cc1Swenshuai.xi }
5930*53ee8cc1Swenshuai.xi else
5931*53ee8cc1Swenshuai.xi {
5932*53ee8cc1Swenshuai.xi HAL_TSP_PVR_All((HAS_FLAG(eRecMode, 0x02))? TRUE: FALSE);
5933*53ee8cc1Swenshuai.xi }
5934*53ee8cc1Swenshuai.xi //HAL_TSP_LiveAB_En(TRUE); // set pvr to pidflt0_file
5935*53ee8cc1Swenshuai.xi HAL_TSP_PVR_Enable(TRUE);
5936*53ee8cc1Swenshuai.xi }
5937*53ee8cc1Swenshuai.xi else
5938*53ee8cc1Swenshuai.xi {
5939*53ee8cc1Swenshuai.xi //HAL_TSP_PVR_WaitFlush();
5940*53ee8cc1Swenshuai.xi if((eRecMode == E_DRVTSP_REC_MODE_ENG0_FI_BYPASS) || (eRecMode == E_DRVTSP_REC_MODE_ENG0_FI_FLTTYPE))
5941*53ee8cc1Swenshuai.xi {
5942*53ee8cc1Swenshuai.xi HAL_TSP_PVR_Filein_Enable(FALSE, FALSE, FALSE);
5943*53ee8cc1Swenshuai.xi }
5944*53ee8cc1Swenshuai.xi else if(eRecMode == E_DRVTSP_REC_MODE_ENG0_FLT1CA)
5945*53ee8cc1Swenshuai.xi {
5946*53ee8cc1Swenshuai.xi HAL_TSP_PVR_REC_FLT_Enable(FALSE);
5947*53ee8cc1Swenshuai.xi }
5948*53ee8cc1Swenshuai.xi
5949*53ee8cc1Swenshuai.xi //HAL_TSP_LiveAB_En(FALSE); // disable pvr to pidflt0_file
5950*53ee8cc1Swenshuai.xi HAL_TSP_PVR_Enable(FALSE);
5951*53ee8cc1Swenshuai.xi
5952*53ee8cc1Swenshuai.xi HAL_TSP_PVR_WaitFlush();
5953*53ee8cc1Swenshuai.xi
5954*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._bPVRCA_Start = FALSE;
5955*53ee8cc1Swenshuai.xi }
5956*53ee8cc1Swenshuai.xi
5957*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5958*53ee8cc1Swenshuai.xi
5959*53ee8cc1Swenshuai.xi #else
5960*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
5961*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
5962*53ee8cc1Swenshuai.xi }
5963*53ee8cc1Swenshuai.xi
5964*53ee8cc1Swenshuai.xi
5965*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5966*53ee8cc1Swenshuai.xi /// Get final write address of PVR record buffer
5967*53ee8cc1Swenshuai.xi /// @param pu32WriteAddr \b OUT: pointer of address return
5968*53ee8cc1Swenshuai.xi /// @return TSP_Result
5969*53ee8cc1Swenshuai.xi /// @note
5970*53ee8cc1Swenshuai.xi /// User can get current write address to know where is the end of section data
5971*53ee8cc1Swenshuai.xi /// received in the section buffer.
5972*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5973*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_GetWriteAddr(MS_PHY *pu32WriteAddr)
5974*53ee8cc1Swenshuai.xi {
5975*53ee8cc1Swenshuai.xi #ifndef NO_PVR
5976*53ee8cc1Swenshuai.xi
5977*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5978*53ee8cc1Swenshuai.xi
5979*53ee8cc1Swenshuai.xi *pu32WriteAddr = (MS_PHY)HAL_TSP_PVR_GetBufWrite();
5980*53ee8cc1Swenshuai.xi
5981*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5982*53ee8cc1Swenshuai.xi #else
5983*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
5984*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
5985*53ee8cc1Swenshuai.xi }
5986*53ee8cc1Swenshuai.xi
5987*53ee8cc1Swenshuai.xi
5988*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5989*53ee8cc1Swenshuai.xi /// Subscribe event notification callback function for PVR record buffer
5990*53ee8cc1Swenshuai.xi /// @param eEvents \b IN: events need to be subscribed\n
5991*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_EVENT_PVRBUF_FULL
5992*53ee8cc1Swenshuai.xi /// @param pfCallback \b IN: callback function (NULL to disable)
5993*53ee8cc1Swenshuai.xi /// @return TSP_Result
5994*53ee8cc1Swenshuai.xi /// @note
5995*53ee8cc1Swenshuai.xi /// TSP PVR recording uses double buffer mechanism. This function register a callback
5996*53ee8cc1Swenshuai.xi /// function for recording. TSP calls callback function each time when one of
5997*53ee8cc1Swenshuai.xi /// double buffer is full and switch to another buffer to record.\n
5998*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_PVR
5999*53ee8cc1Swenshuai.xi /// @attention
6000*53ee8cc1Swenshuai.xi /// Callback function resides in OS TSP interrupt context, it recommends
6001*53ee8cc1Swenshuai.xi /// that callback function should not take too much time to block the system.
6002*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6003*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Notify(DrvTSP_Event eEvents, P_DrvTSP_EvtCallback pfCallback)
6004*53ee8cc1Swenshuai.xi {
6005*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6006*53ee8cc1Swenshuai.xi
6007*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6008*53ee8cc1Swenshuai.xi
6009*53ee8cc1Swenshuai.xi if(eEvents & (E_DRVTSP_EVENT_PVRBUF_FULL | E_DRVTSP_EVENT_PVRBUF_OVERFLOW))
6010*53ee8cc1Swenshuai.xi {
6011*53ee8cc1Swenshuai.xi if (pfCallback)
6012*53ee8cc1Swenshuai.xi {
6013*53ee8cc1Swenshuai.xi _TSP_SetPvrNotifyId(0);
6014*53ee8cc1Swenshuai.xi HAL_TSP_Int_Enable(TSP_HWINT_HW_PVR_MASK);
6015*53ee8cc1Swenshuai.xi }
6016*53ee8cc1Swenshuai.xi else
6017*53ee8cc1Swenshuai.xi {
6018*53ee8cc1Swenshuai.xi _TSP_RemovePvrNotifyId(0);
6019*53ee8cc1Swenshuai.xi HAL_TSP_Int_Disable(TSP_HWINT_HW_PVR_MASK);
6020*53ee8cc1Swenshuai.xi }
6021*53ee8cc1Swenshuai.xi _ptsp_res->_PvrEvtNotify[0] = eEvents & (E_DRVTSP_EVENT_PVRBUF_FULL | E_DRVTSP_EVENT_PVRBUF_OVERFLOW);
6022*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[0] = pfCallback;
6023*53ee8cc1Swenshuai.xi }
6024*53ee8cc1Swenshuai.xi
6025*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
6026*53ee8cc1Swenshuai.xi if(eEvents & (E_DRVTSP_EVENT_CBBUF_FULL | E_DRVTSP_EVENT_CBBUF_OVERFLOW))
6027*53ee8cc1Swenshuai.xi {
6028*53ee8cc1Swenshuai.xi if (pfCallback)
6029*53ee8cc1Swenshuai.xi {
6030*53ee8cc1Swenshuai.xi _TSP_SetPvrNotifyId(1);
6031*53ee8cc1Swenshuai.xi HAL_TSP_Int2_Enable(TSP_HWINT2_HW_PVR1_MASK);
6032*53ee8cc1Swenshuai.xi }
6033*53ee8cc1Swenshuai.xi else
6034*53ee8cc1Swenshuai.xi {
6035*53ee8cc1Swenshuai.xi _TSP_RemovePvrNotifyId(1);
6036*53ee8cc1Swenshuai.xi HAL_TSP_Int2_Disable((TSP_HWINT2_HW_PVR1_MASK));
6037*53ee8cc1Swenshuai.xi }
6038*53ee8cc1Swenshuai.xi _ptsp_res->_PvrEvtNotify[1] = eEvents & (E_DRVTSP_EVENT_CBBUF_FULL | E_DRVTSP_EVENT_CBBUF_OVERFLOW);
6039*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[1] = pfCallback;
6040*53ee8cc1Swenshuai.xi }
6041*53ee8cc1Swenshuai.xi #endif
6042*53ee8cc1Swenshuai.xi
6043*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6044*53ee8cc1Swenshuai.xi
6045*53ee8cc1Swenshuai.xi #else
6046*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6047*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6048*53ee8cc1Swenshuai.xi }
6049*53ee8cc1Swenshuai.xi
6050*53ee8cc1Swenshuai.xi
6051*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_SetPacketMode(MS_BOOL bSet)
6052*53ee8cc1Swenshuai.xi {
6053*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6054*53ee8cc1Swenshuai.xi
6055*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6056*53ee8cc1Swenshuai.xi HAL_TSP_PVR_PacketMode(bSet);
6057*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6058*53ee8cc1Swenshuai.xi
6059*53ee8cc1Swenshuai.xi #else
6060*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6061*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6062*53ee8cc1Swenshuai.xi }
6063*53ee8cc1Swenshuai.xi
6064*53ee8cc1Swenshuai.xi
6065*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6066*53ee8cc1Swenshuai.xi /// PVR time stamp set
6067*53ee8cc1Swenshuai.xi /// @param u32Stamp \b IN: PVR time stamp
6068*53ee8cc1Swenshuai.xi /// @return TSP_Result
6069*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6070*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_TimeStampSetRecordStamp(MS_U32 u32Stamp)
6071*53ee8cc1Swenshuai.xi {
6072*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6073*53ee8cc1Swenshuai.xi
6074*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6075*53ee8cc1Swenshuai.xi HAL_TSP_SetPVRTimeStamp(u32Stamp);
6076*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6077*53ee8cc1Swenshuai.xi
6078*53ee8cc1Swenshuai.xi #else
6079*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6080*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6081*53ee8cc1Swenshuai.xi
6082*53ee8cc1Swenshuai.xi }
6083*53ee8cc1Swenshuai.xi
6084*53ee8cc1Swenshuai.xi
6085*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6086*53ee8cc1Swenshuai.xi /// PVR time stamp get
6087*53ee8cc1Swenshuai.xi /// @param pu32Stamp \b OUT: pointer of PVR time stamp
6088*53ee8cc1Swenshuai.xi /// @return TSP_Result
6089*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6090*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_TimeStampGetRecordStamp(MS_U32* u32Stamp)
6091*53ee8cc1Swenshuai.xi {
6092*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6093*53ee8cc1Swenshuai.xi
6094*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6095*53ee8cc1Swenshuai.xi *u32Stamp = HAL_TSP_GetPVRTimeStamp();
6096*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6097*53ee8cc1Swenshuai.xi
6098*53ee8cc1Swenshuai.xi #else
6099*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6100*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6101*53ee8cc1Swenshuai.xi }
6102*53ee8cc1Swenshuai.xi
6103*53ee8cc1Swenshuai.xi
6104*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6105*53ee8cc1Swenshuai.xi /// Playback time stamp Set
6106*53ee8cc1Swenshuai.xi /// @param pu32Stamp \b IN: Playback time stamp
6107*53ee8cc1Swenshuai.xi /// @return TSP_Result
6108*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6109*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_TimeStampSetPlaybackStamp(MS_U32 u32Stamp)
6110*53ee8cc1Swenshuai.xi {
6111*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6112*53ee8cc1Swenshuai.xi
6113*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6114*53ee8cc1Swenshuai.xi HAL_TSP_SetPlayBackTimeStamp(u32Stamp);
6115*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6116*53ee8cc1Swenshuai.xi
6117*53ee8cc1Swenshuai.xi #else
6118*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6119*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6120*53ee8cc1Swenshuai.xi }
6121*53ee8cc1Swenshuai.xi
6122*53ee8cc1Swenshuai.xi
6123*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6124*53ee8cc1Swenshuai.xi /// Playback time stamp get
6125*53ee8cc1Swenshuai.xi /// @param pu32Stamp \b OUT: pointer of Playback time stamp
6126*53ee8cc1Swenshuai.xi /// @return TSP_Result
6127*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6128*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_TimeStampGetPlaybackStamp(MS_U32* u32Stamp)
6129*53ee8cc1Swenshuai.xi {
6130*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6131*53ee8cc1Swenshuai.xi
6132*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6133*53ee8cc1Swenshuai.xi * u32Stamp = HAL_TSP_GetPlayBackTimeStamp();
6134*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6135*53ee8cc1Swenshuai.xi
6136*53ee8cc1Swenshuai.xi #else
6137*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6138*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6139*53ee8cc1Swenshuai.xi
6140*53ee8cc1Swenshuai.xi }
6141*53ee8cc1Swenshuai.xi
6142*53ee8cc1Swenshuai.xi
6143*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6144*53ee8cc1Swenshuai.xi /// PVR time stamp Enable/Disable
6145*53ee8cc1Swenshuai.xi /// @param pu32Stamp \b IN: Enable/Disable time stamp
6146*53ee8cc1Swenshuai.xi /// @return TSP_Result
6147*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6148*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_TimeStamp(MS_BOOL bEnable)
6149*53ee8cc1Swenshuai.xi {
6150*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6151*53ee8cc1Swenshuai.xi
6152*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6153*53ee8cc1Swenshuai.xi if (bEnable)
6154*53ee8cc1Swenshuai.xi {
6155*53ee8cc1Swenshuai.xi HAL_TSP_FileIn_Set(TRUE);
6156*53ee8cc1Swenshuai.xi //HAL_TSP_ResetTimeStamp();
6157*53ee8cc1Swenshuai.xi }
6158*53ee8cc1Swenshuai.xi else
6159*53ee8cc1Swenshuai.xi {
6160*53ee8cc1Swenshuai.xi HAL_TSP_FileIn_Set(FALSE);
6161*53ee8cc1Swenshuai.xi }
6162*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6163*53ee8cc1Swenshuai.xi
6164*53ee8cc1Swenshuai.xi #else
6165*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6166*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6167*53ee8cc1Swenshuai.xi }
6168*53ee8cc1Swenshuai.xi
6169*53ee8cc1Swenshuai.xi //only for debug
6170*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Filein_Enable(MS_BOOL bBypassHD, MS_BOOL bEnable)
6171*53ee8cc1Swenshuai.xi {
6172*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6173*53ee8cc1Swenshuai.xi
6174*53ee8cc1Swenshuai.xi HAL_TSP_PVR_Filein_Enable(bBypassHD, bEnable, FALSE);
6175*53ee8cc1Swenshuai.xi
6176*53ee8cc1Swenshuai.xi return DRVTSP_OK;
6177*53ee8cc1Swenshuai.xi
6178*53ee8cc1Swenshuai.xi #else
6179*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6180*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6181*53ee8cc1Swenshuai.xi }
6182*53ee8cc1Swenshuai.xi
6183*53ee8cc1Swenshuai.xi //PVRCA API
6184*53ee8cc1Swenshuai.xi // If PVRCA PID open, reserved FLT1 for recording, beforehand for PVRCA start. (PVR1FLT_CAPVR)
6185*53ee8cc1Swenshuai.xi // If PVRCA PID close, reserved FLT1 for release FLT1, beforehand for PVRCA stop. (PVR1FLT_CA)
6186*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_PidFlt_Reserved(MS_U32 Pid, MS_U8* pu8DmxId, MS_BOOL bReserved)
6187*53ee8cc1Swenshuai.xi {
6188*53ee8cc1Swenshuai.xi #ifndef NO_CA
6189*53ee8cc1Swenshuai.xi
6190*53ee8cc1Swenshuai.xi MS_U32 u32ii = (MS_U32)(*pu8DmxId & 0xFF) ;
6191*53ee8cc1Swenshuai.xi MS_U32 u32mask = 0;
6192*53ee8cc1Swenshuai.xi MS_BOOL bFound = FALSE;
6193*53ee8cc1Swenshuai.xi
6194*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6195*53ee8cc1Swenshuai.xi
6196*53ee8cc1Swenshuai.xi if(!bReserved)
6197*53ee8cc1Swenshuai.xi {
6198*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM <= *pu8DmxId, TSP_DBG("[TSP_ERROR][%06d] Bad DMX ID %d\n", __LINE__, (int)(*pu8DmxId)));
6199*53ee8cc1Swenshuai.xi TSP_ASSERT2((TSP_SECFLT_NUM + TSP_PIDFLT1_NUM) > *pu8DmxId, TSP_DBG("[TSP_ERROR][%06d] Bad DMX ID %d\n", __LINE__, (int)(*pu8DmxId)));
6200*53ee8cc1Swenshuai.xi
6201*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(HAL_TSP_GetPidFltReg(0, u32ii), TSP_PIDFLT_OUT_NONE);
6202*53ee8cc1Swenshuai.xi
6203*53ee8cc1Swenshuai.xi u32mask = 1 << (u32ii - TSP_SECFLT_NUM); //bit flag
6204*53ee8cc1Swenshuai.xi if((_ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef & u32mask) == 0)
6205*53ee8cc1Swenshuai.xi {
6206*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(HAL_TSP_GetPidFltReg(0, u32ii), DRVTSP_PID_NULL);
6207*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii - TSP_SECFLT_NUM] = DRVTSP_PID_NULL;
6208*53ee8cc1Swenshuai.xi }
6209*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR &= ~u32mask;
6210*53ee8cc1Swenshuai.xi
6211*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s] Unreserved FLT %ld _u32Flt1Flag_DscmbPVR 0x%lx, _u32Flt1Flag_DscmbRef %lx \n", \
6212*53ee8cc1Swenshuai.xi __FUNCTION__, u32ii, _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR, _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef));
6213*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "_u16Flt1PidList %x , _u16Flt0DscmbPidList %x \n", \
6214*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii - TSP_SECFLT_NUM], _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32ii - TSP_SECFLT_NUM]));
6215*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6216*53ee8cc1Swenshuai.xi }
6217*53ee8cc1Swenshuai.xi else
6218*53ee8cc1Swenshuai.xi {
6219*53ee8cc1Swenshuai.xi *pu8DmxId = 0xFF;
6220*53ee8cc1Swenshuai.xi }
6221*53ee8cc1Swenshuai.xi
6222*53ee8cc1Swenshuai.xi //checking, if PVR pid is set, use the filter for record directly
6223*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_PIDFLT1_NUM; u32ii++)
6224*53ee8cc1Swenshuai.xi {
6225*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii] == Pid)
6226*53ee8cc1Swenshuai.xi {
6227*53ee8cc1Swenshuai.xi bFound = TRUE;
6228*53ee8cc1Swenshuai.xi break;
6229*53ee8cc1Swenshuai.xi }
6230*53ee8cc1Swenshuai.xi }
6231*53ee8cc1Swenshuai.xi
6232*53ee8cc1Swenshuai.xi //finding free PVR1 filters for recording
6233*53ee8cc1Swenshuai.xi if(bFound == FALSE)
6234*53ee8cc1Swenshuai.xi {
6235*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_PIDFLT1_NUM; u32ii++)
6236*53ee8cc1Swenshuai.xi {
6237*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii] == DRVTSP_PID_NULL)
6238*53ee8cc1Swenshuai.xi {
6239*53ee8cc1Swenshuai.xi //set new pid for dscmb pvr
6240*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(HAL_TSP_GetPidFltReg(0, u32ii+TSP_SECFLT_NUM), Pid);
6241*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii] = Pid;
6242*53ee8cc1Swenshuai.xi bFound = TRUE;
6243*53ee8cc1Swenshuai.xi break;
6244*53ee8cc1Swenshuai.xi }
6245*53ee8cc1Swenshuai.xi }
6246*53ee8cc1Swenshuai.xi }
6247*53ee8cc1Swenshuai.xi
6248*53ee8cc1Swenshuai.xi if(bFound == FALSE)
6249*53ee8cc1Swenshuai.xi {
6250*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
6251*53ee8cc1Swenshuai.xi }
6252*53ee8cc1Swenshuai.xi
6253*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR |= (1 << u32ii);
6254*53ee8cc1Swenshuai.xi *pu8DmxId = (MS_U8)(u32ii & 0xFF)+TSP_SECFLT_NUM;
6255*53ee8cc1Swenshuai.xi
6256*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "[%s] FLT %ld PID 0x%lx, _u32Flt1Flag_DscmbPVR 0x%lx\n", __FUNCTION__, u32ii, Pid, _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR));
6257*53ee8cc1Swenshuai.xi PVRCA_DBG(ULOGD("TSP", "_u32Flt1Flag_DscmbRef %lx, _u16Flt1PidList %x , _u16Flt0DscmbPidList %x \n", _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbRef, \
6258*53ee8cc1Swenshuai.xi _ptsp_res->TSPPvrcaParams._u16Flt1PidList[u32ii], _ptsp_res->TSPPvrcaParams._u16Flt0DscmbPidList[u32ii]));
6259*53ee8cc1Swenshuai.xi
6260*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._bPVRCA_Start)
6261*53ee8cc1Swenshuai.xi {
6262*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(HAL_TSP_GetPidFltReg(0, (MS_U32)(*pu8DmxId & 0xFF)), TSP_PIDFLT_OUT_SECFLT);
6263*53ee8cc1Swenshuai.xi }
6264*53ee8cc1Swenshuai.xi
6265*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6266*53ee8cc1Swenshuai.xi
6267*53ee8cc1Swenshuai.xi #else
6268*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6269*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6270*53ee8cc1Swenshuai.xi }
6271*53ee8cc1Swenshuai.xi
6272*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_FLT1_StartRec(MS_BOOL bEnable)
6273*53ee8cc1Swenshuai.xi {
6274*53ee8cc1Swenshuai.xi #ifndef NO_CA
6275*53ee8cc1Swenshuai.xi
6276*53ee8cc1Swenshuai.xi MS_U8 u32ii;
6277*53ee8cc1Swenshuai.xi MS_U32 u32Output;
6278*53ee8cc1Swenshuai.xi MS_U32 u32mask = _ptsp_res->TSPPvrcaParams._u32Flt1Flag_DscmbPVR;
6279*53ee8cc1Swenshuai.xi
6280*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6281*53ee8cc1Swenshuai.xi
6282*53ee8cc1Swenshuai.xi u32Output = TSP_PIDFLT_OUT_NONE;
6283*53ee8cc1Swenshuai.xi
6284*53ee8cc1Swenshuai.xi if(bEnable)
6285*53ee8cc1Swenshuai.xi {
6286*53ee8cc1Swenshuai.xi u32Output = TSP_PIDFLT_OUT_SECFLT;
6287*53ee8cc1Swenshuai.xi }
6288*53ee8cc1Swenshuai.xi
6289*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_PIDFLT1_NUM; u32ii++)
6290*53ee8cc1Swenshuai.xi {
6291*53ee8cc1Swenshuai.xi if(u32mask & 0x01)
6292*53ee8cc1Swenshuai.xi {
6293*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(HAL_TSP_GetPidFltReg(0, (u32ii+TSP_SECFLT_NUM)), u32Output);
6294*53ee8cc1Swenshuai.xi //_bPVRFLT_Opened_Flag[u32ii] = bEnable;
6295*53ee8cc1Swenshuai.xi }
6296*53ee8cc1Swenshuai.xi u32mask >>= 1;
6297*53ee8cc1Swenshuai.xi }
6298*53ee8cc1Swenshuai.xi
6299*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6300*53ee8cc1Swenshuai.xi
6301*53ee8cc1Swenshuai.xi #else
6302*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6303*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6304*53ee8cc1Swenshuai.xi }
6305*53ee8cc1Swenshuai.xi
6306*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVRCA_Close(MS_U8 u8PVRId)
6307*53ee8cc1Swenshuai.xi {
6308*53ee8cc1Swenshuai.xi #ifndef NO_CA
6309*53ee8cc1Swenshuai.xi MS_U32 u32CaCtrl = 0;
6310*53ee8cc1Swenshuai.xi
6311*53ee8cc1Swenshuai.xi if(u8PVRId >= TSP_PVR_IF_NUM)
6312*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
6313*53ee8cc1Swenshuai.xi
6314*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6315*53ee8cc1Swenshuai.xi
6316*53ee8cc1Swenshuai.xi u32CaCtrl = HAL_TSP_CSA_Get_ScrmPath();
6317*53ee8cc1Swenshuai.xi if(u8PVRId == 0)
6318*53ee8cc1Swenshuai.xi {
6319*53ee8cc1Swenshuai.xi if(u32CaCtrl & TSP_CA_OUTPUT_REC)
6320*53ee8cc1Swenshuai.xi {
6321*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._bFLT1Dup_Enable == TRUE)
6322*53ee8cc1Swenshuai.xi {
6323*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(TSP_CA_INPUT_TSIF0_LIVEIN|TSP_CA_OUTPUT_PLAY_LIVE);
6324*53ee8cc1Swenshuai.xi HAL_TSP_TSIF1_Enable(FALSE);
6325*53ee8cc1Swenshuai.xi _TSP_Free_AllFLT1();
6326*53ee8cc1Swenshuai.xi }
6327*53ee8cc1Swenshuai.xi else
6328*53ee8cc1Swenshuai.xi {
6329*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(_ptsp_res->_u32OrgCAMode);
6330*53ee8cc1Swenshuai.xi }
6331*53ee8cc1Swenshuai.xi }
6332*53ee8cc1Swenshuai.xi }
6333*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
6334*53ee8cc1Swenshuai.xi else if(u8PVRId == 1)
6335*53ee8cc1Swenshuai.xi {
6336*53ee8cc1Swenshuai.xi //input source is TS0, Just remove TS2 record, when PVR stop
6337*53ee8cc1Swenshuai.xi //input source is TS0, Just remove TS2 record, when PVR stop
6338*53ee8cc1Swenshuai.xi if((u32CaCtrl & (TSP_CA_OUTPUT_PLAY_LIVE|TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE2)) == (TSP_CA_OUTPUT_PLAY_LIVE|TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE2))
6339*53ee8cc1Swenshuai.xi {
6340*53ee8cc1Swenshuai.xi _TSP_FreeDupDscmbPidFlt(0, 2, u32CaCtrl);
6341*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(u32CaCtrl & ~TSP_CA_OUTPUT_PLAY_LIVE2);
6342*53ee8cc1Swenshuai.xi }
6343*53ee8cc1Swenshuai.xi }
6344*53ee8cc1Swenshuai.xi #endif
6345*53ee8cc1Swenshuai.xi
6346*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6347*53ee8cc1Swenshuai.xi #else
6348*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6349*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6350*53ee8cc1Swenshuai.xi }
6351*53ee8cc1Swenshuai.xi
6352*53ee8cc1Swenshuai.xi // Channel Browser API
6353*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6354*53ee8cc1Swenshuai.xi /// Set Channel Browser record buffer start addresses and buffer size
6355*53ee8cc1Swenshuai.xi /// @param u8PVRId \b IN:PVR ID
6356*53ee8cc1Swenshuai.xi /// @param phyBufStart0 \b IN: start address of PVR buffer 0
6357*53ee8cc1Swenshuai.xi /// @param phyBufStart1 \b IN: start address of PVR buffer 1
6358*53ee8cc1Swenshuai.xi /// @param u32BufSize0 \b IN: size of PVR buffer 0
6359*53ee8cc1Swenshuai.xi /// @param u32BufSize1 \b IN: size of PVR buffer 1
6360*53ee8cc1Swenshuai.xi /// @return TSP_Result
6361*53ee8cc1Swenshuai.xi /// @note: PVR1 only has single buffer
6362*53ee8cc1Swenshuai.xi /// Buffer start address and size should be 128-bit (16-byte) aligned\n
6363*53ee8cc1Swenshuai.xi /// The maximum support size is 0xFFFF0 (1048560 bytes).
6364*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PVR_Notify
6365*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6366*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_SetBuffer(MS_U8 u8PVRId, MS_PHY phyBufStart0, MS_PHY phyBufStart1, MS_U32 u32BufSize0, MS_U32 u32BufSize1)
6367*53ee8cc1Swenshuai.xi {
6368*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6369*53ee8cc1Swenshuai.xi
6370*53ee8cc1Swenshuai.xi switch(u8PVRId)
6371*53ee8cc1Swenshuai.xi {
6372*53ee8cc1Swenshuai.xi case 0:
6373*53ee8cc1Swenshuai.xi return (MDrv_TSP_PVR_SetBuffer(phyBufStart0, phyBufStart1, u32BufSize0, u32BufSize1));
6374*53ee8cc1Swenshuai.xi
6375*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
6376*53ee8cc1Swenshuai.xi case 1:
6377*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6378*53ee8cc1Swenshuai.xi #ifndef TS2_LIVE_SUPPORT
6379*53ee8cc1Swenshuai.xi if((u32BufSize1 > 0) && ((phyBufStart0 + u32BufSize0) == phyBufStart1))
6380*53ee8cc1Swenshuai.xi u32BufSize0 += u32BufSize1;
6381*53ee8cc1Swenshuai.xi #endif
6382*53ee8cc1Swenshuai.xi HAL_TSP_PVR1_SetBuffer((MS_U32)phyBufStart0, u32BufSize0, (MS_U32)phyBufStart1, u32BufSize1);
6383*53ee8cc1Swenshuai.xi
6384*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6385*53ee8cc1Swenshuai.xi #endif
6386*53ee8cc1Swenshuai.xi
6387*53ee8cc1Swenshuai.xi default:
6388*53ee8cc1Swenshuai.xi return (DRVTSP_NOT_SUPPORTED);
6389*53ee8cc1Swenshuai.xi }
6390*53ee8cc1Swenshuai.xi
6391*53ee8cc1Swenshuai.xi #else
6392*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6393*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6394*53ee8cc1Swenshuai.xi
6395*53ee8cc1Swenshuai.xi }
6396*53ee8cc1Swenshuai.xi
6397*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6398*53ee8cc1Swenshuai.xi /// Set Channel Browser record mode and START/STOP recording.
6399*53ee8cc1Swenshuai.xi /// @param u8PVRId \b IN:PVR ID
6400*53ee8cc1Swenshuai.xi /// @param eRecMode \b IN: mode of recording
6401*53ee8cc1Swenshuai.xi /// @param bStart \b IN: TRUE(START), FALSE(STOP)
6402*53ee8cc1Swenshuai.xi /// @return TSP_Result
6403*53ee8cc1Swenshuai.xi /// @note
6404*53ee8cc1Swenshuai.xi /// Parameter eRecMode will be ignored when bStart is FALSE(STOP)\n
6405*53ee8cc1Swenshuai.xi /// @note
6406*53ee8cc1Swenshuai.xi /// It's a synchronous function. When STOP, it flushs internal record fifo
6407*53ee8cc1Swenshuai.xi /// and update current PVR record buffer write address before function return.\n
6408*53ee8cc1Swenshuai.xi /// User can call MDrv_TSP_PVR1_GetWriteAddr to get the final valid data address
6409*53ee8cc1Swenshuai.xi /// after recording.
6410*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6411*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_Start(MS_U8 u8PVRId, DrvTSP_RecMode eRecMode, MS_BOOL bStart)
6412*53ee8cc1Swenshuai.xi {
6413*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6414*53ee8cc1Swenshuai.xi
6415*53ee8cc1Swenshuai.xi if(u8PVRId == 0)
6416*53ee8cc1Swenshuai.xi {
6417*53ee8cc1Swenshuai.xi return (MDrv_TSP_PVR_Start(eRecMode, bStart));
6418*53ee8cc1Swenshuai.xi }
6419*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
6420*53ee8cc1Swenshuai.xi if(u8PVRId == 1)
6421*53ee8cc1Swenshuai.xi {
6422*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6423*53ee8cc1Swenshuai.xi if (bStart)
6424*53ee8cc1Swenshuai.xi {
6425*53ee8cc1Swenshuai.xi HAL_TSP_PVR1_WaitFlush();
6426*53ee8cc1Swenshuai.xi HAL_TSP_PVR1_All((HAS_FLAG(eRecMode, 0x02))? TRUE: FALSE);
6427*53ee8cc1Swenshuai.xi //HAL_TSP_LiveAB_En(TRUE); // set pvr to pidflt0_file
6428*53ee8cc1Swenshuai.xi HAL_TSP_PVR1_Enable(TRUE);
6429*53ee8cc1Swenshuai.xi }
6430*53ee8cc1Swenshuai.xi else
6431*53ee8cc1Swenshuai.xi {
6432*53ee8cc1Swenshuai.xi //HAL_TSP_LiveAB_En(FALSE); // disable pvr to pidflt0_file
6433*53ee8cc1Swenshuai.xi HAL_TSP_PVR1_Enable(FALSE);
6434*53ee8cc1Swenshuai.xi HAL_TSP_PVR1_WaitFlush();
6435*53ee8cc1Swenshuai.xi }
6436*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6437*53ee8cc1Swenshuai.xi }
6438*53ee8cc1Swenshuai.xi #endif
6439*53ee8cc1Swenshuai.xi
6440*53ee8cc1Swenshuai.xi return (DRVTSP_NOT_SUPPORTED);
6441*53ee8cc1Swenshuai.xi
6442*53ee8cc1Swenshuai.xi #else
6443*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6444*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6445*53ee8cc1Swenshuai.xi
6446*53ee8cc1Swenshuai.xi }
6447*53ee8cc1Swenshuai.xi
6448*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6449*53ee8cc1Swenshuai.xi /// Get final write address of Channel Browser record buffer
6450*53ee8cc1Swenshuai.xi /// @param u8PVRId \b IN:PVR ID
6451*53ee8cc1Swenshuai.xi /// @param pphyWriteAddr \b OUT: pointer of address return
6452*53ee8cc1Swenshuai.xi /// @return TSP_Result
6453*53ee8cc1Swenshuai.xi /// @note
6454*53ee8cc1Swenshuai.xi /// User can get current write address to know where is the end of section data
6455*53ee8cc1Swenshuai.xi /// received in the section buffer.
6456*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6457*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_GetWriteAddr(MS_U8 u8PVRId, MS_PHY *pphyWriteAddr)
6458*53ee8cc1Swenshuai.xi {
6459*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6460*53ee8cc1Swenshuai.xi
6461*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6462*53ee8cc1Swenshuai.xi
6463*53ee8cc1Swenshuai.xi switch(u8PVRId)
6464*53ee8cc1Swenshuai.xi {
6465*53ee8cc1Swenshuai.xi case 0:
6466*53ee8cc1Swenshuai.xi *pphyWriteAddr = HAL_TSP_PVR_GetBufWrite();
6467*53ee8cc1Swenshuai.xi break;
6468*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
6469*53ee8cc1Swenshuai.xi case 1:
6470*53ee8cc1Swenshuai.xi *pphyWriteAddr = HAL_TSP_PVR1_GetBufWrite();
6471*53ee8cc1Swenshuai.xi break;
6472*53ee8cc1Swenshuai.xi #endif
6473*53ee8cc1Swenshuai.xi default:
6474*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_NOT_SUPPORTED);
6475*53ee8cc1Swenshuai.xi }
6476*53ee8cc1Swenshuai.xi
6477*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6478*53ee8cc1Swenshuai.xi
6479*53ee8cc1Swenshuai.xi #else
6480*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6481*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6482*53ee8cc1Swenshuai.xi }
6483*53ee8cc1Swenshuai.xi
6484*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6485*53ee8cc1Swenshuai.xi /// Subscribe event notification callback function for Channel Browser record buffer
6486*53ee8cc1Swenshuai.xi /// @param u8PVRId \b IN:PVR ID
6487*53ee8cc1Swenshuai.xi /// @param eEvents \b IN: events need to be subscribed\n
6488*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_EVENT_CBBUF_FULL
6489*53ee8cc1Swenshuai.xi /// @param pfCallback \b IN: callback function (NULL to disable)
6490*53ee8cc1Swenshuai.xi /// @return TSP_Result
6491*53ee8cc1Swenshuai.xi /// @note
6492*53ee8cc1Swenshuai.xi /// TSP Channel Browser recording uses single buffer mechanism. This function register a callback
6493*53ee8cc1Swenshuai.xi /// function for recording. TSP calls callback function each time when one of
6494*53ee8cc1Swenshuai.xi /// single buffer is full and ring to buffer start to record.\n
6495*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_CB
6496*53ee8cc1Swenshuai.xi /// @attention
6497*53ee8cc1Swenshuai.xi /// Callback function resides in OS TSP interrupt context, it recommends
6498*53ee8cc1Swenshuai.xi /// that callback function should not take too much time to block the system.
6499*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6500*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_Notify(MS_U8 u8PVRId, DrvTSP_Event eEvents, P_DrvTSP_EvtCallback pfCallback)
6501*53ee8cc1Swenshuai.xi {
6502*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6503*53ee8cc1Swenshuai.xi
6504*53ee8cc1Swenshuai.xi return (MDrv_TSP_PVR_Notify(eEvents, pfCallback));
6505*53ee8cc1Swenshuai.xi
6506*53ee8cc1Swenshuai.xi #else
6507*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6508*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6509*53ee8cc1Swenshuai.xi
6510*53ee8cc1Swenshuai.xi }
6511*53ee8cc1Swenshuai.xi
6512*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_SetPacketMode(MS_U8 u8PVRId, MS_BOOL bSet)
6513*53ee8cc1Swenshuai.xi {
6514*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6515*53ee8cc1Swenshuai.xi
6516*53ee8cc1Swenshuai.xi switch(u8PVRId)
6517*53ee8cc1Swenshuai.xi {
6518*53ee8cc1Swenshuai.xi case 0:
6519*53ee8cc1Swenshuai.xi return (MDrv_TSP_PVR_SetPacketMode(bSet));
6520*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
6521*53ee8cc1Swenshuai.xi case 1:
6522*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6523*53ee8cc1Swenshuai.xi HAL_TSP_PVR1_PacketMode(bSet);
6524*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6525*53ee8cc1Swenshuai.xi #endif
6526*53ee8cc1Swenshuai.xi default:
6527*53ee8cc1Swenshuai.xi return (DRVTSP_NOT_SUPPORTED);
6528*53ee8cc1Swenshuai.xi }
6529*53ee8cc1Swenshuai.xi
6530*53ee8cc1Swenshuai.xi #else
6531*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6532*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6533*53ee8cc1Swenshuai.xi }
6534*53ee8cc1Swenshuai.xi
6535*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6536*53ee8cc1Swenshuai.xi /// Channel Browser time stamp set
6537*53ee8cc1Swenshuai.xi /// @param u8PVRId \b IN:PVR ID
6538*53ee8cc1Swenshuai.xi /// @param u32Stamp \b IN: Channel Browser time stamp
6539*53ee8cc1Swenshuai.xi /// @return TSP_Result
6540*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6541*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_TimeStampSetRecordStamp(MS_U8 u8PVRId, MS_U32 u32Stamp)
6542*53ee8cc1Swenshuai.xi {
6543*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6544*53ee8cc1Swenshuai.xi
6545*53ee8cc1Swenshuai.xi switch(u8PVRId)
6546*53ee8cc1Swenshuai.xi {
6547*53ee8cc1Swenshuai.xi case 0:
6548*53ee8cc1Swenshuai.xi return (MDrv_TSP_PVR_TimeStampSetRecordStamp(u32Stamp));
6549*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
6550*53ee8cc1Swenshuai.xi case 1:
6551*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6552*53ee8cc1Swenshuai.xi HAL_TSP_SetPVR1TimeStamp(u32Stamp);
6553*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6554*53ee8cc1Swenshuai.xi #endif
6555*53ee8cc1Swenshuai.xi default:
6556*53ee8cc1Swenshuai.xi return (DRVTSP_NOT_SUPPORTED);
6557*53ee8cc1Swenshuai.xi }
6558*53ee8cc1Swenshuai.xi
6559*53ee8cc1Swenshuai.xi #else
6560*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6561*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6562*53ee8cc1Swenshuai.xi }
6563*53ee8cc1Swenshuai.xi
6564*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6565*53ee8cc1Swenshuai.xi /// Channel Browser time stamp get
6566*53ee8cc1Swenshuai.xi /// @param u8PVRId \b IN:PVR ID
6567*53ee8cc1Swenshuai.xi /// @param pu32Stamp \b OUT: pointer of Channel Browser time stamp
6568*53ee8cc1Swenshuai.xi /// @return TSP_Result
6569*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6570*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_TimeStampGetRecordStamp(MS_U8 u8PVRId, MS_U32* u32Stamp)
6571*53ee8cc1Swenshuai.xi {
6572*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6573*53ee8cc1Swenshuai.xi
6574*53ee8cc1Swenshuai.xi switch(u8PVRId)
6575*53ee8cc1Swenshuai.xi {
6576*53ee8cc1Swenshuai.xi case 0:
6577*53ee8cc1Swenshuai.xi return (MDrv_TSP_PVR_TimeStampGetRecordStamp(u32Stamp));
6578*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
6579*53ee8cc1Swenshuai.xi case 1:
6580*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6581*53ee8cc1Swenshuai.xi *u32Stamp = HAL_TSP_GetPVR1TimeStamp();
6582*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6583*53ee8cc1Swenshuai.xi #endif
6584*53ee8cc1Swenshuai.xi default:
6585*53ee8cc1Swenshuai.xi return (DRVTSP_NOT_SUPPORTED);
6586*53ee8cc1Swenshuai.xi }
6587*53ee8cc1Swenshuai.xi
6588*53ee8cc1Swenshuai.xi #else
6589*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6590*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6591*53ee8cc1Swenshuai.xi }
6592*53ee8cc1Swenshuai.xi
6593*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6594*53ee8cc1Swenshuai.xi /// Playback time stamp clock set
6595*53ee8cc1Swenshuai.xi /// @param u8EngId \b IN:playback ID
6596*53ee8cc1Swenshuai.xi /// @param eClk \b IN: clock source type
6597*53ee8cc1Swenshuai.xi /// @return TSP_Result
6598*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6599*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_SetPlaybackStampClk(MS_U32 u32EngId, MS_U32 u32Clk)
6600*53ee8cc1Swenshuai.xi {
6601*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6602*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6603*53ee8cc1Swenshuai.xi if(HAL_TSP_SetPlayBackTimeStampClk(u32EngId, u32Clk))
6604*53ee8cc1Swenshuai.xi {
6605*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6606*53ee8cc1Swenshuai.xi }
6607*53ee8cc1Swenshuai.xi else
6608*53ee8cc1Swenshuai.xi {
6609*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
6610*53ee8cc1Swenshuai.xi }
6611*53ee8cc1Swenshuai.xi #else
6612*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6613*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6614*53ee8cc1Swenshuai.xi }
6615*53ee8cc1Swenshuai.xi
6616*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6617*53ee8cc1Swenshuai.xi /// PVR time stamp clock set
6618*53ee8cc1Swenshuai.xi /// @param u8PvrId \b IN:PVR ID
6619*53ee8cc1Swenshuai.xi /// @param eClk \b IN: clock source type
6620*53ee8cc1Swenshuai.xi /// @return TSP_Result
6621*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6622*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_SetRecordStampClk(MS_U32 u32PvrId, MS_U32 u32Clk)
6623*53ee8cc1Swenshuai.xi {
6624*53ee8cc1Swenshuai.xi #ifndef NO_PVR
6625*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6626*53ee8cc1Swenshuai.xi if(HAL_TSP_SetPVRTimeStampClk(u32PvrId, u32Clk))
6627*53ee8cc1Swenshuai.xi {
6628*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6629*53ee8cc1Swenshuai.xi }
6630*53ee8cc1Swenshuai.xi else
6631*53ee8cc1Swenshuai.xi {
6632*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
6633*53ee8cc1Swenshuai.xi }
6634*53ee8cc1Swenshuai.xi
6635*53ee8cc1Swenshuai.xi #else
6636*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6637*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
6638*53ee8cc1Swenshuai.xi }
6639*53ee8cc1Swenshuai.xi
6640*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6641*53ee8cc1Swenshuai.xi /// Check if PVR Engine is started
6642*53ee8cc1Swenshuai.xi /// @param u8PvrId \b IN:PVR ID
6643*53ee8cc1Swenshuai.xi /// @param pbIsStart \b OUT: Pointer to store started status
6644*53ee8cc1Swenshuai.xi /// @return TSP_Result
6645*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6646*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_IsStart(MS_U32 u32PvrId, MS_BOOL *pbIsStart)
6647*53ee8cc1Swenshuai.xi {
6648*53ee8cc1Swenshuai.xi if(pbIsStart == NULL)
6649*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
6650*53ee8cc1Swenshuai.xi
6651*53ee8cc1Swenshuai.xi *pbIsStart = HAL_TSP_PVR_Eng_IsEnabled(u32PvrId);
6652*53ee8cc1Swenshuai.xi
6653*53ee8cc1Swenshuai.xi return DRVTSP_OK;
6654*53ee8cc1Swenshuai.xi }
6655*53ee8cc1Swenshuai.xi
6656*53ee8cc1Swenshuai.xi // File API
6657*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6658*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : Stream start address
6659*53ee8cc1Swenshuai.xi /// @param u32StreamAddr \b IN: pointer of transport stream in memory
6660*53ee8cc1Swenshuai.xi /// @return TSP_Result
6661*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6662*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_SetAddr(MS_PHY phyStreamAddr)
6663*53ee8cc1Swenshuai.xi {
6664*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
6665*53ee8cc1Swenshuai.xi
6666*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6667*53ee8cc1Swenshuai.xi HAL_TSP_CmdQ_TsDma_SetAddr(phyStreamAddr);
6668*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6669*53ee8cc1Swenshuai.xi
6670*53ee8cc1Swenshuai.xi #else
6671*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6672*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
6673*53ee8cc1Swenshuai.xi }
6674*53ee8cc1Swenshuai.xi
6675*53ee8cc1Swenshuai.xi
6676*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6677*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : Stream data size
6678*53ee8cc1Swenshuai.xi /// @param u32StreamSize \b IN: size of transport stream data to be copied
6679*53ee8cc1Swenshuai.xi /// @return TSP_Result
6680*53ee8cc1Swenshuai.xi // @note u32StreamSize must be larger than 16
6681*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6682*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_SetSize(MS_U32 u32StreamSize)
6683*53ee8cc1Swenshuai.xi {
6684*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
6685*53ee8cc1Swenshuai.xi
6686*53ee8cc1Swenshuai.xi if(u32StreamSize <= 16)
6687*53ee8cc1Swenshuai.xi {
6688*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
6689*53ee8cc1Swenshuai.xi }
6690*53ee8cc1Swenshuai.xi
6691*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6692*53ee8cc1Swenshuai.xi if (HAL_TSP_CmdQ_TsDma_SetSize(u32StreamSize))
6693*53ee8cc1Swenshuai.xi {
6694*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6695*53ee8cc1Swenshuai.xi }
6696*53ee8cc1Swenshuai.xi else
6697*53ee8cc1Swenshuai.xi {
6698*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
6699*53ee8cc1Swenshuai.xi }
6700*53ee8cc1Swenshuai.xi
6701*53ee8cc1Swenshuai.xi #else
6702*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6703*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
6704*53ee8cc1Swenshuai.xi }
6705*53ee8cc1Swenshuai.xi
6706*53ee8cc1Swenshuai.xi
6707*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6708*53ee8cc1Swenshuai.xi //[Reserved]
6709*53ee8cc1Swenshuai.xi // Memory to TSP stream command : Update Stream STC
6710*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
6711*53ee8cc1Swenshuai.xi // @param u32STC_32 \b IN: STC[32] for next input stream
6712*53ee8cc1Swenshuai.xi // @param u32STC \b IN: STC[31:0] for next input stream
6713*53ee8cc1Swenshuai.xi // @return TSP_Result
6714*53ee8cc1Swenshuai.xi // @note M2T Command Size: 3
6715*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6716*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetSTC(MS_U32 u32EngId, MS_U32 u32STC_32, MS_U32 u32STC)
6717*53ee8cc1Swenshuai.xi {
6718*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6719*53ee8cc1Swenshuai.xi //[HW TODO][HW LIMIT]
6720*53ee8cc1Swenshuai.xi // STC register mapping is different between MCU and CPU.
6721*53ee8cc1Swenshuai.xi HAL_TSP_SetSTC(u32EngId, u32STC, u32STC_32);
6722*53ee8cc1Swenshuai.xi //HAL_TSP_SetSTC_32(u32EngId, u32STC_32);
6723*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6724*53ee8cc1Swenshuai.xi }
6725*53ee8cc1Swenshuai.xi
6726*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6727*53ee8cc1Swenshuai.xi /// Add or subtract STC Offset
6728*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of STC engine
6729*53ee8cc1Swenshuai.xi // @param u32Offset \b IN: STC offset value
6730*53ee8cc1Swenshuai.xi // @param bAdd \b IN: If TRUE, add the offset value; otherwise subtract the offset value
6731*53ee8cc1Swenshuai.xi // @return TSP_Result
6732*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6733*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetSTCOffset(MS_U32 u32EngId, MS_U32 u32Offset, MS_BOOL bAdd)
6734*53ee8cc1Swenshuai.xi {
6735*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6736*53ee8cc1Swenshuai.xi HAL_TSP_SetSTCOffset(u32EngId, u32Offset, bAdd);
6737*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6738*53ee8cc1Swenshuai.xi }
6739*53ee8cc1Swenshuai.xi
6740*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6741*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : Start stream input
6742*53ee8cc1Swenshuai.xi /// @param eM2tMode \b IN: input source control of filein
6743*53ee8cc1Swenshuai.xi /// @return TSP_Result
6744*53ee8cc1Swenshuai.xi /// @note Filein Command Size: 1
6745*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_GetM2tSlot
6746*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6747*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_Start(DrvTSP_FileinMode eFileinMode)
6748*53ee8cc1Swenshuai.xi {
6749*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
6750*53ee8cc1Swenshuai.xi
6751*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6752*53ee8cc1Swenshuai.xi // @FIXME: Good to assume enum and register definition identical?
6753*53ee8cc1Swenshuai.xi //if (E_DRVTSP_FILEIN_MODE_ENG0_TS != eFileinMode)
6754*53ee8cc1Swenshuai.xi {
6755*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Enable((MS_U32)eFileinMode);
6756*53ee8cc1Swenshuai.xi }
6757*53ee8cc1Swenshuai.xi HAL_TSP_CmdQ_TsDma_Start((MS_U32)eFileinMode);
6758*53ee8cc1Swenshuai.xi
6759*53ee8cc1Swenshuai.xi HAL_TSP_filein_enable(TRUE); //enable cmdQ after cmds are set
6760*53ee8cc1Swenshuai.xi
6761*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6762*53ee8cc1Swenshuai.xi
6763*53ee8cc1Swenshuai.xi #else
6764*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6765*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
6766*53ee8cc1Swenshuai.xi }
6767*53ee8cc1Swenshuai.xi
6768*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6769*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : Stop stream input
6770*53ee8cc1Swenshuai.xi /// @return TSP_Result
6771*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6772*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_Stop(void)
6773*53ee8cc1Swenshuai.xi {
6774*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
6775*53ee8cc1Swenshuai.xi
6776*53ee8cc1Swenshuai.xi #ifndef NO_CA
6777*53ee8cc1Swenshuai.xi MS_U32 u32data;
6778*53ee8cc1Swenshuai.xi #endif
6779*53ee8cc1Swenshuai.xi
6780*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6781*53ee8cc1Swenshuai.xi
6782*53ee8cc1Swenshuai.xi HAL_TSP_filein_enable(FALSE);
6783*53ee8cc1Swenshuai.xi
6784*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
6785*53ee8cc1Swenshuai.xi
6786*53ee8cc1Swenshuai.xi if(!_ptsp_res->_bLiveSING_FilePP)
6787*53ee8cc1Swenshuai.xi {
6788*53ee8cc1Swenshuai.xi HAL_TSP_DoubleBuf_Disable();
6789*53ee8cc1Swenshuai.xi }
6790*53ee8cc1Swenshuai.xi
6791*53ee8cc1Swenshuai.xi #ifndef NO_CA
6792*53ee8cc1Swenshuai.xi u32data = HAL_TSP_CSA_Get_ScrmPath();
6793*53ee8cc1Swenshuai.xi if(u32data & TSP_CA_INPUT_TSIF0_FILEIN)
6794*53ee8cc1Swenshuai.xi {
6795*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(_ptsp_res->_u32OrgCAMode); //restore original CA Ctrl
6796*53ee8cc1Swenshuai.xi }
6797*53ee8cc1Swenshuai.xi else
6798*53ee8cc1Swenshuai.xi {
6799*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPPvrcaParams._bCIPHSSMode)
6800*53ee8cc1Swenshuai.xi {
6801*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(u32data | TSP_CA_OUTPUT_PLAY_FILE);
6802*53ee8cc1Swenshuai.xi HAL_TSP_LiveAB_En(TRUE);
6803*53ee8cc1Swenshuai.xi }
6804*53ee8cc1Swenshuai.xi else if(_ptsp_res->TSPPvrcaParams._bFLT1Dup_Enable == TRUE || (_ptsp_res->_u32OrgCAMode & TSP_CA_OUTPUT_PLAY_LIVE)) //recover live0 display only in PVRCA flow
6805*53ee8cc1Swenshuai.xi {
6806*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(u32data | TSP_CA_OUTPUT_PLAY_LIVE);
6807*53ee8cc1Swenshuai.xi }
6808*53ee8cc1Swenshuai.xi }
6809*53ee8cc1Swenshuai.xi #endif
6810*53ee8cc1Swenshuai.xi
6811*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6812*53ee8cc1Swenshuai.xi
6813*53ee8cc1Swenshuai.xi #else
6814*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6815*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
6816*53ee8cc1Swenshuai.xi }
6817*53ee8cc1Swenshuai.xi
6818*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6819*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : pause stream input
6820*53ee8cc1Swenshuai.xi /// @return TSP_Result
6821*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6822*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_Pause(void)
6823*53ee8cc1Swenshuai.xi {
6824*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
6825*53ee8cc1Swenshuai.xi
6826*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6827*53ee8cc1Swenshuai.xi HAL_TSP_TsDma_Pause();
6828*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6829*53ee8cc1Swenshuai.xi
6830*53ee8cc1Swenshuai.xi #else
6831*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6832*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
6833*53ee8cc1Swenshuai.xi }
6834*53ee8cc1Swenshuai.xi
6835*53ee8cc1Swenshuai.xi
6836*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6837*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : resume stream input
6838*53ee8cc1Swenshuai.xi /// @return TSP_Result
6839*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6840*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_Resume(void)
6841*53ee8cc1Swenshuai.xi {
6842*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
6843*53ee8cc1Swenshuai.xi
6844*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6845*53ee8cc1Swenshuai.xi HAL_TSP_TsDma_Resume();
6846*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6847*53ee8cc1Swenshuai.xi
6848*53ee8cc1Swenshuai.xi #else
6849*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6850*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
6851*53ee8cc1Swenshuai.xi }
6852*53ee8cc1Swenshuai.xi
6853*53ee8cc1Swenshuai.xi
6854*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6855*53ee8cc1Swenshuai.xi /// Get current file in state
6856*53ee8cc1Swenshuai.xi /// @return DrvTSP_M2tStatus
6857*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_GetM2tSlot
6858*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6859*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_GetState(DrvTSP_FileinState* peFileinState)
6860*53ee8cc1Swenshuai.xi {
6861*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
6862*53ee8cc1Swenshuai.xi
6863*53ee8cc1Swenshuai.xi MS_U32 state, cmdcnt;
6864*53ee8cc1Swenshuai.xi
6865*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6866*53ee8cc1Swenshuai.xi
6867*53ee8cc1Swenshuai.xi state = HAL_TSP_CmdQ_TsDma_GetState();
6868*53ee8cc1Swenshuai.xi cmdcnt = HAL_TSP_CmdQ_CmdCount();
6869*53ee8cc1Swenshuai.xi
6870*53ee8cc1Swenshuai.xi if (state & TSP_CTRL1_FILEIN_PAUSE)
6871*53ee8cc1Swenshuai.xi {
6872*53ee8cc1Swenshuai.xi *peFileinState = E_DRVTSP_FILEIN_STATE_PAUSE;
6873*53ee8cc1Swenshuai.xi }
6874*53ee8cc1Swenshuai.xi else if ((state & TSP_TSDMA_CTRL_START) || cmdcnt)
6875*53ee8cc1Swenshuai.xi {
6876*53ee8cc1Swenshuai.xi *peFileinState = E_DRVTSP_FILEIN_STATE_BUSY;
6877*53ee8cc1Swenshuai.xi }
6878*53ee8cc1Swenshuai.xi else
6879*53ee8cc1Swenshuai.xi {
6880*53ee8cc1Swenshuai.xi *peFileinState = E_DRVTSP_FILEIN_STATE_IDLE;
6881*53ee8cc1Swenshuai.xi }
6882*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6883*53ee8cc1Swenshuai.xi
6884*53ee8cc1Swenshuai.xi #else
6885*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6886*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
6887*53ee8cc1Swenshuai.xi }
6888*53ee8cc1Swenshuai.xi
6889*53ee8cc1Swenshuai.xi
6890*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6891*53ee8cc1Swenshuai.xi /// Set Memory to TSP Stream Input Rate
6892*53ee8cc1Swenshuai.xi /// @param u32Div2 \b IN: Divider of M2T stream input rate ([1 .. 31], default 10)
6893*53ee8cc1Swenshuai.xi /// @return TSP_Result
6894*53ee8cc1Swenshuai.xi /// @note
6895*53ee8cc1Swenshuai.xi /// <b>input_rate = stream_rate / (u32Div2 * 2)</b>\n
6896*53ee8cc1Swenshuai.xi /// @note
6897*53ee8cc1Swenshuai.xi /// It's not recommend to change input rate at run-time, because it conflict with
6898*53ee8cc1Swenshuai.xi /// the internal stream synchornization mechanism.
6899*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_GetM2tSlot
6900*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6901*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_SetRate(MS_U32 u32Div2)
6902*53ee8cc1Swenshuai.xi {
6903*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
6904*53ee8cc1Swenshuai.xi
6905*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6906*53ee8cc1Swenshuai.xi
6907*53ee8cc1Swenshuai.xi //[HW TODO][HW LIMIT]
6908*53ee8cc1Swenshuai.xi // TsDma pause can be access by TSP CPU
6909*53ee8cc1Swenshuai.xi // TsDma pause it's hard to control because read/write in different register
6910*53ee8cc1Swenshuai.xi // When setting TsDma it should be disable interrupt to prevent ISR access
6911*53ee8cc1Swenshuai.xi // but it still can't prevent TSP_cpu access at the same time.
6912*53ee8cc1Swenshuai.xi //[SW PATCH] Add a special firmware command to lock TSP_cpu DMA pause/resume.
6913*53ee8cc1Swenshuai.xi
6914*53ee8cc1Swenshuai.xi OSAL_TSP_IntDisable();
6915*53ee8cc1Swenshuai.xi HAL_TSP_TsDma_SetDelay(u32Div2);
6916*53ee8cc1Swenshuai.xi OSAL_TSP_IntEnable();
6917*53ee8cc1Swenshuai.xi
6918*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6919*53ee8cc1Swenshuai.xi
6920*53ee8cc1Swenshuai.xi #else
6921*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6922*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
6923*53ee8cc1Swenshuai.xi }
6924*53ee8cc1Swenshuai.xi
6925*53ee8cc1Swenshuai.xi
6926*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6927*53ee8cc1Swenshuai.xi /// Set packet size to TSP file
6928*53ee8cc1Swenshuai.xi /// @param PacketMode \b IN: Mode of TSP file packet mode (192, 204, 188)
6929*53ee8cc1Swenshuai.xi /// @return TSP_Result
6930*53ee8cc1Swenshuai.xi /// @note
6931*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6932*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_SetPacketMode(DrvTSP_PacketMode PKT_Mode)
6933*53ee8cc1Swenshuai.xi {
6934*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
6935*53ee8cc1Swenshuai.xi
6936*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6937*53ee8cc1Swenshuai.xi
6938*53ee8cc1Swenshuai.xi HAL_TSP_filein_enable(FALSE); //disable cmdQ before cmds are set
6939*53ee8cc1Swenshuai.xi
6940*53ee8cc1Swenshuai.xi switch (PKT_Mode)
6941*53ee8cc1Swenshuai.xi {
6942*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTMODE_188:
6943*53ee8cc1Swenshuai.xi HAL_TSP_SetPKTSize(0xBB);
6944*53ee8cc1Swenshuai.xi break;
6945*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTMODE_192:
6946*53ee8cc1Swenshuai.xi HAL_TSP_SetPKTSize(0xBF);
6947*53ee8cc1Swenshuai.xi break;
6948*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTMODE_204:
6949*53ee8cc1Swenshuai.xi HAL_TSP_SetPKTSize(0xCB);
6950*53ee8cc1Swenshuai.xi break;
6951*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTMODE_130:
6952*53ee8cc1Swenshuai.xi HAL_TSP_SetPKTSize(0x82);
6953*53ee8cc1Swenshuai.xi break;
6954*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTMODE_134:
6955*53ee8cc1Swenshuai.xi HAL_TSP_SetPKTSize(0x86);
6956*53ee8cc1Swenshuai.xi break;
6957*53ee8cc1Swenshuai.xi default:
6958*53ee8cc1Swenshuai.xi break;
6959*53ee8cc1Swenshuai.xi }
6960*53ee8cc1Swenshuai.xi
6961*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
6962*53ee8cc1Swenshuai.xi
6963*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6964*53ee8cc1Swenshuai.xi
6965*53ee8cc1Swenshuai.xi #else
6966*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6967*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
6968*53ee8cc1Swenshuai.xi }
6969*53ee8cc1Swenshuai.xi
6970*53ee8cc1Swenshuai.xi
6971*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6972*53ee8cc1Swenshuai.xi /// Get the number of empty slot of M2T command
6973*53ee8cc1Swenshuai.xi /// @param pu32EmptySlot \b OUT: pointer of empty slot count return
6974*53ee8cc1Swenshuai.xi /// @return TSP_Result
6975*53ee8cc1Swenshuai.xi /// @note
6976*53ee8cc1Swenshuai.xi /// M2T is a command queue command, it can be queued by TSP when another M2T command
6977*53ee8cc1Swenshuai.xi /// is executing by TSP. The queued commands will be executed by order (FIFO)
6978*53ee8cc1Swenshuai.xi /// when previous M2T command execution is finished.
6979*53ee8cc1Swenshuai.xi /// @note
6980*53ee8cc1Swenshuai.xi /// User should call GetM2TSlot to make sure there is enough empty M2T command slot
6981*53ee8cc1Swenshuai.xi /// before sending any M2T command. (Each command has different command size)
6982*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_M2T_SetAddr, MDrv_TSP_M2T_SetSize, MDrv_TSP_M2T_Start,
6983*53ee8cc1Swenshuai.xi //[Reserved] MDrv_TSP_M2T_SetSTC
6984*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6985*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_CMDQ_GetSlot(MS_U32 *pu32EmptySlot)
6986*53ee8cc1Swenshuai.xi {
6987*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
6988*53ee8cc1Swenshuai.xi
6989*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6990*53ee8cc1Swenshuai.xi *pu32EmptySlot = HAL_TSP_CmdQ_EmptyCount();
6991*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6992*53ee8cc1Swenshuai.xi
6993*53ee8cc1Swenshuai.xi #else
6994*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
6995*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
6996*53ee8cc1Swenshuai.xi }
6997*53ee8cc1Swenshuai.xi
6998*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6999*53ee8cc1Swenshuai.xi /// Reset command queue
7000*53ee8cc1Swenshuai.xi /// @return TSP_Result
7001*53ee8cc1Swenshuai.xi /// @note
7002*53ee8cc1Swenshuai.xi /// SW patch--wait command queue empty
7003*53ee8cc1Swenshuai.xi /// wait HW ECO
7004*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7005*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_CMDQ_Reset(void)
7006*53ee8cc1Swenshuai.xi {
7007*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
7008*53ee8cc1Swenshuai.xi
7009*53ee8cc1Swenshuai.xi MS_BOOL bRet;
7010*53ee8cc1Swenshuai.xi
7011*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7012*53ee8cc1Swenshuai.xi bRet = HAL_TSP_CmdQ_Reset();
7013*53ee8cc1Swenshuai.xi if (TRUE == bRet)
7014*53ee8cc1Swenshuai.xi {
7015*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7016*53ee8cc1Swenshuai.xi }
7017*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
7018*53ee8cc1Swenshuai.xi
7019*53ee8cc1Swenshuai.xi #else
7020*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7021*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
7022*53ee8cc1Swenshuai.xi }
7023*53ee8cc1Swenshuai.xi
7024*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
7025*53ee8cc1Swenshuai.xi /// Get command queue fifo level
7026*53ee8cc1Swenshuai.xi /// @param pu8FifoLevel \b OUT: fifo level, 0~3
7027*53ee8cc1Swenshuai.xi /// @return TSP_Result
7028*53ee8cc1Swenshuai.xi /// @note
7029*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
7030*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_CmdQFifo_Status(MS_U8 *pu8FifoLevel)
7031*53ee8cc1Swenshuai.xi {
7032*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
7033*53ee8cc1Swenshuai.xi
7034*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7035*53ee8cc1Swenshuai.xi
7036*53ee8cc1Swenshuai.xi *pu8FifoLevel = HAL_TSP_Get_CmdQFifoLevel();
7037*53ee8cc1Swenshuai.xi
7038*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7039*53ee8cc1Swenshuai.xi
7040*53ee8cc1Swenshuai.xi #else
7041*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7042*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
7043*53ee8cc1Swenshuai.xi }
7044*53ee8cc1Swenshuai.xi
7045*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7046*53ee8cc1Swenshuai.xi /// Enable timestamp block scheme
7047*53ee8cc1Swenshuai.xi /// @return TSP_Result
7048*53ee8cc1Swenshuai.xi /// @note
7049*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7050*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_192BlockScheme_En(MS_BOOL bEnable)
7051*53ee8cc1Swenshuai.xi {
7052*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
7053*53ee8cc1Swenshuai.xi
7054*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7055*53ee8cc1Swenshuai.xi HAL_TSP_FileIn_192BlockScheme_En(bEnable);
7056*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7057*53ee8cc1Swenshuai.xi
7058*53ee8cc1Swenshuai.xi #else
7059*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7060*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
7061*53ee8cc1Swenshuai.xi }
7062*53ee8cc1Swenshuai.xi
7063*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7064*53ee8cc1Swenshuai.xi /// Enable PS path
7065*53ee8cc1Swenshuai.xi /// @param eM2tMode \b IN: input source control of filein
7066*53ee8cc1Swenshuai.xi /// @return TSP_Result
7067*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7068*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_PS_Path_Enable(DrvTSP_FileinMode eFileinMode)
7069*53ee8cc1Swenshuai.xi {
7070*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
7071*53ee8cc1Swenshuai.xi
7072*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7073*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Enable((MS_U32)eFileinMode);
7074*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7075*53ee8cc1Swenshuai.xi
7076*53ee8cc1Swenshuai.xi #else
7077*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7078*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
7079*53ee8cc1Swenshuai.xi }
7080*53ee8cc1Swenshuai.xi
7081*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7082*53ee8cc1Swenshuai.xi /// Enable PS path
7083*53ee8cc1Swenshuai.xi /// @param pu32ReadAddr \b OUT: Pointer to store file-in current reand pointer
7084*53ee8cc1Swenshuai.xi /// @return TSP_Result
7085*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7086*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_GetReadAddr(MS_PHY *pphyReadAddr)
7087*53ee8cc1Swenshuai.xi {
7088*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
7089*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7090*53ee8cc1Swenshuai.xi if(!HAL_TSP_GetFilinReadAddr(pphyReadAddr))
7091*53ee8cc1Swenshuai.xi {
7092*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_NOT_SUPPORTED);
7093*53ee8cc1Swenshuai.xi }
7094*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7095*53ee8cc1Swenshuai.xi #else
7096*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7097*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
7098*53ee8cc1Swenshuai.xi }
7099*53ee8cc1Swenshuai.xi
7100*53ee8cc1Swenshuai.xi // Legacy
7101*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7102*53ee8cc1Swenshuai.xi /// Get Scmb states
7103*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
7104*53ee8cc1Swenshuai.xi /// @param pScmbLevel \b IN: TS interface setting
7105*53ee8cc1Swenshuai.xi /// @return TSP_Result
7106*53ee8cc1Swenshuai.xi /// @note
7107*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7108*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Scmb_Status(MS_U32 u32EngId, DrvTSP_Scmb_Level* pScmbLevel)
7109*53ee8cc1Swenshuai.xi {
7110*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7111*53ee8cc1Swenshuai.xi *pScmbLevel= E_DRVTSP_SCMB_NONE;
7112*53ee8cc1Swenshuai.xi
7113*53ee8cc1Swenshuai.xi if (HAL_TSP_Scmb_Status(0, 0, 0xFFFFFFFF) || HAL_TSP_Scmb_Status(1, 0, 0xFFFFFFFF)
7114*53ee8cc1Swenshuai.xi || HAL_TSP_Scmb_Status(0, 1, 0xFFFFFFFF) || HAL_TSP_Scmb_Status(1, 1, 0xFFFFFFFF))
7115*53ee8cc1Swenshuai.xi {
7116*53ee8cc1Swenshuai.xi *pScmbLevel= E_DRVTSP_SCMB_TS;
7117*53ee8cc1Swenshuai.xi }
7118*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7119*53ee8cc1Swenshuai.xi }
7120*53ee8cc1Swenshuai.xi
7121*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7122*53ee8cc1Swenshuai.xi /// Get/Set Dscrambling path
7123*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of DSCMB engine
7124*53ee8cc1Swenshuai.xi /// @param pScmbPath \b IN: pointer to store dscmb path
7125*53ee8cc1Swenshuai.xi /// @param bSet \b IN: If TURE, setting scmb pathl if false, getting scmb path
7126*53ee8cc1Swenshuai.xi /// @return TSP_Result
7127*53ee8cc1Swenshuai.xi /// @note
7128*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7129*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Dscmb_Path(MS_U32 u32EngId, DrvTSP_DscmbCtrl *pScmbPath, MS_BOOL bSet)
7130*53ee8cc1Swenshuai.xi {
7131*53ee8cc1Swenshuai.xi MS_U32 u32ii = 0;
7132*53ee8cc1Swenshuai.xi MS_BOOL bFlt0DupOld = FALSE, bFlt0DupNew = FALSE, bFlt2DupOld = FALSE, bFlt2DupNew = FALSE;
7133*53ee8cc1Swenshuai.xi
7134*53ee8cc1Swenshuai.xi if(u32EngId > 0)
7135*53ee8cc1Swenshuai.xi {
7136*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
7137*53ee8cc1Swenshuai.xi }
7138*53ee8cc1Swenshuai.xi
7139*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7140*53ee8cc1Swenshuai.xi
7141*53ee8cc1Swenshuai.xi if(bSet == FALSE)
7142*53ee8cc1Swenshuai.xi {
7143*53ee8cc1Swenshuai.xi *pScmbPath = (DrvTSP_DscmbCtrl)HAL_TSP_CSA_Get_ScrmPath();
7144*53ee8cc1Swenshuai.xi }
7145*53ee8cc1Swenshuai.xi else
7146*53ee8cc1Swenshuai.xi {
7147*53ee8cc1Swenshuai.xi _ptsp_res->_u32OrgCAMode = HAL_TSP_CSA_Get_ScrmPath(); //record old CA Ctrl mode
7148*53ee8cc1Swenshuai.xi
7149*53ee8cc1Swenshuai.xi bFlt0DupOld = ((_ptsp_res->_u32OrgCAMode & (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE)) == (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE));
7150*53ee8cc1Swenshuai.xi bFlt0DupNew = ((*pScmbPath & (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE)) == (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE));
7151*53ee8cc1Swenshuai.xi if((_ptsp_res->_u32OrgCAMode & (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_REC)) == (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_REC))
7152*53ee8cc1Swenshuai.xi bFlt0DupOld = TRUE;
7153*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
7154*53ee8cc1Swenshuai.xi bFlt2DupOld = ((_ptsp_res->_u32OrgCAMode & (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE|TSP_CA_OUTPUT_PLAY_LIVE2)) == (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE2));
7155*53ee8cc1Swenshuai.xi bFlt2DupNew = ((*pScmbPath & (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE|TSP_CA_OUTPUT_PLAY_LIVE2)) == (TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE2));
7156*53ee8cc1Swenshuai.xi #endif
7157*53ee8cc1Swenshuai.xi
7158*53ee8cc1Swenshuai.xi if((bFlt0DupOld == TRUE) && (bFlt0DupNew == FALSE))
7159*53ee8cc1Swenshuai.xi {
7160*53ee8cc1Swenshuai.xi _TSP_FreeDupDscmbPidFlt(u32EngId, 0, _ptsp_res->_u32OrgCAMode);
7161*53ee8cc1Swenshuai.xi }
7162*53ee8cc1Swenshuai.xi if((bFlt2DupOld == TRUE) && (bFlt2DupNew == FALSE))
7163*53ee8cc1Swenshuai.xi {
7164*53ee8cc1Swenshuai.xi _TSP_FreeDupDscmbPidFlt(u32EngId, 2, _ptsp_res->_u32OrgCAMode);
7165*53ee8cc1Swenshuai.xi }
7166*53ee8cc1Swenshuai.xi
7167*53ee8cc1Swenshuai.xi //duplicateFLT 0 to FLT1
7168*53ee8cc1Swenshuai.xi if(bFlt0DupNew)
7169*53ee8cc1Swenshuai.xi {
7170*53ee8cc1Swenshuai.xi for(u32ii = DSCMB_FLT_START_ID; u32ii <= DSCMB_FLT_END_ID; u32ii++)
7171*53ee8cc1Swenshuai.xi {
7172*53ee8cc1Swenshuai.xi _TSP_DupDscmbPidFlt(u32EngId, u32ii, TSP_SECFLT_NUM+u32ii-DSCMB_FLT_START_ID);
7173*53ee8cc1Swenshuai.xi }
7174*53ee8cc1Swenshuai.xi #ifdef EXT_PVR1_FLT
7175*53ee8cc1Swenshuai.xi for(u32ii = DSCMB_FLT_SHAREKEY_START_ID; u32ii <= DSCMB_FLT_SHAREKEY_END_ID; u32ii++)
7176*53ee8cc1Swenshuai.xi {
7177*53ee8cc1Swenshuai.xi _TSP_DupDscmbPidFlt(u32EngId, u32ii, TSP_SECFLT_NUM+DSCMB_FLT_NUM+u32ii);
7178*53ee8cc1Swenshuai.xi }
7179*53ee8cc1Swenshuai.xi #endif
7180*53ee8cc1Swenshuai.xi }
7181*53ee8cc1Swenshuai.xi
7182*53ee8cc1Swenshuai.xi //duplicateFLT 2 to FLT1
7183*53ee8cc1Swenshuai.xi #ifdef TS2_LIVE_SUPPORT
7184*53ee8cc1Swenshuai.xi if(bFlt2DupNew)
7185*53ee8cc1Swenshuai.xi {
7186*53ee8cc1Swenshuai.xi for(u32ii = (TSP_SECFLT_NUM + TSP_PIDFLT1_NUM); u32ii < TSP_PIDFLT_NUM_ALL; u32ii++)
7187*53ee8cc1Swenshuai.xi {
7188*53ee8cc1Swenshuai.xi _TSP_DupDscmbPidFlt(u32EngId, u32ii, u32ii-TSP_PIDFLT1_NUM);
7189*53ee8cc1Swenshuai.xi }
7190*53ee8cc1Swenshuai.xi }
7191*53ee8cc1Swenshuai.xi #endif
7192*53ee8cc1Swenshuai.xi
7193*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath((DrvTSP_DscmbCtrl)(*pScmbPath));
7194*53ee8cc1Swenshuai.xi }
7195*53ee8cc1Swenshuai.xi
7196*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7197*53ee8cc1Swenshuai.xi
7198*53ee8cc1Swenshuai.xi }
7199*53ee8cc1Swenshuai.xi
7200*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetCap(DrvTSP_Cap eCap, void* pOutput)
7201*53ee8cc1Swenshuai.xi {
7202*53ee8cc1Swenshuai.xi *((MS_U32*)pOutput) = 0;
7203*53ee8cc1Swenshuai.xi
7204*53ee8cc1Swenshuai.xi if (eCap >= E_DRVTSP_CAP_NULL)
7205*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
7206*53ee8cc1Swenshuai.xi
7207*53ee8cc1Swenshuai.xi if(eCap == E_DRVTSP_CAP_RESOURCE_SIZE)
7208*53ee8cc1Swenshuai.xi {
7209*53ee8cc1Swenshuai.xi *((MS_U32*)pOutput) = sizeof(TSP_RESOURCE_PRIVATE);
7210*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7211*53ee8cc1Swenshuai.xi }
7212*53ee8cc1Swenshuai.xi
7213*53ee8cc1Swenshuai.xi if(HAL_TSP_GetCap((MS_U32)eCap, pOutput))
7214*53ee8cc1Swenshuai.xi {
7215*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7216*53ee8cc1Swenshuai.xi }
7217*53ee8cc1Swenshuai.xi else
7218*53ee8cc1Swenshuai.xi {
7219*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
7220*53ee8cc1Swenshuai.xi }
7221*53ee8cc1Swenshuai.xi }
7222*53ee8cc1Swenshuai.xi
7223*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetStatus(DrvTSP_HW_Status *HW_Status, DrvTSP_SW_Status *SW_Status)
7224*53ee8cc1Swenshuai.xi {
7225*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7226*53ee8cc1Swenshuai.xi if (HAL_TSP_Alive())
7227*53ee8cc1Swenshuai.xi {
7228*53ee8cc1Swenshuai.xi *HW_Status = E_DRVTSP_HW_ALIVE;
7229*53ee8cc1Swenshuai.xi }
7230*53ee8cc1Swenshuai.xi else
7231*53ee8cc1Swenshuai.xi {
7232*53ee8cc1Swenshuai.xi *HW_Status = E_DRVTSP_HW_DEALIVE;
7233*53ee8cc1Swenshuai.xi }
7234*53ee8cc1Swenshuai.xi *SW_Status = _ptsp_res->_TspState[0].TSPStatus;
7235*53ee8cc1Swenshuai.xi
7236*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7237*53ee8cc1Swenshuai.xi }
7238*53ee8cc1Swenshuai.xi
7239*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetDbgLevel(DrvTSP_DbgLevel DbgLevel)
7240*53ee8cc1Swenshuai.xi {
7241*53ee8cc1Swenshuai.xi _u32TSPDGBLevel = DbgLevel;
7242*53ee8cc1Swenshuai.xi //TSP_DBG("[%s][%d] _u32TSPDGBLevel %d \n", __FUNCTION__, __LINE__, (int)_u32TSPDGBLevel);
7243*53ee8cc1Swenshuai.xi
7244*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7245*53ee8cc1Swenshuai.xi }
7246*53ee8cc1Swenshuai.xi
7247*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetTSIFStatus(DrvTSP_If eIf, DrvTSP_If_Set* pIfSet, MS_U16 u16Clock)
7248*53ee8cc1Swenshuai.xi {
7249*53ee8cc1Swenshuai.xi TSP_Result Res = DRVTSP_OK;
7250*53ee8cc1Swenshuai.xi MS_U16 u16pad, u16clk;
7251*53ee8cc1Swenshuai.xi
7252*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7253*53ee8cc1Swenshuai.xi
7254*53ee8cc1Swenshuai.xi switch(eIf)
7255*53ee8cc1Swenshuai.xi {
7256*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_PLAYBACK:
7257*53ee8cc1Swenshuai.xi HAL_TSP_GetTSIF_Status(0, &u16pad, &u16clk, &(pIfSet->bExtSync), &(pIfSet->bParallel));
7258*53ee8cc1Swenshuai.xi break;
7259*53ee8cc1Swenshuai.xi #ifndef NO_PVR
7260*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_PVR0:
7261*53ee8cc1Swenshuai.xi HAL_TSP_GetTSIF_Status(1, &u16pad, &u16clk, &(pIfSet->bExtSync), &(pIfSet->bParallel));
7262*53ee8cc1Swenshuai.xi break;
7263*53ee8cc1Swenshuai.xi #endif //udef NO_PVR
7264*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
7265*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_PVR1:
7266*53ee8cc1Swenshuai.xi HAL_TSP_GetTSIF_Status(2, &u16pad, &u16clk, &(pIfSet->bExtSync), &(pIfSet->bParallel));
7267*53ee8cc1Swenshuai.xi break;
7268*53ee8cc1Swenshuai.xi #endif
7269*53ee8cc1Swenshuai.xi default:
7270*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_NOT_SUPPORTED);
7271*53ee8cc1Swenshuai.xi }
7272*53ee8cc1Swenshuai.xi
7273*53ee8cc1Swenshuai.xi u16Clock = u16clk;
7274*53ee8cc1Swenshuai.xi
7275*53ee8cc1Swenshuai.xi switch(u16pad)
7276*53ee8cc1Swenshuai.xi {
7277*53ee8cc1Swenshuai.xi case TSP_MUX_INDEMOD:
7278*53ee8cc1Swenshuai.xi if((u16clk & CLKGEN0_TSP_CLK_MASK) != TSP_CLK_INDEMOD)
7279*53ee8cc1Swenshuai.xi Res = DRVTSP_FUNC_ERROR;
7280*53ee8cc1Swenshuai.xi pIfSet->ePad = E_DRVTSP_PAD_DEMOD;
7281*53ee8cc1Swenshuai.xi break;
7282*53ee8cc1Swenshuai.xi case TSP_MUX_TS0:
7283*53ee8cc1Swenshuai.xi if((u16clk & CLKGEN0_TSP_CLK_MASK) != TSP_CLK_TS0)
7284*53ee8cc1Swenshuai.xi Res = DRVTSP_FUNC_ERROR;
7285*53ee8cc1Swenshuai.xi pIfSet->ePad = E_DRVTSP_PAD_EXT_INPUT0;
7286*53ee8cc1Swenshuai.xi break;
7287*53ee8cc1Swenshuai.xi case TSP_MUX_TS1:
7288*53ee8cc1Swenshuai.xi if((u16clk & CLKGEN0_TSP_CLK_MASK) != TSP_CLK_TS1)
7289*53ee8cc1Swenshuai.xi Res = DRVTSP_FUNC_ERROR;
7290*53ee8cc1Swenshuai.xi pIfSet->ePad = E_DRVTSP_PAD_EXT_INPUT1;
7291*53ee8cc1Swenshuai.xi break;
7292*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
7293*53ee8cc1Swenshuai.xi case TSP_MUX_TS2:
7294*53ee8cc1Swenshuai.xi if((u16clk & CLKGEN0_TSP_CLK_MASK) != TSP_CLK_TS2)
7295*53ee8cc1Swenshuai.xi Res = DRVTSP_FUNC_ERROR;
7296*53ee8cc1Swenshuai.xi pIfSet->ePad = E_DRVTSP_PAD_EXT_INPUT2;
7297*53ee8cc1Swenshuai.xi break;
7298*53ee8cc1Swenshuai.xi #endif
7299*53ee8cc1Swenshuai.xi default:
7300*53ee8cc1Swenshuai.xi break;
7301*53ee8cc1Swenshuai.xi }
7302*53ee8cc1Swenshuai.xi
7303*53ee8cc1Swenshuai.xi pIfSet->bClkInv = ((u16clk & TSP_CLK_INVERSE) == TSP_CLK_INVERSE);
7304*53ee8cc1Swenshuai.xi
7305*53ee8cc1Swenshuai.xi _TSP_RETURN(Res);
7306*53ee8cc1Swenshuai.xi }
7307*53ee8cc1Swenshuai.xi
7308*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7309*53ee8cc1Swenshuai.xi /// Get the PES scrambling control status
7310*53ee8cc1Swenshuai.xi /// @param u8FltId \b IN: filter id
7311*53ee8cc1Swenshuai.xi /// @param pu8status \b OUT: pointer to store PES scrambled statis. Every bit indicates one status of one packet.
7312*53ee8cc1Swenshuai.xi /// @return TSP_Result
7313*53ee8cc1Swenshuai.xi /// @note
7314*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7315*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetPesScmbSts(MS_U8 u8FltId, MS_U8 *pu8status)
7316*53ee8cc1Swenshuai.xi {
7317*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7318*53ee8cc1Swenshuai.xi *pu8status = HAL_TSP_Get_PesScmb_Sts(u8FltId);
7319*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7320*53ee8cc1Swenshuai.xi }
7321*53ee8cc1Swenshuai.xi
7322*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7323*53ee8cc1Swenshuai.xi /// Get the TS header scrambling control status
7324*53ee8cc1Swenshuai.xi /// @param u8FltId \b IN: filter id
7325*53ee8cc1Swenshuai.xi /// @param pu8status \b OUT: pointer to store TS scrambled statis. Every bit indicates one status of one packet.
7326*53ee8cc1Swenshuai.xi /// @note
7327*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7328*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetTsScmbSts(MS_U8 u8FltId, MS_U8 *pu8status)
7329*53ee8cc1Swenshuai.xi {
7330*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7331*53ee8cc1Swenshuai.xi *pu8status = HAL_TSP_Get_TsScmb_Sts(u8FltId);
7332*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7333*53ee8cc1Swenshuai.xi }
7334*53ee8cc1Swenshuai.xi
7335*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7336*53ee8cc1Swenshuai.xi /// Get TSP driver version
7337*53ee8cc1Swenshuai.xi /// @param <IN> \b const MS_U8 **pVerString :
7338*53ee8cc1Swenshuai.xi /// @param <RET> \b : when get ok, return the pointer to the driver version
7339*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7340*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetLibVer(const MSIF_Version **ppVersion)
7341*53ee8cc1Swenshuai.xi {
7342*53ee8cc1Swenshuai.xi // No mutex check, it can be called before Init
7343*53ee8cc1Swenshuai.xi if (!ppVersion)
7344*53ee8cc1Swenshuai.xi {
7345*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
7346*53ee8cc1Swenshuai.xi }
7347*53ee8cc1Swenshuai.xi
7348*53ee8cc1Swenshuai.xi *ppVersion = &_drv_tsp_version;
7349*53ee8cc1Swenshuai.xi
7350*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7351*53ee8cc1Swenshuai.xi }
7352*53ee8cc1Swenshuai.xi
7353*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Alive(MS_U32 u32EngId)
7354*53ee8cc1Swenshuai.xi {
7355*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7356*53ee8cc1Swenshuai.xi if (HAL_TSP_Alive())
7357*53ee8cc1Swenshuai.xi {
7358*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7359*53ee8cc1Swenshuai.xi }
7360*53ee8cc1Swenshuai.xi else
7361*53ee8cc1Swenshuai.xi {
7362*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
7363*53ee8cc1Swenshuai.xi }
7364*53ee8cc1Swenshuai.xi }
7365*53ee8cc1Swenshuai.xi
7366*53ee8cc1Swenshuai.xi inline TSP_Result MDrv_TSP_IsAccess(MS_U32 u32Try)
7367*53ee8cc1Swenshuai.xi {
7368*53ee8cc1Swenshuai.xi return (HAL_TSP_TTX_IsAccess(u32Try))? DRVTSP_OK: DRVTSP_FAIL;
7369*53ee8cc1Swenshuai.xi }
7370*53ee8cc1Swenshuai.xi
7371*53ee8cc1Swenshuai.xi inline TSP_Result MDrv_TSP_UnlockAccess(void)
7372*53ee8cc1Swenshuai.xi {
7373*53ee8cc1Swenshuai.xi HAL_TSP_TTX_UnlockAccess();
7374*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7375*53ee8cc1Swenshuai.xi }
7376*53ee8cc1Swenshuai.xi
7377*53ee8cc1Swenshuai.xi // Following are 2 private function used to solve annoying interrupt thread disappearing problem when fork.
7378*53ee8cc1Swenshuai.xi // Should not be exposed to general users.
7379*53ee8cc1Swenshuai.xi MS_BOOL MDrv_TSP_CloseInterrupt(void)
7380*53ee8cc1Swenshuai.xi {
7381*53ee8cc1Swenshuai.xi // IntDisable
7382*53ee8cc1Swenshuai.xi // IntDetach
7383*53ee8cc1Swenshuai.xi OSAL_TSP_IntDisable();
7384*53ee8cc1Swenshuai.xi OSAL_TSP_IntDetach();
7385*53ee8cc1Swenshuai.xi
7386*53ee8cc1Swenshuai.xi return TRUE;
7387*53ee8cc1Swenshuai.xi }
7388*53ee8cc1Swenshuai.xi
7389*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7390*53ee8cc1Swenshuai.xi /// Initialize lib resource API
7391*53ee8cc1Swenshuai.xi /// @param pu32ResMemAddr \b IN: Pointer to store resource memory address
7392*53ee8cc1Swenshuai.xi /// @return TSP_Result
7393*53ee8cc1Swenshuai.xi /// @note
7394*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7395*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_InitLibResource(void *pu32ResMemAddr)
7396*53ee8cc1Swenshuai.xi {
7397*53ee8cc1Swenshuai.xi TSP_ASSERT((pu32ResMemAddr != 0),
7398*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%s][%06d] pointer is 0x%p!\n", __FUNCTION__, __LINE__, pu32ResMemAddr));
7399*53ee8cc1Swenshuai.xi
7400*53ee8cc1Swenshuai.xi MS_VIRT virtTspBank, virtIRBank;
7401*53ee8cc1Swenshuai.xi MS_PHY phyIrBankSize, phyTspBankSize;
7402*53ee8cc1Swenshuai.xi
7403*53ee8cc1Swenshuai.xi _ptsp_res = (TSP_RESOURCE_PRIVATE*)pu32ResMemAddr;
7404*53ee8cc1Swenshuai.xi
7405*53ee8cc1Swenshuai.xi if(_ptsp_res->_bSWInitReady != TRUE)
7406*53ee8cc1Swenshuai.xi {
7407*53ee8cc1Swenshuai.xi if(_TSP_InitResource(_ptsp_res) == FALSE)
7408*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
7409*53ee8cc1Swenshuai.xi }
7410*53ee8cc1Swenshuai.xi
7411*53ee8cc1Swenshuai.xi // For multi-process use case. (different process should set the value of bank again)
7412*53ee8cc1Swenshuai.xi if(_bBankInit == FALSE)
7413*53ee8cc1Swenshuai.xi {
7414*53ee8cc1Swenshuai.xi if (FALSE == MDrv_MMIO_GetBASE(&virtTspBank, &phyTspBankSize, MS_MODULE_TSP))
7415*53ee8cc1Swenshuai.xi {
7416*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("MDrv_MMIO_GetBASE fail\n"));
7417*53ee8cc1Swenshuai.xi MS_ASSERT(0);
7418*53ee8cc1Swenshuai.xi }
7419*53ee8cc1Swenshuai.xi if (FALSE == MDrv_MMIO_GetBASE(&virtIRBank, &phyIrBankSize, MS_MODULE_IR))
7420*53ee8cc1Swenshuai.xi {
7421*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("MDrv_MMIO_GetBASE (PM base)fail\n"));
7422*53ee8cc1Swenshuai.xi MS_ASSERT(0);
7423*53ee8cc1Swenshuai.xi }
7424*53ee8cc1Swenshuai.xi
7425*53ee8cc1Swenshuai.xi HAL_TSP_SetBank(virtTspBank, virtIRBank);
7426*53ee8cc1Swenshuai.xi _bBankInit = TRUE;
7427*53ee8cc1Swenshuai.xi }
7428*53ee8cc1Swenshuai.xi
7429*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7430*53ee8cc1Swenshuai.xi }
7431*53ee8cc1Swenshuai.xi
7432*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7433*53ee8cc1Swenshuai.xi /// Initialize TSP driver and TSP engine
7434*53ee8cc1Swenshuai.xi /// @return TSP_Result
7435*53ee8cc1Swenshuai.xi /// @note
7436*53ee8cc1Swenshuai.xi /// It should be called before calling any other TSP DDI functions.
7437*53ee8cc1Swenshuai.xi /// Driver task is in @ref E_TASK_PRI_SYS level.
7438*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7439*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Init(MS_PHY phyFWAddr, MS_U32 u32FWSize)
7440*53ee8cc1Swenshuai.xi {
7441*53ee8cc1Swenshuai.xi TSP_Result bRet;
7442*53ee8cc1Swenshuai.xi
7443*53ee8cc1Swenshuai.xi MS_DEBUG_MSG(TSP_DBG ("******************start TSP init*********************************\n"));
7444*53ee8cc1Swenshuai.xi
7445*53ee8cc1Swenshuai.xi //if already init, set the same HK parameter & interrupt num to this process, and attached Isr for this new process
7446*53ee8cc1Swenshuai.xi if((_ptsp_res->_bSWInitReady == TRUE) && (_s32TspTaskId != -1))
7447*53ee8cc1Swenshuai.xi {
7448*53ee8cc1Swenshuai.xi return MDrv_TSP_Reinit(_bIsHK);
7449*53ee8cc1Swenshuai.xi }
7450*53ee8cc1Swenshuai.xi
7451*53ee8cc1Swenshuai.xi MS_DEBUG_MSG(TSP_DBG ("******************start TSP init*********************************\n"));
7452*53ee8cc1Swenshuai.xi
7453*53ee8cc1Swenshuai.xi _ptsp_res->_phyFwAddr = phyFWAddr;
7454*53ee8cc1Swenshuai.xi _ptsp_res->_u32FwSize = u32FWSize;
7455*53ee8cc1Swenshuai.xi
7456*53ee8cc1Swenshuai.xi if (DRVTSP_OK != (bRet = _TSP_Init(TRUE, FALSE)))
7457*53ee8cc1Swenshuai.xi {
7458*53ee8cc1Swenshuai.xi return bRet;
7459*53ee8cc1Swenshuai.xi }
7460*53ee8cc1Swenshuai.xi MS_DEBUG_MSG(TSP_DBG ("**********************End TSP init*****************************\n"));
7461*53ee8cc1Swenshuai.xi
7462*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7463*53ee8cc1Swenshuai.xi }
7464*53ee8cc1Swenshuai.xi
7465*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7466*53ee8cc1Swenshuai.xi /// Initialize TSP driver for hal parameters init and attaching Isr
7467*53ee8cc1Swenshuai.xi /// @return TSP_Result
7468*53ee8cc1Swenshuai.xi /// @note
7469*53ee8cc1Swenshuai.xi /// Only for the second process to init
7470*53ee8cc1Swenshuai.xi /// Driver task is in @ref E_TASK_PRI_SYS level.
7471*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7472*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Reinit(MS_BOOL bHK)
7473*53ee8cc1Swenshuai.xi {
7474*53ee8cc1Swenshuai.xi MS_VIRT virtTspBank, virtIRBank;
7475*53ee8cc1Swenshuai.xi MS_PHY u32IrBankSize, u32TspBankSize;
7476*53ee8cc1Swenshuai.xi MS_U8 u8ii = 0;
7477*53ee8cc1Swenshuai.xi
7478*53ee8cc1Swenshuai.xi _bIsHK = bHK;
7479*53ee8cc1Swenshuai.xi _u32IntNum = (bHK) ? E_INT_IRQ_TSP2HK : E_INT_FIQ_TSP2AEON; // use this once MHEG5 using utopia msos
7480*53ee8cc1Swenshuai.xi
7481*53ee8cc1Swenshuai.xi if (FALSE == MDrv_MMIO_GetBASE(&virtTspBank, &u32TspBankSize, MS_MODULE_TSP))
7482*53ee8cc1Swenshuai.xi {
7483*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("MDrv_MMIO_GetBASE fail\n"));
7484*53ee8cc1Swenshuai.xi MS_ASSERT(0);
7485*53ee8cc1Swenshuai.xi }
7486*53ee8cc1Swenshuai.xi if (FALSE == MDrv_MMIO_GetBASE(&virtIRBank, &u32IrBankSize, MS_MODULE_IR))
7487*53ee8cc1Swenshuai.xi {
7488*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("MDrv_MMIO_GetBASE (PM base)fail\n"));
7489*53ee8cc1Swenshuai.xi MS_ASSERT(0);
7490*53ee8cc1Swenshuai.xi }
7491*53ee8cc1Swenshuai.xi
7492*53ee8cc1Swenshuai.xi HAL_TSP_SetBank(virtTspBank, virtIRBank);
7493*53ee8cc1Swenshuai.xi
7494*53ee8cc1Swenshuai.xi
7495*53ee8cc1Swenshuai.xi #ifdef STC64_SUPPORT
7496*53ee8cc1Swenshuai.xi HAL_TSP_STC64_Mode_En(TRUE);
7497*53ee8cc1Swenshuai.xi #endif
7498*53ee8cc1Swenshuai.xi
7499*53ee8cc1Swenshuai.xi _s32ExtMutexId = OSAL_TSP_MutexCreate((MS_U8*)tsp_ext_mutex);
7500*53ee8cc1Swenshuai.xi _s32TspEventId = OSAL_TSP_EventCreate((MS_U8*)tsp_event); // MsOS_CreateEventGroup("TSP_Event");
7501*53ee8cc1Swenshuai.xi
7502*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < ((TSP_SECFLT_NUM+31)>>5); u8ii++)
7503*53ee8cc1Swenshuai.xi {
7504*53ee8cc1Swenshuai.xi _s32TspSecRdyId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_secRdy);
7505*53ee8cc1Swenshuai.xi _s32TspSecOvfId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_crcerr);
7506*53ee8cc1Swenshuai.xi _s32TspSecCrcId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_secovf);
7507*53ee8cc1Swenshuai.xi _s32TspFltDisableId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_fltdis);
7508*53ee8cc1Swenshuai.xi _u32SecNotifyId[u8ii] = 0;
7509*53ee8cc1Swenshuai.xi }
7510*53ee8cc1Swenshuai.xi
7511*53ee8cc1Swenshuai.xi #if 0
7512*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < ((TSP_PIDFLT_NUM_ALL+31)>>5); u8ii++)
7513*53ee8cc1Swenshuai.xi {
7514*53ee8cc1Swenshuai.xi _s32EventFree0[u8ii] = OSAL_TSP_EventCreate((MS_U8*)freelist0);
7515*53ee8cc1Swenshuai.xi _s32EventFreeDefer0[u8ii] = OSAL_TSP_EventCreate((MS_U8*)freelistdefer0);
7516*53ee8cc1Swenshuai.xi }
7517*53ee8cc1Swenshuai.xi #endif
7518*53ee8cc1Swenshuai.xi
7519*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
7520*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < ((TSP_PCRFLT_NUM+31)>>5); u8ii++)
7521*53ee8cc1Swenshuai.xi {
7522*53ee8cc1Swenshuai.xi _u32HwPcrNotifyId[u8ii] = 0;
7523*53ee8cc1Swenshuai.xi }
7524*53ee8cc1Swenshuai.xi #endif
7525*53ee8cc1Swenshuai.xi
7526*53ee8cc1Swenshuai.xi #ifndef NO_PVR
7527*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < ((TSP_PVR_IF_NUM+31)>>5); u8ii++)
7528*53ee8cc1Swenshuai.xi {
7529*53ee8cc1Swenshuai.xi _u32PvrNotifyId[u8ii] = 0;
7530*53ee8cc1Swenshuai.xi }
7531*53ee8cc1Swenshuai.xi #endif
7532*53ee8cc1Swenshuai.xi
7533*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
7534*53ee8cc1Swenshuai.xi _s32TspTaskId = OSAL_TSP_TaskCreate(_TSP_Isr_Proc_Task, (MS_U8*)tsp_isr_task);
7535*53ee8cc1Swenshuai.xi #endif
7536*53ee8cc1Swenshuai.xi
7537*53ee8cc1Swenshuai.xi _ptsp_res->_u32ProcessNum++;
7538*53ee8cc1Swenshuai.xi
7539*53ee8cc1Swenshuai.xi // IntDisable
7540*53ee8cc1Swenshuai.xi // IntDetach
7541*53ee8cc1Swenshuai.xi OSAL_TSP_IntDisable();
7542*53ee8cc1Swenshuai.xi //#ifndef MSOS_TYPE_LINUX_KERNEL
7543*53ee8cc1Swenshuai.xi OSAL_TSP_IntDetach();
7544*53ee8cc1Swenshuai.xi //#endif
7545*53ee8cc1Swenshuai.xi
7546*53ee8cc1Swenshuai.xi OSAL_TSP_IntAttach(_TSP_Isr);
7547*53ee8cc1Swenshuai.xi //#ifndef MSOS_TYPE_LINUX_KERNEL
7548*53ee8cc1Swenshuai.xi OSAL_TSP_IntEnable();
7549*53ee8cc1Swenshuai.xi //#endif
7550*53ee8cc1Swenshuai.xi
7551*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7552*53ee8cc1Swenshuai.xi }
7553*53ee8cc1Swenshuai.xi
7554*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Reset(void)
7555*53ee8cc1Swenshuai.xi {
7556*53ee8cc1Swenshuai.xi _TSP_RegStateReset();
7557*53ee8cc1Swenshuai.xi HAL_TSP_Reset(0);
7558*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7559*53ee8cc1Swenshuai.xi }
7560*53ee8cc1Swenshuai.xi
7561*53ee8cc1Swenshuai.xi MS_BOOL MDrv_TSP_OpenInterrupt(void)
7562*53ee8cc1Swenshuai.xi {
7563*53ee8cc1Swenshuai.xi OSAL_TSP_IntAttach(_TSP_Isr);
7564*53ee8cc1Swenshuai.xi OSAL_TSP_IntEnable();
7565*53ee8cc1Swenshuai.xi return TRUE;
7566*53ee8cc1Swenshuai.xi }
7567*53ee8cc1Swenshuai.xi
7568*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_BurstLen(MS_U32 u32Len)
7569*53ee8cc1Swenshuai.xi {
7570*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7571*53ee8cc1Swenshuai.xi HAL_TSP_SetDMABurstLen(u32Len);
7572*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7573*53ee8cc1Swenshuai.xi }
7574*53ee8cc1Swenshuai.xi
7575*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetFileInTimeStamp(MS_U32* u32TSLen)
7576*53ee8cc1Swenshuai.xi {
7577*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
7578*53ee8cc1Swenshuai.xi
7579*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7580*53ee8cc1Swenshuai.xi *u32TSLen = HAL_TSP_GetFileInTimeStamp();
7581*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7582*53ee8cc1Swenshuai.xi
7583*53ee8cc1Swenshuai.xi #else
7584*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7585*53ee8cc1Swenshuai.xi #endif //udef NO_FILEIN
7586*53ee8cc1Swenshuai.xi }
7587*53ee8cc1Swenshuai.xi
7588*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetDbgPortInfo(MS_U32 u32DbgSel,MS_U32* u32DbgInfo)
7589*53ee8cc1Swenshuai.xi {
7590*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7591*53ee8cc1Swenshuai.xi *u32DbgInfo = HAL_TSP_GetDBGPortInfo(u32DbgSel);
7592*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7593*53ee8cc1Swenshuai.xi }
7594*53ee8cc1Swenshuai.xi
7595*53ee8cc1Swenshuai.xi //[LEGACY] //[OBSOLETE]
7596*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetHK(MS_BOOL bIsHK)
7597*53ee8cc1Swenshuai.xi {
7598*53ee8cc1Swenshuai.xi _bIsHK = bIsHK;
7599*53ee8cc1Swenshuai.xi _u32IntNum = (bIsHK) ? E_INT_IRQ_TSP2HK : E_INT_FIQ_TSP2AEON; // use this once MHEG5 using utopia msos
7600*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7601*53ee8cc1Swenshuai.xi }
7602*53ee8cc1Swenshuai.xi //[LEGACY] //[OBSOLETE]
7603*53ee8cc1Swenshuai.xi
7604*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetAVPause(MS_BOOL bSet)
7605*53ee8cc1Swenshuai.xi {
7606*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7607*53ee8cc1Swenshuai.xi
7608*53ee8cc1Swenshuai.xi #ifndef NO_CA
7609*53ee8cc1Swenshuai.xi HAL_TSP_Set_AVPAUSE(bSet);
7610*53ee8cc1Swenshuai.xi #endif
7611*53ee8cc1Swenshuai.xi
7612*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7613*53ee8cc1Swenshuai.xi }
7614*53ee8cc1Swenshuai.xi
7615*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_LiveSrcSwitch(DrvTSP_FltType eFltSrcType)
7616*53ee8cc1Swenshuai.xi {
7617*53ee8cc1Swenshuai.xi #ifndef NO_PVR
7618*53ee8cc1Swenshuai.xi MS_U16 u16pad, u16clk = 0;
7619*53ee8cc1Swenshuai.xi MS_BOOL bParall = TRUE, bExtSync = TRUE;
7620*53ee8cc1Swenshuai.xi DrvTSP_PadIn epad = E_DRVTSP_PAD_DEMOD;
7621*53ee8cc1Swenshuai.xi
7622*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7623*53ee8cc1Swenshuai.xi
7624*53ee8cc1Swenshuai.xi switch(eFltSrcType & E_DRVTSP_FLT_SOURCE_TYPE_MASK)
7625*53ee8cc1Swenshuai.xi {
7626*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_LIVE:
7627*53ee8cc1Swenshuai.xi HAL_TSP_TSIF1_Enable(FALSE);
7628*53ee8cc1Swenshuai.xi #ifndef NO_CA
7629*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(TSP_CA_INPUT_TSIF0_LIVEIN|TSP_CA_OUTPUT_PLAY_LIVE);
7630*53ee8cc1Swenshuai.xi #endif
7631*53ee8cc1Swenshuai.xi break;
7632*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS1:
7633*53ee8cc1Swenshuai.xi HAL_TSP_GetTSIF_Status(0, &u16pad, &u16clk, &bParall, &bExtSync);
7634*53ee8cc1Swenshuai.xi if(u16pad == TSP_MUX_TS0)
7635*53ee8cc1Swenshuai.xi {
7636*53ee8cc1Swenshuai.xi epad = E_DRVTSP_PAD_EXT_INPUT0;
7637*53ee8cc1Swenshuai.xi }
7638*53ee8cc1Swenshuai.xi else if(u16pad == TSP_MUX_TS1)
7639*53ee8cc1Swenshuai.xi {
7640*53ee8cc1Swenshuai.xi epad = E_DRVTSP_PAD_EXT_INPUT1;
7641*53ee8cc1Swenshuai.xi }
7642*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
7643*53ee8cc1Swenshuai.xi else if(u16pad == TSP_MUX_TS2)
7644*53ee8cc1Swenshuai.xi {
7645*53ee8cc1Swenshuai.xi epad = E_DRVTSP_PAD_EXT_INPUT2;
7646*53ee8cc1Swenshuai.xi }
7647*53ee8cc1Swenshuai.xi #endif
7648*53ee8cc1Swenshuai.xi HAL_TSP_SelPad(0, 1, (MS_U32)epad);
7649*53ee8cc1Swenshuai.xi HAL_TSP_SelPad_ClkInv(0, 1, (u16clk & TSP_CLK_INVERSE));
7650*53ee8cc1Swenshuai.xi HAL_TSP_SelPad_ExtSync(0, bExtSync, 1);
7651*53ee8cc1Swenshuai.xi HAL_TSP_SelPad_Parl(0, bParall, 1);
7652*53ee8cc1Swenshuai.xi #ifndef NO_CA
7653*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(TSP_CA_INPUT_TSIF1|TSP_CA_OUTPUT_PLAY_LIVE);
7654*53ee8cc1Swenshuai.xi #endif
7655*53ee8cc1Swenshuai.xi HAL_TSP_TSIF1_Enable(TRUE);
7656*53ee8cc1Swenshuai.xi break;
7657*53ee8cc1Swenshuai.xi default:
7658*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_NOT_SUPPORTED);
7659*53ee8cc1Swenshuai.xi break;
7660*53ee8cc1Swenshuai.xi
7661*53ee8cc1Swenshuai.xi }
7662*53ee8cc1Swenshuai.xi
7663*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7664*53ee8cc1Swenshuai.xi #endif //NO_PVR
7665*53ee8cc1Swenshuai.xi
7666*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7667*53ee8cc1Swenshuai.xi }
7668*53ee8cc1Swenshuai.xi
7669*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_AU_BD_Mode_Enable(MS_BOOL bEnable)
7670*53ee8cc1Swenshuai.xi {
7671*53ee8cc1Swenshuai.xi #ifndef NO_FILEIN
7672*53ee8cc1Swenshuai.xi if(HAL_TSP_AU_BD_Mode_Enable(bEnable))
7673*53ee8cc1Swenshuai.xi {
7674*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7675*53ee8cc1Swenshuai.xi }
7676*53ee8cc1Swenshuai.xi else
7677*53ee8cc1Swenshuai.xi #endif
7678*53ee8cc1Swenshuai.xi {
7679*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7680*53ee8cc1Swenshuai.xi }
7681*53ee8cc1Swenshuai.xi }
7682*53ee8cc1Swenshuai.xi
7683*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_FW_VER(MS_U32* u32FWVer)
7684*53ee8cc1Swenshuai.xi {
7685*53ee8cc1Swenshuai.xi MS_U32 _u32fw;
7686*53ee8cc1Swenshuai.xi _u32fw = HAL_TSP_Get_FW_VER();
7687*53ee8cc1Swenshuai.xi *u32FWVer = _u32fw;
7688*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7689*53ee8cc1Swenshuai.xi }
7690*53ee8cc1Swenshuai.xi
7691*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_Intr_Count(MS_U32* pu32Count)
7692*53ee8cc1Swenshuai.xi {
7693*53ee8cc1Swenshuai.xi *pu32Count = _ptsp_res->_u32DbgIntrCount;
7694*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7695*53ee8cc1Swenshuai.xi }
7696*53ee8cc1Swenshuai.xi
7697*53ee8cc1Swenshuai.xi void MDrv_TSP_WriteProtect_Enable(MS_BOOL bEnable, MS_PHY* pphyStartAddr, MS_PHY* pphyEndAddr)
7698*53ee8cc1Swenshuai.xi {
7699*53ee8cc1Swenshuai.xi HAL_TSP_WriteProtect_Enable(bEnable, pphyStartAddr, pphyEndAddr);
7700*53ee8cc1Swenshuai.xi }
7701*53ee8cc1Swenshuai.xi
7702*53ee8cc1Swenshuai.xi void MDrv_TSP_OrzWriteProtect_Enable(MS_BOOL bEnable, MS_PHY phyStartAddr, MS_PHY phyEndAddr)
7703*53ee8cc1Swenshuai.xi {
7704*53ee8cc1Swenshuai.xi HAL_TSP_OrzWriteProtect_Enable(bEnable, phyStartAddr, phyEndAddr);
7705*53ee8cc1Swenshuai.xi }
7706*53ee8cc1Swenshuai.xi
7707*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_TSIF_Enable(DrvTSP_If tsif, MS_BOOL bEnable)
7708*53ee8cc1Swenshuai.xi {
7709*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7710*53ee8cc1Swenshuai.xi switch (tsif)
7711*53ee8cc1Swenshuai.xi {
7712*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_PLAYBACK:
7713*53ee8cc1Swenshuai.xi HAL_TSP_TSIF0_Enable(bEnable);
7714*53ee8cc1Swenshuai.xi break;
7715*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_PVR0:
7716*53ee8cc1Swenshuai.xi HAL_TSP_TSIF1_Enable(bEnable);
7717*53ee8cc1Swenshuai.xi break;
7718*53ee8cc1Swenshuai.xi #ifdef DTS2_IF_SUPPORT
7719*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_PVR1:
7720*53ee8cc1Swenshuai.xi HAL_TSP_TSIF2_Enable(bEnable);
7721*53ee8cc1Swenshuai.xi break;
7722*53ee8cc1Swenshuai.xi #endif
7723*53ee8cc1Swenshuai.xi default:
7724*53ee8cc1Swenshuai.xi ULOGE("TSP", "[%s][%d] IF not support\n",__FUNCTION__, __LINE__);
7725*53ee8cc1Swenshuai.xi break;
7726*53ee8cc1Swenshuai.xi }
7727*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7728*53ee8cc1Swenshuai.xi }
7729*53ee8cc1Swenshuai.xi
7730*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_ReadDropPktCnt(MS_U16* pu16ADropCnt, MS_U16* pu16VDropCnt)
7731*53ee8cc1Swenshuai.xi {
7732*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7733*53ee8cc1Swenshuai.xi
7734*53ee8cc1Swenshuai.xi if(HAL_TSP_Read_DropPktCnt(pu16ADropCnt, pu16VDropCnt) == TRUE)
7735*53ee8cc1Swenshuai.xi {
7736*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7737*53ee8cc1Swenshuai.xi }
7738*53ee8cc1Swenshuai.xi else
7739*53ee8cc1Swenshuai.xi {
7740*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
7741*53ee8cc1Swenshuai.xi }
7742*53ee8cc1Swenshuai.xi }
7743*53ee8cc1Swenshuai.xi static void _DumpFwMsg(void)
7744*53ee8cc1Swenshuai.xi {
7745*53ee8cc1Swenshuai.xi int tmp = 0;
7746*53ee8cc1Swenshuai.xi int len = 0;
7747*53ee8cc1Swenshuai.xi char p8buf[256];
7748*53ee8cc1Swenshuai.xi char* p = NULL;
7749*53ee8cc1Swenshuai.xi MS_U32 u32WritePos = *(volatile MS_U32*)MS_PA2KSEG1(_FwDbgInfo.phyBufAddr);
7750*53ee8cc1Swenshuai.xi
7751*53ee8cc1Swenshuai.xi p8buf[255] = '\0';
7752*53ee8cc1Swenshuai.xi p = (char*)(MS_PA2KSEG1(_FwDbgInfo.phyBufAddr) + _FwDbgInfo.u32ReadPos);
7753*53ee8cc1Swenshuai.xi //ULOGD("TSP", "_pFwDbgInfo->phyBufAddr = 0x%x\n", (unsigned int)_FwDbgInfo.phyBufAddr);
7754*53ee8cc1Swenshuai.xi //ULOGD("TSP", "_pFwDbgInfo->u32ReadPos = 0x%x\n", (unsigned int)_FwDbgInfo.u32ReadPos);
7755*53ee8cc1Swenshuai.xi //ULOGD("TSP", "_pFwDbgInfo->u32WritePos = 0x%x\n", (unsigned int)u32WritePos);
7756*53ee8cc1Swenshuai.xi if(u32WritePos > _FwDbgInfo.u32Size)
7757*53ee8cc1Swenshuai.xi {
7758*53ee8cc1Swenshuai.xi TSP_DBG("[%s], WARN : write pointer incorrect!!!\n", __FUNCTION__);
7759*53ee8cc1Swenshuai.xi return;
7760*53ee8cc1Swenshuai.xi }
7761*53ee8cc1Swenshuai.xi if(u32WritePos > _FwDbgInfo.u32ReadPos)
7762*53ee8cc1Swenshuai.xi {
7763*53ee8cc1Swenshuai.xi while(1)
7764*53ee8cc1Swenshuai.xi {
7765*53ee8cc1Swenshuai.xi len = (u32WritePos - _FwDbgInfo.u32ReadPos) > 255 ? 255 : (u32WritePos - _FwDbgInfo.u32ReadPos);
7766*53ee8cc1Swenshuai.xi if((tmp = snprintf(p8buf, len, "%s", p)) == 0)
7767*53ee8cc1Swenshuai.xi break;
7768*53ee8cc1Swenshuai.xi tmp++;
7769*53ee8cc1Swenshuai.xi p+=tmp;
7770*53ee8cc1Swenshuai.xi _FwDbgInfo.u32ReadPos += tmp;
7771*53ee8cc1Swenshuai.xi ULOGD("TSP", "[TSP] %s", p8buf);
7772*53ee8cc1Swenshuai.xi }
7773*53ee8cc1Swenshuai.xi }
7774*53ee8cc1Swenshuai.xi else if(u32WritePos < _FwDbgInfo.u32ReadPos)
7775*53ee8cc1Swenshuai.xi {
7776*53ee8cc1Swenshuai.xi while(1)
7777*53ee8cc1Swenshuai.xi {
7778*53ee8cc1Swenshuai.xi len = (_FwDbgInfo.u32Size - _FwDbgInfo.u32ReadPos) > 255? 255 : (_FwDbgInfo.u32Size - _FwDbgInfo.u32ReadPos);
7779*53ee8cc1Swenshuai.xi if((tmp = snprintf(p8buf, len, "%s", p)) == 0)
7780*53ee8cc1Swenshuai.xi {
7781*53ee8cc1Swenshuai.xi break;
7782*53ee8cc1Swenshuai.xi }
7783*53ee8cc1Swenshuai.xi tmp++;
7784*53ee8cc1Swenshuai.xi p+=tmp;
7785*53ee8cc1Swenshuai.xi _FwDbgInfo.u32ReadPos += tmp;
7786*53ee8cc1Swenshuai.xi ULOGD("TSP", "[TSP] %s", p8buf);
7787*53ee8cc1Swenshuai.xi }
7788*53ee8cc1Swenshuai.xi
7789*53ee8cc1Swenshuai.xi _FwDbgInfo.u32ReadPos = sizeof(MS_U32);
7790*53ee8cc1Swenshuai.xi p = (char*)(MS_PA2KSEG1(_FwDbgInfo.phyBufAddr) + _FwDbgInfo.u32ReadPos);
7791*53ee8cc1Swenshuai.xi
7792*53ee8cc1Swenshuai.xi while(1)
7793*53ee8cc1Swenshuai.xi {
7794*53ee8cc1Swenshuai.xi len = (u32WritePos - _FwDbgInfo.u32ReadPos) > 255 ? 255 : (u32WritePos - _FwDbgInfo.u32ReadPos);
7795*53ee8cc1Swenshuai.xi if((tmp = snprintf(p8buf, len, "%s", p)) == 0)
7796*53ee8cc1Swenshuai.xi {
7797*53ee8cc1Swenshuai.xi break;
7798*53ee8cc1Swenshuai.xi }
7799*53ee8cc1Swenshuai.xi tmp++;
7800*53ee8cc1Swenshuai.xi p+=tmp;
7801*53ee8cc1Swenshuai.xi _FwDbgInfo.u32ReadPos += tmp;
7802*53ee8cc1Swenshuai.xi ULOGD("TSP", "[TSP] %s", p8buf);
7803*53ee8cc1Swenshuai.xi }
7804*53ee8cc1Swenshuai.xi }
7805*53ee8cc1Swenshuai.xi }
7806*53ee8cc1Swenshuai.xi
7807*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetFwDBGParam(MS_PHY phyAddr, MS_U32 u32Size, MS_U32 u32DbgWord)
7808*53ee8cc1Swenshuai.xi {
7809*53ee8cc1Swenshuai.xi TSP_ASSERT((phyAddr != 0) && (u32Size != 0),
7810*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%06d] memory information for debug buffer incorrect address : %lx, size : %d\n", __LINE__, (unsigned long)phyAddr, (unsigned int)u32Size));
7811*53ee8cc1Swenshuai.xi
7812*53ee8cc1Swenshuai.xi
7813*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7814*53ee8cc1Swenshuai.xi
7815*53ee8cc1Swenshuai.xi HAL_TSP_OrzWriteProtect_Enable(FALSE, 0, 0);
7816*53ee8cc1Swenshuai.xi if(HAL_TSP_SetFwDbgMem(phyAddr, u32Size) && HAL_TSP_SetFwDbgWord(u32DbgWord))
7817*53ee8cc1Swenshuai.xi {
7818*53ee8cc1Swenshuai.xi _FwDbgInfo.bEnable = TRUE;
7819*53ee8cc1Swenshuai.xi _FwDbgInfo.phyBufAddr = phyAddr;
7820*53ee8cc1Swenshuai.xi _FwDbgInfo.u32Size = u32Size;
7821*53ee8cc1Swenshuai.xi _FwDbgInfo.u32ReadPos = sizeof(MS_U32);
7822*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7823*53ee8cc1Swenshuai.xi }
7824*53ee8cc1Swenshuai.xi else
7825*53ee8cc1Swenshuai.xi {
7826*53ee8cc1Swenshuai.xi TSP_DBG("********HAL_TSP_SetFwDbgMem fail**************\n");
7827*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
7828*53ee8cc1Swenshuai.xi }
7829*53ee8cc1Swenshuai.xi }
7830*53ee8cc1Swenshuai.xi
7831*53ee8cc1Swenshuai.xi #if 0
7832*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_ResetFileinTimestamp(void)
7833*53ee8cc1Swenshuai.xi {
7834*53ee8cc1Swenshuai.xi HAL_TSP_ResetTimeStamp();
7835*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7836*53ee8cc1Swenshuai.xi }
7837*53ee8cc1Swenshuai.xi #endif
7838*53ee8cc1Swenshuai.xi
7839*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7840*53ee8cc1Swenshuai.xi /// Set Virtual Queue buffer
7841*53ee8cc1Swenshuai.xi /// @param phyVQBaseAddr \b IN: Virtual Queue memorry address
7842*53ee8cc1Swenshuai.xi /// @param u32VQBufLen_192PKT \b IN: Number of packets for Virtual Queue (192 bytes per packet)
7843*53ee8cc1Swenshuai.xi /// @return TSP_Result
7844*53ee8cc1Swenshuai.xi /// @note
7845*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7846*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetVQueBuf(MS_PHY phyVQBaseAddr, MS_U32 u32VQBufLen)
7847*53ee8cc1Swenshuai.xi {
7848*53ee8cc1Swenshuai.xi #ifdef VQ_ENABLE
7849*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7850*53ee8cc1Swenshuai.xi HAL_TSP_SetVQBuffer(phyVQBaseAddr, u32VQBufLen);
7851*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7852*53ee8cc1Swenshuai.xi #else
7853*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7854*53ee8cc1Swenshuai.xi #endif
7855*53ee8cc1Swenshuai.xi }
7856*53ee8cc1Swenshuai.xi
7857*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7858*53ee8cc1Swenshuai.xi /// Enable/Disable Virtual Quere
7859*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: Virtual Queue memorry Enable flag
7860*53ee8cc1Swenshuai.xi /// @return TSP_Result
7861*53ee8cc1Swenshuai.xi /// @note
7862*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7863*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_VQueEnable(MS_BOOL bEnable)
7864*53ee8cc1Swenshuai.xi {
7865*53ee8cc1Swenshuai.xi #ifdef VQ_ENABLE
7866*53ee8cc1Swenshuai.xi
7867*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7868*53ee8cc1Swenshuai.xi HAL_TSP_VQueue_Enable(bEnable);
7869*53ee8cc1Swenshuai.xi
7870*53ee8cc1Swenshuai.xi if(!bEnable)
7871*53ee8cc1Swenshuai.xi {
7872*53ee8cc1Swenshuai.xi //HAL_TSP_SetVQBuffer(0, 0);
7873*53ee8cc1Swenshuai.xi HAL_TSP_VQueue_Reset();
7874*53ee8cc1Swenshuai.xi }
7875*53ee8cc1Swenshuai.xi
7876*53ee8cc1Swenshuai.xi #ifndef FIVQ_ENABLE
7877*53ee8cc1Swenshuai.xi _ptsp_res->_bLiveSING_FilePP = bEnable;
7878*53ee8cc1Swenshuai.xi HAL_TSP_DoubleBuf_En(!_ptsp_res->_bLiveSING_FilePP);
7879*53ee8cc1Swenshuai.xi #endif
7880*53ee8cc1Swenshuai.xi
7881*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7882*53ee8cc1Swenshuai.xi
7883*53ee8cc1Swenshuai.xi #else
7884*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7885*53ee8cc1Swenshuai.xi #endif
7886*53ee8cc1Swenshuai.xi }
7887*53ee8cc1Swenshuai.xi
7888*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7889*53ee8cc1Swenshuai.xi /// Reset Virtual Quere
7890*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7891*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_VQueReset(void)
7892*53ee8cc1Swenshuai.xi {
7893*53ee8cc1Swenshuai.xi #ifdef VQ_ENABLE
7894*53ee8cc1Swenshuai.xi
7895*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7896*53ee8cc1Swenshuai.xi HAL_TSP_VQueue_Reset();
7897*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7898*53ee8cc1Swenshuai.xi
7899*53ee8cc1Swenshuai.xi #else
7900*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7901*53ee8cc1Swenshuai.xi #endif
7902*53ee8cc1Swenshuai.xi }
7903*53ee8cc1Swenshuai.xi
7904*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_VQueue_OverflowInt_En(MS_BOOL bEnable)
7905*53ee8cc1Swenshuai.xi {
7906*53ee8cc1Swenshuai.xi #ifdef VQ_ENABLE
7907*53ee8cc1Swenshuai.xi
7908*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7909*53ee8cc1Swenshuai.xi HAL_TSP_VQueue_OverflowInt_En(bEnable);
7910*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7911*53ee8cc1Swenshuai.xi
7912*53ee8cc1Swenshuai.xi #else
7913*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7914*53ee8cc1Swenshuai.xi #endif
7915*53ee8cc1Swenshuai.xi }
7916*53ee8cc1Swenshuai.xi
7917*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7918*53ee8cc1Swenshuai.xi /// Set Virtual Quere request threshold
7919*53ee8cc1Swenshuai.xi /// @param u8req_len \b IN: Request length
7920*53ee8cc1Swenshuai.xi /// @return TSP_Result
7921*53ee8cc1Swenshuai.xi /// @note
7922*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7923*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Set_VQ_Threshold(MS_U8 u8req_len)
7924*53ee8cc1Swenshuai.xi {
7925*53ee8cc1Swenshuai.xi #ifdef VQ_ENABLE
7926*53ee8cc1Swenshuai.xi
7927*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7928*53ee8cc1Swenshuai.xi HAL_TSP_Set_Req_VQ_RX_Threshold(u8req_len);
7929*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7930*53ee8cc1Swenshuai.xi
7931*53ee8cc1Swenshuai.xi #else
7932*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7933*53ee8cc1Swenshuai.xi #endif
7934*53ee8cc1Swenshuai.xi }
7935*53ee8cc1Swenshuai.xi
7936*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_VQStatus(MS_U32* pu32Status)
7937*53ee8cc1Swenshuai.xi {
7938*53ee8cc1Swenshuai.xi #ifdef VQ_ENABLE
7939*53ee8cc1Swenshuai.xi
7940*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7941*53ee8cc1Swenshuai.xi *pu32Status = HAL_TSP_Get_VQStatus();
7942*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7943*53ee8cc1Swenshuai.xi
7944*53ee8cc1Swenshuai.xi #else
7945*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7946*53ee8cc1Swenshuai.xi #endif
7947*53ee8cc1Swenshuai.xi }
7948*53ee8cc1Swenshuai.xi
7949*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7950*53ee8cc1Swenshuai.xi /// Set MOBF encrypt key
7951*53ee8cc1Swenshuai.xi /// @param u32Key0 \b IN: Encrypt Key0
7952*53ee8cc1Swenshuai.xi /// @param u32Key1 \b IN: Encrypt Key1
7953*53ee8cc1Swenshuai.xi /// @return TSP_Result
7954*53ee8cc1Swenshuai.xi /// @note
7955*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7956*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Set_MOBF_PVRKey(MS_U32 u32Key0, MS_U32 u32Key1)
7957*53ee8cc1Swenshuai.xi {
7958*53ee8cc1Swenshuai.xi #ifdef MOBF_ENABLE
7959*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7960*53ee8cc1Swenshuai.xi HAL_TSP_MOBF_Set_PVRKey(u32Key0, u32Key1);
7961*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7962*53ee8cc1Swenshuai.xi #else
7963*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7964*53ee8cc1Swenshuai.xi #endif
7965*53ee8cc1Swenshuai.xi }
7966*53ee8cc1Swenshuai.xi
7967*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7968*53ee8cc1Swenshuai.xi /// Set MOBF encrypt key
7969*53ee8cc1Swenshuai.xi /// @param u32Key0 \b IN: Encrypt Key0
7970*53ee8cc1Swenshuai.xi /// @param u32Key1 \b IN: Encrypt Key1
7971*53ee8cc1Swenshuai.xi /// @return TSP_Result
7972*53ee8cc1Swenshuai.xi /// @note
7973*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7974*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Set_MOBF_PVR1Key(MS_U32 u32Key0, MS_U32 u32Key1)
7975*53ee8cc1Swenshuai.xi {
7976*53ee8cc1Swenshuai.xi #ifdef MOBF_ENABLE
7977*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7978*53ee8cc1Swenshuai.xi HAL_TSP_MOBF_Set_PVRKey_EX(1, u32Key0, u32Key1);
7979*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7980*53ee8cc1Swenshuai.xi #else
7981*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7982*53ee8cc1Swenshuai.xi #endif
7983*53ee8cc1Swenshuai.xi }
7984*53ee8cc1Swenshuai.xi
7985*53ee8cc1Swenshuai.xi
7986*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7987*53ee8cc1Swenshuai.xi /// Set MOBF decrypt key
7988*53ee8cc1Swenshuai.xi /// @param u32Key \b IN: Decrypt Key
7989*53ee8cc1Swenshuai.xi /// @return TSP_Result
7990*53ee8cc1Swenshuai.xi /// @note
7991*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7992*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Set_MOBF_FileinKey(MS_U32 u32Key)
7993*53ee8cc1Swenshuai.xi {
7994*53ee8cc1Swenshuai.xi #ifdef MOBF_ENABLE
7995*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7996*53ee8cc1Swenshuai.xi HAL_TSP_MOBF_Set_FileinKey(u32Key);
7997*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7998*53ee8cc1Swenshuai.xi #else
7999*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
8000*53ee8cc1Swenshuai.xi #endif
8001*53ee8cc1Swenshuai.xi }
8002*53ee8cc1Swenshuai.xi
8003*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
8004*53ee8cc1Swenshuai.xi /// Enable/Disable MOBF encrypt mode
8005*53ee8cc1Swenshuai.xi /// @param benable \b IN: Enable flag
8006*53ee8cc1Swenshuai.xi /// @return TSP_Result
8007*53ee8cc1Swenshuai.xi /// @note
8008*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
8009*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_MOBF_PVR_Enable(MS_BOOL benable)
8010*53ee8cc1Swenshuai.xi {
8011*53ee8cc1Swenshuai.xi #ifdef MOBF_ENABLE
8012*53ee8cc1Swenshuai.xi _TSP_ENTRY();
8013*53ee8cc1Swenshuai.xi HAL_TSP_MOBF_PVR_Enable(benable);
8014*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
8015*53ee8cc1Swenshuai.xi #else
8016*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
8017*53ee8cc1Swenshuai.xi #endif
8018*53ee8cc1Swenshuai.xi }
8019*53ee8cc1Swenshuai.xi
8020*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
8021*53ee8cc1Swenshuai.xi /// Enable/Disable MOBF decrypt mode
8022*53ee8cc1Swenshuai.xi /// @param benable \b IN: Enable flag
8023*53ee8cc1Swenshuai.xi /// @return TSP_Result
8024*53ee8cc1Swenshuai.xi /// @note
8025*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
8026*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_MOBF_FileIn_Enable(MS_BOOL benable)
8027*53ee8cc1Swenshuai.xi {
8028*53ee8cc1Swenshuai.xi #ifdef MOBF_ENABLE
8029*53ee8cc1Swenshuai.xi _TSP_ENTRY();
8030*53ee8cc1Swenshuai.xi HAL_TSP_MOBF_Filein_Enable(benable);
8031*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
8032*53ee8cc1Swenshuai.xi #else
8033*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
8034*53ee8cc1Swenshuai.xi #endif
8035*53ee8cc1Swenshuai.xi }
8036*53ee8cc1Swenshuai.xi
8037*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_CMD_Run(MS_U32 u32Cmd, MS_U32 u32Config0, MS_U32 u32Config1 ,void *pData)
8038*53ee8cc1Swenshuai.xi {
8039*53ee8cc1Swenshuai.xi _TSP_ENTRY();
8040*53ee8cc1Swenshuai.xi
8041*53ee8cc1Swenshuai.xi if(HAL_TSP_CMD_Run(u32Cmd, u32Config0, u32Config1,pData))
8042*53ee8cc1Swenshuai.xi {
8043*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
8044*53ee8cc1Swenshuai.xi }
8045*53ee8cc1Swenshuai.xi else
8046*53ee8cc1Swenshuai.xi {
8047*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
8048*53ee8cc1Swenshuai.xi }
8049*53ee8cc1Swenshuai.xi }
8050*53ee8cc1Swenshuai.xi
8051*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetFwDataAddr(MS_PHY phyDataAddr, MS_U32 u32Size)
8052*53ee8cc1Swenshuai.xi {
8053*53ee8cc1Swenshuai.xi TSP_ASSERT((phyDataAddr & _TSP_QMEM_D_MASK),
8054*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%06d] setFwDataAddr 0x%x <= 0x%x\n", __LINE__, (unsigned int)phyDataAddr, (unsigned int)(~_TSP_QMEM_D_MASK)));
8055*53ee8cc1Swenshuai.xi
8056*53ee8cc1Swenshuai.xi _TSP_ENTRY();
8057*53ee8cc1Swenshuai.xi
8058*53ee8cc1Swenshuai.xi HAL_TSP_OrzWriteProtect_Enable(TRUE, phyDataAddr, phyDataAddr+u32Size);
8059*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetDataAddr(phyDataAddr);
8060*53ee8cc1Swenshuai.xi _ptsp_res->_phyTspFWDramBuf = phyDataAddr;
8061*53ee8cc1Swenshuai.xi _ptsp_res->_u32TspFwDramBufSize = u32Size;
8062*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
8063*53ee8cc1Swenshuai.xi }
8064*53ee8cc1Swenshuai.xi
8065*53ee8cc1Swenshuai.xi // -------------------------------------------------------------
8066*53ee8cc1Swenshuai.xi // Debug table
8067*53ee8cc1Swenshuai.xi // -------------------------------------------------------------
8068*53ee8cc1Swenshuai.xi #ifdef DEBUG_TABLE_SUPPORT
8069*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_DisContiCnt(DrvTSP_DisContiCnt_info* tspInfo, MS_U32* pu32Cnt)
8070*53ee8cc1Swenshuai.xi {
8071*53ee8cc1Swenshuai.xi TSP_DisconPktCnt_Info TspDisContiCntInfo;
8072*53ee8cc1Swenshuai.xi
8073*53ee8cc1Swenshuai.xi _TSP_ENTRY();
8074*53ee8cc1Swenshuai.xi
8075*53ee8cc1Swenshuai.xi memset(&TspDisContiCntInfo, 0, sizeof(TSP_DisconPktCnt_Info));
8076*53ee8cc1Swenshuai.xi TspDisContiCntInfo.TspCmd = tspInfo->TspCmd;
8077*53ee8cc1Swenshuai.xi TspDisContiCntInfo.TspFifo = tspInfo->TspFifo;
8078*53ee8cc1Swenshuai.xi TspDisContiCntInfo.TspSrc = tspInfo->TspSrc;
8079*53ee8cc1Swenshuai.xi
8080*53ee8cc1Swenshuai.xi *pu32Cnt = HAL_TSP_Get_DisContiCnt(&TspDisContiCntInfo);
8081*53ee8cc1Swenshuai.xi
8082*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
8083*53ee8cc1Swenshuai.xi }
8084*53ee8cc1Swenshuai.xi
8085*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_DropPktCnt(DrvTSP_DropPktCnt_info* tspInfo, MS_U32* pu32Cnt)
8086*53ee8cc1Swenshuai.xi {
8087*53ee8cc1Swenshuai.xi TSP_DisconPktCnt_Info TspDropPktCntInfo;
8088*53ee8cc1Swenshuai.xi
8089*53ee8cc1Swenshuai.xi _TSP_ENTRY();
8090*53ee8cc1Swenshuai.xi
8091*53ee8cc1Swenshuai.xi memset(&TspDropPktCntInfo, 0, sizeof(TSP_DisconPktCnt_Info));
8092*53ee8cc1Swenshuai.xi TspDropPktCntInfo.TspCmd = tspInfo->TspCmd;
8093*53ee8cc1Swenshuai.xi TspDropPktCntInfo.TspFifo = tspInfo->TspFifo;
8094*53ee8cc1Swenshuai.xi TspDropPktCntInfo.TspSrc = tspInfo->TspSrc;
8095*53ee8cc1Swenshuai.xi
8096*53ee8cc1Swenshuai.xi *pu32Cnt = HAL_TSP_Get_DropPktCnt(&TspDropPktCntInfo);
8097*53ee8cc1Swenshuai.xi
8098*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
8099*53ee8cc1Swenshuai.xi }
8100*53ee8cc1Swenshuai.xi
8101*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_LockPktCnt(DrvTSP_LockPktCnt_info* tspInfo, MS_U32* pu32Cnt)
8102*53ee8cc1Swenshuai.xi {
8103*53ee8cc1Swenshuai.xi TSP_LockPktCnt_info TspLockCntInfo;
8104*53ee8cc1Swenshuai.xi
8105*53ee8cc1Swenshuai.xi _TSP_ENTRY();
8106*53ee8cc1Swenshuai.xi
8107*53ee8cc1Swenshuai.xi memset(&TspLockCntInfo, 0, sizeof(TSP_LockPktCnt_info));
8108*53ee8cc1Swenshuai.xi TspLockCntInfo.TspCmd = tspInfo->TspCmd;
8109*53ee8cc1Swenshuai.xi TspLockCntInfo.TspTsif = tspInfo->TspTsif;
8110*53ee8cc1Swenshuai.xi
8111*53ee8cc1Swenshuai.xi *pu32Cnt = HAL_TSP_Get_LockPktCnt(&TspLockCntInfo);
8112*53ee8cc1Swenshuai.xi
8113*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
8114*53ee8cc1Swenshuai.xi }
8115*53ee8cc1Swenshuai.xi
8116*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_AVPktCnt(DrvTSP_AVPktCnt_info* tspInfo, MS_U32* pu32Cnt)
8117*53ee8cc1Swenshuai.xi {
8118*53ee8cc1Swenshuai.xi TSP_AVPktCnt_info TspAVCntInfo;
8119*53ee8cc1Swenshuai.xi
8120*53ee8cc1Swenshuai.xi _TSP_ENTRY();
8121*53ee8cc1Swenshuai.xi
8122*53ee8cc1Swenshuai.xi memset(&TspAVCntInfo, 0, sizeof(TSP_AVPktCnt_info));
8123*53ee8cc1Swenshuai.xi TspAVCntInfo.TspCmd = tspInfo->TspCmd;
8124*53ee8cc1Swenshuai.xi TspAVCntInfo.TspFifo = tspInfo->TspFifo;
8125*53ee8cc1Swenshuai.xi TspAVCntInfo.TspFifoSrc = tspInfo->TspFifoSrc;
8126*53ee8cc1Swenshuai.xi
8127*53ee8cc1Swenshuai.xi *pu32Cnt = HAL_TSP_GetAVPktCnt(&TspAVCntInfo);
8128*53ee8cc1Swenshuai.xi
8129*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
8130*53ee8cc1Swenshuai.xi }
8131*53ee8cc1Swenshuai.xi #endif
8132*53ee8cc1Swenshuai.xi
8133*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
8134*53ee8cc1Swenshuai.xi /// Get TEI Section error Packet count
8135*53ee8cc1Swenshuai.xi /// @param FltSrc \b IN: Filter source of packet
8136*53ee8cc1Swenshuai.xi /// @param pu32PktCnt \b OUT: pointer to store TEI packet count value
8137*53ee8cc1Swenshuai.xi /// @note
8138*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
8139*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_SecTEI_PktCount(DrvTSP_FltType FltSrc, MS_U32* pu32PktCnt)
8140*53ee8cc1Swenshuai.xi {
8141*53ee8cc1Swenshuai.xi _TSP_ENTRY();
8142*53ee8cc1Swenshuai.xi if(FltSrc == E_DRVTSP_FLT_SOURCE_TYPE_FILE)
8143*53ee8cc1Swenshuai.xi {
8144*53ee8cc1Swenshuai.xi *pu32PktCnt = HAL_TSP_Get_SecTEI_PktCount(1);
8145*53ee8cc1Swenshuai.xi }
8146*53ee8cc1Swenshuai.xi else
8147*53ee8cc1Swenshuai.xi {
8148*53ee8cc1Swenshuai.xi *pu32PktCnt = HAL_TSP_Get_SecTEI_PktCount(0);
8149*53ee8cc1Swenshuai.xi }
8150*53ee8cc1Swenshuai.xi
8151*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
8152*53ee8cc1Swenshuai.xi }
8153*53ee8cc1Swenshuai.xi
8154*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
8155*53ee8cc1Swenshuai.xi /// Reset Section TEI error Packet count
8156*53ee8cc1Swenshuai.xi /// @param FltSrc \b IN: Filter source of packet
8157*53ee8cc1Swenshuai.xi /// @note
8158*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
8159*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Reset_SecTEI_PktCount(DrvTSP_FltType FltSrc)
8160*53ee8cc1Swenshuai.xi {
8161*53ee8cc1Swenshuai.xi _TSP_ENTRY();
8162*53ee8cc1Swenshuai.xi if(FltSrc == E_DRVTSP_FLT_SOURCE_TYPE_FILE)
8163*53ee8cc1Swenshuai.xi {
8164*53ee8cc1Swenshuai.xi HAL_TSP_Reset_SecTEI_PktCount(1);
8165*53ee8cc1Swenshuai.xi }
8166*53ee8cc1Swenshuai.xi else
8167*53ee8cc1Swenshuai.xi {
8168*53ee8cc1Swenshuai.xi HAL_TSP_Reset_SecTEI_PktCount(0);
8169*53ee8cc1Swenshuai.xi }
8170*53ee8cc1Swenshuai.xi
8171*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
8172*53ee8cc1Swenshuai.xi }
8173*53ee8cc1Swenshuai.xi
8174*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
8175*53ee8cc1Swenshuai.xi /// Get Section Dis-continuity Packet count
8176*53ee8cc1Swenshuai.xi /// @param u32FltID \b IN: Filter source of packet
8177*53ee8cc1Swenshuai.xi /// @param pu32PktCnt \b OUT: pointer to store Dis-continuity packet count value
8178*53ee8cc1Swenshuai.xi /// @note
8179*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
8180*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_SecDisCont_PktCount(MS_U32 u32FltID, MS_U32* pu32PktCnt)
8181*53ee8cc1Swenshuai.xi {
8182*53ee8cc1Swenshuai.xi _TSP_ENTRY();
8183*53ee8cc1Swenshuai.xi *pu32PktCnt = HAL_TSP_Get_SecDisCont_PktCount(u32FltID);
8184*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
8185*53ee8cc1Swenshuai.xi }
8186*53ee8cc1Swenshuai.xi
8187*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
8188*53ee8cc1Swenshuai.xi /// Reset Section Dis-continuity Packet count
8189*53ee8cc1Swenshuai.xi /// @param u32FltID \b IN: Filter source of packet
8190*53ee8cc1Swenshuai.xi /// @note
8191*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
8192*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Reset_SecDisCont_PktCount(MS_U32 u32FltID)
8193*53ee8cc1Swenshuai.xi {
8194*53ee8cc1Swenshuai.xi _TSP_ENTRY();
8195*53ee8cc1Swenshuai.xi HAL_TSP_Reset_SecDisCont_PktCount(u32FltID);
8196*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
8197*53ee8cc1Swenshuai.xi }
8198*53ee8cc1Swenshuai.xi
8199*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------------
8200*53ee8cc1Swenshuai.xi // Refer to _TSP_Isr_ProcSelf, this is for user mode to getting events when using kernel dmx driver
8201*53ee8cc1Swenshuai.xi // Plese update both _TSP_Isr_ProcSelf & MDrv_TSP_Get_IoSignal at the same time for synchrony ISR evets processing flow
8202*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------------
8203*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Wait_IoSignal(DrvTSP_IoSignal *pstIoSignal)
8204*53ee8cc1Swenshuai.xi {
8205*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
8206*53ee8cc1Swenshuai.xi MS_U32 u32ii, u32Evt = 0;
8207*53ee8cc1Swenshuai.xi
8208*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_MAX_PVRSIGFLAG_NUM; u32ii++)
8209*53ee8cc1Swenshuai.xi {
8210*53ee8cc1Swenshuai.xi pstIoSignal->u32PvrBufFullFlag[u32ii] = 0;
8211*53ee8cc1Swenshuai.xi }
8212*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_MAX_SIGFLAG_NUM; u32ii++)
8213*53ee8cc1Swenshuai.xi {
8214*53ee8cc1Swenshuai.xi pstIoSignal->u32SecRdyFlag[u32ii] = 0;
8215*53ee8cc1Swenshuai.xi pstIoSignal->u32SecOvfFlag[u32ii] = 0;
8216*53ee8cc1Swenshuai.xi }
8217*53ee8cc1Swenshuai.xi
8218*53ee8cc1Swenshuai.xi _TSP_GetEvent(u32Evt, TSP_TASK_EVENT_GROUP_SELF|TSP_TASK_EVENT_FLT_FREE, OSAL_EVENT_OR_CLEAR, MSOS_WAIT_FOREVER);
8219*53ee8cc1Swenshuai.xi pstIoSignal->u32TspEvt = u32Evt;
8220*53ee8cc1Swenshuai.xi //ULOGD("TSP", "u32TspEvt %lx\n", pstIoSignal->u32TspEvt);
8221*53ee8cc1Swenshuai.xi
8222*53ee8cc1Swenshuai.xi #endif //end of MSOS_TYPE_LINUX_KERNEL
8223*53ee8cc1Swenshuai.xi
8224*53ee8cc1Swenshuai.xi return DRVTSP_OK;
8225*53ee8cc1Swenshuai.xi }
8226*53ee8cc1Swenshuai.xi
8227*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Proc_IoSignal(DrvTSP_IoSignal *pstIoSignal)
8228*53ee8cc1Swenshuai.xi {
8229*53ee8cc1Swenshuai.xi
8230*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
8231*53ee8cc1Swenshuai.xi TSP_Result Ret = DRVTSP_OK;
8232*53ee8cc1Swenshuai.xi MS_U32 u32ii, u32jj;
8233*53ee8cc1Swenshuai.xi MS_U32 u32GroupNum = (TSP_SECFLT_NUM_All + 31) >> 5;
8234*53ee8cc1Swenshuai.xi
8235*53ee8cc1Swenshuai.xi if(pstIoSignal->u32TspEvt & TSP_TASK_EVENT_FLT_FREE)
8236*53ee8cc1Swenshuai.xi {
8237*53ee8cc1Swenshuai.xi _TSP_Isr_ProcSelf(TSP_TASK_EVENT_FLT_FREE, &Ret);
8238*53ee8cc1Swenshuai.xi pstIoSignal->u32TspEvt &= ~TSP_TASK_EVENT_FLT_FREE;
8239*53ee8cc1Swenshuai.xi }
8240*53ee8cc1Swenshuai.xi
8241*53ee8cc1Swenshuai.xi #ifndef NO_PVR
8242*53ee8cc1Swenshuai.xi // set PVR buffer events
8243*53ee8cc1Swenshuai.xi if (pstIoSignal->u32TspEvt & (TSP_TASK_EVENT_PVR0_RDY_POLL|TSP_TASK_EVENT_PVR1_RDY_POLL|TSP_TASK_EVENT_PVR0_RDY_SELF|TSP_TASK_EVENT_PVR1_RDY_SELF))
8244*53ee8cc1Swenshuai.xi {
8245*53ee8cc1Swenshuai.xi if (_ptsp_res->_PvrEvtNotify[0] && _ptsp_res->_PvrCallback[0])
8246*53ee8cc1Swenshuai.xi {
8247*53ee8cc1Swenshuai.xi switch(pstIoSignal->u32TspEvt & (TSP_TASK_EVENT_PVR0_RDY_POLL | TSP_TASK_EVENT_PVR1_RDY_POLL | TSP_TASK_EVENT_PVR0_RDY_SELF | TSP_TASK_EVENT_PVR1_RDY_SELF))
8248*53ee8cc1Swenshuai.xi {
8249*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR0_RDY_SELF:
8250*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR0_RDY_POLL:
8251*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[0], E_DRVTSP_EVENT_PVRBUF_FULL))
8252*53ee8cc1Swenshuai.xi {
8253*53ee8cc1Swenshuai.xi pstIoSignal->u32PvrBufFullFlag[0] = 1;
8254*53ee8cc1Swenshuai.xi }
8255*53ee8cc1Swenshuai.xi break;
8256*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR1_RDY_SELF:
8257*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR1_RDY_POLL:
8258*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[0], E_DRVTSP_EVENT_PVRBUF_FULL))
8259*53ee8cc1Swenshuai.xi {
8260*53ee8cc1Swenshuai.xi pstIoSignal->u32PvrBufFullFlag[0] |= 2;
8261*53ee8cc1Swenshuai.xi }
8262*53ee8cc1Swenshuai.xi break;
8263*53ee8cc1Swenshuai.xi case (TSP_TASK_EVENT_PVR0_RDY_SELF | TSP_TASK_EVENT_PVR1_RDY_SELF):
8264*53ee8cc1Swenshuai.xi case (TSP_TASK_EVENT_PVR0_RDY_POLL | TSP_TASK_EVENT_PVR1_RDY_POLL):
8265*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[0], E_DRVTSP_EVENT_PVRBUF_OVERFLOW))
8266*53ee8cc1Swenshuai.xi {
8267*53ee8cc1Swenshuai.xi pstIoSignal->u32PvrBufFullFlag[0] = 0xFF;
8268*53ee8cc1Swenshuai.xi }
8269*53ee8cc1Swenshuai.xi break;
8270*53ee8cc1Swenshuai.xi default:
8271*53ee8cc1Swenshuai.xi break;
8272*53ee8cc1Swenshuai.xi }
8273*53ee8cc1Swenshuai.xi }
8274*53ee8cc1Swenshuai.xi }
8275*53ee8cc1Swenshuai.xi
8276*53ee8cc1Swenshuai.xi #ifdef TS2_IF_SUPPORT
8277*53ee8cc1Swenshuai.xi if (pstIoSignal->u32TspEvt & (TSP_TASK_EVENT_CBPVR0_RDY_POLL|TSP_TASK_EVENT_CBPVR0_RDY_SELF))
8278*53ee8cc1Swenshuai.xi {
8279*53ee8cc1Swenshuai.xi if (_ptsp_res->_PvrEvtNotify[1] && _ptsp_res->_PvrCallback[1])
8280*53ee8cc1Swenshuai.xi {
8281*53ee8cc1Swenshuai.xi switch (pstIoSignal->u32TspEvt & (TSP_TASK_EVENT_CBPVR0_RDY_POLL | TSP_TASK_EVENT_CBPVR0_RDY_SELF))
8282*53ee8cc1Swenshuai.xi {
8283*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_CBPVR0_RDY_POLL:
8284*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_CBPVR0_RDY_SELF:
8285*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[1], E_DRVTSP_EVENT_CBBUF_FULL))
8286*53ee8cc1Swenshuai.xi {
8287*53ee8cc1Swenshuai.xi pstIoSignal->u32PvrBufFullFlag[1] = 1;
8288*53ee8cc1Swenshuai.xi }
8289*53ee8cc1Swenshuai.xi break;
8290*53ee8cc1Swenshuai.xi }
8291*53ee8cc1Swenshuai.xi }
8292*53ee8cc1Swenshuai.xi }
8293*53ee8cc1Swenshuai.xi #endif //endof TS2_IF_SUPPORT
8294*53ee8cc1Swenshuai.xi
8295*53ee8cc1Swenshuai.xi #endif //end of NO_PVR
8296*53ee8cc1Swenshuai.xi
8297*53ee8cc1Swenshuai.xi if (pstIoSignal->u32TspEvt & TSP_TASK_EVENT_SECTION_SELF)
8298*53ee8cc1Swenshuai.xi {
8299*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < u32GroupNum; u32ii++)
8300*53ee8cc1Swenshuai.xi {
8301*53ee8cc1Swenshuai.xi MDrv_TSP_Get_SecEvents(u32ii, pstIoSignal);
8302*53ee8cc1Swenshuai.xi }
8303*53ee8cc1Swenshuai.xi }
8304*53ee8cc1Swenshuai.xi
8305*53ee8cc1Swenshuai.xi #endif //end of MSOS_TYPE_LINUX_KERN
8306*53ee8cc1Swenshuai.xi
8307*53ee8cc1Swenshuai.xi return DRVTSP_OK;
8308*53ee8cc1Swenshuai.xi }
8309*53ee8cc1Swenshuai.xi
8310*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_SecEvents(MS_U32 u32Group, DrvTSP_IoSignal *pstIoSignal)
8311*53ee8cc1Swenshuai.xi {
8312*53ee8cc1Swenshuai.xi MS_U32 u32PidFltGroup = 0, u32SecFlt = 0, u32PidFlt = 0;
8313*53ee8cc1Swenshuai.xi MS_U32 u32RdyMask = 0, u32OvfMask = 0;
8314*53ee8cc1Swenshuai.xi
8315*53ee8cc1Swenshuai.xi _TSP_GetModeSecRdy(u32Group, 0xFFFFFFFF, &u32RdyMask, OSAL_EVENT_OR_CLEAR);
8316*53ee8cc1Swenshuai.xi _TSP_GetModeSecOvf(u32Group, 0xFFFFFFFF, &u32OvfMask, OSAL_EVENT_OR_CLEAR);
8317*53ee8cc1Swenshuai.xi
8318*53ee8cc1Swenshuai.xi u32SecFlt = u32Group << 5;
8319*53ee8cc1Swenshuai.xi while(u32RdyMask)
8320*53ee8cc1Swenshuai.xi {
8321*53ee8cc1Swenshuai.xi if(u32RdyMask & 0x01)
8322*53ee8cc1Swenshuai.xi {
8323*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[pstIoSignal->u32Eng].FltMap[u32SecFlt] != u32SecFlt)
8324*53ee8cc1Swenshuai.xi {
8325*53ee8cc1Swenshuai.xi for(u32PidFlt = 0; u32PidFlt < TSP_PIDFLT_NUM_ALL; u32PidFlt++)
8326*53ee8cc1Swenshuai.xi {
8327*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[pstIoSignal->u32Eng].FltMap[u32PidFlt] == u32SecFlt)
8328*53ee8cc1Swenshuai.xi {
8329*53ee8cc1Swenshuai.xi break;
8330*53ee8cc1Swenshuai.xi }
8331*53ee8cc1Swenshuai.xi }
8332*53ee8cc1Swenshuai.xi }
8333*53ee8cc1Swenshuai.xi else
8334*53ee8cc1Swenshuai.xi {
8335*53ee8cc1Swenshuai.xi u32PidFlt = u32SecFlt;
8336*53ee8cc1Swenshuai.xi }
8337*53ee8cc1Swenshuai.xi if(u32PidFlt < TSP_PIDFLT_NUM_ALL)
8338*53ee8cc1Swenshuai.xi {
8339*53ee8cc1Swenshuai.xi if((_ptsp_res->_TspState[pstIoSignal->u32Eng].FltState[u32PidFlt] & E_DRVTSP_FLT_STATE_ENABLE)&&
8340*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[pstIoSignal->u32Eng].SecFltEvtNotify[u32SecFlt] & E_DRVTSP_EVENT_DATA_READY) &&
8341*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[pstIoSignal->u32Eng].SecFltCallback[u32SecFlt]))
8342*53ee8cc1Swenshuai.xi {
8343*53ee8cc1Swenshuai.xi u32PidFltGroup = u32PidFlt >> 5;
8344*53ee8cc1Swenshuai.xi pstIoSignal->u32SecRdyFlag[u32PidFltGroup] |= (1 << (u32PidFlt & 0x1F));
8345*53ee8cc1Swenshuai.xi }
8346*53ee8cc1Swenshuai.xi }
8347*53ee8cc1Swenshuai.xi }
8348*53ee8cc1Swenshuai.xi u32RdyMask >>= 1;
8349*53ee8cc1Swenshuai.xi u32SecFlt++;
8350*53ee8cc1Swenshuai.xi }
8351*53ee8cc1Swenshuai.xi
8352*53ee8cc1Swenshuai.xi u32SecFlt = u32Group << 5;
8353*53ee8cc1Swenshuai.xi while(u32OvfMask)
8354*53ee8cc1Swenshuai.xi {
8355*53ee8cc1Swenshuai.xi if(u32OvfMask & 0x01)
8356*53ee8cc1Swenshuai.xi {
8357*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[pstIoSignal->u32Eng].FltMap[u32SecFlt] != u32SecFlt)
8358*53ee8cc1Swenshuai.xi {
8359*53ee8cc1Swenshuai.xi for(u32PidFlt = 0; u32PidFlt < TSP_PIDFLT_NUM_ALL; u32PidFlt++)
8360*53ee8cc1Swenshuai.xi {
8361*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[pstIoSignal->u32Eng].FltMap[u32PidFlt] == u32SecFlt)
8362*53ee8cc1Swenshuai.xi {
8363*53ee8cc1Swenshuai.xi break;
8364*53ee8cc1Swenshuai.xi }
8365*53ee8cc1Swenshuai.xi }
8366*53ee8cc1Swenshuai.xi }
8367*53ee8cc1Swenshuai.xi else
8368*53ee8cc1Swenshuai.xi {
8369*53ee8cc1Swenshuai.xi u32PidFlt = u32SecFlt;
8370*53ee8cc1Swenshuai.xi }
8371*53ee8cc1Swenshuai.xi if(u32PidFlt < TSP_PIDFLT_NUM_ALL)
8372*53ee8cc1Swenshuai.xi {
8373*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[pstIoSignal->u32Eng].FltState[u32PidFlt] & E_DRVTSP_FLT_STATE_ENABLE)
8374*53ee8cc1Swenshuai.xi {
8375*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
8376*53ee8cc1Swenshuai.xi _TSP_PidFlt_Disable(pstIoSignal->u32Eng, u32PidFlt); // ???? move out --> OK // // critical section
8377*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
8378*53ee8cc1Swenshuai.xi }
8379*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[pstIoSignal->u32Eng].FltState[u32PidFlt] != E_DRVTSP_FLT_STATE_FREE) &&
8380*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[pstIoSignal->u32Eng].SecFltEvtNotify[u32SecFlt] & E_DRVTSP_EVENT_BUF_OVERFLOW) &&
8381*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[pstIoSignal->u32Eng].SecFltCallback[u32SecFlt]))
8382*53ee8cc1Swenshuai.xi {
8383*53ee8cc1Swenshuai.xi u32PidFltGroup = u32PidFlt >> 5;
8384*53ee8cc1Swenshuai.xi pstIoSignal->u32SecOvfFlag[u32PidFltGroup] |= (1 << (u32PidFlt & 0x1F));
8385*53ee8cc1Swenshuai.xi }
8386*53ee8cc1Swenshuai.xi }
8387*53ee8cc1Swenshuai.xi }
8388*53ee8cc1Swenshuai.xi u32OvfMask >>= 1;
8389*53ee8cc1Swenshuai.xi u32SecFlt++;
8390*53ee8cc1Swenshuai.xi }
8391*53ee8cc1Swenshuai.xi
8392*53ee8cc1Swenshuai.xi return DRVTSP_OK;
8393*53ee8cc1Swenshuai.xi }
8394*53ee8cc1Swenshuai.xi
8395*53ee8cc1Swenshuai.xi
8396