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 "MsVersion.h"
118*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
119*53ee8cc1Swenshuai.xi #include "ULog.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 "regTSP.h"
126*53ee8cc1Swenshuai.xi #include "halTSP.h"
127*53ee8cc1Swenshuai.xi #include "drvTSP.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 #ifdef SECURE_PVR_ENABLE
141*53ee8cc1Swenshuai.xi #include "halCHIP.h"
142*53ee8cc1Swenshuai.xi #include "../../drv/mbx/apiMBX_St.h"
143*53ee8cc1Swenshuai.xi #include "../../drv/mbx/apiMBX.h"
144*53ee8cc1Swenshuai.xi #include "../drv/sys/tee_client_api.h"
145*53ee8cc1Swenshuai.xi #endif
146*53ee8cc1Swenshuai.xi
147*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
148*53ee8cc1Swenshuai.xi static MS_U8 u8TSPFirmware[] = {
149*53ee8cc1Swenshuai.xi #include "fwTSP.dat"
150*53ee8cc1Swenshuai.xi };
151*53ee8cc1Swenshuai.xi #endif
152*53ee8cc1Swenshuai.xi
153*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
154*53ee8cc1Swenshuai.xi // Driver Compiler Options
155*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
156*53ee8cc1Swenshuai.xi
157*53ee8cc1Swenshuai.xi
158*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
159*53ee8cc1Swenshuai.xi // Local Defines
160*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
161*53ee8cc1Swenshuai.xi #define _TSP_SetEvent(eventid, flag) OSAL_TSP_EventSet(eventid, (flag))
162*53ee8cc1Swenshuai.xi #define _TSP_GetEvent(eventid, events, flag, opt, timeout) OSAL_TSP_EventGet(eventid, (flag), &(events), (opt), (timeout))
163*53ee8cc1Swenshuai.xi
164*53ee8cc1Swenshuai.xi #define _TSP_SetSecRdyId(fltid) OSAL_TSP_EventSet(_s32TspSecRdyId[fltid>>5], (1UL<<(fltid&0x1FUL)))
165*53ee8cc1Swenshuai.xi #define _TSP_GetSecRdyId(fltid, events, opt) OSAL_TSP_EventGet(_s32TspSecRdyId[fltid>>5], (1UL<<(fltid&0x1FUL)), (events), (opt), 0)
166*53ee8cc1Swenshuai.xi #define _TSP_GetModeSecRdy(idx, mask,events, opt) OSAL_TSP_EventGet(_s32TspSecRdyId[idx], mask, (events), (opt), 0)
167*53ee8cc1Swenshuai.xi
168*53ee8cc1Swenshuai.xi #define _TSP_SetSecOvfId(fltid) OSAL_TSP_EventSet(_s32TspSecOvfId[fltid>>5], (1UL<<(fltid&0x1FUL)))
169*53ee8cc1Swenshuai.xi #define _TSP_GetSecOvfId(fltid, events, opt) OSAL_TSP_EventGet(_s32TspSecOvfId[fltid>>5], (1UL<<(fltid&0x1FUL)), (events), (opt), 0)
170*53ee8cc1Swenshuai.xi #define _TSP_GetModeSecOvf(idx, mask,events, opt) OSAL_TSP_EventGet(_s32TspSecOvfId[idx], mask, (events), (opt), 0)
171*53ee8cc1Swenshuai.xi
172*53ee8cc1Swenshuai.xi #define _TSP_SetSecCrcId(fltid) OSAL_TSP_EventSet(_s32TspSecCrcId[fltid>>5], (1UL<<(fltid&0x1FUL)))
173*53ee8cc1Swenshuai.xi #define _TSP_GetSecCrcId(fltid, events, opt) OSAL_TSP_EventGet(_s32TspSecCrcId[fltid>>5], (1UL<<(fltid&0x1FUL)), (events), (opt), 0)
174*53ee8cc1Swenshuai.xi #define _TSP_GetModeSecCrc(idx, mask,events, opt) OSAL_TSP_EventGet(_s32TspSecCrcId[idx], mask, (events), (opt), 0)
175*53ee8cc1Swenshuai.xi
176*53ee8cc1Swenshuai.xi #define _TSP_SetFltDisableId(fltid) OSAL_TSP_EventSet(_s32TspFltDisableId[fltid>>5], (1UL<<(fltid&0x1FUL)))
177*53ee8cc1Swenshuai.xi #define _TSP_GetFltDisableId(fltid, events, opt) OSAL_TSP_EventGet(_s32TspFltDisableId[fltid>>5], (1UL<<(fltid&0x1FUL)), (events), (opt), 0)
178*53ee8cc1Swenshuai.xi #define _TSP_GetModeFltDisable(idx, mask,events, opt) OSAL_TSP_EventGet(_s32TspFltDisableId[idx], mask, (events), (opt), 0)
179*53ee8cc1Swenshuai.xi
180*53ee8cc1Swenshuai.xi #if 0
181*53ee8cc1Swenshuai.xi #define _TSP_FLAG_FREE_TIMEOUT 4
182*53ee8cc1Swenshuai.xi #define _TSP_SetEventFree0Id(fltid) OSAL_TSP_EventSet(_s32EventFree0[fltid>>5], (1<<(fltid&0x1F)))
183*53ee8cc1Swenshuai.xi #define _TSP_GetEventFree0Id(fltid, events, opt) OSAL_TSP_EventGet(_s32EventFree0[fltid>>5], (1<<(fltid&0x1F)), (events), (opt), 0)
184*53ee8cc1Swenshuai.xi #define _TSP_GetModeEventFree0(idx, mask,events, opt) OSAL_TSP_EventGet(_s32EventFree0[idx], mask, (events), (opt), 0)
185*53ee8cc1Swenshuai.xi #define _TSP_FLAG_SetDone(fltid) OSAL_TSP_EventSet(_s32DoneFlags[fltid>>5], (1<<(fltid&0x1F)))
186*53ee8cc1Swenshuai.xi #define _TSP_FLAG_GetDone(fltid, events, opt) OSAL_TSP_EventGet(_s32DoneFlags[fltid>>5], (1<<(fltid&0x1F)), (events), (opt), _TSP_FLAG_FREE_TIMEOUT)
187*53ee8cc1Swenshuai.xi #endif
188*53ee8cc1Swenshuai.xi
189*53ee8cc1Swenshuai.xi #if 0
190*53ee8cc1Swenshuai.xi #define _TSP_SetEventFreeDefer0Id(fltid) OSAL_TSP_EventSet(_s32EventFreeDefer0[fltid>>5], (1<<(fltid&0x1F)))
191*53ee8cc1Swenshuai.xi #define _TSP_GetEventFreeDefer0Id(fltid, events, opt) OSAL_TSP_EventGet(_s32EventFreeDefer0[fltid>>5], (1<<(fltid&0x1F)), (events), (opt), 0)
192*53ee8cc1Swenshuai.xi #define _TSP_GetEventFreeDefer0(idx, mask,events, opt) OSAL_TSP_EventGet(_s32EventFreeDefer0[idx], mask, (events), (opt), 0)
193*53ee8cc1Swenshuai.xi #endif
194*53ee8cc1Swenshuai.xi
195*53ee8cc1Swenshuai.xi // for mutiple process using, record which filter is enabled by this process
196*53ee8cc1Swenshuai.xi #define _TSP_SetSecNotifyId(fltid) (_u32SecNotifyId[(fltid>>5)] |= (1UL << (fltid&0x1FUL)))
197*53ee8cc1Swenshuai.xi #define _TSP_RemoveSecNotifyId(fltid) (_u32SecNotifyId[(fltid>>5)] &= ~(1UL << (fltid&0x1FUL)))
198*53ee8cc1Swenshuai.xi #define _TSP_ChkSecNotifyId(fltid) (_u32SecNotifyId[(fltid>>5)] & (1UL << (fltid&0x1FUL)))
199*53ee8cc1Swenshuai.xi
200*53ee8cc1Swenshuai.xi // for mutiple process using, record which pvr engine is enabled by this process
201*53ee8cc1Swenshuai.xi #ifndef NO_PVR
202*53ee8cc1Swenshuai.xi #define _TSP_SetPvrNotifyId(fltid) (_u32PvrNotifyId[(fltid>>5)] |= (1UL << (fltid&0x1FUL)))
203*53ee8cc1Swenshuai.xi #define _TSP_RemovePvrNotifyId(fltid) (_u32PvrNotifyId[(fltid>>5)] &= ~(1UL << (fltid&0x1FUL)))
204*53ee8cc1Swenshuai.xi #define _TSP_ChkPvrNotifyId(fltid) (_u32PvrNotifyId[(fltid>>5)] & (1UL << (fltid&0x1FUL)))
205*53ee8cc1Swenshuai.xi #endif
206*53ee8cc1Swenshuai.xi
207*53ee8cc1Swenshuai.xi // for mutiple process using, record which hw pcr is enabled by this process
208*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
209*53ee8cc1Swenshuai.xi #define _TSP_SetHwPcrNotifyId(fltid) (_u32HwPcrNotifyId[(fltid>>5)] |= (1UL << (fltid&0x1FUL)))
210*53ee8cc1Swenshuai.xi #define _TSP_RemoveHwPcrNotifyId(fltid) (_u32HwPcrNotifyId[(fltid>>5)] &= ~(1UL << (fltid&0x1FUL)))
211*53ee8cc1Swenshuai.xi #define _TSP_ChkHwPcrNotifyId(fltid) (_u32HwPcrNotifyId[(fltid>>5)] & (1UL << (fltid&0x1FUL)))
212*53ee8cc1Swenshuai.xi #endif
213*53ee8cc1Swenshuai.xi
214*53ee8cc1Swenshuai.xi #define _TSP_MUTEX_TIMEOUT 10000UL //OSAL_TSP_MUTEX_TIMEOUT
215*53ee8cc1Swenshuai.xi
216*53ee8cc1Swenshuai.xi // For kernel STR callback function, should not use mutex
217*53ee8cc1Swenshuai.xi #define _TSP_ENTRY() do{ \
218*53ee8cc1Swenshuai.xi while (!OSAL_TSP_MutexObtain(_ptsp_res->_s32TspMutexId, _TSP_MUTEX_TIMEOUT)) \
219*53ee8cc1Swenshuai.xi { \
220*53ee8cc1Swenshuai.xi _ptsp_res->_u32LastErr = DRVTSP_FUNC_ERROR; \
221*53ee8cc1Swenshuai.xi printf("TSP FATAL ERR: [%s][%d] TSP mutex get error\n", __FUNCTION__, __LINE__); \
222*53ee8cc1Swenshuai.xi MsOS_DelayTask(1); \
223*53ee8cc1Swenshuai.xi } \
224*53ee8cc1Swenshuai.xi while(!OSAL_TSP_MutexObtain(_ptsp_res->_s32IndMutexId, _TSP_MUTEX_TIMEOUT)) \
225*53ee8cc1Swenshuai.xi { \
226*53ee8cc1Swenshuai.xi _ptsp_res->_u32LastErr = DRVTSP_FUNC_ERROR; \
227*53ee8cc1Swenshuai.xi printf("TSP FATAL ERR: [%s][%d] IND mutex get error\n", __FUNCTION__, __LINE__); \
228*53ee8cc1Swenshuai.xi MsOS_DelayTask(1); \
229*53ee8cc1Swenshuai.xi } \
230*53ee8cc1Swenshuai.xi }while(0);
231*53ee8cc1Swenshuai.xi
232*53ee8cc1Swenshuai.xi #define _TSP_RETURN(_ret) do { \
233*53ee8cc1Swenshuai.xi if(!OSAL_TSP_MutexRelease(_ptsp_res->_s32IndMutexId)) \
234*53ee8cc1Swenshuai.xi { \
235*53ee8cc1Swenshuai.xi printf("TSP FATAL ERR: [%s][%d] IND mutex free error\n", __FUNCTION__, __LINE__); \
236*53ee8cc1Swenshuai.xi } \
237*53ee8cc1Swenshuai.xi if(!OSAL_TSP_MutexRelease(_ptsp_res->_s32TspMutexId)) \
238*53ee8cc1Swenshuai.xi { \
239*53ee8cc1Swenshuai.xi printf("TSP FATAL ERR: [%s][%d] TSP mutex free error\n", __FUNCTION__, __LINE__); \
240*53ee8cc1Swenshuai.xi } \
241*53ee8cc1Swenshuai.xi if (_ret != DRVTSP_OK) { _ptsp_res->_u32LastErr = _ret; } \
242*53ee8cc1Swenshuai.xi return _ret; \
243*53ee8cc1Swenshuai.xi }while(0); // Should be optimized by compiler
244*53ee8cc1Swenshuai.xi
245*53ee8cc1Swenshuai.xi #define _TSP_IND_LOCK() while(!OSAL_TSP_MutexObtain(_ptsp_res->_s32IndMutexId, _TSP_MUTEX_TIMEOUT)) \
246*53ee8cc1Swenshuai.xi { \
247*53ee8cc1Swenshuai.xi printf("TSP FATAL ERR: [%s][%d] IND mutex get error\n", __FUNCTION__, __LINE__); \
248*53ee8cc1Swenshuai.xi MsOS_DelayTask(1); \
249*53ee8cc1Swenshuai.xi }
250*53ee8cc1Swenshuai.xi
251*53ee8cc1Swenshuai.xi #define _TSP_IND_UNLOCK() if(!OSAL_TSP_MutexRelease(_ptsp_res->_s32IndMutexId)) { printf("TSP FATAL ERR: [%s][%d] IND mutex free error\n", __FUNCTION__, __LINE__); }
252*53ee8cc1Swenshuai.xi
253*53ee8cc1Swenshuai.xi #define _TSP_INT_LOCK() while(!OSAL_TSP_MutexObtain(_ptsp_res->_s32IntRegMutexId, _TSP_MUTEX_TIMEOUT)) \
254*53ee8cc1Swenshuai.xi { \
255*53ee8cc1Swenshuai.xi printf("TSP FATAL ERR: [%s][%d] INT mutex get error\n", __FUNCTION__, __LINE__); \
256*53ee8cc1Swenshuai.xi MsOS_DelayTask(1); \
257*53ee8cc1Swenshuai.xi }
258*53ee8cc1Swenshuai.xi
259*53ee8cc1Swenshuai.xi #define _TSP_INT_UNLOCK() if(!OSAL_TSP_MutexRelease(_ptsp_res->_s32IntRegMutexId)) { printf("TSP FATAL ERR: [%s][%d] INT mutex free error\n", __FUNCTION__, __LINE__); }
260*53ee8cc1Swenshuai.xi
261*53ee8cc1Swenshuai.xi #define _TSP_EXT_LOCK() while((_s32ExtMutexId != -1) && (!OSAL_TSP_MutexObtain(_s32ExtMutexId, _TSP_MUTEX_TIMEOUT))) \
262*53ee8cc1Swenshuai.xi { \
263*53ee8cc1Swenshuai.xi printf("TSP FATAL ERR: [%s][%d] EXT mutex get error %x %x %d\n", __FUNCTION__, __LINE__, (int)_s32ExtMutexId, (int)_s32TspTaskId, (int)_db_flag); \
264*53ee8cc1Swenshuai.xi MsOS_DelayTask(3); \
265*53ee8cc1Swenshuai.xi }
266*53ee8cc1Swenshuai.xi
267*53ee8cc1Swenshuai.xi #define _TSP_EXT_UNLOCK() if((_s32ExtMutexId != -1) && (!OSAL_TSP_MutexRelease(_s32ExtMutexId))){ printf("TSP FATAL ERR: [%s][%d] EXT mutex free error %x %x %d\n", __FUNCTION__, __LINE__, (int)_s32ExtMutexId, (int)_s32TspTaskId, (int)_db_flag); }
268*53ee8cc1Swenshuai.xi
269*53ee8cc1Swenshuai.xi // For kernel STR callback function, should not use mutex
270*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
271*53ee8cc1Swenshuai.xi
272*53ee8cc1Swenshuai.xi #define _TSP_STR_ENTRY() if(_ptsp_res->_bKerStrSuspend == FALSE){ \
273*53ee8cc1Swenshuai.xi while (!OSAL_TSP_MutexObtain(_ptsp_res->_s32TspMutexId, _TSP_MUTEX_TIMEOUT)) \
274*53ee8cc1Swenshuai.xi { \
275*53ee8cc1Swenshuai.xi if(_u32TSPDGBLevel >= E_DRVTSP_DBG_L1) { printf("[%s][%d] TSP mutex get error\n", __FUNCTION__, __LINE__); } \
276*53ee8cc1Swenshuai.xi _ptsp_res->_u32LastErr = DRVTSP_FUNC_ERROR; \
277*53ee8cc1Swenshuai.xi MsOS_DelayTask(3); \
278*53ee8cc1Swenshuai.xi } \
279*53ee8cc1Swenshuai.xi while(!OSAL_TSP_MutexObtain(_ptsp_res->_s32IndMutexId, _TSP_MUTEX_TIMEOUT)) \
280*53ee8cc1Swenshuai.xi { \
281*53ee8cc1Swenshuai.xi if(_u32TSPDGBLevel >= E_DRVTSP_DBG_L1) { printf("[%s][%d] IND mutex get error\n", __FUNCTION__, __LINE__); } \
282*53ee8cc1Swenshuai.xi _ptsp_res->_u32LastErr = DRVTSP_FUNC_ERROR; \
283*53ee8cc1Swenshuai.xi MsOS_DelayTask(3); \
284*53ee8cc1Swenshuai.xi } \
285*53ee8cc1Swenshuai.xi }
286*53ee8cc1Swenshuai.xi
287*53ee8cc1Swenshuai.xi #define _TSP_STR_RETURN(_ret) do{ \
288*53ee8cc1Swenshuai.xi if(_ptsp_res->_bKerStrSuspend == TRUE){ return _ret; } \
289*53ee8cc1Swenshuai.xi if(!OSAL_TSP_MutexRelease(_ptsp_res->_s32IndMutexId)) \
290*53ee8cc1Swenshuai.xi { \
291*53ee8cc1Swenshuai.xi if(_u32TSPDGBLevel >= E_DRVTSP_DBG_L1) { printf("[%s][%d] IND mutex free error\n", __FUNCTION__, __LINE__); } \
292*53ee8cc1Swenshuai.xi } \
293*53ee8cc1Swenshuai.xi if(!OSAL_TSP_MutexRelease(_ptsp_res->_s32TspMutexId)) \
294*53ee8cc1Swenshuai.xi { \
295*53ee8cc1Swenshuai.xi if(_u32TSPDGBLevel >= E_DRVTSP_DBG_L1) { printf("[%s][%d] TSP mutex free error\n", __FUNCTION__, __LINE__); } \
296*53ee8cc1Swenshuai.xi } \
297*53ee8cc1Swenshuai.xi if (_ret != DRVTSP_OK) { _ptsp_res->_u32LastErr = _ret; } \
298*53ee8cc1Swenshuai.xi return _ret; \
299*53ee8cc1Swenshuai.xi }while(0); // Should be optimized by compiler
300*53ee8cc1Swenshuai.xi
301*53ee8cc1Swenshuai.xi #else //else MSOS_TYPE_LINUX_KERNEL
302*53ee8cc1Swenshuai.xi
303*53ee8cc1Swenshuai.xi #define _TSP_STR_ENTRY _TSP_ENTRY
304*53ee8cc1Swenshuai.xi #define _TSP_STR_RETURN(_ret) _TSP_RETURN(_ret)
305*53ee8cc1Swenshuai.xi
306*53ee8cc1Swenshuai.xi #endif //MSOS_TYPE_LINUX_KERNEL
307*53ee8cc1Swenshuai.xi
308*53ee8cc1Swenshuai.xi
309*53ee8cc1Swenshuai.xi #define TSP_ASSERT(_bool, _f) if(!(_bool)){ \
310*53ee8cc1Swenshuai.xi if (_u32TSPDGBLevel == E_DRVTSP_DBG_L1) { (_f); return DRVTSP_FAIL;} \
311*53ee8cc1Swenshuai.xi else if (_u32TSPDGBLevel == E_DRVTSP_DBG_L2) { (_f); MsOS_DelayTask(MSOS_WAIT_FOREVER); return DRVTSP_FAIL;} \
312*53ee8cc1Swenshuai.xi else {return DRVTSP_FAIL;} \
313*53ee8cc1Swenshuai.xi }
314*53ee8cc1Swenshuai.xi
315*53ee8cc1Swenshuai.xi #define TSP_ASSERT2(_bool, _f) if(!(_bool)){ \
316*53ee8cc1Swenshuai.xi if (_u32TSPDGBLevel == E_DRVTSP_DBG_L1) { (_f); _TSP_STR_RETURN(DRVTSP_FAIL);} \
317*53ee8cc1Swenshuai.xi else if (_u32TSPDGBLevel == E_DRVTSP_DBG_L2) { (_f); MsOS_DelayTask(MSOS_WAIT_FOREVER); _TSP_STR_RETURN(DRVTSP_FAIL);} \
318*53ee8cc1Swenshuai.xi else {_TSP_STR_RETURN(DRVTSP_FAIL);} \
319*53ee8cc1Swenshuai.xi }while(0);
320*53ee8cc1Swenshuai.xi
321*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); } }
322*53ee8cc1Swenshuai.xi
323*53ee8cc1Swenshuai.xi
324*53ee8cc1Swenshuai.xi #define DRVTSP_MAP_NULL 0xFFFFFFFFUL
325*53ee8cc1Swenshuai.xi
326*53ee8cc1Swenshuai.xi #define DRVTSP_MAX_PROCESS_NUM (10)
327*53ee8cc1Swenshuai.xi
328*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
329*53ee8cc1Swenshuai.xi #define current get_current()
330*53ee8cc1Swenshuai.xi #endif
331*53ee8cc1Swenshuai.xi
332*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
333*53ee8cc1Swenshuai.xi // Local Structures
334*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
335*53ee8cc1Swenshuai.xi
336*53ee8cc1Swenshuai.xi //----------------
337*53ee8cc1Swenshuai.xi //For Tee
338*53ee8cc1Swenshuai.xi //----------------
339*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
340*53ee8cc1Swenshuai.xi typedef enum
341*53ee8cc1Swenshuai.xi {
342*53ee8cc1Swenshuai.xi E_TSP_TEE_TO_REE_MBX_MSG_NULL,
343*53ee8cc1Swenshuai.xi E_TSP_TEE_TO_REE_MBX_ACK_MSG_INVALID,
344*53ee8cc1Swenshuai.xi E_TSP_TEE_TO_REE_MBX_ACK_MSG_NO_TEE,
345*53ee8cc1Swenshuai.xi E_TSP_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS,
346*53ee8cc1Swenshuai.xi E_TSP_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL
347*53ee8cc1Swenshuai.xi } TSP_TEE_TO_REE_MBX_ACK_TYPE;
348*53ee8cc1Swenshuai.xi #endif
349*53ee8cc1Swenshuai.xi
350*53ee8cc1Swenshuai.xi //--------------------------------------------------------
351*53ee8cc1Swenshuai.xi // Total 128 PID filters
352*53ee8cc1Swenshuai.xi // First 0~63 for section
353*53ee8cc1Swenshuai.xi //--------------------------------------------------------
354*53ee8cc1Swenshuai.xi typedef struct _DrvTSP_State
355*53ee8cc1Swenshuai.xi {
356*53ee8cc1Swenshuai.xi DrvTSP_SW_Status TSPStatus;
357*53ee8cc1Swenshuai.xi DrvTSP_FltState FltState[TSP_PIDFLT_NUM_ALL];
358*53ee8cc1Swenshuai.xi DrvTSP_FltType FltType[TSP_PIDFLT_NUM_ALL];
359*53ee8cc1Swenshuai.xi MS_U32 FltSource[TSP_PIDFLT_NUM_ALL];
360*53ee8cc1Swenshuai.xi MS_U32 FltMap[TSP_PIDFLT_NUM_ALL];
361*53ee8cc1Swenshuai.xi DrvTSP_FltState SecFltState[TSP_SECFLT_NUM];
362*53ee8cc1Swenshuai.xi DrvTSP_Event SecFltEvtNotify[TSP_SECFLT_NUM];
363*53ee8cc1Swenshuai.xi P_DrvTSP_EvtCallback SecFltCallback[TSP_SECFLT_NUM];
364*53ee8cc1Swenshuai.xi DrvTSP_FltState SecBufState[TSP_SECFLT_NUM];
365*53ee8cc1Swenshuai.xi DrvTSP_FltMode SecFltMode[TSP_SECFLT_NUM];
366*53ee8cc1Swenshuai.xi
367*53ee8cc1Swenshuai.xi MS_S32 s32TspEvtId[TSP_SECFLT_NUM];
368*53ee8cc1Swenshuai.xi
369*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
370*53ee8cc1Swenshuai.xi MS_U32 FltSrcId[TSP_PIDFLT_NUM_ALL];
371*53ee8cc1Swenshuai.xi #endif
372*53ee8cc1Swenshuai.xi
373*53ee8cc1Swenshuai.xi #ifdef DUP_PIDFLT
374*53ee8cc1Swenshuai.xi MS_U32 DupFlt[TSP_PIDFLT_NUM];
375*53ee8cc1Swenshuai.xi #endif
376*53ee8cc1Swenshuai.xi } DrvTSP_State;
377*53ee8cc1Swenshuai.xi
378*53ee8cc1Swenshuai.xi typedef struct
379*53ee8cc1Swenshuai.xi {
380*53ee8cc1Swenshuai.xi MS_PHY phyBufAddr;
381*53ee8cc1Swenshuai.xi MS_U32 u32Size;
382*53ee8cc1Swenshuai.xi MS_PHY phyReadPos;
383*53ee8cc1Swenshuai.xi MS_PHY phyWritePos;
384*53ee8cc1Swenshuai.xi MS_BOOL bEnable;
385*53ee8cc1Swenshuai.xi } DrvTSP_FW_DBG_INFO;
386*53ee8cc1Swenshuai.xi
387*53ee8cc1Swenshuai.xi typedef struct _DrvTSP_DscmbFlt_State
388*53ee8cc1Swenshuai.xi {
389*53ee8cc1Swenshuai.xi MS_U32 u32Src;
390*53ee8cc1Swenshuai.xi MS_U32 u32Start;
391*53ee8cc1Swenshuai.xi MS_U32 u32End;
392*53ee8cc1Swenshuai.xi MS_U32 u32ShareStart;
393*53ee8cc1Swenshuai.xi MS_U32 u32ShareEnd;
394*53ee8cc1Swenshuai.xi }DrvTSP_DscmbFlt_State;
395*53ee8cc1Swenshuai.xi
396*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
397*53ee8cc1Swenshuai.xi typedef struct _DrvTSP_HWPcrParams
398*53ee8cc1Swenshuai.xi {
399*53ee8cc1Swenshuai.xi MS_U8 _u8ResetPcr[TSP_PCRFLT_NUM];
400*53ee8cc1Swenshuai.xi MS_U32 _u32PrevStcBase[TSP_PCRFLT_NUM];
401*53ee8cc1Swenshuai.xi MS_U32 _u32PrevPllControl[TSP_PCRFLT_NUM];
402*53ee8cc1Swenshuai.xi }DrvTSP_HWPcrParams;
403*53ee8cc1Swenshuai.xi #endif
404*53ee8cc1Swenshuai.xi
405*53ee8cc1Swenshuai.xi //UFO_DMX_RES_ALLOC_EN - FOR STC
406*53ee8cc1Swenshuai.xi typedef struct _DrvTSP_Stc_State
407*53ee8cc1Swenshuai.xi {
408*53ee8cc1Swenshuai.xi MS_U32 u32PcrFltId;
409*53ee8cc1Swenshuai.xi MS_U32 u32SrcType;
410*53ee8cc1Swenshuai.xi MS_BOOL bUsed;
411*53ee8cc1Swenshuai.xi }DrvTSP_Stc_State;
412*53ee8cc1Swenshuai.xi
413*53ee8cc1Swenshuai.xi #ifdef DMX_UTOPIA_2K
414*53ee8cc1Swenshuai.xi typedef struct _DrvTSP_KMode_ProcEvtIdTbl
415*53ee8cc1Swenshuai.xi {
416*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
417*53ee8cc1Swenshuai.xi pid_t tgid;
418*53ee8cc1Swenshuai.xi #endif
419*53ee8cc1Swenshuai.xi
420*53ee8cc1Swenshuai.xi MS_S32 s32TspEvtId;
421*53ee8cc1Swenshuai.xi }DrvTSP_KMode_ProcEvtIdTbl;
422*53ee8cc1Swenshuai.xi #endif
423*53ee8cc1Swenshuai.xi
424*53ee8cc1Swenshuai.xi typedef struct _TSP_RESOURCE_PRIVATE
425*53ee8cc1Swenshuai.xi {
426*53ee8cc1Swenshuai.xi MS_S32 _s32TspMutexId;
427*53ee8cc1Swenshuai.xi MS_S32 _s32IndMutexId;
428*53ee8cc1Swenshuai.xi MS_S32 _s32IntRegMutexId;
429*53ee8cc1Swenshuai.xi
430*53ee8cc1Swenshuai.xi MS_U32 _u32LastErr;
431*53ee8cc1Swenshuai.xi MS_BOOL _bKerStrSuspend;
432*53ee8cc1Swenshuai.xi MS_U32 _u32ProcessNum;
433*53ee8cc1Swenshuai.xi DrvTSP_State _TspState[TSP_ENGINE_NUM];
434*53ee8cc1Swenshuai.xi
435*53ee8cc1Swenshuai.xi MS_BOOL _bSWInitReady;
436*53ee8cc1Swenshuai.xi MS_PHY _phyFwAddr;
437*53ee8cc1Swenshuai.xi MS_U32 _u32FwSize;
438*53ee8cc1Swenshuai.xi MS_U32 _u32DbgIntrCount;
439*53ee8cc1Swenshuai.xi DrvTSP_If_Set _ifset_save;
440*53ee8cc1Swenshuai.xi
441*53ee8cc1Swenshuai.xi DrvTSP_Event _PvrEvtNotify[TSP_PVR_IF_NUM];
442*53ee8cc1Swenshuai.xi P_DrvTSP_EvtCallback _PvrCallback[TSP_PVR_IF_NUM];
443*53ee8cc1Swenshuai.xi MS_S32 _s32PvrEvtId[TSP_PVR_IF_NUM];
444*53ee8cc1Swenshuai.xi
445*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
446*53ee8cc1Swenshuai.xi DrvTSP_HWPcrParams TSPHwPcrParams;
447*53ee8cc1Swenshuai.xi #endif
448*53ee8cc1Swenshuai.xi
449*53ee8cc1Swenshuai.xi DrvTSP_DscmbFlt_State _DscmbFlt_State[TSP_CA_ENGINE_NUM];
450*53ee8cc1Swenshuai.xi
451*53ee8cc1Swenshuai.xi MS_PHY _phyTspFWDramBuf;
452*53ee8cc1Swenshuai.xi MS_U32 _u32TspFwDramBufSize;
453*53ee8cc1Swenshuai.xi DrvTSP_Stc_State _TspStcState[TSP_STC_NUM];
454*53ee8cc1Swenshuai.xi MS_BOOL _bStcAllocDisable;
455*53ee8cc1Swenshuai.xi MS_U32 _u32StcAdjustUnit;
456*53ee8cc1Swenshuai.xi
457*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
458*53ee8cc1Swenshuai.xi SYS_TEEINFO _teemode;
459*53ee8cc1Swenshuai.xi DrvTSP_SecureBuf _stSecBuf;
460*53ee8cc1Swenshuai.xi #endif
461*53ee8cc1Swenshuai.xi
462*53ee8cc1Swenshuai.xi }TSP_RESOURCE_PRIVATE;
463*53ee8cc1Swenshuai.xi
464*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
465*53ee8cc1Swenshuai.xi // Global Variables
466*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
467*53ee8cc1Swenshuai.xi static MSIF_Version _drv_tsp_version = {
468*53ee8cc1Swenshuai.xi .DDI = { TSP_DRV_VERSION, },
469*53ee8cc1Swenshuai.xi };
470*53ee8cc1Swenshuai.xi
471*53ee8cc1Swenshuai.xi #ifndef TSP_UTOPIA_20
472*53ee8cc1Swenshuai.xi static TSP_RESOURCE_PRIVATE _tsp_res = {
473*53ee8cc1Swenshuai.xi ._s32TspMutexId = -1,
474*53ee8cc1Swenshuai.xi ._s32IndMutexId = -1,
475*53ee8cc1Swenshuai.xi ._s32IntRegMutexId = -1,
476*53ee8cc1Swenshuai.xi
477*53ee8cc1Swenshuai.xi ._u32LastErr = DRVTSP_OK,
478*53ee8cc1Swenshuai.xi ._bKerStrSuspend = FALSE,
479*53ee8cc1Swenshuai.xi ._u32ProcessNum = 0,
480*53ee8cc1Swenshuai.xi ._bSWInitReady = FALSE,
481*53ee8cc1Swenshuai.xi ._phyFwAddr = 0,
482*53ee8cc1Swenshuai.xi ._u32FwSize = 0,
483*53ee8cc1Swenshuai.xi ._u32DbgIntrCount = 0,
484*53ee8cc1Swenshuai.xi ._ifset_save = {E_DRVTSP_PAD_EXT_INPUT0, FALSE, TRUE, TRUE},
485*53ee8cc1Swenshuai.xi
486*53ee8cc1Swenshuai.xi ._PvrEvtNotify = {[0 ... (TSP_PVR_IF_NUM-1)] = E_DRVTSP_EVENT_DATA_INIT},
487*53ee8cc1Swenshuai.xi ._PvrCallback = {[0 ... (TSP_PVR_IF_NUM-1)] = 0},
488*53ee8cc1Swenshuai.xi ._s32PvrEvtId = {[0 ... (TSP_PVR_IF_NUM-1)] = -1},
489*53ee8cc1Swenshuai.xi
490*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
491*53ee8cc1Swenshuai.xi .TSPHwPcrParams = {
492*53ee8cc1Swenshuai.xi ._u8ResetPcr = {[0 ... (TSP_PCRFLT_NUM-1)] = 3},
493*53ee8cc1Swenshuai.xi ._u32PrevStcBase = {[0 ... (TSP_PCRFLT_NUM-1)] = 0},
494*53ee8cc1Swenshuai.xi ._u32PrevPllControl = {[0 ... (TSP_PCRFLT_NUM-1)] = 0},
495*53ee8cc1Swenshuai.xi },
496*53ee8cc1Swenshuai.xi #endif
497*53ee8cc1Swenshuai.xi
498*53ee8cc1Swenshuai.xi ._phyTspFWDramBuf = 0,
499*53ee8cc1Swenshuai.xi ._u32TspFwDramBufSize = 0,
500*53ee8cc1Swenshuai.xi ._sTspStcState = {[0 ... (TSP_STC_NUM-1)] = {0xFFFFFFFF, FALSE}},
501*53ee8cc1Swenshuai.xi ._bStcAllocDisable = FALSE,
502*53ee8cc1Swenshuai.xi _u32StcAdjustUnit = 100,
503*53ee8cc1Swenshuai.xi
504*53ee8cc1Swenshuai.xi
505*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
506*53ee8cc1Swenshuai.xi ._teemode = {.OsType = SYS_TEEINFO_OSTYPE_NOTEE},
507*53ee8cc1Swenshuai.xi ._stSecBuf = {0, 0, 0, 0},
508*53ee8cc1Swenshuai.xi #endif
509*53ee8cc1Swenshuai.xi };
510*53ee8cc1Swenshuai.xi
511*53ee8cc1Swenshuai.xi static TSP_RESOURCE_PRIVATE* _ptsp_res = &_tsp_res;
512*53ee8cc1Swenshuai.xi #else
513*53ee8cc1Swenshuai.xi static TSP_RESOURCE_PRIVATE* _ptsp_res = NULL;
514*53ee8cc1Swenshuai.xi #endif
515*53ee8cc1Swenshuai.xi
516*53ee8cc1Swenshuai.xi static MS_U8 _db_flag = 0;
517*53ee8cc1Swenshuai.xi static MS_S32 _s32ExtMutexId = -1; //For exiting ISR process task
518*53ee8cc1Swenshuai.xi static MS_S32 _s32TspEventId = -1;
519*53ee8cc1Swenshuai.xi static MS_S32 _s32TspSecRdyId[(TSP_SECFLT_NUM+31UL)>>5UL] = {[0 ... (((TSP_SECFLT_NUM+31UL)>>5UL)-1UL)] = -1};
520*53ee8cc1Swenshuai.xi static MS_S32 _s32TspSecOvfId[(TSP_SECFLT_NUM+31UL)>>5UL] = {[0 ... (((TSP_SECFLT_NUM+31UL)>>5UL)-1UL)] = -1};
521*53ee8cc1Swenshuai.xi static MS_S32 _s32TspSecCrcId[(TSP_SECFLT_NUM+31UL)>>5UL] = {[0 ... (((TSP_SECFLT_NUM+31UL)>>5UL)-1UL)] = -1};
522*53ee8cc1Swenshuai.xi static MS_S32 _s32TspFltDisableId[(TSP_SECFLT_NUM+31UL)>>5UL] = {[0 ... (((TSP_SECFLT_NUM+31UL)>>5)-1UL)] = -1};
523*53ee8cc1Swenshuai.xi //static MS_S32 _s32EventFree0[(TSP_PIDFLT_NUM_ALL+31)>>5] = {[0 ... (((TSP_PIDFLT_NUM_ALL+31)>>5)-1)] = -1};
524*53ee8cc1Swenshuai.xi //static MS_S32 _s32DoneFlags[(TSP_PIDFLT_NUM_ALL+31)>>5] = { [0 ... (((TSP_PIDFLT_NUM_ALL+31)>>5)-1)] = -1};
525*53ee8cc1Swenshuai.xi //static MS_S32 _s32EventFreeDefer0[(TSP_PIDFLT_NUM_ALL+31)>>5] = {[0 ... (((TSP_SECFLT_NUM+31)>>5)-1)] = -1};
526*53ee8cc1Swenshuai.xi static MS_U32 _u32SecNotifyId[(TSP_SECFLT_NUM+31UL)>>5UL] = {0UL}; //for ISR processing
527*53ee8cc1Swenshuai.xi
528*53ee8cc1Swenshuai.xi #ifndef NO_PVR
529*53ee8cc1Swenshuai.xi static MS_U32 _u32PvrNotifyId[(TSP_PVR_IF_NUM+31UL)>>5UL] = {0UL};
530*53ee8cc1Swenshuai.xi #endif
531*53ee8cc1Swenshuai.xi
532*53ee8cc1Swenshuai.xi static MS_S32 _s32TspTaskId = -1;
533*53ee8cc1Swenshuai.xi MS_U32 _u32IntNum = E_INT_IRQ_TSP2HK;
534*53ee8cc1Swenshuai.xi MS_U32 _u32TaskLine = 0;
535*53ee8cc1Swenshuai.xi static DrvTSP_DbgLevel _u32TSPDGBLevel = E_DRVTSP_DBG_L1;
536*53ee8cc1Swenshuai.xi
537*53ee8cc1Swenshuai.xi static MS_BOOL _bBankInit = FALSE;
538*53ee8cc1Swenshuai.xi
539*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
540*53ee8cc1Swenshuai.xi wait_queue_head_t tsp_wq_head[TSP_SECFLT_NUM];
541*53ee8cc1Swenshuai.xi #endif // MSOS_TYPE_LINUX_KERNEL
542*53ee8cc1Swenshuai.xi
543*53ee8cc1Swenshuai.xi #ifdef DMX_UTOPIA_2K
544*53ee8cc1Swenshuai.xi static DrvTSP_KMode_ProcEvtIdTbl _stKModePrcEvtTbl[DRVTSP_MAX_PROCESS_NUM];
545*53ee8cc1Swenshuai.xi static MS_U32 _u32KPrcEvtTblUseFlag = 0;
546*53ee8cc1Swenshuai.xi #endif
547*53ee8cc1Swenshuai.xi
548*53ee8cc1Swenshuai.xi static DrvTSP_FW_DBG_INFO _FwDbgInfo;
549*53ee8cc1Swenshuai.xi static MS_U32 _u32LibMode = DRVTSP_CMD_LIB_MODE_USER;
550*53ee8cc1Swenshuai.xi
551*53ee8cc1Swenshuai.xi //----- For optee ------------------
552*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
553*53ee8cc1Swenshuai.xi #define MSTAR_UPA_DMXTA_UUID {0x7a7c8b61, 0x5d74, 0x4b6c, {0xb2, 0xa9, 0x92, 0xe4, 0x9c, 0xe8, 0x66, 0xbd} }
554*53ee8cc1Swenshuai.xi #define SYS_TEEC_OPERATION_INITIALIZER { 0 }
555*53ee8cc1Swenshuai.xi
556*53ee8cc1Swenshuai.xi static const char optee_dmx[] = "opteearmtz00";
557*53ee8cc1Swenshuai.xi char *_device = (char *)optee_dmx;
558*53ee8cc1Swenshuai.xi TEEC_Context mstar_teec_ctx;
559*53ee8cc1Swenshuai.xi TEEC_Session session = { 0 };
560*53ee8cc1Swenshuai.xi TEEC_UUID uuid = MSTAR_UPA_DMXTA_UUID;
561*53ee8cc1Swenshuai.xi TEEC_Operation op = SYS_TEEC_OPERATION_INITIALIZER;
562*53ee8cc1Swenshuai.xi #endif //SECURE_PVR_ENABLE
563*53ee8cc1Swenshuai.xi
564*53ee8cc1Swenshuai.xi static void _DumpFwMsg(void);
565*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
566*53ee8cc1Swenshuai.xi // Local Functions
567*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
568*53ee8cc1Swenshuai.xi #if 0
_TSP_GetTrailOne64(MS_U64 u64Flags)569*53ee8cc1Swenshuai.xi static MS_U32 _TSP_GetTrailOne64(MS_U64 u64Flags)
570*53ee8cc1Swenshuai.xi {
571*53ee8cc1Swenshuai.xi MS_U32 u32Temp = (MS_U32)(u64Flags & 0xFFFFFFFF);
572*53ee8cc1Swenshuai.xi
573*53ee8cc1Swenshuai.xi if (u32Temp)
574*53ee8cc1Swenshuai.xi {
575*53ee8cc1Swenshuai.xi return MAsm_CPU_GetTrailOne(u32Temp);
576*53ee8cc1Swenshuai.xi }
577*53ee8cc1Swenshuai.xi return (32 + MAsm_CPU_GetTrailOne((MS_U32)(u64Flags>> 32)));
578*53ee8cc1Swenshuai.xi }
579*53ee8cc1Swenshuai.xi #endif
580*53ee8cc1Swenshuai.xi
581*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
582*53ee8cc1Swenshuai.xi extern MS_PHY MDrv_FW_TSP_Addr(void);
583*53ee8cc1Swenshuai.xi extern MS_U32 MDrv_FW_TSP_Size(void);
584*53ee8cc1Swenshuai.xi #endif
585*53ee8cc1Swenshuai.xi
586*53ee8cc1Swenshuai.xi //For Optee
587*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
588*53ee8cc1Swenshuai.xi extern MS_U32 MDrv_SYS_TEEC_InitializeContext(const char *name, TEEC_Context *context);
589*53ee8cc1Swenshuai.xi extern MS_U32 MDrv_SYS_TEEC_Open(TEEC_Context *context, TEEC_Session *session, const TEEC_UUID *destination, MS_U32 connection_method, const void *connection_data, TEEC_Operation *operation, MS_U32 *error_origin);
590*53ee8cc1Swenshuai.xi extern MS_U32 MDrv_SYS_TEEC_InvokeCmd(TEEC_Session *session, MS_U32 cmd_id, TEEC_Operation *operation, MS_U32 *error_origin);
591*53ee8cc1Swenshuai.xi extern void MDrv_SYS_TEEC_Close(TEEC_Session *session);
592*53ee8cc1Swenshuai.xi extern void MDrv_SYS_TEEC_FinalizeContext(TEEC_Context *context);
593*53ee8cc1Swenshuai.xi #endif
594*53ee8cc1Swenshuai.xi
_TSP_GetFirmware(MS_PHY * pphyAddr,MS_U32 * pu32Size)595*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_GetFirmware(MS_PHY* pphyAddr, MS_U32* pu32Size)
596*53ee8cc1Swenshuai.xi {
597*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
598*53ee8cc1Swenshuai.xi MS_S32 s32Fd;
599*53ee8cc1Swenshuai.xi #endif
600*53ee8cc1Swenshuai.xi
601*53ee8cc1Swenshuai.xi if (_ptsp_res->_u32FwSize)
602*53ee8cc1Swenshuai.xi {
603*53ee8cc1Swenshuai.xi *pphyAddr = _ptsp_res->_phyFwAddr;
604*53ee8cc1Swenshuai.xi *pu32Size = _ptsp_res->_u32FwSize;
605*53ee8cc1Swenshuai.xi return TRUE;
606*53ee8cc1Swenshuai.xi }
607*53ee8cc1Swenshuai.xi
608*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
609*53ee8cc1Swenshuai.xi if (0> (s32Fd = open("/dev/fw", O_RDWR)))
610*53ee8cc1Swenshuai.xi {
611*53ee8cc1Swenshuai.xi TSP_DBG("[%s][%d] open fail /dev/fw\n", __FUNCTION__, __LINE__);
612*53ee8cc1Swenshuai.xi MS_ASSERT(0);
613*53ee8cc1Swenshuai.xi return FALSE;
614*53ee8cc1Swenshuai.xi }
615*53ee8cc1Swenshuai.xi if (ioctl(s32Fd, FW_IOC_TSP_ADDR, pphyAddr))
616*53ee8cc1Swenshuai.xi {
617*53ee8cc1Swenshuai.xi TSP_DBG("[%s][%d] FW_IOC_TSP_ADDR\n", __FUNCTION__, __LINE__);
618*53ee8cc1Swenshuai.xi MS_ASSERT(0);
619*53ee8cc1Swenshuai.xi close(s32Fd);
620*53ee8cc1Swenshuai.xi return FALSE;
621*53ee8cc1Swenshuai.xi }
622*53ee8cc1Swenshuai.xi if (ioctl(s32Fd, FW_IOC_TSP_SIZE, pu32Size))
623*53ee8cc1Swenshuai.xi {
624*53ee8cc1Swenshuai.xi TSP_DBG("[%s][%d] FW_IOC_TSP_SIZE\n", __FUNCTION__, __LINE__);
625*53ee8cc1Swenshuai.xi MS_ASSERT(0);
626*53ee8cc1Swenshuai.xi close(s32Fd);
627*53ee8cc1Swenshuai.xi return FALSE;
628*53ee8cc1Swenshuai.xi }
629*53ee8cc1Swenshuai.xi close(s32Fd);
630*53ee8cc1Swenshuai.xi return TRUE;
631*53ee8cc1Swenshuai.xi #elif defined (MSOS_TYPE_LINUX_KERNEL)
632*53ee8cc1Swenshuai.xi //*pphyAddr = MDrv_FW_TSP_Addr();
633*53ee8cc1Swenshuai.xi //*pu32Size = MDrv_FW_TSP_Size();
634*53ee8cc1Swenshuai.xi return TRUE;
635*53ee8cc1Swenshuai.xi #else
636*53ee8cc1Swenshuai.xi return FALSE;
637*53ee8cc1Swenshuai.xi #endif
638*53ee8cc1Swenshuai.xi }
639*53ee8cc1Swenshuai.xi
_TSP_CmdQ_Init(void)640*53ee8cc1Swenshuai.xi static void _TSP_CmdQ_Init(void)
641*53ee8cc1Swenshuai.xi {
642*53ee8cc1Swenshuai.xi while (HAL_TSP_CmdQ_CmdCount()); // wait command finish
643*53ee8cc1Swenshuai.xi }
644*53ee8cc1Swenshuai.xi
_TSP_InitResource(TSP_RESOURCE_PRIVATE * presource)645*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_InitResource(TSP_RESOURCE_PRIVATE* presource)
646*53ee8cc1Swenshuai.xi {
647*53ee8cc1Swenshuai.xi MS_U32 u32ii = 0;
648*53ee8cc1Swenshuai.xi
649*53ee8cc1Swenshuai.xi if(presource == NULL)
650*53ee8cc1Swenshuai.xi {
651*53ee8cc1Swenshuai.xi return FALSE;
652*53ee8cc1Swenshuai.xi }
653*53ee8cc1Swenshuai.xi
654*53ee8cc1Swenshuai.xi presource->_s32TspMutexId = -1;
655*53ee8cc1Swenshuai.xi presource->_s32IndMutexId = -1;
656*53ee8cc1Swenshuai.xi presource->_s32IntRegMutexId = -1;
657*53ee8cc1Swenshuai.xi
658*53ee8cc1Swenshuai.xi presource->_u32LastErr = 1;
659*53ee8cc1Swenshuai.xi presource->_bKerStrSuspend = FALSE;
660*53ee8cc1Swenshuai.xi
661*53ee8cc1Swenshuai.xi presource->_u32ProcessNum = 0;
662*53ee8cc1Swenshuai.xi
663*53ee8cc1Swenshuai.xi presource->_bSWInitReady = FALSE;
664*53ee8cc1Swenshuai.xi presource->_phyFwAddr = 0;
665*53ee8cc1Swenshuai.xi presource->_u32FwSize = 0;
666*53ee8cc1Swenshuai.xi presource->_u32DbgIntrCount = 0;
667*53ee8cc1Swenshuai.xi
668*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[0].TSPStatus != E_DRVTSP_SW_SUSPEND)
669*53ee8cc1Swenshuai.xi {
670*53ee8cc1Swenshuai.xi presource->_ifset_save.ePad = E_DRVTSP_PAD_EXT_INPUT0;
671*53ee8cc1Swenshuai.xi presource->_ifset_save.bClkInv = FALSE;
672*53ee8cc1Swenshuai.xi presource->_ifset_save.bExtSync = TRUE;
673*53ee8cc1Swenshuai.xi presource->_ifset_save.bParallel = TRUE;
674*53ee8cc1Swenshuai.xi }
675*53ee8cc1Swenshuai.xi
676*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_PVR_IF_NUM; u32ii++)
677*53ee8cc1Swenshuai.xi {
678*53ee8cc1Swenshuai.xi presource->_PvrEvtNotify[u32ii] = E_DRVTSP_EVENT_DATA_INIT;
679*53ee8cc1Swenshuai.xi presource->_PvrCallback[u32ii] = 0;
680*53ee8cc1Swenshuai.xi }
681*53ee8cc1Swenshuai.xi
682*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
683*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_PCRFLT_NUM; u32ii++)
684*53ee8cc1Swenshuai.xi {
685*53ee8cc1Swenshuai.xi presource->TSPHwPcrParams._u8ResetPcr[u32ii] = 3;
686*53ee8cc1Swenshuai.xi presource->TSPHwPcrParams._u32PrevStcBase[u32ii] = 0;
687*53ee8cc1Swenshuai.xi presource->TSPHwPcrParams._u32PrevPllControl[u32ii] = 0;
688*53ee8cc1Swenshuai.xi }
689*53ee8cc1Swenshuai.xi #endif
690*53ee8cc1Swenshuai.xi
691*53ee8cc1Swenshuai.xi presource->_phyTspFWDramBuf = 0;
692*53ee8cc1Swenshuai.xi presource->_u32TspFwDramBufSize = 0;
693*53ee8cc1Swenshuai.xi presource->_u32StcAdjustUnit = 100;
694*53ee8cc1Swenshuai.xi
695*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
696*53ee8cc1Swenshuai.xi presource->_teemode.OsType = SYS_TEEINFO_OSTYPE_NOTEE;
697*53ee8cc1Swenshuai.xi presource->_stSecBuf.u32BufId = 0;
698*53ee8cc1Swenshuai.xi presource->_stSecBuf.u32BufOpt = 0;
699*53ee8cc1Swenshuai.xi presource->_stSecBuf.u32BufSize = 0;
700*53ee8cc1Swenshuai.xi presource->_stSecBuf.phyBufAddr = 0;
701*53ee8cc1Swenshuai.xi #endif
702*53ee8cc1Swenshuai.xi
703*53ee8cc1Swenshuai.xi return TRUE;
704*53ee8cc1Swenshuai.xi
705*53ee8cc1Swenshuai.xi }
706*53ee8cc1Swenshuai.xi
707*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
708*53ee8cc1Swenshuai.xi //For REE, HK cowork with Tee by mailbox
709*53ee8cc1Swenshuai.xi
710*53ee8cc1Swenshuai.xi MS_BOOL _bTSPMbxInitFlag = 0;
711*53ee8cc1Swenshuai.xi MS_U8 _u8TSPMbxMsgClass = 0;
712*53ee8cc1Swenshuai.xi MBX_Msg _TSPReeToTeeMbxMsg;
713*53ee8cc1Swenshuai.xi MBX_Msg _TSPTeeToReeMbxMsg;
714*53ee8cc1Swenshuai.xi
_TSP_REE_MbxParamToBufParam(MBX_Msg * pMsg,MS_U32 * pu32BufAddr,MS_U32 * pu32Size)715*53ee8cc1Swenshuai.xi MS_BOOL _TSP_REE_MbxParamToBufParam(MBX_Msg *pMsg, MS_U32* pu32BufAddr, MS_U32* pu32Size)
716*53ee8cc1Swenshuai.xi {
717*53ee8cc1Swenshuai.xi MS_U32 u32addr = 0;
718*53ee8cc1Swenshuai.xi
719*53ee8cc1Swenshuai.xi if(pMsg->u8ParameterCount < 9)
720*53ee8cc1Swenshuai.xi return FALSE;
721*53ee8cc1Swenshuai.xi
722*53ee8cc1Swenshuai.xi *pu32Size = ((MS_U32)pMsg->u8Parameters[0]) & 0xFFUL;
723*53ee8cc1Swenshuai.xi *pu32Size += ((((MS_U32)pMsg->u8Parameters[1]) << 8UL) & 0xFF00UL);
724*53ee8cc1Swenshuai.xi *pu32Size += ((((MS_U32)pMsg->u8Parameters[2]) << 16UL) & 0xFF0000UL);
725*53ee8cc1Swenshuai.xi *pu32Size += ((((MS_U32)pMsg->u8Parameters[3]) << 24UL) & 0xFF000000UL);
726*53ee8cc1Swenshuai.xi u32addr = ((MS_U32)pMsg->u8Parameters[4]) & 0xFFUL;
727*53ee8cc1Swenshuai.xi u32addr += ((((MS_U32)pMsg->u8Parameters[5]) << 8UL) & 0xFF00UL);
728*53ee8cc1Swenshuai.xi u32addr += (((MS_U32)pMsg->u8Parameters[6] << 16UL) & 0xFF0000UL);
729*53ee8cc1Swenshuai.xi u32addr += (((MS_U32)pMsg->u8Parameters[7] << 24UL) & 0xFF000000UL);
730*53ee8cc1Swenshuai.xi _miu_offset_to_phy(pMsg->u8Parameters[8], u32addr, *pu32BufAddr);
731*53ee8cc1Swenshuai.xi
732*53ee8cc1Swenshuai.xi return TRUE;
733*53ee8cc1Swenshuai.xi }
734*53ee8cc1Swenshuai.xi
_TSP_REE_RegisterMBX(void)735*53ee8cc1Swenshuai.xi MS_BOOL _TSP_REE_RegisterMBX(void)
736*53ee8cc1Swenshuai.xi {
737*53ee8cc1Swenshuai.xi MS_U8 ClassNum = 0;
738*53ee8cc1Swenshuai.xi MBX_Result result = E_MBX_ERR_NOT_INITIALIZED;
739*53ee8cc1Swenshuai.xi MS_U32 u32StartTime = 0;
740*53ee8cc1Swenshuai.xi const MS_U32 u32RetryTimeOutMs = 3000;
741*53ee8cc1Swenshuai.xi
742*53ee8cc1Swenshuai.xi result = MApi_MBX_Init(E_MBX_CPU_MIPS,E_MBX_ROLE_HK,1000);
743*53ee8cc1Swenshuai.xi if (( E_MBX_SUCCESS != result) && ( E_MBX_ERR_SLOT_AREADY_OPENNED != result ))
744*53ee8cc1Swenshuai.xi {
745*53ee8cc1Swenshuai.xi TSP_DBG("DMX_REE MApi_MBX_Init fail\n");
746*53ee8cc1Swenshuai.xi return FALSE;
747*53ee8cc1Swenshuai.xi }
748*53ee8cc1Swenshuai.xi else
749*53ee8cc1Swenshuai.xi {
750*53ee8cc1Swenshuai.xi MApi_MBX_Enable(TRUE);
751*53ee8cc1Swenshuai.xi }
752*53ee8cc1Swenshuai.xi
753*53ee8cc1Swenshuai.xi u32StartTime = MsOS_GetSystemTime();
754*53ee8cc1Swenshuai.xi while((MsOS_GetSystemTime() - u32StartTime) < u32RetryTimeOutMs)
755*53ee8cc1Swenshuai.xi {
756*53ee8cc1Swenshuai.xi result = MApi_MBX_QueryDynamicClass(E_MBX_CPU_MIPS_VPE1, "DMX_TEE", (MS_U8 *)&ClassNum);
757*53ee8cc1Swenshuai.xi if(result == E_MBX_SUCCESS)
758*53ee8cc1Swenshuai.xi break;
759*53ee8cc1Swenshuai.xi MsOS_DelayTask(100);
760*53ee8cc1Swenshuai.xi };
761*53ee8cc1Swenshuai.xi
762*53ee8cc1Swenshuai.xi if(result != E_MBX_SUCCESS)
763*53ee8cc1Swenshuai.xi {
764*53ee8cc1Swenshuai.xi TSP_DBG("DMX_REE MApi_MBX_QueryDynamicClass fail\n");
765*53ee8cc1Swenshuai.xi return FALSE;
766*53ee8cc1Swenshuai.xi }
767*53ee8cc1Swenshuai.xi
768*53ee8cc1Swenshuai.xi result = MApi_MBX_RegisterMSG(ClassNum, 10);
769*53ee8cc1Swenshuai.xi if (( E_MBX_SUCCESS != result) && ( E_MBX_ERR_SLOT_AREADY_OPENNED != result ))
770*53ee8cc1Swenshuai.xi {
771*53ee8cc1Swenshuai.xi TSP_DBG("%s fail\n",__FUNCTION__);
772*53ee8cc1Swenshuai.xi return FALSE;
773*53ee8cc1Swenshuai.xi }
774*53ee8cc1Swenshuai.xi else
775*53ee8cc1Swenshuai.xi {
776*53ee8cc1Swenshuai.xi _bTSPMbxInitFlag = TRUE;
777*53ee8cc1Swenshuai.xi _u8TSPMbxMsgClass = ClassNum;
778*53ee8cc1Swenshuai.xi return TRUE;
779*53ee8cc1Swenshuai.xi }
780*53ee8cc1Swenshuai.xi }
781*53ee8cc1Swenshuai.xi
_TSP_Ree_SendMBXMsg(TSP_REE_TO_TEE_CMD_TYPE msg_type,void * param)782*53ee8cc1Swenshuai.xi MS_BOOL _TSP_Ree_SendMBXMsg(TSP_REE_TO_TEE_CMD_TYPE msg_type, void* param)
783*53ee8cc1Swenshuai.xi {
784*53ee8cc1Swenshuai.xi MBX_Result result = E_MBX_UNKNOW_ERROR;
785*53ee8cc1Swenshuai.xi DrvTSP_SecureBuf *pstSecBuf = (DrvTSP_SecureBuf*)param;
786*53ee8cc1Swenshuai.xi MS_U8 u8Id = 0;
787*53ee8cc1Swenshuai.xi MS_U32 u32Addr = 0, u32Size = 0;
788*53ee8cc1Swenshuai.xi MS_U32 u32Offset = 0;
789*53ee8cc1Swenshuai.xi MS_U8 u8MiuSel = 0;
790*53ee8cc1Swenshuai.xi MS_U8 u8Opt = 0;
791*53ee8cc1Swenshuai.xi MS_U32 u32StartTime = MsOS_GetSystemTime();
792*53ee8cc1Swenshuai.xi MS_U32 u32Timeout = 2000;
793*53ee8cc1Swenshuai.xi const MS_U32 u32TotTimeout = 6000;
794*53ee8cc1Swenshuai.xi const MS_U32 u32RevMsgTimeout = 2000;
795*53ee8cc1Swenshuai.xi
796*53ee8cc1Swenshuai.xi if (_bTSPMbxInitFlag == FALSE)
797*53ee8cc1Swenshuai.xi {
798*53ee8cc1Swenshuai.xi return FALSE;
799*53ee8cc1Swenshuai.xi }
800*53ee8cc1Swenshuai.xi
801*53ee8cc1Swenshuai.xi //retry mbx msg sending, if sending fail
802*53ee8cc1Swenshuai.xi u32StartTime = MsOS_GetSystemTime();
803*53ee8cc1Swenshuai.xi while((MsOS_GetSystemTime() - u32StartTime) < u32TotTimeout)
804*53ee8cc1Swenshuai.xi {
805*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.eRoleID = E_MBX_CPU_MIPS_VPE1;
806*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Ctrl = 0;
807*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.eMsgType = E_MBX_MSG_TYPE_INSTANT;
808*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8MsgClass = _u8TSPMbxMsgClass;
809*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Index = msg_type;
810*53ee8cc1Swenshuai.xi
811*53ee8cc1Swenshuai.xi switch(msg_type)
812*53ee8cc1Swenshuai.xi {
813*53ee8cc1Swenshuai.xi case E_DRVTSP_REE_TO_TEE_CMD_FW_LoadCode:
814*53ee8cc1Swenshuai.xi case E_DRVTSP_REE_TO_TEE_CMD_SET_VqBuf:
815*53ee8cc1Swenshuai.xi break;
816*53ee8cc1Swenshuai.xi case E_DRVTSP_REE_TO_TEE_CMD_SET_PvrBuf:
817*53ee8cc1Swenshuai.xi if(pstSecBuf == 0)
818*53ee8cc1Swenshuai.xi {
819*53ee8cc1Swenshuai.xi MS_DEBUG_MSG(TSP_DBG("[%s][%d] Parameter pointer of PVR buffer is 0!!!!\n",__FUNCTION__, __LINE__));
820*53ee8cc1Swenshuai.xi return FALSE;
821*53ee8cc1Swenshuai.xi }
822*53ee8cc1Swenshuai.xi u8Id = (MS_U8)(pstSecBuf->u32BufId);
823*53ee8cc1Swenshuai.xi u8Opt = (MS_U8)(pstSecBuf->u32BufOpt);
824*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Parameters[0] = u8Id;
825*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Parameters[1] = u8Opt;
826*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8ParameterCount = 2;
827*53ee8cc1Swenshuai.xi break;
828*53ee8cc1Swenshuai.xi case E_DRVTSP_REE_TO_TEE_CMD_SET_FileinBuf:
829*53ee8cc1Swenshuai.xi if(pstSecBuf == 0)
830*53ee8cc1Swenshuai.xi {
831*53ee8cc1Swenshuai.xi MS_DEBUG_MSG(TSP_DBG("[%s][%d] Parameter pointer of Filein buffer is 0!!!!\n",__FUNCTION__, __LINE__));
832*53ee8cc1Swenshuai.xi return FALSE;
833*53ee8cc1Swenshuai.xi }
834*53ee8cc1Swenshuai.xi u8Id = (MS_U8)(pstSecBuf->u32BufId);
835*53ee8cc1Swenshuai.xi u32Addr = (MS_U32)(pstSecBuf->phyBufAddr);
836*53ee8cc1Swenshuai.xi u32Size = pstSecBuf->u32BufSize;
837*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8MiuSel, u32Offset, u32Addr);
838*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Parameters[0] = (MS_U8)(u32Size & 0xFFUL);
839*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Parameters[1] = (MS_U8)((u32Size & 0xFF00UL) >> 8UL);
840*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Parameters[2] = (MS_U8)((u32Size & 0xFF0000UL) >> 16UL);
841*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Parameters[3] = (MS_U8)((u32Size & 0xFF000000UL) >> 24UL);
842*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Parameters[4] = (MS_U8)(u32Offset & 0xFFUL);
843*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Parameters[5] = (MS_U8)((u32Offset & 0xFF00UL) >> 8UL);
844*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Parameters[6] = (MS_U8)((u32Offset & 0xFF0000UL) >> 16UL);
845*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Parameters[7] = (MS_U8)((u32Offset & 0xFF000000UL) >> 24UL);
846*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Parameters[8] = u8MiuSel;
847*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Parameters[9] = u8Id;
848*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8ParameterCount = 10;
849*53ee8cc1Swenshuai.xi break;
850*53ee8cc1Swenshuai.xi case E_DRVTSP_REE_TO_TEE_CMD_GET_PvrWPtr:
851*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8Parameters[0] = (MS_U8)(pstSecBuf->u32BufId);
852*53ee8cc1Swenshuai.xi _TSPReeToTeeMbxMsg.u8ParameterCount = 1;
853*53ee8cc1Swenshuai.xi break;
854*53ee8cc1Swenshuai.xi
855*53ee8cc1Swenshuai.xi default:
856*53ee8cc1Swenshuai.xi MS_DEBUG_MSG(TSP_DBG("[%s] Tee cmd not support\n",__FUNCTION__));
857*53ee8cc1Swenshuai.xi return FALSE;
858*53ee8cc1Swenshuai.xi }
859*53ee8cc1Swenshuai.xi
860*53ee8cc1Swenshuai.xi result = MApi_MBX_SendMsg(&_TSPReeToTeeMbxMsg);
861*53ee8cc1Swenshuai.xi if (E_MBX_SUCCESS != result)
862*53ee8cc1Swenshuai.xi {
863*53ee8cc1Swenshuai.xi MsOS_DelayTask(100);
864*53ee8cc1Swenshuai.xi continue;
865*53ee8cc1Swenshuai.xi }
866*53ee8cc1Swenshuai.xi
867*53ee8cc1Swenshuai.xi // Receive Reply ACK from TEE side.
868*53ee8cc1Swenshuai.xi memset(&_TSPTeeToReeMbxMsg, 0, sizeof(MBX_Msg));
869*53ee8cc1Swenshuai.xi
870*53ee8cc1Swenshuai.xi _TSPTeeToReeMbxMsg.u8MsgClass = _u8TSPMbxMsgClass;
871*53ee8cc1Swenshuai.xi
872*53ee8cc1Swenshuai.xi #if 0 // marked temperarily, wait kernel team to fix MApi_MBX_RecvMsg.
873*53ee8cc1Swenshuai.xi if(E_MBX_SUCCESS != MApi_MBX_RecvMsg(TEE_MBX_MSG_CLASS, &(TEE_TO_REE_MBX_MSG), 20, MBX_CHECK_INSTANT_MSG))
874*53ee8cc1Swenshuai.xi {
875*53ee8cc1Swenshuai.xi VPU_MSG_ERR("VDEC get Secure world ACK fail\n");
876*53ee8cc1Swenshuai.xi return E_TSP_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL;
877*53ee8cc1Swenshuai.xi }
878*53ee8cc1Swenshuai.xi else
879*53ee8cc1Swenshuai.xi #else
880*53ee8cc1Swenshuai.xi do
881*53ee8cc1Swenshuai.xi {
882*53ee8cc1Swenshuai.xi result = MApi_MBX_RecvMsg(_u8TSPMbxMsgClass, &_TSPTeeToReeMbxMsg, u32RevMsgTimeout, MBX_CHECK_INSTANT_MSG);
883*53ee8cc1Swenshuai.xi u32Timeout -= u32RevMsgTimeout;
884*53ee8cc1Swenshuai.xi } while((E_MBX_SUCCESS != result) && (u32Timeout > 0));
885*53ee8cc1Swenshuai.xi #endif
886*53ee8cc1Swenshuai.xi
887*53ee8cc1Swenshuai.xi if((result == E_MBX_SUCCESS) && (_TSPTeeToReeMbxMsg.u8Index == E_TSP_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS))
888*53ee8cc1Swenshuai.xi {
889*53ee8cc1Swenshuai.xi break;
890*53ee8cc1Swenshuai.xi }
891*53ee8cc1Swenshuai.xi
892*53ee8cc1Swenshuai.xi MsOS_DelayTask(100);
893*53ee8cc1Swenshuai.xi
894*53ee8cc1Swenshuai.xi }
895*53ee8cc1Swenshuai.xi
896*53ee8cc1Swenshuai.xi //parsing return data
897*53ee8cc1Swenshuai.xi if((result == E_MBX_SUCCESS) && (_TSPTeeToReeMbxMsg.u8Index == E_TSP_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS))
898*53ee8cc1Swenshuai.xi {
899*53ee8cc1Swenshuai.xi switch(msg_type)
900*53ee8cc1Swenshuai.xi {
901*53ee8cc1Swenshuai.xi case E_DRVTSP_REE_TO_TEE_CMD_SET_PvrBuf:
902*53ee8cc1Swenshuai.xi pstSecBuf->phyBufAddr = 0;
903*53ee8cc1Swenshuai.xi pstSecBuf->u32BufSize = 0;
904*53ee8cc1Swenshuai.xi _TSP_REE_MbxParamToBufParam(&_TSPTeeToReeMbxMsg, &u32Addr, &u32Size);
905*53ee8cc1Swenshuai.xi pstSecBuf->phyBufAddr = ((MS_PHY)u32Addr) & 0xFFFFFFFFUL;
906*53ee8cc1Swenshuai.xi pstSecBuf->u32BufSize = u32Size;
907*53ee8cc1Swenshuai.xi break;
908*53ee8cc1Swenshuai.xi case E_DRVTSP_REE_TO_TEE_CMD_GET_PvrWPtr:
909*53ee8cc1Swenshuai.xi pstSecBuf->phyBufAddr = 0;
910*53ee8cc1Swenshuai.xi if(_TSPTeeToReeMbxMsg.u8ParameterCount < 5)
911*53ee8cc1Swenshuai.xi {
912*53ee8cc1Swenshuai.xi return FALSE;
913*53ee8cc1Swenshuai.xi }
914*53ee8cc1Swenshuai.xi u32Addr = ((MS_U32)_TSPTeeToReeMbxMsg.u8Parameters[1]) & 0xFFUL;
915*53ee8cc1Swenshuai.xi u32Addr += ((((MS_U32)_TSPTeeToReeMbxMsg.u8Parameters[2]) << 8UL) & 0xFF00UL);
916*53ee8cc1Swenshuai.xi u32Addr += ((((MS_U32)_TSPTeeToReeMbxMsg.u8Parameters[3]) << 16UL) & 0xFF0000UL);
917*53ee8cc1Swenshuai.xi u32Addr += ((((MS_U32)_TSPTeeToReeMbxMsg.u8Parameters[4]) << 24UL) & 0xFF000000UL);
918*53ee8cc1Swenshuai.xi _miu_offset_to_phy(_TSPTeeToReeMbxMsg.u8Parameters[0], u32Offset, u32Addr);
919*53ee8cc1Swenshuai.xi pstSecBuf->phyBufAddr = ((MS_PHY)u32Addr) & 0xFFFFFFFFUL;
920*53ee8cc1Swenshuai.xi break;
921*53ee8cc1Swenshuai.xi default:
922*53ee8cc1Swenshuai.xi break;
923*53ee8cc1Swenshuai.xi }
924*53ee8cc1Swenshuai.xi
925*53ee8cc1Swenshuai.xi return TRUE;
926*53ee8cc1Swenshuai.xi }
927*53ee8cc1Swenshuai.xi
928*53ee8cc1Swenshuai.xi //printf("[%s][%d] timeout!\n",__FUNCTION__,__LINE__);
929*53ee8cc1Swenshuai.xi
930*53ee8cc1Swenshuai.xi return FALSE;
931*53ee8cc1Swenshuai.xi }
932*53ee8cc1Swenshuai.xi
933*53ee8cc1Swenshuai.xi #endif //SECURE_PVR_ENABLE
934*53ee8cc1Swenshuai.xi
_TSP_SwStateReset(MS_BOOL bInited)935*53ee8cc1Swenshuai.xi static void _TSP_SwStateReset(MS_BOOL bInited)
936*53ee8cc1Swenshuai.xi {
937*53ee8cc1Swenshuai.xi MS_U32 u32EngId, u32FilterId;
938*53ee8cc1Swenshuai.xi
939*53ee8cc1Swenshuai.xi if(bInited == TRUE)
940*53ee8cc1Swenshuai.xi return;
941*53ee8cc1Swenshuai.xi
942*53ee8cc1Swenshuai.xi for (u32EngId = 0; u32EngId < TSP_ENGINE_NUM; u32EngId++)
943*53ee8cc1Swenshuai.xi {
944*53ee8cc1Swenshuai.xi for (u32FilterId = 0; u32FilterId < TSP_SECFLT_NUM; u32FilterId++)
945*53ee8cc1Swenshuai.xi {
946*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32FilterId] = E_DRVTSP_FLT_STATE_NA;
947*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltType[u32FilterId] = E_DRVTSP_FLT_TYPE_SECTION; // for section filter
948*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltState[u32FilterId] = E_DRVTSP_FLT_STATE_NA;
949*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecBufState[u32FilterId] = E_DRVTSP_FLT_STATE_NA;
950*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltMode[u32FilterId] = E_DRVTSP_FLT_MODE_CONTI;
951*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecBufState[u32FilterId] = E_DRVTSP_FLT_STATE_NA;
952*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecBufState[u32FilterId] = E_DRVTSP_FLT_STATE_NA;
953*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32FilterId] = E_DRVTSP_EVENT_DATA_INIT;
954*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltCallback[u32FilterId] = NULL;
955*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].s32TspEvtId[u32FilterId] = -1;
956*53ee8cc1Swenshuai.xi #ifdef DUP_PIDFLT
957*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].DupFlt[u32FilterId] = 0xFFFFUL;
958*53ee8cc1Swenshuai.xi #endif
959*53ee8cc1Swenshuai.xi
960*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
961*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSrcId[u32FilterId] = 0UL;
962*53ee8cc1Swenshuai.xi #endif
963*53ee8cc1Swenshuai.xi }
964*53ee8cc1Swenshuai.xi
965*53ee8cc1Swenshuai.xi for (u32FilterId = TSP_SECFLT_NUM; u32FilterId < TSP_PIDFLT_NUM_ALL; u32FilterId++)
966*53ee8cc1Swenshuai.xi {
967*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32FilterId] = E_DRVTSP_FLT_STATE_FREE;
968*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltType[u32FilterId] = E_DRVTSP_FLT_TYPE_PVR;
969*53ee8cc1Swenshuai.xi #ifdef DUP_PIDFLT
970*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].DupFlt[u32FilterId] = 0xFFFFUL;
971*53ee8cc1Swenshuai.xi #endif
972*53ee8cc1Swenshuai.xi
973*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
974*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSrcId[u32FilterId] = 0UL;
975*53ee8cc1Swenshuai.xi #endif
976*53ee8cc1Swenshuai.xi }
977*53ee8cc1Swenshuai.xi
978*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
979*53ee8cc1Swenshuai.xi for (u32FilterId = TSP_PIDFLT_NUM; u32FilterId < TSP_PIDFLT_NUM_ALL; u32FilterId++)
980*53ee8cc1Swenshuai.xi {
981*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32FilterId] = E_DRVTSP_FLT_STATE_FREE;
982*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltType[u32FilterId] = E_DRVTSP_FLT_TYPE_PCR;
983*53ee8cc1Swenshuai.xi }
984*53ee8cc1Swenshuai.xi #endif
985*53ee8cc1Swenshuai.xi }
986*53ee8cc1Swenshuai.xi
987*53ee8cc1Swenshuai.xi //---------------------------------------------------------------------------------
988*53ee8cc1Swenshuai.xi //Select source of every range of DSCMB filters
989*53ee8cc1Swenshuai.xi // if TSP_CA_ENGINE_NUM is 3, ENG0 for TS0_Live & TS0_File, Eng1 for TS1, Eng2 for TS2
990*53ee8cc1Swenshuai.xi // if TSP_CA_ENGINE_NUM is 4, ENG0 for TS0_Live, ENG1 for TS0_File, Eng2 for TS1, Eng3 for TS2
991*53ee8cc1Swenshuai.xi //---------------------------------------------------------------------------------
992*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[0].u32Src = E_DRVTSP_FLT_SOURCE_TYPE_LIVE|E_DRVTSP_FLT_SOURCE_TYPE_FILE; //eng0 src
993*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[0].u32Start = DSCMB_FLT_START_ID; //# eng0 filter range
994*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[0].u32End = DSCMB_FLT_END_ID;
995*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[0].u32ShareStart = DSCMB_FLT_SHAREKEY_START_ID;
996*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[0].u32ShareEnd = DSCMB_FLT_SHAREKEY_END_ID;
997*53ee8cc1Swenshuai.xi
998*53ee8cc1Swenshuai.xi #if (TSP_CA_ENGINE_NUM >= 2)
999*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[1].u32Start = DSCMB1_FLT_START_ID; //# eng1 filter range
1000*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[1].u32End = DSCMB1_FLT_END_ID;
1001*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[1].u32ShareStart = DSCMB_FLT_SHAREKEY1_START_ID;
1002*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[1].u32ShareEnd = DSCMB_FLT_SHAREKEY1_END_ID;
1003*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[1].u32Src = E_DRVTSP_FLT_SOURCE_TYPE_TS1|E_DRVTSP_FLT_SOURCE_TYPE_FILE1; //eng1 src
1004*53ee8cc1Swenshuai.xi #endif
1005*53ee8cc1Swenshuai.xi
1006*53ee8cc1Swenshuai.xi #if (TSP_CA_ENGINE_NUM >= 3)
1007*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[2] .u32Src = E_DRVTSP_FLT_SOURCE_TYPE_TS2|E_DRVTSP_FLT_SOURCE_TYPE_FILE2; //eng2 src
1008*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[2].u32Start = DSCMB2_FLT_START_ID; //# eng2 filter range
1009*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[2].u32End = DSCMB2_FLT_END_ID;
1010*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[2].u32ShareStart = DSCMB_FLT_SHAREKEY2_START_ID;
1011*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[2].u32ShareEnd = DSCMB_FLT_SHAREKEY2_END_ID;
1012*53ee8cc1Swenshuai.xi #endif
1013*53ee8cc1Swenshuai.xi
1014*53ee8cc1Swenshuai.xi #if (TSP_CA_ENGINE_NUM == 4)
1015*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[3].u32Src = 0; //eng3 src
1016*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[3].u32Start = DSCMB3_FLT_START_ID;
1017*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[3].u32End = DSCMB3_FLT_END_ID;
1018*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[3].u32ShareStart = DSCMB_FLT_SHAREKEY_START_ID;
1019*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[3].u32ShareEnd = DSCMB_FLT_SHAREKEY_END_ID;
1020*53ee8cc1Swenshuai.xi #endif
1021*53ee8cc1Swenshuai.xi
1022*53ee8cc1Swenshuai.xi }
1023*53ee8cc1Swenshuai.xi
_TSP_Get_DscmbEngId_ByFltSrc(DrvTSP_FltType FltSrc)1024*53ee8cc1Swenshuai.xi static MS_U8 _TSP_Get_DscmbEngId_ByFltSrc(DrvTSP_FltType FltSrc)
1025*53ee8cc1Swenshuai.xi {
1026*53ee8cc1Swenshuai.xi MS_U8 u8ii = 0xFF;
1027*53ee8cc1Swenshuai.xi
1028*53ee8cc1Swenshuai.xi for(u8ii = 0; u8ii < ((MS_U8)TSP_CA_ENGINE_NUM); u8ii++)
1029*53ee8cc1Swenshuai.xi {
1030*53ee8cc1Swenshuai.xi if(FltSrc & _ptsp_res->_DscmbFlt_State[u8ii].u32Src)
1031*53ee8cc1Swenshuai.xi break;
1032*53ee8cc1Swenshuai.xi }
1033*53ee8cc1Swenshuai.xi
1034*53ee8cc1Swenshuai.xi if(u8ii == TSP_CA_ENGINE_NUM)
1035*53ee8cc1Swenshuai.xi {
1036*53ee8cc1Swenshuai.xi u8ii = 0xFF;
1037*53ee8cc1Swenshuai.xi }
1038*53ee8cc1Swenshuai.xi
1039*53ee8cc1Swenshuai.xi return u8ii;
1040*53ee8cc1Swenshuai.xi }
1041*53ee8cc1Swenshuai.xi
_TSP_SW_Exit(void)1042*53ee8cc1Swenshuai.xi static void _TSP_SW_Exit(void)
1043*53ee8cc1Swenshuai.xi {
1044*53ee8cc1Swenshuai.xi MS_U8 u8ii, u8tmp;
1045*53ee8cc1Swenshuai.xi MS_U32 u32Timer, u32CurTime = 0;
1046*53ee8cc1Swenshuai.xi
1047*53ee8cc1Swenshuai.xi //printf("[%s][%d] _u32LibMode %d %d\n", __FUNCTION__, __LINE__, (int)_u32LibMode, (int)_db_flag);
1048*53ee8cc1Swenshuai.xi
1049*53ee8cc1Swenshuai.xi if(_u32LibMode != DRVTSP_CMD_LIB_MODE_KRN)
1050*53ee8cc1Swenshuai.xi {
1051*53ee8cc1Swenshuai.xi _TSP_EXT_LOCK();
1052*53ee8cc1Swenshuai.xi _db_flag = 1;
1053*53ee8cc1Swenshuai.xi _TSP_EXT_UNLOCK();
1054*53ee8cc1Swenshuai.xi
1055*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
1056*53ee8cc1Swenshuai.xi u32Timer = MsOS_GetSystemTime();
1057*53ee8cc1Swenshuai.xi // check _s32TspTaskId for NOS case
1058*53ee8cc1Swenshuai.xi while(_s32TspTaskId > 0)
1059*53ee8cc1Swenshuai.xi {
1060*53ee8cc1Swenshuai.xi _TSP_SetEvent(_s32TspEventId, TSP_TASK_EVENT_FLT_FREE);
1061*53ee8cc1Swenshuai.xi _TSP_EXT_LOCK();
1062*53ee8cc1Swenshuai.xi if (_db_flag == 2)
1063*53ee8cc1Swenshuai.xi {
1064*53ee8cc1Swenshuai.xi _db_flag = 0;
1065*53ee8cc1Swenshuai.xi //_TSP_EXT_UNLOCK();
1066*53ee8cc1Swenshuai.xi break;
1067*53ee8cc1Swenshuai.xi }
1068*53ee8cc1Swenshuai.xi _TSP_EXT_UNLOCK();
1069*53ee8cc1Swenshuai.xi
1070*53ee8cc1Swenshuai.xi u32CurTime = MsOS_GetSystemTime();
1071*53ee8cc1Swenshuai.xi if(u32CurTime < u32Timer)
1072*53ee8cc1Swenshuai.xi {
1073*53ee8cc1Swenshuai.xi printf("[%s][%d] Systemtime Change %d %d %x\n", __FUNCTION__, __LINE__, (int)u32CurTime, (int)u32Timer, (int)_s32TspTaskId);
1074*53ee8cc1Swenshuai.xi u32Timer = u32CurTime;
1075*53ee8cc1Swenshuai.xi }
1076*53ee8cc1Swenshuai.xi if ((u32CurTime-u32Timer) > 10000UL)
1077*53ee8cc1Swenshuai.xi {
1078*53ee8cc1Swenshuai.xi printf("[%s][%d] TSP task exit timeout %d %d %x !!!!!!\n", __FUNCTION__, __LINE__, (int)u32CurTime, (int)u32Timer, (int)_s32TspTaskId);
1079*53ee8cc1Swenshuai.xi break;
1080*53ee8cc1Swenshuai.xi }
1081*53ee8cc1Swenshuai.xi MsOS_DelayTask(3);
1082*53ee8cc1Swenshuai.xi }
1083*53ee8cc1Swenshuai.xi
1084*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
1085*53ee8cc1Swenshuai.xi
1086*53ee8cc1Swenshuai.xi /*if(_s32TspTaskId > 0)
1087*53ee8cc1Swenshuai.xi {
1088*53ee8cc1Swenshuai.xi MsOS_DeleteTask(_s32TspTaskId);
1089*53ee8cc1Swenshuai.xi _s32TspTaskId = -1;
1090*53ee8cc1Swenshuai.xi }*/
1091*53ee8cc1Swenshuai.xi }
1092*53ee8cc1Swenshuai.xi else
1093*53ee8cc1Swenshuai.xi {
1094*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[0].TSPStatus == E_DRVTSP_SW_SUSPEND)
1095*53ee8cc1Swenshuai.xi {
1096*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
1097*53ee8cc1Swenshuai.xi _ptsp_res->_bSWInitReady = FALSE;
1098*53ee8cc1Swenshuai.xi #endif
1099*53ee8cc1Swenshuai.xi
1100*53ee8cc1Swenshuai.xi return;
1101*53ee8cc1Swenshuai.xi }
1102*53ee8cc1Swenshuai.xi
1103*53ee8cc1Swenshuai.xi #if 0
1104*53ee8cc1Swenshuai.xi //to free CB process task, so send one event
1105*53ee8cc1Swenshuai.xi _db_flag = 1;
1106*53ee8cc1Swenshuai.xi _TSP_SetEvent(_s32TspEventId, TSP_TASK_EVENT_FLT_FREE);
1107*53ee8cc1Swenshuai.xi MsOS_DelayTask(3);
1108*53ee8cc1Swenshuai.xi
1109*53ee8cc1Swenshuai.xi while(_db_flag != 2)
1110*53ee8cc1Swenshuai.xi {
1111*53ee8cc1Swenshuai.xi _TSP_SetEvent(_s32TspEventId, TSP_TASK_EVENT_FLT_FREE);
1112*53ee8cc1Swenshuai.xi MsOS_DelayTask(3);
1113*53ee8cc1Swenshuai.xi }
1114*53ee8cc1Swenshuai.xi
1115*53ee8cc1Swenshuai.xi while(OSAL_TSP_EventDelete(_s32TspEventId) == FALSE)
1116*53ee8cc1Swenshuai.xi {
1117*53ee8cc1Swenshuai.xi _TSP_SetEvent(TSP_TASK_EVENT_FLT_FREE);
1118*53ee8cc1Swenshuai.xi printf("Waiting for evet deleting... \n");
1119*53ee8cc1Swenshuai.xi MsOS_DelayTask(3);
1120*53ee8cc1Swenshuai.xi }
1121*53ee8cc1Swenshuai.xi _s32TspEventId = -1;
1122*53ee8cc1Swenshuai.xi #endif
1123*53ee8cc1Swenshuai.xi
1124*53ee8cc1Swenshuai.xi _TSP_EXT_LOCK();
1125*53ee8cc1Swenshuai.xi }
1126*53ee8cc1Swenshuai.xi
1127*53ee8cc1Swenshuai.xi #if 0
1128*53ee8cc1Swenshuai.xi u8tmp = (MS_U8)((TSP_PIDFLT_NUM_ALL+31UL)>>5UL);
1129*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < u8tmp; u8ii++)
1130*53ee8cc1Swenshuai.xi {
1131*53ee8cc1Swenshuai.xi if(_s32EventFree0[u8ii] != -1)
1132*53ee8cc1Swenshuai.xi {
1133*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32EventFree0[u8ii]);
1134*53ee8cc1Swenshuai.xi _s32EventFree0[u8ii] = -1;
1135*53ee8cc1Swenshuai.xi }
1136*53ee8cc1Swenshuai.xi if(_s32DoneFlags[u8ii] != -1)
1137*53ee8cc1Swenshuai.xi {
1138*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32DoneFlags[u8ii]);
1139*53ee8cc1Swenshuai.xi _s32DoneFlags[u8ii] = -1;
1140*53ee8cc1Swenshuai.xi }
1141*53ee8cc1Swenshuai.xi
1142*53ee8cc1Swenshuai.xi /*if(_s32EventFreeDefer0[u8ii] != -1)
1143*53ee8cc1Swenshuai.xi {
1144*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32EventFreeDefer0[u8ii]);
1145*53ee8cc1Swenshuai.xi _s32EventFreeDefer0[u8ii] = -1;
1146*53ee8cc1Swenshuai.xi }*/
1147*53ee8cc1Swenshuai.xi }
1148*53ee8cc1Swenshuai.xi #endif
1149*53ee8cc1Swenshuai.xi
1150*53ee8cc1Swenshuai.xi if (_s32ExtMutexId != -1)
1151*53ee8cc1Swenshuai.xi {
1152*53ee8cc1Swenshuai.xi //_TSP_EXT_LOCK();
1153*53ee8cc1Swenshuai.xi _TSP_EXT_UNLOCK();
1154*53ee8cc1Swenshuai.xi MsOS_DeleteMutex(_s32ExtMutexId);
1155*53ee8cc1Swenshuai.xi _s32ExtMutexId = -1;
1156*53ee8cc1Swenshuai.xi }
1157*53ee8cc1Swenshuai.xi
1158*53ee8cc1Swenshuai.xi if (_s32TspEventId != -1)
1159*53ee8cc1Swenshuai.xi {
1160*53ee8cc1Swenshuai.xi if(_u32LibMode != DRVTSP_CMD_LIB_MODE_KRN)
1161*53ee8cc1Swenshuai.xi {
1162*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32TspEventId);
1163*53ee8cc1Swenshuai.xi }
1164*53ee8cc1Swenshuai.xi _s32TspEventId = -1;
1165*53ee8cc1Swenshuai.xi }
1166*53ee8cc1Swenshuai.xi
1167*53ee8cc1Swenshuai.xi u8tmp = (MS_U8)((TSP_SECFLT_NUM+31UL)>>5UL);
1168*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < u8tmp; u8ii++)
1169*53ee8cc1Swenshuai.xi {
1170*53ee8cc1Swenshuai.xi if(_s32TspSecOvfId[u8ii] != -1)
1171*53ee8cc1Swenshuai.xi {
1172*53ee8cc1Swenshuai.xi //printf("[%s][%d] %d %x\n", __FUNCTION__, __LINE__, (int)u8ii, (int)_s32TspSecOvfId[u8ii]);
1173*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32TspSecOvfId[u8ii]);
1174*53ee8cc1Swenshuai.xi _s32TspSecOvfId[u8ii] = -1;
1175*53ee8cc1Swenshuai.xi }
1176*53ee8cc1Swenshuai.xi if(_s32TspSecCrcId[u8ii] != -1)
1177*53ee8cc1Swenshuai.xi {
1178*53ee8cc1Swenshuai.xi //printf("[%s][%d] %d %x\n", __FUNCTION__, __LINE__, (int)u8ii, (int)_s32TspSecCrcId[u8ii]);
1179*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32TspSecCrcId[u8ii]);
1180*53ee8cc1Swenshuai.xi _s32TspSecCrcId[u8ii] = -1;
1181*53ee8cc1Swenshuai.xi }
1182*53ee8cc1Swenshuai.xi if(_s32TspFltDisableId[u8ii] != -1)
1183*53ee8cc1Swenshuai.xi {
1184*53ee8cc1Swenshuai.xi //printf("[%s][%d] %d %x\n", __FUNCTION__, __LINE__, (int)u8ii, (int)_s32TspFltDisableId[u8ii]);
1185*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32TspFltDisableId[u8ii]);
1186*53ee8cc1Swenshuai.xi _s32TspFltDisableId[u8ii] = -1;
1187*53ee8cc1Swenshuai.xi }
1188*53ee8cc1Swenshuai.xi if(_s32TspSecRdyId[u8ii] != -1)
1189*53ee8cc1Swenshuai.xi {
1190*53ee8cc1Swenshuai.xi //printf("[%s][%d] %d %x\n", __FUNCTION__, __LINE__, (int)u8ii, (int)_s32TspSecRdyId[u8ii]);
1191*53ee8cc1Swenshuai.xi OSAL_TSP_EventDelete(_s32TspSecRdyId[u8ii]);
1192*53ee8cc1Swenshuai.xi _s32TspSecRdyId[u8ii] = -1;
1193*53ee8cc1Swenshuai.xi }
1194*53ee8cc1Swenshuai.xi }
1195*53ee8cc1Swenshuai.xi
1196*53ee8cc1Swenshuai.xi //checking if stiil there are other processes exist
1197*53ee8cc1Swenshuai.xi if(--_ptsp_res->_u32ProcessNum > 0)
1198*53ee8cc1Swenshuai.xi return;
1199*53ee8cc1Swenshuai.xi
1200*53ee8cc1Swenshuai.xi if (_ptsp_res->_s32IntRegMutexId != -1)
1201*53ee8cc1Swenshuai.xi {
1202*53ee8cc1Swenshuai.xi _TSP_INT_LOCK();
1203*53ee8cc1Swenshuai.xi _TSP_INT_UNLOCK();
1204*53ee8cc1Swenshuai.xi MsOS_DeleteMutex(_ptsp_res->_s32IntRegMutexId);
1205*53ee8cc1Swenshuai.xi _ptsp_res->_s32IntRegMutexId = -1;
1206*53ee8cc1Swenshuai.xi }
1207*53ee8cc1Swenshuai.xi
1208*53ee8cc1Swenshuai.xi if (_ptsp_res->_s32IndMutexId != -1)
1209*53ee8cc1Swenshuai.xi {
1210*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_ptsp_res->_s32IndMutexId);
1211*53ee8cc1Swenshuai.xi MsOS_DeleteMutex(_ptsp_res->_s32IndMutexId);
1212*53ee8cc1Swenshuai.xi _ptsp_res->_s32IndMutexId = -1;
1213*53ee8cc1Swenshuai.xi }
1214*53ee8cc1Swenshuai.xi
1215*53ee8cc1Swenshuai.xi if (_ptsp_res->_s32TspMutexId != -1)
1216*53ee8cc1Swenshuai.xi {
1217*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_ptsp_res->_s32TspMutexId);
1218*53ee8cc1Swenshuai.xi MsOS_DeleteMutex(_ptsp_res->_s32TspMutexId);
1219*53ee8cc1Swenshuai.xi _ptsp_res->_s32TspMutexId = -1;
1220*53ee8cc1Swenshuai.xi }
1221*53ee8cc1Swenshuai.xi
1222*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[0].TSPStatus != E_DRVTSP_SW_SUSPEND)
1223*53ee8cc1Swenshuai.xi {
1224*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].TSPStatus = E_DRVTSP_SW_EXIT;
1225*53ee8cc1Swenshuai.xi }
1226*53ee8cc1Swenshuai.xi
1227*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
1228*53ee8cc1Swenshuai.xi MDrv_TSP_Ree_TeeCmdSystem_Exit();
1229*53ee8cc1Swenshuai.xi #endif
1230*53ee8cc1Swenshuai.xi
1231*53ee8cc1Swenshuai.xi _ptsp_res->_bSWInitReady = FALSE;
1232*53ee8cc1Swenshuai.xi
1233*53ee8cc1Swenshuai.xi }
1234*53ee8cc1Swenshuai.xi
_TSP_Close(void)1235*53ee8cc1Swenshuai.xi static void _TSP_Close(void)
1236*53ee8cc1Swenshuai.xi {
1237*53ee8cc1Swenshuai.xi HAL_TSP_Int_Disable(TSP_HWINT_ALL);
1238*53ee8cc1Swenshuai.xi HAL_TSP_Int2_Disable(TSP_HWINT2_ALL);
1239*53ee8cc1Swenshuai.xi
1240*53ee8cc1Swenshuai.xi OSAL_TSP_IntDisable();
1241*53ee8cc1Swenshuai.xi OSAL_TSP_IntDetach();
1242*53ee8cc1Swenshuai.xi HAL_TSP_WbDmaEnable(FALSE);
1243*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(0, 0, TSP_IF_NUM);
1244*53ee8cc1Swenshuai.xi _TSP_SW_Exit();
1245*53ee8cc1Swenshuai.xi HAL_TSP_PowerCtrl(DISABLE);
1246*53ee8cc1Swenshuai.xi HAL_TSP_HW_Lock_Release();
1247*53ee8cc1Swenshuai.xi }
1248*53ee8cc1Swenshuai.xi
1249*53ee8cc1Swenshuai.xi //------------------------------------------------
1250*53ee8cc1Swenshuai.xi //Default STC mapping:
1251*53ee8cc1Swenshuai.xi //STC0: live0 & file
1252*53ee8cc1Swenshuai.xi //STC1: TS1 & TS2
1253*53ee8cc1Swenshuai.xi //------------------------------------------------
1254*53ee8cc1Swenshuai.xi //If FltSrc = 0, goto auto arranging directly
1255*53ee8cc1Swenshuai.xi //------------------------------------------------
_TSP_STC_Alloc(DrvTSP_FltType FltSrc,MS_U32 * pu32EngId)1256*53ee8cc1Swenshuai.xi static TSP_Result _TSP_STC_Alloc(DrvTSP_FltType FltSrc, MS_U32 *pu32EngId)
1257*53ee8cc1Swenshuai.xi {
1258*53ee8cc1Swenshuai.xi MS_U32 i;
1259*53ee8cc1Swenshuai.xi *pu32EngId = 0xFFFFFFFF;
1260*53ee8cc1Swenshuai.xi
1261*53ee8cc1Swenshuai.xi if((_ptsp_res->_bStcAllocDisable))
1262*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
1263*53ee8cc1Swenshuai.xi
1264*53ee8cc1Swenshuai.xi if((FltSrc == E_DRVTSP_FLT_SOURCE_TYPE_LIVE) || (FltSrc == E_DRVTSP_FLT_SOURCE_TYPE_FILE))
1265*53ee8cc1Swenshuai.xi {
1266*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspStcState[0].bUsed == FALSE)
1267*53ee8cc1Swenshuai.xi {
1268*53ee8cc1Swenshuai.xi i = 0;
1269*53ee8cc1Swenshuai.xi goto FOUND;
1270*53ee8cc1Swenshuai.xi }
1271*53ee8cc1Swenshuai.xi }
1272*53ee8cc1Swenshuai.xi else if((FltSrc == E_DRVTSP_FLT_SOURCE_TYPE_TS1) || (FltSrc == E_DRVTSP_FLT_SOURCE_TYPE_TS2)
1273*53ee8cc1Swenshuai.xi || (FltSrc == E_DRVTSP_FLT_SOURCE_TYPE_FILE1) || (FltSrc == E_DRVTSP_FLT_SOURCE_TYPE_FILE2))
1274*53ee8cc1Swenshuai.xi {
1275*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspStcState[1].bUsed == FALSE)
1276*53ee8cc1Swenshuai.xi {
1277*53ee8cc1Swenshuai.xi i = 1;
1278*53ee8cc1Swenshuai.xi goto FOUND;
1279*53ee8cc1Swenshuai.xi }
1280*53ee8cc1Swenshuai.xi }
1281*53ee8cc1Swenshuai.xi
1282*53ee8cc1Swenshuai.xi for(i = 0; i < TSP_STC_NUM; i++)
1283*53ee8cc1Swenshuai.xi {
1284*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspStcState[i].bUsed == FALSE)
1285*53ee8cc1Swenshuai.xi {
1286*53ee8cc1Swenshuai.xi goto FOUND;
1287*53ee8cc1Swenshuai.xi }
1288*53ee8cc1Swenshuai.xi }
1289*53ee8cc1Swenshuai.xi
1290*53ee8cc1Swenshuai.xi if(*pu32EngId == 0xFFFFFFFF)
1291*53ee8cc1Swenshuai.xi {
1292*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
1293*53ee8cc1Swenshuai.xi }
1294*53ee8cc1Swenshuai.xi
1295*53ee8cc1Swenshuai.xi FOUND:
1296*53ee8cc1Swenshuai.xi
1297*53ee8cc1Swenshuai.xi _ptsp_res->_TspStcState[i].u32SrcType = FltSrc;
1298*53ee8cc1Swenshuai.xi _ptsp_res->_TspStcState[i].bUsed = TRUE;
1299*53ee8cc1Swenshuai.xi *pu32EngId = i;
1300*53ee8cc1Swenshuai.xi
1301*53ee8cc1Swenshuai.xi return DRVTSP_OK;
1302*53ee8cc1Swenshuai.xi }
1303*53ee8cc1Swenshuai.xi
_TSP_STC_Free(MS_U32 u32EngId)1304*53ee8cc1Swenshuai.xi static TSP_Result _TSP_STC_Free(MS_U32 u32EngId)
1305*53ee8cc1Swenshuai.xi {
1306*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspStcState[u32EngId].bUsed == FALSE)
1307*53ee8cc1Swenshuai.xi return DRVTSP_OK;
1308*53ee8cc1Swenshuai.xi
1309*53ee8cc1Swenshuai.xi _ptsp_res->_TspStcState[u32EngId].bUsed = FALSE;
1310*53ee8cc1Swenshuai.xi _ptsp_res->_TspStcState[u32EngId].u32PcrFltId = 0xFFFFFFFF;
1311*53ee8cc1Swenshuai.xi _ptsp_res->_TspStcState[u32EngId].u32SrcType = 0xFFFFFFFF;
1312*53ee8cc1Swenshuai.xi return DRVTSP_OK;
1313*53ee8cc1Swenshuai.xi }
1314*53ee8cc1Swenshuai.xi
_TSP_STC_Select(DrvTSP_FltType eFltSrc,MS_U32 u32StcEng)1315*53ee8cc1Swenshuai.xi static TSP_Result _TSP_STC_Select(DrvTSP_FltType eFltSrc, MS_U32 u32StcEng)
1316*53ee8cc1Swenshuai.xi {
1317*53ee8cc1Swenshuai.xi MS_U32 u32Src = 0;
1318*53ee8cc1Swenshuai.xi
1319*53ee8cc1Swenshuai.xi switch(eFltSrc & E_DRVTSP_FLT_SOURCE_TYPE_MASK)
1320*53ee8cc1Swenshuai.xi {
1321*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_LIVE:
1322*53ee8cc1Swenshuai.xi u32Src = TSP_PIDFLT_IN_PIDFLT0;
1323*53ee8cc1Swenshuai.xi break;
1324*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE:
1325*53ee8cc1Swenshuai.xi u32Src = TSP_PIDFLT_IN_PIDFLT_FILE;
1326*53ee8cc1Swenshuai.xi break;
1327*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS1:
1328*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE1:
1329*53ee8cc1Swenshuai.xi u32Src = TSP_PIDFLT_IN_PIDFLT1;
1330*53ee8cc1Swenshuai.xi break;
1331*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS2:
1332*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE2:
1333*53ee8cc1Swenshuai.xi u32Src = TSP_PIDFLT_IN_PIDFLT2;
1334*53ee8cc1Swenshuai.xi break;
1335*53ee8cc1Swenshuai.xi default:
1336*53ee8cc1Swenshuai.xi return DRVTSP_INVALID_PARAM;
1337*53ee8cc1Swenshuai.xi }
1338*53ee8cc1Swenshuai.xi if (HAL_TSP_SelectSTCEng(u32Src, u32StcEng))
1339*53ee8cc1Swenshuai.xi {
1340*53ee8cc1Swenshuai.xi return DRVTSP_OK;
1341*53ee8cc1Swenshuai.xi }
1342*53ee8cc1Swenshuai.xi else
1343*53ee8cc1Swenshuai.xi {
1344*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
1345*53ee8cc1Swenshuai.xi }
1346*53ee8cc1Swenshuai.xi }
1347*53ee8cc1Swenshuai.xi
_TSP_STC_SetPcrFlt(MS_U32 u32EngId,MS_U32 u32PcrFltId)1348*53ee8cc1Swenshuai.xi static TSP_Result _TSP_STC_SetPcrFlt(MS_U32 u32EngId, MS_U32 u32PcrFltId)
1349*53ee8cc1Swenshuai.xi {
1350*53ee8cc1Swenshuai.xi
1351*53ee8cc1Swenshuai.xi _ptsp_res->_TspStcState[u32EngId].u32PcrFltId = u32PcrFltId;
1352*53ee8cc1Swenshuai.xi
1353*53ee8cc1Swenshuai.xi return DRVTSP_OK;
1354*53ee8cc1Swenshuai.xi }
1355*53ee8cc1Swenshuai.xi
_TSP_PcrId_To_StcId(MS_U32 u32PcrFltId,MS_U32 * pu32EngId)1356*53ee8cc1Swenshuai.xi static TSP_Result _TSP_PcrId_To_StcId(MS_U32 u32PcrFltId,MS_U32 *pu32EngId)
1357*53ee8cc1Swenshuai.xi {
1358*53ee8cc1Swenshuai.xi MS_U32 i;
1359*53ee8cc1Swenshuai.xi
1360*53ee8cc1Swenshuai.xi *pu32EngId = 0xFFFFFFFF;
1361*53ee8cc1Swenshuai.xi
1362*53ee8cc1Swenshuai.xi for(i = 0; i < TSP_STC_NUM; i++)
1363*53ee8cc1Swenshuai.xi {
1364*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspStcState[i].u32PcrFltId == u32PcrFltId)
1365*53ee8cc1Swenshuai.xi {
1366*53ee8cc1Swenshuai.xi *pu32EngId = i;
1367*53ee8cc1Swenshuai.xi return DRVTSP_OK;
1368*53ee8cc1Swenshuai.xi }
1369*53ee8cc1Swenshuai.xi }
1370*53ee8cc1Swenshuai.xi
1371*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
1372*53ee8cc1Swenshuai.xi }
1373*53ee8cc1Swenshuai.xi
_TSP_PidFlt_Init(MS_U32 u32EngId,MS_U32 u32PidFltId)1374*53ee8cc1Swenshuai.xi static void _TSP_PidFlt_Init(MS_U32 u32EngId, MS_U32 u32PidFltId)
1375*53ee8cc1Swenshuai.xi {
1376*53ee8cc1Swenshuai.xi if(u32PidFltId >= TSP_PIDFLT_NUM_ALL)
1377*53ee8cc1Swenshuai.xi {
1378*53ee8cc1Swenshuai.xi return;
1379*53ee8cc1Swenshuai.xi }
1380*53ee8cc1Swenshuai.xi
1381*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(u32EngId, u32PidFltId, DRVTSP_PID_NULL);
1382*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32PidFltId, TSP_PIDFLT_OUT_NONE);
1383*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32PidFltId, TSP_PIDFLT_IN_NONE);
1384*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelSecFlt(u32EngId, u32PidFltId, TSP_PIDFLT_SECFLT_NULL);
1385*53ee8cc1Swenshuai.xi
1386*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
1387*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetFltSrcStreamID(u32EngId, u32PidFltId, 0);
1388*53ee8cc1Swenshuai.xi #endif
1389*53ee8cc1Swenshuai.xi
1390*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltMap[u32PidFltId] = DRVTSP_MAP_NULL;
1391*53ee8cc1Swenshuai.xi }
1392*53ee8cc1Swenshuai.xi
_TSP_PidFlt_Disable(MS_U32 u32EngId,MS_U32 u32PidFltId)1393*53ee8cc1Swenshuai.xi static void _TSP_PidFlt_Disable(MS_U32 u32EngId, MS_U32 u32PidFltId)
1394*53ee8cc1Swenshuai.xi {
1395*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
1396*53ee8cc1Swenshuai.xi if(u32PidFltId >= TSP_PIDFLT_NUM)
1397*53ee8cc1Swenshuai.xi {
1398*53ee8cc1Swenshuai.xi MS_U32 u32Idx = u32PidFltId - TSP_PIDFLT_NUM;
1399*53ee8cc1Swenshuai.xi
1400*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_HWPcrFlt_Enable(u32Idx, FALSE);
1401*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetHWPcrPid(u32Idx, DRVTSP_PID_NULL);
1402*53ee8cc1Swenshuai.xi #if (TSP_HWPCR_BY_HK == 1)
1403*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_Int_Enable(u32Idx, FALSE);
1404*53ee8cc1Swenshuai.xi _TSP_RemoveHwPcrNotifyId(u32Idx);
1405*53ee8cc1Swenshuai.xi #endif
1406*53ee8cc1Swenshuai.xi }
1407*53ee8cc1Swenshuai.xi else
1408*53ee8cc1Swenshuai.xi {
1409*53ee8cc1Swenshuai.xi #endif
1410*53ee8cc1Swenshuai.xi #ifdef DUP_PIDFLT
1411*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].DupFlt[u32PidFltId] != 0xFFFFUL)
1412*53ee8cc1Swenshuai.xi {
1413*53ee8cc1Swenshuai.xi MS_U32 u32Idx = _ptsp_res->_TspState[u32EngId].DupFlt[u32PidFltId];
1414*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32Idx, TSP_PIDFLT_OUT_NONE);
1415*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32Idx] &= (DrvTSP_FltState)(~E_DRVTSP_FLT_STATE_ENABLE);
1416*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s][%d] \n", __FUNCTION__, __LINE__);
1417*53ee8cc1Swenshuai.xi }
1418*53ee8cc1Swenshuai.xi #endif
1419*53ee8cc1Swenshuai.xi
1420*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32PidFltId, TSP_PIDFLT_OUT_NONE);
1421*53ee8cc1Swenshuai.xi
1422*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
1423*53ee8cc1Swenshuai.xi }
1424*53ee8cc1Swenshuai.xi #endif
1425*53ee8cc1Swenshuai.xi
1426*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] &= (DrvTSP_FltState)(~E_DRVTSP_FLT_STATE_ENABLE);
1427*53ee8cc1Swenshuai.xi }
1428*53ee8cc1Swenshuai.xi
1429*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.
1430*53ee8cc1Swenshuai.xi // DSCMB0 filter : 16~31 --> Source from live0 and file
1431*53ee8cc1Swenshuai.xi // DSCMB1 filter : 32~47 --> Source from TS1 and TS2
1432*53ee8cc1Swenshuai.xi // DSCMB2 filter : 48~63 --> Source from TS2
1433*53ee8cc1Swenshuai.xi // SubDSCMB0 filter : 80~95
1434*53ee8cc1Swenshuai.xi // SubDSCMB1 filter : 96~111
1435*53ee8cc1Swenshuai.xi // SubDSCMB2 filter : 112~127
1436*53ee8cc1Swenshuai.xi // Section filter : 0 ~63 / 0~127
1437*53ee8cc1Swenshuai.xi // Total 128 filters
1438*53ee8cc1Swenshuai.xi //
1439*53ee8cc1Swenshuai.xi // ----------------- 0
1440*53ee8cc1Swenshuai.xi // | |
1441*53ee8cc1Swenshuai.xi // ----------------- 16
1442*53ee8cc1Swenshuai.xi // | DSCM0 |
1443*53ee8cc1Swenshuai.xi // ----------------- 32
1444*53ee8cc1Swenshuai.xi // | DSCM1 |
1445*53ee8cc1Swenshuai.xi // ----------------- 48
1446*53ee8cc1Swenshuai.xi // | DSCM2 |
1447*53ee8cc1Swenshuai.xi // ----------------- 64
1448*53ee8cc1Swenshuai.xi // | |
1449*53ee8cc1Swenshuai.xi // ----------------- 79
1450*53ee8cc1Swenshuai.xi // | SubDSCMB0 |
1451*53ee8cc1Swenshuai.xi // ----------------- 96
1452*53ee8cc1Swenshuai.xi // | SubDSCMB1 |
1453*53ee8cc1Swenshuai.xi // ----------------- 111
1454*53ee8cc1Swenshuai.xi // | SubDSCMB2 |
1455*53ee8cc1Swenshuai.xi // ----------------- 127
1456*53ee8cc1Swenshuai.xi // | HWPCR |
1457*53ee8cc1Swenshuai.xi // ----------------- 129
_TSP_PidFlt_Alloc(MS_U32 u32EngId,DrvTSP_FltType eFilterType,MS_U32 * pu32PidFltId)1458*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_PidFlt_Alloc(MS_U32 u32EngId, DrvTSP_FltType eFilterType, MS_U32 *pu32PidFltId)
1459*53ee8cc1Swenshuai.xi {
1460*53ee8cc1Swenshuai.xi MS_S32 i = 0, j = 0;
1461*53ee8cc1Swenshuai.xi MS_U32 pid_idx_start = 0;
1462*53ee8cc1Swenshuai.xi MS_U32 pid_idx_end = 0;
1463*53ee8cc1Swenshuai.xi MS_BOOL bFound = FALSE;
1464*53ee8cc1Swenshuai.xi MS_U8 u8CAEng = 0;
1465*53ee8cc1Swenshuai.xi MS_U32 u32StcEng = 0xFFFFFFFF;
1466*53ee8cc1Swenshuai.xi
1467*53ee8cc1Swenshuai.xi #ifdef DUP_PIDFLT_API
1468*53ee8cc1Swenshuai.xi MS_U32 u32DupFlag = eFilterType & E_DRVTSP_FLT_TYPE_DUPSEC;
1469*53ee8cc1Swenshuai.xi #endif
1470*53ee8cc1Swenshuai.xi
1471*53ee8cc1Swenshuai.xi *pu32PidFltId = 0xFFFFFFFF;
1472*53ee8cc1Swenshuai.xi
1473*53ee8cc1Swenshuai.xi if((E_DRVTSP_FLT_TYPE_PCR == (eFilterType&~E_DRVTSP_FLT_MASK)) && !(_ptsp_res->_bStcAllocDisable))
1474*53ee8cc1Swenshuai.xi {
1475*53ee8cc1Swenshuai.xi if(_TSP_STC_Alloc(eFilterType & E_DRVTSP_FLT_SOURCE_TYPE_MASK, &u32StcEng) == FALSE)
1476*53ee8cc1Swenshuai.xi {
1477*53ee8cc1Swenshuai.xi goto FIND_END;
1478*53ee8cc1Swenshuai.xi }
1479*53ee8cc1Swenshuai.xi }
1480*53ee8cc1Swenshuai.xi
1481*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
1482*53ee8cc1Swenshuai.xi if(E_DRVTSP_FLT_TYPE_PCR == (eFilterType&~E_DRVTSP_FLT_MASK))
1483*53ee8cc1Swenshuai.xi {
1484*53ee8cc1Swenshuai.xi for(i = TSP_PIDFLT_NUM; i < TSP_PIDFLT_NUM_ALL; i++)
1485*53ee8cc1Swenshuai.xi {
1486*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1487*53ee8cc1Swenshuai.xi {
1488*53ee8cc1Swenshuai.xi bFound = TRUE;
1489*53ee8cc1Swenshuai.xi goto FIND_END;
1490*53ee8cc1Swenshuai.xi }
1491*53ee8cc1Swenshuai.xi }
1492*53ee8cc1Swenshuai.xi }
1493*53ee8cc1Swenshuai.xi else
1494*53ee8cc1Swenshuai.xi #endif
1495*53ee8cc1Swenshuai.xi if((eFilterType & E_DRVTSP_FLT_SCMB_MASK) ||
1496*53ee8cc1Swenshuai.xi #ifndef HWPCR_ENABLE
1497*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_PCR == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
1498*53ee8cc1Swenshuai.xi #endif
1499*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_VIDEO == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
1500*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_AUDIO == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
1501*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_AUDIO2 == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
1502*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_AUDIO3 == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
1503*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_AUDIO4 == (eFilterType&~E_DRVTSP_FLT_MASK)) ||
1504*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_VIDEO3D == (eFilterType&~E_DRVTSP_FLT_MASK)))
1505*53ee8cc1Swenshuai.xi {
1506*53ee8cc1Swenshuai.xi MS_U32 u321stShareIdx = 0;
1507*53ee8cc1Swenshuai.xi
1508*53ee8cc1Swenshuai.xi u8CAEng = _TSP_Get_DscmbEngId_ByFltSrc(eFilterType & E_DRVTSP_FLT_SOURCE_TYPE_MASK);
1509*53ee8cc1Swenshuai.xi
1510*53ee8cc1Swenshuai.xi if(u8CAEng < TSP_CA_ENGINE_NUM)
1511*53ee8cc1Swenshuai.xi {
1512*53ee8cc1Swenshuai.xi if((eFilterType & E_DRVTSP_FLT_SCMB_MASK) == E_DRVTSP_FLT_TYPE_SCMB_SHAREKEY)
1513*53ee8cc1Swenshuai.xi {
1514*53ee8cc1Swenshuai.xi pid_idx_start = _ptsp_res->_DscmbFlt_State[u8CAEng].u32ShareStart;
1515*53ee8cc1Swenshuai.xi pid_idx_end = _ptsp_res->_DscmbFlt_State[u8CAEng].u32ShareEnd;
1516*53ee8cc1Swenshuai.xi }
1517*53ee8cc1Swenshuai.xi else
1518*53ee8cc1Swenshuai.xi {
1519*53ee8cc1Swenshuai.xi pid_idx_start = _ptsp_res->_DscmbFlt_State[u8CAEng].u32Start + 1; //reserved first filter for sharekey filter
1520*53ee8cc1Swenshuai.xi pid_idx_end = _ptsp_res->_DscmbFlt_State[u8CAEng].u32End;
1521*53ee8cc1Swenshuai.xi }
1522*53ee8cc1Swenshuai.xi u321stShareIdx = _ptsp_res->_DscmbFlt_State[u8CAEng].u32Start;
1523*53ee8cc1Swenshuai.xi }
1524*53ee8cc1Swenshuai.xi
1525*53ee8cc1Swenshuai.xi // For PCR & PVRCA, allocate filter form bottom to top
1526*53ee8cc1Swenshuai.xi if((E_DRVTSP_FLT_TYPE_PVR == (eFilterType&~E_DRVTSP_FLT_MASK))
1527*53ee8cc1Swenshuai.xi #ifndef HWPCR_ENABLE
1528*53ee8cc1Swenshuai.xi || (E_DRVTSP_FLT_TYPE_PCR == (eFilterType&~E_DRVTSP_FLT_MASK))
1529*53ee8cc1Swenshuai.xi #endif
1530*53ee8cc1Swenshuai.xi || (E_DRVTSP_FLT_TYPE_PVR1 == (eFilterType&~E_DRVTSP_FLT_MASK)))
1531*53ee8cc1Swenshuai.xi {
1532*53ee8cc1Swenshuai.xi for(i = (int)pid_idx_end; i >= (int)pid_idx_start; i--)
1533*53ee8cc1Swenshuai.xi {
1534*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1535*53ee8cc1Swenshuai.xi {
1536*53ee8cc1Swenshuai.xi bFound = TRUE;
1537*53ee8cc1Swenshuai.xi goto FIND_END;
1538*53ee8cc1Swenshuai.xi }
1539*53ee8cc1Swenshuai.xi }
1540*53ee8cc1Swenshuai.xi if((eFilterType & E_DRVTSP_FLT_SCMB_MASK) == E_DRVTSP_FLT_TYPE_SCMB_SHAREKEY)
1541*53ee8cc1Swenshuai.xi {
1542*53ee8cc1Swenshuai.xi i = u321stShareIdx;
1543*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1544*53ee8cc1Swenshuai.xi {
1545*53ee8cc1Swenshuai.xi bFound = TRUE;
1546*53ee8cc1Swenshuai.xi goto FIND_END;
1547*53ee8cc1Swenshuai.xi }
1548*53ee8cc1Swenshuai.xi }
1549*53ee8cc1Swenshuai.xi }
1550*53ee8cc1Swenshuai.xi else //For Live, allocate filter from top to bottom
1551*53ee8cc1Swenshuai.xi {
1552*53ee8cc1Swenshuai.xi if((eFilterType & E_DRVTSP_FLT_SCMB_MASK) == E_DRVTSP_FLT_TYPE_SCMB_SHAREKEY)
1553*53ee8cc1Swenshuai.xi {
1554*53ee8cc1Swenshuai.xi i = u321stShareIdx;
1555*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1556*53ee8cc1Swenshuai.xi {
1557*53ee8cc1Swenshuai.xi bFound = TRUE;
1558*53ee8cc1Swenshuai.xi goto FIND_END;
1559*53ee8cc1Swenshuai.xi }
1560*53ee8cc1Swenshuai.xi }
1561*53ee8cc1Swenshuai.xi
1562*53ee8cc1Swenshuai.xi for(i = (int)pid_idx_start; i <= (int)pid_idx_end; i++)
1563*53ee8cc1Swenshuai.xi {
1564*53ee8cc1Swenshuai.xi //Reserved filter #17 for NMatch temp writting, can not be used for section data
1565*53ee8cc1Swenshuai.xi if((i == TSP_NMATCH_FLTID) && (eFilterType & E_DRVTSP_FLT_TYPE_SECTION_MASK))
1566*53ee8cc1Swenshuai.xi {
1567*53ee8cc1Swenshuai.xi continue;
1568*53ee8cc1Swenshuai.xi }
1569*53ee8cc1Swenshuai.xi
1570*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1571*53ee8cc1Swenshuai.xi {
1572*53ee8cc1Swenshuai.xi bFound = TRUE;
1573*53ee8cc1Swenshuai.xi goto FIND_END;
1574*53ee8cc1Swenshuai.xi }
1575*53ee8cc1Swenshuai.xi }
1576*53ee8cc1Swenshuai.xi }
1577*53ee8cc1Swenshuai.xi
1578*53ee8cc1Swenshuai.xi #ifndef GENERAL_DSCMB
1579*53ee8cc1Swenshuai.xi if((eFilterType & E_DRVTSP_FLT_SCMB_MASK) != 0)
1580*53ee8cc1Swenshuai.xi {
1581*53ee8cc1Swenshuai.xi goto FIND_END;
1582*53ee8cc1Swenshuai.xi }
1583*53ee8cc1Swenshuai.xi #endif
1584*53ee8cc1Swenshuai.xi }
1585*53ee8cc1Swenshuai.xi
1586*53ee8cc1Swenshuai.xi if(eFilterType & E_DRVTSP_FLT_TYPE_SECTION_MASK)
1587*53ee8cc1Swenshuai.xi {
1588*53ee8cc1Swenshuai.xi pid_idx_start = TSP_SECFLT_NUM - 1;
1589*53ee8cc1Swenshuai.xi pid_idx_end = pid_idx_start;
1590*53ee8cc1Swenshuai.xi }
1591*53ee8cc1Swenshuai.xi else
1592*53ee8cc1Swenshuai.xi {
1593*53ee8cc1Swenshuai.xi pid_idx_start = TSP_PIDFLT_NUM_ALL - 1;
1594*53ee8cc1Swenshuai.xi pid_idx_end = DSCMB_FLT_SHAREKEY_END_ID;
1595*53ee8cc1Swenshuai.xi }
1596*53ee8cc1Swenshuai.xi
1597*53ee8cc1Swenshuai.xi // #1 Using Non-descramble range first, and from top to buttom; at last using descramble range form bottom to top
1598*53ee8cc1Swenshuai.xi for(i = 0; ((i < DSCMB_FLT_START_ID) && (bFound == FALSE)); i++)
1599*53ee8cc1Swenshuai.xi {
1600*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1601*53ee8cc1Swenshuai.xi {
1602*53ee8cc1Swenshuai.xi bFound = TRUE;
1603*53ee8cc1Swenshuai.xi goto FIND_END;
1604*53ee8cc1Swenshuai.xi }
1605*53ee8cc1Swenshuai.xi }
1606*53ee8cc1Swenshuai.xi
1607*53ee8cc1Swenshuai.xi // # 2 Using Non-descramble range first, and from top to buttom; at last using descramble range form bottom to top
1608*53ee8cc1Swenshuai.xi #if((!defined(DUP_PIDFLT_API)) && (TSP_CA_ENGINE_NUM > 2))
1609*53ee8cc1Swenshuai.xi for(i = DSCMB2_FLT_END_ID + 1; ((i < DSCMB_FLT_SHAREKEY_START_ID) && (bFound == FALSE)); i++)
1610*53ee8cc1Swenshuai.xi {
1611*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1612*53ee8cc1Swenshuai.xi {
1613*53ee8cc1Swenshuai.xi bFound = TRUE;
1614*53ee8cc1Swenshuai.xi goto FIND_END;
1615*53ee8cc1Swenshuai.xi }
1616*53ee8cc1Swenshuai.xi }
1617*53ee8cc1Swenshuai.xi #else
1618*53ee8cc1Swenshuai.xi for(i = DSCMB_FLT_SHAREKEY_START_ID; ((i <= pid_idx_end) && (bFound == FALSE)); i++)
1619*53ee8cc1Swenshuai.xi {
1620*53ee8cc1Swenshuai.xi //Reserved filter #17 for NMatch temp writting, can not be used for section data
1621*53ee8cc1Swenshuai.xi if((i == TSP_NMATCH_FLTID) && (eFilterType & E_DRVTSP_FLT_TYPE_SECTION_MASK)
1622*53ee8cc1Swenshuai.xi && (E_DRVTSP_FLT_TYPE_PCR != (eFilterType&~E_DRVTSP_FLT_MASK)))
1623*53ee8cc1Swenshuai.xi continue;
1624*53ee8cc1Swenshuai.xi
1625*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1626*53ee8cc1Swenshuai.xi {
1627*53ee8cc1Swenshuai.xi bFound = TRUE;
1628*53ee8cc1Swenshuai.xi goto FIND_END;
1629*53ee8cc1Swenshuai.xi }
1630*53ee8cc1Swenshuai.xi }
1631*53ee8cc1Swenshuai.xi #endif
1632*53ee8cc1Swenshuai.xi
1633*53ee8cc1Swenshuai.xi // # 3 Using Non-descramble range first, and from top to buttom; at last using descramble range form bottom to top
1634*53ee8cc1Swenshuai.xi for(i = (int)pid_idx_start; ((i >= 0) && (bFound == FALSE)); i--)
1635*53ee8cc1Swenshuai.xi {
1636*53ee8cc1Swenshuai.xi //Reserved filter #17 for NMatch temp writting, can not be used for section data
1637*53ee8cc1Swenshuai.xi if((i == TSP_NMATCH_FLTID) && (eFilterType & E_DRVTSP_FLT_TYPE_SECTION_MASK)
1638*53ee8cc1Swenshuai.xi && (E_DRVTSP_FLT_TYPE_PCR != (eFilterType&~E_DRVTSP_FLT_MASK)))
1639*53ee8cc1Swenshuai.xi continue;
1640*53ee8cc1Swenshuai.xi
1641*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_FREE)
1642*53ee8cc1Swenshuai.xi {
1643*53ee8cc1Swenshuai.xi bFound = TRUE;
1644*53ee8cc1Swenshuai.xi break;
1645*53ee8cc1Swenshuai.xi }
1646*53ee8cc1Swenshuai.xi }
1647*53ee8cc1Swenshuai.xi
1648*53ee8cc1Swenshuai.xi FIND_END:
1649*53ee8cc1Swenshuai.xi
1650*53ee8cc1Swenshuai.xi if (bFound == FALSE)
1651*53ee8cc1Swenshuai.xi {
1652*53ee8cc1Swenshuai.xi _TSP_STC_Free(u32StcEng);
1653*53ee8cc1Swenshuai.xi TSP_ASSERT(0, TSP_DBG("[TSP_ERROR][%06d] No free fitler found 0x%02x\n", __LINE__, (int)i));
1654*53ee8cc1Swenshuai.xi return FALSE;
1655*53ee8cc1Swenshuai.xi }
1656*53ee8cc1Swenshuai.xi
1657*53ee8cc1Swenshuai.xi if(E_DRVTSP_FLT_TYPE_PCR == (eFilterType&~E_DRVTSP_FLT_MASK))
1658*53ee8cc1Swenshuai.xi {
1659*53ee8cc1Swenshuai.xi if(_ptsp_res->_bStcAllocDisable)
1660*53ee8cc1Swenshuai.xi {
1661*53ee8cc1Swenshuai.xi for(j = 0; j< TSP_STC_NUM; j++)
1662*53ee8cc1Swenshuai.xi {
1663*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspStcState[j].u32SrcType == (eFilterType & E_DRVTSP_FLT_SOURCE_TYPE_MASK))
1664*53ee8cc1Swenshuai.xi {
1665*53ee8cc1Swenshuai.xi _TSP_STC_SetPcrFlt(j, (MS_U32)i);
1666*53ee8cc1Swenshuai.xi }
1667*53ee8cc1Swenshuai.xi }
1668*53ee8cc1Swenshuai.xi }
1669*53ee8cc1Swenshuai.xi else
1670*53ee8cc1Swenshuai.xi {
1671*53ee8cc1Swenshuai.xi _TSP_STC_SetPcrFlt(u32StcEng, (MS_U32)i);
1672*53ee8cc1Swenshuai.xi _TSP_STC_Select(eFilterType, u32StcEng);
1673*53ee8cc1Swenshuai.xi }
1674*53ee8cc1Swenshuai.xi }
1675*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[i] = E_DRVTSP_FLT_STATE_ALLOC;
1676*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltType[i] = (eFilterType&(DrvTSP_FltType)(~E_DRVTSP_FLT_MASK));
1677*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[i] = eFilterType & E_DRVTSP_FLT_SOURCE_TYPE_MASK;
1678*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
1679*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSrcId[i] = (eFilterType & E_DRVTSP_FLT_SOURCEID_MASK) >> E_DRVTSP_FLT_SOURCEID_SHIFT;
1680*53ee8cc1Swenshuai.xi #endif
1681*53ee8cc1Swenshuai.xi
1682*53ee8cc1Swenshuai.xi _TSP_PidFlt_Init(u32EngId, i);
1683*53ee8cc1Swenshuai.xi *pu32PidFltId = i;
1684*53ee8cc1Swenshuai.xi
1685*53ee8cc1Swenshuai.xi #ifdef DUP_PIDFLT_API
1686*53ee8cc1Swenshuai.xi if(u32DupFlag == E_DRVTSP_FLT_TYPE_DUPSEC)
1687*53ee8cc1Swenshuai.xi {
1688*53ee8cc1Swenshuai.xi MS_BOOL bDupFound = FALSE;
1689*53ee8cc1Swenshuai.xi
1690*53ee8cc1Swenshuai.xi for(i = (DSCMB2_FLT_END_ID + 1); i < DSCMB_FLT_SHAREKEY_START_ID; i++)
1691*53ee8cc1Swenshuai.xi {
1692*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_NA)
1693*53ee8cc1Swenshuai.xi {
1694*53ee8cc1Swenshuai.xi bDupFound = TRUE;
1695*53ee8cc1Swenshuai.xi break;
1696*53ee8cc1Swenshuai.xi }
1697*53ee8cc1Swenshuai.xi }
1698*53ee8cc1Swenshuai.xi if(bDupFound == FALSE)
1699*53ee8cc1Swenshuai.xi {
1700*53ee8cc1Swenshuai.xi for(i = (DSCMB_FLT_START_ID - 1); i >= 0; i--)
1701*53ee8cc1Swenshuai.xi {
1702*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltState[i] == E_DRVTSP_FLT_STATE_NA)
1703*53ee8cc1Swenshuai.xi {
1704*53ee8cc1Swenshuai.xi bDupFound = TRUE;
1705*53ee8cc1Swenshuai.xi break;
1706*53ee8cc1Swenshuai.xi }
1707*53ee8cc1Swenshuai.xi }
1708*53ee8cc1Swenshuai.xi }
1709*53ee8cc1Swenshuai.xi
1710*53ee8cc1Swenshuai.xi if(bDupFound == TRUE)
1711*53ee8cc1Swenshuai.xi {
1712*53ee8cc1Swenshuai.xi _TSP_PidFlt_Init(u32EngId, i);
1713*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].DupFlt[*pu32PidFltId] = i;
1714*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[i] = E_DRVTSP_FLT_STATE_ALLOC;
1715*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltType[i] = _ptsp_res->_TspState[u32EngId].FltType[*pu32PidFltId];
1716*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[i] = _ptsp_res->_TspState[u32EngId].FltSource[*pu32PidFltId];
1717*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s] duplcate id %ld %d\n", __FUNCTION__, *pu32PidFltId, i);
1718*53ee8cc1Swenshuai.xi }
1719*53ee8cc1Swenshuai.xi }
1720*53ee8cc1Swenshuai.xi #endif
1721*53ee8cc1Swenshuai.xi
1722*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s] %d, time %d, u32DupFlag %x\n", __FUNCTION__, i, MsOS_GetSystemTime(), u32DupFlag);
1723*53ee8cc1Swenshuai.xi
1724*53ee8cc1Swenshuai.xi return TRUE;
1725*53ee8cc1Swenshuai.xi }
1726*53ee8cc1Swenshuai.xi
_TSP_PidFlt_Free(MS_U32 u32EngId,MS_U32 u32PidFltId,MS_BOOL bResetState)1727*53ee8cc1Swenshuai.xi static TSP_Result _TSP_PidFlt_Free(MS_U32 u32EngId, MS_U32 u32PidFltId, MS_BOOL bResetState)
1728*53ee8cc1Swenshuai.xi {
1729*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId = 0;
1730*53ee8cc1Swenshuai.xi MS_U32 u32STCEng = 0xFFFFFFFF;
1731*53ee8cc1Swenshuai.xi
1732*53ee8cc1Swenshuai.xi if ( (u32EngId >= TSP_ENGINE_NUM) ||
1733*53ee8cc1Swenshuai.xi (u32PidFltId >= TSP_PIDFLT_NUM_ALL) ||
1734*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] == E_DRVTSP_FLT_STATE_FREE) )
1735*53ee8cc1Swenshuai.xi {
1736*53ee8cc1Swenshuai.xi //TSP_DBG("[TSP_ERROR][%06d] (EngId, PidFltId, FilterState)= (%ld %ld %d)\n", __LINE__, u32EngId, u32PidFltId, _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId]);
1737*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("[TSP_ERROR][%06d] Bad free parmeter\n",__LINE__));;
1738*53ee8cc1Swenshuai.xi return (TSP_Result)FALSE;
1739*53ee8cc1Swenshuai.xi }
1740*53ee8cc1Swenshuai.xi
1741*53ee8cc1Swenshuai.xi u32SecFltId = _ptsp_res->_TspState[u32EngId].FltMap[u32PidFltId];
1742*53ee8cc1Swenshuai.xi
1743*53ee8cc1Swenshuai.xi _TSP_PidFlt_Disable(u32EngId, u32PidFltId);
1744*53ee8cc1Swenshuai.xi
1745*53ee8cc1Swenshuai.xi if((_ptsp_res->_TspState[u32EngId].FltType[u32PidFltId] == E_DRVTSP_FLT_TYPE_PCR)
1746*53ee8cc1Swenshuai.xi && (_ptsp_res->_bStcAllocDisable == FALSE))
1747*53ee8cc1Swenshuai.xi {
1748*53ee8cc1Swenshuai.xi if(_TSP_PcrId_To_StcId(u32PidFltId, &u32STCEng) == DRVTSP_OK)
1749*53ee8cc1Swenshuai.xi {
1750*53ee8cc1Swenshuai.xi _TSP_STC_Free(u32STCEng);
1751*53ee8cc1Swenshuai.xi }
1752*53ee8cc1Swenshuai.xi }
1753*53ee8cc1Swenshuai.xi
1754*53ee8cc1Swenshuai.xi // Release Filter
1755*53ee8cc1Swenshuai.xi _TSP_PidFlt_Init(u32EngId, u32PidFltId);
1756*53ee8cc1Swenshuai.xi
1757*53ee8cc1Swenshuai.xi #ifdef DUP_PIDFLT
1758*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].DupFlt[u32PidFltId] != 0xFFFFUL)
1759*53ee8cc1Swenshuai.xi {
1760*53ee8cc1Swenshuai.xi MS_U32 u32DupId = _ptsp_res->_TspState[u32EngId].DupFlt[u32PidFltId];
1761*53ee8cc1Swenshuai.xi
1762*53ee8cc1Swenshuai.xi _TSP_PidFlt_Init(u32EngId, u32DupId);
1763*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].DupFlt[u32PidFltId] = 0xFFFFUL;
1764*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32DupId] = E_DRVTSP_FLT_STATE_NA;
1765*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s][%d] dup id %ld\n", __FUNCTION__, __LINE__, u32DupId);
1766*53ee8cc1Swenshuai.xi }
1767*53ee8cc1Swenshuai.xi #endif
1768*53ee8cc1Swenshuai.xi
1769*53ee8cc1Swenshuai.xi // Reset call back function without PVR
1770*53ee8cc1Swenshuai.xi if (u32SecFltId < TSP_SECFLT_NUM)
1771*53ee8cc1Swenshuai.xi {
1772*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltCallback[u32SecFltId] = NULL;
1773*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltMode[u32SecFltId] = E_DRVTSP_FLT_MODE_CONTI;
1774*53ee8cc1Swenshuai.xi }
1775*53ee8cc1Swenshuai.xi
1776*53ee8cc1Swenshuai.xi // clear all event while filter free
1777*53ee8cc1Swenshuai.xi if(u32SecFltId < TSP_SECFLT_NUM)
1778*53ee8cc1Swenshuai.xi {
1779*53ee8cc1Swenshuai.xi MS_U32 u32Dummy = 0;
1780*53ee8cc1Swenshuai.xi
1781*53ee8cc1Swenshuai.xi _TSP_GetSecOvfId (u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
1782*53ee8cc1Swenshuai.xi _TSP_GetSecCrcId (u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
1783*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId (u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
1784*53ee8cc1Swenshuai.xi _TSP_GetFltDisableId(u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
1785*53ee8cc1Swenshuai.xi }
1786*53ee8cc1Swenshuai.xi
1787*53ee8cc1Swenshuai.xi if (bResetState)
1788*53ee8cc1Swenshuai.xi {
1789*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] = E_DRVTSP_FLT_STATE_FREE;
1790*53ee8cc1Swenshuai.xi }
1791*53ee8cc1Swenshuai.xi
1792*53ee8cc1Swenshuai.xi return (TSP_Result)TRUE;
1793*53ee8cc1Swenshuai.xi }
1794*53ee8cc1Swenshuai.xi
_TSP_PidFlt_StateGet(MS_U32 u32EngId,MS_U32 u32PidFltId,DrvTSP_FltState * peState)1795*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_PidFlt_StateGet(MS_U32 u32EngId, MS_U32 u32PidFltId, DrvTSP_FltState *peState)
1796*53ee8cc1Swenshuai.xi {
1797*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId = 0;
1798*53ee8cc1Swenshuai.xi MS_U8 u8ScmbSrc = 0;
1799*53ee8cc1Swenshuai.xi
1800*53ee8cc1Swenshuai.xi // don't need to check PVR pid filter
1801*53ee8cc1Swenshuai.xi TSP_ASSERT(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
1802*53ee8cc1Swenshuai.xi TSP_ASSERT(TSP_PIDFLT_NUM_ALL > u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFlt Id %u\n", __LINE__, (unsigned int)u32PidFltId));
1803*53ee8cc1Swenshuai.xi TSP_ASSERT(peState, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
1804*53ee8cc1Swenshuai.xi
1805*53ee8cc1Swenshuai.xi *peState= _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId];
1806*53ee8cc1Swenshuai.xi
1807*53ee8cc1Swenshuai.xi switch(_ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId])
1808*53ee8cc1Swenshuai.xi {
1809*53ee8cc1Swenshuai.xi default:
1810*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_LIVE:
1811*53ee8cc1Swenshuai.xi u8ScmbSrc = 0;
1812*53ee8cc1Swenshuai.xi break;
1813*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE:
1814*53ee8cc1Swenshuai.xi u8ScmbSrc = 1;
1815*53ee8cc1Swenshuai.xi break;
1816*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE1:
1817*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS1:
1818*53ee8cc1Swenshuai.xi u8ScmbSrc = 2;
1819*53ee8cc1Swenshuai.xi break;
1820*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE2:
1821*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS2:
1822*53ee8cc1Swenshuai.xi u8ScmbSrc = 3;
1823*53ee8cc1Swenshuai.xi break;
1824*53ee8cc1Swenshuai.xi }
1825*53ee8cc1Swenshuai.xi
1826*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
1827*53ee8cc1Swenshuai.xi if(u32PidFltId >= TSP_PIDFLT_NUM_ALL)
1828*53ee8cc1Swenshuai.xi {
1829*53ee8cc1Swenshuai.xi return TRUE;
1830*53ee8cc1Swenshuai.xi }
1831*53ee8cc1Swenshuai.xi #endif
1832*53ee8cc1Swenshuai.xi
1833*53ee8cc1Swenshuai.xi if(HAL_TSP_Scmb_Status(u8ScmbSrc, (MS_U8)(u32PidFltId >> 5UL), u32PidFltId))
1834*53ee8cc1Swenshuai.xi {
1835*53ee8cc1Swenshuai.xi *peState |= E_DRVTSP_FLT_STATE_SCRAMBLED;
1836*53ee8cc1Swenshuai.xi }
1837*53ee8cc1Swenshuai.xi
1838*53ee8cc1Swenshuai.xi switch (_ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
1839*53ee8cc1Swenshuai.xi {
1840*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION:
1841*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PES:
1842*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PACKET:
1843*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_TELETEXT:
1844*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION_VER:
1845*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION_NO_PUSI:
1846*53ee8cc1Swenshuai.xi u32SecFltId = HAL_TSP_PidFlt_GetSecFlt(u32EngId, u32PidFltId);
1847*53ee8cc1Swenshuai.xi if (HAL_TSP_SecBuf_GetBufRead(u32EngId, u32SecFltId) != HAL_TSP_SecBuf_GetBufWrite(u32EngId, u32SecFltId))
1848*53ee8cc1Swenshuai.xi {
1849*53ee8cc1Swenshuai.xi *peState |= E_DRVTSP_FLT_STATE_STREAM_AVAIL;
1850*53ee8cc1Swenshuai.xi }
1851*53ee8cc1Swenshuai.xi break;
1852*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO:
1853*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO:
1854*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO2:
1855*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO3D:
1856*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PCR:
1857*53ee8cc1Swenshuai.xi default:
1858*53ee8cc1Swenshuai.xi break;
1859*53ee8cc1Swenshuai.xi }
1860*53ee8cc1Swenshuai.xi return TRUE;
1861*53ee8cc1Swenshuai.xi }
1862*53ee8cc1Swenshuai.xi
_TSP_SecFlt_SetType(MS_U32 u32EngId,MS_U32 u32SecFltId,DrvTSP_FltType eSecFltType)1863*53ee8cc1Swenshuai.xi static void _TSP_SecFlt_SetType(MS_U32 u32EngId, MS_U32 u32SecFltId, DrvTSP_FltType eSecFltType)
1864*53ee8cc1Swenshuai.xi {
1865*53ee8cc1Swenshuai.xi MS_U32 u32FltType = TSP_SECFLT_TYPE_SEC;
1866*53ee8cc1Swenshuai.xi
1867*53ee8cc1Swenshuai.xi switch (eSecFltType)
1868*53ee8cc1Swenshuai.xi {
1869*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_TELETEXT:
1870*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_TTX;
1871*53ee8cc1Swenshuai.xi break;
1872*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PCR:
1873*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_PCR;
1874*53ee8cc1Swenshuai.xi break;
1875*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PES:
1876*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_PES;
1877*53ee8cc1Swenshuai.xi break;
1878*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION:
1879*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_SEC;
1880*53ee8cc1Swenshuai.xi break;
1881*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PACKET:
1882*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_PKT;
1883*53ee8cc1Swenshuai.xi break;
1884*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_ECM:
1885*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_ECM;
1886*53ee8cc1Swenshuai.xi break;
1887*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_EMM:
1888*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_EMM;
1889*53ee8cc1Swenshuai.xi break;
1890*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION_VER:
1891*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_VER;
1892*53ee8cc1Swenshuai.xi break;
1893*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION_NO_PUSI:
1894*53ee8cc1Swenshuai.xi u32FltType = TSP_SECFLT_TYPE_SEC_NO_PUSI;
1895*53ee8cc1Swenshuai.xi break;
1896*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PVR:
1897*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_CB:
1898*53ee8cc1Swenshuai.xi default:
1899*53ee8cc1Swenshuai.xi break;
1900*53ee8cc1Swenshuai.xi }
1901*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetType(u32EngId, u32SecFltId, u32FltType);
1902*53ee8cc1Swenshuai.xi }
1903*53ee8cc1Swenshuai.xi
_TSP_SecFlt_StateGet(MS_U32 u32EngId,MS_U32 u32SecFltId,DrvTSP_FltState * peState)1904*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_SecFlt_StateGet(MS_U32 u32EngId, MS_U32 u32SecFltId, DrvTSP_FltState *peState)
1905*53ee8cc1Swenshuai.xi {
1906*53ee8cc1Swenshuai.xi TSP_ASSERT(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
1907*53ee8cc1Swenshuai.xi TSP_ASSERT(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
1908*53ee8cc1Swenshuai.xi TSP_ASSERT(peState, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
1909*53ee8cc1Swenshuai.xi
1910*53ee8cc1Swenshuai.xi *peState = _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId];
1911*53ee8cc1Swenshuai.xi if (HAL_TSP_SecFlt_GetState(0, u32SecFltId) & TSP_SECFLT_STATE_OVERFLOW)
1912*53ee8cc1Swenshuai.xi {
1913*53ee8cc1Swenshuai.xi *peState |= E_DRVTSP_FLT_STATE_OVERFLOW;
1914*53ee8cc1Swenshuai.xi }
1915*53ee8cc1Swenshuai.xi return TRUE;
1916*53ee8cc1Swenshuai.xi }
1917*53ee8cc1Swenshuai.xi
_TSP_SecFlt_Init(MS_U32 u32EngId,MS_U32 u32SecFltId)1918*53ee8cc1Swenshuai.xi static void _TSP_SecFlt_Init(MS_U32 u32EngId, MS_U32 u32SecFltId)
1919*53ee8cc1Swenshuai.xi {
1920*53ee8cc1Swenshuai.xi static MS_U8 u8Mask[TSP_FILTER_DEPTH] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1921*53ee8cc1Swenshuai.xi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
1922*53ee8cc1Swenshuai.xi static MS_U8 u8NMask[TSP_FILTER_DEPTH] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1923*53ee8cc1Swenshuai.xi 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1924*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_ClrCtrl(u32EngId, u32SecFltId);
1925*53ee8cc1Swenshuai.xi
1926*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SelSecBuf(u32EngId, u32SecFltId, TSP_SECFLT_BUF_NULL, FALSE);
1927*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetMatch(u32EngId, u32SecFltId, u8Mask);
1928*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetMask(u32EngId, u32SecFltId, u8NMask);
1929*53ee8cc1Swenshuai.xi //HAL_TSP_SecFlt_SetNMask(HAL_TSP_SECFLT(u32EngId, u32SecFltId)), u8Mask);
1930*53ee8cc1Swenshuai.xi _TSP_SecFlt_SetType(u32EngId, u32SecFltId, E_DRVTSP_FLT_TYPE_SECTION);
1931*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetReqCount(u32EngId, u32SecFltId, 0);
1932*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_ResetState(u32EngId, u32SecFltId);
1933*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].SecFltEvtNotify[u32SecFltId] = E_DRVTSP_EVENT_DATA_INIT;
1934*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].SecFltCallback[u32SecFltId] = NULL;
1935*53ee8cc1Swenshuai.xi }
1936*53ee8cc1Swenshuai.xi
1937*53ee8cc1Swenshuai.xi // Section filter ID == PID filter ID, Set *pu32SecFltId == PIDFlterID
_TSP_SecFlt_Alloc(MS_U32 u32EngId,DrvTSP_FltType eFilterType,MS_U32 * pu32SecFltId)1938*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_SecFlt_Alloc(MS_U32 u32EngId, DrvTSP_FltType eFilterType, MS_U32 *pu32SecFltId)
1939*53ee8cc1Swenshuai.xi {
1940*53ee8cc1Swenshuai.xi MS_U32 u32ii = 0;
1941*53ee8cc1Swenshuai.xi
1942*53ee8cc1Swenshuai.xi u32ii = *pu32SecFltId;
1943*53ee8cc1Swenshuai.xi
1944*53ee8cc1Swenshuai.xi if (u32ii < TSP_SECFLT_NUM && _ptsp_res->_TspState[u32EngId].SecFltState[u32ii] == E_DRVTSP_FLT_STATE_FREE)
1945*53ee8cc1Swenshuai.xi {
1946*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltState[u32ii] = E_DRVTSP_FLT_STATE_ALLOC;
1947*53ee8cc1Swenshuai.xi _TSP_SecFlt_Init(u32EngId, u32ii);
1948*53ee8cc1Swenshuai.xi *pu32SecFltId = u32ii;
1949*53ee8cc1Swenshuai.xi _TSP_SetSecNotifyId(*pu32SecFltId); //for isr processing checking
1950*53ee8cc1Swenshuai.xi return TRUE;
1951*53ee8cc1Swenshuai.xi }
1952*53ee8cc1Swenshuai.xi else
1953*53ee8cc1Swenshuai.xi {
1954*53ee8cc1Swenshuai.xi return FALSE;
1955*53ee8cc1Swenshuai.xi }
1956*53ee8cc1Swenshuai.xi }
1957*53ee8cc1Swenshuai.xi
_TSP_SecFlt_Free(MS_U32 u32EngId,MS_U32 u32SecFltId,MS_BOOL bResetState)1958*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_SecFlt_Free(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_BOOL bResetState)
1959*53ee8cc1Swenshuai.xi {
1960*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_ResetEmmIdx(u32EngId, u32SecFltId);
1961*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SelSecBuf(0, u32SecFltId, TSP_SECFLT_BUF_NULL, FALSE);
1962*53ee8cc1Swenshuai.xi if (bResetState)
1963*53ee8cc1Swenshuai.xi {
1964*53ee8cc1Swenshuai.xi // clear all event while filter free
1965*53ee8cc1Swenshuai.xi MS_U32 u32Dummy = 0;
1966*53ee8cc1Swenshuai.xi _TSP_GetSecOvfId (u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
1967*53ee8cc1Swenshuai.xi _TSP_GetSecCrcId (u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
1968*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId (u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
1969*53ee8cc1Swenshuai.xi _TSP_GetFltDisableId(u32SecFltId, &u32Dummy, OSAL_EVENT_OR_CLEAR);
1970*53ee8cc1Swenshuai.xi
1971*53ee8cc1Swenshuai.xi _TSP_RemoveSecNotifyId(u32SecFltId);
1972*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId] = E_DRVTSP_FLT_STATE_FREE;
1973*53ee8cc1Swenshuai.xi }
1974*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] = E_DRVTSP_EVENT_DATA_INIT;
1975*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].s32TspEvtId[u32SecFltId] = -1;
1976*53ee8cc1Swenshuai.xi
1977*53ee8cc1Swenshuai.xi return TRUE;
1978*53ee8cc1Swenshuai.xi }
1979*53ee8cc1Swenshuai.xi
_TSP_SecBuf_Init(MS_U32 u32EngId,MS_U32 u32SecBufId)1980*53ee8cc1Swenshuai.xi static void _TSP_SecBuf_Init(MS_U32 u32EngId, MS_U32 u32SecBufId)
1981*53ee8cc1Swenshuai.xi {
1982*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_SetBuffer(u32EngId, u32SecBufId, 0, 0);
1983*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_ResetBuffer(u32EngId, u32SecBufId);
1984*53ee8cc1Swenshuai.xi }
1985*53ee8cc1Swenshuai.xi
1986*53ee8cc1Swenshuai.xi // Section buffer ID == Section filter ID, Set *pu32SecBufId == SecFlterID
_TSP_SecBuf_Alloc(MS_U32 u32EngId,MS_U32 * pu32SecBufId)1987*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_SecBuf_Alloc(MS_U32 u32EngId, MS_U32 *pu32SecBufId)
1988*53ee8cc1Swenshuai.xi {
1989*53ee8cc1Swenshuai.xi MS_U32 u32ii = *pu32SecBufId;
1990*53ee8cc1Swenshuai.xi
1991*53ee8cc1Swenshuai.xi if (u32ii < TSP_SECBUF_NUM && _ptsp_res->_TspState[u32EngId].SecBufState[u32ii] == E_DRVTSP_FLT_STATE_FREE)
1992*53ee8cc1Swenshuai.xi {
1993*53ee8cc1Swenshuai.xi goto SECBUF_ALC_END;
1994*53ee8cc1Swenshuai.xi }
1995*53ee8cc1Swenshuai.xi else
1996*53ee8cc1Swenshuai.xi {
1997*53ee8cc1Swenshuai.xi return FALSE;
1998*53ee8cc1Swenshuai.xi }
1999*53ee8cc1Swenshuai.xi
2000*53ee8cc1Swenshuai.xi *pu32SecBufId = 0xFFFFFFFFUL;
2001*53ee8cc1Swenshuai.xi
2002*53ee8cc1Swenshuai.xi for (u32ii = 0; u32ii < TSP_SECBUF_NUM; u32ii++)
2003*53ee8cc1Swenshuai.xi {
2004*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].SecBufState[u32ii] == E_DRVTSP_FLT_STATE_FREE)
2005*53ee8cc1Swenshuai.xi {
2006*53ee8cc1Swenshuai.xi break;
2007*53ee8cc1Swenshuai.xi }
2008*53ee8cc1Swenshuai.xi }
2009*53ee8cc1Swenshuai.xi if (u32ii == TSP_SECBUF_NUM)
2010*53ee8cc1Swenshuai.xi {
2011*53ee8cc1Swenshuai.xi return FALSE;
2012*53ee8cc1Swenshuai.xi }
2013*53ee8cc1Swenshuai.xi
2014*53ee8cc1Swenshuai.xi SECBUF_ALC_END:
2015*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecBufState[u32ii] = E_DRVTSP_FLT_STATE_ALLOC;
2016*53ee8cc1Swenshuai.xi *pu32SecBufId = u32ii;
2017*53ee8cc1Swenshuai.xi return TRUE;
2018*53ee8cc1Swenshuai.xi }
2019*53ee8cc1Swenshuai.xi
_TSP_RegStateStore(void)2020*53ee8cc1Swenshuai.xi static void _TSP_RegStateStore(void)
2021*53ee8cc1Swenshuai.xi {
2022*53ee8cc1Swenshuai.xi HAL_TSP_Int_Disable(TSP_HWINT_ALL);
2023*53ee8cc1Swenshuai.xi HAL_TSP_Int2_Disable(TSP_HWINT2_ALL);
2024*53ee8cc1Swenshuai.xi
2025*53ee8cc1Swenshuai.xi OSAL_TSP_IntDisable();
2026*53ee8cc1Swenshuai.xi OSAL_TSP_IntDetach();
2027*53ee8cc1Swenshuai.xi HAL_TSP_SaveFltState();
2028*53ee8cc1Swenshuai.xi }
2029*53ee8cc1Swenshuai.xi
_TSP_RegStateRestore(void)2030*53ee8cc1Swenshuai.xi static void _TSP_RegStateRestore(void)
2031*53ee8cc1Swenshuai.xi {
2032*53ee8cc1Swenshuai.xi HAL_TSP_RestoreFltState();
2033*53ee8cc1Swenshuai.xi }
2034*53ee8cc1Swenshuai.xi
_TSP_SecBuf_Free(MS_U32 u32EngId,MS_U32 u32SecBufId)2035*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_SecBuf_Free(MS_U32 u32EngId, MS_U32 u32SecBufId)
2036*53ee8cc1Swenshuai.xi {
2037*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecBufState[u32SecBufId] = E_DRVTSP_FLT_STATE_FREE;
2038*53ee8cc1Swenshuai.xi return TRUE;
2039*53ee8cc1Swenshuai.xi }
2040*53ee8cc1Swenshuai.xi
_TSP_RegStateReset(void)2041*53ee8cc1Swenshuai.xi static void _TSP_RegStateReset(void)
2042*53ee8cc1Swenshuai.xi {
2043*53ee8cc1Swenshuai.xi MS_U32 u32EngId;
2044*53ee8cc1Swenshuai.xi MS_U32 u32FilterId;
2045*53ee8cc1Swenshuai.xi
2046*53ee8cc1Swenshuai.xi for (u32EngId = 0; u32EngId < TSP_ENGINE_NUM; u32EngId++)
2047*53ee8cc1Swenshuai.xi {
2048*53ee8cc1Swenshuai.xi for (u32FilterId = 0; u32FilterId < TSP_PIDFLT_NUM_ALL; u32FilterId++)
2049*53ee8cc1Swenshuai.xi {
2050*53ee8cc1Swenshuai.xi _TSP_PidFlt_Init(u32EngId, u32FilterId);
2051*53ee8cc1Swenshuai.xi }
2052*53ee8cc1Swenshuai.xi for (u32FilterId = 0; u32FilterId < TSP_SECFLT_NUM; u32FilterId++)
2053*53ee8cc1Swenshuai.xi {
2054*53ee8cc1Swenshuai.xi _TSP_SecBuf_Init(u32EngId, u32FilterId);
2055*53ee8cc1Swenshuai.xi //HAL_TSP_SecBuf_SetBuffer(u32EngId, u32FilterId, 0, 0);
2056*53ee8cc1Swenshuai.xi _TSP_SecFlt_Init(u32EngId, u32FilterId);
2057*53ee8cc1Swenshuai.xi }
2058*53ee8cc1Swenshuai.xi }
2059*53ee8cc1Swenshuai.xi }
2060*53ee8cc1Swenshuai.xi
_TSP_SelPad(MS_U32 u32EngId,DrvTSP_If eIf,DrvTSP_If_Set * pIfSet)2061*53ee8cc1Swenshuai.xi static TSP_Result _TSP_SelPad(MS_U32 u32EngId, DrvTSP_If eIf, DrvTSP_If_Set* pIfSet)
2062*53ee8cc1Swenshuai.xi {
2063*53ee8cc1Swenshuai.xi if (u32EngId>= TSP_ENGINE_NUM)
2064*53ee8cc1Swenshuai.xi {
2065*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
2066*53ee8cc1Swenshuai.xi }
2067*53ee8cc1Swenshuai.xi
2068*53ee8cc1Swenshuai.xi if((eIf >= E_DRVTSP_IF_NUM) && (eIf != E_DRVTSP_IF_FI))
2069*53ee8cc1Swenshuai.xi {
2070*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
2071*53ee8cc1Swenshuai.xi }
2072*53ee8cc1Swenshuai.xi
2073*53ee8cc1Swenshuai.xi HAL_TSP_SelPad(u32EngId, (MS_U32)eIf, (MS_U32)pIfSet->ePad, pIfSet->bParallel);
2074*53ee8cc1Swenshuai.xi HAL_TSP_SelPad_ClkInv(u32EngId, (MS_U32)eIf, pIfSet->bClkInv);
2075*53ee8cc1Swenshuai.xi HAL_TSP_SelPad_ExtSync(u32EngId, pIfSet->bExtSync, (MS_U32)eIf);
2076*53ee8cc1Swenshuai.xi HAL_TSP_SelPad_Parl(u32EngId, pIfSet->bParallel, (MS_U32)eIf);
2077*53ee8cc1Swenshuai.xi
2078*53ee8cc1Swenshuai.xi #ifdef TS3_IF_SUPPORT
2079*53ee8cc1Swenshuai.xi if(pIfSet->bParallel == FALSE && pIfSet->ePad == E_DRVTSP_PAD_EXT_INPUT3)
2080*53ee8cc1Swenshuai.xi {
2081*53ee8cc1Swenshuai.xi HAL_TSP_TSOut_En(TRUE);
2082*53ee8cc1Swenshuai.xi }
2083*53ee8cc1Swenshuai.xi else
2084*53ee8cc1Swenshuai.xi {
2085*53ee8cc1Swenshuai.xi HAL_TSP_TSOut_En(FALSE);
2086*53ee8cc1Swenshuai.xi }
2087*53ee8cc1Swenshuai.xi #endif
2088*53ee8cc1Swenshuai.xi
2089*53ee8cc1Swenshuai.xi return DRVTSP_OK;
2090*53ee8cc1Swenshuai.xi }
2091*53ee8cc1Swenshuai.xi
2092*53ee8cc1Swenshuai.xi #if 0
_TSP_IsPidFltFreeDefer(MS_U32 u32PidFltId)2093*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_IsPidFltFreeDefer(MS_U32 u32PidFltId)
2094*53ee8cc1Swenshuai.xi {
2095*53ee8cc1Swenshuai.xi MS_U32 u32Flag = 0;
2096*53ee8cc1Swenshuai.xi
2097*53ee8cc1Swenshuai.xi _TSP_GetEventFreeDefer0Id(u32PidFltId, &u32Flag, E_AND);
2098*53ee8cc1Swenshuai.xi return ((u32Flag & (1 << (u32PidFltId & 0x1F))) ? TRUE: FALSE);
2099*53ee8cc1Swenshuai.xi }
2100*53ee8cc1Swenshuai.xi
_TSP_SetPidFltFreeDefer(MS_U32 u32PidFltId)2101*53ee8cc1Swenshuai.xi static void _TSP_SetPidFltFreeDefer(MS_U32 u32PidFltId)
2102*53ee8cc1Swenshuai.xi {
2103*53ee8cc1Swenshuai.xi _TSP_SetEventFreeDefer0Id(u32PidFltId);
2104*53ee8cc1Swenshuai.xi }
2105*53ee8cc1Swenshuai.xi
_TSP_ResetPidFltFreeDefer(MS_U32 u32PidFltId)2106*53ee8cc1Swenshuai.xi static void _TSP_ResetPidFltFreeDefer(MS_U32 u32PidFltId)
2107*53ee8cc1Swenshuai.xi {
2108*53ee8cc1Swenshuai.xi MS_U32 u32Flag = 0;
2109*53ee8cc1Swenshuai.xi
2110*53ee8cc1Swenshuai.xi _TSP_GetEventFreeDefer0Id(u32PidFltId, &u32Flag, E_OR_CLEAR);
2111*53ee8cc1Swenshuai.xi }
2112*53ee8cc1Swenshuai.xi #endif
2113*53ee8cc1Swenshuai.xi
2114*53ee8cc1Swenshuai.xi #if 0
_TSP_IsAskPidFltFree(MS_U32 u32PidFltId)2115*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_IsAskPidFltFree(MS_U32 u32PidFltId)
2116*53ee8cc1Swenshuai.xi {
2117*53ee8cc1Swenshuai.xi MS_U32 u32Flag = 0;
2118*53ee8cc1Swenshuai.xi
2119*53ee8cc1Swenshuai.xi _TSP_GetEventFree0Id(u32PidFltId, &u32Flag, E_AND);
2120*53ee8cc1Swenshuai.xi return ((u32Flag & (1 << (u32PidFltId & 0x1F))) ? TRUE: FALSE);
2121*53ee8cc1Swenshuai.xi }
2122*53ee8cc1Swenshuai.xi
_TSP_AskPidFltFree(MS_U32 u32PidFltId)2123*53ee8cc1Swenshuai.xi static void _TSP_AskPidFltFree(MS_U32 u32PidFltId)
2124*53ee8cc1Swenshuai.xi {
2125*53ee8cc1Swenshuai.xi _TSP_SetEventFree0Id(u32PidFltId);
2126*53ee8cc1Swenshuai.xi }
2127*53ee8cc1Swenshuai.xi
2128*53ee8cc1Swenshuai.xi //Free Section PID filters, 32 filters for one group
2129*53ee8cc1Swenshuai.xi //For 64 pid filters, there are 2 gropus
2130*53ee8cc1Swenshuai.xi //For 128 pid filters, there are 4 groups
_TSP_GetAskPidFltFree0List(MS_U32 u32Group)2131*53ee8cc1Swenshuai.xi static MS_U32 _TSP_GetAskPidFltFree0List(MS_U32 u32Group)
2132*53ee8cc1Swenshuai.xi {
2133*53ee8cc1Swenshuai.xi MS_U32 u32Flag = 0;
2134*53ee8cc1Swenshuai.xi
2135*53ee8cc1Swenshuai.xi _TSP_GetModeEventFree0(u32Group, 0xFFFFFFFF, &u32Flag, E_OR);
2136*53ee8cc1Swenshuai.xi
2137*53ee8cc1Swenshuai.xi return u32Flag;
2138*53ee8cc1Swenshuai.xi }
2139*53ee8cc1Swenshuai.xi
2140*53ee8cc1Swenshuai.xi //Free Section PID filters
2141*53ee8cc1Swenshuai.xi //For 64 pid filters, there are 2 gropus
2142*53ee8cc1Swenshuai.xi //For 128 pid filters, there are 4 groups
_TSP_ClrAskPidFltFree0List(MS_U32 u32Group,MS_U32 u32Mask)2143*53ee8cc1Swenshuai.xi static void _TSP_ClrAskPidFltFree0List(MS_U32 u32Group, MS_U32 u32Mask)
2144*53ee8cc1Swenshuai.xi {
2145*53ee8cc1Swenshuai.xi MS_U32 u32Flag;
2146*53ee8cc1Swenshuai.xi
2147*53ee8cc1Swenshuai.xi _TSP_GetModeEventFree0(u32Group, u32Mask, &u32Flag, E_OR_CLEAR);
2148*53ee8cc1Swenshuai.xi }
2149*53ee8cc1Swenshuai.xi #endif
2150*53ee8cc1Swenshuai.xi
2151*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)2152*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_Flt_StateGet(MS_U32 u32EngId, MS_U32 u32FltId, DrvTSP_FltState *peState)
2153*53ee8cc1Swenshuai.xi {
2154*53ee8cc1Swenshuai.xi DrvTSP_FltState PidFltState;
2155*53ee8cc1Swenshuai.xi DrvTSP_FltState SecFltState;
2156*53ee8cc1Swenshuai.xi
2157*53ee8cc1Swenshuai.xi if (!_TSP_PidFlt_StateGet(u32EngId, u32FltId, &PidFltState))
2158*53ee8cc1Swenshuai.xi {
2159*53ee8cc1Swenshuai.xi return FALSE;
2160*53ee8cc1Swenshuai.xi }
2161*53ee8cc1Swenshuai.xi *peState= PidFltState;
2162*53ee8cc1Swenshuai.xi if (TSP_SECFLT_NUM<= u32FltId)
2163*53ee8cc1Swenshuai.xi {
2164*53ee8cc1Swenshuai.xi return TRUE;
2165*53ee8cc1Swenshuai.xi }
2166*53ee8cc1Swenshuai.xi if (!_TSP_SecFlt_StateGet(u32EngId, u32FltId, &SecFltState))
2167*53ee8cc1Swenshuai.xi {
2168*53ee8cc1Swenshuai.xi return FALSE;
2169*53ee8cc1Swenshuai.xi }
2170*53ee8cc1Swenshuai.xi *peState|= SecFltState;
2171*53ee8cc1Swenshuai.xi return TRUE;
2172*53ee8cc1Swenshuai.xi }
2173*53ee8cc1Swenshuai.xi
2174*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
_TSP_PCR_Adjust(MS_U32 u32EngId)2175*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_PCR_Adjust(MS_U32 u32EngId)
2176*53ee8cc1Swenshuai.xi {
2177*53ee8cc1Swenshuai.xi MS_U32 u32Pcr = 0, u32Pcr_H = 0, u32Diff = 0, u32STC = 0;
2178*53ee8cc1Swenshuai.xi
2179*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_Read(u32EngId, &u32Pcr, &u32Pcr_H);
2180*53ee8cc1Swenshuai.xi
2181*53ee8cc1Swenshuai.xi #if 1
2182*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPHwPcrParams._u8ResetPcr[u32EngId] >= 2)
2183*53ee8cc1Swenshuai.xi {
2184*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPHwPcrParams._u8ResetPcr[u32EngId] == 3)
2185*53ee8cc1Swenshuai.xi {
2186*53ee8cc1Swenshuai.xi HAL_TSP_Stc_ctrl(u32EngId, STC_SYNTH_DEFAULT);
2187*53ee8cc1Swenshuai.xi }
2188*53ee8cc1Swenshuai.xi HAL_TSP_SetSTC(u32EngId, u32Pcr, u32Pcr_H);
2189*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u8ResetPcr[u32EngId] = 0;
2190*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u32PrevStcBase[u32EngId] = u32Pcr;
2191*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u32PrevPllControl[u32EngId] = HAL_TSP_GetSTCSynth(u32EngId);
2192*53ee8cc1Swenshuai.xi }
2193*53ee8cc1Swenshuai.xi
2194*53ee8cc1Swenshuai.xi HAL_TSP_STC_Update_Disable(u32EngId, TRUE);
2195*53ee8cc1Swenshuai.xi u32STC = HAL_TSP_GetSTC(u32EngId);
2196*53ee8cc1Swenshuai.xi HAL_TSP_STC_Update_Disable(u32EngId, FALSE);
2197*53ee8cc1Swenshuai.xi
2198*53ee8cc1Swenshuai.xi //ULOGD("TSP", "Pcr %08lx, STC %08lx \n", u32Pcr, u32STC);
2199*53ee8cc1Swenshuai.xi if((u32STC - _ptsp_res->TSPHwPcrParams._u32PrevStcBase[u32EngId]) > 0x4000UL)
2200*53ee8cc1Swenshuai.xi {
2201*53ee8cc1Swenshuai.xi //ULOGD("TSP", "STC_DIFF = %08lx ==== \n\n",u32STC - _u32PrevStcBase[u32EngId]);
2202*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u32PrevStcBase[u32EngId] = u32STC;
2203*53ee8cc1Swenshuai.xi
2204*53ee8cc1Swenshuai.xi if(_ptsp_res->TSPHwPcrParams._u32PrevStcBase[u32EngId] > u32Pcr)
2205*53ee8cc1Swenshuai.xi {
2206*53ee8cc1Swenshuai.xi u32Diff = _ptsp_res->TSPHwPcrParams._u32PrevStcBase[u32EngId] - u32Pcr;
2207*53ee8cc1Swenshuai.xi if( u32Diff <= 0x02UL)
2208*53ee8cc1Swenshuai.xi {
2209*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u8ResetPcr[u32EngId] = 0;
2210*53ee8cc1Swenshuai.xi }
2211*53ee8cc1Swenshuai.xi else if( u32Diff < 0x1000UL)
2212*53ee8cc1Swenshuai.xi {
2213*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u32PrevPllControl[u32EngId] += ((u32Diff) >> 3UL); //now = error x alpha + prev
2214*53ee8cc1Swenshuai.xi HAL_TSP_Stc_ctrl(u32EngId, _ptsp_res->TSPHwPcrParams._u32PrevPllControl[u32EngId] + ((u32Diff)>> 6UL)); //out = now + error x beta
2215*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u8ResetPcr[u32EngId] = 0;
2216*53ee8cc1Swenshuai.xi //ULOGD("TSP", "======== Set STC CONTROL <++> %08lx PCR/Diff = %08lx/%08lx \n",
2217*53ee8cc1Swenshuai.xi // _u32PrevPllControl[u32EngId] + ((_u32PrevStcBase[u32EngId] - u32Pcr)>>6),u32Pcr,_u32PrevStcBase[u32EngId]-u32Pcr);
2218*53ee8cc1Swenshuai.xi }
2219*53ee8cc1Swenshuai.xi else
2220*53ee8cc1Swenshuai.xi {
2221*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u8ResetPcr[u32EngId]++;
2222*53ee8cc1Swenshuai.xi }
2223*53ee8cc1Swenshuai.xi }
2224*53ee8cc1Swenshuai.xi else
2225*53ee8cc1Swenshuai.xi {
2226*53ee8cc1Swenshuai.xi u32Diff = u32Pcr - _ptsp_res->TSPHwPcrParams._u32PrevStcBase[u32EngId] ;
2227*53ee8cc1Swenshuai.xi if(( u32Diff) <= 0x02UL)
2228*53ee8cc1Swenshuai.xi {
2229*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u8ResetPcr[u32EngId] = 0;
2230*53ee8cc1Swenshuai.xi }
2231*53ee8cc1Swenshuai.xi else if((u32Diff) < 0x1000UL)
2232*53ee8cc1Swenshuai.xi {
2233*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u32PrevPllControl[u32EngId] -= ((u32Diff)>> 3UL); //now = error x alpha + prev
2234*53ee8cc1Swenshuai.xi HAL_TSP_Stc_ctrl(u32EngId, _ptsp_res->TSPHwPcrParams._u32PrevPllControl[u32EngId] - ((u32Diff)>> 6UL)); //out = now + error x beta
2235*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u8ResetPcr[u32EngId] = 0;
2236*53ee8cc1Swenshuai.xi //ULOGD("TSP", "======== Set STC CONTROL <--> %08lx PCR/Diff = %08lx/%08lx \n",
2237*53ee8cc1Swenshuai.xi // _u32PrevPllControl[u32EngId] - ((u32Pcr - _u32PrevStcBase[u32EngId] )>>6),u32Pcr,u32Pcr-_u32PrevStcBase[u32EngId] );
2238*53ee8cc1Swenshuai.xi }
2239*53ee8cc1Swenshuai.xi else
2240*53ee8cc1Swenshuai.xi {
2241*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u8ResetPcr[u32EngId]++;
2242*53ee8cc1Swenshuai.xi }
2243*53ee8cc1Swenshuai.xi }
2244*53ee8cc1Swenshuai.xi }
2245*53ee8cc1Swenshuai.xi #else
2246*53ee8cc1Swenshuai.xi HAL_TSP_SetSTC(u32EngId, u32Pcr, u32Pcr_H);
2247*53ee8cc1Swenshuai.xi #endif
2248*53ee8cc1Swenshuai.xi
2249*53ee8cc1Swenshuai.xi return TRUE;
2250*53ee8cc1Swenshuai.xi }
2251*53ee8cc1Swenshuai.xi
2252*53ee8cc1Swenshuai.xi #endif //HWPCR_ENABLE
2253*53ee8cc1Swenshuai.xi
2254*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
2255*53ee8cc1Swenshuai.xi // Interrupt service routine of TSP
2256*53ee8cc1Swenshuai.xi // Arguments: None
2257*53ee8cc1Swenshuai.xi // Return: None
2258*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
2259*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2260*53ee8cc1Swenshuai.xi //static irqreturn_t _TSP_Isr(int irq,void *dev_id)
_TSP_Isr(void)2261*53ee8cc1Swenshuai.xi static void _TSP_Isr(void)
2262*53ee8cc1Swenshuai.xi #else
2263*53ee8cc1Swenshuai.xi static void _TSP_Isr(void)
2264*53ee8cc1Swenshuai.xi #endif
2265*53ee8cc1Swenshuai.xi {
2266*53ee8cc1Swenshuai.xi MS_U32 u32HwInt;
2267*53ee8cc1Swenshuai.xi MS_U32 u32SwInt;
2268*53ee8cc1Swenshuai.xi MS_U32 u32HwInt2;
2269*53ee8cc1Swenshuai.xi
2270*53ee8cc1Swenshuai.xi _ptsp_res->_u32DbgIntrCount++;
2271*53ee8cc1Swenshuai.xi //HAL_TSP_ISR_SAVE_ALL();
2272*53ee8cc1Swenshuai.xi
2273*53ee8cc1Swenshuai.xi _TSP_INT_LOCK();
2274*53ee8cc1Swenshuai.xi u32HwInt = HAL_TSP_HW_INT_STATUS();
2275*53ee8cc1Swenshuai.xi u32SwInt = HAL_TSP_SW_INT_STATUS();
2276*53ee8cc1Swenshuai.xi u32HwInt2 = HAL_TSP_HW_INT2_STATUS();
2277*53ee8cc1Swenshuai.xi _TSP_INT_UNLOCK();
2278*53ee8cc1Swenshuai.xi
2279*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
2280*53ee8cc1Swenshuai.xi if (u32HwInt2 & TSP_HWINT2_PCR0_UPDATE_END)
2281*53ee8cc1Swenshuai.xi {
2282*53ee8cc1Swenshuai.xi if(_TSP_ChkHwPcrNotifyId(0))
2283*53ee8cc1Swenshuai.xi {
2284*53ee8cc1Swenshuai.xi _TSP_PCR_Adjust(0);
2285*53ee8cc1Swenshuai.xi }
2286*53ee8cc1Swenshuai.xi else
2287*53ee8cc1Swenshuai.xi {
2288*53ee8cc1Swenshuai.xi u32HwInt2 &= ~TSP_HWINT2_PCR0_UPDATE_END;
2289*53ee8cc1Swenshuai.xi }
2290*53ee8cc1Swenshuai.xi }
2291*53ee8cc1Swenshuai.xi if (u32HwInt2 & TSP_HWINT2_PCR1_UPDATE_END)
2292*53ee8cc1Swenshuai.xi {
2293*53ee8cc1Swenshuai.xi if(_TSP_ChkHwPcrNotifyId(1))
2294*53ee8cc1Swenshuai.xi {
2295*53ee8cc1Swenshuai.xi _TSP_PCR_Adjust(1);
2296*53ee8cc1Swenshuai.xi }
2297*53ee8cc1Swenshuai.xi else
2298*53ee8cc1Swenshuai.xi {
2299*53ee8cc1Swenshuai.xi u32HwInt2 &= ~TSP_HWINT2_PCR1_UPDATE_END;
2300*53ee8cc1Swenshuai.xi }
2301*53ee8cc1Swenshuai.xi }
2302*53ee8cc1Swenshuai.xi #endif
2303*53ee8cc1Swenshuai.xi
2304*53ee8cc1Swenshuai.xi //PVR using polling mode, so ignore PVR interrupts
2305*53ee8cc1Swenshuai.xi if (HAS_FLAG(u32HwInt, TSP_HWINT_HW_PVR1_MASK))
2306*53ee8cc1Swenshuai.xi {
2307*53ee8cc1Swenshuai.xi if(_TSP_ChkPvrNotifyId(0))
2308*53ee8cc1Swenshuai.xi {
2309*53ee8cc1Swenshuai.xi _TSP_SetEvent(_ptsp_res->_s32PvrEvtId[0], TSP_TASK_EVENT_PVR0_RDY_SELF|TSP_TASK_EVENT_PVR0_RDY_POLL|TSP_TASK_EVENT_PVR1_RDY_SELF|TSP_TASK_EVENT_PVR1_RDY_POLL);
2310*53ee8cc1Swenshuai.xi }
2311*53ee8cc1Swenshuai.xi else
2312*53ee8cc1Swenshuai.xi {
2313*53ee8cc1Swenshuai.xi u32HwInt &= ~TSP_HWINT_HW_PVR1_MASK;
2314*53ee8cc1Swenshuai.xi }
2315*53ee8cc1Swenshuai.xi }
2316*53ee8cc1Swenshuai.xi if (HAS_FLAG(u32HwInt2, (TSP_HWINT_HW_PVR2_MASK)))
2317*53ee8cc1Swenshuai.xi {
2318*53ee8cc1Swenshuai.xi if(_TSP_ChkPvrNotifyId(1))
2319*53ee8cc1Swenshuai.xi {
2320*53ee8cc1Swenshuai.xi _TSP_SetEvent(_ptsp_res->_s32PvrEvtId[1], TSP_TASK_EVENT_PVR2PVR0_RDY_SELF|TSP_TASK_EVENT_PVR2PVR0_RDY_POLL|TSP_TASK_EVENT_PVR2PVR1_RDY_SELF|TSP_TASK_EVENT_PVR2PVR1_RDY_POLL);
2321*53ee8cc1Swenshuai.xi }
2322*53ee8cc1Swenshuai.xi else
2323*53ee8cc1Swenshuai.xi {
2324*53ee8cc1Swenshuai.xi u32HwInt2 &= ~TSP_HWINT_HW_PVR2_MASK;
2325*53ee8cc1Swenshuai.xi }
2326*53ee8cc1Swenshuai.xi }
2327*53ee8cc1Swenshuai.xi
2328*53ee8cc1Swenshuai.xi #ifdef TS3_IF_SUPPORT
2329*53ee8cc1Swenshuai.xi if (HAS_FLAG(u32HwInt2, (TSP_HWINT_HW_PVRCB_MASK)))
2330*53ee8cc1Swenshuai.xi {
2331*53ee8cc1Swenshuai.xi if(_TSP_ChkPvrNotifyId(2))
2332*53ee8cc1Swenshuai.xi {
2333*53ee8cc1Swenshuai.xi _TSP_SetEvent(_ptsp_res->_s32PvrEvtId[2], TSP_TASK_EVENT_CBPVR0_RDY_SELF|TSP_TASK_EVENT_CBPVR0_RDY_POLL);
2334*53ee8cc1Swenshuai.xi }
2335*53ee8cc1Swenshuai.xi else
2336*53ee8cc1Swenshuai.xi {
2337*53ee8cc1Swenshuai.xi u32HwInt2 &= ~TSP_HWINT_HW_PVRCB_MASK;
2338*53ee8cc1Swenshuai.xi }
2339*53ee8cc1Swenshuai.xi }
2340*53ee8cc1Swenshuai.xi #endif
2341*53ee8cc1Swenshuai.xi
2342*53ee8cc1Swenshuai.xi if (u32SwInt & TSP_SWINT_CTRL_FIRE)
2343*53ee8cc1Swenshuai.xi {
2344*53ee8cc1Swenshuai.xi MS_U32 u32EngId;
2345*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId;
2346*53ee8cc1Swenshuai.xi MS_U32 u32IntStat;
2347*53ee8cc1Swenshuai.xi //REG_SecFlt* pSecFilter;
2348*53ee8cc1Swenshuai.xi
2349*53ee8cc1Swenshuai.xi u32EngId = (u32SwInt & TSP_SWINT_INFO_ENG_MASK) >> TSP_SWINT_INFO_ENG_SHFT;
2350*53ee8cc1Swenshuai.xi u32IntStat = (u32SwInt & TSP_SWINT_STATUS_CMD_MASK) >> TSP_SWINT_STATUS_CMD_SHFT;
2351*53ee8cc1Swenshuai.xi u32SecFltId = (u32SwInt & TSP_SWINT_INFO_SEC_MASK) >> TSP_SWINT_INFO_SEC_SHFT;
2352*53ee8cc1Swenshuai.xi //pSecFilter = HAL_TSP_SECFLT(u32EngID, u32SecFltId);
2353*53ee8cc1Swenshuai.xi
2354*53ee8cc1Swenshuai.xi #if DMX_DEBUG
2355*53ee8cc1Swenshuai.xi extern DMX_FLT_DBG_INFO stDmxDbgInfo[];
2356*53ee8cc1Swenshuai.xi
2357*53ee8cc1Swenshuai.xi if(u32IntStat == TSP_SWINT_STATUS_SEC_RDY ||
2358*53ee8cc1Swenshuai.xi u32IntStat == TSP_SWINT_STATUS_REQ_RDY )
2359*53ee8cc1Swenshuai.xi {
2360*53ee8cc1Swenshuai.xi stDmxDbgInfo[u32SecFltId].u32Int_rdy ++;
2361*53ee8cc1Swenshuai.xi }
2362*53ee8cc1Swenshuai.xi else if(u32IntStat == TSP_SWINT_STATUS_BUF_OVFLOW)
2363*53ee8cc1Swenshuai.xi {
2364*53ee8cc1Swenshuai.xi stDmxDbgInfo[u32SecFltId].u32Int_ovf ++;
2365*53ee8cc1Swenshuai.xi }
2366*53ee8cc1Swenshuai.xi else if(u32IntStat == TSP_SWINT_STATUS_SEC_CRCERR)
2367*53ee8cc1Swenshuai.xi {
2368*53ee8cc1Swenshuai.xi stDmxDbgInfo[u32SecFltId].u32Int_crc ++;
2369*53ee8cc1Swenshuai.xi }
2370*53ee8cc1Swenshuai.xi #endif
2371*53ee8cc1Swenshuai.xi
2372*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId] == E_DRVTSP_FLT_STATE_FREE)
2373*53ee8cc1Swenshuai.xi goto CLEAR_INT;
2374*53ee8cc1Swenshuai.xi
2375*53ee8cc1Swenshuai.xi if(_TSP_ChkSecNotifyId(u32SecFltId) == FALSE)
2376*53ee8cc1Swenshuai.xi {
2377*53ee8cc1Swenshuai.xi u32SwInt = 0;
2378*53ee8cc1Swenshuai.xi u32IntStat = 0;
2379*53ee8cc1Swenshuai.xi u32HwInt &= ~TSP_HWINT_TSP_SW_INT_STATUS;
2380*53ee8cc1Swenshuai.xi }
2381*53ee8cc1Swenshuai.xi else if(_u32LibMode == DRVTSP_CMD_LIB_MODE_KRN)
2382*53ee8cc1Swenshuai.xi {
2383*53ee8cc1Swenshuai.xi _s32TspEventId = _ptsp_res->_TspState[u32EngId].s32TspEvtId[u32SecFltId];
2384*53ee8cc1Swenshuai.xi }
2385*53ee8cc1Swenshuai.xi
2386*53ee8cc1Swenshuai.xi switch (u32IntStat)
2387*53ee8cc1Swenshuai.xi {
2388*53ee8cc1Swenshuai.xi case TSP_SWINT_CMD_DMA_PAUSE:
2389*53ee8cc1Swenshuai.xi HAL_TSP_TsDma_Pause();
2390*53ee8cc1Swenshuai.xi break;
2391*53ee8cc1Swenshuai.xi
2392*53ee8cc1Swenshuai.xi case TSP_SWINT_CMD_DMA_RESUME:
2393*53ee8cc1Swenshuai.xi HAL_TSP_TsDma_Resume();
2394*53ee8cc1Swenshuai.xi break;
2395*53ee8cc1Swenshuai.xi case TSP_SWINT_STATUS_SEC_RDY:
2396*53ee8cc1Swenshuai.xi case TSP_SWINT_STATUS_REQ_RDY:
2397*53ee8cc1Swenshuai.xi case TSP_SWINT_STATUS_SEC_CRCERR:
2398*53ee8cc1Swenshuai.xi //printf("SEC %d\n", (int)u32SecFltId);
2399*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_MODE_ONESHOT & _ptsp_res->_TspState[u32EngId].SecFltMode[u32SecFltId])
2400*53ee8cc1Swenshuai.xi {
2401*53ee8cc1Swenshuai.xi _TSP_SetFltDisableId(u32SecFltId);
2402*53ee8cc1Swenshuai.xi }
2403*53ee8cc1Swenshuai.xi if ((TSP_SWINT_STATUS_SEC_CRCERR == u32IntStat) && (_ptsp_res->_TspState[u32EngId].SecFltMode[u32SecFltId] & E_DRVTSP_FLT_MODE_CRCCHK))
2404*53ee8cc1Swenshuai.xi {
2405*53ee8cc1Swenshuai.xi //printf("ERR %d\n", (int)u32SecFltId);
2406*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] & E_DRVTSP_EVENT_SEC_CRCERR)
2407*53ee8cc1Swenshuai.xi {
2408*53ee8cc1Swenshuai.xi _TSP_SetSecCrcId(u32SecFltId); // Set section event flag
2409*53ee8cc1Swenshuai.xi }
2410*53ee8cc1Swenshuai.xi else
2411*53ee8cc1Swenshuai.xi {
2412*53ee8cc1Swenshuai.xi break;
2413*53ee8cc1Swenshuai.xi }
2414*53ee8cc1Swenshuai.xi }
2415*53ee8cc1Swenshuai.xi else
2416*53ee8cc1Swenshuai.xi {
2417*53ee8cc1Swenshuai.xi //printf("SEC %d\n", (int)u32SecFltId);
2418*53ee8cc1Swenshuai.xi _TSP_SetSecRdyId(u32SecFltId); // Set section event flag
2419*53ee8cc1Swenshuai.xi }
2420*53ee8cc1Swenshuai.xi
2421*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] & E_DRVTSP_EVENT_CB_MASK) == E_DRVTSP_EVENT_CB_POLL)
2422*53ee8cc1Swenshuai.xi {
2423*53ee8cc1Swenshuai.xi _TSP_SetEvent(_s32TspEventId, TSP_TASK_EVENT_SECTION_POLL); // Trigger task
2424*53ee8cc1Swenshuai.xi }
2425*53ee8cc1Swenshuai.xi else if ((_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] & E_DRVTSP_EVENT_CB_MASK) == E_DRVTSP_EVENT_CB_SELF)
2426*53ee8cc1Swenshuai.xi {
2427*53ee8cc1Swenshuai.xi _TSP_SetEvent(_s32TspEventId, TSP_TASK_EVENT_SECTION_SELF); // Trigger task
2428*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2429*53ee8cc1Swenshuai.xi wake_up_interruptible(&(tsp_wq_head[u32SecFltId]));
2430*53ee8cc1Swenshuai.xi #endif
2431*53ee8cc1Swenshuai.xi }
2432*53ee8cc1Swenshuai.xi break;
2433*53ee8cc1Swenshuai.xi
2434*53ee8cc1Swenshuai.xi case TSP_SWINT_STATUS_BUF_OVFLOW:
2435*53ee8cc1Swenshuai.xi //printf("OVF %d\n", (int)u32SecFltId);
2436*53ee8cc1Swenshuai.xi _TSP_SetFltDisableId(u32SecFltId);
2437*53ee8cc1Swenshuai.xi _TSP_SetSecOvfId(u32SecFltId); // Set section event flag
2438*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] & E_DRVTSP_EVENT_CB_MASK) == E_DRVTSP_EVENT_CB_POLL)
2439*53ee8cc1Swenshuai.xi {
2440*53ee8cc1Swenshuai.xi _TSP_SetEvent(_s32TspEventId, TSP_TASK_EVENT_SECTION_POLL); // Trigger task
2441*53ee8cc1Swenshuai.xi }
2442*53ee8cc1Swenshuai.xi else if ((_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] & E_DRVTSP_EVENT_CB_MASK) == E_DRVTSP_EVENT_CB_SELF)
2443*53ee8cc1Swenshuai.xi {
2444*53ee8cc1Swenshuai.xi _TSP_SetEvent(_s32TspEventId, TSP_TASK_EVENT_SECTION_SELF); // Trigger task
2445*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2446*53ee8cc1Swenshuai.xi wake_up_interruptible(&(tsp_wq_head[u32SecFltId]));
2447*53ee8cc1Swenshuai.xi #endif
2448*53ee8cc1Swenshuai.xi
2449*53ee8cc1Swenshuai.xi }
2450*53ee8cc1Swenshuai.xi break;
2451*53ee8cc1Swenshuai.xi
2452*53ee8cc1Swenshuai.xi case TSP_SWINT_STATUS_PKT_OVRUN:
2453*53ee8cc1Swenshuai.xi // Enable debug message when PCR filter can be handle by hardware.
2454*53ee8cc1Swenshuai.xi // TSP_DBG("Packet Overrun %d\n", u32EngId);
2455*53ee8cc1Swenshuai.xi break;
2456*53ee8cc1Swenshuai.xi
2457*53ee8cc1Swenshuai.xi case TSP_SWINT_STATUS_SEC_ERROR:
2458*53ee8cc1Swenshuai.xi // [ISR print]
2459*53ee8cc1Swenshuai.xi // TSP_DBG("SEC error %d-0x%02X\n", u32EngId, u32SecFltId);
2460*53ee8cc1Swenshuai.xi break;
2461*53ee8cc1Swenshuai.xi
2462*53ee8cc1Swenshuai.xi case TSP_SWINT_STATUS_DEBUG:
2463*53ee8cc1Swenshuai.xi // [ISR print]
2464*53ee8cc1Swenshuai.xi // TSP_DBG("DEBUG %d-0x%02X\n", u32EngId, u32SecFltId);
2465*53ee8cc1Swenshuai.xi if(_FwDbgInfo.bEnable)
2466*53ee8cc1Swenshuai.xi {
2467*53ee8cc1Swenshuai.xi _TSP_SetEvent(_s32TspEventId, TSP_TASK_EVENT_FWMSG);
2468*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2469*53ee8cc1Swenshuai.xi wake_up_interruptible(&(tsp_wq_head[u32SecFltId]));
2470*53ee8cc1Swenshuai.xi #endif
2471*53ee8cc1Swenshuai.xi
2472*53ee8cc1Swenshuai.xi }
2473*53ee8cc1Swenshuai.xi break;
2474*53ee8cc1Swenshuai.xi
2475*53ee8cc1Swenshuai.xi default:
2476*53ee8cc1Swenshuai.xi // [ISR print]
2477*53ee8cc1Swenshuai.xi // DBG_TSP(TSP_DBG("Unknown TSP interrupt %d\n", u32EngId));
2478*53ee8cc1Swenshuai.xi break;
2479*53ee8cc1Swenshuai.xi }
2480*53ee8cc1Swenshuai.xi }
2481*53ee8cc1Swenshuai.xi
2482*53ee8cc1Swenshuai.xi CLEAR_INT:
2483*53ee8cc1Swenshuai.xi
2484*53ee8cc1Swenshuai.xi _TSP_INT_LOCK();
2485*53ee8cc1Swenshuai.xi //If it still has interrupt status, it should be processed by another process again, do not clear interrupt status
2486*53ee8cc1Swenshuai.xi if(u32SwInt)
2487*53ee8cc1Swenshuai.xi {
2488*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearSw();
2489*53ee8cc1Swenshuai.xi }
2490*53ee8cc1Swenshuai.xi if(u32HwInt)
2491*53ee8cc1Swenshuai.xi {
2492*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearHw(u32HwInt);
2493*53ee8cc1Swenshuai.xi }
2494*53ee8cc1Swenshuai.xi if(u32HwInt2)
2495*53ee8cc1Swenshuai.xi {
2496*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearHw2(u32HwInt2);
2497*53ee8cc1Swenshuai.xi }
2498*53ee8cc1Swenshuai.xi _TSP_INT_UNLOCK();
2499*53ee8cc1Swenshuai.xi
2500*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
2501*53ee8cc1Swenshuai.xi //return IRQ_HANDLED;
2502*53ee8cc1Swenshuai.xi #endif
2503*53ee8cc1Swenshuai.xi
2504*53ee8cc1Swenshuai.xi OSAL_TSP_IntEnable();
2505*53ee8cc1Swenshuai.xi }
2506*53ee8cc1Swenshuai.xi
MDrv_TSP_SecFlt_Update(MS_U32 u32EngId,MS_U32 u32SecFltId)2507*53ee8cc1Swenshuai.xi void MDrv_TSP_SecFlt_Update(MS_U32 u32EngId, MS_U32 u32SecFltId)
2508*53ee8cc1Swenshuai.xi {
2509*53ee8cc1Swenshuai.xi _TSP_SetSecRdyId(u32SecFltId);
2510*53ee8cc1Swenshuai.xi }
2511*53ee8cc1Swenshuai.xi
_TSP_Isr_Proc_SecRdyCrc(MS_U32 u32EngId,MS_U32 u32FltId,MS_U32 u32CbOpt,MS_U32 * pu32Evt)2512*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_Isr_Proc_SecRdyCrc(MS_U32 u32EngId, MS_U32 u32FltId, MS_U32 u32CbOpt, MS_U32* pu32Evt)
2513*53ee8cc1Swenshuai.xi {
2514*53ee8cc1Swenshuai.xi MS_BOOL bData = 0;
2515*53ee8cc1Swenshuai.xi MS_U32 u32Event;
2516*53ee8cc1Swenshuai.xi MS_U32 u32Events;
2517*53ee8cc1Swenshuai.xi MS_U32 u32EvtNotify;
2518*53ee8cc1Swenshuai.xi static DrvTSP_Msg msg;
2519*53ee8cc1Swenshuai.xi MS_PHY phyRead;
2520*53ee8cc1Swenshuai.xi MS_U32 u32PIDFlt;
2521*53ee8cc1Swenshuai.xi P_DrvTSP_EvtCallback pfEvtCallback = NULL;
2522*53ee8cc1Swenshuai.xi
2523*53ee8cc1Swenshuai.xi *pu32Evt = (MS_U32)E_DRVTSP_EVENT_DATA_INIT;
2524*53ee8cc1Swenshuai.xi
2525*53ee8cc1Swenshuai.xi if (E_DRVTSP_EVENT_CB_POLL == u32CbOpt)
2526*53ee8cc1Swenshuai.xi {
2527*53ee8cc1Swenshuai.xi _TSP_GetEvent(_s32TspEventId, u32Events, TSP_TASK_EVENT_SECTION_POLL, OSAL_EVENT_OR_CLEAR, 0);
2528*53ee8cc1Swenshuai.xi }
2529*53ee8cc1Swenshuai.xi
2530*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
2531*53ee8cc1Swenshuai.xi
2532*53ee8cc1Swenshuai.xi //using section filter ID to find the mapping pid filter id
2533*53ee8cc1Swenshuai.xi for(u32PIDFlt = 0; u32PIDFlt < TSP_SECFLT_NUM; u32PIDFlt++)
2534*53ee8cc1Swenshuai.xi {
2535*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltMap[u32PIDFlt] == u32FltId)
2536*53ee8cc1Swenshuai.xi break;
2537*53ee8cc1Swenshuai.xi }
2538*53ee8cc1Swenshuai.xi
2539*53ee8cc1Swenshuai.xi if(u32PIDFlt >= TSP_SECFLT_NUM)
2540*53ee8cc1Swenshuai.xi {
2541*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
2542*53ee8cc1Swenshuai.xi return FALSE;
2543*53ee8cc1Swenshuai.xi }
2544*53ee8cc1Swenshuai.xi
2545*53ee8cc1Swenshuai.xi if ((E_DRVTSP_FLT_MODE_ONESHOT & _ptsp_res->_TspState[u32EngId].SecFltMode[u32FltId]) == 0)
2546*53ee8cc1Swenshuai.xi {
2547*53ee8cc1Swenshuai.xi if (!(_ptsp_res->_TspState[u32EngId].FltState[u32PIDFlt] & E_DRVTSP_FLT_STATE_ENABLE))
2548*53ee8cc1Swenshuai.xi {
2549*53ee8cc1Swenshuai.xi // TSP_DBG("[%s][%d] %d 0x%08x\n", __FUNCTION__, __LINE__,
2550*53ee8cc1Swenshuai.xi //(int)u32FltId, (int)_ptsp_res->_TspState[u32EngId].FltState[u32FltId]);
2551*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
2552*53ee8cc1Swenshuai.xi return FALSE;
2553*53ee8cc1Swenshuai.xi }
2554*53ee8cc1Swenshuai.xi }
2555*53ee8cc1Swenshuai.xi
2556*53ee8cc1Swenshuai.xi if (_TSP_GetFltDisableId(u32FltId, &u32Event, OSAL_EVENT_OR_CLEAR))
2557*53ee8cc1Swenshuai.xi {
2558*53ee8cc1Swenshuai.xi //No need to disable filter here or Overflow callback will miss.
2559*53ee8cc1Swenshuai.xi _TSP_PidFlt_Disable(u32EngId, u32PIDFlt); // critical section
2560*53ee8cc1Swenshuai.xi //_TSP_GetSecRdyId(u32FltId, &u32Event, OSAL_EVENT_OR_CLEAR);
2561*53ee8cc1Swenshuai.xi //_TSP_GetSecOvfId(u32FltId, &u32Event, OSAL_EVENT_OR_CLEAR);
2562*53ee8cc1Swenshuai.xi }
2563*53ee8cc1Swenshuai.xi
2564*53ee8cc1Swenshuai.xi phyRead = HAL_TSP_SecBuf_GetBufRead(u32EngId, u32FltId);
2565*53ee8cc1Swenshuai.xi bData = (phyRead != HAL_TSP_SecBuf_GetBufWrite(u32EngId, u32FltId))? TRUE: FALSE; // critical section
2566*53ee8cc1Swenshuai.xi
2567*53ee8cc1Swenshuai.xi if (bData)
2568*53ee8cc1Swenshuai.xi {
2569*53ee8cc1Swenshuai.xi if (E_DRVTSP_EVENT_CB_POLL == u32CbOpt)
2570*53ee8cc1Swenshuai.xi {
2571*53ee8cc1Swenshuai.xi *pu32Evt = (MS_U32)E_DRVTSP_EVENT_DATA_READY;
2572*53ee8cc1Swenshuai.xi }
2573*53ee8cc1Swenshuai.xi else
2574*53ee8cc1Swenshuai.xi {
2575*53ee8cc1Swenshuai.xi u32EvtNotify = _ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32FltId];
2576*53ee8cc1Swenshuai.xi pfEvtCallback = _ptsp_res->_TspState[u32EngId].SecFltCallback[u32FltId];
2577*53ee8cc1Swenshuai.xi if ((u32EvtNotify & E_DRVTSP_EVENT_DATA_READY) && pfEvtCallback)
2578*53ee8cc1Swenshuai.xi {
2579*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltState[u32PIDFlt] & E_DRVTSP_FLT_STATE_FREEING)
2580*53ee8cc1Swenshuai.xi {
2581*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s][%d]Warning!! Filter %u is closing %x\n", __FUNCTION__, __LINE__, (unsigned int)u32PIDFlt, (unsigned int)stDrvState);
2582*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
2583*53ee8cc1Swenshuai.xi MsOS_DelayTask(1);
2584*53ee8cc1Swenshuai.xi return FALSE;
2585*53ee8cc1Swenshuai.xi }
2586*53ee8cc1Swenshuai.xi else
2587*53ee8cc1Swenshuai.xi {
2588*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PIDFlt] |= E_DRVTSP_FLT_STATE_CBRUN;
2589*53ee8cc1Swenshuai.xi }
2590*53ee8cc1Swenshuai.xi
2591*53ee8cc1Swenshuai.xi msg.FltInfo = (u32EngId <<MSG_FLTINFO_ENG_ID_SHFT) | (u32FltId <<MSG_FLTINFO_SEC_ID_SHFT);
2592*53ee8cc1Swenshuai.xi _u32TaskLine = __LINE__;
2593*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
2594*53ee8cc1Swenshuai.xi pfEvtCallback(E_DRVTSP_EVENT_DATA_READY, &msg);
2595*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
2596*53ee8cc1Swenshuai.xi _u32TaskLine = __LINE__;
2597*53ee8cc1Swenshuai.xi
2598*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PIDFlt] &= ~E_DRVTSP_FLT_STATE_CBRUN;
2599*53ee8cc1Swenshuai.xi if (phyRead == HAL_TSP_SecBuf_GetBufRead(u32EngId, u32FltId))
2600*53ee8cc1Swenshuai.xi {
2601*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId(u32FltId, &u32Event, OSAL_EVENT_OR_CLEAR);
2602*53ee8cc1Swenshuai.xi }
2603*53ee8cc1Swenshuai.xi }
2604*53ee8cc1Swenshuai.xi }
2605*53ee8cc1Swenshuai.xi }
2606*53ee8cc1Swenshuai.xi /*else
2607*53ee8cc1Swenshuai.xi {
2608*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId(u32FltId, &u32Event, OSAL_EVENT_OR_CLEAR);
2609*53ee8cc1Swenshuai.xi }*/
2610*53ee8cc1Swenshuai.xi
2611*53ee8cc1Swenshuai.xi //Clear evets
2612*53ee8cc1Swenshuai.xi if (E_DRVTSP_EVENT_CB_POLL == u32CbOpt)
2613*53ee8cc1Swenshuai.xi {
2614*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId(u32FltId, &u32Event, OSAL_EVENT_OR_CLEAR);
2615*53ee8cc1Swenshuai.xi }
2616*53ee8cc1Swenshuai.xi
2617*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
2618*53ee8cc1Swenshuai.xi
2619*53ee8cc1Swenshuai.xi if (bData)
2620*53ee8cc1Swenshuai.xi {
2621*53ee8cc1Swenshuai.xi return TRUE;
2622*53ee8cc1Swenshuai.xi }
2623*53ee8cc1Swenshuai.xi
2624*53ee8cc1Swenshuai.xi //jump_bad_state:
2625*53ee8cc1Swenshuai.xi return FALSE;
2626*53ee8cc1Swenshuai.xi }
2627*53ee8cc1Swenshuai.xi
_TSP_Isr_Proc_SecCrcErr(MS_U32 u32EngId,MS_U32 u32FltId,MS_U32 u32CbOpt,MS_U32 * pu32Evt)2628*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_Isr_Proc_SecCrcErr(MS_U32 u32EngId, MS_U32 u32FltId, MS_U32 u32CbOpt, MS_U32* pu32Evt)
2629*53ee8cc1Swenshuai.xi {
2630*53ee8cc1Swenshuai.xi MS_U32 u32Events;
2631*53ee8cc1Swenshuai.xi MS_U32 u32EvtNotify;
2632*53ee8cc1Swenshuai.xi P_DrvTSP_EvtCallback pfEvtCallback = NULL;
2633*53ee8cc1Swenshuai.xi static DrvTSP_Msg msg;
2634*53ee8cc1Swenshuai.xi MS_U32 u32PIDFlt;
2635*53ee8cc1Swenshuai.xi
2636*53ee8cc1Swenshuai.xi *pu32Evt = (MS_U32)E_DRVTSP_EVENT_DATA_INIT;
2637*53ee8cc1Swenshuai.xi
2638*53ee8cc1Swenshuai.xi if (E_DRVTSP_EVENT_CB_POLL == u32CbOpt)
2639*53ee8cc1Swenshuai.xi {
2640*53ee8cc1Swenshuai.xi _TSP_GetEvent(_s32TspEventId, u32Events, TSP_TASK_EVENT_SECTION_POLL, OSAL_EVENT_OR_CLEAR, 0);
2641*53ee8cc1Swenshuai.xi }
2642*53ee8cc1Swenshuai.xi
2643*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
2644*53ee8cc1Swenshuai.xi
2645*53ee8cc1Swenshuai.xi //using section filter ID to find the mapping pid filter id
2646*53ee8cc1Swenshuai.xi for(u32PIDFlt = 0; u32PIDFlt < TSP_SECFLT_NUM; u32PIDFlt++)
2647*53ee8cc1Swenshuai.xi {
2648*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltMap[u32PIDFlt] == u32FltId)
2649*53ee8cc1Swenshuai.xi break;
2650*53ee8cc1Swenshuai.xi }
2651*53ee8cc1Swenshuai.xi if(u32PIDFlt == TSP_SECFLT_NUM)
2652*53ee8cc1Swenshuai.xi {
2653*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
2654*53ee8cc1Swenshuai.xi return FALSE;
2655*53ee8cc1Swenshuai.xi }
2656*53ee8cc1Swenshuai.xi
2657*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32FltId] & E_DRVTSP_EVENT_SEC_CRCERR) == 0)
2658*53ee8cc1Swenshuai.xi {
2659*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
2660*53ee8cc1Swenshuai.xi return FALSE;
2661*53ee8cc1Swenshuai.xi }
2662*53ee8cc1Swenshuai.xi
2663*53ee8cc1Swenshuai.xi if (E_DRVTSP_EVENT_CB_POLL == u32CbOpt)
2664*53ee8cc1Swenshuai.xi {
2665*53ee8cc1Swenshuai.xi *pu32Evt = (MS_U32)E_DRVTSP_EVENT_SEC_CRCERR;
2666*53ee8cc1Swenshuai.xi }
2667*53ee8cc1Swenshuai.xi else
2668*53ee8cc1Swenshuai.xi {
2669*53ee8cc1Swenshuai.xi u32EvtNotify = _ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32FltId];
2670*53ee8cc1Swenshuai.xi pfEvtCallback = _ptsp_res->_TspState[u32EngId].SecFltCallback[u32FltId];
2671*53ee8cc1Swenshuai.xi if ((u32EvtNotify & E_DRVTSP_EVENT_SEC_CRCERR) && pfEvtCallback)
2672*53ee8cc1Swenshuai.xi {
2673*53ee8cc1Swenshuai.xi msg.FltInfo = (u32EngId <<MSG_FLTINFO_ENG_ID_SHFT) | (u32FltId <<MSG_FLTINFO_SEC_ID_SHFT);
2674*53ee8cc1Swenshuai.xi //_TSP_SECFLT_UNLOCK(u32EngId, u32SecFltId);
2675*53ee8cc1Swenshuai.xi _u32TaskLine = __LINE__;
2676*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
2677*53ee8cc1Swenshuai.xi pfEvtCallback(E_DRVTSP_EVENT_SEC_CRCERR, &msg);
2678*53ee8cc1Swenshuai.xi _u32TaskLine = __LINE__;
2679*53ee8cc1Swenshuai.xi return TRUE;
2680*53ee8cc1Swenshuai.xi }
2681*53ee8cc1Swenshuai.xi }
2682*53ee8cc1Swenshuai.xi
2683*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
2684*53ee8cc1Swenshuai.xi
2685*53ee8cc1Swenshuai.xi return TRUE;
2686*53ee8cc1Swenshuai.xi }
2687*53ee8cc1Swenshuai.xi
_TSP_Isr_Proc_Pvr(MS_U32 u32CbOpt)2688*53ee8cc1Swenshuai.xi static void _TSP_Isr_Proc_Pvr(MS_U32 u32CbOpt)
2689*53ee8cc1Swenshuai.xi {
2690*53ee8cc1Swenshuai.xi MS_U32 u32Events;
2691*53ee8cc1Swenshuai.xi static DrvTSP_Msg msg;
2692*53ee8cc1Swenshuai.xi MS_U8 u8ii;
2693*53ee8cc1Swenshuai.xi
2694*53ee8cc1Swenshuai.xi for(u8ii = 0; u8ii < TSP_PVR_IF_NUM; u8ii++)
2695*53ee8cc1Swenshuai.xi {
2696*53ee8cc1Swenshuai.xi if ((_ptsp_res->_PvrEvtNotify[u8ii] & E_DRVTSP_EVENT_CB_MASK) == u32CbOpt)
2697*53ee8cc1Swenshuai.xi {
2698*53ee8cc1Swenshuai.xi break;
2699*53ee8cc1Swenshuai.xi }
2700*53ee8cc1Swenshuai.xi }
2701*53ee8cc1Swenshuai.xi
2702*53ee8cc1Swenshuai.xi if(u8ii == TSP_PVR_IF_NUM)
2703*53ee8cc1Swenshuai.xi {
2704*53ee8cc1Swenshuai.xi return;
2705*53ee8cc1Swenshuai.xi }
2706*53ee8cc1Swenshuai.xi
2707*53ee8cc1Swenshuai.xi if (u32CbOpt == E_DRVTSP_EVENT_CB_POLL)
2708*53ee8cc1Swenshuai.xi {
2709*53ee8cc1Swenshuai.xi _TSP_GetEvent(_s32TspEventId, u32Events, TSP_TASK_EVENT_PVR0_RDY_POLL | TSP_TASK_EVENT_PVR1_RDY_POLL|
2710*53ee8cc1Swenshuai.xi TSP_TASK_EVENT_CBPVR0_RDY_POLL |
2711*53ee8cc1Swenshuai.xi TSP_TASK_EVENT_PVR2PVR0_RDY_POLL | TSP_TASK_EVENT_PVR2PVR1_RDY_POLL,
2712*53ee8cc1Swenshuai.xi OSAL_EVENT_OR_CLEAR, 0);
2713*53ee8cc1Swenshuai.xi }
2714*53ee8cc1Swenshuai.xi else
2715*53ee8cc1Swenshuai.xi {
2716*53ee8cc1Swenshuai.xi _TSP_GetEvent(_s32TspEventId, u32Events, TSP_TASK_EVENT_PVR_SELF |
2717*53ee8cc1Swenshuai.xi TSP_TASK_EVENT_CBPVR0_RDY_SELF |
2718*53ee8cc1Swenshuai.xi TSP_TASK_EVENT_PVR2PVR0_RDY_SELF | TSP_TASK_EVENT_PVR2PVR1_RDY_SELF
2719*53ee8cc1Swenshuai.xi , OSAL_EVENT_OR_CLEAR, 0);
2720*53ee8cc1Swenshuai.xi }
2721*53ee8cc1Swenshuai.xi
2722*53ee8cc1Swenshuai.xi if(_ptsp_res->_PvrEvtNotify[0] && _ptsp_res->_PvrCallback[0])
2723*53ee8cc1Swenshuai.xi {
2724*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))
2725*53ee8cc1Swenshuai.xi {
2726*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR0_RDY_SELF:
2727*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR0_RDY_POLL:
2728*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[0], E_DRVTSP_EVENT_PVRBUF_FULL))
2729*53ee8cc1Swenshuai.xi {
2730*53ee8cc1Swenshuai.xi msg.PvrBufId = (0x0 << MSG_PVRBUF_ID_SHFT) | (0 << MSG_PVR_ID_SHFT);
2731*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[0](E_DRVTSP_EVENT_PVRBUF_FULL, &msg);
2732*53ee8cc1Swenshuai.xi }
2733*53ee8cc1Swenshuai.xi break;
2734*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR1_RDY_SELF:
2735*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR1_RDY_POLL:
2736*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[0], E_DRVTSP_EVENT_PVRBUF_FULL))
2737*53ee8cc1Swenshuai.xi {
2738*53ee8cc1Swenshuai.xi msg.PvrBufId = (0x1 << MSG_PVRBUF_ID_SHFT) | (0 << MSG_PVR_ID_SHFT);
2739*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[0](E_DRVTSP_EVENT_PVRBUF_FULL, &msg);
2740*53ee8cc1Swenshuai.xi }
2741*53ee8cc1Swenshuai.xi break;
2742*53ee8cc1Swenshuai.xi case (TSP_TASK_EVENT_PVR0_RDY_SELF | TSP_TASK_EVENT_PVR1_RDY_SELF):
2743*53ee8cc1Swenshuai.xi case (TSP_TASK_EVENT_PVR0_RDY_POLL | TSP_TASK_EVENT_PVR1_RDY_POLL):
2744*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[0], E_DRVTSP_EVENT_PVRBUF_OVERFLOW))
2745*53ee8cc1Swenshuai.xi {
2746*53ee8cc1Swenshuai.xi msg.PvrBufId = (MSG_PVRBUF_ID_NULL << MSG_PVRBUF_ID_SHFT) | (0 << MSG_PVR_ID_SHFT);
2747*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[0](E_DRVTSP_EVENT_PVRBUF_OVERFLOW, &msg);
2748*53ee8cc1Swenshuai.xi }
2749*53ee8cc1Swenshuai.xi break;
2750*53ee8cc1Swenshuai.xi default:
2751*53ee8cc1Swenshuai.xi break;
2752*53ee8cc1Swenshuai.xi }
2753*53ee8cc1Swenshuai.xi }
2754*53ee8cc1Swenshuai.xi
2755*53ee8cc1Swenshuai.xi #if (TSP_PVR_IF_NUM > 1)
2756*53ee8cc1Swenshuai.xi if(_ptsp_res->_PvrEvtNotify[1] && _ptsp_res->_PvrCallback[1])
2757*53ee8cc1Swenshuai.xi {
2758*53ee8cc1Swenshuai.xi switch (u32Events & (TSP_TASK_EVENT_PVR2PVR0_RDY_POLL | TSP_TASK_EVENT_PVR2PVR1_RDY_POLL | TSP_TASK_EVENT_PVR2PVR0_RDY_SELF | TSP_TASK_EVENT_PVR2PVR1_RDY_SELF))
2759*53ee8cc1Swenshuai.xi {
2760*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR2PVR0_RDY_SELF:
2761*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR2PVR0_RDY_POLL:
2762*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[1], E_DRVTSP_EVENT_PVRBUF_FULL))
2763*53ee8cc1Swenshuai.xi {
2764*53ee8cc1Swenshuai.xi msg.PvrBufId = (0x0 << MSG_PVRBUF_ID_SHFT) | (1 << MSG_PVR_ID_SHFT);
2765*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[1](E_DRVTSP_EVENT_PVRBUF_FULL, &msg);
2766*53ee8cc1Swenshuai.xi }
2767*53ee8cc1Swenshuai.xi break;
2768*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR2PVR1_RDY_SELF:
2769*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR2PVR1_RDY_POLL:
2770*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[1], E_DRVTSP_EVENT_PVRBUF_FULL))
2771*53ee8cc1Swenshuai.xi {
2772*53ee8cc1Swenshuai.xi msg.PvrBufId = (0x1 << MSG_PVRBUF_ID_SHFT) | (1 << MSG_PVR_ID_SHFT);
2773*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[1](E_DRVTSP_EVENT_PVRBUF_FULL, &msg);
2774*53ee8cc1Swenshuai.xi }
2775*53ee8cc1Swenshuai.xi break;
2776*53ee8cc1Swenshuai.xi case (TSP_TASK_EVENT_PVR2PVR0_RDY_SELF | TSP_TASK_EVENT_PVR2PVR1_RDY_SELF):
2777*53ee8cc1Swenshuai.xi case (TSP_TASK_EVENT_PVR2PVR0_RDY_POLL | TSP_TASK_EVENT_PVR2PVR1_RDY_POLL):
2778*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[1], E_DRVTSP_EVENT_PVRBUF_OVERFLOW))
2779*53ee8cc1Swenshuai.xi {
2780*53ee8cc1Swenshuai.xi msg.PvrBufId = (MSG_PVRBUF_ID_NULL << MSG_PVRBUF_ID_SHFT) | (1 << MSG_PVR_ID_SHFT);
2781*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[1](E_DRVTSP_EVENT_PVRBUF_OVERFLOW, &msg);
2782*53ee8cc1Swenshuai.xi }
2783*53ee8cc1Swenshuai.xi break;
2784*53ee8cc1Swenshuai.xi default:
2785*53ee8cc1Swenshuai.xi break;
2786*53ee8cc1Swenshuai.xi }
2787*53ee8cc1Swenshuai.xi }
2788*53ee8cc1Swenshuai.xi #endif
2789*53ee8cc1Swenshuai.xi
2790*53ee8cc1Swenshuai.xi #ifdef TS3_IF_SUPPORT
2791*53ee8cc1Swenshuai.xi if(_ptsp_res->_PvrEvtNotify[2] && _ptsp_res->_PvrCallback[2])
2792*53ee8cc1Swenshuai.xi {
2793*53ee8cc1Swenshuai.xi switch (u32Events & (TSP_TASK_EVENT_CBPVR0_RDY_SELF | TSP_TASK_EVENT_CBPVR0_RDY_POLL))
2794*53ee8cc1Swenshuai.xi {
2795*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_CBPVR0_RDY_SELF:
2796*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_CBPVR0_RDY_POLL:
2797*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[2], E_DRVTSP_EVENT_PVRBUF_FULL))
2798*53ee8cc1Swenshuai.xi {
2799*53ee8cc1Swenshuai.xi msg.PvrBufId = (0x0 << MSG_PVRBUF_ID_SHFT) | (2 << MSG_PVR_ID_SHFT);
2800*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[2](E_DRVTSP_EVENT_PVRBUF_FULL, &msg);
2801*53ee8cc1Swenshuai.xi }
2802*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[2], E_DRVTSP_EVENT_PVRBUF_OVERFLOW))
2803*53ee8cc1Swenshuai.xi {
2804*53ee8cc1Swenshuai.xi msg.PvrBufId = (MSG_PVRBUF_ID_NULL << MSG_PVRBUF_ID_SHFT) | (2 << MSG_PVR_ID_SHFT);
2805*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[2](E_DRVTSP_EVENT_PVRBUF_OVERFLOW, &msg);
2806*53ee8cc1Swenshuai.xi }
2807*53ee8cc1Swenshuai.xi break;
2808*53ee8cc1Swenshuai.xi default:
2809*53ee8cc1Swenshuai.xi break;
2810*53ee8cc1Swenshuai.xi }
2811*53ee8cc1Swenshuai.xi }
2812*53ee8cc1Swenshuai.xi #endif
2813*53ee8cc1Swenshuai.xi }
2814*53ee8cc1Swenshuai.xi
_TSP_Isr_Proc_SecOvf(MS_U32 u32EngId,MS_U32 u32SecFltId,MS_U32 u32CbOpt,MS_U32 * pu32Evt)2815*53ee8cc1Swenshuai.xi static MS_BOOL _TSP_Isr_Proc_SecOvf(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_U32 u32CbOpt, MS_U32* pu32Evt)
2816*53ee8cc1Swenshuai.xi {
2817*53ee8cc1Swenshuai.xi static DrvTSP_Msg msg;
2818*53ee8cc1Swenshuai.xi MS_U32 u32PidFltId;
2819*53ee8cc1Swenshuai.xi MS_U32 u32EvtNotify, u32Events = 0;
2820*53ee8cc1Swenshuai.xi P_DrvTSP_EvtCallback pfEvtCallback = NULL;
2821*53ee8cc1Swenshuai.xi
2822*53ee8cc1Swenshuai.xi *pu32Evt = (MS_U32)E_DRVTSP_EVENT_DATA_INIT;
2823*53ee8cc1Swenshuai.xi
2824*53ee8cc1Swenshuai.xi // disable overflow filter
2825*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
2826*53ee8cc1Swenshuai.xi
2827*53ee8cc1Swenshuai.xi for (u32PidFltId = 0; u32PidFltId < TSP_SECFLT_NUM; u32PidFltId++)
2828*53ee8cc1Swenshuai.xi {
2829*53ee8cc1Swenshuai.xi if (u32SecFltId == _ptsp_res->_TspState[u32EngId].FltMap[u32PidFltId])
2830*53ee8cc1Swenshuai.xi {
2831*53ee8cc1Swenshuai.xi break;
2832*53ee8cc1Swenshuai.xi }
2833*53ee8cc1Swenshuai.xi }
2834*53ee8cc1Swenshuai.xi
2835*53ee8cc1Swenshuai.xi if(u32PidFltId >= TSP_SECFLT_NUM)
2836*53ee8cc1Swenshuai.xi {
2837*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
2838*53ee8cc1Swenshuai.xi return FALSE;
2839*53ee8cc1Swenshuai.xi }
2840*53ee8cc1Swenshuai.xi
2841*53ee8cc1Swenshuai.xi if (_TSP_GetFltDisableId(u32SecFltId, &u32Events, OSAL_EVENT_OR_CLEAR))
2842*53ee8cc1Swenshuai.xi {
2843*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] & E_DRVTSP_FLT_STATE_ENABLE)
2844*53ee8cc1Swenshuai.xi {
2845*53ee8cc1Swenshuai.xi _TSP_PidFlt_Disable(u32EngId, u32PidFltId); // critical section
2846*53ee8cc1Swenshuai.xi }
2847*53ee8cc1Swenshuai.xi }
2848*53ee8cc1Swenshuai.xi
2849*53ee8cc1Swenshuai.xi if (E_DRVTSP_EVENT_CB_POLL == u32CbOpt)
2850*53ee8cc1Swenshuai.xi {
2851*53ee8cc1Swenshuai.xi *pu32Evt = (MS_U32)E_DRVTSP_EVENT_BUF_OVERFLOW;
2852*53ee8cc1Swenshuai.xi
2853*53ee8cc1Swenshuai.xi //---- if overflow, clear evets to wait restarting ------------
2854*53ee8cc1Swenshuai.xi _TSP_GetSecOvfId (u32SecFltId, &u32Events, OSAL_EVENT_OR_CLEAR);
2855*53ee8cc1Swenshuai.xi _TSP_GetSecCrcId (u32SecFltId, &u32Events, OSAL_EVENT_OR_CLEAR);
2856*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId (u32SecFltId, &u32Events, OSAL_EVENT_OR_CLEAR);
2857*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------
2858*53ee8cc1Swenshuai.xi }
2859*53ee8cc1Swenshuai.xi else
2860*53ee8cc1Swenshuai.xi {
2861*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] == E_DRVTSP_FLT_STATE_FREE)
2862*53ee8cc1Swenshuai.xi {
2863*53ee8cc1Swenshuai.xi goto PROC_END;
2864*53ee8cc1Swenshuai.xi }
2865*53ee8cc1Swenshuai.xi
2866*53ee8cc1Swenshuai.xi u32EvtNotify = _ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId];
2867*53ee8cc1Swenshuai.xi pfEvtCallback = _ptsp_res->_TspState[u32EngId].SecFltCallback[u32SecFltId];
2868*53ee8cc1Swenshuai.xi if ((u32EvtNotify & E_DRVTSP_EVENT_BUF_OVERFLOW) && pfEvtCallback)
2869*53ee8cc1Swenshuai.xi {
2870*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] & E_DRVTSP_FLT_STATE_FREEING)
2871*53ee8cc1Swenshuai.xi {
2872*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s][%d]Warning!! Filter %u is closing %x\n", __FUNCTION__, __LINE__, (unsigned int)u32PidFltId, (unsigned int)stDrvState);
2873*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
2874*53ee8cc1Swenshuai.xi MsOS_DelayTask(1);
2875*53ee8cc1Swenshuai.xi return TRUE;
2876*53ee8cc1Swenshuai.xi }
2877*53ee8cc1Swenshuai.xi else
2878*53ee8cc1Swenshuai.xi {
2879*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] |= E_DRVTSP_FLT_STATE_CBRUN;
2880*53ee8cc1Swenshuai.xi }
2881*53ee8cc1Swenshuai.xi
2882*53ee8cc1Swenshuai.xi msg.FltInfo = (u32EngId <<MSG_FLTINFO_ENG_ID_SHFT) | (u32SecFltId <<MSG_FLTINFO_SEC_ID_SHFT);
2883*53ee8cc1Swenshuai.xi _u32TaskLine = __LINE__;
2884*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
2885*53ee8cc1Swenshuai.xi pfEvtCallback(E_DRVTSP_EVENT_BUF_OVERFLOW, &msg);
2886*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
2887*53ee8cc1Swenshuai.xi _u32TaskLine = __LINE__;
2888*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] &= ~E_DRVTSP_FLT_STATE_CBRUN;
2889*53ee8cc1Swenshuai.xi
2890*53ee8cc1Swenshuai.xi }
2891*53ee8cc1Swenshuai.xi }
2892*53ee8cc1Swenshuai.xi
2893*53ee8cc1Swenshuai.xi PROC_END:
2894*53ee8cc1Swenshuai.xi
2895*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
2896*53ee8cc1Swenshuai.xi
2897*53ee8cc1Swenshuai.xi return TRUE;
2898*53ee8cc1Swenshuai.xi }
2899*53ee8cc1Swenshuai.xi
_TSP_Isr_ProcSelf(OSAL_TSP_ProcTypeParam * pData)2900*53ee8cc1Swenshuai.xi static void _TSP_Isr_ProcSelf(OSAL_TSP_ProcTypeParam* pData)
2901*53ee8cc1Swenshuai.xi {
2902*53ee8cc1Swenshuai.xi TSP_Result* pRet = (TSP_Result*)pData->pRet;
2903*53ee8cc1Swenshuai.xi MS_U32 u32Events = 0, u32SecRdy = 0, u32SecOvf = 0, u32SecCrc = 0;//, u32SecFree = 0;
2904*53ee8cc1Swenshuai.xi MS_U32 i = 0, j = 0;
2905*53ee8cc1Swenshuai.xi MS_U32 u32Evt = 0;
2906*53ee8cc1Swenshuai.xi //MS_U32 u32PidFltId;
2907*53ee8cc1Swenshuai.xi MS_U32 u32GroupNum = (TSP_SECFLT_NUM+31)>>5;
2908*53ee8cc1Swenshuai.xi //MS_U32 u32Mask;
2909*53ee8cc1Swenshuai.xi //MS_U32 u32AskFreeFltList;
2910*53ee8cc1Swenshuai.xi
2911*53ee8cc1Swenshuai.xi #if 0
2912*53ee8cc1Swenshuai.xi MS_U32 u32TempEvent = 0;
2913*53ee8cc1Swenshuai.xi
2914*53ee8cc1Swenshuai.xi _TSP_GetEvent(u32TempEvent, TSP_TASK_EVENT_FWMSG, OSAL_EVENT_OR_CLEAR, 0);
2915*53ee8cc1Swenshuai.xi if(u32TempEvent & (TSP_TASK_EVENT_FWMSG))
2916*53ee8cc1Swenshuai.xi {
2917*53ee8cc1Swenshuai.xi _DumpFwMsg();
2918*53ee8cc1Swenshuai.xi }
2919*53ee8cc1Swenshuai.xi #endif
2920*53ee8cc1Swenshuai.xi
2921*53ee8cc1Swenshuai.xi _u32TaskLine = __LINE__;
2922*53ee8cc1Swenshuai.xi
2923*53ee8cc1Swenshuai.xi if(_u32LibMode == DRVTSP_CMD_LIB_MODE_KRN)
2924*53ee8cc1Swenshuai.xi {
2925*53ee8cc1Swenshuai.xi #ifdef DMX_UTOPIA_2K
2926*53ee8cc1Swenshuai.xi u32Events = pData->u32PrcEvt;
2927*53ee8cc1Swenshuai.xi #endif //DMX_UTOPIA_2K
2928*53ee8cc1Swenshuai.xi }
2929*53ee8cc1Swenshuai.xi else
2930*53ee8cc1Swenshuai.xi {
2931*53ee8cc1Swenshuai.xi _TSP_GetEvent(_s32TspEventId, u32Events, TSP_TASK_EVENT_GROUP_SELF|TSP_TASK_EVENT_FLT_FREE, OSAL_EVENT_OR_CLEAR, MSOS_WAIT_FOREVER);
2932*53ee8cc1Swenshuai.xi *pRet = DRVTSP_FAIL;
2933*53ee8cc1Swenshuai.xi }
2934*53ee8cc1Swenshuai.xi
2935*53ee8cc1Swenshuai.xi if(u32Events & (TSP_TASK_EVENT_PVR_SELF|TSP_TASK_EVENT_PVR_POLL))
2936*53ee8cc1Swenshuai.xi {
2937*53ee8cc1Swenshuai.xi _TSP_Isr_Proc_Pvr(E_DRVTSP_EVENT_CB_SELF);
2938*53ee8cc1Swenshuai.xi }
2939*53ee8cc1Swenshuai.xi
2940*53ee8cc1Swenshuai.xi if (u32Events & TSP_TASK_EVENT_SECTION_SELF)
2941*53ee8cc1Swenshuai.xi {
2942*53ee8cc1Swenshuai.xi for (i = 0; i < TSP_ENGINE_NUM; i++)
2943*53ee8cc1Swenshuai.xi {
2944*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId;
2945*53ee8cc1Swenshuai.xi
2946*53ee8cc1Swenshuai.xi for (j = 0; j < u32GroupNum; j++)
2947*53ee8cc1Swenshuai.xi {
2948*53ee8cc1Swenshuai.xi _TSP_GetModeSecOvf(j, 0xFFFFFFFFUL, &u32SecOvf, OSAL_EVENT_OR_CLEAR);
2949*53ee8cc1Swenshuai.xi _TSP_GetModeSecRdy(j, 0xFFFFFFFFUL, &u32SecRdy, OSAL_EVENT_OR_CLEAR);
2950*53ee8cc1Swenshuai.xi _TSP_GetModeSecCrc(j, 0xFFFFFFFFUL, &u32SecCrc, OSAL_EVENT_OR_CLEAR);
2951*53ee8cc1Swenshuai.xi
2952*53ee8cc1Swenshuai.xi //printf("u32SecOvf %x, u32SecRdy %x, u32SecCrc %x\n", (int)u32SecOvf, (int)u32SecRdy, (int)u32SecCrc);
2953*53ee8cc1Swenshuai.xi
2954*53ee8cc1Swenshuai.xi while (u32SecRdy)
2955*53ee8cc1Swenshuai.xi {
2956*53ee8cc1Swenshuai.xi u32SecFltId = MAsm_CPU_GetTrailOne(u32SecRdy) + (j << 5UL); //[TODO] balance every filter priority
2957*53ee8cc1Swenshuai.xi //[NOTE] it may be already balance for long term running
2958*53ee8cc1Swenshuai.xi *pRet = (_TSP_Isr_Proc_SecRdyCrc(i, u32SecFltId, E_DRVTSP_EVENT_CB_SELF, &u32Evt))? DRVTSP_OK: DRVTSP_FAIL;
2959*53ee8cc1Swenshuai.xi u32SecRdy &= ~(1UL << (u32SecFltId & 0x1FUL));
2960*53ee8cc1Swenshuai.xi }
2961*53ee8cc1Swenshuai.xi
2962*53ee8cc1Swenshuai.xi while (u32SecCrc)
2963*53ee8cc1Swenshuai.xi {
2964*53ee8cc1Swenshuai.xi u32SecFltId = MAsm_CPU_GetTrailOne(u32SecCrc) + (j << 5); //[TODO] balance every filter priority
2965*53ee8cc1Swenshuai.xi //[NOTE] it may be already balance for long term running
2966*53ee8cc1Swenshuai.xi *pRet = (_TSP_Isr_Proc_SecCrcErr(i, u32SecFltId, E_DRVTSP_EVENT_CB_SELF, &u32Evt))? DRVTSP_OK: DRVTSP_FAIL;
2967*53ee8cc1Swenshuai.xi u32SecCrc &= ~(1UL << (u32SecFltId & 0x1FUL));
2968*53ee8cc1Swenshuai.xi }
2969*53ee8cc1Swenshuai.xi
2970*53ee8cc1Swenshuai.xi while(u32SecOvf)
2971*53ee8cc1Swenshuai.xi {
2972*53ee8cc1Swenshuai.xi u32SecFltId = MAsm_CPU_GetTrailOne(u32SecOvf) + (j << 5UL); //[TODO] balance every filter priority
2973*53ee8cc1Swenshuai.xi //[NOTE] it may be already balance for long term running
2974*53ee8cc1Swenshuai.xi *pRet = (_TSP_Isr_Proc_SecOvf(i, u32SecFltId, E_DRVTSP_EVENT_CB_SELF, &u32Evt))? DRVTSP_OK: DRVTSP_FAIL;
2975*53ee8cc1Swenshuai.xi u32SecOvf &= ~(1UL << (u32SecFltId & 0x1FUL));
2976*53ee8cc1Swenshuai.xi }
2977*53ee8cc1Swenshuai.xi }
2978*53ee8cc1Swenshuai.xi }
2979*53ee8cc1Swenshuai.xi }
2980*53ee8cc1Swenshuai.xi
2981*53ee8cc1Swenshuai.xi #if 0
2982*53ee8cc1Swenshuai.xi if (u32Events & TSP_TASK_EVENT_FLT_FREE)
2983*53ee8cc1Swenshuai.xi {
2984*53ee8cc1Swenshuai.xi for (i = 0; i < TSP_ENGINE_NUM; i++)
2985*53ee8cc1Swenshuai.xi {
2986*53ee8cc1Swenshuai.xi for (j = 0; j < u32GroupNum; j++)
2987*53ee8cc1Swenshuai.xi {
2988*53ee8cc1Swenshuai.xi u32AskFreeFltList = _TSP_GetAskPidFltFree0List(j);
2989*53ee8cc1Swenshuai.xi u32Mask = u32AskFreeFltList;
2990*53ee8cc1Swenshuai.xi
2991*53ee8cc1Swenshuai.xi if(u32Mask)
2992*53ee8cc1Swenshuai.xi {
2993*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
2994*53ee8cc1Swenshuai.xi }
2995*53ee8cc1Swenshuai.xi
2996*53ee8cc1Swenshuai.xi while(u32AskFreeFltList)
2997*53ee8cc1Swenshuai.xi {
2998*53ee8cc1Swenshuai.xi u32PidFltId = MAsm_CPU_GetTrailOne(u32AskFreeFltList) + (j << 5UL);
2999*53ee8cc1Swenshuai.xi
3000*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[0].FltState[u32PidFltId] != E_DRVTSP_FLT_STATE_FREE)
3001*53ee8cc1Swenshuai.xi {
3002*53ee8cc1Swenshuai.xi //section filter id is the same as pid filter id
3003*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId;
3004*53ee8cc1Swenshuai.xi
3005*53ee8cc1Swenshuai.xi //u32SecFltId = HAL_TSP_PidFlt_GetSecFlt(0, u32PidFltId);
3006*53ee8cc1Swenshuai.xi u32SecFltId = _ptsp_res->_TspState[0].FltMap[u32PidFltId];
3007*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId(u32SecFltId, &u32SecRdy, OSAL_EVENT_OR_CLEAR);
3008*53ee8cc1Swenshuai.xi _TSP_GetSecOvfId(u32SecFltId, &u32SecOvf, OSAL_EVENT_OR_CLEAR);
3009*53ee8cc1Swenshuai.xi _TSP_GetSecCrcId(u32SecFltId, &u32Events, OSAL_EVENT_OR_CLEAR);
3010*53ee8cc1Swenshuai.xi _TSP_SecBuf_Free(0, u32SecFltId);
3011*53ee8cc1Swenshuai.xi _TSP_SecFlt_Free(0, u32SecFltId, TRUE);
3012*53ee8cc1Swenshuai.xi _TSP_PidFlt_Free(0, u32PidFltId, FALSE);
3013*53ee8cc1Swenshuai.xi //ULOGD("TSP", "_TSP_PidFlt_Free %ld , time %ld\n", u32PidFltId, MsOS_GetSystemTime());
3014*53ee8cc1Swenshuai.xi }
3015*53ee8cc1Swenshuai.xi _TSP_FLAG_SetDone(u32PidFltId);
3016*53ee8cc1Swenshuai.xi u32AskFreeFltList &= (~(1UL<<(u32PidFltId & 0x1FUL)));
3017*53ee8cc1Swenshuai.xi }
3018*53ee8cc1Swenshuai.xi
3019*53ee8cc1Swenshuai.xi if(u32Mask)
3020*53ee8cc1Swenshuai.xi {
3021*53ee8cc1Swenshuai.xi _TSP_ClrAskPidFltFree0List(j, u32Mask);
3022*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
3023*53ee8cc1Swenshuai.xi }
3024*53ee8cc1Swenshuai.xi
3025*53ee8cc1Swenshuai.xi }
3026*53ee8cc1Swenshuai.xi }
3027*53ee8cc1Swenshuai.xi }
3028*53ee8cc1Swenshuai.xi #endif
3029*53ee8cc1Swenshuai.xi
3030*53ee8cc1Swenshuai.xi }
3031*53ee8cc1Swenshuai.xi
_TSP_Isr_ProcPoll(OSAL_TSP_ProcTypeParam * pData,MS_U32 * pu32Evt)3032*53ee8cc1Swenshuai.xi static void _TSP_Isr_ProcPoll(OSAL_TSP_ProcTypeParam* pData, MS_U32* pu32Evt)
3033*53ee8cc1Swenshuai.xi {
3034*53ee8cc1Swenshuai.xi MS_U32 u32Events = 0, u32SecOvf = 0, u32SecCrc = 0;
3035*53ee8cc1Swenshuai.xi MS_U32 i = 0;
3036*53ee8cc1Swenshuai.xi MS_U32 u32FltId = pData->u32FltId;
3037*53ee8cc1Swenshuai.xi TSP_Result* pRet = (TSP_Result*)pData->pRet;
3038*53ee8cc1Swenshuai.xi MS_BOOL bRes;
3039*53ee8cc1Swenshuai.xi MS_U32 u32FwEvent = 0;
3040*53ee8cc1Swenshuai.xi
3041*53ee8cc1Swenshuai.xi _TSP_GetEvent(_s32TspEventId, u32FwEvent, TSP_TASK_EVENT_FWMSG, OSAL_EVENT_OR_CLEAR, 0);
3042*53ee8cc1Swenshuai.xi if(u32FwEvent & (TSP_TASK_EVENT_FWMSG))
3043*53ee8cc1Swenshuai.xi {
3044*53ee8cc1Swenshuai.xi _DumpFwMsg();
3045*53ee8cc1Swenshuai.xi }
3046*53ee8cc1Swenshuai.xi _TSP_GetEvent(_s32TspEventId, u32Events, TSP_TASK_EVENT_GROUP_POLL, OSAL_EVENT_OR, 0);
3047*53ee8cc1Swenshuai.xi
3048*53ee8cc1Swenshuai.xi *pRet = DRVTSP_FAIL;
3049*53ee8cc1Swenshuai.xi
3050*53ee8cc1Swenshuai.xi if(u32Events & (TSP_TASK_EVENT_PVR_SELF|TSP_TASK_EVENT_PVR_POLL))
3051*53ee8cc1Swenshuai.xi {
3052*53ee8cc1Swenshuai.xi _TSP_Isr_Proc_Pvr(E_DRVTSP_EVENT_CB_POLL);
3053*53ee8cc1Swenshuai.xi return;
3054*53ee8cc1Swenshuai.xi }
3055*53ee8cc1Swenshuai.xi
3056*53ee8cc1Swenshuai.xi for (i = 0; i < TSP_ENGINE_NUM; i++)
3057*53ee8cc1Swenshuai.xi {
3058*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId;
3059*53ee8cc1Swenshuai.xi
3060*53ee8cc1Swenshuai.xi u32SecFltId = HAL_TSP_PidFlt_GetSecFlt(0, u32FltId);
3061*53ee8cc1Swenshuai.xi
3062*53ee8cc1Swenshuai.xi *pRet = (_TSP_Isr_Proc_SecRdyCrc(i, u32SecFltId, E_DRVTSP_EVENT_CB_POLL, pu32Evt))? DRVTSP_OK: DRVTSP_FAIL;
3063*53ee8cc1Swenshuai.xi if (DRVTSP_FAIL == *pRet)
3064*53ee8cc1Swenshuai.xi {
3065*53ee8cc1Swenshuai.xi bRes = _TSP_GetSecCrcId(u32SecFltId, &u32SecCrc, OSAL_EVENT_OR);
3066*53ee8cc1Swenshuai.xi
3067*53ee8cc1Swenshuai.xi if (bRes)
3068*53ee8cc1Swenshuai.xi {
3069*53ee8cc1Swenshuai.xi *pRet = (_TSP_Isr_Proc_SecCrcErr(i, u32SecFltId, E_DRVTSP_EVENT_CB_POLL, pu32Evt))? DRVTSP_OK: DRVTSP_FAIL;
3070*53ee8cc1Swenshuai.xi }
3071*53ee8cc1Swenshuai.xi }
3072*53ee8cc1Swenshuai.xi if (DRVTSP_FAIL == *pRet)
3073*53ee8cc1Swenshuai.xi {
3074*53ee8cc1Swenshuai.xi bRes = _TSP_GetSecOvfId(u32SecFltId, &u32SecOvf, OSAL_EVENT_OR);
3075*53ee8cc1Swenshuai.xi
3076*53ee8cc1Swenshuai.xi if (bRes)
3077*53ee8cc1Swenshuai.xi {
3078*53ee8cc1Swenshuai.xi *pRet = (_TSP_Isr_Proc_SecOvf(i, u32SecFltId, E_DRVTSP_EVENT_CB_POLL, pu32Evt))? DRVTSP_OK: DRVTSP_FAIL;
3079*53ee8cc1Swenshuai.xi }
3080*53ee8cc1Swenshuai.xi }
3081*53ee8cc1Swenshuai.xi }
3082*53ee8cc1Swenshuai.xi }
3083*53ee8cc1Swenshuai.xi
_TSP_Isr_Proc_Task(OSAL_TSP_ProcTypeParam * pDummy,MS_U32 * pu32Dummy)3084*53ee8cc1Swenshuai.xi static void _TSP_Isr_Proc_Task(OSAL_TSP_ProcTypeParam* pDummy, MS_U32* pu32Dummy)
3085*53ee8cc1Swenshuai.xi {
3086*53ee8cc1Swenshuai.xi TSP_Result Ret;
3087*53ee8cc1Swenshuai.xi OSAL_TSP_ProcTypeParam Data;
3088*53ee8cc1Swenshuai.xi
3089*53ee8cc1Swenshuai.xi Data.u32FltId = 0xFFFFFFFFUL;
3090*53ee8cc1Swenshuai.xi Data.pRet = (void*)&Ret;
3091*53ee8cc1Swenshuai.xi Data.bInfiniteWait = TRUE;
3092*53ee8cc1Swenshuai.xi Data.bFromTask = TRUE;
3093*53ee8cc1Swenshuai.xi #ifdef DMX_UTOPIA_2K
3094*53ee8cc1Swenshuai.xi Data.u32PrcEvt = 0;
3095*53ee8cc1Swenshuai.xi #endif
3096*53ee8cc1Swenshuai.xi
3097*53ee8cc1Swenshuai.xi while (1)
3098*53ee8cc1Swenshuai.xi {
3099*53ee8cc1Swenshuai.xi _TSP_EXT_LOCK();
3100*53ee8cc1Swenshuai.xi if (_db_flag == 1)
3101*53ee8cc1Swenshuai.xi {
3102*53ee8cc1Swenshuai.xi _db_flag = 2;
3103*53ee8cc1Swenshuai.xi //_TSP_EXT_UNLOCK();
3104*53ee8cc1Swenshuai.xi break;
3105*53ee8cc1Swenshuai.xi }
3106*53ee8cc1Swenshuai.xi _TSP_EXT_UNLOCK();
3107*53ee8cc1Swenshuai.xi _TSP_Isr_ProcSelf(&Data);
3108*53ee8cc1Swenshuai.xi } // Task while loop
3109*53ee8cc1Swenshuai.xi
3110*53ee8cc1Swenshuai.xi _s32TspTaskId = -1;
3111*53ee8cc1Swenshuai.xi _TSP_EXT_UNLOCK();
3112*53ee8cc1Swenshuai.xi //printf("TSP ISR Proc End!!!\n");
3113*53ee8cc1Swenshuai.xi }
3114*53ee8cc1Swenshuai.xi
3115*53ee8cc1Swenshuai.xi static char tsp_mutex[] = "TSP_Mutex";
3116*53ee8cc1Swenshuai.xi static char tsp_ind_mutex[] = "TSP_Ind_Mutex";
3117*53ee8cc1Swenshuai.xi static char tsp_int_mutex[] = "TSP_Int_Mutex";
3118*53ee8cc1Swenshuai.xi static char tsp_ext_mutex[] = "TSP_Ext_Mutex";
3119*53ee8cc1Swenshuai.xi static char tsp_event[] = "TSP_Event";
3120*53ee8cc1Swenshuai.xi
3121*53ee8cc1Swenshuai.xi static char tsp_secRdy[] = "TSP_SecRdy";
3122*53ee8cc1Swenshuai.xi static char tsp_crcerr[] = "TSP_CrcErr";
3123*53ee8cc1Swenshuai.xi static char tsp_secovf[] = "TSP_SecOvf";
3124*53ee8cc1Swenshuai.xi static char tsp_fltdis[] = "TSP_FltDis";
3125*53ee8cc1Swenshuai.xi //static char freelist0[] = "TSP_FreeList0";
3126*53ee8cc1Swenshuai.xi //static char tsp_done[] = "TSP_Done";
3127*53ee8cc1Swenshuai.xi
3128*53ee8cc1Swenshuai.xi //static char freelistdefer0[] = "TSP_FreeListDefer0";
3129*53ee8cc1Swenshuai.xi static char tsp_isr_task[] = "TSP_ISR_Task";
3130*53ee8cc1Swenshuai.xi
_TSP_Init(MS_BOOL bResetSwState,MS_BOOL bRestoreRegState)3131*53ee8cc1Swenshuai.xi static TSP_Result _TSP_Init(MS_BOOL bResetSwState, MS_BOOL bRestoreRegState)
3132*53ee8cc1Swenshuai.xi {
3133*53ee8cc1Swenshuai.xi MS_VIRT virtBank = 0, virtBank1 = 0;
3134*53ee8cc1Swenshuai.xi MS_PHY u32BankSize = 0;
3135*53ee8cc1Swenshuai.xi MS_PHY u32BankSize1 = 0;
3136*53ee8cc1Swenshuai.xi MS_BOOL bAlive;
3137*53ee8cc1Swenshuai.xi MS_U32 u32FwSize = 0;
3138*53ee8cc1Swenshuai.xi MS_PHY phyFwAddr = 0;
3139*53ee8cc1Swenshuai.xi MS_U8 u8ii = 0, u8temp = 0;
3140*53ee8cc1Swenshuai.xi
3141*53ee8cc1Swenshuai.xi if (FALSE == MDrv_MMIO_GetBASE(&virtBank, &u32BankSize, MS_MODULE_TSP))
3142*53ee8cc1Swenshuai.xi {
3143*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("MDrv_MMIO_GetBASE fail\n"));
3144*53ee8cc1Swenshuai.xi MS_ASSERT(0);
3145*53ee8cc1Swenshuai.xi }
3146*53ee8cc1Swenshuai.xi if (FALSE == MDrv_MMIO_GetBASE(&virtBank1, &u32BankSize1, MS_MODULE_PM))
3147*53ee8cc1Swenshuai.xi {
3148*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("MDrv_MMIO_GetBASE fail\n"));
3149*53ee8cc1Swenshuai.xi MS_ASSERT(0);
3150*53ee8cc1Swenshuai.xi }
3151*53ee8cc1Swenshuai.xi
3152*53ee8cc1Swenshuai.xi HAL_TSP_SetBank(virtBank, virtBank1);
3153*53ee8cc1Swenshuai.xi
3154*53ee8cc1Swenshuai.xi for(u8ii = 0; u8ii < ((MS_U8)TSP_PVR_IF_NUM); u8ii++)
3155*53ee8cc1Swenshuai.xi {
3156*53ee8cc1Swenshuai.xi _ptsp_res->_PvrEvtNotify[u8ii] = E_DRVTSP_EVENT_DATA_INIT;
3157*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[u8ii] = NULL;
3158*53ee8cc1Swenshuai.xi }
3159*53ee8cc1Swenshuai.xi
3160*53ee8cc1Swenshuai.xi HAL_TSP_STC64_Mode_En(TRUE);
3161*53ee8cc1Swenshuai.xi
3162*53ee8cc1Swenshuai.xi bAlive = HAL_TSP_Alive();
3163*53ee8cc1Swenshuai.xi if (!bAlive)
3164*53ee8cc1Swenshuai.xi {
3165*53ee8cc1Swenshuai.xi HAL_TSP_PowerCtrl(ENABLE);
3166*53ee8cc1Swenshuai.xi HAL_TSP_Reset(0);
3167*53ee8cc1Swenshuai.xi // Diable interrupt
3168*53ee8cc1Swenshuai.xi HAL_TSP_Int_Disable(TSP_HWINT_ALL);
3169*53ee8cc1Swenshuai.xi HAL_TSP_Int2_Disable(TSP_HWINT2_ALL);
3170*53ee8cc1Swenshuai.xi }
3171*53ee8cc1Swenshuai.xi else if(bResetSwState == FALSE)
3172*53ee8cc1Swenshuai.xi {
3173*53ee8cc1Swenshuai.xi HAL_ResetAll();
3174*53ee8cc1Swenshuai.xi MsOS_DelayTask(5);
3175*53ee8cc1Swenshuai.xi }
3176*53ee8cc1Swenshuai.xi
3177*53ee8cc1Swenshuai.xi // IntDisable
3178*53ee8cc1Swenshuai.xi // IntDetach
3179*53ee8cc1Swenshuai.xi OSAL_TSP_IntDisable();
3180*53ee8cc1Swenshuai.xi //#ifndef MSOS_TYPE_LINUX_KERNEL
3181*53ee8cc1Swenshuai.xi OSAL_TSP_IntDetach();
3182*53ee8cc1Swenshuai.xi //#endif
3183*53ee8cc1Swenshuai.xi
3184*53ee8cc1Swenshuai.xi if (!bAlive)
3185*53ee8cc1Swenshuai.xi {
3186*53ee8cc1Swenshuai.xi // Disable CPU
3187*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(0, 0x0, TSP_IF_NUM); // Disable TSP0(Reset CPU), Software_Reset
3188*53ee8cc1Swenshuai.xi HAL_TSP_HW_Lock_Init();
3189*53ee8cc1Swenshuai.xi
3190*53ee8cc1Swenshuai.xi // Richard: Enable indirect access
3191*53ee8cc1Swenshuai.xi HAL_TSP_Ind_Enable();
3192*53ee8cc1Swenshuai.xi _TSP_CmdQ_Init();
3193*53ee8cc1Swenshuai.xi HAL_TSP_WbDmaEnable(TRUE);
3194*53ee8cc1Swenshuai.xi
3195*53ee8cc1Swenshuai.xi // The below is setting hw_config0, (ts interface 0), how about hw_config3, (ts_interface 1)
3196*53ee8cc1Swenshuai.xi // Mark : Byte enable setting, fix HW bug. (Important)
3197*53ee8cc1Swenshuai.xi HAL_TSP_HwPatch();
3198*53ee8cc1Swenshuai.xi }
3199*53ee8cc1Swenshuai.xi
3200*53ee8cc1Swenshuai.xi if (bResetSwState)
3201*53ee8cc1Swenshuai.xi {
3202*53ee8cc1Swenshuai.xi _TSP_SwStateReset(FALSE);
3203*53ee8cc1Swenshuai.xi }
3204*53ee8cc1Swenshuai.xi
3205*53ee8cc1Swenshuai.xi if (!bAlive)
3206*53ee8cc1Swenshuai.xi {
3207*53ee8cc1Swenshuai.xi if (bRestoreRegState == 0)
3208*53ee8cc1Swenshuai.xi {
3209*53ee8cc1Swenshuai.xi _TSP_RegStateReset();
3210*53ee8cc1Swenshuai.xi }
3211*53ee8cc1Swenshuai.xi
3212*53ee8cc1Swenshuai.xi if (_TSP_GetFirmware(&phyFwAddr, &u32FwSize) == FALSE)
3213*53ee8cc1Swenshuai.xi {
3214*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG ("TSP init fail: Please set FW address and size\n"));
3215*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3216*53ee8cc1Swenshuai.xi }
3217*53ee8cc1Swenshuai.xi
3218*53ee8cc1Swenshuai.xi //TSP_DBG("[%s][%d]Reset CMDQ\n",__FUNCTION__,__LINE__);
3219*53ee8cc1Swenshuai.xi if(!HAL_TSP_CmdQ_Reset())
3220*53ee8cc1Swenshuai.xi {
3221*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3222*53ee8cc1Swenshuai.xi }
3223*53ee8cc1Swenshuai.xi
3224*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE //load fwtsp.dat from Tee
3225*53ee8cc1Swenshuai.xi _ptsp_res->_stSecBuf.u32BufId = 0;
3226*53ee8cc1Swenshuai.xi _ptsp_res->_stSecBuf.u32BufOpt = 0;
3227*53ee8cc1Swenshuai.xi _ptsp_res->_stSecBuf.u32BufSize = u32FwSize;
3228*53ee8cc1Swenshuai.xi _ptsp_res->_stSecBuf.phyBufAddr = phyFwAddr;
3229*53ee8cc1Swenshuai.xi if(MDrv_TSP_Ree_SendTeeCmd(E_DRVTSP_REE_TO_TEE_CMD_FW_LoadCode, (void*)(&(_ptsp_res->_stSecBuf)), sizeof(DrvTSP_SecureBuf)) != DRVTSP_OK)
3230*53ee8cc1Swenshuai.xi {
3231*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3232*53ee8cc1Swenshuai.xi }
3233*53ee8cc1Swenshuai.xi #endif
3234*53ee8cc1Swenshuai.xi
3235*53ee8cc1Swenshuai.xi HAL_TSP_CPU_SetBase(phyFwAddr, u32FwSize);
3236*53ee8cc1Swenshuai.xi // Synthesizer Tuning
3237*53ee8cc1Swenshuai.xi // For difference : 100 - 4000 STC
3238*53ee8cc1Swenshuai.xi // Step: 10 STC
3239*53ee8cc1Swenshuai.xi // HAL_TSP_SetFwMsg(0x03A4); // Catch up n*10 STC in 1/20 sec
3240*53ee8cc1Swenshuai.xi
3241*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(0, TSP_CTRL_SW_RST, 0);// | TSP_CTRL_CLK_GATING_DISABLE); // Enable TSP CPU
3242*53ee8cc1Swenshuai.xi
3243*53ee8cc1Swenshuai.xi // TSP_DBG ("**************************DDD TSP protect miu00000000000000000\n");
3244*53ee8cc1Swenshuai.xi // TSP write protect to prevent TSP write memory
3245*53ee8cc1Swenshuai.xi HAL_TSP_OrzWriteProtect_Enable(TRUE, 0, 0);
3246*53ee8cc1Swenshuai.xi
3247*53ee8cc1Swenshuai.xi HAL_Reset_WB();
3248*53ee8cc1Swenshuai.xi
3249*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(0, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 0);// | TSP_CTRL_CLK_GATING_DISABLE); // Enable TSP CPU
3250*53ee8cc1Swenshuai.xi
3251*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearSw();
3252*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearHw(TSP_HWINT_ALL);
3253*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearHw2(TSP_HWINT2_ALL);
3254*53ee8cc1Swenshuai.xi
3255*53ee8cc1Swenshuai.xi while (FALSE == HAL_TSP_Alive())
3256*53ee8cc1Swenshuai.xi {
3257*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("Reset TSP CPU fail\n"));
3258*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(0, 0, TSP_IF_NUM);
3259*53ee8cc1Swenshuai.xi
3260*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE //load fwtsp.dat from Tee
3261*53ee8cc1Swenshuai.xi if(MDrv_TSP_Ree_SendTeeCmd(E_DRVTSP_REE_TO_TEE_CMD_FW_LoadCode, (void*)(&(_ptsp_res->_stSecBuf)), sizeof(DrvTSP_SecureBuf)) != DRVTSP_OK)
3262*53ee8cc1Swenshuai.xi {
3263*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3264*53ee8cc1Swenshuai.xi }
3265*53ee8cc1Swenshuai.xi #endif
3266*53ee8cc1Swenshuai.xi
3267*53ee8cc1Swenshuai.xi HAL_TSP_CPU_SetBase(phyFwAddr, u32FwSize);
3268*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(0, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 0);// | TSP_CTRL_CLK_GATING_DISABLE); // Enable TSP CPU
3269*53ee8cc1Swenshuai.xi }
3270*53ee8cc1Swenshuai.xi
3271*53ee8cc1Swenshuai.xi while(FALSE == HAL_TSP_Check_FW_VER());
3272*53ee8cc1Swenshuai.xi
3273*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
3274*53ee8cc1Swenshuai.xi _ptsp_res->_stSecBuf.u32BufId = 0xFF;
3275*53ee8cc1Swenshuai.xi _ptsp_res->_stSecBuf.u32BufOpt = 0;
3276*53ee8cc1Swenshuai.xi _ptsp_res->_stSecBuf.u32BufSize = 0;
3277*53ee8cc1Swenshuai.xi _ptsp_res->_stSecBuf.phyBufAddr = 0;
3278*53ee8cc1Swenshuai.xi if(MDrv_TSP_Ree_SendTeeCmd(E_DRVTSP_REE_TO_TEE_CMD_FW_LoadCode, (void*)(&(_ptsp_res->_stSecBuf)), sizeof(DrvTSP_SecureBuf)) != DRVTSP_OK)
3279*53ee8cc1Swenshuai.xi {
3280*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3281*53ee8cc1Swenshuai.xi }
3282*53ee8cc1Swenshuai.xi #endif
3283*53ee8cc1Swenshuai.xi
3284*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearSw();
3285*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearHw(TSP_HWINT_ALL);
3286*53ee8cc1Swenshuai.xi HAL_TSP_Int_ClearHw2(TSP_HWINT2_ALL);
3287*53ee8cc1Swenshuai.xi
3288*53ee8cc1Swenshuai.xi // Implicity MDrv_TSP_Reset()
3289*53ee8cc1Swenshuai.xi HAL_TSP_TsDma_SetDelay(0x0AUL); // Set TsDma delay, //jyliu.tsp, how come the value
3290*53ee8cc1Swenshuai.xi
3291*53ee8cc1Swenshuai.xi _FwDbgInfo.bEnable = FALSE;
3292*53ee8cc1Swenshuai.xi _FwDbgInfo.phyBufAddr = 0;
3293*53ee8cc1Swenshuai.xi _FwDbgInfo.u32Size = 0x0UL;
3294*53ee8cc1Swenshuai.xi _FwDbgInfo.phyReadPos = 0x0UL;
3295*53ee8cc1Swenshuai.xi _FwDbgInfo.phyWritePos = 0x0UL;
3296*53ee8cc1Swenshuai.xi }
3297*53ee8cc1Swenshuai.xi
3298*53ee8cc1Swenshuai.xi // STC control by TSP need indirect R/W enable
3299*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < ((MS_U8)TSP_PCRFLT_NUM); u8ii++)
3300*53ee8cc1Swenshuai.xi {
3301*53ee8cc1Swenshuai.xi HAL_TSP_Stc_ctrl(u8ii, STC_SYNTH_DEFAULT);
3302*53ee8cc1Swenshuai.xi }
3303*53ee8cc1Swenshuai.xi
3304*53ee8cc1Swenshuai.xi // Enable SYNC_RISING_DETECT and VALID_FALLING_DETECT for Serial mode
3305*53ee8cc1Swenshuai.xi HAL_TSP_Enable_ValidSync_Dectect();
3306*53ee8cc1Swenshuai.xi
3307*53ee8cc1Swenshuai.xi // Disable TSIF1
3308*53ee8cc1Swenshuai.xi HAL_TSP_PVR_Enable(0, FALSE);
3309*53ee8cc1Swenshuai.xi HAL_TSP_PVR_Enable(1, FALSE);
3310*53ee8cc1Swenshuai.xi HAL_TSP_PVR_Enable(2, FALSE);
3311*53ee8cc1Swenshuai.xi
3312*53ee8cc1Swenshuai.xi OSAL_TSP_IntAttach(_TSP_Isr);
3313*53ee8cc1Swenshuai.xi //#ifndef MSOS_TYPE_LINUX_KERNEL
3314*53ee8cc1Swenshuai.xi OSAL_TSP_IntEnable();
3315*53ee8cc1Swenshuai.xi //#endif
3316*53ee8cc1Swenshuai.xi
3317*53ee8cc1Swenshuai.xi if (!bAlive)
3318*53ee8cc1Swenshuai.xi {
3319*53ee8cc1Swenshuai.xi HAL_TSP_Int_Enable(TSP_HWINT_TSP_SW_INT_STATUS); // Enable TSP hardware interrupt
3320*53ee8cc1Swenshuai.xi //HAL_TSP_Int2_Enable(TSP_HWINT2_ALL);
3321*53ee8cc1Swenshuai.xi #if 0 //(defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 0))
3322*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < TSP_PCRFLT_NUM; u8ii++)
3323*53ee8cc1Swenshuai.xi {
3324*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_Int_Enable(u8ii, TRUE);
3325*53ee8cc1Swenshuai.xi }
3326*53ee8cc1Swenshuai.xi #endif
3327*53ee8cc1Swenshuai.xi }
3328*53ee8cc1Swenshuai.xi
3329*53ee8cc1Swenshuai.xi if(bResetSwState)
3330*53ee8cc1Swenshuai.xi {
3331*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < ((MS_U8)TSP_PVR_IF_NUM); u8ii++)
3332*53ee8cc1Swenshuai.xi {
3333*53ee8cc1Swenshuai.xi _ptsp_res->_PvrEvtNotify[u8ii] = E_DRVTSP_EVENT_DATA_INIT;
3334*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[u8ii] = NULL;
3335*53ee8cc1Swenshuai.xi }
3336*53ee8cc1Swenshuai.xi u8temp = (MS_U8)((TSP_PVR_IF_NUM+31UL)>>5UL);
3337*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < u8temp; u8ii++)
3338*53ee8cc1Swenshuai.xi {
3339*53ee8cc1Swenshuai.xi _u32PvrNotifyId[u8ii] = 0;
3340*53ee8cc1Swenshuai.xi }
3341*53ee8cc1Swenshuai.xi }
3342*53ee8cc1Swenshuai.xi
3343*53ee8cc1Swenshuai.xi if(((_u32LibMode == DRVTSP_CMD_LIB_MODE_KRN) && (_ptsp_res->_TspState[0].TSPStatus == E_DRVTSP_SW_RESUME)) == FALSE)
3344*53ee8cc1Swenshuai.xi {
3345*53ee8cc1Swenshuai.xi _ptsp_res->_s32TspMutexId = OSAL_TSP_MutexCreate((MS_U8*)tsp_mutex);
3346*53ee8cc1Swenshuai.xi _ptsp_res->_s32IndMutexId = OSAL_TSP_MutexCreate((MS_U8*)tsp_ind_mutex);
3347*53ee8cc1Swenshuai.xi _ptsp_res->_s32IntRegMutexId = OSAL_TSP_MutexCreate((MS_U8*)tsp_int_mutex);
3348*53ee8cc1Swenshuai.xi _s32ExtMutexId = OSAL_TSP_MutexCreate((MS_U8*)tsp_ext_mutex);
3349*53ee8cc1Swenshuai.xi //printf("[%s][%d] tsp_ext_mutex %x \n", __FUNCTION__, __LINE__, (int)tsp_ext_mutex);
3350*53ee8cc1Swenshuai.xi
3351*53ee8cc1Swenshuai.xi if(_u32LibMode != DRVTSP_CMD_LIB_MODE_KRN)
3352*53ee8cc1Swenshuai.xi {
3353*53ee8cc1Swenshuai.xi _s32TspEventId = OSAL_TSP_EventCreate((MS_U8*)tsp_event);
3354*53ee8cc1Swenshuai.xi }
3355*53ee8cc1Swenshuai.xi
3356*53ee8cc1Swenshuai.xi u8temp = (MS_U8)((TSP_SECFLT_NUM+31UL)>>5UL);
3357*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < u8temp; u8ii++)
3358*53ee8cc1Swenshuai.xi {
3359*53ee8cc1Swenshuai.xi _s32TspSecRdyId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_secRdy);
3360*53ee8cc1Swenshuai.xi _s32TspSecOvfId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_crcerr);
3361*53ee8cc1Swenshuai.xi _s32TspSecCrcId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_secovf);
3362*53ee8cc1Swenshuai.xi _s32TspFltDisableId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_fltdis);
3363*53ee8cc1Swenshuai.xi
3364*53ee8cc1Swenshuai.xi if(bResetSwState)
3365*53ee8cc1Swenshuai.xi {
3366*53ee8cc1Swenshuai.xi _u32SecNotifyId[u8ii] = 0;
3367*53ee8cc1Swenshuai.xi }
3368*53ee8cc1Swenshuai.xi }
3369*53ee8cc1Swenshuai.xi }
3370*53ee8cc1Swenshuai.xi
3371*53ee8cc1Swenshuai.xi #if 0
3372*53ee8cc1Swenshuai.xi u8temp = ((TSP_PIDFLT_NUM_ALL+31UL)>>5UL);
3373*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < u8temp; u8ii++)
3374*53ee8cc1Swenshuai.xi {
3375*53ee8cc1Swenshuai.xi _s32EventFree0[u8ii] = OSAL_TSP_EventCreate((MS_U8*)freelist0);
3376*53ee8cc1Swenshuai.xi _s32DoneFlags[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_done);
3377*53ee8cc1Swenshuai.xi //_s32EventFreeDefer0[u8ii] = OSAL_TSP_EventCreate((MS_U8*)freelistdefer1);
3378*53ee8cc1Swenshuai.xi }
3379*53ee8cc1Swenshuai.xi #endif
3380*53ee8cc1Swenshuai.xi
3381*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
3382*53ee8cc1Swenshuai.xi if(bResetSwState)
3383*53ee8cc1Swenshuai.xi {
3384*53ee8cc1Swenshuai.xi u8temp = (MS_U8)((TSP_PCRFLT_NUM+31UL)>>5UL);
3385*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < u8temp; u8ii++)
3386*53ee8cc1Swenshuai.xi {
3387*53ee8cc1Swenshuai.xi _u32HwPcrNotifyId[u8ii] = 0;
3388*53ee8cc1Swenshuai.xi }
3389*53ee8cc1Swenshuai.xi }
3390*53ee8cc1Swenshuai.xi #endif
3391*53ee8cc1Swenshuai.xi
3392*53ee8cc1Swenshuai.xi if(_u32LibMode != DRVTSP_CMD_LIB_MODE_KRN)
3393*53ee8cc1Swenshuai.xi {
3394*53ee8cc1Swenshuai.xi _s32TspTaskId = OSAL_TSP_TaskCreate(_TSP_Isr_Proc_Task, (MS_U8*)tsp_isr_task);
3395*53ee8cc1Swenshuai.xi //printf("[%s][%d] _u32LibMode %d , _db_flag %d _s32TspTaskId %x \n", __FUNCTION__, __LINE__, (int)_u32LibMode, (int)_db_flag, (int)_s32TspTaskId);
3396*53ee8cc1Swenshuai.xi }
3397*53ee8cc1Swenshuai.xi
3398*53ee8cc1Swenshuai.xi if(bResetSwState)
3399*53ee8cc1Swenshuai.xi {
3400*53ee8cc1Swenshuai.xi _ptsp_res->_bSWInitReady = TRUE;
3401*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].TSPStatus = E_DRVTSP_SW_INIT;
3402*53ee8cc1Swenshuai.xi _ptsp_res->_u32LastErr = DRVTSP_OK;
3403*53ee8cc1Swenshuai.xi _ptsp_res->_u32ProcessNum = 1UL;
3404*53ee8cc1Swenshuai.xi }
3405*53ee8cc1Swenshuai.xi
3406*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
3407*53ee8cc1Swenshuai.xi MS_U32 u32ii;
3408*53ee8cc1Swenshuai.xi
3409*53ee8cc1Swenshuai.xi for (u32ii= 0; u32ii< TSP_SECFLT_NUM; u32ii++)
3410*53ee8cc1Swenshuai.xi {
3411*53ee8cc1Swenshuai.xi init_waitqueue_head(&tsp_wq_head[u32ii]);
3412*53ee8cc1Swenshuai.xi }
3413*53ee8cc1Swenshuai.xi for (u32ii= 0; u32ii< DRVTSP_MAX_PROCESS_NUM; u32ii++)
3414*53ee8cc1Swenshuai.xi {
3415*53ee8cc1Swenshuai.xi _stKModePrcEvtTbl[u32ii].tgid = 0;
3416*53ee8cc1Swenshuai.xi _stKModePrcEvtTbl[u32ii].s32TspEvtId = -1;
3417*53ee8cc1Swenshuai.xi }
3418*53ee8cc1Swenshuai.xi #endif
3419*53ee8cc1Swenshuai.xi
3420*53ee8cc1Swenshuai.xi if (bRestoreRegState)
3421*53ee8cc1Swenshuai.xi {
3422*53ee8cc1Swenshuai.xi if((_ptsp_res->_phyTspFWDramBuf > 0) && (_ptsp_res->_u32TspFwDramBufSize > 0))
3423*53ee8cc1Swenshuai.xi {
3424*53ee8cc1Swenshuai.xi HAL_TSP_OrzWriteProtect_Enable(TRUE, _ptsp_res->_phyTspFWDramBuf, _ptsp_res->_u32TspFwDramBufSize);
3425*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetDataAddr(_ptsp_res->_phyTspFWDramBuf);
3426*53ee8cc1Swenshuai.xi }
3427*53ee8cc1Swenshuai.xi _TSP_RegStateRestore();
3428*53ee8cc1Swenshuai.xi }
3429*53ee8cc1Swenshuai.xi
3430*53ee8cc1Swenshuai.xi return (TSP_Result)(_ptsp_res->_u32LastErr);
3431*53ee8cc1Swenshuai.xi }
3432*53ee8cc1Swenshuai.xi
3433*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3434*53ee8cc1Swenshuai.xi /// Poweroff TSP driver and TSP engine
3435*53ee8cc1Swenshuai.xi /// @return TSP_Result
3436*53ee8cc1Swenshuai.xi /// @note
3437*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PowerOff(void)3438*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PowerOff(void)
3439*53ee8cc1Swenshuai.xi {
3440*53ee8cc1Swenshuai.xi _TSP_ENTRY();
3441*53ee8cc1Swenshuai.xi _TSP_Close();
3442*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].TSPStatus = E_DRVTSP_SW_POWEROFF;
3443*53ee8cc1Swenshuai.xi // this is not a bug. Intend to lock to mutex to prevent alive task accessing TSP after power off
3444*53ee8cc1Swenshuai.xi return DRVTSP_OK;
3445*53ee8cc1Swenshuai.xi }
3446*53ee8cc1Swenshuai.xi
3447*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3448*53ee8cc1Swenshuai.xi /// Relsase TSP indirect register read/write semaphone
3449*53ee8cc1Swenshuai.xi /// @return TSP_Result
3450*53ee8cc1Swenshuai.xi /// @note
3451*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_HW_Lock_Release(void)3452*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_HW_Lock_Release(void)
3453*53ee8cc1Swenshuai.xi {
3454*53ee8cc1Swenshuai.xi HAL_TSP_HW_Lock_Release();
3455*53ee8cc1Swenshuai.xi
3456*53ee8cc1Swenshuai.xi return DRVTSP_OK;
3457*53ee8cc1Swenshuai.xi }
3458*53ee8cc1Swenshuai.xi
3459*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3460*53ee8cc1Swenshuai.xi /// Close TSP driver and reset software/register state
3461*53ee8cc1Swenshuai.xi /// @return TSP_Result
3462*53ee8cc1Swenshuai.xi /// @note
3463*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Exit(void)3464*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Exit(void)
3465*53ee8cc1Swenshuai.xi {
3466*53ee8cc1Swenshuai.xi MS_U8 i;
3467*53ee8cc1Swenshuai.xi
3468*53ee8cc1Swenshuai.xi _TSP_ENTRY();
3469*53ee8cc1Swenshuai.xi
3470*53ee8cc1Swenshuai.xi //checking if stiil other process exist, only close sw thread
3471*53ee8cc1Swenshuai.xi if(_ptsp_res->_u32ProcessNum > 1)
3472*53ee8cc1Swenshuai.xi {
3473*53ee8cc1Swenshuai.xi _TSP_SW_Exit();
3474*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
3475*53ee8cc1Swenshuai.xi }
3476*53ee8cc1Swenshuai.xi
3477*53ee8cc1Swenshuai.xi for (i = 0; i < ((MS_U8)TSP_ENGINE_NUM); i++)
3478*53ee8cc1Swenshuai.xi {
3479*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[i].TSPStatus = E_DRVTSP_SW_EXIT;
3480*53ee8cc1Swenshuai.xi }
3481*53ee8cc1Swenshuai.xi
3482*53ee8cc1Swenshuai.xi if(HAL_TSP_Alive())
3483*53ee8cc1Swenshuai.xi {
3484*53ee8cc1Swenshuai.xi _TSP_SwStateReset(TRUE);
3485*53ee8cc1Swenshuai.xi }
3486*53ee8cc1Swenshuai.xi else
3487*53ee8cc1Swenshuai.xi {
3488*53ee8cc1Swenshuai.xi _TSP_SwStateReset(FALSE);
3489*53ee8cc1Swenshuai.xi }
3490*53ee8cc1Swenshuai.xi _TSP_RegStateReset();
3491*53ee8cc1Swenshuai.xi _TSP_Close();
3492*53ee8cc1Swenshuai.xi
3493*53ee8cc1Swenshuai.xi // this is not a bug. Intend to lock to mutex to prevent alive task accessing TSP after power off
3494*53ee8cc1Swenshuai.xi return DRVTSP_OK;
3495*53ee8cc1Swenshuai.xi }
3496*53ee8cc1Swenshuai.xi
3497*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3498*53ee8cc1Swenshuai.xi /// Suspend TSP driver
3499*53ee8cc1Swenshuai.xi /// @return TSP_Result
3500*53ee8cc1Swenshuai.xi /// @note
3501*53ee8cc1Swenshuai.xi /// Save TSP driver states to DRAM
3502*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Suspend(void)3503*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Suspend(void)
3504*53ee8cc1Swenshuai.xi {
3505*53ee8cc1Swenshuai.xi MS_U32 u32EngId, u32FilterId, u32SecFltId, u32Flag;
3506*53ee8cc1Swenshuai.xi MS_U16 u16Clk;
3507*53ee8cc1Swenshuai.xi
3508*53ee8cc1Swenshuai.xi if(!((_ptsp_res->_TspState[0].TSPStatus == E_DRVTSP_SW_INIT) || (_ptsp_res->_TspState[0].TSPStatus == E_DRVTSP_SW_RESUME)))
3509*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3510*53ee8cc1Swenshuai.xi
3511*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].TSPStatus = E_DRVTSP_SW_SUSPEND;
3512*53ee8cc1Swenshuai.xi
3513*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
3514*53ee8cc1Swenshuai.xi if(_u32LibMode == DRVTSP_CMD_LIB_MODE_KRN)
3515*53ee8cc1Swenshuai.xi {
3516*53ee8cc1Swenshuai.xi _ptsp_res->_bKerStrSuspend = TRUE;
3517*53ee8cc1Swenshuai.xi HAL_TSP_CMD_Run(HAL_CMD_SET_KRSTR_MODE, 1, 0, 0);
3518*53ee8cc1Swenshuai.xi HAL_TSP_SaveRegs();
3519*53ee8cc1Swenshuai.xi }
3520*53ee8cc1Swenshuai.xi #endif
3521*53ee8cc1Swenshuai.xi
3522*53ee8cc1Swenshuai.xi MDrv_TSP_GetTSIFStatus(E_DRVTSP_IF_TS0, &_ptsp_res->_ifset_save, &u16Clk);
3523*53ee8cc1Swenshuai.xi
3524*53ee8cc1Swenshuai.xi _TSP_STR_ENTRY();
3525*53ee8cc1Swenshuai.xi
3526*53ee8cc1Swenshuai.xi //Stop filter before storing filter
3527*53ee8cc1Swenshuai.xi for (u32EngId = 0; u32EngId < TSP_ENGINE_NUM; u32EngId++)
3528*53ee8cc1Swenshuai.xi {
3529*53ee8cc1Swenshuai.xi for (u32FilterId = 0; u32FilterId < TSP_PIDFLT_NUM_ALL; u32FilterId++)
3530*53ee8cc1Swenshuai.xi {
3531*53ee8cc1Swenshuai.xi if((_ptsp_res->_TspState[u32EngId].FltState[u32FilterId] != E_DRVTSP_FLT_STATE_NA) &&
3532*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltState[u32FilterId] & E_DRVTSP_FLT_STATE_ENABLE))
3533*53ee8cc1Swenshuai.xi {
3534*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32FilterId, TSP_PIDFLT_OUT_NONE);
3535*53ee8cc1Swenshuai.xi //printf("[%s][%d] disable flt %d , sec %x, %x \n", __FUNCTION__, __LINE__, (int)u32FilterId,
3536*53ee8cc1Swenshuai.xi // (int)_ptsp_res->_TspState[u32EngId].FltMap[u32FilterId], (int)_ptsp_res->_TspState[u32EngId].FltType[u32FilterId]);
3537*53ee8cc1Swenshuai.xi
3538*53ee8cc1Swenshuai.xi RESET_FLAG(_ptsp_res->_TspState[u32EngId].FltState[u32FilterId], E_DRVTSP_FLT_STATE_ENABLE);
3539*53ee8cc1Swenshuai.xi SET_FLAG(_ptsp_res->_TspState[u32EngId].FltState[u32FilterId], E_DRVTSP_FLT_STATE_SUSPEND);
3540*53ee8cc1Swenshuai.xi
3541*53ee8cc1Swenshuai.xi //clear event
3542*53ee8cc1Swenshuai.xi u32SecFltId = _ptsp_res->_TspState[u32EngId].FltMap[u32FilterId];
3543*53ee8cc1Swenshuai.xi if(u32SecFltId < TSP_SECFLT_NUM)
3544*53ee8cc1Swenshuai.xi {
3545*53ee8cc1Swenshuai.xi _TSP_GetSecOvfId (u32SecFltId, &u32Flag, OSAL_EVENT_OR_CLEAR);
3546*53ee8cc1Swenshuai.xi _TSP_GetSecCrcId (u32SecFltId, &u32Flag, OSAL_EVENT_OR_CLEAR);
3547*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId (u32SecFltId, &u32Flag, OSAL_EVENT_OR_CLEAR);
3548*53ee8cc1Swenshuai.xi _TSP_GetFltDisableId(u32SecFltId, &u32Flag, OSAL_EVENT_OR_CLEAR);
3549*53ee8cc1Swenshuai.xi }
3550*53ee8cc1Swenshuai.xi }
3551*53ee8cc1Swenshuai.xi }
3552*53ee8cc1Swenshuai.xi }
3553*53ee8cc1Swenshuai.xi
3554*53ee8cc1Swenshuai.xi _TSP_RegStateStore();
3555*53ee8cc1Swenshuai.xi _TSP_Close();
3556*53ee8cc1Swenshuai.xi
3557*53ee8cc1Swenshuai.xi // this is not a bug. Intend to lock to mutex to prevent alive task accessing TSP after power off
3558*53ee8cc1Swenshuai.xi return DRVTSP_OK;
3559*53ee8cc1Swenshuai.xi }
3560*53ee8cc1Swenshuai.xi
3561*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3562*53ee8cc1Swenshuai.xi /// Resume TSP driver
3563*53ee8cc1Swenshuai.xi /// @return TSP_Result
3564*53ee8cc1Swenshuai.xi /// @note
3565*53ee8cc1Swenshuai.xi /// Restore TSP driver states from DRAM
3566*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Resume(MS_PHY phyFWAddr,MS_U32 u32FWSize)3567*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Resume(MS_PHY phyFWAddr, MS_U32 u32FWSize)
3568*53ee8cc1Swenshuai.xi {
3569*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
3570*53ee8cc1Swenshuai.xi if(_u32LibMode == DRVTSP_CMD_LIB_MODE_KRN)
3571*53ee8cc1Swenshuai.xi {
3572*53ee8cc1Swenshuai.xi HAL_TSP_CMD_Run(HAL_CMD_SET_KRSTR_MODE, 2, 0, 0);
3573*53ee8cc1Swenshuai.xi }
3574*53ee8cc1Swenshuai.xi #endif
3575*53ee8cc1Swenshuai.xi
3576*53ee8cc1Swenshuai.xi // Reset TSP register
3577*53ee8cc1Swenshuai.xi //HAL_ResetAll();
3578*53ee8cc1Swenshuai.xi //MsOS_DelayTask(5);
3579*53ee8cc1Swenshuai.xi
3580*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[0].TSPStatus = E_DRVTSP_SW_RESUME;
3581*53ee8cc1Swenshuai.xi
3582*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
3583*53ee8cc1Swenshuai.xi if(_u32LibMode == DRVTSP_CMD_LIB_MODE_KRN)
3584*53ee8cc1Swenshuai.xi {
3585*53ee8cc1Swenshuai.xi MS_U8 *pu8tr = 0;
3586*53ee8cc1Swenshuai.xi
3587*53ee8cc1Swenshuai.xi pu8tr = (MS_U8*)MS_PA2KSEG1(phyFWAddr);
3588*53ee8cc1Swenshuai.xi memcpy(pu8tr, u8TSPFirmware, sizeof(u8TSPFirmware));
3589*53ee8cc1Swenshuai.xi }
3590*53ee8cc1Swenshuai.xi #endif
3591*53ee8cc1Swenshuai.xi
3592*53ee8cc1Swenshuai.xi _ptsp_res->_phyFwAddr = phyFWAddr;
3593*53ee8cc1Swenshuai.xi _ptsp_res->_u32FwSize = u32FWSize;
3594*53ee8cc1Swenshuai.xi //printf("[%s][%d] TSPStatus %x \n", __FUNCTION__, __LINE__, (int)_ptsp_res->_TspState[0].TSPStatus);
3595*53ee8cc1Swenshuai.xi
3596*53ee8cc1Swenshuai.xi if(_TSP_Init(FALSE, TRUE) != DRVTSP_OK)
3597*53ee8cc1Swenshuai.xi {
3598*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3599*53ee8cc1Swenshuai.xi }
3600*53ee8cc1Swenshuai.xi
3601*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
3602*53ee8cc1Swenshuai.xi if(_u32LibMode == DRVTSP_CMD_LIB_MODE_KRN)
3603*53ee8cc1Swenshuai.xi {
3604*53ee8cc1Swenshuai.xi HAL_TSP_RestoreRegs();
3605*53ee8cc1Swenshuai.xi }
3606*53ee8cc1Swenshuai.xi #endif
3607*53ee8cc1Swenshuai.xi
3608*53ee8cc1Swenshuai.xi if(MDrv_TSP_SetOperateMode(0, E_DRVTSP_CTRL_MODE_TS0, 0) != DRVTSP_OK)
3609*53ee8cc1Swenshuai.xi {
3610*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3611*53ee8cc1Swenshuai.xi }
3612*53ee8cc1Swenshuai.xi
3613*53ee8cc1Swenshuai.xi _TSP_STR_ENTRY();
3614*53ee8cc1Swenshuai.xi
3615*53ee8cc1Swenshuai.xi if(_TSP_SelPad(0, E_DRVTSP_IF_TS0, &_ptsp_res->_ifset_save) != DRVTSP_OK)
3616*53ee8cc1Swenshuai.xi {
3617*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_FAIL);
3618*53ee8cc1Swenshuai.xi }
3619*53ee8cc1Swenshuai.xi
3620*53ee8cc1Swenshuai.xi //_ptsp_res->_TspState[0].TSPStatus = E_DRVTSP_SW_INIT;
3621*53ee8cc1Swenshuai.xi
3622*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_OK);
3623*53ee8cc1Swenshuai.xi
3624*53ee8cc1Swenshuai.xi }
3625*53ee8cc1Swenshuai.xi
MDrv_TSP_Resume_Filter(void)3626*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Resume_Filter(void)
3627*53ee8cc1Swenshuai.xi {
3628*53ee8cc1Swenshuai.xi MS_U32 u32EngId, u32FilterId;
3629*53ee8cc1Swenshuai.xi
3630*53ee8cc1Swenshuai.xi for (u32EngId = 0; u32EngId < TSP_ENGINE_NUM; u32EngId++)
3631*53ee8cc1Swenshuai.xi {
3632*53ee8cc1Swenshuai.xi for (u32FilterId = 0; u32FilterId < TSP_PIDFLT_NUM_ALL; u32FilterId++)
3633*53ee8cc1Swenshuai.xi {
3634*53ee8cc1Swenshuai.xi if((_ptsp_res->_TspState[u32EngId].FltState[u32FilterId] != E_DRVTSP_FLT_STATE_NA) &&
3635*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltState[u32FilterId] & E_DRVTSP_FLT_STATE_SUSPEND))
3636*53ee8cc1Swenshuai.xi {
3637*53ee8cc1Swenshuai.xi RESET_FLAG(_ptsp_res->_TspState[u32EngId].FltState[u32FilterId], E_DRVTSP_FLT_STATE_SUSPEND);
3638*53ee8cc1Swenshuai.xi //printf("[%s][%d] enable flt %d, sec %x, %x\n", __FUNCTION__, __LINE__, (int)u32FilterId,
3639*53ee8cc1Swenshuai.xi // (int)_ptsp_res->_TspState[u32EngId].FltMap[u32FilterId], (int)_ptsp_res->_TspState[u32EngId].FltType[u32FilterId]);
3640*53ee8cc1Swenshuai.xi MDrv_TSP_PidFlt_Enable(u32EngId, u32FilterId, TRUE);
3641*53ee8cc1Swenshuai.xi }
3642*53ee8cc1Swenshuai.xi }
3643*53ee8cc1Swenshuai.xi }
3644*53ee8cc1Swenshuai.xi
3645*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
3646*53ee8cc1Swenshuai.xi if(_u32LibMode == DRVTSP_CMD_LIB_MODE_KRN)
3647*53ee8cc1Swenshuai.xi {
3648*53ee8cc1Swenshuai.xi HAL_TSP_CMD_Run(HAL_CMD_SET_KRSTR_MODE, 0, 0, 0);
3649*53ee8cc1Swenshuai.xi _ptsp_res->_bKerStrSuspend = FALSE;
3650*53ee8cc1Swenshuai.xi }
3651*53ee8cc1Swenshuai.xi #endif
3652*53ee8cc1Swenshuai.xi
3653*53ee8cc1Swenshuai.xi return DRVTSP_OK;
3654*53ee8cc1Swenshuai.xi }
3655*53ee8cc1Swenshuai.xi
3656*53ee8cc1Swenshuai.xi // Misc API
3657*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3658*53ee8cc1Swenshuai.xi /// Set TSP engine operating mode
3659*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
3660*53ee8cc1Swenshuai.xi /// @param eCtrlMode \b IN: TSP engine operating mode
3661*53ee8cc1Swenshuai.xi /// @param u8DscmbEngSel \b IN: DSCMB Engine ID. IF 0xFF, not use DSCMB engine
3662*53ee8cc1Swenshuai.xi /// @return TSP_Result
3663*53ee8cc1Swenshuai.xi /// @note
3664*53ee8cc1Swenshuai.xi /// Only one engine can be set to use memory stream input mode, and all kinds
3665*53ee8cc1Swenshuai.xi /// of input are mutually exclusive for each engine.\n
3666*53ee8cc1Swenshuai.xi /// Only one engine can output to MAD. The TSP engine which is not selected to
3667*53ee8cc1Swenshuai.xi /// MAD can not filter any audio stream, it will block the stream.
3668*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PidFlt_Alloc, MDrv_TSP_PidFlt_Enable, E_DRVTSP_FLT_TYPE_AUDIO
3669*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SetOperateMode(MS_U32 u32EngId,DrvTSP_CtrlMode eCtrlMode,MS_U8 u8DscmbEngSel)3670*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetOperateMode(MS_U32 u32EngId, DrvTSP_CtrlMode eCtrlMode, MS_U8 u8DscmbEngSel) // Set TSP internal operate
3671*53ee8cc1Swenshuai.xi {
3672*53ee8cc1Swenshuai.xi MS_U8 u8ScmSrcTsif = 0, u8OrgCaEng = 0;
3673*53ee8cc1Swenshuai.xi MS_U32 u32ScmDest = 0;
3674*53ee8cc1Swenshuai.xi MS_U32 u32OrgDest = 0;
3675*53ee8cc1Swenshuai.xi MS_BOOL bClearOrgPath = FALSE;
3676*53ee8cc1Swenshuai.xi MS_U8 u8OrgSrc = 0;
3677*53ee8cc1Swenshuai.xi DrvTSP_FltType eFltType = 0;
3678*53ee8cc1Swenshuai.xi
3679*53ee8cc1Swenshuai.xi _TSP_STR_ENTRY();
3680*53ee8cc1Swenshuai.xi
3681*53ee8cc1Swenshuai.xi if (u32EngId >= TSP_ENGINE_NUM)
3682*53ee8cc1Swenshuai.xi {
3683*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_FAIL);
3684*53ee8cc1Swenshuai.xi }
3685*53ee8cc1Swenshuai.xi
3686*53ee8cc1Swenshuai.xi // reset audio BD mode
3687*53ee8cc1Swenshuai.xi HAL_TSP_AU_BD_Mode_Enable(FALSE);
3688*53ee8cc1Swenshuai.xi
3689*53ee8cc1Swenshuai.xi switch (eCtrlMode)
3690*53ee8cc1Swenshuai.xi {
3691*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS0:
3692*53ee8cc1Swenshuai.xi eFltType = E_DRVTSP_FLT_SOURCE_TYPE_LIVE;
3693*53ee8cc1Swenshuai.xi break;
3694*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS1:
3695*53ee8cc1Swenshuai.xi eFltType = E_DRVTSP_FLT_SOURCE_TYPE_TS1 | E_DRVTSP_FLT_SOURCE_TYPE_FILE1;
3696*53ee8cc1Swenshuai.xi break;
3697*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS2:
3698*53ee8cc1Swenshuai.xi eFltType = E_DRVTSP_FLT_SOURCE_TYPE_TS2 | E_DRVTSP_FLT_SOURCE_TYPE_FILE2;
3699*53ee8cc1Swenshuai.xi break;
3700*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
3701*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TSFI_LIVE:
3702*53ee8cc1Swenshuai.xi #endif
3703*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_MEM:
3704*53ee8cc1Swenshuai.xi eFltType = E_DRVTSP_FLT_SOURCE_TYPE_FILE;
3705*53ee8cc1Swenshuai.xi break;
3706*53ee8cc1Swenshuai.xi default:
3707*53ee8cc1Swenshuai.xi break;
3708*53ee8cc1Swenshuai.xi }
3709*53ee8cc1Swenshuai.xi
3710*53ee8cc1Swenshuai.xi u8OrgCaEng = _TSP_Get_DscmbEngId_ByFltSrc(eFltType);
3711*53ee8cc1Swenshuai.xi if(u8OrgCaEng != u8DscmbEngSel)
3712*53ee8cc1Swenshuai.xi {
3713*53ee8cc1Swenshuai.xi if(eFltType != 0)
3714*53ee8cc1Swenshuai.xi {
3715*53ee8cc1Swenshuai.xi if(u8DscmbEngSel < TSP_CA_ENGINE_NUM)
3716*53ee8cc1Swenshuai.xi {
3717*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[u8DscmbEngSel].u32Src |= eFltType;
3718*53ee8cc1Swenshuai.xi }
3719*53ee8cc1Swenshuai.xi if(u8OrgCaEng < TSP_CA_ENGINE_NUM)
3720*53ee8cc1Swenshuai.xi {
3721*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[u8OrgCaEng].u32Src &= ~eFltType;
3722*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Get_CACtrl(u8OrgCaEng,&u8OrgSrc,&u32OrgDest);
3723*53ee8cc1Swenshuai.xi
3724*53ee8cc1Swenshuai.xi //do not clear ca control, if the ca control is not set for original source
3725*53ee8cc1Swenshuai.xi if((eCtrlMode == E_DRVTSP_CTRL_MODE_TS0) && (u8OrgSrc == TSP_SRC_FROM_TSIF0_LIVE) && (u32OrgDest & TSP_PKTDMX0_LIVE))
3726*53ee8cc1Swenshuai.xi bClearOrgPath = TRUE;
3727*53ee8cc1Swenshuai.xi else if((eCtrlMode == E_DRVTSP_CTRL_MODE_MEM) && (u8OrgSrc == TSP_SRC_FROM_TSIF0_FILE) && (u32OrgDest & TSP_PKTDMX0_FILE))
3728*53ee8cc1Swenshuai.xi bClearOrgPath = TRUE;
3729*53ee8cc1Swenshuai.xi else if((eCtrlMode == E_DRVTSP_CTRL_MODE_TS1) && (u8OrgSrc == TSP_SRC_FROM_TSIF1) && (u32OrgDest & TSP_PKTDMX1))
3730*53ee8cc1Swenshuai.xi bClearOrgPath = TRUE;
3731*53ee8cc1Swenshuai.xi else if((eCtrlMode == E_DRVTSP_CTRL_MODE_TS2) && (u8OrgSrc == TSP_SRC_FROM_TSIF2) && (u32OrgDest & TSP_PKTDMX2))
3732*53ee8cc1Swenshuai.xi bClearOrgPath = TRUE;
3733*53ee8cc1Swenshuai.xi
3734*53ee8cc1Swenshuai.xi if(bClearOrgPath)
3735*53ee8cc1Swenshuai.xi {
3736*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(u8OrgCaEng, 0);
3737*53ee8cc1Swenshuai.xi }
3738*53ee8cc1Swenshuai.xi }
3739*53ee8cc1Swenshuai.xi }
3740*53ee8cc1Swenshuai.xi }
3741*53ee8cc1Swenshuai.xi
3742*53ee8cc1Swenshuai.xi //printf("[%s] eCtrlMode %d , u8DscmbEngSel %d\n", __FUNCTION__, (int)eCtrlMode, (int)u8DscmbEngSel);
3743*53ee8cc1Swenshuai.xi
3744*53ee8cc1Swenshuai.xi switch (eCtrlMode)
3745*53ee8cc1Swenshuai.xi {
3746*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS0:
3747*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
3748*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_CACtrl(u8DscmbEngSel, TSP_SRC_FROM_TSIF0_LIVE, TSP_PKTDMX0_LIVE);
3749*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(u32EngId, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 0);
3750*53ee8cc1Swenshuai.xi break;
3751*53ee8cc1Swenshuai.xi
3752*53ee8cc1Swenshuai.xi #if (TSP_IF_NUM >= 1)
3753*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS1:
3754*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
3755*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_CACtrl(u8DscmbEngSel, TSP_SRC_FROM_TSIF1, TSP_PKTDMX1);
3756*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(u32EngId, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 1);
3757*53ee8cc1Swenshuai.xi break;
3758*53ee8cc1Swenshuai.xi
3759*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS2:
3760*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
3761*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_CACtrl(u8DscmbEngSel, TSP_SRC_FROM_TSIF2, TSP_PKTDMX2);
3762*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(u32EngId, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 2);
3763*53ee8cc1Swenshuai.xi break;
3764*53ee8cc1Swenshuai.xi
3765*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TS3:
3766*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
3767*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(u32EngId, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 3);
3768*53ee8cc1Swenshuai.xi break;
3769*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
3770*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_TSFI_LIVE:
3771*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
3772*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_CACtrl(u8DscmbEngSel, TSP_SRC_FROM_TSIF0_FILE, TSP_PKTDMX0_FILE);
3773*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(u32EngId, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST, 3);
3774*53ee8cc1Swenshuai.xi break;
3775*53ee8cc1Swenshuai.xi #endif
3776*53ee8cc1Swenshuai.xi #endif
3777*53ee8cc1Swenshuai.xi
3778*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_MEM:
3779*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
3780*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Get_CACtrl(u8DscmbEngSel, &u8ScmSrcTsif, &u32ScmDest);
3781*53ee8cc1Swenshuai.xi if(HAL_TSP_PVR_StartingEngs_Get(u32ScmDest) == 0)
3782*53ee8cc1Swenshuai.xi {
3783*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_CACtrl(u8DscmbEngSel, TSP_SRC_FROM_TSIF0_FILE, TSP_PKTDMX0_FILE);
3784*53ee8cc1Swenshuai.xi }
3785*53ee8cc1Swenshuai.xi HAL_TSP_SetCtrlMode(u32EngId, TSP_CTRL_CPU_EN | TSP_CTRL_SW_RST| TSP_CTRL_TSFILE_EN, TSP_IF_NUM);
3786*53ee8cc1Swenshuai.xi break;
3787*53ee8cc1Swenshuai.xi
3788*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_PVR_CA:
3789*53ee8cc1Swenshuai.xi case E_DRVTSP_CTRL_MODE_PVR1_CA:
3790*53ee8cc1Swenshuai.xi break;
3791*53ee8cc1Swenshuai.xi
3792*53ee8cc1Swenshuai.xi default:
3793*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_FAIL);
3794*53ee8cc1Swenshuai.xi break;
3795*53ee8cc1Swenshuai.xi }
3796*53ee8cc1Swenshuai.xi
3797*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_OK);
3798*53ee8cc1Swenshuai.xi }
3799*53ee8cc1Swenshuai.xi
3800*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3801*53ee8cc1Swenshuai.xi /// Select ChipTop PAD for ts0 and ts1
3802*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
3803*53ee8cc1Swenshuai.xi /// @param eIf \b IN: TSP TS interface
3804*53ee8cc1Swenshuai.xi /// @param pIfSet \b IN: TS interface setting
3805*53ee8cc1Swenshuai.xi /// @return TSP_Result
3806*53ee8cc1Swenshuai.xi /// @note
3807*53ee8cc1Swenshuai.xi /// Uranus: only can select pad0/pad1 to ts0
3808*53ee8cc1Swenshuai.xi /// Oberon: can select pad0/pad1 to ts0, pad0/pad1 to ts1.
3809*53ee8cc1Swenshuai.xi /// Default setting was pad0->ts0, pad1->ts1.
3810*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SelPad(MS_U32 u32EngId,DrvTSP_If eIf,DrvTSP_If_Set * pIfSet)3811*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SelPad(MS_U32 u32EngId, DrvTSP_If eIf, DrvTSP_If_Set* pIfSet)
3812*53ee8cc1Swenshuai.xi {
3813*53ee8cc1Swenshuai.xi TSP_Result bRet;
3814*53ee8cc1Swenshuai.xi
3815*53ee8cc1Swenshuai.xi _TSP_ENTRY();
3816*53ee8cc1Swenshuai.xi bRet = _TSP_SelPad(u32EngId, eIf, pIfSet);
3817*53ee8cc1Swenshuai.xi
3818*53ee8cc1Swenshuai.xi _TSP_RETURN(bRet);
3819*53ee8cc1Swenshuai.xi }
3820*53ee8cc1Swenshuai.xi
3821*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3822*53ee8cc1Swenshuai.xi /// Configure output pad
3823*53ee8cc1Swenshuai.xi /// @param eOutputPad \b IN: Output pad & Output pad mode
3824*53ee8cc1Swenshuai.xi /// @param eInputPad \b IN: Source of Input pad
3825*53ee8cc1Swenshuai.xi /// @param bInParallel \b IN: TRUE: Input pad mode is parallel; FALSE: Input pad mode is serial
3826*53ee8cc1Swenshuai.xi /// @return TSP_Result
3827*53ee8cc1Swenshuai.xi /// @note
3828*53ee8cc1Swenshuai.xi /// Only EXT_PAD1 and EXT_PAD3 has output mode
3829*53ee8cc1Swenshuai.xi ///
3830*53ee8cc1Swenshuai.xi /// If output from S2P mode, input source should be external input pad only
3831*53ee8cc1Swenshuai.xi /// If output from TSO mode, eInputPad should be E_DRVTSP_PAD_TSO
3832*53ee8cc1Swenshuai.xi /// If input source is internal demod, output mode can be demod out or TSO out
3833*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_OutputPadCfg(DrvTSP_PadOut eOutputPad,DrvTSP_PadIn eInputPad,MS_BOOL bInParallel,MS_BOOL bEnable)3834*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_OutputPadCfg(DrvTSP_PadOut eOutputPad, DrvTSP_PadIn eInputPad, MS_BOOL bInParallel, MS_BOOL bEnable)
3835*53ee8cc1Swenshuai.xi {
3836*53ee8cc1Swenshuai.xi #if (TSP_TS_PAD_NUM > 1UL)
3837*53ee8cc1Swenshuai.xi MS_U32 u32InPad;
3838*53ee8cc1Swenshuai.xi MS_U32 u32OutPad = (eOutputPad & ~E_DRVTSP_OUTPAD_MODE_MASK);
3839*53ee8cc1Swenshuai.xi MS_U32 u32OutPadMode = eOutputPad & E_DRVTSP_OUTPAD_MODE_MASK;
3840*53ee8cc1Swenshuai.xi
3841*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s][%d] eOutputPad %lx, eInputPad %x, bInParallel %d, bEnable %d\n", __FUNCTION__, __LINE__, eOutputPad, (int)eInputPad, (int)bInParallel, (int)bEnable);
3842*53ee8cc1Swenshuai.xi
3843*53ee8cc1Swenshuai.xi if(!((u32OutPad == E_DRVTSP_OUTPAD_PAD1) || (u32OutPad == E_DRVTSP_OUTPAD_PAD3)))
3844*53ee8cc1Swenshuai.xi {
3845*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3846*53ee8cc1Swenshuai.xi }
3847*53ee8cc1Swenshuai.xi
3848*53ee8cc1Swenshuai.xi if(bEnable == FALSE)
3849*53ee8cc1Swenshuai.xi {
3850*53ee8cc1Swenshuai.xi u32InPad = TSP_MUX_NONE;
3851*53ee8cc1Swenshuai.xi }
3852*53ee8cc1Swenshuai.xi else
3853*53ee8cc1Swenshuai.xi {
3854*53ee8cc1Swenshuai.xi switch(eInputPad)
3855*53ee8cc1Swenshuai.xi {
3856*53ee8cc1Swenshuai.xi case E_DRVTSP_PAD_EXT_INPUT0:
3857*53ee8cc1Swenshuai.xi u32InPad = TSP_MUX_TS0;
3858*53ee8cc1Swenshuai.xi break;
3859*53ee8cc1Swenshuai.xi case E_DRVTSP_PAD_EXT_INPUT1:
3860*53ee8cc1Swenshuai.xi u32InPad = TSP_MUX_TS1;
3861*53ee8cc1Swenshuai.xi break;
3862*53ee8cc1Swenshuai.xi case E_DRVTSP_PAD_EXT_INPUT2:
3863*53ee8cc1Swenshuai.xi u32InPad = TSP_MUX_TS2;
3864*53ee8cc1Swenshuai.xi break;
3865*53ee8cc1Swenshuai.xi #if defined(TSP_MUX_TS3)
3866*53ee8cc1Swenshuai.xi case E_DRVTSP_PAD_EXT_INPUT3:
3867*53ee8cc1Swenshuai.xi u32InPad = TSP_MUX_TS3;
3868*53ee8cc1Swenshuai.xi break;
3869*53ee8cc1Swenshuai.xi #endif
3870*53ee8cc1Swenshuai.xi #if defined(TSP_MUX_TS4)
3871*53ee8cc1Swenshuai.xi case E_DRVTSP_PAD_EXT_INPUT4:
3872*53ee8cc1Swenshuai.xi u32InPad = TSP_MUX_TS4;
3873*53ee8cc1Swenshuai.xi break;
3874*53ee8cc1Swenshuai.xi #endif
3875*53ee8cc1Swenshuai.xi #if defined(TSP_MUX_TS5)
3876*53ee8cc1Swenshuai.xi case E_DRVTSP_PAD_EXT_INPUT5:
3877*53ee8cc1Swenshuai.xi u32InPad = TSP_MUX_TS5;
3878*53ee8cc1Swenshuai.xi break;
3879*53ee8cc1Swenshuai.xi #endif
3880*53ee8cc1Swenshuai.xi case E_DRVTSP_PAD_DEMOD:
3881*53ee8cc1Swenshuai.xi u32InPad = TSP_MUX_INDEMOD;
3882*53ee8cc1Swenshuai.xi break;
3883*53ee8cc1Swenshuai.xi case E_DRVTSP_PAD_TSO:
3884*53ee8cc1Swenshuai.xi u32InPad = TSP_MUX_TSO;
3885*53ee8cc1Swenshuai.xi break;
3886*53ee8cc1Swenshuai.xi default:
3887*53ee8cc1Swenshuai.xi u32InPad = TSP_MUX_NONE;
3888*53ee8cc1Swenshuai.xi break;
3889*53ee8cc1Swenshuai.xi }
3890*53ee8cc1Swenshuai.xi }
3891*53ee8cc1Swenshuai.xi
3892*53ee8cc1Swenshuai.xi _TSP_ENTRY();
3893*53ee8cc1Swenshuai.xi
3894*53ee8cc1Swenshuai.xi if(HAL_TSP_TsOutPadCfg(u32OutPad, u32OutPadMode, u32InPad, bInParallel) == FALSE)
3895*53ee8cc1Swenshuai.xi {
3896*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
3897*53ee8cc1Swenshuai.xi }
3898*53ee8cc1Swenshuai.xi else
3899*53ee8cc1Swenshuai.xi {
3900*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
3901*53ee8cc1Swenshuai.xi }
3902*53ee8cc1Swenshuai.xi
3903*53ee8cc1Swenshuai.xi #else
3904*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3905*53ee8cc1Swenshuai.xi #endif
3906*53ee8cc1Swenshuai.xi }
3907*53ee8cc1Swenshuai.xi
3908*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3909*53ee8cc1Swenshuai.xi /// Set TS out pad clock phase
3910*53ee8cc1Swenshuai.xi /// @param u16OutPad \b IN: Reserved for future using
3911*53ee8cc1Swenshuai.xi /// @param u16Val \b IN: Clock phase tuning value
3912*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: TRUE:Enable Clock phase tuning; FALSE: Disable Clock phase tuning
3913*53ee8cc1Swenshuai.xi /// @return TSP_Result
3914*53ee8cc1Swenshuai.xi /// @note
3915*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_OutputClkPhase(MS_U16 u16OutPad,MS_U16 u16Val,MS_BOOL bEnable,MS_U32 u32S2pOpt)3916*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_OutputClkPhase(MS_U16 u16OutPad, MS_U16 u16Val, MS_BOOL bEnable, MS_U32 u32S2pOpt)
3917*53ee8cc1Swenshuai.xi {
3918*53ee8cc1Swenshuai.xi
3919*53ee8cc1Swenshuai.xi #if (defined(TSO_20_ENABLE) && (TSP_TS_PAD_NUM > 1))
3920*53ee8cc1Swenshuai.xi
3921*53ee8cc1Swenshuai.xi _TSP_ENTRY();
3922*53ee8cc1Swenshuai.xi
3923*53ee8cc1Swenshuai.xi if(HAL_TSP_TsOuOutClockPhase(u16OutPad, u16Val, bEnable, u32S2pOpt) == TRUE)
3924*53ee8cc1Swenshuai.xi {
3925*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
3926*53ee8cc1Swenshuai.xi }
3927*53ee8cc1Swenshuai.xi else
3928*53ee8cc1Swenshuai.xi {
3929*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
3930*53ee8cc1Swenshuai.xi }
3931*53ee8cc1Swenshuai.xi #else
3932*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
3933*53ee8cc1Swenshuai.xi #endif
3934*53ee8cc1Swenshuai.xi
3935*53ee8cc1Swenshuai.xi }
3936*53ee8cc1Swenshuai.xi
3937*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3938*53ee8cc1Swenshuai.xi // Inverting bit order of TS parallel input
3939*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
3940*53ee8cc1Swenshuai.xi // @param eIf \b IN: TSP TS interface
3941*53ee8cc1Swenshuai.xi // @param bInvert \b IN: bit order invert [1:invert 0:not invert]
3942*53ee8cc1Swenshuai.xi // @return TSP_Result
3943*53ee8cc1Swenshuai.xi // @note
3944*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Parl_BitOrderSwap(MS_U32 u32EngId,DrvTSP_If eIf,MS_BOOL bInvert)3945*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Parl_BitOrderSwap(MS_U32 u32EngId, DrvTSP_If eIf, MS_BOOL bInvert)
3946*53ee8cc1Swenshuai.xi {
3947*53ee8cc1Swenshuai.xi MS_U32 u32Flow = 0;
3948*53ee8cc1Swenshuai.xi _TSP_ENTRY();
3949*53ee8cc1Swenshuai.xi if (u32EngId>= TSP_ENGINE_NUM)
3950*53ee8cc1Swenshuai.xi {
3951*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
3952*53ee8cc1Swenshuai.xi }
3953*53ee8cc1Swenshuai.xi
3954*53ee8cc1Swenshuai.xi switch (eIf)
3955*53ee8cc1Swenshuai.xi {
3956*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_TS0:
3957*53ee8cc1Swenshuai.xi u32Flow = 0;
3958*53ee8cc1Swenshuai.xi break;
3959*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_TS1:
3960*53ee8cc1Swenshuai.xi u32Flow = 1;
3961*53ee8cc1Swenshuai.xi break;
3962*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_TS2:
3963*53ee8cc1Swenshuai.xi u32Flow = 2;
3964*53ee8cc1Swenshuai.xi break;
3965*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_TS3:
3966*53ee8cc1Swenshuai.xi u32Flow = 3;
3967*53ee8cc1Swenshuai.xi break;
3968*53ee8cc1Swenshuai.xi default:
3969*53ee8cc1Swenshuai.xi MS_ASSERT(0);
3970*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
3971*53ee8cc1Swenshuai.xi }
3972*53ee8cc1Swenshuai.xi HAL_TSP_Parl_BitOrderSwap(u32EngId, u32Flow, bInvert);
3973*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
3974*53ee8cc1Swenshuai.xi }
3975*53ee8cc1Swenshuai.xi
3976*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
3977*53ee8cc1Swenshuai.xi /// Reset audio/video fifo or not
3978*53ee8cc1Swenshuai.xi /// @return TSP_Result
3979*53ee8cc1Swenshuai.xi /// @note
3980*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_AVFifo_Reset(DrvTSP_FltType eFilterType,MS_BOOL bFlush)3981*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_AVFifo_Reset(DrvTSP_FltType eFilterType, MS_BOOL bFlush)
3982*53ee8cc1Swenshuai.xi {
3983*53ee8cc1Swenshuai.xi _TSP_ENTRY();
3984*53ee8cc1Swenshuai.xi switch (eFilterType)
3985*53ee8cc1Swenshuai.xi {
3986*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO:
3987*53ee8cc1Swenshuai.xi HAL_TSP_Flush_AV_FIFO(0, bFlush);
3988*53ee8cc1Swenshuai.xi break;
3989*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO:
3990*53ee8cc1Swenshuai.xi HAL_TSP_Flush_AV_FIFO(1, bFlush);
3991*53ee8cc1Swenshuai.xi break;
3992*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO2:
3993*53ee8cc1Swenshuai.xi HAL_TSP_Flush_AV_FIFO(2, bFlush);
3994*53ee8cc1Swenshuai.xi break;
3995*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO3D:
3996*53ee8cc1Swenshuai.xi HAL_TSP_Flush_AV_FIFO(3, bFlush);
3997*53ee8cc1Swenshuai.xi break;
3998*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO3:
3999*53ee8cc1Swenshuai.xi HAL_TSP_Flush_AV_FIFO(4, bFlush);
4000*53ee8cc1Swenshuai.xi break;
4001*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO4:
4002*53ee8cc1Swenshuai.xi HAL_TSP_Flush_AV_FIFO(5, bFlush);
4003*53ee8cc1Swenshuai.xi break;
4004*53ee8cc1Swenshuai.xi default:
4005*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4006*53ee8cc1Swenshuai.xi }
4007*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4008*53ee8cc1Swenshuai.xi }
4009*53ee8cc1Swenshuai.xi
MDrv_TSP_AVFifo_Status(DrvTSP_FltType eFilterType,MS_U32 * u32FifoLevel)4010*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_AVFifo_Status(DrvTSP_FltType eFilterType, MS_U32 *u32FifoLevel)
4011*53ee8cc1Swenshuai.xi {
4012*53ee8cc1Swenshuai.xi *u32FifoLevel = 0xFFFFFFFFUL;
4013*53ee8cc1Swenshuai.xi
4014*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4015*53ee8cc1Swenshuai.xi switch (eFilterType)
4016*53ee8cc1Swenshuai.xi {
4017*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO:
4018*53ee8cc1Swenshuai.xi *u32FifoLevel = HAL_TSP_Get_AVFifoLevel(0);
4019*53ee8cc1Swenshuai.xi break;
4020*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO:
4021*53ee8cc1Swenshuai.xi *u32FifoLevel = HAL_TSP_Get_AVFifoLevel(1);
4022*53ee8cc1Swenshuai.xi break;
4023*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO2:
4024*53ee8cc1Swenshuai.xi *u32FifoLevel = HAL_TSP_Get_AVFifoLevel(2);
4025*53ee8cc1Swenshuai.xi break;
4026*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO3D:
4027*53ee8cc1Swenshuai.xi *u32FifoLevel = HAL_TSP_Get_AVFifoLevel(3);
4028*53ee8cc1Swenshuai.xi break;
4029*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO3:
4030*53ee8cc1Swenshuai.xi *u32FifoLevel = HAL_TSP_Get_AVFifoLevel(4);
4031*53ee8cc1Swenshuai.xi break;
4032*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO4:
4033*53ee8cc1Swenshuai.xi *u32FifoLevel = HAL_TSP_Get_AVFifoLevel(5);
4034*53ee8cc1Swenshuai.xi break;
4035*53ee8cc1Swenshuai.xi default:
4036*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4037*53ee8cc1Swenshuai.xi }
4038*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4039*53ee8cc1Swenshuai.xi }
4040*53ee8cc1Swenshuai.xi
MDrv_TSP_AVFifo_BlockEnable(DrvTSP_FltType eFilterType,MS_BOOL bEnable)4041*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_AVFifo_BlockEnable(DrvTSP_FltType eFilterType, MS_BOOL bEnable)
4042*53ee8cc1Swenshuai.xi {
4043*53ee8cc1Swenshuai.xi MS_BOOL bAVFIFO_BLK_Disable = !bEnable;
4044*53ee8cc1Swenshuai.xi MS_U32 u32Fifo = 0;
4045*53ee8cc1Swenshuai.xi
4046*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4047*53ee8cc1Swenshuai.xi switch (eFilterType)
4048*53ee8cc1Swenshuai.xi {
4049*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO:
4050*53ee8cc1Swenshuai.xi u32Fifo = TSP_FIFO_VD;
4051*53ee8cc1Swenshuai.xi break;
4052*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO:
4053*53ee8cc1Swenshuai.xi u32Fifo = TSP_FIFO_AU;
4054*53ee8cc1Swenshuai.xi break;
4055*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO2:
4056*53ee8cc1Swenshuai.xi u32Fifo = TSP_FIFO_AUB;
4057*53ee8cc1Swenshuai.xi break;
4058*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO3D:
4059*53ee8cc1Swenshuai.xi u32Fifo = TSP_FIFO_V3D;
4060*53ee8cc1Swenshuai.xi break;
4061*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO3:
4062*53ee8cc1Swenshuai.xi u32Fifo = TSP_FIFO_AUC;
4063*53ee8cc1Swenshuai.xi break;
4064*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO4:
4065*53ee8cc1Swenshuai.xi u32Fifo = TSP_FIFO_AUD;
4066*53ee8cc1Swenshuai.xi break;
4067*53ee8cc1Swenshuai.xi default:
4068*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4069*53ee8cc1Swenshuai.xi }
4070*53ee8cc1Swenshuai.xi
4071*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Block_Disable(u32Fifo, bAVFIFO_BLK_Disable);
4072*53ee8cc1Swenshuai.xi
4073*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4074*53ee8cc1Swenshuai.xi }
4075*53ee8cc1Swenshuai.xi
MDrv_TSP_AVFifo_SourceSelect(DrvTSP_PKTDMXSrcType ePKTSrc,MS_U32 u32FifoType)4076*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_AVFifo_SourceSelect(DrvTSP_PKTDMXSrcType ePKTSrc, MS_U32 u32FifoType)
4077*53ee8cc1Swenshuai.xi {
4078*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4079*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Src_Select(u32FifoType, ePKTSrc);
4080*53ee8cc1Swenshuai.xi
4081*53ee8cc1Swenshuai.xi if((ePKTSrc == E_DRVTSP_PKTSRC_DEMUXFILE) || (ePKTSrc == E_DRVTSP_PKTSRC_DEMUXMMFI0) ||
4082*53ee8cc1Swenshuai.xi (ePKTSrc == E_DRVTSP_PKTSRC_DEMUXMMFI1))
4083*53ee8cc1Swenshuai.xi {
4084*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Block_Disable(u32FifoType, FALSE);
4085*53ee8cc1Swenshuai.xi }
4086*53ee8cc1Swenshuai.xi else
4087*53ee8cc1Swenshuai.xi {
4088*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Block_Disable(u32FifoType, TRUE);
4089*53ee8cc1Swenshuai.xi }
4090*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4091*53ee8cc1Swenshuai.xi }
4092*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4093*53ee8cc1Swenshuai.xi /// Get Last General Error Return Code
4094*53ee8cc1Swenshuai.xi /// @return TSP_Result
4095*53ee8cc1Swenshuai.xi /// @note
4096*53ee8cc1Swenshuai.xi /// Last error return code is reset after calling this function.
4097*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_GetLastErr(void)4098*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetLastErr(void)
4099*53ee8cc1Swenshuai.xi {
4100*53ee8cc1Swenshuai.xi TSP_Result ret;
4101*53ee8cc1Swenshuai.xi ret = (TSP_Result)(_ptsp_res->_u32LastErr);
4102*53ee8cc1Swenshuai.xi _ptsp_res->_u32LastErr = DRVTSP_OK;
4103*53ee8cc1Swenshuai.xi return ret;
4104*53ee8cc1Swenshuai.xi }
4105*53ee8cc1Swenshuai.xi
4106*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4107*53ee8cc1Swenshuai.xi /// Get TSP Flt states
4108*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4109*53ee8cc1Swenshuai.xi /// @param peState \b OUT: Flter status
4110*53ee8cc1Swenshuai.xi /// @return TSP_Result
4111*53ee8cc1Swenshuai.xi /// @note
4112*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Flt_GetState(MS_U32 u32EngId,MS_U32 u32FltId,DrvTSP_FltState * peState)4113*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Flt_GetState(MS_U32 u32EngId, MS_U32 u32FltId, DrvTSP_FltState *peState)
4114*53ee8cc1Swenshuai.xi {
4115*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4116*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32FltId, TSP_DBG("[TSP_ERROR][%06d] Bad FltId %d\n", __LINE__, (unsigned int)u32FltId));
4117*53ee8cc1Swenshuai.xi if (_TSP_Flt_StateGet(0, u32FltId, peState))
4118*53ee8cc1Swenshuai.xi {
4119*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4120*53ee8cc1Swenshuai.xi }
4121*53ee8cc1Swenshuai.xi else
4122*53ee8cc1Swenshuai.xi {
4123*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4124*53ee8cc1Swenshuai.xi }
4125*53ee8cc1Swenshuai.xi }
4126*53ee8cc1Swenshuai.xi
4127*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4128*53ee8cc1Swenshuai.xi /// Get TSP Flt states
4129*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of CA engine [ 0 .. (@ref DSCMB_ENGINE_NUM-1) ]
4130*53ee8cc1Swenshuai.xi /// @param pu32StartId \b OUT: pointer to store dscmb filter start ID
4131*53ee8cc1Swenshuai.xi /// @param pu32EndId \b OUT: pointer to store dscmb filter end ID
4132*53ee8cc1Swenshuai.xi /// @return TSP_Result
4133*53ee8cc1Swenshuai.xi /// @note
4134*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_GetDscmbFltId_Range(MS_U32 u32EngId,MS_U32 * pu32StartId,MS_U32 * pu32EndId)4135*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetDscmbFltId_Range(MS_U32 u32EngId, MS_U32 *pu32StartId, MS_U32 *pu32EndId)
4136*53ee8cc1Swenshuai.xi {
4137*53ee8cc1Swenshuai.xi MS_U8 u8ii, u8ScmSrcTsif;
4138*53ee8cc1Swenshuai.xi MS_U32 u32ScmDest, u32FltSrc;
4139*53ee8cc1Swenshuai.xi
4140*53ee8cc1Swenshuai.xi *pu32StartId = 0;
4141*53ee8cc1Swenshuai.xi *pu32EndId = 0;
4142*53ee8cc1Swenshuai.xi
4143*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4144*53ee8cc1Swenshuai.xi
4145*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Get_CACtrl(u32EngId, &u8ScmSrcTsif, &u32ScmDest);
4146*53ee8cc1Swenshuai.xi
4147*53ee8cc1Swenshuai.xi switch(u8ScmSrcTsif)
4148*53ee8cc1Swenshuai.xi {
4149*53ee8cc1Swenshuai.xi case TSP_SRC_FROM_PKTDMX0:
4150*53ee8cc1Swenshuai.xi u32FltSrc = E_DRVTSP_FLT_SOURCE_TYPE_LIVE;
4151*53ee8cc1Swenshuai.xi break;
4152*53ee8cc1Swenshuai.xi case TSP_SRC_FROM_PKTDMXFL:
4153*53ee8cc1Swenshuai.xi u32FltSrc = E_DRVTSP_FLT_SOURCE_TYPE_FILE;
4154*53ee8cc1Swenshuai.xi break;
4155*53ee8cc1Swenshuai.xi case TSP_SRC_FROM_PKTDMX1:
4156*53ee8cc1Swenshuai.xi u32FltSrc = E_DRVTSP_FLT_SOURCE_TYPE_TS1;
4157*53ee8cc1Swenshuai.xi break;
4158*53ee8cc1Swenshuai.xi case TSP_SRC_FROM_PKTDMX2:
4159*53ee8cc1Swenshuai.xi u32FltSrc = E_DRVTSP_FLT_SOURCE_TYPE_TS2;
4160*53ee8cc1Swenshuai.xi break;
4161*53ee8cc1Swenshuai.xi default:
4162*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4163*53ee8cc1Swenshuai.xi }
4164*53ee8cc1Swenshuai.xi
4165*53ee8cc1Swenshuai.xi for(u8ii = 0; u8ii < TSP_CA_ENGINE_NUM; u8ii++)
4166*53ee8cc1Swenshuai.xi {
4167*53ee8cc1Swenshuai.xi if(_ptsp_res->_DscmbFlt_State[u8ii].u32Src & u32FltSrc)
4168*53ee8cc1Swenshuai.xi {
4169*53ee8cc1Swenshuai.xi
4170*53ee8cc1Swenshuai.xi *pu32StartId = _ptsp_res->_DscmbFlt_State[u8ii].u32Start;
4171*53ee8cc1Swenshuai.xi *pu32EndId = _ptsp_res->_DscmbFlt_State[u8ii].u32End;
4172*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4173*53ee8cc1Swenshuai.xi }
4174*53ee8cc1Swenshuai.xi }
4175*53ee8cc1Swenshuai.xi
4176*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4177*53ee8cc1Swenshuai.xi }
4178*53ee8cc1Swenshuai.xi
4179*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4180*53ee8cc1Swenshuai.xi /// Get Dscmbler engine id depended on input source
4181*53ee8cc1Swenshuai.xi /// @param eInputSrc \b IN: Input source
4182*53ee8cc1Swenshuai.xi /// @param pu32EngId \b OUT: pointer to store dscmb engine ID
4183*53ee8cc1Swenshuai.xi /// @return TSP_Result
4184*53ee8cc1Swenshuai.xi /// @note
4185*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_GetDscmbEngIdx_BySource(DrvTSP_PKTDMXSrcType eInputSrc,MS_U32 * pu32EngId)4186*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetDscmbEngIdx_BySource(DrvTSP_PKTDMXSrcType eInputSrc, MS_U32* pu32EngId)
4187*53ee8cc1Swenshuai.xi {
4188*53ee8cc1Swenshuai.xi DrvTSP_FltType eFltType = 0;
4189*53ee8cc1Swenshuai.xi *pu32EngId = 0xFF;
4190*53ee8cc1Swenshuai.xi
4191*53ee8cc1Swenshuai.xi switch (eInputSrc)
4192*53ee8cc1Swenshuai.xi {
4193*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTSRC_DEMUX0:
4194*53ee8cc1Swenshuai.xi eFltType = E_DRVTSP_FLT_SOURCE_TYPE_LIVE;
4195*53ee8cc1Swenshuai.xi break;
4196*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTSRC_DEMUX1:
4197*53ee8cc1Swenshuai.xi eFltType = E_DRVTSP_FLT_SOURCE_TYPE_TS1 | E_DRVTSP_FLT_SOURCE_TYPE_FILE1;
4198*53ee8cc1Swenshuai.xi break;
4199*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTSRC_DEMUX2:
4200*53ee8cc1Swenshuai.xi eFltType = E_DRVTSP_FLT_SOURCE_TYPE_TS2 | E_DRVTSP_FLT_SOURCE_TYPE_FILE2;
4201*53ee8cc1Swenshuai.xi break;
4202*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTSRC_DEMUXFILE:
4203*53ee8cc1Swenshuai.xi eFltType = E_DRVTSP_FLT_SOURCE_TYPE_FILE;
4204*53ee8cc1Swenshuai.xi break;
4205*53ee8cc1Swenshuai.xi default:
4206*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
4207*53ee8cc1Swenshuai.xi }
4208*53ee8cc1Swenshuai.xi
4209*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4210*53ee8cc1Swenshuai.xi *pu32EngId = ((MS_U32)_TSP_Get_DscmbEngId_ByFltSrc(eFltType)) & 0xFF;
4211*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4212*53ee8cc1Swenshuai.xi
4213*53ee8cc1Swenshuai.xi }
4214*53ee8cc1Swenshuai.xi
4215*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4216*53ee8cc1Swenshuai.xi /// Set/Get Dscmb engine control path
4217*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of CA engine [ 0 .. (@ref DSCMB_ENGINE_NUM-1) ]
4218*53ee8cc1Swenshuai.xi /// @param peInputSrc \b IN/OUT: Pointer to store Dscmb Engine input source
4219*53ee8cc1Swenshuai.xi /// @param bSet \b IN: Get or set dscmb eingine path
4220*53ee8cc1Swenshuai.xi /// @return TSP_Result
4221*53ee8cc1Swenshuai.xi /// @note
4222*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Dscmb_Source(MS_U32 u32EngId,DrvTSP_PKTDMXSrcType * peInputSrc,MS_BOOL bSet)4223*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Dscmb_Source(MS_U32 u32EngId, DrvTSP_PKTDMXSrcType* peInputSrc, MS_BOOL bSet)
4224*53ee8cc1Swenshuai.xi {
4225*53ee8cc1Swenshuai.xi TSP_ASSERT(u32EngId < TSP_CA_ENGINE_NUM, TSP_DBG("[TSP_ERROR][%06d] Bad Dscmb Id %d\n", __LINE__, (int)u32EngId));
4226*53ee8cc1Swenshuai.xi
4227*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4228*53ee8cc1Swenshuai.xi
4229*53ee8cc1Swenshuai.xi if(bSet == FALSE)
4230*53ee8cc1Swenshuai.xi {
4231*53ee8cc1Swenshuai.xi *peInputSrc = 0;
4232*53ee8cc1Swenshuai.xi if(_ptsp_res->_DscmbFlt_State[u32EngId].u32Src & E_DRVTSP_FLT_SOURCE_TYPE_LIVE)
4233*53ee8cc1Swenshuai.xi {
4234*53ee8cc1Swenshuai.xi *peInputSrc = E_DRVTSP_PKTSRC_DEMUX0;
4235*53ee8cc1Swenshuai.xi }
4236*53ee8cc1Swenshuai.xi else if(_ptsp_res->_DscmbFlt_State[u32EngId].u32Src & E_DRVTSP_FLT_SOURCE_TYPE_TS1)
4237*53ee8cc1Swenshuai.xi {
4238*53ee8cc1Swenshuai.xi *peInputSrc = E_DRVTSP_PKTSRC_DEMUX1;
4239*53ee8cc1Swenshuai.xi }
4240*53ee8cc1Swenshuai.xi else if(_ptsp_res->_DscmbFlt_State[u32EngId].u32Src & E_DRVTSP_FLT_SOURCE_TYPE_TS2)
4241*53ee8cc1Swenshuai.xi {
4242*53ee8cc1Swenshuai.xi *peInputSrc = E_DRVTSP_PKTSRC_DEMUX2;
4243*53ee8cc1Swenshuai.xi }
4244*53ee8cc1Swenshuai.xi else if(_ptsp_res->_DscmbFlt_State[u32EngId].u32Src & E_DRVTSP_FLT_SOURCE_TYPE_FILE)
4245*53ee8cc1Swenshuai.xi {
4246*53ee8cc1Swenshuai.xi *peInputSrc = E_DRVTSP_PKTSRC_DEMUXFILE;
4247*53ee8cc1Swenshuai.xi }
4248*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4249*53ee8cc1Swenshuai.xi }
4250*53ee8cc1Swenshuai.xi else
4251*53ee8cc1Swenshuai.xi {
4252*53ee8cc1Swenshuai.xi MS_U8 u8OrgCaEng = 0xFF, u8CaSrc = 0;
4253*53ee8cc1Swenshuai.xi DrvTSP_FltType eFltType = 0;
4254*53ee8cc1Swenshuai.xi MS_U32 u32CaDes = 0;
4255*53ee8cc1Swenshuai.xi
4256*53ee8cc1Swenshuai.xi switch (*peInputSrc)
4257*53ee8cc1Swenshuai.xi {
4258*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTSRC_DEMUX0:
4259*53ee8cc1Swenshuai.xi eFltType = E_DRVTSP_FLT_SOURCE_TYPE_LIVE;
4260*53ee8cc1Swenshuai.xi u8CaSrc = TSP_SRC_FROM_TSIF0_LIVE;
4261*53ee8cc1Swenshuai.xi u32CaDes = TSP_PKTDMX0_LIVE;
4262*53ee8cc1Swenshuai.xi break;
4263*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTSRC_DEMUX1:
4264*53ee8cc1Swenshuai.xi eFltType = E_DRVTSP_FLT_SOURCE_TYPE_TS1 | E_DRVTSP_FLT_SOURCE_TYPE_FILE1;
4265*53ee8cc1Swenshuai.xi u8CaSrc = TSP_SRC_FROM_TSIF1;
4266*53ee8cc1Swenshuai.xi u32CaDes = TSP_PKTDMX1;
4267*53ee8cc1Swenshuai.xi break;
4268*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTSRC_DEMUX2:
4269*53ee8cc1Swenshuai.xi eFltType = E_DRVTSP_FLT_SOURCE_TYPE_TS2 | E_DRVTSP_FLT_SOURCE_TYPE_FILE2;
4270*53ee8cc1Swenshuai.xi u8CaSrc = TSP_SRC_FROM_TSIF2;
4271*53ee8cc1Swenshuai.xi u32CaDes = TSP_PKTDMX2;
4272*53ee8cc1Swenshuai.xi break;
4273*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTSRC_DEMUXFILE:
4274*53ee8cc1Swenshuai.xi eFltType = E_DRVTSP_FLT_SOURCE_TYPE_FILE;
4275*53ee8cc1Swenshuai.xi u8CaSrc = TSP_SRC_FROM_TSIF0_FILE;
4276*53ee8cc1Swenshuai.xi u32CaDes = TSP_PKTDMX0_FILE;
4277*53ee8cc1Swenshuai.xi break;
4278*53ee8cc1Swenshuai.xi default:
4279*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4280*53ee8cc1Swenshuai.xi }
4281*53ee8cc1Swenshuai.xi
4282*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[u32EngId].u32Src = eFltType;
4283*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_CACtrl((MS_U8)u32EngId, u8CaSrc, u32CaDes);
4284*53ee8cc1Swenshuai.xi
4285*53ee8cc1Swenshuai.xi u8OrgCaEng = _TSP_Get_DscmbEngId_ByFltSrc(eFltType);
4286*53ee8cc1Swenshuai.xi if((u8OrgCaEng < TSP_CA_ENGINE_NUM) && (u8OrgCaEng != (MS_U8)u32EngId))
4287*53ee8cc1Swenshuai.xi {
4288*53ee8cc1Swenshuai.xi _ptsp_res->_DscmbFlt_State[u8OrgCaEng].u32Src &= ~eFltType;
4289*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_ScrmPath(u8OrgCaEng, 0);
4290*53ee8cc1Swenshuai.xi }
4291*53ee8cc1Swenshuai.xi
4292*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4293*53ee8cc1Swenshuai.xi }
4294*53ee8cc1Swenshuai.xi }
4295*53ee8cc1Swenshuai.xi
4296*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4297*53ee8cc1Swenshuai.xi /// Enable remove duplicate A/V packets
4298*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: Enable or Disable
4299*53ee8cc1Swenshuai.xi /// @return TSP_Result
4300*53ee8cc1Swenshuai.xi /// @note
4301*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_RemoveDupAVPkt(MS_BOOL bEnable)4302*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_RemoveDupAVPkt(MS_BOOL bEnable)
4303*53ee8cc1Swenshuai.xi {
4304*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4305*53ee8cc1Swenshuai.xi HAL_TSP_RemoveDupAVPkt(bEnable);
4306*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4307*53ee8cc1Swenshuai.xi }
4308*53ee8cc1Swenshuai.xi
4309*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4310*53ee8cc1Swenshuai.xi /// Enable remove duplicate A/V packets
4311*53ee8cc1Swenshuai.xi /// @param flttype \b IN: FIFO type
4312*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: Enable or Disable
4313*53ee8cc1Swenshuai.xi /// @return TSP_Result
4314*53ee8cc1Swenshuai.xi /// @note
4315*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_RemoveDupAVFifoPkt(DrvTSP_FltType flttype,MS_BOOL bEnable)4316*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_RemoveDupAVFifoPkt(DrvTSP_FltType flttype, MS_BOOL bEnable)
4317*53ee8cc1Swenshuai.xi {
4318*53ee8cc1Swenshuai.xi MS_U32 u32FifoIdx = 0;
4319*53ee8cc1Swenshuai.xi
4320*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4321*53ee8cc1Swenshuai.xi
4322*53ee8cc1Swenshuai.xi if(flttype == E_DRVTSP_FLT_TYPE_VIDEO)
4323*53ee8cc1Swenshuai.xi {
4324*53ee8cc1Swenshuai.xi u32FifoIdx = 0;
4325*53ee8cc1Swenshuai.xi }
4326*53ee8cc1Swenshuai.xi else if(flttype == E_DRVTSP_FLT_TYPE_AUDIO)
4327*53ee8cc1Swenshuai.xi {
4328*53ee8cc1Swenshuai.xi u32FifoIdx = 1;
4329*53ee8cc1Swenshuai.xi }
4330*53ee8cc1Swenshuai.xi else if(flttype == E_DRVTSP_FLT_TYPE_AUDIO2)
4331*53ee8cc1Swenshuai.xi {
4332*53ee8cc1Swenshuai.xi u32FifoIdx = 2;
4333*53ee8cc1Swenshuai.xi }
4334*53ee8cc1Swenshuai.xi else if(flttype == E_DRVTSP_FLT_TYPE_VIDEO3D)
4335*53ee8cc1Swenshuai.xi {
4336*53ee8cc1Swenshuai.xi u32FifoIdx = 3;
4337*53ee8cc1Swenshuai.xi }
4338*53ee8cc1Swenshuai.xi #if (TSP_AUDIO3_AUDIO4_SUPPORT == 1)
4339*53ee8cc1Swenshuai.xi else if(flttype == E_DRVTSP_FLT_TYPE_AUDIO3)
4340*53ee8cc1Swenshuai.xi {
4341*53ee8cc1Swenshuai.xi u32FifoIdx = 4;
4342*53ee8cc1Swenshuai.xi }
4343*53ee8cc1Swenshuai.xi else if(flttype == E_DRVTSP_FLT_TYPE_AUDIO4)
4344*53ee8cc1Swenshuai.xi {
4345*53ee8cc1Swenshuai.xi u32FifoIdx = 5;
4346*53ee8cc1Swenshuai.xi }
4347*53ee8cc1Swenshuai.xi #endif
4348*53ee8cc1Swenshuai.xi else
4349*53ee8cc1Swenshuai.xi {
4350*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_INVALID_PARAM);
4351*53ee8cc1Swenshuai.xi }
4352*53ee8cc1Swenshuai.xi
4353*53ee8cc1Swenshuai.xi HAL_TSP_RemoveDupAVFifoPkt(u32FifoIdx, bEnable);
4354*53ee8cc1Swenshuai.xi
4355*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4356*53ee8cc1Swenshuai.xi }
4357*53ee8cc1Swenshuai.xi
4358*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4359*53ee8cc1Swenshuai.xi /// Enable or Disable to remove audio,or video error packets.
4360*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: Enable or Disable
4361*53ee8cc1Swenshuai.xi /// @return TSP_Result
4362*53ee8cc1Swenshuai.xi /// @note
4363*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_TEI_RemoveErrorPkt(TSP_DRV_TEI_RmPktType eDrvPktType,MS_BOOL bEnable)4364*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_TEI_RemoveErrorPkt(TSP_DRV_TEI_RmPktType eDrvPktType, MS_BOOL bEnable)
4365*53ee8cc1Swenshuai.xi {
4366*53ee8cc1Swenshuai.xi MS_U32 u32PktType = TSP_PKTDMX_NONE;
4367*53ee8cc1Swenshuai.xi
4368*53ee8cc1Swenshuai.xi switch(eDrvPktType)
4369*53ee8cc1Swenshuai.xi {
4370*53ee8cc1Swenshuai.xi case E_TSP_DRV_TEI_REMOVE_PKT0_LIVE:
4371*53ee8cc1Swenshuai.xi u32PktType = TSP_PKTDMX0_LIVE;
4372*53ee8cc1Swenshuai.xi break;
4373*53ee8cc1Swenshuai.xi case E_TSP_DRV_TEI_REMOVE_PKT0_FILE:
4374*53ee8cc1Swenshuai.xi u32PktType = TSP_PKTDMX0_FILE;
4375*53ee8cc1Swenshuai.xi break;
4376*53ee8cc1Swenshuai.xi case E_TSP_DRV_TEI_REMOVE_PKT1:
4377*53ee8cc1Swenshuai.xi u32PktType = TSP_PKTDMX1;
4378*53ee8cc1Swenshuai.xi break;
4379*53ee8cc1Swenshuai.xi case E_TSP_DRV_TEI_REMOVE_PKT2:
4380*53ee8cc1Swenshuai.xi u32PktType = TSP_PKTDMX2;
4381*53ee8cc1Swenshuai.xi break;
4382*53ee8cc1Swenshuai.xi default:
4383*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
4384*53ee8cc1Swenshuai.xi }
4385*53ee8cc1Swenshuai.xi
4386*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4387*53ee8cc1Swenshuai.xi
4388*53ee8cc1Swenshuai.xi HAL_TSP_TEI_RemoveErrorPkt(u32PktType, bEnable);
4389*53ee8cc1Swenshuai.xi
4390*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4391*53ee8cc1Swenshuai.xi }
4392*53ee8cc1Swenshuai.xi
4393*53ee8cc1Swenshuai.xi
4394*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4395*53ee8cc1Swenshuai.xi /// Enable audio BD stream mode
4396*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: Enable or Disable
4397*53ee8cc1Swenshuai.xi /// @return TSP_Result
4398*53ee8cc1Swenshuai.xi /// @note
4399*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_AU_BD_Mode_Enable(MS_BOOL bEnable)4400*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_AU_BD_Mode_Enable(MS_BOOL bEnable)
4401*53ee8cc1Swenshuai.xi {
4402*53ee8cc1Swenshuai.xi if(HAL_TSP_AU_BD_Mode_Enable(bEnable))
4403*53ee8cc1Swenshuai.xi {
4404*53ee8cc1Swenshuai.xi return DRVTSP_OK;
4405*53ee8cc1Swenshuai.xi }
4406*53ee8cc1Swenshuai.xi else
4407*53ee8cc1Swenshuai.xi {
4408*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
4409*53ee8cc1Swenshuai.xi }
4410*53ee8cc1Swenshuai.xi }
4411*53ee8cc1Swenshuai.xi
4412*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4413*53ee8cc1Swenshuai.xi /// Enable or Disable STC64 bit mode. Defalut is STC33 mode.
4414*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: STC64 system time mode enable
4415*53ee8cc1Swenshuai.xi /// @return TSP_Result
4416*53ee8cc1Swenshuai.xi /// @note
4417*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_STC64_Mode_Enable(MS_BOOL bEnable)4418*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_STC64_Mode_Enable(MS_BOOL bEnable)
4419*53ee8cc1Swenshuai.xi {
4420*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4421*53ee8cc1Swenshuai.xi HAL_TSP_STC64_Mode_En(bEnable);
4422*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4423*53ee8cc1Swenshuai.xi }
4424*53ee8cc1Swenshuai.xi
4425*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4426*53ee8cc1Swenshuai.xi /// STC Clock Rate Adjust (27MHz clock)
4427*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: STC engine ID
4428*53ee8cc1Swenshuai.xi /// @param bUpClk \b IN: If TRUE, Clk will be faster, and if FALSE, Clk will be slower
4429*53ee8cc1Swenshuai.xi /// @param u32Percentage \b IN: The percentage of STC clock ratio
4430*53ee8cc1Swenshuai.xi /// @return TSP_Result
4431*53ee8cc1Swenshuai.xi /// @note
4432*53ee8cc1Swenshuai.xi /// StcClk = (InClk * (2^27) /Stc_CW) * 3.2
4433*53ee8cc1Swenshuai.xi /// Stc_CW = Stc_CW_Def / P
4434*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_STCClk_Adjust(MS_U32 u32EngId,MS_BOOL bUpClk,MS_U32 u32Percentage)4435*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_STCClk_Adjust(MS_U32 u32EngId, MS_BOOL bUpClk, MS_U32 u32Percentage)
4436*53ee8cc1Swenshuai.xi {
4437*53ee8cc1Swenshuai.xi MS_U64 u64CW_New = 0;
4438*53ee8cc1Swenshuai.xi
4439*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4440*53ee8cc1Swenshuai.xi
4441*53ee8cc1Swenshuai.xi u64CW_New = (((MS_U64)STC_SYNTH_DEFAULT) & 0xFFFFFFFFUL) * (((MS_U64)_ptsp_res->_u32StcAdjustUnit) & 0xFFFFFFFFUL) / (((MS_U64)u32Percentage) & 0xFFFFFFFFUL);
4442*53ee8cc1Swenshuai.xi
4443*53ee8cc1Swenshuai.xi //printf("[%s](%d, %d, %d) CW %d\n", __FUNCTION__, (unsigned int)u32EngId, (unsigned int)bUpClk, (unsigned int)u32Percentage, (unsigned int)u64CW_New);
4444*53ee8cc1Swenshuai.xi
4445*53ee8cc1Swenshuai.xi HAL_TSP_Stc_ctrl(u32EngId, (MS_U32)u64CW_New);
4446*53ee8cc1Swenshuai.xi
4447*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4448*53ee8cc1Swenshuai.xi }
4449*53ee8cc1Swenshuai.xi
4450*53ee8cc1Swenshuai.xi // Hidden interface. For Mstar use only
4451*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4452*53ee8cc1Swenshuai.xi // Set/Get TSP filter information
4453*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4454*53ee8cc1Swenshuai.xi // @param pu32StartFlt \b IN/OUT: starting filter id which is availabe
4455*53ee8cc1Swenshuai.xi // @param pu32EndFlt \b IN/OUT: starting filter id which is availabe
4456*53ee8cc1Swenshuai.xi // @param bSet \b IN: TRUE set, and FALSE for get
4457*53ee8cc1Swenshuai.xi // @return TSP_Result
4458*53ee8cc1Swenshuai.xi // @note
4459*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Flt_SetOwner(MS_U32 u32EngId,MS_U32 u32FltIdStart,MS_U32 u32FltIdEnd,MS_BOOL bOwner)4460*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Flt_SetOwner(MS_U32 u32EngId, MS_U32 u32FltIdStart, MS_U32 u32FltIdEnd, MS_BOOL bOwner)
4461*53ee8cc1Swenshuai.xi {
4462*53ee8cc1Swenshuai.xi MS_U32 i = 0;
4463*53ee8cc1Swenshuai.xi
4464*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4465*53ee8cc1Swenshuai.xi TSP_ASSERT2(0UL <= u32FltIdStart, TSP_DBG("[TSP_ERROR][%06d] Bad FltIdStart\n", __LINE__));
4466*53ee8cc1Swenshuai.xi TSP_ASSERT2(0UL <= u32FltIdEnd, TSP_DBG("[TSP_ERROR][%06d] Bad FltIdEnd\n", __LINE__));
4467*53ee8cc1Swenshuai.xi TSP_ASSERT2(u32FltIdEnd >= u32FltIdStart, TSP_DBG("[TSP_ERROR][%06d] u32FltIdEnd < u32FltIdStart\n", __LINE__));
4468*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM > u32FltIdStart, TSP_DBG("[TSP_ERROR][%06d] Bad FltIdStart\n", __LINE__));
4469*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM >= u32FltIdEnd, TSP_DBG("[TSP_ERROR][%06d] Bad FltIdEnd\n", __LINE__));
4470*53ee8cc1Swenshuai.xi
4471*53ee8cc1Swenshuai.xi for (i = u32FltIdStart; (i <= u32FltIdEnd) && (i < TSP_SECFLT_NUM); i++)
4472*53ee8cc1Swenshuai.xi {
4473*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[u32EngId].FltState[i] != E_DRVTSP_FLT_STATE_FREE) &&
4474*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].FltState[i] != E_DRVTSP_FLT_STATE_NA))
4475*53ee8cc1Swenshuai.xi {
4476*53ee8cc1Swenshuai.xi MS_ASSERT(0);
4477*53ee8cc1Swenshuai.xi }
4478*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[u32EngId].SecFltState[i] != E_DRVTSP_FLT_STATE_FREE) &&
4479*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].SecFltState[i] != E_DRVTSP_FLT_STATE_NA))
4480*53ee8cc1Swenshuai.xi {
4481*53ee8cc1Swenshuai.xi MS_ASSERT(0);
4482*53ee8cc1Swenshuai.xi }
4483*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[u32EngId].SecBufState[i] != E_DRVTSP_FLT_STATE_FREE) &&
4484*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[u32EngId].SecBufState[i] != E_DRVTSP_FLT_STATE_NA))
4485*53ee8cc1Swenshuai.xi {
4486*53ee8cc1Swenshuai.xi MS_ASSERT(0);
4487*53ee8cc1Swenshuai.xi }
4488*53ee8cc1Swenshuai.xi
4489*53ee8cc1Swenshuai.xi if (bOwner)
4490*53ee8cc1Swenshuai.xi {
4491*53ee8cc1Swenshuai.xi //reserverd 32 non-scramble filter for duplicate filter
4492*53ee8cc1Swenshuai.xi #ifdef DUP_PIDFLT_API
4493*53ee8cc1Swenshuai.xi if((i <= DSCMB2_FLT_END_ID) || (i >= DSCMB_FLT_SHAREKEY_END_ID))
4494*53ee8cc1Swenshuai.xi #endif
4495*53ee8cc1Swenshuai.xi #ifdef DUP_PIDFLT
4496*53ee8cc1Swenshuai.xi //reserverd 16 non-scramble filter for duplicate filter
4497*53ee8cc1Swenshuai.xi if((i <= DSCMB2_FLT_END_ID) || (i >= DSCMB_FLT_SHAREKEY_START_ID))
4498*53ee8cc1Swenshuai.xi #endif
4499*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[i] = E_DRVTSP_FLT_STATE_FREE;
4500*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltState[i] = E_DRVTSP_FLT_STATE_FREE;
4501*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecBufState[i] = E_DRVTSP_FLT_STATE_FREE;
4502*53ee8cc1Swenshuai.xi HAL_TSP_SetOwner(u32EngId, i, TRUE);
4503*53ee8cc1Swenshuai.xi }
4504*53ee8cc1Swenshuai.xi else
4505*53ee8cc1Swenshuai.xi {
4506*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[i] = E_DRVTSP_FLT_STATE_NA;
4507*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltState[i] = E_DRVTSP_FLT_STATE_NA;
4508*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecBufState[i] = E_DRVTSP_FLT_STATE_NA;
4509*53ee8cc1Swenshuai.xi HAL_TSP_SetOwner(u32EngId, i, FALSE);
4510*53ee8cc1Swenshuai.xi }
4511*53ee8cc1Swenshuai.xi }
4512*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4513*53ee8cc1Swenshuai.xi }
4514*53ee8cc1Swenshuai.xi
4515*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4516*53ee8cc1Swenshuai.xi // Ask TSP to process section/pvr data for Non-OS driver. Calling this function in OS environment causes nothing
4517*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4518*53ee8cc1Swenshuai.xi // @param u32FltId \b IN: Which filter id to process. 0xFFFFFFFF means process all filters (DMXID)
4519*53ee8cc1Swenshuai.xi // @param u32Timeout \b IN: Max time for TSP to process
4520*53ee8cc1Swenshuai.xi // @return TSP_Result
4521*53ee8cc1Swenshuai.xi // @note
4522*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Proc(MS_U32 u32EngId,MS_U32 u32FltId,TSP_Result * pRet,DrvTSP_Event * pEvt)4523*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Proc(MS_U32 u32EngId, MS_U32 u32FltId, TSP_Result* pRet, DrvTSP_Event* pEvt) // for non-OS TSP scheduling
4524*53ee8cc1Swenshuai.xi {
4525*53ee8cc1Swenshuai.xi OSAL_TSP_ProcTypeParam Data;
4526*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4527*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM > u32FltId, TSP_DBG("[TSP_ERROR][%06d] Bad FltId %u\n", __LINE__, (unsigned int)u32FltId));
4528*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[u32FltId] == E_DRVTSP_FLT_STATE_NA)
4529*53ee8cc1Swenshuai.xi {
4530*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4531*53ee8cc1Swenshuai.xi }
4532*53ee8cc1Swenshuai.xi Data.u32FltId = u32FltId;
4533*53ee8cc1Swenshuai.xi Data.pRet = (void*)pRet;
4534*53ee8cc1Swenshuai.xi Data.bInfiniteWait = FALSE;
4535*53ee8cc1Swenshuai.xi Data.bFromTask = FALSE;
4536*53ee8cc1Swenshuai.xi
4537*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
4538*53ee8cc1Swenshuai.xi OSAL_TSP_Proc(_TSP_Isr_ProcPoll, &Data, (MS_U32*)pEvt);
4539*53ee8cc1Swenshuai.xi _TSP_IND_LOCK();
4540*53ee8cc1Swenshuai.xi
4541*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4542*53ee8cc1Swenshuai.xi }
4543*53ee8cc1Swenshuai.xi
4544*53ee8cc1Swenshuai.xi
4545*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4546*53ee8cc1Swenshuai.xi // Allocate STC engine.
4547*53ee8cc1Swenshuai.xi // @param pu32EngId \b OUT: STC engine id. If no free STC engine, it will be 0xFFFFFFFF and return FAIL.
4548*53ee8cc1Swenshuai.xi // @return TSP_Result
4549*53ee8cc1Swenshuai.xi // @note
4550*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_STC_Alloc(MS_U32 * pu32EngId)4551*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_STC_Alloc(MS_U32 *pu32EngId)
4552*53ee8cc1Swenshuai.xi {
4553*53ee8cc1Swenshuai.xi TSP_Result ret;
4554*53ee8cc1Swenshuai.xi
4555*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4556*53ee8cc1Swenshuai.xi
4557*53ee8cc1Swenshuai.xi ret = _TSP_STC_Alloc(0, pu32EngId);
4558*53ee8cc1Swenshuai.xi
4559*53ee8cc1Swenshuai.xi _TSP_RETURN(ret);
4560*53ee8cc1Swenshuai.xi }
4561*53ee8cc1Swenshuai.xi
4562*53ee8cc1Swenshuai.xi
4563*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4564*53ee8cc1Swenshuai.xi // Free STC engine
4565*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of STC engine to be free
4566*53ee8cc1Swenshuai.xi // @return TSP_Result
4567*53ee8cc1Swenshuai.xi // @note
4568*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_STC_Free(MS_U32 u32EngId)4569*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_STC_Free(MS_U32 u32EngId)
4570*53ee8cc1Swenshuai.xi {
4571*53ee8cc1Swenshuai.xi TSP_Result ret = DRVTSP_FAIL;
4572*53ee8cc1Swenshuai.xi
4573*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4574*53ee8cc1Swenshuai.xi
4575*53ee8cc1Swenshuai.xi ret = _TSP_STC_Free(u32EngId);
4576*53ee8cc1Swenshuai.xi
4577*53ee8cc1Swenshuai.xi _TSP_RETURN(ret);
4578*53ee8cc1Swenshuai.xi }
4579*53ee8cc1Swenshuai.xi
4580*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4581*53ee8cc1Swenshuai.xi // Free STC engine
4582*53ee8cc1Swenshuai.xi // @param u32PcrFltId \b IN: index of PCR PID filter
4583*53ee8cc1Swenshuai.xi // @param pu32EngId \b Out: index of STC engine which u32PcrFltId mapping to
4584*53ee8cc1Swenshuai.xi // @return TSP_Result
4585*53ee8cc1Swenshuai.xi // @note
4586*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PcrId_To_StcId(MS_U32 u32PcrFltId,MS_U32 * pu32EngId)4587*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PcrId_To_StcId(MS_U32 u32PcrFltId,MS_U32 *pu32EngId)
4588*53ee8cc1Swenshuai.xi {
4589*53ee8cc1Swenshuai.xi TSP_Result ret = DRVTSP_FAIL;
4590*53ee8cc1Swenshuai.xi
4591*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4592*53ee8cc1Swenshuai.xi
4593*53ee8cc1Swenshuai.xi ret = _TSP_PcrId_To_StcId(u32PcrFltId, pu32EngId);
4594*53ee8cc1Swenshuai.xi
4595*53ee8cc1Swenshuai.xi _TSP_RETURN(ret);
4596*53ee8cc1Swenshuai.xi }
4597*53ee8cc1Swenshuai.xi
4598*53ee8cc1Swenshuai.xi
4599*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4600*53ee8cc1Swenshuai.xi /// Get current system time clock (STC) of TSP
4601*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4602*53ee8cc1Swenshuai.xi /// @param pu32STC_32 \b OUT: pointer of STC[32] return
4603*53ee8cc1Swenshuai.xi /// @param pu32STC \b OUT: pointer of STC[31:0] return
4604*53ee8cc1Swenshuai.xi /// @return TSP_Result
4605*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_GetSTC(MS_U32 u32EngId,MS_U32 * pu32STC_32,MS_U32 * pu32STC)4606*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetSTC(MS_U32 u32EngId, MS_U32 *pu32STC_32, MS_U32 *pu32STC)
4607*53ee8cc1Swenshuai.xi {
4608*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4609*53ee8cc1Swenshuai.xi HAL_TSP_STC_Update_Disable(u32EngId, TRUE);
4610*53ee8cc1Swenshuai.xi *pu32STC = HAL_TSP_GetSTC(u32EngId);
4611*53ee8cc1Swenshuai.xi *pu32STC_32 = HAL_TSP_GetSTC_32(u32EngId);
4612*53ee8cc1Swenshuai.xi HAL_TSP_STC_Update_Disable(u32EngId, FALSE);
4613*53ee8cc1Swenshuai.xi
4614*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4615*53ee8cc1Swenshuai.xi }
4616*53ee8cc1Swenshuai.xi
4617*53ee8cc1Swenshuai.xi
4618*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4619*53ee8cc1Swenshuai.xi /// Set STC control
4620*53ee8cc1Swenshuai.xi /// @param u8Eng \b IN: STC Engine ID
4621*53ee8cc1Swenshuai.xi /// @param u8Opt \b IN: STC update control options
4622*53ee8cc1Swenshuai.xi /// 0x00 -> Update STC by TSP FW
4623*53ee8cc1Swenshuai.xi /// 0x01 -> Update STC by HK
4624*53ee8cc1Swenshuai.xi /// 0x02 -> Update STC Once when PCR reset
4625*53ee8cc1Swenshuai.xi /// @note
4626*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_STC_UpdateCtrl(MS_U8 u8Eng,MS_U8 u8Mode)4627*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_STC_UpdateCtrl(MS_U8 u8Eng, MS_U8 u8Mode)
4628*53ee8cc1Swenshuai.xi {
4629*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4630*53ee8cc1Swenshuai.xi
4631*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_STC_NUM> u8Eng, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u8Eng));
4632*53ee8cc1Swenshuai.xi
4633*53ee8cc1Swenshuai.xi if (HAL_TSP_STC_UpdateCtrl(u8Eng, u8Mode))
4634*53ee8cc1Swenshuai.xi {
4635*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4636*53ee8cc1Swenshuai.xi }
4637*53ee8cc1Swenshuai.xi else
4638*53ee8cc1Swenshuai.xi {
4639*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4640*53ee8cc1Swenshuai.xi }
4641*53ee8cc1Swenshuai.xi }
4642*53ee8cc1Swenshuai.xi
4643*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4644*53ee8cc1Swenshuai.xi /// Select STC Engine (Only support in driver version 3.0)
4645*53ee8cc1Swenshuai.xi /// @param eFltSrc \b IN: Fliter Source type
4646*53ee8cc1Swenshuai.xi /// @param u32StcEng \b IN: STC engine ID (0, 1)
4647*53ee8cc1Swenshuai.xi /// @return DMX_FILTER_STATUS_OK - Success
4648*53ee8cc1Swenshuai.xi /// @return DMX_FILTER_STATUS_ERROR - Failure
4649*53ee8cc1Swenshuai.xi /// @note
4650*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_STC_Select(DrvTSP_FltType eFltSrc,MS_U32 u32StcEng)4651*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_STC_Select(DrvTSP_FltType eFltSrc, MS_U32 u32StcEng)
4652*53ee8cc1Swenshuai.xi {
4653*53ee8cc1Swenshuai.xi TSP_Result ret;
4654*53ee8cc1Swenshuai.xi MS_U32 i;
4655*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4656*53ee8cc1Swenshuai.xi
4657*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_STC_NUM> u32StcEng, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32StcEng));
4658*53ee8cc1Swenshuai.xi
4659*53ee8cc1Swenshuai.xi ret = _TSP_STC_Select(eFltSrc,u32StcEng);
4660*53ee8cc1Swenshuai.xi
4661*53ee8cc1Swenshuai.xi for(i=0;i<TSP_STC_NUM;i++)
4662*53ee8cc1Swenshuai.xi {
4663*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspStcState[i].bUsed)
4664*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_WARNING][%06d] STC Allocate before STC Select!\n", __LINE__);
4665*53ee8cc1Swenshuai.xi
4666*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspStcState[i].u32SrcType == (eFltSrc & E_DRVTSP_FLT_SOURCE_TYPE_MASK))
4667*53ee8cc1Swenshuai.xi _ptsp_res->_TspStcState[u32StcEng].u32PcrFltId = _ptsp_res->_TspStcState[i].u32PcrFltId;
4668*53ee8cc1Swenshuai.xi }
4669*53ee8cc1Swenshuai.xi
4670*53ee8cc1Swenshuai.xi _ptsp_res->_TspStcState[u32StcEng].u32SrcType = eFltSrc & E_DRVTSP_FLT_SOURCE_TYPE_MASK;
4671*53ee8cc1Swenshuai.xi _ptsp_res->_bStcAllocDisable = TRUE;
4672*53ee8cc1Swenshuai.xi
4673*53ee8cc1Swenshuai.xi _TSP_RETURN(ret);
4674*53ee8cc1Swenshuai.xi
4675*53ee8cc1Swenshuai.xi }
4676*53ee8cc1Swenshuai.xi
4677*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4678*53ee8cc1Swenshuai.xi /// Add or subtract STC Offset
4679*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of STC engine
4680*53ee8cc1Swenshuai.xi // @param u32Offset \b IN: STC offset value
4681*53ee8cc1Swenshuai.xi // @param bAdd \b IN: If TRUE, add the offset value; otherwise subtract the offset value
4682*53ee8cc1Swenshuai.xi // @return TSP_Result
4683*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SetSTCOffset(MS_U32 u32EngId,MS_U32 u32Offset,MS_BOOL bAdd)4684*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetSTCOffset(MS_U32 u32EngId, MS_U32 u32Offset, MS_BOOL bAdd)
4685*53ee8cc1Swenshuai.xi {
4686*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4687*53ee8cc1Swenshuai.xi HAL_TSP_SetSTCOffset(u32EngId, u32Offset, bAdd);
4688*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4689*53ee8cc1Swenshuai.xi }
4690*53ee8cc1Swenshuai.xi
4691*53ee8cc1Swenshuai.xi
4692*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4693*53ee8cc1Swenshuai.xi /// Get PRC of TSP
4694*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4695*53ee8cc1Swenshuai.xi /// @param pu32Pcr_32 \b OUT: pointer of STC[32] return
4696*53ee8cc1Swenshuai.xi /// @param pu32Pcr \b OUT: pointer of STC[31:0] return
4697*53ee8cc1Swenshuai.xi /// @return TSP_Result
4698*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_GetPCR(MS_U32 u32EngId,MS_U32 * pu32Pcr_32,MS_U32 * pu32Pcr)4699*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetPCR(MS_U32 u32EngId, MS_U32 *pu32Pcr_32, MS_U32 *pu32Pcr)
4700*53ee8cc1Swenshuai.xi {
4701*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4702*53ee8cc1Swenshuai.xi if (u32EngId >= TSP_PCRFLT_NUM)
4703*53ee8cc1Swenshuai.xi {
4704*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4705*53ee8cc1Swenshuai.xi }
4706*53ee8cc1Swenshuai.xi if (HAL_TSP_GetPcr(u32EngId, pu32Pcr_32, pu32Pcr))
4707*53ee8cc1Swenshuai.xi {
4708*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4709*53ee8cc1Swenshuai.xi }
4710*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4711*53ee8cc1Swenshuai.xi }
4712*53ee8cc1Swenshuai.xi
4713*53ee8cc1Swenshuai.xi // PIDFlt API
4714*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4715*53ee8cc1Swenshuai.xi /// Allocate a PID filter of a TSP unit
4716*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4717*53ee8cc1Swenshuai.xi /// @param eFilterType \b IN: type of PID filter to be allocated
4718*53ee8cc1Swenshuai.xi /// @param pu32PidFltId \b OUT: pointer of PID filter id return
4719*53ee8cc1Swenshuai.xi /// @return TSP_Result
4720*53ee8cc1Swenshuai.xi /// @note
4721*53ee8cc1Swenshuai.xi /// These filter types have to select a section filter\n
4722*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_SECTION\n
4723*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_PCR\n
4724*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_PES\n
4725*53ee8cc1Swenshuai.xi /// @note
4726*53ee8cc1Swenshuai.xi /// These filter types also have to setup section buffer for data output\n
4727*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_SECTION\n
4728*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_PES\n
4729*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PidFlt_SelSecFlt, MDrv_TSP_SecFlt_SetBuffer
4730*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PidFlt_Alloc(MS_U32 u32EngId,DrvTSP_FltType eFilterType,MS_U32 * pu32PidFltId)4731*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_Alloc(MS_U32 u32EngId, DrvTSP_FltType eFilterType, MS_U32 *pu32PidFltId)
4732*53ee8cc1Swenshuai.xi {
4733*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4734*53ee8cc1Swenshuai.xi
4735*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
4736*53ee8cc1Swenshuai.xi
4737*53ee8cc1Swenshuai.xi #if (TSP_AUDIO3_AUDIO4_SUPPORT == 0) // if not support audio C & audio D FIFO
4738*53ee8cc1Swenshuai.xi TSP_ASSERT2((E_DRVTSP_FLT_TYPE_AUDIO3 != (eFilterType&~E_DRVTSP_FLT_MASK)) &&
4739*53ee8cc1Swenshuai.xi (E_DRVTSP_FLT_TYPE_AUDIO4 != (eFilterType&~E_DRVTSP_FLT_MASK)),
4740*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%06d] Bad Filter Type %u\n", __LINE__, (unsigned int)eFilterType));
4741*53ee8cc1Swenshuai.xi #endif
4742*53ee8cc1Swenshuai.xi
4743*53ee8cc1Swenshuai.xi *pu32PidFltId = 0xFFFFFFFFUL;
4744*53ee8cc1Swenshuai.xi if (!_TSP_PidFlt_Alloc(u32EngId, eFilterType, pu32PidFltId))
4745*53ee8cc1Swenshuai.xi {
4746*53ee8cc1Swenshuai.xi TSP_ASSERT2(0, TSP_DBG("[TSP_ERROR][%06d] Allocate Pid Filter fail\n", __LINE__));
4747*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4748*53ee8cc1Swenshuai.xi }
4749*53ee8cc1Swenshuai.xi _TSP_PidFlt_Init(u32EngId, *pu32PidFltId);
4750*53ee8cc1Swenshuai.xi
4751*53ee8cc1Swenshuai.xi #ifndef HWPCR_ENABLE
4752*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_TYPE_PCR == (eFilterType&~E_DRVTSP_FLT_MASK))
4753*53ee8cc1Swenshuai.xi {
4754*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId = *pu32PidFltId;
4755*53ee8cc1Swenshuai.xi if (!_TSP_SecFlt_Alloc(u32EngId, eFilterType, &u32SecFltId))
4756*53ee8cc1Swenshuai.xi {
4757*53ee8cc1Swenshuai.xi TSP_ASSERT2(0, TSP_DBG("[TSP_ERROR][%06d] Allocate Section Filter fail\n", __LINE__));
4758*53ee8cc1Swenshuai.xi }
4759*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelSecFlt(u32EngId, *pu32PidFltId, u32SecFltId);
4760*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltMap[*pu32PidFltId] = u32SecFltId;
4761*53ee8cc1Swenshuai.xi _TSP_SecFlt_SetType(u32EngId, u32SecFltId, _ptsp_res->_TspState[u32EngId].FltType[*pu32PidFltId]);
4762*53ee8cc1Swenshuai.xi
4763*53ee8cc1Swenshuai.xi #ifdef DUP_PIDFLT_API
4764*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].DupFlt[*pu32PidFltId] != 0xFFFFUL)
4765*53ee8cc1Swenshuai.xi {
4766*53ee8cc1Swenshuai.xi MS_U32 u32DupFlt = _ptsp_res->_TspState[u32EngId].DupFlt[*pu32PidFltId];
4767*53ee8cc1Swenshuai.xi
4768*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelSecFlt(u32EngId, u32DupFlt, u32SecFltId);
4769*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltMap[u32DupFlt] = u32SecFltId;
4770*53ee8cc1Swenshuai.xi }
4771*53ee8cc1Swenshuai.xi #endif
4772*53ee8cc1Swenshuai.xi }
4773*53ee8cc1Swenshuai.xi #endif
4774*53ee8cc1Swenshuai.xi
4775*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4776*53ee8cc1Swenshuai.xi }
4777*53ee8cc1Swenshuai.xi
4778*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4779*53ee8cc1Swenshuai.xi /// Free a PID filter of a TSP unit
4780*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4781*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of PID filter to be free
4782*53ee8cc1Swenshuai.xi /// @return TSP_Result
4783*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PidFlt_Free(MS_U32 u32EngId,MS_U32 u32PidFltId)4784*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_Free(MS_U32 u32EngId, MS_U32 u32PidFltId)
4785*53ee8cc1Swenshuai.xi {
4786*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId, u32Flag = 0;
4787*53ee8cc1Swenshuai.xi TSP_Result tRes = DRVTSP_FAIL;
4788*53ee8cc1Swenshuai.xi
4789*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4790*53ee8cc1Swenshuai.xi
4791*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
4792*53ee8cc1Swenshuai.xi // this API only free pidflt which had section
4793*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %d\n", __LINE__, (unsigned int)u32PidFltId));
4794*53ee8cc1Swenshuai.xi
4795*53ee8cc1Swenshuai.xi //_TSP_IND_UNLOCK();
4796*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_STATE_FREE == _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId])
4797*53ee8cc1Swenshuai.xi {
4798*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4799*53ee8cc1Swenshuai.xi }
4800*53ee8cc1Swenshuai.xi
4801*53ee8cc1Swenshuai.xi // PVR pid filters and AV pid filter do not have SecFltEvtNotify, so call free function directly.
4802*53ee8cc1Swenshuai.xi u32SecFltId = _ptsp_res->_TspState[u32EngId].FltMap[u32PidFltId];
4803*53ee8cc1Swenshuai.xi if((u32SecFltId >= TSP_SECFLT_NUM) ||
4804*53ee8cc1Swenshuai.xi ((_ptsp_res->_TspState[u32EngId].FltType[u32PidFltId] & E_DRVTSP_FLT_TYPE_SECTION_MASK) == 0))
4805*53ee8cc1Swenshuai.xi {
4806*53ee8cc1Swenshuai.xi //_TSP_IND_LOCK();
4807*53ee8cc1Swenshuai.xi _TSP_PidFlt_Free(u32EngId, u32PidFltId, TRUE);
4808*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4809*53ee8cc1Swenshuai.xi }
4810*53ee8cc1Swenshuai.xi
4811*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] & E_DRVTSP_EVENT_CB_MASK) == E_DRVTSP_EVENT_CB_POLL)
4812*53ee8cc1Swenshuai.xi {
4813*53ee8cc1Swenshuai.xi //_TSP_IND_LOCK();
4814*53ee8cc1Swenshuai.xi _TSP_SecBuf_Free(0, u32SecFltId);
4815*53ee8cc1Swenshuai.xi _TSP_SecFlt_Free(0, u32SecFltId, TRUE);
4816*53ee8cc1Swenshuai.xi _TSP_PidFlt_Free(u32EngId, u32PidFltId, TRUE);
4817*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4818*53ee8cc1Swenshuai.xi }
4819*53ee8cc1Swenshuai.xi else if ((_ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] & E_DRVTSP_EVENT_CB_MASK) == E_DRVTSP_EVENT_CB_SELF)
4820*53ee8cc1Swenshuai.xi {
4821*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_STATE_FREE == _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId])
4822*53ee8cc1Swenshuai.xi {
4823*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4824*53ee8cc1Swenshuai.xi }
4825*53ee8cc1Swenshuai.xi
4826*53ee8cc1Swenshuai.xi #if 1
4827*53ee8cc1Swenshuai.xi if((_s32TspTaskId != -1) && (_s32TspTaskId == MsOS_GetOSThreadID()))
4828*53ee8cc1Swenshuai.xi {
4829*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%06d] Don't call %s in Callback function!!!", __LINE__, __FUNCTION__);
4830*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4831*53ee8cc1Swenshuai.xi }
4832*53ee8cc1Swenshuai.xi #endif
4833*53ee8cc1Swenshuai.xi
4834*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] & E_DRVTSP_FLT_STATE_CBRUN)
4835*53ee8cc1Swenshuai.xi {
4836*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s][%d]Warning !! Filter %d callback is running %x! Try Again!\n", __FUNCTION__, __LINE__, (unsigned int)u32PidFltId, (unsigned int)stDrvState);
4837*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
4838*53ee8cc1Swenshuai.xi }
4839*53ee8cc1Swenshuai.xi
4840*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] |= E_DRVTSP_FLT_STATE_FREEING;
4841*53ee8cc1Swenshuai.xi _TSP_GetSecRdyId(u32SecFltId, &u32Flag, OSAL_EVENT_OR_CLEAR);
4842*53ee8cc1Swenshuai.xi _TSP_GetSecOvfId(u32SecFltId, &u32Flag, OSAL_EVENT_OR_CLEAR);
4843*53ee8cc1Swenshuai.xi _TSP_SecBuf_Free(u32EngId, u32SecFltId);
4844*53ee8cc1Swenshuai.xi _TSP_SecFlt_Free(u32EngId, u32SecFltId, TRUE);
4845*53ee8cc1Swenshuai.xi _TSP_PidFlt_Free(u32EngId, u32PidFltId, TRUE);
4846*53ee8cc1Swenshuai.xi
4847*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4848*53ee8cc1Swenshuai.xi
4849*53ee8cc1Swenshuai.xi }
4850*53ee8cc1Swenshuai.xi
4851*53ee8cc1Swenshuai.xi //_TSP_IND_LOCK();
4852*53ee8cc1Swenshuai.xi _TSP_RETURN(tRes);
4853*53ee8cc1Swenshuai.xi }
4854*53ee8cc1Swenshuai.xi
4855*53ee8cc1Swenshuai.xi
4856*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4857*53ee8cc1Swenshuai.xi /// Set PID to a PID filter
4858*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4859*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of PID filter to be set
4860*53ee8cc1Swenshuai.xi /// @param u32PID \b IN: PID value
4861*53ee8cc1Swenshuai.xi /// @return TSP_Result
4862*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PidFlt_SetPid(MS_U32 u32EngId,MS_U32 u32PidFltId,MS_U16 u16PID)4863*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_SetPid(MS_U32 u32EngId, MS_U32 u32PidFltId, MS_U16 u16PID)
4864*53ee8cc1Swenshuai.xi {
4865*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4866*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
4867*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %u\n", __LINE__, (unsigned int)u32PidFltId));
4868*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__));
4869*53ee8cc1Swenshuai.xi
4870*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
4871*53ee8cc1Swenshuai.xi if(u32PidFltId >= TSP_PIDFLT_NUM)
4872*53ee8cc1Swenshuai.xi {
4873*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetHWPcrPid(u32PidFltId - TSP_PIDFLT_NUM, ((MS_U32)u16PID) & 0xFFFFUL);
4874*53ee8cc1Swenshuai.xi }
4875*53ee8cc1Swenshuai.xi else
4876*53ee8cc1Swenshuai.xi {
4877*53ee8cc1Swenshuai.xi #endif
4878*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(u32EngId, u32PidFltId, ((MS_U32)u16PID) & 0xFFFFUL);
4879*53ee8cc1Swenshuai.xi
4880*53ee8cc1Swenshuai.xi #ifdef DUP_PIDFLT
4881*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].DupFlt[u32PidFltId] != 0xFFFFUL)
4882*53ee8cc1Swenshuai.xi {
4883*53ee8cc1Swenshuai.xi MS_U32 u32DupFlt = _ptsp_res->_TspState[u32EngId].DupFlt[u32PidFltId];
4884*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(u32EngId, u32DupFlt, ((MS_U32)u16PID & 0xFFFFUL));
4885*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s][%d] dup id %ld, pid %x\n", __FUNCTION__, __LINE__, u32DupFlt, u16PID);
4886*53ee8cc1Swenshuai.xi }
4887*53ee8cc1Swenshuai.xi #endif
4888*53ee8cc1Swenshuai.xi
4889*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
4890*53ee8cc1Swenshuai.xi }
4891*53ee8cc1Swenshuai.xi #endif
4892*53ee8cc1Swenshuai.xi
4893*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4894*53ee8cc1Swenshuai.xi }
4895*53ee8cc1Swenshuai.xi
4896*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4897*53ee8cc1Swenshuai.xi /// Set PID to a PID filter
4898*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4899*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of PID filter to be set
4900*53ee8cc1Swenshuai.xi /// @param pu32PID \b OUT: the output PID
4901*53ee8cc1Swenshuai.xi /// @return TSP_Result
4902*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PidFlt_GetPid(MS_U32 u32EngId,MS_U32 u32PidFltId,MS_U32 * pu32PID)4903*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_GetPid(MS_U32 u32EngId, MS_U32 u32PidFltId, MS_U32* pu32PID)
4904*53ee8cc1Swenshuai.xi {
4905*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4906*53ee8cc1Swenshuai.xi
4907*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
4908*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %u\n", __LINE__, (unsigned int)u32PidFltId));
4909*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__));
4910*53ee8cc1Swenshuai.xi
4911*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
4912*53ee8cc1Swenshuai.xi if(u32PidFltId >= TSP_PIDFLT_NUM)
4913*53ee8cc1Swenshuai.xi {
4914*53ee8cc1Swenshuai.xi *pu32PID = HAL_TSP_PidFlt_GetHWPcrPid(u32PidFltId - TSP_PIDFLT_NUM);
4915*53ee8cc1Swenshuai.xi }
4916*53ee8cc1Swenshuai.xi else
4917*53ee8cc1Swenshuai.xi {
4918*53ee8cc1Swenshuai.xi #endif
4919*53ee8cc1Swenshuai.xi *pu32PID = HAL_TSP_PidFlt_GetPid(u32EngId, u32PidFltId);
4920*53ee8cc1Swenshuai.xi
4921*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
4922*53ee8cc1Swenshuai.xi }
4923*53ee8cc1Swenshuai.xi #endif
4924*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4925*53ee8cc1Swenshuai.xi }
4926*53ee8cc1Swenshuai.xi
4927*53ee8cc1Swenshuai.xi
4928*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4929*53ee8cc1Swenshuai.xi /// Select section filter of PID filter
4930*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4931*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of PID filter\n
4932*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section filter
4933*53ee8cc1Swenshuai.xi /// @return TSP_Result
4934*53ee8cc1Swenshuai.xi /// @note
4935*53ee8cc1Swenshuai.xi /// The PID filter and section filter pair is one-to-one mapping. User has to
4936*53ee8cc1Swenshuai.xi /// allocate other PID filters if user have more than one section filter for same
4937*53ee8cc1Swenshuai.xi /// PID packet.\n
4938*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PidFlt_Alloc
4939*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PidFlt_SelSecFlt(MS_U32 u32EngId,MS_U32 u32PidFltId,MS_U32 u32SecFltId)4940*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_SelSecFlt(MS_U32 u32EngId, MS_U32 u32PidFltId, MS_U32 u32SecFltId)
4941*53ee8cc1Swenshuai.xi {
4942*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4943*53ee8cc1Swenshuai.xi
4944*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
4945*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %u\n", __LINE__, (unsigned int)u32PidFltId));
4946*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__));
4947*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] SecFltId= %u\n", __LINE__, (unsigned int)u32SecFltId));
4948*53ee8cc1Swenshuai.xi
4949*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelSecFlt(u32EngId, u32PidFltId, u32SecFltId);
4950*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltMap[u32PidFltId] = u32SecFltId;
4951*53ee8cc1Swenshuai.xi _TSP_SecFlt_SetType(u32EngId, u32SecFltId, _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId]);
4952*53ee8cc1Swenshuai.xi
4953*53ee8cc1Swenshuai.xi #ifdef DUP_PIDFLT_API
4954*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].DupFlt[u32PidFltId] != 0xFFFFUL)
4955*53ee8cc1Swenshuai.xi {
4956*53ee8cc1Swenshuai.xi MS_U32 u32DupFlt = _ptsp_res->_TspState[u32EngId].DupFlt[u32PidFltId];
4957*53ee8cc1Swenshuai.xi
4958*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelSecFlt(u32EngId, u32DupFlt, u32SecFltId);
4959*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltMap[u32DupFlt] = u32SecFltId;
4960*53ee8cc1Swenshuai.xi }
4961*53ee8cc1Swenshuai.xi #endif
4962*53ee8cc1Swenshuai.xi
4963*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
4964*53ee8cc1Swenshuai.xi }
4965*53ee8cc1Swenshuai.xi
4966*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4967*53ee8cc1Swenshuai.xi /// Set PID filter input source directly
4968*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
4969*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of filter to be enable
4970*53ee8cc1Swenshuai.xi /// @param eFltSrc \b IN: Filter input source
4971*53ee8cc1Swenshuai.xi /// @return TSP_Result
4972*53ee8cc1Swenshuai.xi /// @note
4973*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PidFlt_SetInputSrc(MS_U32 u32EngId,MS_U32 u32PidFltId,DrvTSP_FltType eFltSrc)4974*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_SetInputSrc(MS_U32 u32EngId, MS_U32 u32PidFltId, DrvTSP_FltType eFltSrc)
4975*53ee8cc1Swenshuai.xi {
4976*53ee8cc1Swenshuai.xi _TSP_ENTRY();
4977*53ee8cc1Swenshuai.xi
4978*53ee8cc1Swenshuai.xi switch(eFltSrc & E_DRVTSP_FLT_SOURCE_TYPE_MASK)
4979*53ee8cc1Swenshuai.xi {
4980*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_LIVE:
4981*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32PidFltId, TSP_PIDFLT_IN_PIDFLT0);
4982*53ee8cc1Swenshuai.xi break;
4983*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE:
4984*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32PidFltId, TSP_PIDFLT_IN_PIDFLT_FILE);
4985*53ee8cc1Swenshuai.xi break;
4986*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS1:
4987*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE1:
4988*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32PidFltId, TSP_PIDFLT_IN_PIDFLT1);
4989*53ee8cc1Swenshuai.xi break;
4990*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS2:
4991*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE2:
4992*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32PidFltId, TSP_PIDFLT_IN_PIDFLT2);
4993*53ee8cc1Swenshuai.xi break;
4994*53ee8cc1Swenshuai.xi
4995*53ee8cc1Swenshuai.xi #ifdef TS3_IF_SUPPORT
4996*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TSCB:
4997*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32PidFltId, TSP_PIDFLT_IN_PIDFLT_CB);
4998*53ee8cc1Swenshuai.xi break;
4999*53ee8cc1Swenshuai.xi #endif
5000*53ee8cc1Swenshuai.xi
5001*53ee8cc1Swenshuai.xi default:
5002*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_INVALID_PARAM);
5003*53ee8cc1Swenshuai.xi
5004*53ee8cc1Swenshuai.xi }
5005*53ee8cc1Swenshuai.xi
5006*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
5007*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetFltSrcStreamID(u32EngId, u32PidFltId, (eFltSrc & E_DRVTSP_FLT_SOURCEID_MASK) >> E_DRVTSP_FLT_SOURCEID_SHIFT);
5008*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSrcId[u32PidFltId] = (eFltSrc & 0x00000F00UL) >> E_DRVTSP_FLT_SOURCEID_SHIFT;
5009*53ee8cc1Swenshuai.xi #endif
5010*53ee8cc1Swenshuai.xi
5011*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId] = eFltSrc;
5012*53ee8cc1Swenshuai.xi
5013*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5014*53ee8cc1Swenshuai.xi
5015*53ee8cc1Swenshuai.xi }
5016*53ee8cc1Swenshuai.xi
5017*53ee8cc1Swenshuai.xi
MDrv_TSP_PidFlt_SetFltRushPass(MS_U32 u32EngId,MS_U32 u32PidFltId,MS_U8 u8Enable)5018*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_SetFltRushPass(MS_U32 u32EngId, MS_U32 u32PidFltId, MS_U8 u8Enable)
5019*53ee8cc1Swenshuai.xi {
5020*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5021*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %u\n", __LINE__, (unsigned int)u32PidFltId));
5022*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__));
5023*53ee8cc1Swenshuai.xi
5024*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetFltRushPass(u32EngId, u32PidFltId, u8Enable);
5025*53ee8cc1Swenshuai.xi
5026*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5027*53ee8cc1Swenshuai.xi }
5028*53ee8cc1Swenshuai.xi
5029*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5030*53ee8cc1Swenshuai.xi /// Enable PID filter
5031*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5032*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of filter to be enable
5033*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: TRUE(enable), FALSE(disable)
5034*53ee8cc1Swenshuai.xi /// @return TSP_Result
5035*53ee8cc1Swenshuai.xi /// @note
5036*53ee8cc1Swenshuai.xi /// When PID filter enable, the section buffer pointer will be reset to buffer start address,
5037*53ee8cc1Swenshuai.xi /// overflow condition will be resolved if exist.
5038*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PidFlt_Enable(MS_U32 u32EngId,MS_U32 u32PidFltId,MS_BOOL bEnable)5039*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_Enable(MS_U32 u32EngId, MS_U32 u32PidFltId, MS_BOOL bEnable)
5040*53ee8cc1Swenshuai.xi {
5041*53ee8cc1Swenshuai.xi MS_U32 u32AVSrc = 0;
5042*53ee8cc1Swenshuai.xi
5043*53ee8cc1Swenshuai.xi #ifdef TSP_LIVE_AV_BLOCK_EN
5044*53ee8cc1Swenshuai.xi MS_BOOL bAVFIFO_BLK_Disable = FALSE;
5045*53ee8cc1Swenshuai.xi #else
5046*53ee8cc1Swenshuai.xi MS_BOOL bAVFIFO_BLK_Disable = TRUE;
5047*53ee8cc1Swenshuai.xi #endif
5048*53ee8cc1Swenshuai.xi
5049*53ee8cc1Swenshuai.xi _TSP_STR_ENTRY();
5050*53ee8cc1Swenshuai.xi
5051*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5052*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %u\n", __LINE__, (unsigned int)u32PidFltId));
5053*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__));
5054*53ee8cc1Swenshuai.xi
5055*53ee8cc1Swenshuai.xi if (!bEnable)
5056*53ee8cc1Swenshuai.xi {
5057*53ee8cc1Swenshuai.xi if (!HAS_FLAG(_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId], E_DRVTSP_FLT_STATE_ENABLE))
5058*53ee8cc1Swenshuai.xi {
5059*53ee8cc1Swenshuai.xi // TSP_DBG("[TSP_WARNNING][%06d] disable an inactive PidFlt %d\n", __LINE__, u32PidFltId);
5060*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_OK);
5061*53ee8cc1Swenshuai.xi }
5062*53ee8cc1Swenshuai.xi
5063*53ee8cc1Swenshuai.xi _TSP_PidFlt_Disable(u32EngId, u32PidFltId);
5064*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_OK);
5065*53ee8cc1Swenshuai.xi }
5066*53ee8cc1Swenshuai.xi
5067*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId], E_DRVTSP_FLT_STATE_ENABLE))
5068*53ee8cc1Swenshuai.xi {
5069*53ee8cc1Swenshuai.xi // TSP_DBG("[TSP_WARNNING][%06d] Enable an active PidFlt %d\n", __LINE__, u32PidFltId);
5070*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_OK);
5071*53ee8cc1Swenshuai.xi }
5072*53ee8cc1Swenshuai.xi
5073*53ee8cc1Swenshuai.xi switch(_ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId])
5074*53ee8cc1Swenshuai.xi {
5075*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_LIVE:
5076*53ee8cc1Swenshuai.xi u32AVSrc = E_DRVTSP_PKTSRC_DEMUX0;
5077*53ee8cc1Swenshuai.xi break;
5078*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE:
5079*53ee8cc1Swenshuai.xi u32AVSrc = E_DRVTSP_PKTSRC_DEMUXFILE;
5080*53ee8cc1Swenshuai.xi bAVFIFO_BLK_Disable = FALSE;
5081*53ee8cc1Swenshuai.xi break;
5082*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE1:
5083*53ee8cc1Swenshuai.xi u32AVSrc = E_DRVTSP_PKTSRC_DEMUX1;
5084*53ee8cc1Swenshuai.xi bAVFIFO_BLK_Disable = FALSE;
5085*53ee8cc1Swenshuai.xi break;
5086*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS1:
5087*53ee8cc1Swenshuai.xi u32AVSrc = E_DRVTSP_PKTSRC_DEMUX1;
5088*53ee8cc1Swenshuai.xi break;
5089*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE2:
5090*53ee8cc1Swenshuai.xi u32AVSrc = E_DRVTSP_PKTSRC_DEMUX2;
5091*53ee8cc1Swenshuai.xi bAVFIFO_BLK_Disable = FALSE;
5092*53ee8cc1Swenshuai.xi break;
5093*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS2:
5094*53ee8cc1Swenshuai.xi u32AVSrc = E_DRVTSP_PKTSRC_DEMUX2;
5095*53ee8cc1Swenshuai.xi break;
5096*53ee8cc1Swenshuai.xi default:
5097*53ee8cc1Swenshuai.xi break;
5098*53ee8cc1Swenshuai.xi }
5099*53ee8cc1Swenshuai.xi
5100*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_TYPE_PVR == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5101*53ee8cc1Swenshuai.xi {
5102*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32PidFltId, TSP_PIDFLT_OUT_PVR1);
5103*53ee8cc1Swenshuai.xi }
5104*53ee8cc1Swenshuai.xi #if (TSP_PVR_IF_NUM >= 2)
5105*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_PVR1 == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5106*53ee8cc1Swenshuai.xi {
5107*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32PidFltId, TSP_PIDFLT_OUT_PVR2);
5108*53ee8cc1Swenshuai.xi }
5109*53ee8cc1Swenshuai.xi #endif
5110*53ee8cc1Swenshuai.xi #ifdef TS3_IF_SUPPORT
5111*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_CB == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5112*53ee8cc1Swenshuai.xi {
5113*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32PidFltId, TSP_PIDFLT_OUT_CB);
5114*53ee8cc1Swenshuai.xi }
5115*53ee8cc1Swenshuai.xi #endif
5116*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_VIDEO == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5117*53ee8cc1Swenshuai.xi {
5118*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Src_Select(TSP_FIFO_VD, u32AVSrc);
5119*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Block_Disable(TSP_FIFO_VD, bAVFIFO_BLK_Disable);
5120*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32PidFltId, TSP_PIDFLT_OUT_VFIFO);
5121*53ee8cc1Swenshuai.xi }
5122*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_AUDIO == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5123*53ee8cc1Swenshuai.xi {
5124*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Src_Select(TSP_FIFO_AU, u32AVSrc);
5125*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Block_Disable(TSP_FIFO_AU, bAVFIFO_BLK_Disable);
5126*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32PidFltId, TSP_PIDFLT_OUT_AFIFO);
5127*53ee8cc1Swenshuai.xi }
5128*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_AUDIO2 == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5129*53ee8cc1Swenshuai.xi {
5130*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Src_Select(TSP_FIFO_AUB, u32AVSrc);
5131*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Block_Disable(TSP_FIFO_AUB, bAVFIFO_BLK_Disable);
5132*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32PidFltId, TSP_PIDFLT_OUT_AFIFO2);
5133*53ee8cc1Swenshuai.xi }
5134*53ee8cc1Swenshuai.xi #if (TSP_AUDIO3_AUDIO4_SUPPORT == 1)
5135*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_AUDIO3 == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5136*53ee8cc1Swenshuai.xi {
5137*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Src_Select(TSP_FIFO_AUC, u32AVSrc);
5138*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Block_Disable(TSP_FIFO_AUC, bAVFIFO_BLK_Disable);
5139*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32PidFltId, TSP_PIDFLT_OUT_AFIFO3);
5140*53ee8cc1Swenshuai.xi }
5141*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_AUDIO4 == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5142*53ee8cc1Swenshuai.xi {
5143*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Src_Select(TSP_FIFO_AUD, u32AVSrc);
5144*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Block_Disable(TSP_FIFO_AUD, bAVFIFO_BLK_Disable);
5145*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32PidFltId, TSP_PIDFLT_OUT_AFIFO4);
5146*53ee8cc1Swenshuai.xi }
5147*53ee8cc1Swenshuai.xi #endif
5148*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_VIDEO3D == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5149*53ee8cc1Swenshuai.xi {
5150*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Src_Select(TSP_FIFO_V3D, u32AVSrc);
5151*53ee8cc1Swenshuai.xi HAL_TSP_AVFIFO_Block_Disable(TSP_FIFO_V3D, bAVFIFO_BLK_Disable);
5152*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32PidFltId, TSP_PIDFLT_OUT_VFIFO3D);
5153*53ee8cc1Swenshuai.xi }
5154*53ee8cc1Swenshuai.xi #ifdef HWPCR_ENABLE
5155*53ee8cc1Swenshuai.xi else if (E_DRVTSP_FLT_TYPE_PCR == _ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5156*53ee8cc1Swenshuai.xi {
5157*53ee8cc1Swenshuai.xi MS_U32 u32Idx = u32PidFltId - TSP_PIDFLT_NUM;
5158*53ee8cc1Swenshuai.xi
5159*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_SelSrc(u32Idx, u32AVSrc);
5160*53ee8cc1Swenshuai.xi
5161*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
5162*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_SetSrcId(u32Idx, _ptsp_res->_TspState[u32EngId].FltSrcId[u32PidFltId]);
5163*53ee8cc1Swenshuai.xi #endif
5164*53ee8cc1Swenshuai.xi
5165*53ee8cc1Swenshuai.xi #if (TSP_HWPCR_BY_HK == 1)
5166*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u8ResetPcr[u32Idx] = 3;
5167*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u32PrevStcBase[u32Idx] = 0;
5168*53ee8cc1Swenshuai.xi _ptsp_res->TSPHwPcrParams._u32PrevPllControl[u32Idx] = 0;
5169*53ee8cc1Swenshuai.xi #endif
5170*53ee8cc1Swenshuai.xi
5171*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_Reset(u32Idx, TRUE);
5172*53ee8cc1Swenshuai.xi #if (TSP_HWPCR_BY_HK == 1)
5173*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_Reset(u32Idx, FALSE);
5174*53ee8cc1Swenshuai.xi HAL_TSP_HWPcr_Int_Enable(u32Idx, TRUE);
5175*53ee8cc1Swenshuai.xi _TSP_SetHwPcrNotifyId(u32Idx);
5176*53ee8cc1Swenshuai.xi #endif
5177*53ee8cc1Swenshuai.xi
5178*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_HWPcrFlt_Enable(u32Idx, TRUE);
5179*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId]|= E_DRVTSP_FLT_STATE_ENABLE;
5180*53ee8cc1Swenshuai.xi
5181*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_OK);
5182*53ee8cc1Swenshuai.xi }
5183*53ee8cc1Swenshuai.xi #endif
5184*53ee8cc1Swenshuai.xi else
5185*53ee8cc1Swenshuai.xi {
5186*53ee8cc1Swenshuai.xi MS_U32 u32SecFltId;
5187*53ee8cc1Swenshuai.xi
5188*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %u\n", __LINE__, (unsigned int)u32PidFltId));
5189*53ee8cc1Swenshuai.xi
5190*53ee8cc1Swenshuai.xi //u32SecFltId = HAL_TSP_PidFlt_GetSecFlt(u32EngId, u32PidFltId);
5191*53ee8cc1Swenshuai.xi u32SecFltId = _ptsp_res->_TspState[0].FltMap[u32PidFltId];
5192*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] SecFltId= %u\n", __LINE__, (unsigned int)u32SecFltId));
5193*53ee8cc1Swenshuai.xi
5194*53ee8cc1Swenshuai.xi // reset ver/crc check
5195*53ee8cc1Swenshuai.xi #ifndef DUP_PIDFLT
5196*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltType[u32PidFltId] == E_DRVTSP_FLT_TYPE_SECTION_VER)
5197*53ee8cc1Swenshuai.xi #else
5198*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltType[u32PidFltId] & E_DRVTSP_FLT_TYPE_SECTION_MASK)
5199*53ee8cc1Swenshuai.xi #endif
5200*53ee8cc1Swenshuai.xi {
5201*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_VerReset(u32SecFltId);
5202*53ee8cc1Swenshuai.xi }
5203*53ee8cc1Swenshuai.xi
5204*53ee8cc1Swenshuai.xi switch (_ptsp_res->_TspState[u32EngId].FltType[u32PidFltId])
5205*53ee8cc1Swenshuai.xi {
5206*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION:
5207*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PES:
5208*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PACKET:
5209*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_TELETEXT:
5210*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION_VER:
5211*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_SECTION_NO_PUSI:
5212*53ee8cc1Swenshuai.xi //TSP_ASSERT2(TSP_SECBUF_NUM> u32SecBufId, TSP_DBG("[TSP_ERROR][%06d] SecBufId= %ld\n", __LINE__, u32SecBufId));
5213*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_ResetBuffer(u32EngId, u32SecFltId);
5214*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_ResetState(u32EngId, u32SecFltId);
5215*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetRmnCount(u32EngId, u32SecFltId, 0);
5216*53ee8cc1Swenshuai.xi //HAL_TSP_Reset_SecDisCont_PktCount(u32PidFltId);
5217*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32PidFltId, TSP_PIDFLT_OUT_SECFLT);
5218*53ee8cc1Swenshuai.xi break;
5219*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_EMM:
5220*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_ECM:
5221*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_ResetState(u32EngId, u32SecFltId);
5222*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetRmnCount(u32EngId, u32SecFltId, 0);
5223*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_ResetBuffer(u32EngId, u32SecFltId);
5224*53ee8cc1Swenshuai.xi //HAL_TSP_Reset_SecDisCont_PktCount(u32PidFltId);
5225*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32PidFltId, TSP_PIDFLT_OUT_SECFLT);
5226*53ee8cc1Swenshuai.xi break;
5227*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PCR:
5228*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_PcrReset(u32EngId, u32SecFltId);
5229*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32PidFltId, TSP_PIDFLT_OUT_SECFLT_AF);
5230*53ee8cc1Swenshuai.xi break;
5231*53ee8cc1Swenshuai.xi default:
5232*53ee8cc1Swenshuai.xi break;
5233*53ee8cc1Swenshuai.xi }
5234*53ee8cc1Swenshuai.xi }
5235*53ee8cc1Swenshuai.xi
5236*53ee8cc1Swenshuai.xi
5237*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
5238*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetFltSrcStreamID(u32EngId, u32PidFltId, _ptsp_res->_TspState[u32EngId].FltSrcId[u32PidFltId]);
5239*53ee8cc1Swenshuai.xi #endif
5240*53ee8cc1Swenshuai.xi
5241*53ee8cc1Swenshuai.xi switch(_ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId])
5242*53ee8cc1Swenshuai.xi {
5243*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_LIVE:
5244*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32PidFltId, TSP_PIDFLT_IN_PIDFLT0);
5245*53ee8cc1Swenshuai.xi break;
5246*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE:
5247*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32PidFltId, TSP_PIDFLT_IN_PIDFLT_FILE);
5248*53ee8cc1Swenshuai.xi break;
5249*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS1:
5250*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE1:
5251*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32PidFltId, TSP_PIDFLT_IN_PIDFLT1);
5252*53ee8cc1Swenshuai.xi break;
5253*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS2:
5254*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE2:
5255*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32PidFltId, TSP_PIDFLT_IN_PIDFLT2);
5256*53ee8cc1Swenshuai.xi break;
5257*53ee8cc1Swenshuai.xi #ifdef TS3_IF_SUPPORT
5258*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TSCB:
5259*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32PidFltId, TSP_PIDFLT_IN_PIDFLT_CB);
5260*53ee8cc1Swenshuai.xi break;
5261*53ee8cc1Swenshuai.xi #endif
5262*53ee8cc1Swenshuai.xi default:
5263*53ee8cc1Swenshuai.xi break;
5264*53ee8cc1Swenshuai.xi }
5265*53ee8cc1Swenshuai.xi
5266*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32PidFltId]|= E_DRVTSP_FLT_STATE_ENABLE;
5267*53ee8cc1Swenshuai.xi
5268*53ee8cc1Swenshuai.xi #ifdef DUP_PIDFLT
5269*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].DupFlt[u32PidFltId] != 0xFFFFUL)
5270*53ee8cc1Swenshuai.xi {
5271*53ee8cc1Swenshuai.xi MS_U32 u32DupFlt = _ptsp_res->_TspState[u32EngId].DupFlt[u32PidFltId];
5272*53ee8cc1Swenshuai.xi
5273*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltOutput(u32EngId, u32DupFlt, TSP_PIDFLT_OUT_SECFLT);
5274*53ee8cc1Swenshuai.xi switch(_ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId])
5275*53ee8cc1Swenshuai.xi {
5276*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_LIVE:
5277*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32DupFlt, TSP_PIDFLT_IN_PIDFLT0);
5278*53ee8cc1Swenshuai.xi break;
5279*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE:
5280*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32DupFlt, TSP_PIDFLT_IN_PIDFLT_FILE);
5281*53ee8cc1Swenshuai.xi break;
5282*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS1:
5283*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE1:
5284*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32DupFlt, TSP_PIDFLT_IN_PIDFLT1);
5285*53ee8cc1Swenshuai.xi break;
5286*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS2:
5287*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE2:
5288*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32DupFlt, TSP_PIDFLT_IN_PIDFLT2);
5289*53ee8cc1Swenshuai.xi break;
5290*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TSCB:
5291*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelFltSource(u32EngId, u32DupFlt, TSP_PIDFLT_IN_PIDFLT_CB);
5292*53ee8cc1Swenshuai.xi break;
5293*53ee8cc1Swenshuai.xi default:
5294*53ee8cc1Swenshuai.xi break;
5295*53ee8cc1Swenshuai.xi }
5296*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32DupFlt]|= E_DRVTSP_FLT_STATE_ENABLE;
5297*53ee8cc1Swenshuai.xi
5298*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s][%d] dup id %u\n", __FUNCTION__, __LINE__, u32DupFlt);
5299*53ee8cc1Swenshuai.xi }
5300*53ee8cc1Swenshuai.xi #endif
5301*53ee8cc1Swenshuai.xi
5302*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_OK);
5303*53ee8cc1Swenshuai.xi }
5304*53ee8cc1Swenshuai.xi
5305*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5306*53ee8cc1Swenshuai.xi /// Get current PID filter status
5307*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5308*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of PID filter
5309*53ee8cc1Swenshuai.xi /// @param peState \b OUT: current ORed state flag of PID filter\n
5310*53ee8cc1Swenshuai.xi /// E_DRVTSP_FLT_STATE_ALLOC\n
5311*53ee8cc1Swenshuai.xi /// E_DRVTSP_FLT_STATE_ENABLE\n
5312*53ee8cc1Swenshuai.xi /// E_DRVTSP_FLT_STATE_SCRAMBLED ([VENUS]: TS level scramble status)
5313*53ee8cc1Swenshuai.xi /// @return TSP_Result
5314*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PidFlt_GetState(MS_U32 u32EngId,MS_U32 u32PidFltId,DrvTSP_FltState * peState)5315*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_GetState(MS_U32 u32EngId, MS_U32 u32PidFltId, DrvTSP_FltState *peState)
5316*53ee8cc1Swenshuai.xi {
5317*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5318*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5319*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_PIDFLT_NUM_ALL> u32PidFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId %u\n", __LINE__, (unsigned int)u32PidFltId));
5320*53ee8cc1Swenshuai.xi if (_TSP_PidFlt_StateGet(u32EngId, u32PidFltId, peState))
5321*53ee8cc1Swenshuai.xi {
5322*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5323*53ee8cc1Swenshuai.xi }
5324*53ee8cc1Swenshuai.xi else
5325*53ee8cc1Swenshuai.xi {
5326*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5327*53ee8cc1Swenshuai.xi }
5328*53ee8cc1Swenshuai.xi }
5329*53ee8cc1Swenshuai.xi
5330*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5331*53ee8cc1Swenshuai.xi /// Check current PID filter owner
5332*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5333*53ee8cc1Swenshuai.xi /// @param u32PidFltId \b IN: index of PID filter
5334*53ee8cc1Swenshuai.xi /// @return TSP_Result
5335*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PidFlt_ChkOwner(MS_U32 u32EngId,MS_U32 u32PidFltId)5336*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_ChkOwner(MS_U32 u32EngId, MS_U32 u32PidFltId)
5337*53ee8cc1Swenshuai.xi {
5338*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5339*53ee8cc1Swenshuai.xi
5340*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].FltState[u32PidFltId] == E_DRVTSP_FLT_STATE_NA)
5341*53ee8cc1Swenshuai.xi {
5342*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5343*53ee8cc1Swenshuai.xi }
5344*53ee8cc1Swenshuai.xi
5345*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5346*53ee8cc1Swenshuai.xi }
5347*53ee8cc1Swenshuai.xi
5348*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5349*53ee8cc1Swenshuai.xi /// Change PID filter source
5350*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5351*53ee8cc1Swenshuai.xi /// @param eFilterType \b IN: index of filter to be enable
5352*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: New filter source type & filter source Id to change
5353*53ee8cc1Swenshuai.xi /// @return TSP_Result
5354*53ee8cc1Swenshuai.xi /// @note
5355*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PidFlt_ChangeSource(MS_U32 u32EngId,MS_U32 u32PidFltId,DrvTSP_FltType eFilterType)5356*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_ChangeSource(MS_U32 u32EngId, MS_U32 u32PidFltId, DrvTSP_FltType eFilterType)
5357*53ee8cc1Swenshuai.xi {
5358*53ee8cc1Swenshuai.xi DrvTSP_FltType eFltSrc = eFilterType&E_DRVTSP_FLT_SOURCE_TYPE_MASK;
5359*53ee8cc1Swenshuai.xi
5360*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5361*53ee8cc1Swenshuai.xi
5362*53ee8cc1Swenshuai.xi if (eFltSrc == E_DRVTSP_FLT_SOURCE_TYPE_LIVE)
5363*53ee8cc1Swenshuai.xi {
5364*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId] = E_DRVTSP_FLT_SOURCE_TYPE_LIVE;
5365*53ee8cc1Swenshuai.xi }
5366*53ee8cc1Swenshuai.xi else if (eFltSrc == E_DRVTSP_FLT_SOURCE_TYPE_FILE)
5367*53ee8cc1Swenshuai.xi {
5368*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId] = E_DRVTSP_FLT_SOURCE_TYPE_FILE;
5369*53ee8cc1Swenshuai.xi }
5370*53ee8cc1Swenshuai.xi else if (eFltSrc == E_DRVTSP_FLT_SOURCE_TYPE_TS1)
5371*53ee8cc1Swenshuai.xi {
5372*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId] = E_DRVTSP_FLT_SOURCE_TYPE_TS1;
5373*53ee8cc1Swenshuai.xi }
5374*53ee8cc1Swenshuai.xi else if (eFltSrc == E_DRVTSP_FLT_SOURCE_TYPE_TS2)
5375*53ee8cc1Swenshuai.xi {
5376*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId] = E_DRVTSP_FLT_SOURCE_TYPE_TS2;
5377*53ee8cc1Swenshuai.xi }
5378*53ee8cc1Swenshuai.xi else if (eFltSrc == E_DRVTSP_FLT_SOURCE_TYPE_TSCB)
5379*53ee8cc1Swenshuai.xi {
5380*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId] = E_DRVTSP_FLT_SOURCE_TYPE_TSCB;
5381*53ee8cc1Swenshuai.xi }
5382*53ee8cc1Swenshuai.xi else if (eFltSrc == E_DRVTSP_FLT_SOURCE_TYPE_FILE1)
5383*53ee8cc1Swenshuai.xi {
5384*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId] = E_DRVTSP_FLT_SOURCE_TYPE_FILE1;
5385*53ee8cc1Swenshuai.xi }
5386*53ee8cc1Swenshuai.xi else if (eFltSrc == E_DRVTSP_FLT_SOURCE_TYPE_FILE2)
5387*53ee8cc1Swenshuai.xi {
5388*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[u32PidFltId] = E_DRVTSP_FLT_SOURCE_TYPE_FILE2;
5389*53ee8cc1Swenshuai.xi }
5390*53ee8cc1Swenshuai.xi
5391*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
5392*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSrcId[u32PidFltId] = (eFilterType & E_DRVTSP_FLT_SOURCEID_MASK) >> E_DRVTSP_FLT_SOURCEID_SHIFT;
5393*53ee8cc1Swenshuai.xi #endif
5394*53ee8cc1Swenshuai.xi
5395*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5396*53ee8cc1Swenshuai.xi }
5397*53ee8cc1Swenshuai.xi
5398*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5399*53ee8cc1Swenshuai.xi /// Get PID filter scramble status
5400*53ee8cc1Swenshuai.xi /// @param FltSrc \b IN : Filter source
5401*53ee8cc1Swenshuai.xi /// @param u32FltGroupId \b IN : Pid filter group id, every 32 filter for 1 group. 0: filter 0~31, 1: 32~63, 2: 64~95, 3: 96~127
5402*53ee8cc1Swenshuai.xi /// @param PidFltId \b IN : Pid filter id for getting. If 0xFFFFFFFF, means getting the status of all filters of the same group
5403*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
5404*53ee8cc1Swenshuai.xi /// If only checking one filter, 1 means scrambled status and 0 means non-scrambled status
5405*53ee8cc1Swenshuai.xi /// @return TSP_Result
5406*53ee8cc1Swenshuai.xi /// @note
5407*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PidFlt_GetScmbSts(DrvTSP_FltType FltSrc,MS_U32 u32FltGroupId,MS_U32 PidFltId,MS_U32 * pu32ScmbSts)5408*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PidFlt_GetScmbSts(DrvTSP_FltType FltSrc, MS_U32 u32FltGroupId, MS_U32 PidFltId, MS_U32 *pu32ScmbSts)
5409*53ee8cc1Swenshuai.xi {
5410*53ee8cc1Swenshuai.xi MS_U32 u32Src = 0;
5411*53ee8cc1Swenshuai.xi
5412*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5413*53ee8cc1Swenshuai.xi
5414*53ee8cc1Swenshuai.xi *pu32ScmbSts = 0;
5415*53ee8cc1Swenshuai.xi
5416*53ee8cc1Swenshuai.xi switch(FltSrc & E_DRVTSP_FLT_SOURCE_TYPE_MASK)
5417*53ee8cc1Swenshuai.xi {
5418*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_LIVE:
5419*53ee8cc1Swenshuai.xi u32Src = 0;
5420*53ee8cc1Swenshuai.xi break;
5421*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE:
5422*53ee8cc1Swenshuai.xi u32Src = 1;
5423*53ee8cc1Swenshuai.xi break;
5424*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS1:
5425*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE1:
5426*53ee8cc1Swenshuai.xi u32Src = 2;
5427*53ee8cc1Swenshuai.xi break;
5428*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_TS2:
5429*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_SOURCE_TYPE_FILE2:
5430*53ee8cc1Swenshuai.xi u32Src = 3;
5431*53ee8cc1Swenshuai.xi break;
5432*53ee8cc1Swenshuai.xi default:
5433*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_INVALID_PARAM);
5434*53ee8cc1Swenshuai.xi }
5435*53ee8cc1Swenshuai.xi
5436*53ee8cc1Swenshuai.xi *pu32ScmbSts = HAL_TSP_Scmb_Status(u32Src, u32FltGroupId, PidFltId);
5437*53ee8cc1Swenshuai.xi
5438*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5439*53ee8cc1Swenshuai.xi }
5440*53ee8cc1Swenshuai.xi
5441*53ee8cc1Swenshuai.xi // SecFlt API
5442*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5443*53ee8cc1Swenshuai.xi /// Allocate a section filter of a PID filter
5444*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5445*53ee8cc1Swenshuai.xi /// @param pu32SecFltId \b OUT: pointer of section filter id return
5446*53ee8cc1Swenshuai.xi /// @return TSP_Result
5447*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_Alloc(MS_U32 u32EngId,MS_U32 * pu32SecFltId)5448*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_Alloc(MS_U32 u32EngId, MS_U32 *pu32SecFltId)
5449*53ee8cc1Swenshuai.xi {
5450*53ee8cc1Swenshuai.xi MS_U32 u32SecBufId;
5451*53ee8cc1Swenshuai.xi
5452*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5453*53ee8cc1Swenshuai.xi
5454*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM > u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5455*53ee8cc1Swenshuai.xi TSP_ASSERT2(pu32SecFltId, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
5456*53ee8cc1Swenshuai.xi
5457*53ee8cc1Swenshuai.xi if (FALSE== _TSP_SecFlt_Alloc(u32EngId, E_DRVTSP_FLT_TYPE_SECTION, pu32SecFltId))
5458*53ee8cc1Swenshuai.xi {
5459*53ee8cc1Swenshuai.xi TSP_ASSERT2(0, TSP_DBG("[TSP_ERROR][%06d] Allocate section filter fail\n", __LINE__));
5460*53ee8cc1Swenshuai.xi }
5461*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM > *pu32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)(*pu32SecFltId)));
5462*53ee8cc1Swenshuai.xi u32SecBufId = *pu32SecFltId;
5463*53ee8cc1Swenshuai.xi
5464*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
5465*53ee8cc1Swenshuai.xi MS_U32 u32ii;
5466*53ee8cc1Swenshuai.xi
5467*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < DRVTSP_MAX_PROCESS_NUM; u32ii++)
5468*53ee8cc1Swenshuai.xi {
5469*53ee8cc1Swenshuai.xi if(_u32KPrcEvtTblUseFlag & (1 << u32ii))
5470*53ee8cc1Swenshuai.xi {
5471*53ee8cc1Swenshuai.xi if(_stKModePrcEvtTbl[u32ii].tgid == current->tgid)
5472*53ee8cc1Swenshuai.xi {
5473*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].s32TspEvtId[u32SecBufId] = _stKModePrcEvtTbl[u32ii].s32TspEvtId;
5474*53ee8cc1Swenshuai.xi break;
5475*53ee8cc1Swenshuai.xi }
5476*53ee8cc1Swenshuai.xi }
5477*53ee8cc1Swenshuai.xi }
5478*53ee8cc1Swenshuai.xi #else
5479*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].s32TspEvtId[u32SecBufId] = _s32TspEventId;
5480*53ee8cc1Swenshuai.xi #endif
5481*53ee8cc1Swenshuai.xi
5482*53ee8cc1Swenshuai.xi //printf("[%s][%d] u32SecBufId %d , s32TspEvtId %x\n", __FUNCTION__, __LINE__, (int)u32SecBufId, (int) _ptsp_res->_TspState[u32EngId].s32TspEvtId[u32SecBufId]);
5483*53ee8cc1Swenshuai.xi
5484*53ee8cc1Swenshuai.xi if (FALSE == _TSP_SecBuf_Alloc(u32EngId, &u32SecBufId))
5485*53ee8cc1Swenshuai.xi {
5486*53ee8cc1Swenshuai.xi TSP_ASSERT2(0, TSP_DBG("[TSP_ERROR][%06d] Allocate section buffer fail\n", __LINE__));
5487*53ee8cc1Swenshuai.xi }
5488*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECBUF_NUM > u32SecBufId, TSP_DBG("[TSP_ERROR][%06d] Bad SecBufId %u\n", __LINE__, (unsigned int)u32SecBufId));
5489*53ee8cc1Swenshuai.xi TSP_ASSERT2(u32SecBufId == *pu32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad PidFltId/SecFltId alignment\n", __LINE__));
5490*53ee8cc1Swenshuai.xi _TSP_SecBuf_Init(u32EngId, u32SecBufId);
5491*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SelSecBuf(0, *pu32SecFltId, u32SecBufId, TRUE);
5492*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5493*53ee8cc1Swenshuai.xi }
5494*53ee8cc1Swenshuai.xi
5495*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5496*53ee8cc1Swenshuai.xi /// Free a section filter of a PID filter
5497*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5498*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: section filter of TSP to be free
5499*53ee8cc1Swenshuai.xi /// @return TSP_Result
5500*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_Free(MS_U32 u32EngId,MS_U32 u32SecFltId)5501*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_Free(MS_U32 u32EngId, MS_U32 u32SecFltId)
5502*53ee8cc1Swenshuai.xi {
5503*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5504*53ee8cc1Swenshuai.xi
5505*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5506*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5507*53ee8cc1Swenshuai.xi TSP_ASSERT2(E_DRVTSP_FLT_STATE_FREE!= _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId],
5508*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%06d] Bad SecFlt state\n", __LINE__));
5509*53ee8cc1Swenshuai.xi
5510*53ee8cc1Swenshuai.xi _TSP_SecBuf_Free(u32EngId, u32SecFltId);
5511*53ee8cc1Swenshuai.xi _TSP_SecFlt_Free(u32EngId, u32SecFltId, TRUE);
5512*53ee8cc1Swenshuai.xi
5513*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5514*53ee8cc1Swenshuai.xi }
5515*53ee8cc1Swenshuai.xi
5516*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5517*53ee8cc1Swenshuai.xi //[Reserved]
5518*53ee8cc1Swenshuai.xi // Set section filtering mode
5519*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5520*53ee8cc1Swenshuai.xi // @param u32SecFltId \b IN: section filter of TSP to be free
5521*53ee8cc1Swenshuai.xi // @param eSecFltMode \b IN: continue/one-shot mode of section filter
5522*53ee8cc1Swenshuai.xi // @return TSP_Result
5523*53ee8cc1Swenshuai.xi // @attention
5524*53ee8cc1Swenshuai.xi // One-shot filter has the disadvantage of interrupt lost becuase it stops filter, a timeout
5525*53ee8cc1Swenshuai.xi // to check filter status is better for usage.
5526*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_SetMode(MS_U32 u32EngId,MS_U32 u32SecFltId,DrvTSP_FltMode eSecFltMode)5527*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_SetMode(MS_U32 u32EngId, MS_U32 u32SecFltId, DrvTSP_FltMode eSecFltMode)
5528*53ee8cc1Swenshuai.xi {
5529*53ee8cc1Swenshuai.xi MS_U32 uMode = 0;
5530*53ee8cc1Swenshuai.xi
5531*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5532*53ee8cc1Swenshuai.xi
5533*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5534*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5535*53ee8cc1Swenshuai.xi
5536*53ee8cc1Swenshuai.xi if (eSecFltMode & E_DRVTSP_FLT_MODE_ONESHOT)
5537*53ee8cc1Swenshuai.xi {
5538*53ee8cc1Swenshuai.xi uMode |= TSP_SECFLT_MODE_ONESHOT;
5539*53ee8cc1Swenshuai.xi }
5540*53ee8cc1Swenshuai.xi
5541*53ee8cc1Swenshuai.xi if (eSecFltMode & E_DRVTSP_FLT_MODE_CRCCHK)
5542*53ee8cc1Swenshuai.xi {
5543*53ee8cc1Swenshuai.xi uMode |= TSP_SECFLT_MODE_CRCCHK;
5544*53ee8cc1Swenshuai.xi }
5545*53ee8cc1Swenshuai.xi
5546*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltMode[u32SecFltId] = eSecFltMode;
5547*53ee8cc1Swenshuai.xi
5548*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetMode(u32EngId, u32SecFltId, uMode);
5549*53ee8cc1Swenshuai.xi
5550*53ee8cc1Swenshuai.xi #ifdef DUP_PIDFLT //only duplicate one-shot mode section filter
5551*53ee8cc1Swenshuai.xi if((eSecFltMode & E_DRVTSP_FLT_MODE_ONESHOT) == 0)
5552*53ee8cc1Swenshuai.xi {
5553*53ee8cc1Swenshuai.xi MS_U32 u32ii, u32OrgPidFlt = u32SecFltId;
5554*53ee8cc1Swenshuai.xi
5555*53ee8cc1Swenshuai.xi //Suggest original pid filter id = section filter id
5556*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltMap[u32SecFltId] != u32SecFltId)
5557*53ee8cc1Swenshuai.xi {
5558*53ee8cc1Swenshuai.xi for(u32OrgPidFlt = 0; u32OrgPidFlt < TSP_PIDFLT_NUM; u32OrgPidFlt++)
5559*53ee8cc1Swenshuai.xi {
5560*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltMap[u32OrgPidFlt] == u32SecFltId)
5561*53ee8cc1Swenshuai.xi {
5562*53ee8cc1Swenshuai.xi break;
5563*53ee8cc1Swenshuai.xi }
5564*53ee8cc1Swenshuai.xi }
5565*53ee8cc1Swenshuai.xi if(u32OrgPidFlt == TSP_PIDFLT_NUM)
5566*53ee8cc1Swenshuai.xi {
5567*53ee8cc1Swenshuai.xi ULOGD("TSP", "[%s][%d] No mapping Pid filter\n", __FUNCTION__, __LINE__);
5568*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5569*53ee8cc1Swenshuai.xi }
5570*53ee8cc1Swenshuai.xi }
5571*53ee8cc1Swenshuai.xi
5572*53ee8cc1Swenshuai.xi for(u32ii = (DSCMB2_FLT_END_ID + 1); u32ii < DSCMB_FLT_SHAREKEY_START_ID; u32ii++)
5573*53ee8cc1Swenshuai.xi {
5574*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[u32EngId].FltState[u32ii] == E_DRVTSP_FLT_STATE_NA)
5575*53ee8cc1Swenshuai.xi {
5576*53ee8cc1Swenshuai.xi MS_U32 u32OrgPid = HAL_TSP_PidFlt_GetPid(u32EngId, u32OrgPidFlt);
5577*53ee8cc1Swenshuai.xi
5578*53ee8cc1Swenshuai.xi _TSP_PidFlt_Init(u32EngId, u32ii);
5579*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SelSecFlt(u32EngId, u32ii, u32SecFltId);
5580*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltMap[u32ii] = u32SecFltId;
5581*53ee8cc1Swenshuai.xi if(u32OrgPid != DRVTSP_PID_NULL)
5582*53ee8cc1Swenshuai.xi {
5583*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_SetPid(u32EngId, u32ii, u32OrgPid);
5584*53ee8cc1Swenshuai.xi }
5585*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].DupFlt[u32OrgPidFlt] = u32ii;
5586*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltState[u32ii] = E_DRVTSP_FLT_STATE_ALLOC;
5587*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltType[u32ii] = _ptsp_res->_TspState[u32EngId].FltType[u32OrgPidFlt];
5588*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltSource[u32ii] = _ptsp_res->_TspState[u32EngId].FltSource[u32OrgPidFlt];
5589*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].FltMap[u32ii] = u32SecFltId;
5590*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[%s] duplcate id %ld %ld, pid %lx\n", __FUNCTION__, u32OrgPidFlt, u32ii, u32OrgPid);
5591*53ee8cc1Swenshuai.xi break;
5592*53ee8cc1Swenshuai.xi }
5593*53ee8cc1Swenshuai.xi }
5594*53ee8cc1Swenshuai.xi }
5595*53ee8cc1Swenshuai.xi #endif
5596*53ee8cc1Swenshuai.xi
5597*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5598*53ee8cc1Swenshuai.xi }
5599*53ee8cc1Swenshuai.xi
5600*53ee8cc1Swenshuai.xi
5601*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5602*53ee8cc1Swenshuai.xi /// Set Match/Mask filter pattern of section filter
5603*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5604*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of filter to be set pattern
5605*53ee8cc1Swenshuai.xi /// @param pu8Match \b IN: pointer of filter pattern (in @ref DRVTSP_FILTER_DEPTH bytes)
5606*53ee8cc1Swenshuai.xi /// @param pu8Mask \b IN: pointer of pattern bitmask (in @ref DRVTSP_FILTER_DEPTH bytes)
5607*53ee8cc1Swenshuai.xi /// @param bNotMatch \b IN: negative the result of comparion of filter
5608*53ee8cc1Swenshuai.xi /// @return TSP_Result
5609*53ee8cc1Swenshuai.xi /// note: match mask -- must set 0 to be compare (customer request)
5610*53ee8cc1Swenshuai.xi /// not match mask -- must set 1 to compare
5611*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_SetPattern(MS_U32 u32EngId,MS_U32 u32SecFltId,MS_U8 * pu8Match,MS_U8 * pu8Mask,MS_U8 * pu8NotMask)5612*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_SetPattern(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_U8 *pu8Match, MS_U8 *pu8Mask, MS_U8 *pu8NotMask)
5613*53ee8cc1Swenshuai.xi {
5614*53ee8cc1Swenshuai.xi if(pu8Match == NULL || pu8Mask == NULL || pu8NotMask == NULL)
5615*53ee8cc1Swenshuai.xi {
5616*53ee8cc1Swenshuai.xi return (DRVTSP_INVALID_PARAM);
5617*53ee8cc1Swenshuai.xi }
5618*53ee8cc1Swenshuai.xi
5619*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5620*53ee8cc1Swenshuai.xi
5621*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5622*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5623*53ee8cc1Swenshuai.xi
5624*53ee8cc1Swenshuai.xi MS_U8 i = 0;
5625*53ee8cc1Swenshuai.xi for (i = 0 ; i < 16 ; i++)
5626*53ee8cc1Swenshuai.xi {
5627*53ee8cc1Swenshuai.xi *(pu8Mask+i) = 0xFF^(*(pu8Mask+i));
5628*53ee8cc1Swenshuai.xi }
5629*53ee8cc1Swenshuai.xi
5630*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetMask(u32EngId, u32SecFltId, pu8Mask);
5631*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetMatch(u32EngId, u32SecFltId, pu8Match);
5632*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetNMask(u32EngId, u32SecFltId, pu8NotMask);
5633*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5634*53ee8cc1Swenshuai.xi }
5635*53ee8cc1Swenshuai.xi
5636*53ee8cc1Swenshuai.xi #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
5637*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5638*53ee8cc1Swenshuai.xi /// Get Match/Mask filter pattern of section filter
5639*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5640*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of filter to be set pattern
5641*53ee8cc1Swenshuai.xi /// @param pu8Match \b IN: pointer of filter pattern (in @ref DRVTSP_FILTER_DEPTH bytes)
5642*53ee8cc1Swenshuai.xi /// @param pu8Mask \b IN: pointer of pattern bitmask (in @ref DRVTSP_FILTER_DEPTH bytes)
5643*53ee8cc1Swenshuai.xi /// @param bNotMatch \b IN: negative the result of comparion of filter
5644*53ee8cc1Swenshuai.xi /// @return TSP_Result
5645*53ee8cc1Swenshuai.xi /// note: match mask -- must set 0 to be compare (customer request)
5646*53ee8cc1Swenshuai.xi /// not match mask -- must set 1 to compare
5647*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_GetPattern(MS_U32 u32EngId,MS_U32 u32SecFltId,MS_U8 * pu8Match,MS_U8 * pu8Mask,MS_U8 * pu8NotMask)5648*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_GetPattern(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_U8 *pu8Match, MS_U8 *pu8Mask, MS_U8 *pu8NotMask)
5649*53ee8cc1Swenshuai.xi {
5650*53ee8cc1Swenshuai.xi if(pu8Match == NULL || pu8Mask == NULL || pu8NotMask == NULL)
5651*53ee8cc1Swenshuai.xi {
5652*53ee8cc1Swenshuai.xi return (DRVTSP_INVALID_PARAM);
5653*53ee8cc1Swenshuai.xi }
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 %u\n", __LINE__, (unsigned int)u32EngId));
5658*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5659*53ee8cc1Swenshuai.xi
5660*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_GetMask(u32EngId, u32SecFltId, pu8Mask);
5661*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_GetMatch(u32EngId, u32SecFltId, pu8Match);
5662*53ee8cc1Swenshuai.xi
5663*53ee8cc1Swenshuai.xi MS_U8 i = 0;
5664*53ee8cc1Swenshuai.xi for (i = 0 ; i < 16 ; i++)
5665*53ee8cc1Swenshuai.xi {
5666*53ee8cc1Swenshuai.xi *(pu8Mask+i) = 0xFF^(*(pu8Mask+i));
5667*53ee8cc1Swenshuai.xi }
5668*53ee8cc1Swenshuai.xi
5669*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5670*53ee8cc1Swenshuai.xi }
5671*53ee8cc1Swenshuai.xi #endif
5672*53ee8cc1Swenshuai.xi
5673*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5674*53ee8cc1Swenshuai.xi /// Reset the section buffer read/write pointer to start address and resolve overflow condition
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 to be reset
5677*53ee8cc1Swenshuai.xi /// @return TSP_Result
5678*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_ResetBuffer(MS_U32 u32EngId,MS_U32 u32SecFltId)5679*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_ResetBuffer(MS_U32 u32EngId, MS_U32 u32SecFltId)
5680*53ee8cc1Swenshuai.xi {
5681*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5682*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5683*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5684*53ee8cc1Swenshuai.xi
5685*53ee8cc1Swenshuai.xi // Richard: Be careful since it works based the assumption that SecFltId is equal to SecBufId
5686*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_ResetBuffer(u32EngId, u32SecFltId);
5687*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_ResetState(u32EngId, u32SecFltId);
5688*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_ResetEmmIdx(u32EngId, u32SecFltId);
5689*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5690*53ee8cc1Swenshuai.xi }
5691*53ee8cc1Swenshuai.xi
5692*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5693*53ee8cc1Swenshuai.xi /// Set buffer start address and buffer size to section buffer
5694*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5695*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer to be set
5696*53ee8cc1Swenshuai.xi /// @param u32StartAddr \b IN: start address of section buffer
5697*53ee8cc1Swenshuai.xi /// @param u32BufSize \b IN: size of section buffer
5698*53ee8cc1Swenshuai.xi /// @return TSP_Result
5699*53ee8cc1Swenshuai.xi /// @note
5700*53ee8cc1Swenshuai.xi /// Buffer start address and buffer size should be 128-bit (16-byte) aligned.\n
5701*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PidFlt_Alloc
5702*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_SetBuffer(MS_U32 u32EngId,MS_U32 u32SecFltId,MS_PHY phyStartAddr,MS_U32 u32BufSize)5703*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_SetBuffer(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_PHY phyStartAddr, MS_U32 u32BufSize)
5704*53ee8cc1Swenshuai.xi {
5705*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5706*53ee8cc1Swenshuai.xi
5707*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5708*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5709*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_SetBuffer(u32EngId, u32SecFltId, phyStartAddr, u32BufSize);
5710*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5711*53ee8cc1Swenshuai.xi }
5712*53ee8cc1Swenshuai.xi
5713*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5714*53ee8cc1Swenshuai.xi /// Set request data size to trigger interrupt
5715*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5716*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer to be set
5717*53ee8cc1Swenshuai.xi /// @param u32ReqCount \b IN: received data size to trigger interrupt
5718*53ee8cc1Swenshuai.xi /// @return TSP_Result
5719*53ee8cc1Swenshuai.xi /// @note
5720*53ee8cc1Swenshuai.xi /// TSP always calls section callback function when a completed section data is
5721*53ee8cc1Swenshuai.xi /// ready at section buffer.
5722*53ee8cc1Swenshuai.xi /// It can set a request value other than 0 and TSP will also notify user when
5723*53ee8cc1Swenshuai.xi /// request size of data is ready at buffer. Only support @ref E_DRVTSP_FLT_TYPE_PES.
5724*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_SecFlt_Notify
5725*53ee8cc1Swenshuai.xi /// @attention
5726*53ee8cc1Swenshuai.xi /// The maximum request count is 0xFFFF
5727*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_SetReqCount(MS_U32 u32EngId,MS_U32 u32SecFltId,MS_U32 u32ReqCount)5728*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_SetReqCount(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_U32 u32ReqCount)
5729*53ee8cc1Swenshuai.xi {
5730*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5731*53ee8cc1Swenshuai.xi
5732*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5733*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5734*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetReqCount(u32EngId, u32SecFltId, u32ReqCount);
5735*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5736*53ee8cc1Swenshuai.xi }
5737*53ee8cc1Swenshuai.xi
5738*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5739*53ee8cc1Swenshuai.xi /// Set ECM index
5740*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5741*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer
5742*53ee8cc1Swenshuai.xi /// @param u32EcmIdx \b IN: Index of ECM
5743*53ee8cc1Swenshuai.xi /// @return TSP_Result
5744*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_SetEcmIdx(MS_U32 u32EngId,MS_U32 u32SecFltId,MS_U32 u32EcmIdx)5745*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_SetEcmIdx(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_U32 u32EcmIdx)
5746*53ee8cc1Swenshuai.xi {
5747*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5748*53ee8cc1Swenshuai.xi
5749*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5750*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5751*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetEcmIdx(u32EngId, u32SecFltId, u32EcmIdx);
5752*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5753*53ee8cc1Swenshuai.xi }
5754*53ee8cc1Swenshuai.xi
5755*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5756*53ee8cc1Swenshuai.xi /// Get buffer start address of setction buffer
5757*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5758*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer
5759*53ee8cc1Swenshuai.xi /// @param pu32BufStart \b OUT: pointer of buffer start address return
5760*53ee8cc1Swenshuai.xi /// @return TSP_Result
5761*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_GetBufStart(MS_U32 u32EngId,MS_U32 u32SecFltId,MS_PHY * pphyBufStart)5762*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_GetBufStart(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_PHY *pphyBufStart)
5763*53ee8cc1Swenshuai.xi {
5764*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5765*53ee8cc1Swenshuai.xi
5766*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5767*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5768*53ee8cc1Swenshuai.xi TSP_ASSERT2(pphyBufStart, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
5769*53ee8cc1Swenshuai.xi
5770*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_STATE_FREE == _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId])
5771*53ee8cc1Swenshuai.xi {
5772*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5773*53ee8cc1Swenshuai.xi }
5774*53ee8cc1Swenshuai.xi *pphyBufStart = (MS_PHY)HAL_TSP_SecBuf_GetBufStart(u32EngId, u32SecFltId) & 0xFFFFFFFFUL;
5775*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5776*53ee8cc1Swenshuai.xi }
5777*53ee8cc1Swenshuai.xi
5778*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5779*53ee8cc1Swenshuai.xi /// Get buffer size of section buffer
5780*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5781*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer
5782*53ee8cc1Swenshuai.xi /// @param pu32BufSize \b OUT: pointer of buffer size return
5783*53ee8cc1Swenshuai.xi /// @return TSP_Result
5784*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_GetBufSize(MS_U32 u32EngId,MS_U32 u32SecFltId,MS_U32 * pu32BufSize)5785*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_GetBufSize(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_U32 *pu32BufSize)
5786*53ee8cc1Swenshuai.xi {
5787*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5788*53ee8cc1Swenshuai.xi
5789*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5790*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5791*53ee8cc1Swenshuai.xi TSP_ASSERT2(pu32BufSize, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
5792*53ee8cc1Swenshuai.xi
5793*53ee8cc1Swenshuai.xi *pu32BufSize = 0;
5794*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_STATE_FREE == _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId])
5795*53ee8cc1Swenshuai.xi {
5796*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5797*53ee8cc1Swenshuai.xi }
5798*53ee8cc1Swenshuai.xi *pu32BufSize= (MS_U32)(HAL_TSP_SecBuf_GetBufEnd(u32EngId, u32SecFltId)-
5799*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_GetBufStart(u32EngId, u32SecFltId));
5800*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5801*53ee8cc1Swenshuai.xi }
5802*53ee8cc1Swenshuai.xi
5803*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5804*53ee8cc1Swenshuai.xi /// Get current read address of section buffer
5805*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5806*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer
5807*53ee8cc1Swenshuai.xi /// @param pphyReadAddr \b OUT: pointer of address return
5808*53ee8cc1Swenshuai.xi /// @return TSP_Result
5809*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_GetReadAddr(MS_U32 u32EngId,MS_U32 u32SecFltId,MS_PHY * pphyReadAddr)5810*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_GetReadAddr(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_PHY *pphyReadAddr)
5811*53ee8cc1Swenshuai.xi {
5812*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5813*53ee8cc1Swenshuai.xi
5814*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5815*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5816*53ee8cc1Swenshuai.xi TSP_ASSERT2(pphyReadAddr, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
5817*53ee8cc1Swenshuai.xi
5818*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_STATE_FREE == _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId])
5819*53ee8cc1Swenshuai.xi {
5820*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5821*53ee8cc1Swenshuai.xi }
5822*53ee8cc1Swenshuai.xi
5823*53ee8cc1Swenshuai.xi // move write point to read point while E_DRVTSP_FLT_MODE_AUTO_ADDR mode
5824*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].SecFltMode[u32SecFltId]&E_DRVTSP_FLT_MODE_AUTO_ADDR)
5825*53ee8cc1Swenshuai.xi {
5826*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_SetBufRead(u32EngId, u32SecFltId, HAL_TSP_SecBuf_GetBufWrite(u32EngId, u32SecFltId));
5827*53ee8cc1Swenshuai.xi }
5828*53ee8cc1Swenshuai.xi *pphyReadAddr= HAL_TSP_SecBuf_GetBufRead(u32EngId, u32SecFltId);
5829*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5830*53ee8cc1Swenshuai.xi }
5831*53ee8cc1Swenshuai.xi
5832*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5833*53ee8cc1Swenshuai.xi /// Get current section data write address of section buffer
5834*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5835*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer
5836*53ee8cc1Swenshuai.xi /// @param pphyWriteAddr \b OUT: pointer of address return
5837*53ee8cc1Swenshuai.xi /// @return TSP_Result
5838*53ee8cc1Swenshuai.xi /// @note
5839*53ee8cc1Swenshuai.xi /// User can get current write address to know where is the end of section data
5840*53ee8cc1Swenshuai.xi /// received in the section buffer.
5841*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_GetWriteAddr(MS_U32 u32EngId,MS_U32 u32SecFltId,MS_PHY * pphyWriteAddr)5842*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_GetWriteAddr(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_PHY *pphyWriteAddr)
5843*53ee8cc1Swenshuai.xi {
5844*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5845*53ee8cc1Swenshuai.xi
5846*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5847*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5848*53ee8cc1Swenshuai.xi TSP_ASSERT2(pphyWriteAddr, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
5849*53ee8cc1Swenshuai.xi
5850*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_STATE_FREE == _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId])
5851*53ee8cc1Swenshuai.xi {
5852*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5853*53ee8cc1Swenshuai.xi }
5854*53ee8cc1Swenshuai.xi
5855*53ee8cc1Swenshuai.xi // move write point to read point while E_DRVTSP_FLT_MODE_AUTO_ADDR mode
5856*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].SecFltMode[u32SecFltId]&E_DRVTSP_FLT_MODE_AUTO_ADDR)
5857*53ee8cc1Swenshuai.xi {
5858*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_SetBufRead(u32EngId, u32SecFltId, HAL_TSP_SecBuf_GetBufWrite(u32EngId, u32SecFltId));
5859*53ee8cc1Swenshuai.xi }
5860*53ee8cc1Swenshuai.xi *pphyWriteAddr= HAL_TSP_SecBuf_GetBufWrite(u32EngId, u32SecFltId);
5861*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5862*53ee8cc1Swenshuai.xi }
5863*53ee8cc1Swenshuai.xi
5864*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5865*53ee8cc1Swenshuai.xi /// Set current read address of section buffer
5866*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5867*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer
5868*53ee8cc1Swenshuai.xi /// @param phyReadAddr \b IN: address of read pointer
5869*53ee8cc1Swenshuai.xi /// @return TSP_Result
5870*53ee8cc1Swenshuai.xi /// @note
5871*53ee8cc1Swenshuai.xi /// User can update the read address to notify TSP where is the end of section
5872*53ee8cc1Swenshuai.xi /// data already read back by user.
5873*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_SetReadAddr(MS_U32 u32EngId,MS_U32 u32SecFltId,MS_PHY phyReadAddr)5874*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_SetReadAddr(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_PHY phyReadAddr)
5875*53ee8cc1Swenshuai.xi {
5876*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5877*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5878*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5879*53ee8cc1Swenshuai.xi
5880*53ee8cc1Swenshuai.xi if (E_DRVTSP_FLT_STATE_FREE == _ptsp_res->_TspState[u32EngId].SecFltState[u32SecFltId])
5881*53ee8cc1Swenshuai.xi {
5882*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5883*53ee8cc1Swenshuai.xi }
5884*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_SetBufRead(u32EngId, u32SecFltId, phyReadAddr);
5885*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5886*53ee8cc1Swenshuai.xi }
5887*53ee8cc1Swenshuai.xi
5888*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5889*53ee8cc1Swenshuai.xi /// Subscribe event notification callback function for specified section filter
5890*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5891*53ee8cc1Swenshuai.xi /// @param u32SecFltId \b IN: index of section buffer
5892*53ee8cc1Swenshuai.xi /// @param eEvents \b IN: events need to be subscribed\n
5893*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_EVENT_DATA_READY\n
5894*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_EVENT_BUF_OVERFLOW
5895*53ee8cc1Swenshuai.xi /// @param pfCallback \b IN: callback function (NULL to disable)
5896*53ee8cc1Swenshuai.xi /// @return TSP_Result
5897*53ee8cc1Swenshuai.xi /// @note
5898*53ee8cc1Swenshuai.xi /// This function register a callback function for a section filter to TSP.
5899*53ee8cc1Swenshuai.xi /// TSP calls callback function each time when data is ready in section buffer.\n
5900*53ee8cc1Swenshuai.xi /// Data ready of section filter:\n
5901*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_SECTION : a section ready\n
5902*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_PES : PES packet ready or received data over than request size.
5903*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_SecFlt_SetReqCount
5904*53ee8cc1Swenshuai.xi /// @attention
5905*53ee8cc1Swenshuai.xi /// Callback function resides in OS TSP interrupt context, it recommends
5906*53ee8cc1Swenshuai.xi /// that callback function should not take too much time to block the system.
5907*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_Notify(MS_U32 u32EngId,MS_U32 u32SecFltId,DrvTSP_Event eEvents,P_DrvTSP_EvtCallback pfCallback)5908*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_Notify(MS_U32 u32EngId, MS_U32 u32SecFltId, DrvTSP_Event eEvents, P_DrvTSP_EvtCallback pfCallback)
5909*53ee8cc1Swenshuai.xi {
5910*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5911*53ee8cc1Swenshuai.xi
5912*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5913*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5914*53ee8cc1Swenshuai.xi
5915*53ee8cc1Swenshuai.xi if ((eEvents & (E_DRVTSP_EVENT_DATA_READY | E_DRVTSP_EVENT_BUF_OVERFLOW | E_DRVTSP_EVENT_SEC_CRCERR)) == 0)
5916*53ee8cc1Swenshuai.xi {
5917*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5918*53ee8cc1Swenshuai.xi }
5919*53ee8cc1Swenshuai.xi
5920*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltEvtNotify[u32SecFltId] = eEvents;
5921*53ee8cc1Swenshuai.xi _ptsp_res->_TspState[u32EngId].SecFltCallback[u32SecFltId] = pfCallback;
5922*53ee8cc1Swenshuai.xi
5923*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5924*53ee8cc1Swenshuai.xi }
5925*53ee8cc1Swenshuai.xi
5926*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5927*53ee8cc1Swenshuai.xi //[Reserved]
5928*53ee8cc1Swenshuai.xi // Get current section filter status
5929*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
5930*53ee8cc1Swenshuai.xi // @param u32SecFltId \b IN: index of section filter
5931*53ee8cc1Swenshuai.xi // @param peState \b OUT: current ORed state flag of section filter
5932*53ee8cc1Swenshuai.xi // E_DRVTSP_FLT_STATE_ALLOC\n
5933*53ee8cc1Swenshuai.xi // E_DRVTSP_FLT_STATE_ENABLE\n
5934*53ee8cc1Swenshuai.xi // E_DRVTSP_FLT_STATE_OVERFLOW
5935*53ee8cc1Swenshuai.xi // @return TSP_Result
5936*53ee8cc1Swenshuai.xi // @note
5937*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SecFlt_GetState(MS_U32 u32EngId,MS_U32 u32SecFltId,DrvTSP_FltState * peState)5938*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SecFlt_GetState(MS_U32 u32EngId, MS_U32 u32SecFltId, DrvTSP_FltState *peState)
5939*53ee8cc1Swenshuai.xi {
5940*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5941*53ee8cc1Swenshuai.xi
5942*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5943*53ee8cc1Swenshuai.xi TSP_ASSERT2(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5944*53ee8cc1Swenshuai.xi TSP_ASSERT2(peState, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
5945*53ee8cc1Swenshuai.xi
5946*53ee8cc1Swenshuai.xi if (_TSP_SecFlt_StateGet(u32EngId, u32SecFltId, peState))
5947*53ee8cc1Swenshuai.xi {
5948*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5949*53ee8cc1Swenshuai.xi }
5950*53ee8cc1Swenshuai.xi else
5951*53ee8cc1Swenshuai.xi {
5952*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
5953*53ee8cc1Swenshuai.xi }
5954*53ee8cc1Swenshuai.xi }
5955*53ee8cc1Swenshuai.xi
MDrv_TSP_TTX_SecFlt_GetWriteAddr(MS_U32 u32EngId,MS_U32 u32SecFltId,MS_PHY * pphyWriteAddr)5956*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_TTX_SecFlt_GetWriteAddr(MS_U32 u32EngId, MS_U32 u32SecFltId, MS_PHY *pphyWriteAddr)
5957*53ee8cc1Swenshuai.xi {
5958*53ee8cc1Swenshuai.xi TSP_ASSERT(TSP_ENGINE_NUM> u32EngId, TSP_DBG("[TSP_ERROR][%06d] Bad Engine Id %u\n", __LINE__, (unsigned int)u32EngId));
5959*53ee8cc1Swenshuai.xi TSP_ASSERT(TSP_SECFLT_NUM> u32SecFltId, TSP_DBG("[TSP_ERROR][%06d] Bad SecFltId %u\n", __LINE__, (unsigned int)u32SecFltId));
5960*53ee8cc1Swenshuai.xi TSP_ASSERT(pphyWriteAddr, TSP_DBG("[TSP_ERROR][%06d] NULL pointer\n", __LINE__));
5961*53ee8cc1Swenshuai.xi // move write point to read point while E_DRVTSP_FLT_MODE_AUTO_ADDR mode
5962*53ee8cc1Swenshuai.xi
5963*53ee8cc1Swenshuai.xi if (_ptsp_res->_TspState[u32EngId].SecFltMode[u32SecFltId]&E_DRVTSP_FLT_MODE_AUTO_ADDR)
5964*53ee8cc1Swenshuai.xi {
5965*53ee8cc1Swenshuai.xi HAL_TSP_SecBuf_SetBufRead_tmp(u32EngId, u32SecFltId, HAL_TSP_SecBuf_GetBufWrite_tmp(u32EngId, u32SecFltId));
5966*53ee8cc1Swenshuai.xi }
5967*53ee8cc1Swenshuai.xi *pphyWriteAddr= HAL_TSP_SecBuf_GetBufWrite_tmp(u32EngId, u32SecFltId);
5968*53ee8cc1Swenshuai.xi return DRVTSP_OK;
5969*53ee8cc1Swenshuai.xi }
5970*53ee8cc1Swenshuai.xi
5971*53ee8cc1Swenshuai.xi // PVR API
5972*53ee8cc1Swenshuai.xi // Channel Browser API
5973*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5974*53ee8cc1Swenshuai.xi /// Set Channel Browser record buffer start addresses and buffer size
5975*53ee8cc1Swenshuai.xi /// @param u8PVRId \b IN:PVR ID
5976*53ee8cc1Swenshuai.xi /// @param phyBufStart0 \b IN: start address of PVR buffer 0
5977*53ee8cc1Swenshuai.xi /// @param phyBufStart1 \b IN: start address of PVR buffer 1
5978*53ee8cc1Swenshuai.xi /// @param u32BufSize0 \b IN: size of PVR buffer 0
5979*53ee8cc1Swenshuai.xi /// @param u32BufSize1 \b IN: size of PVR buffer 1
5980*53ee8cc1Swenshuai.xi /// @return TSP_Result
5981*53ee8cc1Swenshuai.xi /// @note: PVR1 only has single buffer
5982*53ee8cc1Swenshuai.xi /// Buffer start address and size should be 128-bit (16-byte) aligned\n
5983*53ee8cc1Swenshuai.xi /// The maximum support size is 0xFFFF0 (1048560 bytes).
5984*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_PVR_Notify
5985*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PVR_Eng_SetBuffer(MS_U8 u8PVRId,MS_PHY phyBufStart0,MS_PHY phyBufStart1,MS_U32 u32BufSize0,MS_U32 u32BufSize1)5986*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_SetBuffer(MS_U8 u8PVRId, MS_PHY phyBufStart0, MS_PHY phyBufStart1, MS_U32 u32BufSize0, MS_U32 u32BufSize1)
5987*53ee8cc1Swenshuai.xi {
5988*53ee8cc1Swenshuai.xi TSP_ASSERT(u8PVRId < ((MS_U8)TSP_PVR_IF_NUM), TSP_DBG("[TSP_ERROR][%06d] Bad PVR Engine ID\n", __LINE__));
5989*53ee8cc1Swenshuai.xi
5990*53ee8cc1Swenshuai.xi _TSP_ENTRY();
5991*53ee8cc1Swenshuai.xi HAL_TSP_PVR_SetBuffer(u8PVRId, phyBufStart0, phyBufStart1, u32BufSize0, u32BufSize1);
5992*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
5993*53ee8cc1Swenshuai.xi
5994*53ee8cc1Swenshuai.xi }
5995*53ee8cc1Swenshuai.xi
5996*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5997*53ee8cc1Swenshuai.xi /// Set Channel Browser record mode and START/STOP recording.
5998*53ee8cc1Swenshuai.xi /// @param u8PVRId \b IN:PVR ID
5999*53ee8cc1Swenshuai.xi /// @param eRecMode \b IN: mode of recording
6000*53ee8cc1Swenshuai.xi /// @param bStart \b IN: TRUE(START), FALSE(STOP)
6001*53ee8cc1Swenshuai.xi /// @return TSP_Result
6002*53ee8cc1Swenshuai.xi /// @note
6003*53ee8cc1Swenshuai.xi /// Parameter eRecMode will be ignored when bStart is FALSE(STOP)\n
6004*53ee8cc1Swenshuai.xi /// @note
6005*53ee8cc1Swenshuai.xi /// It's a synchronous function. When STOP, it flushs internal record fifo
6006*53ee8cc1Swenshuai.xi /// and update current PVR record buffer write address before function return.\n
6007*53ee8cc1Swenshuai.xi /// User can call MDrv_TSP_PVR1_GetWriteAddr to get the final valid data address
6008*53ee8cc1Swenshuai.xi /// after recording.
6009*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PVR_Eng_Start(MS_U8 u8PVRId,DrvTSP_RecMode eRecMode,MS_BOOL bStart)6010*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_Start(MS_U8 u8PVRId, DrvTSP_RecMode eRecMode, MS_BOOL bStart)
6011*53ee8cc1Swenshuai.xi {
6012*53ee8cc1Swenshuai.xi TSP_ASSERT(u8PVRId < ((MS_U8)TSP_PVR_IF_NUM), TSP_DBG("[TSP_ERROR][%06d] Bad PVR Engine ID\n", __LINE__));
6013*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6014*53ee8cc1Swenshuai.xi
6015*53ee8cc1Swenshuai.xi if (bStart)
6016*53ee8cc1Swenshuai.xi {
6017*53ee8cc1Swenshuai.xi HAL_TSP_PVR_All(u8PVRId, (HAS_FLAG(eRecMode, 0x02UL))? TRUE: FALSE, (HAS_FLAG(eRecMode, 0x02UL))? TRUE: FALSE, TRUE);
6018*53ee8cc1Swenshuai.xi
6019*53ee8cc1Swenshuai.xi HAL_TSP_PVR_Enable(u8PVRId, TRUE);
6020*53ee8cc1Swenshuai.xi }
6021*53ee8cc1Swenshuai.xi else
6022*53ee8cc1Swenshuai.xi {
6023*53ee8cc1Swenshuai.xi HAL_TSP_PVR_Enable(u8PVRId, FALSE);
6024*53ee8cc1Swenshuai.xi HAL_TSP_PVR_WaitFlush(u8PVRId);
6025*53ee8cc1Swenshuai.xi }
6026*53ee8cc1Swenshuai.xi
6027*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6028*53ee8cc1Swenshuai.xi }
6029*53ee8cc1Swenshuai.xi
6030*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6031*53ee8cc1Swenshuai.xi /// Get final write address of Channel Browser record buffer
6032*53ee8cc1Swenshuai.xi /// @param u8PVRId \b IN:PVR ID
6033*53ee8cc1Swenshuai.xi /// @param pphy2WriteAddr \b OUT: pointer of address return
6034*53ee8cc1Swenshuai.xi /// @return TSP_Result
6035*53ee8cc1Swenshuai.xi /// @note
6036*53ee8cc1Swenshuai.xi /// User can get current write address to know where is the end of section data
6037*53ee8cc1Swenshuai.xi /// received in the section buffer.
6038*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PVR_Eng_GetWriteAddr(MS_U8 u8PVRId,MS_PHY * pphy2WriteAddr)6039*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_GetWriteAddr(MS_U8 u8PVRId, MS_PHY *pphy2WriteAddr)
6040*53ee8cc1Swenshuai.xi {
6041*53ee8cc1Swenshuai.xi TSP_ASSERT(u8PVRId < ((MS_U8)TSP_PVR_IF_NUM), TSP_DBG("[TSP_ERROR][%06d] Bad PVR Engine ID\n", __LINE__));
6042*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6043*53ee8cc1Swenshuai.xi *pphy2WriteAddr = HAL_TSP_PVR_GetBufWrite(u8PVRId);
6044*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6045*53ee8cc1Swenshuai.xi }
6046*53ee8cc1Swenshuai.xi
6047*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6048*53ee8cc1Swenshuai.xi /// Subscribe event notification callback function for Channel Browser record buffer
6049*53ee8cc1Swenshuai.xi /// @param u8PVRId \b IN:PVR ID
6050*53ee8cc1Swenshuai.xi /// @param eEvents \b IN: events need to be subscribed\n
6051*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_EVENT_CBBUF_FULL
6052*53ee8cc1Swenshuai.xi /// @param pfCallback \b IN: callback function (NULL to disable)
6053*53ee8cc1Swenshuai.xi /// @return TSP_Result
6054*53ee8cc1Swenshuai.xi /// @note
6055*53ee8cc1Swenshuai.xi /// TSP Channel Browser recording uses single buffer mechanism. This function register a callback
6056*53ee8cc1Swenshuai.xi /// function for recording. TSP calls callback function each time when one of
6057*53ee8cc1Swenshuai.xi /// single buffer is full and ring to buffer start to record.\n
6058*53ee8cc1Swenshuai.xi /// @ref E_DRVTSP_FLT_TYPE_CB
6059*53ee8cc1Swenshuai.xi /// @attention
6060*53ee8cc1Swenshuai.xi /// Callback function resides in OS TSP interrupt context, it recommends
6061*53ee8cc1Swenshuai.xi /// that callback function should not take too much time to block the system.
6062*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PVR_Eng_Notify(MS_U8 u8PVRId,DrvTSP_Event eEvents,P_DrvTSP_EvtCallback pfCallback)6063*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_Notify(MS_U8 u8PVRId, DrvTSP_Event eEvents, P_DrvTSP_EvtCallback pfCallback)
6064*53ee8cc1Swenshuai.xi {
6065*53ee8cc1Swenshuai.xi if(u8PVRId >= TSP_PVR_IF_NUM)
6066*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
6067*53ee8cc1Swenshuai.xi
6068*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6069*53ee8cc1Swenshuai.xi
6070*53ee8cc1Swenshuai.xi if (pfCallback)
6071*53ee8cc1Swenshuai.xi {
6072*53ee8cc1Swenshuai.xi switch(u8PVRId)
6073*53ee8cc1Swenshuai.xi {
6074*53ee8cc1Swenshuai.xi case 0:
6075*53ee8cc1Swenshuai.xi HAL_TSP_Int_Enable(TSP_HWINT_HW_PVR1_MASK);
6076*53ee8cc1Swenshuai.xi break;
6077*53ee8cc1Swenshuai.xi case 1:
6078*53ee8cc1Swenshuai.xi HAL_TSP_Int2_Enable(TSP_HWINT_HW_PVR2_MASK);
6079*53ee8cc1Swenshuai.xi break;
6080*53ee8cc1Swenshuai.xi #if (TSP_PVR_IF_NUM > 2)
6081*53ee8cc1Swenshuai.xi case 2:
6082*53ee8cc1Swenshuai.xi HAL_TSP_Int2_Enable(TSP_HWINT_HW_PVRCB_MASK);
6083*53ee8cc1Swenshuai.xi break;
6084*53ee8cc1Swenshuai.xi #endif
6085*53ee8cc1Swenshuai.xi default:
6086*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
6087*53ee8cc1Swenshuai.xi }
6088*53ee8cc1Swenshuai.xi _TSP_SetPvrNotifyId(u8PVRId);
6089*53ee8cc1Swenshuai.xi }
6090*53ee8cc1Swenshuai.xi else
6091*53ee8cc1Swenshuai.xi {
6092*53ee8cc1Swenshuai.xi switch(u8PVRId)
6093*53ee8cc1Swenshuai.xi {
6094*53ee8cc1Swenshuai.xi case 0:
6095*53ee8cc1Swenshuai.xi HAL_TSP_Int_Disable(TSP_HWINT_HW_PVR1_MASK);
6096*53ee8cc1Swenshuai.xi break;
6097*53ee8cc1Swenshuai.xi case 1:
6098*53ee8cc1Swenshuai.xi HAL_TSP_Int2_Disable(TSP_HWINT_HW_PVR2_MASK);
6099*53ee8cc1Swenshuai.xi break;
6100*53ee8cc1Swenshuai.xi #if (TSP_PVR_IF_NUM > 2)
6101*53ee8cc1Swenshuai.xi case 2:
6102*53ee8cc1Swenshuai.xi HAL_TSP_Int2_Disable(TSP_HWINT_HW_PVRCB_MASK);
6103*53ee8cc1Swenshuai.xi break;
6104*53ee8cc1Swenshuai.xi #endif
6105*53ee8cc1Swenshuai.xi default:
6106*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
6107*53ee8cc1Swenshuai.xi }
6108*53ee8cc1Swenshuai.xi _TSP_RemovePvrNotifyId(u8PVRId);
6109*53ee8cc1Swenshuai.xi }
6110*53ee8cc1Swenshuai.xi
6111*53ee8cc1Swenshuai.xi _ptsp_res->_PvrEvtNotify[u8PVRId] = eEvents;
6112*53ee8cc1Swenshuai.xi _ptsp_res->_PvrCallback[u8PVRId] = pfCallback;
6113*53ee8cc1Swenshuai.xi
6114*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
6115*53ee8cc1Swenshuai.xi MS_U32 u32ii;
6116*53ee8cc1Swenshuai.xi
6117*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < DRVTSP_MAX_PROCESS_NUM; u32ii++)
6118*53ee8cc1Swenshuai.xi {
6119*53ee8cc1Swenshuai.xi if(_u32KPrcEvtTblUseFlag & (1 << u32ii))
6120*53ee8cc1Swenshuai.xi {
6121*53ee8cc1Swenshuai.xi if(_stKModePrcEvtTbl[u32ii].tgid == current->tgid)
6122*53ee8cc1Swenshuai.xi {
6123*53ee8cc1Swenshuai.xi _ptsp_res->_s32PvrEvtId[u8PVRId] = _stKModePrcEvtTbl[u32ii].s32TspEvtId;
6124*53ee8cc1Swenshuai.xi break;
6125*53ee8cc1Swenshuai.xi }
6126*53ee8cc1Swenshuai.xi }
6127*53ee8cc1Swenshuai.xi }
6128*53ee8cc1Swenshuai.xi #else
6129*53ee8cc1Swenshuai.xi _ptsp_res->_s32PvrEvtId[u8PVRId] = _s32TspEventId;
6130*53ee8cc1Swenshuai.xi #endif
6131*53ee8cc1Swenshuai.xi
6132*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6133*53ee8cc1Swenshuai.xi
6134*53ee8cc1Swenshuai.xi }
6135*53ee8cc1Swenshuai.xi
MDrv_TSP_PVR_Eng_SetPacketMode(MS_U8 u8PVRId,MS_BOOL bSet)6136*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_SetPacketMode(MS_U8 u8PVRId, MS_BOOL bSet)
6137*53ee8cc1Swenshuai.xi {
6138*53ee8cc1Swenshuai.xi TSP_ASSERT(u8PVRId < TSP_PVR_IF_NUM, TSP_DBG("[TSP_ERROR][%06d] Bad PVR Engine ID\n", __LINE__));
6139*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6140*53ee8cc1Swenshuai.xi HAL_TSP_PVR_PacketMode(u8PVRId, bSet);
6141*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6142*53ee8cc1Swenshuai.xi }
6143*53ee8cc1Swenshuai.xi
6144*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6145*53ee8cc1Swenshuai.xi /// Select PVR source
6146*53ee8cc1Swenshuai.xi /// @param u8PVRId \b IN:PVR ID
6147*53ee8cc1Swenshuai.xi /// @param ePktSrc \b IN: PVR packet demux source type
6148*53ee8cc1Swenshuai.xi /// @return TSP_Result
6149*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PVR_Eng_SelSrc(MS_U8 u8PVRId,DrvTSP_PKTDMXSrcType ePktSrc)6150*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_SelSrc(MS_U8 u8PVRId, DrvTSP_PKTDMXSrcType ePktSrc)
6151*53ee8cc1Swenshuai.xi {
6152*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6153*53ee8cc1Swenshuai.xi HAL_TSP_PVR_Src_Select(u8PVRId, (MS_U32)ePktSrc);
6154*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6155*53ee8cc1Swenshuai.xi }
6156*53ee8cc1Swenshuai.xi
6157*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6158*53ee8cc1Swenshuai.xi /// Enable/Disable PVR FIFO block mode
6159*53ee8cc1Swenshuai.xi /// @param u8PVRId \b IN:PVR ID
6160*53ee8cc1Swenshuai.xi /// @param ePktSrc \b IN: PVR packet demux source type
6161*53ee8cc1Swenshuai.xi /// @return TSP_Result
6162*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PVR_BlockEnable(MS_U8 u8PVRId,MS_BOOL bEnable)6163*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_BlockEnable(MS_U8 u8PVRId, MS_BOOL bEnable)
6164*53ee8cc1Swenshuai.xi {
6165*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6166*53ee8cc1Swenshuai.xi HAL_TSP_PVR_Fifo_Block_Disable(u8PVRId, !bEnable);
6167*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6168*53ee8cc1Swenshuai.xi }
6169*53ee8cc1Swenshuai.xi
6170*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6171*53ee8cc1Swenshuai.xi /// Channel Browser time stamp set
6172*53ee8cc1Swenshuai.xi /// @param u8PVRId \b IN:PVR ID
6173*53ee8cc1Swenshuai.xi /// @param u32Stamp \b IN: Channel Browser time stamp
6174*53ee8cc1Swenshuai.xi /// @return TSP_Result
6175*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PVR_Eng_TimeStampSetRecordStamp(MS_U8 u8PVRId,MS_U32 u32Stamp)6176*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_TimeStampSetRecordStamp(MS_U8 u8PVRId, MS_U32 u32Stamp)
6177*53ee8cc1Swenshuai.xi {
6178*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6179*53ee8cc1Swenshuai.xi HAL_TSP_SetPVRTimeStamp(u8PVRId, u32Stamp);
6180*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6181*53ee8cc1Swenshuai.xi }
6182*53ee8cc1Swenshuai.xi
6183*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6184*53ee8cc1Swenshuai.xi /// Channel Browser time stamp get
6185*53ee8cc1Swenshuai.xi /// @param u8PVRId \b IN:PVR ID
6186*53ee8cc1Swenshuai.xi /// @param pu32Stamp \b OUT: pointer of Channel Browser time stamp
6187*53ee8cc1Swenshuai.xi /// @return TSP_Result
6188*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PVR_Eng_TimeStampGetRecordStamp(MS_U8 u8PVRId,MS_U32 * u32Stamp)6189*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_TimeStampGetRecordStamp(MS_U8 u8PVRId, MS_U32* u32Stamp)
6190*53ee8cc1Swenshuai.xi {
6191*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6192*53ee8cc1Swenshuai.xi *u32Stamp = HAL_TSP_GetPVRTimeStamp(u8PVRId);
6193*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6194*53ee8cc1Swenshuai.xi }
6195*53ee8cc1Swenshuai.xi
6196*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6197*53ee8cc1Swenshuai.xi /// Playback time stamp Set
6198*53ee8cc1Swenshuai.xi /// @param pu32Stamp \b IN: Playback time stamp
6199*53ee8cc1Swenshuai.xi /// @return TSP_Result
6200*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PVR_TimeStampSetPlaybackStamp(MS_U32 u32Stamp)6201*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_TimeStampSetPlaybackStamp(MS_U32 u32Stamp)
6202*53ee8cc1Swenshuai.xi {
6203*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6204*53ee8cc1Swenshuai.xi HAL_TSP_SetPlayBackTimeStamp(u32Stamp);
6205*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6206*53ee8cc1Swenshuai.xi }
6207*53ee8cc1Swenshuai.xi
6208*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6209*53ee8cc1Swenshuai.xi /// Playback time stamp get
6210*53ee8cc1Swenshuai.xi /// @param pu32Stamp \b OUT: pointer of Playback time stamp
6211*53ee8cc1Swenshuai.xi /// @return TSP_Result
6212*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PVR_TimeStampGetPlaybackStamp(MS_U32 * u32Stamp)6213*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_TimeStampGetPlaybackStamp(MS_U32* u32Stamp)
6214*53ee8cc1Swenshuai.xi {
6215*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6216*53ee8cc1Swenshuai.xi * u32Stamp = HAL_TSP_GetPlayBackTimeStamp();
6217*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6218*53ee8cc1Swenshuai.xi }
6219*53ee8cc1Swenshuai.xi
6220*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6221*53ee8cc1Swenshuai.xi /// PVR time stamp Enable/Disable
6222*53ee8cc1Swenshuai.xi /// @param pu32Stamp \b IN: Enable/Disable time stamp
6223*53ee8cc1Swenshuai.xi /// @return TSP_Result
6224*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PVR_TimeStamp(MS_BOOL bEnable)6225*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_TimeStamp(MS_BOOL bEnable)
6226*53ee8cc1Swenshuai.xi {
6227*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6228*53ee8cc1Swenshuai.xi if (bEnable)
6229*53ee8cc1Swenshuai.xi {
6230*53ee8cc1Swenshuai.xi HAL_TSP_FileIn_Set(TRUE);
6231*53ee8cc1Swenshuai.xi //HAL_TSP_ResetTimeStamp();
6232*53ee8cc1Swenshuai.xi }
6233*53ee8cc1Swenshuai.xi else
6234*53ee8cc1Swenshuai.xi {
6235*53ee8cc1Swenshuai.xi HAL_TSP_FileIn_Set(FALSE);
6236*53ee8cc1Swenshuai.xi }
6237*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6238*53ee8cc1Swenshuai.xi }
6239*53ee8cc1Swenshuai.xi
6240*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6241*53ee8cc1Swenshuai.xi /// Playback time stamp clock set
6242*53ee8cc1Swenshuai.xi /// @param u8EngId \b IN:playback ID
6243*53ee8cc1Swenshuai.xi /// @param eClk \b IN: clock source type
6244*53ee8cc1Swenshuai.xi /// @return TSP_Result
6245*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PVR_Eng_SetPlaybackStampClk(MS_U32 u32EngId,MS_U32 u32Clk)6246*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_SetPlaybackStampClk(MS_U32 u32EngId, MS_U32 u32Clk)
6247*53ee8cc1Swenshuai.xi {
6248*53ee8cc1Swenshuai.xi HAL_TSP_SetPlayBackTimeStampClk(u32EngId, u32Clk);
6249*53ee8cc1Swenshuai.xi return DRVTSP_OK;
6250*53ee8cc1Swenshuai.xi }
6251*53ee8cc1Swenshuai.xi
6252*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6253*53ee8cc1Swenshuai.xi /// PVR time stamp clock set
6254*53ee8cc1Swenshuai.xi /// @param u8PvrId \b IN:PVR ID
6255*53ee8cc1Swenshuai.xi /// @param eClk \b IN: clock source type
6256*53ee8cc1Swenshuai.xi /// @return TSP_Result
6257*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PVR_Eng_SetRecordStampClk(MS_U32 u32PvrId,MS_U32 u32Clk)6258*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_SetRecordStampClk(MS_U32 u32PvrId, MS_U32 u32Clk)
6259*53ee8cc1Swenshuai.xi {
6260*53ee8cc1Swenshuai.xi HAL_TSP_SetPVRTimeStampClk(u32PvrId, u32Clk);
6261*53ee8cc1Swenshuai.xi return DRVTSP_OK;
6262*53ee8cc1Swenshuai.xi }
6263*53ee8cc1Swenshuai.xi
6264*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6265*53ee8cc1Swenshuai.xi /// Check if PVR Engine is started
6266*53ee8cc1Swenshuai.xi /// @param u8PvrId \b IN:PVR ID
6267*53ee8cc1Swenshuai.xi /// @param pbIsStart \b OUT: Pointer to store started status
6268*53ee8cc1Swenshuai.xi /// @return TSP_Result
6269*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_PVR_Eng_IsStart(MS_U32 u32PvrId,MS_BOOL * pbIsStart)6270*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVR_Eng_IsStart(MS_U32 u32PvrId, MS_BOOL *pbIsStart)
6271*53ee8cc1Swenshuai.xi {
6272*53ee8cc1Swenshuai.xi if(pbIsStart == NULL)
6273*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
6274*53ee8cc1Swenshuai.xi
6275*53ee8cc1Swenshuai.xi *pbIsStart = HAL_TSP_PVR_IsEnabled(u32PvrId);
6276*53ee8cc1Swenshuai.xi
6277*53ee8cc1Swenshuai.xi return DRVTSP_OK;
6278*53ee8cc1Swenshuai.xi }
6279*53ee8cc1Swenshuai.xi
6280*53ee8cc1Swenshuai.xi //--- PVRCA API
6281*53ee8cc1Swenshuai.xi // if the same PID is allocated, set record flag directly
MDrv_TSP_PVRCA_Close(MS_U8 u8PVRId)6282*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_PVRCA_Close(MS_U8 u8PVRId)
6283*53ee8cc1Swenshuai.xi {
6284*53ee8cc1Swenshuai.xi return (DRVTSP_OK);
6285*53ee8cc1Swenshuai.xi }
6286*53ee8cc1Swenshuai.xi
6287*53ee8cc1Swenshuai.xi // File API
6288*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6289*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : Stream start address
6290*53ee8cc1Swenshuai.xi /// @param u32StreamAddr \b IN: pointer of transport stream in memory
6291*53ee8cc1Swenshuai.xi /// @return TSP_Result
6292*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_SetAddr(MS_PHY phyStreamAddr)6293*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_SetAddr(MS_PHY phyStreamAddr)
6294*53ee8cc1Swenshuai.xi {
6295*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6296*53ee8cc1Swenshuai.xi HAL_TSP_CmdQ_TsDma_SetAddr(phyStreamAddr);
6297*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6298*53ee8cc1Swenshuai.xi }
6299*53ee8cc1Swenshuai.xi
6300*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6301*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : Stream data size
6302*53ee8cc1Swenshuai.xi /// @param u32StreamSize \b IN: size of transport stream data to be copied
6303*53ee8cc1Swenshuai.xi /// @return TSP_Result
6304*53ee8cc1Swenshuai.xi // @note u32StreamSize must be larger than 16
6305*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_SetSize(MS_U32 u32StreamSize)6306*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_SetSize(MS_U32 u32StreamSize)
6307*53ee8cc1Swenshuai.xi {
6308*53ee8cc1Swenshuai.xi if(u32StreamSize <= 16)
6309*53ee8cc1Swenshuai.xi {
6310*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
6311*53ee8cc1Swenshuai.xi }
6312*53ee8cc1Swenshuai.xi
6313*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6314*53ee8cc1Swenshuai.xi if (HAL_TSP_CmdQ_TsDma_SetSize(u32StreamSize))
6315*53ee8cc1Swenshuai.xi {
6316*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6317*53ee8cc1Swenshuai.xi }
6318*53ee8cc1Swenshuai.xi else
6319*53ee8cc1Swenshuai.xi {
6320*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
6321*53ee8cc1Swenshuai.xi }
6322*53ee8cc1Swenshuai.xi }
6323*53ee8cc1Swenshuai.xi
6324*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6325*53ee8cc1Swenshuai.xi //[Reserved]
6326*53ee8cc1Swenshuai.xi // Memory to TSP stream command : Update Stream STC
6327*53ee8cc1Swenshuai.xi // @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
6328*53ee8cc1Swenshuai.xi // @param u32STC_32 \b IN: STC[32] for next input stream
6329*53ee8cc1Swenshuai.xi // @param u32STC \b IN: STC[31:0] for next input stream
6330*53ee8cc1Swenshuai.xi // @return TSP_Result
6331*53ee8cc1Swenshuai.xi // @note M2T Command Size: 3
6332*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SetSTC(MS_U32 u32EngId,MS_U32 u32STC_32,MS_U32 u32STC)6333*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetSTC(MS_U32 u32EngId, MS_U32 u32STC_32, MS_U32 u32STC)
6334*53ee8cc1Swenshuai.xi {
6335*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6336*53ee8cc1Swenshuai.xi
6337*53ee8cc1Swenshuai.xi //[HW TODO][HW LIMIT]
6338*53ee8cc1Swenshuai.xi // STC register mapping is different between MCU and CPU.
6339*53ee8cc1Swenshuai.xi HAL_TSP_SetSTC(u32EngId, u32STC, u32STC_32);
6340*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6341*53ee8cc1Swenshuai.xi }
6342*53ee8cc1Swenshuai.xi
6343*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6344*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : Start stream input
6345*53ee8cc1Swenshuai.xi /// @param eM2tMode \b IN: input source control of filein
6346*53ee8cc1Swenshuai.xi /// @return TSP_Result
6347*53ee8cc1Swenshuai.xi /// @note Filein Command Size: 1
6348*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_GetM2tSlot
6349*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_Start(DrvTSP_FileinMode eFileinMode)6350*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_Start(DrvTSP_FileinMode eFileinMode)
6351*53ee8cc1Swenshuai.xi {
6352*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6353*53ee8cc1Swenshuai.xi // @FIXME: Good to assume enum and register definition identical?
6354*53ee8cc1Swenshuai.xi //if (E_DRVTSP_FILEIN_MODE_ENG0_TS != eFileinMode)
6355*53ee8cc1Swenshuai.xi {
6356*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Enable((MS_U32)eFileinMode);
6357*53ee8cc1Swenshuai.xi }
6358*53ee8cc1Swenshuai.xi HAL_TSP_CmdQ_TsDma_Start((MS_U32)eFileinMode);
6359*53ee8cc1Swenshuai.xi
6360*53ee8cc1Swenshuai.xi HAL_TSP_filein_enable(TRUE); //enable cmdQ after cmds are set
6361*53ee8cc1Swenshuai.xi
6362*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6363*53ee8cc1Swenshuai.xi }
6364*53ee8cc1Swenshuai.xi
6365*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6366*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : Stop stream input
6367*53ee8cc1Swenshuai.xi /// @return TSP_Result
6368*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_Stop(void)6369*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_Stop(void)
6370*53ee8cc1Swenshuai.xi {
6371*53ee8cc1Swenshuai.xi MS_U8 u8ii;
6372*53ee8cc1Swenshuai.xi MS_U8 u8ScmSrcTsif;
6373*53ee8cc1Swenshuai.xi MS_U32 u32ScmDest;
6374*53ee8cc1Swenshuai.xi
6375*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6376*53ee8cc1Swenshuai.xi
6377*53ee8cc1Swenshuai.xi HAL_TSP_filein_enable(FALSE);
6378*53ee8cc1Swenshuai.xi
6379*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
6380*53ee8cc1Swenshuai.xi
6381*53ee8cc1Swenshuai.xi for(u8ii = 0; u8ii < ((MS_U8)TSP_CA_ENGINE_NUM); u8ii++)
6382*53ee8cc1Swenshuai.xi {
6383*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Get_CACtrl(u8ii, &u8ScmSrcTsif, &u32ScmDest);
6384*53ee8cc1Swenshuai.xi
6385*53ee8cc1Swenshuai.xi if(u32ScmDest & TSP_PKTDMX0_FILE)
6386*53ee8cc1Swenshuai.xi {
6387*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_CACtrl(u8ii, TSP_SRC_FROM_PKTDMX0, TSP_PKTDMX0_LIVE);
6388*53ee8cc1Swenshuai.xi break;
6389*53ee8cc1Swenshuai.xi }
6390*53ee8cc1Swenshuai.xi if(u8ScmSrcTsif & TSP_SRC_FROM_PKTDMX0)
6391*53ee8cc1Swenshuai.xi {
6392*53ee8cc1Swenshuai.xi HAL_TSP_CSA_Set_CACtrl(u8ii, u8ScmSrcTsif, u32ScmDest|TSP_PKTDMX0_LIVE);
6393*53ee8cc1Swenshuai.xi break;
6394*53ee8cc1Swenshuai.xi }
6395*53ee8cc1Swenshuai.xi }
6396*53ee8cc1Swenshuai.xi
6397*53ee8cc1Swenshuai.xi HAL_TSP_filein_enable(FALSE);
6398*53ee8cc1Swenshuai.xi
6399*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6400*53ee8cc1Swenshuai.xi }
6401*53ee8cc1Swenshuai.xi
6402*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6403*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : pause stream input
6404*53ee8cc1Swenshuai.xi /// @return TSP_Result
6405*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_Pause(void)6406*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_Pause(void)
6407*53ee8cc1Swenshuai.xi {
6408*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6409*53ee8cc1Swenshuai.xi HAL_TSP_TsDma_Pause();
6410*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6411*53ee8cc1Swenshuai.xi
6412*53ee8cc1Swenshuai.xi }
6413*53ee8cc1Swenshuai.xi
6414*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6415*53ee8cc1Swenshuai.xi /// Memory to TSP stream control : resume stream input
6416*53ee8cc1Swenshuai.xi /// @return TSP_Result
6417*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_Resume(void)6418*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_Resume(void)
6419*53ee8cc1Swenshuai.xi {
6420*53ee8cc1Swenshuai.xi
6421*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6422*53ee8cc1Swenshuai.xi HAL_TSP_TsDma_Resume();
6423*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6424*53ee8cc1Swenshuai.xi }
6425*53ee8cc1Swenshuai.xi
6426*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6427*53ee8cc1Swenshuai.xi /// Get current file in state
6428*53ee8cc1Swenshuai.xi /// @return DrvTSP_M2tStatus
6429*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_GetM2tSlot
6430*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_GetState(DrvTSP_FileinState * peFileinState)6431*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_GetState(DrvTSP_FileinState* peFileinState)
6432*53ee8cc1Swenshuai.xi {
6433*53ee8cc1Swenshuai.xi MS_U32 state, cmdcnt;
6434*53ee8cc1Swenshuai.xi
6435*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6436*53ee8cc1Swenshuai.xi
6437*53ee8cc1Swenshuai.xi state = HAL_TSP_CmdQ_TsDma_GetState();
6438*53ee8cc1Swenshuai.xi cmdcnt = HAL_TSP_CmdQ_CmdCount();
6439*53ee8cc1Swenshuai.xi
6440*53ee8cc1Swenshuai.xi if (state & TSP_CTRL1_FILEIN_PAUSE)
6441*53ee8cc1Swenshuai.xi {
6442*53ee8cc1Swenshuai.xi *peFileinState = E_DRVTSP_FILEIN_STATE_PAUSE;
6443*53ee8cc1Swenshuai.xi }
6444*53ee8cc1Swenshuai.xi else if ((state & TSP_TSDMA_CTRL_START) || cmdcnt)
6445*53ee8cc1Swenshuai.xi {
6446*53ee8cc1Swenshuai.xi *peFileinState = E_DRVTSP_FILEIN_STATE_BUSY;
6447*53ee8cc1Swenshuai.xi }
6448*53ee8cc1Swenshuai.xi else
6449*53ee8cc1Swenshuai.xi {
6450*53ee8cc1Swenshuai.xi *peFileinState = E_DRVTSP_FILEIN_STATE_IDLE;
6451*53ee8cc1Swenshuai.xi }
6452*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6453*53ee8cc1Swenshuai.xi
6454*53ee8cc1Swenshuai.xi }
6455*53ee8cc1Swenshuai.xi
6456*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6457*53ee8cc1Swenshuai.xi /// Set Memory to TSP Stream Input Rate
6458*53ee8cc1Swenshuai.xi /// @param u32Div2 \b IN: Divider of M2T stream input rate ([1 .. 31], default 10)
6459*53ee8cc1Swenshuai.xi /// @return TSP_Result
6460*53ee8cc1Swenshuai.xi /// @note
6461*53ee8cc1Swenshuai.xi /// <b>input_rate = stream_rate / (u32Div2 * 2)</b>\n
6462*53ee8cc1Swenshuai.xi /// @note
6463*53ee8cc1Swenshuai.xi /// It's not recommend to change input rate at run-time, because it conflict with
6464*53ee8cc1Swenshuai.xi /// the internal stream synchornization mechanism.
6465*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_GetM2tSlot
6466*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_SetRate(MS_U32 u32Div2)6467*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_SetRate(MS_U32 u32Div2)
6468*53ee8cc1Swenshuai.xi {
6469*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6470*53ee8cc1Swenshuai.xi
6471*53ee8cc1Swenshuai.xi //[HW TODO][HW LIMIT]
6472*53ee8cc1Swenshuai.xi // TsDma pause can be access by TSP CPU
6473*53ee8cc1Swenshuai.xi // TsDma pause it's hard to control because read/write in different register
6474*53ee8cc1Swenshuai.xi // When setting TsDma it should be disable interrupt to prevent ISR access
6475*53ee8cc1Swenshuai.xi // but it still can't prevent TSP_cpu access at the same time.
6476*53ee8cc1Swenshuai.xi //[SW PATCH] Add a special firmware command to lock TSP_cpu DMA pause/resume.
6477*53ee8cc1Swenshuai.xi
6478*53ee8cc1Swenshuai.xi OSAL_TSP_IntDisable();
6479*53ee8cc1Swenshuai.xi HAL_TSP_TsDma_SetDelay(u32Div2);
6480*53ee8cc1Swenshuai.xi OSAL_TSP_IntEnable();
6481*53ee8cc1Swenshuai.xi
6482*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6483*53ee8cc1Swenshuai.xi }
6484*53ee8cc1Swenshuai.xi
6485*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6486*53ee8cc1Swenshuai.xi /// Set packet size to TSP file
6487*53ee8cc1Swenshuai.xi /// @param PacketMode \b IN: Mode of TSP file packet mode (192, 204, 188)
6488*53ee8cc1Swenshuai.xi /// @return TSP_Result
6489*53ee8cc1Swenshuai.xi /// @note
6490*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_SetPacketMode(DrvTSP_PacketMode PKT_Mode)6491*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_SetPacketMode(DrvTSP_PacketMode PKT_Mode)
6492*53ee8cc1Swenshuai.xi {
6493*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6494*53ee8cc1Swenshuai.xi
6495*53ee8cc1Swenshuai.xi HAL_TSP_filein_enable(FALSE); //disable cmdQ before cmds are set
6496*53ee8cc1Swenshuai.xi
6497*53ee8cc1Swenshuai.xi switch (PKT_Mode)
6498*53ee8cc1Swenshuai.xi {
6499*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTMODE_188:
6500*53ee8cc1Swenshuai.xi HAL_TSP_SetPKTSize(0xBBUL);
6501*53ee8cc1Swenshuai.xi break;
6502*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTMODE_192:
6503*53ee8cc1Swenshuai.xi HAL_TSP_SetPKTSize(0xBFUL);
6504*53ee8cc1Swenshuai.xi break;
6505*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTMODE_204:
6506*53ee8cc1Swenshuai.xi HAL_TSP_SetPKTSize(0xCBUL);
6507*53ee8cc1Swenshuai.xi break;
6508*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTMODE_130:
6509*53ee8cc1Swenshuai.xi HAL_TSP_SetPKTSize(0x82UL);
6510*53ee8cc1Swenshuai.xi break;
6511*53ee8cc1Swenshuai.xi case E_DRVTSP_PKTMODE_134:
6512*53ee8cc1Swenshuai.xi HAL_TSP_SetPKTSize(0x86UL);
6513*53ee8cc1Swenshuai.xi break;
6514*53ee8cc1Swenshuai.xi default:
6515*53ee8cc1Swenshuai.xi break;
6516*53ee8cc1Swenshuai.xi }
6517*53ee8cc1Swenshuai.xi
6518*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Disable();
6519*53ee8cc1Swenshuai.xi
6520*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6521*53ee8cc1Swenshuai.xi }
6522*53ee8cc1Swenshuai.xi
6523*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6524*53ee8cc1Swenshuai.xi /// Get the number of empty slot of M2T command
6525*53ee8cc1Swenshuai.xi /// @param pu32EmptySlot \b OUT: pointer of empty slot count return
6526*53ee8cc1Swenshuai.xi /// @return TSP_Result
6527*53ee8cc1Swenshuai.xi /// @note
6528*53ee8cc1Swenshuai.xi /// M2T is a command queue command, it can be queued by TSP when another M2T command
6529*53ee8cc1Swenshuai.xi /// is executing by TSP. The queued commands will be executed by order (FIFO)
6530*53ee8cc1Swenshuai.xi /// when previous M2T command execution is finished.
6531*53ee8cc1Swenshuai.xi /// @note
6532*53ee8cc1Swenshuai.xi /// User should call GetM2TSlot to make sure there is enough empty M2T command slot
6533*53ee8cc1Swenshuai.xi /// before sending any M2T command. (Each command has different command size)
6534*53ee8cc1Swenshuai.xi /// @sa MDrv_TSP_M2T_SetAddr, MDrv_TSP_M2T_SetSize, MDrv_TSP_M2T_Start,
6535*53ee8cc1Swenshuai.xi //[Reserved] MDrv_TSP_M2T_SetSTC
6536*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_CMDQ_GetSlot(MS_U32 * pu32EmptySlot)6537*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_CMDQ_GetSlot(MS_U32 *pu32EmptySlot)
6538*53ee8cc1Swenshuai.xi {
6539*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6540*53ee8cc1Swenshuai.xi *pu32EmptySlot = HAL_TSP_CmdQ_EmptyCount();
6541*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6542*53ee8cc1Swenshuai.xi }
6543*53ee8cc1Swenshuai.xi
6544*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6545*53ee8cc1Swenshuai.xi /// Reset command queue
6546*53ee8cc1Swenshuai.xi /// @return TSP_Result
6547*53ee8cc1Swenshuai.xi /// @note
6548*53ee8cc1Swenshuai.xi /// SW patch--wait command queue empty
6549*53ee8cc1Swenshuai.xi /// wait HW ECO
6550*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_CMDQ_Reset(void)6551*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_CMDQ_Reset(void)
6552*53ee8cc1Swenshuai.xi {
6553*53ee8cc1Swenshuai.xi MS_BOOL bRet;
6554*53ee8cc1Swenshuai.xi
6555*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6556*53ee8cc1Swenshuai.xi bRet = HAL_TSP_CmdQ_Reset();
6557*53ee8cc1Swenshuai.xi if (TRUE == bRet)
6558*53ee8cc1Swenshuai.xi {
6559*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6560*53ee8cc1Swenshuai.xi }
6561*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
6562*53ee8cc1Swenshuai.xi }
6563*53ee8cc1Swenshuai.xi
6564*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
6565*53ee8cc1Swenshuai.xi /// Get command queue fifo level
6566*53ee8cc1Swenshuai.xi /// @param pu8FifoLevel \b OUT: fifo level, 0~3
6567*53ee8cc1Swenshuai.xi /// @return TSP_Result
6568*53ee8cc1Swenshuai.xi /// @note
6569*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
MDrv_TSP_CmdQFifo_Status(MS_U8 * pu8FifoLevel)6570*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_CmdQFifo_Status(MS_U8 *pu8FifoLevel)
6571*53ee8cc1Swenshuai.xi {
6572*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6573*53ee8cc1Swenshuai.xi
6574*53ee8cc1Swenshuai.xi *pu8FifoLevel = HAL_TSP_Get_CmdQFifoLevel();
6575*53ee8cc1Swenshuai.xi
6576*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6577*53ee8cc1Swenshuai.xi }
6578*53ee8cc1Swenshuai.xi
6579*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6580*53ee8cc1Swenshuai.xi /// Enable timestamp block scheme
6581*53ee8cc1Swenshuai.xi /// @return TSP_Result
6582*53ee8cc1Swenshuai.xi /// @note
6583*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_192BlockScheme_En(MS_BOOL bEnable)6584*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_192BlockScheme_En(MS_BOOL bEnable)
6585*53ee8cc1Swenshuai.xi {
6586*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6587*53ee8cc1Swenshuai.xi HAL_TSP_FileIn_192BlockScheme_En(bEnable);
6588*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6589*53ee8cc1Swenshuai.xi }
6590*53ee8cc1Swenshuai.xi
6591*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6592*53ee8cc1Swenshuai.xi /// Enable PS path
6593*53ee8cc1Swenshuai.xi /// @param eM2tMode \b IN: input source control of filein
6594*53ee8cc1Swenshuai.xi /// @return TSP_Result
6595*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_PS_Path_Enable(DrvTSP_FileinMode eFileinMode)6596*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_PS_Path_Enable(DrvTSP_FileinMode eFileinMode)
6597*53ee8cc1Swenshuai.xi {
6598*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6599*53ee8cc1Swenshuai.xi HAL_TSP_PS_Path_Enable((MS_U32)eFileinMode);
6600*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6601*53ee8cc1Swenshuai.xi }
6602*53ee8cc1Swenshuai.xi
MDrv_TSP_File_TSIFSrcSel(DrvTSP_FltType eFltSrc,MS_BOOL bFileMode)6603*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_TSIFSrcSel(DrvTSP_FltType eFltSrc, MS_BOOL bFileMode)
6604*53ee8cc1Swenshuai.xi {
6605*53ee8cc1Swenshuai.xi MS_U32 u32Src = 0;
6606*53ee8cc1Swenshuai.xi
6607*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6608*53ee8cc1Swenshuai.xi
6609*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
6610*53ee8cc1Swenshuai.xi if(eFltSrc == E_DRVTSP_FLT_SOURCE_TYPE_FILE)
6611*53ee8cc1Swenshuai.xi {
6612*53ee8cc1Swenshuai.xi HAL_TSP_TSIFFI_SrcSelect(bFileMode);
6613*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6614*53ee8cc1Swenshuai.xi }
6615*53ee8cc1Swenshuai.xi #endif
6616*53ee8cc1Swenshuai.xi
6617*53ee8cc1Swenshuai.xi #if (TSP_IF_NUM > 1)
6618*53ee8cc1Swenshuai.xi if(eFltSrc == E_DRVTSP_FLT_SOURCE_TYPE_TS1)
6619*53ee8cc1Swenshuai.xi {
6620*53ee8cc1Swenshuai.xi if(bFileMode == TRUE)
6621*53ee8cc1Swenshuai.xi {
6622*53ee8cc1Swenshuai.xi u32Src = TSP_PIDFLT1_USE_TSIF_MMFI0;
6623*53ee8cc1Swenshuai.xi }
6624*53ee8cc1Swenshuai.xi else
6625*53ee8cc1Swenshuai.xi {
6626*53ee8cc1Swenshuai.xi u32Src = TSP_PIDFLT1_USE_TSIF1;
6627*53ee8cc1Swenshuai.xi }
6628*53ee8cc1Swenshuai.xi }
6629*53ee8cc1Swenshuai.xi else if(eFltSrc == E_DRVTSP_FLT_SOURCE_TYPE_TS2)
6630*53ee8cc1Swenshuai.xi {
6631*53ee8cc1Swenshuai.xi if(bFileMode == TRUE)
6632*53ee8cc1Swenshuai.xi {
6633*53ee8cc1Swenshuai.xi u32Src = TSP_PIDFLT2_USE_TSIF_MMFI1;
6634*53ee8cc1Swenshuai.xi }
6635*53ee8cc1Swenshuai.xi else
6636*53ee8cc1Swenshuai.xi {
6637*53ee8cc1Swenshuai.xi u32Src = TSP_PIDFLT2_USE_TSIF2;
6638*53ee8cc1Swenshuai.xi }
6639*53ee8cc1Swenshuai.xi }
6640*53ee8cc1Swenshuai.xi #endif
6641*53ee8cc1Swenshuai.xi
6642*53ee8cc1Swenshuai.xi HAL_TSP_PidFlt_Src_Select(u32Src);
6643*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6644*53ee8cc1Swenshuai.xi }
6645*53ee8cc1Swenshuai.xi
6646*53ee8cc1Swenshuai.xi // Legacy
6647*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6648*53ee8cc1Swenshuai.xi /// Get Scmb states
6649*53ee8cc1Swenshuai.xi /// @param u32EngId \b IN: index of TSP engine [ 0 .. (@ref DRVTSP_ENGINE_NUM-1) ]
6650*53ee8cc1Swenshuai.xi /// @param pScmbLevel \b IN: TS interface setting
6651*53ee8cc1Swenshuai.xi /// @return TSP_Result
6652*53ee8cc1Swenshuai.xi /// @note
6653*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Scmb_Status(MS_U32 u32EngId,DrvTSP_Scmb_Level * pScmbLevel)6654*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Scmb_Status(MS_U32 u32EngId, DrvTSP_Scmb_Level* pScmbLevel)
6655*53ee8cc1Swenshuai.xi {
6656*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6657*53ee8cc1Swenshuai.xi *pScmbLevel= E_DRVTSP_SCMB_NONE;
6658*53ee8cc1Swenshuai.xi
6659*53ee8cc1Swenshuai.xi if(HAL_TSP_Scmb_Status(0UL, 0UL, 0xFFFFFFFFUL))
6660*53ee8cc1Swenshuai.xi {
6661*53ee8cc1Swenshuai.xi *pScmbLevel= E_DRVTSP_SCMB_TS;
6662*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6663*53ee8cc1Swenshuai.xi }
6664*53ee8cc1Swenshuai.xi if(HAL_TSP_Scmb_Status(0UL, 1UL, 0xFFFFFFFFUL))
6665*53ee8cc1Swenshuai.xi {
6666*53ee8cc1Swenshuai.xi *pScmbLevel= E_DRVTSP_SCMB_TS;
6667*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6668*53ee8cc1Swenshuai.xi }
6669*53ee8cc1Swenshuai.xi if(HAL_TSP_Scmb_Status(0UL, 2UL, 0xFFFFFFFFUL))
6670*53ee8cc1Swenshuai.xi {
6671*53ee8cc1Swenshuai.xi *pScmbLevel= E_DRVTSP_SCMB_TS;
6672*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6673*53ee8cc1Swenshuai.xi }
6674*53ee8cc1Swenshuai.xi if(HAL_TSP_Scmb_Status(0UL, 3UL, 0xFFFFFFFFUL))
6675*53ee8cc1Swenshuai.xi {
6676*53ee8cc1Swenshuai.xi *pScmbLevel= E_DRVTSP_SCMB_TS;
6677*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6678*53ee8cc1Swenshuai.xi }
6679*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6680*53ee8cc1Swenshuai.xi }
6681*53ee8cc1Swenshuai.xi
MDrv_TSP_GetCap(DrvTSP_Cap eCap,void * pOutput)6682*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetCap(DrvTSP_Cap eCap, void* pOutput)
6683*53ee8cc1Swenshuai.xi {
6684*53ee8cc1Swenshuai.xi *((MS_U32*)pOutput) = 0UL;
6685*53ee8cc1Swenshuai.xi
6686*53ee8cc1Swenshuai.xi if (eCap >= E_DRVTSP_CAP_NULL)
6687*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
6688*53ee8cc1Swenshuai.xi
6689*53ee8cc1Swenshuai.xi if(eCap == E_DRVTSP_CAP_RESOURCE_SIZE)
6690*53ee8cc1Swenshuai.xi {
6691*53ee8cc1Swenshuai.xi *((MS_U32*)pOutput) = sizeof(TSP_RESOURCE_PRIVATE);
6692*53ee8cc1Swenshuai.xi return DRVTSP_OK;
6693*53ee8cc1Swenshuai.xi }
6694*53ee8cc1Swenshuai.xi
6695*53ee8cc1Swenshuai.xi if(HAL_TSP_GetCap((MS_U32)eCap, pOutput))
6696*53ee8cc1Swenshuai.xi {
6697*53ee8cc1Swenshuai.xi return DRVTSP_OK;
6698*53ee8cc1Swenshuai.xi }
6699*53ee8cc1Swenshuai.xi else
6700*53ee8cc1Swenshuai.xi {
6701*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
6702*53ee8cc1Swenshuai.xi }
6703*53ee8cc1Swenshuai.xi }
6704*53ee8cc1Swenshuai.xi
MDrv_TSP_GetStatus(DrvTSP_HW_Status * HW_Status,DrvTSP_SW_Status * SW_Status)6705*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetStatus(DrvTSP_HW_Status *HW_Status, DrvTSP_SW_Status *SW_Status)
6706*53ee8cc1Swenshuai.xi {
6707*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6708*53ee8cc1Swenshuai.xi if (HAL_TSP_Alive())
6709*53ee8cc1Swenshuai.xi {
6710*53ee8cc1Swenshuai.xi *HW_Status = E_DRVTSP_HW_ALIVE;
6711*53ee8cc1Swenshuai.xi }
6712*53ee8cc1Swenshuai.xi else
6713*53ee8cc1Swenshuai.xi {
6714*53ee8cc1Swenshuai.xi *HW_Status = E_DRVTSP_HW_DEALIVE;
6715*53ee8cc1Swenshuai.xi }
6716*53ee8cc1Swenshuai.xi *SW_Status = _ptsp_res->_TspState[0].TSPStatus;
6717*53ee8cc1Swenshuai.xi
6718*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6719*53ee8cc1Swenshuai.xi }
6720*53ee8cc1Swenshuai.xi
MDrv_TSP_SetDbgLevel(DrvTSP_DbgLevel DbgLevel)6721*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetDbgLevel(DrvTSP_DbgLevel DbgLevel)
6722*53ee8cc1Swenshuai.xi {
6723*53ee8cc1Swenshuai.xi //TSP_DBG("[%s][%d] DbgLevel %u \n", __FUNCTION__, __LINE__, DbgLevel);
6724*53ee8cc1Swenshuai.xi _u32TSPDGBLevel = DbgLevel;
6725*53ee8cc1Swenshuai.xi
6726*53ee8cc1Swenshuai.xi return DRVTSP_OK;
6727*53ee8cc1Swenshuai.xi }
6728*53ee8cc1Swenshuai.xi
MDrv_TSP_GetTSIFStatus(DrvTSP_If eIf,DrvTSP_If_Set * pIfSet,MS_U16 * pu16Clk)6729*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetTSIFStatus(DrvTSP_If eIf, DrvTSP_If_Set* pIfSet, MS_U16* pu16Clk)
6730*53ee8cc1Swenshuai.xi {
6731*53ee8cc1Swenshuai.xi TSP_Result Res = DRVTSP_OK;
6732*53ee8cc1Swenshuai.xi MS_U16 u16pad = 0, u16clk = 0;
6733*53ee8cc1Swenshuai.xi
6734*53ee8cc1Swenshuai.xi _TSP_STR_ENTRY();
6735*53ee8cc1Swenshuai.xi
6736*53ee8cc1Swenshuai.xi switch(eIf)
6737*53ee8cc1Swenshuai.xi {
6738*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_TS0:
6739*53ee8cc1Swenshuai.xi HAL_TSP_GetTSIF_Status(0, &u16pad, &u16clk, &(pIfSet->bExtSync), &(pIfSet->bParallel));
6740*53ee8cc1Swenshuai.xi break;
6741*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_TS1:
6742*53ee8cc1Swenshuai.xi HAL_TSP_GetTSIF_Status(1, &u16pad, &u16clk, &(pIfSet->bExtSync), &(pIfSet->bParallel));
6743*53ee8cc1Swenshuai.xi break;
6744*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_TS2:
6745*53ee8cc1Swenshuai.xi HAL_TSP_GetTSIF_Status(2, &u16pad, &u16clk, &(pIfSet->bExtSync), &(pIfSet->bParallel));
6746*53ee8cc1Swenshuai.xi break;
6747*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_TS3:
6748*53ee8cc1Swenshuai.xi HAL_TSP_GetTSIF_Status(3, &u16pad, &u16clk, &(pIfSet->bExtSync), &(pIfSet->bParallel));
6749*53ee8cc1Swenshuai.xi break;
6750*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
6751*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_FI:
6752*53ee8cc1Swenshuai.xi HAL_TSP_GetTSIF_Status(0x80, &u16pad, &u16clk, &(pIfSet->bExtSync), &(pIfSet->bParallel));
6753*53ee8cc1Swenshuai.xi break;
6754*53ee8cc1Swenshuai.xi #endif
6755*53ee8cc1Swenshuai.xi default:
6756*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_NOT_SUPPORTED);
6757*53ee8cc1Swenshuai.xi }
6758*53ee8cc1Swenshuai.xi
6759*53ee8cc1Swenshuai.xi *pu16Clk = u16clk;
6760*53ee8cc1Swenshuai.xi
6761*53ee8cc1Swenshuai.xi switch(u16pad)
6762*53ee8cc1Swenshuai.xi {
6763*53ee8cc1Swenshuai.xi case TSP_MUX_INDEMOD:
6764*53ee8cc1Swenshuai.xi if((u16clk & CLKGEN0_TSP_CLK_MASK) != TSP_CLK_INDEMOD)
6765*53ee8cc1Swenshuai.xi Res = DRVTSP_FUNC_ERROR;
6766*53ee8cc1Swenshuai.xi pIfSet->ePad = E_DRVTSP_PAD_DEMOD;
6767*53ee8cc1Swenshuai.xi break;
6768*53ee8cc1Swenshuai.xi case TSP_MUX_TS0:
6769*53ee8cc1Swenshuai.xi if((u16clk & CLKGEN0_TSP_CLK_MASK) != TSP_CLK_TS0)
6770*53ee8cc1Swenshuai.xi Res = DRVTSP_FUNC_ERROR;
6771*53ee8cc1Swenshuai.xi pIfSet->ePad = E_DRVTSP_PAD_EXT_INPUT0;
6772*53ee8cc1Swenshuai.xi break;
6773*53ee8cc1Swenshuai.xi #if (TSP_TS_PAD_NUM >= 2)
6774*53ee8cc1Swenshuai.xi case TSP_MUX_TS1:
6775*53ee8cc1Swenshuai.xi if((u16clk & CLKGEN0_TSP_CLK_MASK) != TSP_CLK_TS1)
6776*53ee8cc1Swenshuai.xi Res = DRVTSP_FUNC_ERROR;
6777*53ee8cc1Swenshuai.xi pIfSet->ePad = E_DRVTSP_PAD_EXT_INPUT1;
6778*53ee8cc1Swenshuai.xi break;
6779*53ee8cc1Swenshuai.xi #endif
6780*53ee8cc1Swenshuai.xi #if (TSP_TS_PAD_NUM >= 3)
6781*53ee8cc1Swenshuai.xi case TSP_MUX_TS2:
6782*53ee8cc1Swenshuai.xi if((u16clk & CLKGEN0_TSP_CLK_MASK) != TSP_CLK_TS2)
6783*53ee8cc1Swenshuai.xi Res = DRVTSP_FUNC_ERROR;
6784*53ee8cc1Swenshuai.xi pIfSet->ePad = E_DRVTSP_PAD_EXT_INPUT2;
6785*53ee8cc1Swenshuai.xi break;
6786*53ee8cc1Swenshuai.xi case TSP_MUX_TSCB:
6787*53ee8cc1Swenshuai.xi if((u16clk & CLKGEN0_TSP_CLK_MASK) != TSP_CLK_TSCB)
6788*53ee8cc1Swenshuai.xi Res = DRVTSP_FUNC_ERROR;
6789*53ee8cc1Swenshuai.xi pIfSet->ePad = E_DRVTSP_PAD_EXT_INPUT3;
6790*53ee8cc1Swenshuai.xi break;
6791*53ee8cc1Swenshuai.xi #endif
6792*53ee8cc1Swenshuai.xi #if defined(TSP_MUX_TS3)
6793*53ee8cc1Swenshuai.xi case TSP_MUX_TS3:
6794*53ee8cc1Swenshuai.xi if((u16clk & CLKGEN0_TSP_CLK_MASK) != TSP_CLK_TS3)
6795*53ee8cc1Swenshuai.xi Res = DRVTSP_FUNC_ERROR;
6796*53ee8cc1Swenshuai.xi pIfSet->ePad = E_DRVTSP_PAD_EXT_INPUT3;
6797*53ee8cc1Swenshuai.xi break;
6798*53ee8cc1Swenshuai.xi #endif
6799*53ee8cc1Swenshuai.xi #if defined(TSP_MUX_TS4)
6800*53ee8cc1Swenshuai.xi case TSP_MUX_TS4:
6801*53ee8cc1Swenshuai.xi if((u16clk & CLKGEN0_TSP_CLK_MASK) != TSP_CLK_TS4)
6802*53ee8cc1Swenshuai.xi Res = DRVTSP_FUNC_ERROR;
6803*53ee8cc1Swenshuai.xi pIfSet->ePad = E_DRVTSP_PAD_EXT_INPUT4;
6804*53ee8cc1Swenshuai.xi break;
6805*53ee8cc1Swenshuai.xi #endif
6806*53ee8cc1Swenshuai.xi #if defined(TSP_MUX_TS5)
6807*53ee8cc1Swenshuai.xi case TSP_MUX_TS5:
6808*53ee8cc1Swenshuai.xi if((u16clk & CLKGEN0_TSP_CLK_MASK) != TSP_CLK_TS5)
6809*53ee8cc1Swenshuai.xi Res = DRVTSP_FUNC_ERROR;
6810*53ee8cc1Swenshuai.xi pIfSet->ePad = E_DRVTSP_PAD_EXT_INPUT5;
6811*53ee8cc1Swenshuai.xi break;
6812*53ee8cc1Swenshuai.xi #endif
6813*53ee8cc1Swenshuai.xi #if defined(TSP_MUX_TSO)
6814*53ee8cc1Swenshuai.xi case TSP_MUX_TSO:
6815*53ee8cc1Swenshuai.xi if((u16clk & CLKGEN0_TSP_CLK_MASK) != TSP_CLK_TSOOUT)
6816*53ee8cc1Swenshuai.xi Res = DRVTSP_FUNC_ERROR;
6817*53ee8cc1Swenshuai.xi pIfSet->ePad = E_DRVTSP_PAD_TSO;
6818*53ee8cc1Swenshuai.xi break;
6819*53ee8cc1Swenshuai.xi #endif
6820*53ee8cc1Swenshuai.xi default:
6821*53ee8cc1Swenshuai.xi break;
6822*53ee8cc1Swenshuai.xi }
6823*53ee8cc1Swenshuai.xi
6824*53ee8cc1Swenshuai.xi pIfSet->bClkInv = ((u16clk & TSP_CLK_INVERSE) == TSP_CLK_INVERSE);
6825*53ee8cc1Swenshuai.xi
6826*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(Res);
6827*53ee8cc1Swenshuai.xi }
6828*53ee8cc1Swenshuai.xi
6829*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6830*53ee8cc1Swenshuai.xi /// Get TSP driver version
6831*53ee8cc1Swenshuai.xi /// @param <IN> \b const MS_U8 **pVerString :
6832*53ee8cc1Swenshuai.xi /// @param <RET> \b : when get ok, return the pointer to the driver version
6833*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_GetLibVer(const MSIF_Version ** ppVersion)6834*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetLibVer(const MSIF_Version **ppVersion)
6835*53ee8cc1Swenshuai.xi {
6836*53ee8cc1Swenshuai.xi // No mutex check, it can be called before Init
6837*53ee8cc1Swenshuai.xi if (!ppVersion)
6838*53ee8cc1Swenshuai.xi {
6839*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
6840*53ee8cc1Swenshuai.xi }
6841*53ee8cc1Swenshuai.xi
6842*53ee8cc1Swenshuai.xi *ppVersion = &_drv_tsp_version;
6843*53ee8cc1Swenshuai.xi
6844*53ee8cc1Swenshuai.xi return DRVTSP_OK;
6845*53ee8cc1Swenshuai.xi }
6846*53ee8cc1Swenshuai.xi
MDrv_TSP_Alive(MS_U32 u32EngId)6847*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Alive(MS_U32 u32EngId)
6848*53ee8cc1Swenshuai.xi {
6849*53ee8cc1Swenshuai.xi _TSP_ENTRY();
6850*53ee8cc1Swenshuai.xi if (HAL_TSP_Alive())
6851*53ee8cc1Swenshuai.xi {
6852*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
6853*53ee8cc1Swenshuai.xi }
6854*53ee8cc1Swenshuai.xi else
6855*53ee8cc1Swenshuai.xi {
6856*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
6857*53ee8cc1Swenshuai.xi }
6858*53ee8cc1Swenshuai.xi }
6859*53ee8cc1Swenshuai.xi
MDrv_TSP_IsAccess(MS_U32 u32Try)6860*53ee8cc1Swenshuai.xi inline TSP_Result MDrv_TSP_IsAccess(MS_U32 u32Try)
6861*53ee8cc1Swenshuai.xi {
6862*53ee8cc1Swenshuai.xi return (HAL_TSP_TTX_IsAccess(u32Try))? DRVTSP_OK: DRVTSP_FAIL;
6863*53ee8cc1Swenshuai.xi }
6864*53ee8cc1Swenshuai.xi
MDrv_TSP_UnlockAccess(void)6865*53ee8cc1Swenshuai.xi inline TSP_Result MDrv_TSP_UnlockAccess(void)
6866*53ee8cc1Swenshuai.xi {
6867*53ee8cc1Swenshuai.xi HAL_TSP_TTX_UnlockAccess();
6868*53ee8cc1Swenshuai.xi return DRVTSP_OK;
6869*53ee8cc1Swenshuai.xi }
6870*53ee8cc1Swenshuai.xi
6871*53ee8cc1Swenshuai.xi
6872*53ee8cc1Swenshuai.xi // Following are 2 private function used to solve annoying interrupt thread disappearing problem when fork.
6873*53ee8cc1Swenshuai.xi // Should not be exposed to general users.
MDrv_TSP_CloseInterrupt(void)6874*53ee8cc1Swenshuai.xi MS_BOOL MDrv_TSP_CloseInterrupt(void)
6875*53ee8cc1Swenshuai.xi {
6876*53ee8cc1Swenshuai.xi // IntDisable
6877*53ee8cc1Swenshuai.xi // IntDetach
6878*53ee8cc1Swenshuai.xi OSAL_TSP_IntDisable();
6879*53ee8cc1Swenshuai.xi OSAL_TSP_IntDetach();
6880*53ee8cc1Swenshuai.xi
6881*53ee8cc1Swenshuai.xi return TRUE;
6882*53ee8cc1Swenshuai.xi }
6883*53ee8cc1Swenshuai.xi
6884*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6885*53ee8cc1Swenshuai.xi /// Initialize lib resource API
6886*53ee8cc1Swenshuai.xi /// @param pu32ResMemAddr \b IN: Pointer to store resource memory address
6887*53ee8cc1Swenshuai.xi /// @return TSP_Result
6888*53ee8cc1Swenshuai.xi /// @note
6889*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_InitLibResource(void * pResMemAddr)6890*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_InitLibResource(void *pResMemAddr)
6891*53ee8cc1Swenshuai.xi {
6892*53ee8cc1Swenshuai.xi TSP_ASSERT((pResMemAddr != 0),
6893*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%s][%06d] pointer is NULL!\n", __FUNCTION__, __LINE__));
6894*53ee8cc1Swenshuai.xi
6895*53ee8cc1Swenshuai.xi MS_VIRT virtBank, virtBank1;
6896*53ee8cc1Swenshuai.xi MS_PHY u32BankSize;
6897*53ee8cc1Swenshuai.xi MS_PHY u32BankSize1;
6898*53ee8cc1Swenshuai.xi
6899*53ee8cc1Swenshuai.xi _ptsp_res = (TSP_RESOURCE_PRIVATE*)pResMemAddr;
6900*53ee8cc1Swenshuai.xi
6901*53ee8cc1Swenshuai.xi if(_ptsp_res->_bSWInitReady != TRUE)
6902*53ee8cc1Swenshuai.xi {
6903*53ee8cc1Swenshuai.xi if(_TSP_InitResource(_ptsp_res) == FALSE)
6904*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
6905*53ee8cc1Swenshuai.xi }
6906*53ee8cc1Swenshuai.xi
6907*53ee8cc1Swenshuai.xi // For multi-process use case. (different process should set the value of bank again)
6908*53ee8cc1Swenshuai.xi if(_bBankInit == FALSE)
6909*53ee8cc1Swenshuai.xi {
6910*53ee8cc1Swenshuai.xi if (FALSE == MDrv_MMIO_GetBASE(&virtBank, &u32BankSize, MS_MODULE_TSP))
6911*53ee8cc1Swenshuai.xi {
6912*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("MDrv_MMIO_GetBASE fail\n"));
6913*53ee8cc1Swenshuai.xi MS_ASSERT(0);
6914*53ee8cc1Swenshuai.xi }
6915*53ee8cc1Swenshuai.xi if (FALSE == MDrv_MMIO_GetBASE(&virtBank1, &u32BankSize1, MS_MODULE_PM))
6916*53ee8cc1Swenshuai.xi {
6917*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("MDrv_MMIO_GetBASE fail\n"));
6918*53ee8cc1Swenshuai.xi MS_ASSERT(0);
6919*53ee8cc1Swenshuai.xi }
6920*53ee8cc1Swenshuai.xi
6921*53ee8cc1Swenshuai.xi HAL_TSP_SetBank(virtBank, virtBank1);
6922*53ee8cc1Swenshuai.xi _bBankInit = TRUE;
6923*53ee8cc1Swenshuai.xi }
6924*53ee8cc1Swenshuai.xi
6925*53ee8cc1Swenshuai.xi return DRVTSP_OK;
6926*53ee8cc1Swenshuai.xi }
6927*53ee8cc1Swenshuai.xi
6928*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6929*53ee8cc1Swenshuai.xi /// Initialize TSP driver and TSP engine
6930*53ee8cc1Swenshuai.xi /// @return TSP_Result
6931*53ee8cc1Swenshuai.xi /// @note
6932*53ee8cc1Swenshuai.xi /// It should be called before calling any other TSP DDI functions.
6933*53ee8cc1Swenshuai.xi /// Driver task is in @ref E_TASK_PRI_SYS level.
6934*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Init(MS_PHY phyFWAddr,MS_U32 u32FWSize)6935*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Init(MS_PHY phyFWAddr, MS_U32 u32FWSize)
6936*53ee8cc1Swenshuai.xi {
6937*53ee8cc1Swenshuai.xi MS_DEBUG_MSG(TSP_DBG ("******************start TSP init*********************************\n"));
6938*53ee8cc1Swenshuai.xi TSP_Result bRet;
6939*53ee8cc1Swenshuai.xi
6940*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
6941*53ee8cc1Swenshuai.xi if(MDrv_TSP_Ree_TeeCmdSystem_Init() == DRVTSP_FAIL)
6942*53ee8cc1Swenshuai.xi {
6943*53ee8cc1Swenshuai.xi MS_DEBUG_MSG(TSP_DBG ("[%s] Register Mailbox failed!\n", __FUNCTION__));
6944*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
6945*53ee8cc1Swenshuai.xi }
6946*53ee8cc1Swenshuai.xi #endif //SECURE_PVR_ENABLE
6947*53ee8cc1Swenshuai.xi
6948*53ee8cc1Swenshuai.xi //if already init, set the same HK parameter & interrupt num to this process, and attached Isr for this new process
6949*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
6950*53ee8cc1Swenshuai.xi if((_ptsp_res->_bSWInitReady == TRUE) && (_s32TspTaskId != -1))
6951*53ee8cc1Swenshuai.xi {
6952*53ee8cc1Swenshuai.xi return MDrv_TSP_Reinit(_bIsHK);
6953*53ee8cc1Swenshuai.xi }
6954*53ee8cc1Swenshuai.xi #endif //MSOS_TYPE_LINUX_KERNEL
6955*53ee8cc1Swenshuai.xi
6956*53ee8cc1Swenshuai.xi _ptsp_res->_phyFwAddr = phyFWAddr;
6957*53ee8cc1Swenshuai.xi _ptsp_res->_u32FwSize = u32FWSize;
6958*53ee8cc1Swenshuai.xi if (DRVTSP_OK != (bRet = _TSP_Init(TRUE, FALSE)))
6959*53ee8cc1Swenshuai.xi {
6960*53ee8cc1Swenshuai.xi return bRet;
6961*53ee8cc1Swenshuai.xi }
6962*53ee8cc1Swenshuai.xi MS_DEBUG_MSG(TSP_DBG ("**********************End TSP init*****************************\n"));
6963*53ee8cc1Swenshuai.xi
6964*53ee8cc1Swenshuai.xi return DRVTSP_OK;
6965*53ee8cc1Swenshuai.xi }
6966*53ee8cc1Swenshuai.xi
6967*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
6968*53ee8cc1Swenshuai.xi /// Initialize TSP driver for hal parameters init and attaching Isr
6969*53ee8cc1Swenshuai.xi /// @return TSP_Result
6970*53ee8cc1Swenshuai.xi /// @note
6971*53ee8cc1Swenshuai.xi /// Only for the second process to init
6972*53ee8cc1Swenshuai.xi /// Driver task is in @ref E_TASK_PRI_SYS level.
6973*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Reinit(MS_BOOL bHK)6974*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Reinit(MS_BOOL bHK)
6975*53ee8cc1Swenshuai.xi {
6976*53ee8cc1Swenshuai.xi MS_VIRT virtTspBank, virtTspBank1;
6977*53ee8cc1Swenshuai.xi MS_PHY u32TspBankSize;
6978*53ee8cc1Swenshuai.xi MS_PHY u32TspBankSize1;
6979*53ee8cc1Swenshuai.xi MS_U8 u8ii = 0, u8tmp;
6980*53ee8cc1Swenshuai.xi
6981*53ee8cc1Swenshuai.xi _bIsHK = bHK;
6982*53ee8cc1Swenshuai.xi _u32IntNum = (bHK) ? E_INT_IRQ_TSP2HK : E_INT_FIQ_TSP2AEON; // use this once MHEG5 using utopia msos
6983*53ee8cc1Swenshuai.xi
6984*53ee8cc1Swenshuai.xi if (FALSE == MDrv_MMIO_GetBASE(&virtTspBank, &u32TspBankSize, MS_MODULE_TSP))
6985*53ee8cc1Swenshuai.xi {
6986*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("MDrv_MMIO_GetBASE fail\n"));
6987*53ee8cc1Swenshuai.xi MS_ASSERT(0);
6988*53ee8cc1Swenshuai.xi }
6989*53ee8cc1Swenshuai.xi if (FALSE == MDrv_MMIO_GetBASE(&virtTspBank1, &u32TspBankSize1, MS_MODULE_PM))
6990*53ee8cc1Swenshuai.xi {
6991*53ee8cc1Swenshuai.xi MS_CRITICAL_MSG(TSP_DBG("MDrv_MMIO_GetBASE fail\n"));
6992*53ee8cc1Swenshuai.xi MS_ASSERT(0);
6993*53ee8cc1Swenshuai.xi }
6994*53ee8cc1Swenshuai.xi
6995*53ee8cc1Swenshuai.xi HAL_TSP_SetBank(virtTspBank, virtTspBank1);
6996*53ee8cc1Swenshuai.xi
6997*53ee8cc1Swenshuai.xi HAL_TSP_STC64_Mode_En(TRUE);
6998*53ee8cc1Swenshuai.xi
6999*53ee8cc1Swenshuai.xi _s32ExtMutexId = OSAL_TSP_MutexCreate((MS_U8*)tsp_ext_mutex);
7000*53ee8cc1Swenshuai.xi
7001*53ee8cc1Swenshuai.xi if(_u32LibMode != DRVTSP_CMD_LIB_MODE_KRN)
7002*53ee8cc1Swenshuai.xi {
7003*53ee8cc1Swenshuai.xi _s32TspEventId = OSAL_TSP_EventCreate((MS_U8*)tsp_event);
7004*53ee8cc1Swenshuai.xi }
7005*53ee8cc1Swenshuai.xi
7006*53ee8cc1Swenshuai.xi u8tmp = (MS_U8)((TSP_SECFLT_NUM+31UL)>>5UL);
7007*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < u8tmp; u8ii++)
7008*53ee8cc1Swenshuai.xi {
7009*53ee8cc1Swenshuai.xi _s32TspSecRdyId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_secRdy);
7010*53ee8cc1Swenshuai.xi _s32TspSecOvfId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_crcerr);
7011*53ee8cc1Swenshuai.xi _s32TspSecCrcId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_secovf);
7012*53ee8cc1Swenshuai.xi _s32TspFltDisableId[u8ii] = OSAL_TSP_EventCreate((MS_U8*)tsp_fltdis);
7013*53ee8cc1Swenshuai.xi _u32SecNotifyId[u8ii] = 0;
7014*53ee8cc1Swenshuai.xi }
7015*53ee8cc1Swenshuai.xi
7016*53ee8cc1Swenshuai.xi u8tmp = (MS_U8)((TSP_PVR_IF_NUM+31UL)>>5UL);
7017*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < u8tmp; u8ii++)
7018*53ee8cc1Swenshuai.xi {
7019*53ee8cc1Swenshuai.xi _u32PvrNotifyId[u8ii] = 0;
7020*53ee8cc1Swenshuai.xi }
7021*53ee8cc1Swenshuai.xi
7022*53ee8cc1Swenshuai.xi #if (defined(HWPCR_ENABLE) && (TSP_HWPCR_BY_HK == 1))
7023*53ee8cc1Swenshuai.xi u8tmp = (MS_U8)((TSP_PCRFLT_NUM+31UL)>>5UL);
7024*53ee8cc1Swenshuai.xi for (u8ii = 0; u8ii < u8tmp; u8ii++)
7025*53ee8cc1Swenshuai.xi {
7026*53ee8cc1Swenshuai.xi _u32HwPcrNotifyId[u8ii] = 0;
7027*53ee8cc1Swenshuai.xi }
7028*53ee8cc1Swenshuai.xi #endif
7029*53ee8cc1Swenshuai.xi
7030*53ee8cc1Swenshuai.xi if(_u32LibMode != DRVTSP_CMD_LIB_MODE_KRN)
7031*53ee8cc1Swenshuai.xi {
7032*53ee8cc1Swenshuai.xi _s32TspTaskId = OSAL_TSP_TaskCreate(_TSP_Isr_Proc_Task, (MS_U8*)tsp_isr_task);
7033*53ee8cc1Swenshuai.xi }
7034*53ee8cc1Swenshuai.xi
7035*53ee8cc1Swenshuai.xi _ptsp_res->_u32ProcessNum++;
7036*53ee8cc1Swenshuai.xi
7037*53ee8cc1Swenshuai.xi
7038*53ee8cc1Swenshuai.xi // IntDisable
7039*53ee8cc1Swenshuai.xi // IntDetach
7040*53ee8cc1Swenshuai.xi OSAL_TSP_IntDisable();
7041*53ee8cc1Swenshuai.xi //#ifndef MSOS_TYPE_LINUX_KERNEL
7042*53ee8cc1Swenshuai.xi OSAL_TSP_IntDetach();
7043*53ee8cc1Swenshuai.xi //#endif
7044*53ee8cc1Swenshuai.xi
7045*53ee8cc1Swenshuai.xi OSAL_TSP_IntAttach(_TSP_Isr);
7046*53ee8cc1Swenshuai.xi //#ifndef MSOS_TYPE_LINUX_KERNEL
7047*53ee8cc1Swenshuai.xi OSAL_TSP_IntEnable();
7048*53ee8cc1Swenshuai.xi //#endif
7049*53ee8cc1Swenshuai.xi
7050*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7051*53ee8cc1Swenshuai.xi }
7052*53ee8cc1Swenshuai.xi
MDrv_TSP_Reset(void)7053*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Reset(void)
7054*53ee8cc1Swenshuai.xi {
7055*53ee8cc1Swenshuai.xi _TSP_RegStateReset();
7056*53ee8cc1Swenshuai.xi HAL_TSP_Reset(0);
7057*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7058*53ee8cc1Swenshuai.xi }
7059*53ee8cc1Swenshuai.xi
MDrv_TSP_OpenInterrupt(void)7060*53ee8cc1Swenshuai.xi MS_BOOL MDrv_TSP_OpenInterrupt(void)
7061*53ee8cc1Swenshuai.xi {
7062*53ee8cc1Swenshuai.xi OSAL_TSP_IntAttach(_TSP_Isr);
7063*53ee8cc1Swenshuai.xi OSAL_TSP_IntEnable();
7064*53ee8cc1Swenshuai.xi return TRUE;
7065*53ee8cc1Swenshuai.xi }
7066*53ee8cc1Swenshuai.xi
MDrv_TSP_BurstLen(MS_U32 u32Len)7067*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_BurstLen(MS_U32 u32Len)
7068*53ee8cc1Swenshuai.xi {
7069*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7070*53ee8cc1Swenshuai.xi HAL_TSP_SetDMABurstLen(u32Len);
7071*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7072*53ee8cc1Swenshuai.xi }
7073*53ee8cc1Swenshuai.xi
MDrv_TSP_GetFileInTimeStamp(MS_U32 * u32TSLen)7074*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetFileInTimeStamp(MS_U32* u32TSLen)
7075*53ee8cc1Swenshuai.xi {
7076*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7077*53ee8cc1Swenshuai.xi *u32TSLen = HAL_TSP_GetFileInTimeStamp();
7078*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7079*53ee8cc1Swenshuai.xi }
7080*53ee8cc1Swenshuai.xi
MDrv_TSP_GetDbgPortInfo(MS_U32 u32DbgSel,MS_U32 * u32DbgInfo)7081*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetDbgPortInfo(MS_U32 u32DbgSel,MS_U32* u32DbgInfo)
7082*53ee8cc1Swenshuai.xi {
7083*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7084*53ee8cc1Swenshuai.xi *u32DbgInfo = HAL_TSP_GetDBGPortInfo(u32DbgSel);
7085*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7086*53ee8cc1Swenshuai.xi }
7087*53ee8cc1Swenshuai.xi
7088*53ee8cc1Swenshuai.xi //[LEGACY] //[OBSOLETE]
MDrv_TSP_SetHK(MS_BOOL bIsHK)7089*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetHK(MS_BOOL bIsHK)
7090*53ee8cc1Swenshuai.xi {
7091*53ee8cc1Swenshuai.xi //_TSP_ENTRY();
7092*53ee8cc1Swenshuai.xi _bIsHK = bIsHK;
7093*53ee8cc1Swenshuai.xi _u32IntNum = ((bIsHK) ? E_INT_IRQ_TSP2HK : E_INT_FIQ_TSP2AEON); // use this once MHEG5 using utopia msos
7094*53ee8cc1Swenshuai.xi
7095*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7096*53ee8cc1Swenshuai.xi //_TSP_RETURN(DRVTSP_OK);
7097*53ee8cc1Swenshuai.xi }
7098*53ee8cc1Swenshuai.xi //[LEGACY] //[OBSOLETE]
7099*53ee8cc1Swenshuai.xi
MDrv_TSP_Get_FW_VER(MS_U32 * u32FWVer)7100*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_FW_VER(MS_U32* u32FWVer)
7101*53ee8cc1Swenshuai.xi {
7102*53ee8cc1Swenshuai.xi MS_U32 _u32fw;
7103*53ee8cc1Swenshuai.xi _u32fw = HAL_TSP_Get_FW_VER();
7104*53ee8cc1Swenshuai.xi *u32FWVer = _u32fw;
7105*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7106*53ee8cc1Swenshuai.xi }
7107*53ee8cc1Swenshuai.xi
MDrv_TSP_WriteProtect_Enable(MS_BOOL bEnable,MS_PHY * pphyStartAddr,MS_PHY * pphyEndAddr)7108*53ee8cc1Swenshuai.xi void MDrv_TSP_WriteProtect_Enable(MS_BOOL bEnable, MS_PHY* pphyStartAddr, MS_PHY* pphyEndAddr)
7109*53ee8cc1Swenshuai.xi {
7110*53ee8cc1Swenshuai.xi HAL_TSP_WriteProtect_Enable(bEnable, pphyStartAddr, pphyEndAddr);
7111*53ee8cc1Swenshuai.xi }
7112*53ee8cc1Swenshuai.xi
MDrv_TSP_OrzWriteProtect_Enable(MS_BOOL bEnable,MS_PHY phyStartAddr,MS_PHY phyEndAddr)7113*53ee8cc1Swenshuai.xi void MDrv_TSP_OrzWriteProtect_Enable(MS_BOOL bEnable, MS_PHY phyStartAddr, MS_PHY phyEndAddr)
7114*53ee8cc1Swenshuai.xi {
7115*53ee8cc1Swenshuai.xi HAL_TSP_OrzWriteProtect_Enable(bEnable, phyStartAddr, phyEndAddr);
7116*53ee8cc1Swenshuai.xi }
7117*53ee8cc1Swenshuai.xi
MDrv_TSP_TSIF_Enable(DrvTSP_If tsif,MS_BOOL bEnable)7118*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_TSIF_Enable(DrvTSP_If tsif, MS_BOOL bEnable)
7119*53ee8cc1Swenshuai.xi {
7120*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7121*53ee8cc1Swenshuai.xi switch (tsif)
7122*53ee8cc1Swenshuai.xi {
7123*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_TS0:
7124*53ee8cc1Swenshuai.xi HAL_TSP_TSIF0_Enable(bEnable);
7125*53ee8cc1Swenshuai.xi break;
7126*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_TS1:
7127*53ee8cc1Swenshuai.xi HAL_TSP_TSIF1_Enable(bEnable);
7128*53ee8cc1Swenshuai.xi break;
7129*53ee8cc1Swenshuai.xi default:
7130*53ee8cc1Swenshuai.xi ULOGE("TSP", "[%s][%d] IF not support\n",__FUNCTION__, __LINE__);
7131*53ee8cc1Swenshuai.xi break;
7132*53ee8cc1Swenshuai.xi }
7133*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7134*53ee8cc1Swenshuai.xi }
7135*53ee8cc1Swenshuai.xi
MDrv_TSP_ReadDropPktCnt(MS_U16 * pu16ADropCnt,MS_U16 * pu16VDropCnt)7136*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_ReadDropPktCnt(MS_U16* pu16ADropCnt, MS_U16* pu16VDropCnt)
7137*53ee8cc1Swenshuai.xi {
7138*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7139*53ee8cc1Swenshuai.xi
7140*53ee8cc1Swenshuai.xi if(HAL_TSP_Read_DropPktCnt(pu16ADropCnt, pu16VDropCnt) == TRUE)
7141*53ee8cc1Swenshuai.xi {
7142*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7143*53ee8cc1Swenshuai.xi }
7144*53ee8cc1Swenshuai.xi else
7145*53ee8cc1Swenshuai.xi {
7146*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
7147*53ee8cc1Swenshuai.xi }
7148*53ee8cc1Swenshuai.xi }
7149*53ee8cc1Swenshuai.xi
MDrv_TSP_Get_Intr_Count(MS_U32 * pu32Count)7150*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_Intr_Count(MS_U32* pu32Count)
7151*53ee8cc1Swenshuai.xi {
7152*53ee8cc1Swenshuai.xi *pu32Count = _ptsp_res->_u32DbgIntrCount;
7153*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7154*53ee8cc1Swenshuai.xi }
7155*53ee8cc1Swenshuai.xi
_DumpFwMsg(void)7156*53ee8cc1Swenshuai.xi static void _DumpFwMsg(void)
7157*53ee8cc1Swenshuai.xi {
7158*53ee8cc1Swenshuai.xi MS_S32 tmp = 0;
7159*53ee8cc1Swenshuai.xi MS_S32 len = 0;
7160*53ee8cc1Swenshuai.xi MS_VIRT vptr = 0;
7161*53ee8cc1Swenshuai.xi char p8buf[256];
7162*53ee8cc1Swenshuai.xi p8buf[255] = '\0';
7163*53ee8cc1Swenshuai.xi char* p = 0;
7164*53ee8cc1Swenshuai.xi
7165*53ee8cc1Swenshuai.xi MS_PHY phyWritePos = *(volatile MS_PHY*)MS_PA2KSEG1(_FwDbgInfo.phyBufAddr);
7166*53ee8cc1Swenshuai.xi vptr = MS_PA2KSEG1(_FwDbgInfo.phyBufAddr) + _FwDbgInfo.phyReadPos;
7167*53ee8cc1Swenshuai.xi p = (char*)vptr;
7168*53ee8cc1Swenshuai.xi //ULOGD("TSP", "_pFwDbgInfo->phyBufAddr = 0x%x\n", (unsigned int)_FwDbgInfo.phyBufAddr);
7169*53ee8cc1Swenshuai.xi //ULOGD("TSP", "_pFwDbgInfo->phyReadPos = 0x%x\n", (unsigned int)_FwDbgInfo.phyReadPos);
7170*53ee8cc1Swenshuai.xi //ULOGD("TSP", "_pFwDbgInfo->phyWritePos = 0x%x\n", (unsigned int)phyWritePos);
7171*53ee8cc1Swenshuai.xi if(phyWritePos > _FwDbgInfo.u32Size)
7172*53ee8cc1Swenshuai.xi {
7173*53ee8cc1Swenshuai.xi TSP_DBG("[%s], WARN : write pointer incorrect!!!\n", __FUNCTION__);
7174*53ee8cc1Swenshuai.xi return;
7175*53ee8cc1Swenshuai.xi }
7176*53ee8cc1Swenshuai.xi
7177*53ee8cc1Swenshuai.xi if(phyWritePos > _FwDbgInfo.phyReadPos)
7178*53ee8cc1Swenshuai.xi {
7179*53ee8cc1Swenshuai.xi while(1)
7180*53ee8cc1Swenshuai.xi {
7181*53ee8cc1Swenshuai.xi len = (phyWritePos - _FwDbgInfo.phyReadPos) > 255 ? 255 : (phyWritePos - _FwDbgInfo.phyReadPos);
7182*53ee8cc1Swenshuai.xi if((tmp = snprintf(p8buf, len, "%s", p)) == 0)
7183*53ee8cc1Swenshuai.xi break;
7184*53ee8cc1Swenshuai.xi tmp++;
7185*53ee8cc1Swenshuai.xi p+=tmp;
7186*53ee8cc1Swenshuai.xi _FwDbgInfo.phyReadPos += tmp;
7187*53ee8cc1Swenshuai.xi ULOGD("TSP", "[TSP] %s", p8buf);
7188*53ee8cc1Swenshuai.xi }
7189*53ee8cc1Swenshuai.xi }
7190*53ee8cc1Swenshuai.xi else if(phyWritePos < _FwDbgInfo.phyReadPos)
7191*53ee8cc1Swenshuai.xi {
7192*53ee8cc1Swenshuai.xi while(1)
7193*53ee8cc1Swenshuai.xi {
7194*53ee8cc1Swenshuai.xi len = (_FwDbgInfo.u32Size - _FwDbgInfo.phyReadPos) > 255? 255 : (_FwDbgInfo.u32Size - _FwDbgInfo.phyReadPos);
7195*53ee8cc1Swenshuai.xi if((tmp = snprintf(p8buf, len, "%s", p)) == 0)
7196*53ee8cc1Swenshuai.xi break;
7197*53ee8cc1Swenshuai.xi tmp++;
7198*53ee8cc1Swenshuai.xi p+=tmp;
7199*53ee8cc1Swenshuai.xi _FwDbgInfo.phyReadPos += tmp;
7200*53ee8cc1Swenshuai.xi ULOGD("TSP", "[TSP] %s", p8buf);
7201*53ee8cc1Swenshuai.xi }
7202*53ee8cc1Swenshuai.xi
7203*53ee8cc1Swenshuai.xi _FwDbgInfo.phyReadPos = (MS_PHY)sizeof(MS_U32);
7204*53ee8cc1Swenshuai.xi vptr = MS_PA2KSEG1(_FwDbgInfo.phyBufAddr) + _FwDbgInfo.phyReadPos;
7205*53ee8cc1Swenshuai.xi p = (char*)vptr;
7206*53ee8cc1Swenshuai.xi while(1)
7207*53ee8cc1Swenshuai.xi {
7208*53ee8cc1Swenshuai.xi len = (phyWritePos - _FwDbgInfo.phyReadPos) > 255 ? 255 : (phyWritePos - _FwDbgInfo.phyReadPos);
7209*53ee8cc1Swenshuai.xi if((tmp = snprintf(p8buf, len, "%s", p)) == 0)
7210*53ee8cc1Swenshuai.xi break;
7211*53ee8cc1Swenshuai.xi tmp++;
7212*53ee8cc1Swenshuai.xi p+=tmp;
7213*53ee8cc1Swenshuai.xi _FwDbgInfo.phyReadPos += tmp;
7214*53ee8cc1Swenshuai.xi ULOGD("TSP", "[TSP] %s", p8buf);
7215*53ee8cc1Swenshuai.xi }
7216*53ee8cc1Swenshuai.xi }
7217*53ee8cc1Swenshuai.xi }
7218*53ee8cc1Swenshuai.xi
MDrv_TSP_SetFwDBGParam(MS_PHY phyAddr,MS_U32 u32Size,MS_U32 u32DbgWord)7219*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetFwDBGParam(MS_PHY phyAddr, MS_U32 u32Size, MS_U32 u32DbgWord)
7220*53ee8cc1Swenshuai.xi {
7221*53ee8cc1Swenshuai.xi TSP_ASSERT((phyAddr != 0) && (u32Size != 0),
7222*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%06d] memory information for debug buffer incorrect address : %u, size : %u\n", __LINE__, (unsigned int)phyAddr, (unsigned int)u32Size));
7223*53ee8cc1Swenshuai.xi
7224*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7225*53ee8cc1Swenshuai.xi
7226*53ee8cc1Swenshuai.xi HAL_TSP_OrzWriteProtect_Enable(FALSE, 0, 0);
7227*53ee8cc1Swenshuai.xi if(HAL_TSP_SetFwDbgMem(phyAddr, u32Size) && HAL_TSP_SetFwDbgWord(u32DbgWord))
7228*53ee8cc1Swenshuai.xi {
7229*53ee8cc1Swenshuai.xi _FwDbgInfo.bEnable = TRUE;
7230*53ee8cc1Swenshuai.xi _FwDbgInfo.phyBufAddr = phyAddr;
7231*53ee8cc1Swenshuai.xi _FwDbgInfo.u32Size = u32Size;
7232*53ee8cc1Swenshuai.xi _FwDbgInfo.phyReadPos = (MS_PHY)sizeof(MS_U32);
7233*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7234*53ee8cc1Swenshuai.xi }
7235*53ee8cc1Swenshuai.xi else
7236*53ee8cc1Swenshuai.xi {
7237*53ee8cc1Swenshuai.xi TSP_DBG("********HAL_TSP_SetFwDbgMem fail**************\n");
7238*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
7239*53ee8cc1Swenshuai.xi }
7240*53ee8cc1Swenshuai.xi }
7241*53ee8cc1Swenshuai.xi
MDrv_TSP_ResetFileinTimestamp(void)7242*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_ResetFileinTimestamp(void)
7243*53ee8cc1Swenshuai.xi {
7244*53ee8cc1Swenshuai.xi HAL_TSP_ResetTimeStamp();
7245*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7246*53ee8cc1Swenshuai.xi }
7247*53ee8cc1Swenshuai.xi
7248*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7249*53ee8cc1Swenshuai.xi /// Enable PS path
7250*53ee8cc1Swenshuai.xi /// @param pphyReadAddr \b OUT: Pointer to store file-in current reand pointer
7251*53ee8cc1Swenshuai.xi /// @return TSP_Result
7252*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_File_GetReadAddr(MS_PHY * pphyReadAddr)7253*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_File_GetReadAddr(MS_PHY *pphyReadAddr)
7254*53ee8cc1Swenshuai.xi {
7255*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7256*53ee8cc1Swenshuai.xi if(!HAL_TSP_GetFilinReadAddr(pphyReadAddr))
7257*53ee8cc1Swenshuai.xi {
7258*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_NOT_SUPPORTED);
7259*53ee8cc1Swenshuai.xi }
7260*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7261*53ee8cc1Swenshuai.xi }
7262*53ee8cc1Swenshuai.xi
7263*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7264*53ee8cc1Swenshuai.xi /// Set Virtual Queue buffer
7265*53ee8cc1Swenshuai.xi /// @param phyVQBaseAddr \b IN: Virtual Queue memorry address
7266*53ee8cc1Swenshuai.xi /// @param u32VQBufLen_192PKT \b IN: Number of packets for Virtual Queue (192 bytes per packet)
7267*53ee8cc1Swenshuai.xi /// @return TSP_Result
7268*53ee8cc1Swenshuai.xi /// @note
7269*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_SetVQueBuf(MS_PHY phyVQBaseAddr,MS_U32 u32VQBufLen)7270*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetVQueBuf(MS_PHY phyVQBaseAddr, MS_U32 u32VQBufLen)
7271*53ee8cc1Swenshuai.xi {
7272*53ee8cc1Swenshuai.xi MS_U8 u8ii = 0;
7273*53ee8cc1Swenshuai.xi #ifndef SECURE_PVR_ENABLE
7274*53ee8cc1Swenshuai.xi MS_U32 u32VQSize = 0;
7275*53ee8cc1Swenshuai.xi MS_PHY phyVQBufStart = phyVQBaseAddr;
7276*53ee8cc1Swenshuai.xi MS_U32 u32MiuAlign = 0;
7277*53ee8cc1Swenshuai.xi
7278*53ee8cc1Swenshuai.xi _TSP_STR_ENTRY();
7279*53ee8cc1Swenshuai.xi
7280*53ee8cc1Swenshuai.xi if(HAL_TSP_GetCap(HAL_TSP_CAP_VQ_ALIGN, (void*)&u32MiuAlign) == FALSE)
7281*53ee8cc1Swenshuai.xi {
7282*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_FAIL);
7283*53ee8cc1Swenshuai.xi }
7284*53ee8cc1Swenshuai.xi
7285*53ee8cc1Swenshuai.xi u32VQSize = ((u32VQBufLen / u32MiuAlign) / TSP_VQ_NUM) * u32MiuAlign ; //miu alignment
7286*53ee8cc1Swenshuai.xi
7287*53ee8cc1Swenshuai.xi for(u8ii = 0; u8ii < ((MS_U8)TSP_VQ_NUM); u8ii++)
7288*53ee8cc1Swenshuai.xi {
7289*53ee8cc1Swenshuai.xi HAL_TSP_SetVQBuffer(u8ii, phyVQBufStart, u32VQSize);
7290*53ee8cc1Swenshuai.xi HAL_TSP_VQueue_Reset(u8ii);
7291*53ee8cc1Swenshuai.xi phyVQBufStart += u32VQSize;
7292*53ee8cc1Swenshuai.xi }
7293*53ee8cc1Swenshuai.xi
7294*53ee8cc1Swenshuai.xi #else
7295*53ee8cc1Swenshuai.xi _ptsp_res->_stSecBuf.u32BufId = 0;
7296*53ee8cc1Swenshuai.xi _ptsp_res->_stSecBuf.u32BufOpt = 0;
7297*53ee8cc1Swenshuai.xi _ptsp_res->_stSecBuf.u32BufSize = u32VQBufLen;
7298*53ee8cc1Swenshuai.xi _ptsp_res->_stSecBuf.phyBufAddr = phyVQBaseAddr;
7299*53ee8cc1Swenshuai.xi if(MDrv_TSP_Ree_SendTeeCmd(E_DRVTSP_REE_TO_TEE_CMD_SET_VqBuf, (void*)(&(_ptsp_res->_stSecBuf)), sizeof(DrvTSP_SecureBuf)) != DRVTSP_OK)
7300*53ee8cc1Swenshuai.xi {
7301*53ee8cc1Swenshuai.xi TSP_DBG("[MDRV TSP][%06d] Set VQ buf fail!\n", __LINE__);
7302*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_FAIL);
7303*53ee8cc1Swenshuai.xi }
7304*53ee8cc1Swenshuai.xi for(u8ii = 0; u8ii < ((MS_U8)TSP_VQ_NUM); u8ii++)
7305*53ee8cc1Swenshuai.xi {
7306*53ee8cc1Swenshuai.xi HAL_TSP_VQueue_Reset(u8ii);
7307*53ee8cc1Swenshuai.xi }
7308*53ee8cc1Swenshuai.xi
7309*53ee8cc1Swenshuai.xi #endif //SECURE_PVR_ENABLE
7310*53ee8cc1Swenshuai.xi
7311*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_OK);
7312*53ee8cc1Swenshuai.xi }
7313*53ee8cc1Swenshuai.xi
7314*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7315*53ee8cc1Swenshuai.xi /// Enable/Disable Virtual Quere
7316*53ee8cc1Swenshuai.xi /// @param bEnable \b IN: Virtual Queue memorry Enable flag
7317*53ee8cc1Swenshuai.xi /// @return TSP_Result
7318*53ee8cc1Swenshuai.xi /// @note
7319*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_VQueEnable(MS_BOOL bEnable)7320*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_VQueEnable(MS_BOOL bEnable)
7321*53ee8cc1Swenshuai.xi {
7322*53ee8cc1Swenshuai.xi _TSP_STR_ENTRY();
7323*53ee8cc1Swenshuai.xi HAL_TSP_VQueue_Enable(bEnable);
7324*53ee8cc1Swenshuai.xi _TSP_STR_RETURN(DRVTSP_OK);
7325*53ee8cc1Swenshuai.xi }
7326*53ee8cc1Swenshuai.xi
7327*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7328*53ee8cc1Swenshuai.xi /// Reset Virtual Quere
7329*53ee8cc1Swenshuai.xi /// @param u8VQID \b IN: Virtual Queue Index. 0: TS0, 1: File, 2: TS1, 3: TS3
7330*53ee8cc1Swenshuai.xi /// @return TSP_Result
7331*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_VQueReset(MS_U8 u8VQID)7332*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_VQueReset(MS_U8 u8VQID)
7333*53ee8cc1Swenshuai.xi {
7334*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7335*53ee8cc1Swenshuai.xi HAL_TSP_VQueue_Reset(u8VQID);
7336*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7337*53ee8cc1Swenshuai.xi }
7338*53ee8cc1Swenshuai.xi
7339*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7340*53ee8cc1Swenshuai.xi /// Enable Virtual Quere Overflow interrupt
7341*53ee8cc1Swenshuai.xi /// @return TSP_Result
7342*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_VQueue_OverflowInt_En(MS_BOOL bEnable)7343*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_VQueue_OverflowInt_En(MS_BOOL bEnable)
7344*53ee8cc1Swenshuai.xi {
7345*53ee8cc1Swenshuai.xi MS_U8 u8ii = 0;
7346*53ee8cc1Swenshuai.xi
7347*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7348*53ee8cc1Swenshuai.xi
7349*53ee8cc1Swenshuai.xi for(u8ii = 0; u8ii < ((MS_U8)TSP_VQ_NUM); u8ii++)
7350*53ee8cc1Swenshuai.xi {
7351*53ee8cc1Swenshuai.xi HAL_TSP_VQueue_OverflowInt_En(u8ii, bEnable);
7352*53ee8cc1Swenshuai.xi }
7353*53ee8cc1Swenshuai.xi
7354*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7355*53ee8cc1Swenshuai.xi }
7356*53ee8cc1Swenshuai.xi
7357*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7358*53ee8cc1Swenshuai.xi /// Set Virtual Quere request threshold
7359*53ee8cc1Swenshuai.xi /// @param u8req_len \b IN: Request length
7360*53ee8cc1Swenshuai.xi /// @return TSP_Result
7361*53ee8cc1Swenshuai.xi /// @note
7362*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Set_VQ_Threshold(MS_U8 u8req_len)7363*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Set_VQ_Threshold(MS_U8 u8req_len)
7364*53ee8cc1Swenshuai.xi {
7365*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7366*53ee8cc1Swenshuai.xi HAL_TSP_Set_Req_VQ_RX_Threshold(u8req_len);
7367*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7368*53ee8cc1Swenshuai.xi }
7369*53ee8cc1Swenshuai.xi
7370*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7371*53ee8cc1Swenshuai.xi /// Get Virtual Quere Status
7372*53ee8cc1Swenshuai.xi /// @param pu32Status \b IN: Pointer to store Virtual Queue status.
7373*53ee8cc1Swenshuai.xi /// @return TSP_Result
7374*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Get_VQStatus(MS_U32 * pu32Status)7375*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_VQStatus(MS_U32* pu32Status)
7376*53ee8cc1Swenshuai.xi {
7377*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7378*53ee8cc1Swenshuai.xi *pu32Status = HAL_TSP_Get_VQStatus();
7379*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7380*53ee8cc1Swenshuai.xi }
7381*53ee8cc1Swenshuai.xi
7382*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7383*53ee8cc1Swenshuai.xi /// Select MOBF key
7384*53ee8cc1Swenshuai.xi /// @param u8Model \b IN: MOBF path select. 0: File, 1: PVR1, 2: PVR2
7385*53ee8cc1Swenshuai.xi /// @param u8MobfIndex0 \b IN: Select key index of ring buffer 0
7386*53ee8cc1Swenshuai.xi /// @param u8MobfIndex1 \b IN: Select key index of ring buffer 1
7387*53ee8cc1Swenshuai.xi /// @return TSP_Result
7388*53ee8cc1Swenshuai.xi /// @note
7389*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7390*53ee8cc1Swenshuai.xi // Model : 0 -> File, 1 -> PVR1, 2 -> PVR2
7391*53ee8cc1Swenshuai.xi // u8MobfIndex0: 0 -> Disable, 1~31
7392*53ee8cc1Swenshuai.xi // u8MobfIndex1: 0 -> Disable, 1~31
MDrv_TSP_Set_MOBF_Set(MS_U8 u8Model,MS_U8 u8MobfIndex0,MS_U8 u8MobfIndex1)7393*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Set_MOBF_Set(MS_U8 u8Model, MS_U8 u8MobfIndex0, MS_U8 u8MobfIndex1)
7394*53ee8cc1Swenshuai.xi {
7395*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7396*53ee8cc1Swenshuai.xi HAL_TSP_MOBF_Select(u8Model, u8MobfIndex0, u8MobfIndex1);
7397*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7398*53ee8cc1Swenshuai.xi }
7399*53ee8cc1Swenshuai.xi
MDrv_TSP_FLT_LiveSrcSwitch(DrvTSP_FltType eFltSrcType)7400*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FLT_LiveSrcSwitch(DrvTSP_FltType eFltSrcType)
7401*53ee8cc1Swenshuai.xi {
7402*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
7403*53ee8cc1Swenshuai.xi }
7404*53ee8cc1Swenshuai.xi
7405*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7406*53ee8cc1Swenshuai.xi /// Hardware general config for driver interface
7407*53ee8cc1Swenshuai.xi /// @param u32Cmd \b IN: commend
7408*53ee8cc1Swenshuai.xi /// @param u32Config0 \b IN: configure value
7409*53ee8cc1Swenshuai.xi /// @param u32Config1 \b IN: configure value
7410*53ee8cc1Swenshuai.xi /// @param pData \b IN: pointer to store input data
7411*53ee8cc1Swenshuai.xi /// @return DMX_FILTER_STATUS_OK - Success
7412*53ee8cc1Swenshuai.xi /// @return DMX_FILTER_STATUS_ERROR - Failure
7413*53ee8cc1Swenshuai.xi /// @note
7414*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_CMD_Run(MS_U32 u32Cmd,MS_U32 u32Config0,MS_U32 u32Config1,void * pData)7415*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_CMD_Run(MS_U32 u32Cmd, MS_U32 u32Config0, MS_U32 u32Config1 ,void *pData)
7416*53ee8cc1Swenshuai.xi {
7417*53ee8cc1Swenshuai.xi if(u32Cmd == DRVTSP_CMD_STC_ADJUST_UNIT)
7418*53ee8cc1Swenshuai.xi {
7419*53ee8cc1Swenshuai.xi _ptsp_res->_u32StcAdjustUnit = u32Config0;
7420*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7421*53ee8cc1Swenshuai.xi }
7422*53ee8cc1Swenshuai.xi else if(u32Cmd == DRVTSP_CMD_SET_LIB_MODE)
7423*53ee8cc1Swenshuai.xi {
7424*53ee8cc1Swenshuai.xi _u32LibMode = u32Config0;
7425*53ee8cc1Swenshuai.xi HAL_TSP_CMD_Run(u32Cmd, u32Config0, u32Config1,pData);
7426*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7427*53ee8cc1Swenshuai.xi }
7428*53ee8cc1Swenshuai.xi else
7429*53ee8cc1Swenshuai.xi {
7430*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7431*53ee8cc1Swenshuai.xi if(HAL_TSP_CMD_Run(u32Cmd, u32Config0, u32Config1,pData))
7432*53ee8cc1Swenshuai.xi {
7433*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7434*53ee8cc1Swenshuai.xi }
7435*53ee8cc1Swenshuai.xi else
7436*53ee8cc1Swenshuai.xi {
7437*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
7438*53ee8cc1Swenshuai.xi }
7439*53ee8cc1Swenshuai.xi }
7440*53ee8cc1Swenshuai.xi }
7441*53ee8cc1Swenshuai.xi
7442*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7443*53ee8cc1Swenshuai.xi /// Get the PES scrambling control status
7444*53ee8cc1Swenshuai.xi /// @param u32FltId \b IN: filter id
7445*53ee8cc1Swenshuai.xi /// @param pu8status \b OUT: pointer to store PES scrambled statis. Every bit indicates one status of one packet.
7446*53ee8cc1Swenshuai.xi /// @return TSP_Result
7447*53ee8cc1Swenshuai.xi /// @note
7448*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_GetPesScmbSts(MS_U32 u32FltId,MS_U8 * pu8status)7449*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetPesScmbSts(MS_U32 u32FltId, MS_U8 *pu8status)
7450*53ee8cc1Swenshuai.xi {
7451*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7452*53ee8cc1Swenshuai.xi *pu8status = HAL_TSP_Get_PesScmb_Sts(u32FltId);
7453*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7454*53ee8cc1Swenshuai.xi }
7455*53ee8cc1Swenshuai.xi
7456*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7457*53ee8cc1Swenshuai.xi /// Get the TS header scrambling control status
7458*53ee8cc1Swenshuai.xi /// @param u8FltId \b IN: filter id
7459*53ee8cc1Swenshuai.xi /// @param pu8status \b OUT: pointer to store TS scrambled statis. Every bit indicates one status of one packet.
7460*53ee8cc1Swenshuai.xi /// @note
7461*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_GetTsScmbSts(MS_U32 u32FltId,MS_U8 * pu8status)7462*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_GetTsScmbSts(MS_U32 u32FltId, MS_U8 *pu8status)
7463*53ee8cc1Swenshuai.xi {
7464*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7465*53ee8cc1Swenshuai.xi *pu8status = HAL_TSP_Get_TsScmb_Sts(u32FltId);
7466*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7467*53ee8cc1Swenshuai.xi }
7468*53ee8cc1Swenshuai.xi
MDrv_TSP_SetFwDataAddr(MS_PHY phyDataAddr,MS_U32 u32Size)7469*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_SetFwDataAddr(MS_PHY phyDataAddr, MS_U32 u32Size)
7470*53ee8cc1Swenshuai.xi {
7471*53ee8cc1Swenshuai.xi TSP_ASSERT((phyDataAddr & _TSP_QMEM_D_MASK),
7472*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%06d] setFwDataAddr 0x%x <= 0x%x\n", __LINE__,(unsigned int)phyDataAddr, (unsigned int)(~_TSP_QMEM_D_MASK)));
7473*53ee8cc1Swenshuai.xi
7474*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7475*53ee8cc1Swenshuai.xi
7476*53ee8cc1Swenshuai.xi HAL_TSP_OrzWriteProtect_Enable(TRUE, phyDataAddr, phyDataAddr+u32Size);
7477*53ee8cc1Swenshuai.xi HAL_TSP_SecFlt_SetDataAddr(phyDataAddr);
7478*53ee8cc1Swenshuai.xi
7479*53ee8cc1Swenshuai.xi _ptsp_res->_phyTspFWDramBuf = phyDataAddr;
7480*53ee8cc1Swenshuai.xi _ptsp_res->_u32TspFwDramBufSize = u32Size;
7481*53ee8cc1Swenshuai.xi
7482*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7483*53ee8cc1Swenshuai.xi }
7484*53ee8cc1Swenshuai.xi
MDrv_TSP_FQ_FltNullPkt(MS_U32 u32FQEng,MS_BOOL bFltNull)7485*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FQ_FltNullPkt(MS_U32 u32FQEng, MS_BOOL bFltNull)
7486*53ee8cc1Swenshuai.xi {
7487*53ee8cc1Swenshuai.xi // not Implement
7488*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7489*53ee8cc1Swenshuai.xi }
7490*53ee8cc1Swenshuai.xi
7491*53ee8cc1Swenshuai.xi //FQ Src Switch
MDrv_TSP_FQ_SetMuxSwitch(MS_U32 u32FQEng,DrvFQ_SrcIf eTsSrc)7492*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FQ_SetMuxSwitch(MS_U32 u32FQEng, DrvFQ_SrcIf eTsSrc)
7493*53ee8cc1Swenshuai.xi {
7494*53ee8cc1Swenshuai.xi MS_U32 u32FQSrc = 0;
7495*53ee8cc1Swenshuai.xi MS_U32 u32Ret = DRVTSP_OK;
7496*53ee8cc1Swenshuai.xi MS_U32 u32MapingFQEng = u32FQEng;
7497*53ee8cc1Swenshuai.xi
7498*53ee8cc1Swenshuai.xi TSP_ASSERT((u32FQEng < TSP_FIQ_NUM),
7499*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%06d] Bad engin id(%d)\n", __LINE__, (int)u32FQEng));
7500*53ee8cc1Swenshuai.xi
7501*53ee8cc1Swenshuai.xi
7502*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7503*53ee8cc1Swenshuai.xi
7504*53ee8cc1Swenshuai.xi switch(eTsSrc)
7505*53ee8cc1Swenshuai.xi {
7506*53ee8cc1Swenshuai.xi case E_DRVFQ_SRC_TSIF0:
7507*53ee8cc1Swenshuai.xi u32FQSrc = 0;
7508*53ee8cc1Swenshuai.xi break;
7509*53ee8cc1Swenshuai.xi case E_DRVFQ_SRC_TSIF1:
7510*53ee8cc1Swenshuai.xi u32FQSrc = 1;
7511*53ee8cc1Swenshuai.xi break;
7512*53ee8cc1Swenshuai.xi case E_DRVFQ_SRC_TSIF2:
7513*53ee8cc1Swenshuai.xi u32FQSrc = 2;
7514*53ee8cc1Swenshuai.xi break;
7515*53ee8cc1Swenshuai.xi case E_DRVFQ_SRC_TSIF3:
7516*53ee8cc1Swenshuai.xi u32FQSrc = 3;
7517*53ee8cc1Swenshuai.xi break;
7518*53ee8cc1Swenshuai.xi case E_DRVFQ_SRC_TSIFFI:
7519*53ee8cc1Swenshuai.xi u32FQSrc = 7;
7520*53ee8cc1Swenshuai.xi break;
7521*53ee8cc1Swenshuai.xi default:
7522*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
7523*53ee8cc1Swenshuai.xi }
7524*53ee8cc1Swenshuai.xi
7525*53ee8cc1Swenshuai.xi if(!HAL_FQ_SetMuxSwitch(u32MapingFQEng,u32FQSrc))
7526*53ee8cc1Swenshuai.xi u32Ret = DRVTSP_FAIL;
7527*53ee8cc1Swenshuai.xi
7528*53ee8cc1Swenshuai.xi _TSP_RETURN(u32Ret);
7529*53ee8cc1Swenshuai.xi }
7530*53ee8cc1Swenshuai.xi
MDrv_TSP_FQ_GetMuxSwitch(MS_U32 u32FQEng,DrvFQ_SrcIf * peTsSrc)7531*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_FQ_GetMuxSwitch(MS_U32 u32FQEng, DrvFQ_SrcIf* peTsSrc)
7532*53ee8cc1Swenshuai.xi {
7533*53ee8cc1Swenshuai.xi MS_U32 u32FQSrc = 0xFF;
7534*53ee8cc1Swenshuai.xi MS_U32 u32Ret = DRVTSP_OK;
7535*53ee8cc1Swenshuai.xi MS_U32 u32MapingFQEng = u32FQEng;
7536*53ee8cc1Swenshuai.xi
7537*53ee8cc1Swenshuai.xi TSP_ASSERT((u32FQEng < TSP_FIQ_NUM),
7538*53ee8cc1Swenshuai.xi TSP_DBG("[TSP_ERROR][%06d] Bad engin id(%d)\n", __LINE__, (int)u32FQEng));
7539*53ee8cc1Swenshuai.xi
7540*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7541*53ee8cc1Swenshuai.xi
7542*53ee8cc1Swenshuai.xi u32FQSrc = HAL_FQ_GetMuxSwitch(u32MapingFQEng);
7543*53ee8cc1Swenshuai.xi
7544*53ee8cc1Swenshuai.xi switch(u32FQSrc)
7545*53ee8cc1Swenshuai.xi {
7546*53ee8cc1Swenshuai.xi case 0:
7547*53ee8cc1Swenshuai.xi *peTsSrc = E_DRVFQ_SRC_TSIF0;
7548*53ee8cc1Swenshuai.xi break;
7549*53ee8cc1Swenshuai.xi case 1:
7550*53ee8cc1Swenshuai.xi *peTsSrc = E_DRVFQ_SRC_TSIF1;
7551*53ee8cc1Swenshuai.xi break;
7552*53ee8cc1Swenshuai.xi case 2:
7553*53ee8cc1Swenshuai.xi *peTsSrc = E_DRVFQ_SRC_TSIF2;
7554*53ee8cc1Swenshuai.xi break;
7555*53ee8cc1Swenshuai.xi case 3:
7556*53ee8cc1Swenshuai.xi *peTsSrc = E_DRVFQ_SRC_TSIF3;
7557*53ee8cc1Swenshuai.xi break;
7558*53ee8cc1Swenshuai.xi case 7:
7559*53ee8cc1Swenshuai.xi *peTsSrc = E_DRVFQ_SRC_TSIFFI;
7560*53ee8cc1Swenshuai.xi break;
7561*53ee8cc1Swenshuai.xi default:
7562*53ee8cc1Swenshuai.xi *peTsSrc = 0xFF;
7563*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
7564*53ee8cc1Swenshuai.xi }
7565*53ee8cc1Swenshuai.xi
7566*53ee8cc1Swenshuai.xi _TSP_RETURN(u32Ret);
7567*53ee8cc1Swenshuai.xi }
7568*53ee8cc1Swenshuai.xi
7569*53ee8cc1Swenshuai.xi // -------------------------------------------------------------
7570*53ee8cc1Swenshuai.xi // Debug table
7571*53ee8cc1Swenshuai.xi // -------------------------------------------------------------
7572*53ee8cc1Swenshuai.xi #ifdef DEBUG_TABLE_SUPPORT
MDrv_TSP_Get_DisContiCnt(DrvTSP_DisContiCnt_info * tspInfo,MS_U32 * pu32Cnt)7573*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_DisContiCnt(DrvTSP_DisContiCnt_info* tspInfo, MS_U32* pu32Cnt)
7574*53ee8cc1Swenshuai.xi {
7575*53ee8cc1Swenshuai.xi TSP_DisconPktCnt_Info TspDisContiCntInfo;
7576*53ee8cc1Swenshuai.xi
7577*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7578*53ee8cc1Swenshuai.xi
7579*53ee8cc1Swenshuai.xi memset(&TspDisContiCntInfo, 0, sizeof(TSP_DisconPktCnt_Info));
7580*53ee8cc1Swenshuai.xi TspDisContiCntInfo.TspCmd = tspInfo->TspCmd;
7581*53ee8cc1Swenshuai.xi TspDisContiCntInfo.TspFifo = tspInfo->TspFifo;
7582*53ee8cc1Swenshuai.xi TspDisContiCntInfo.TspSrc = tspInfo->TspSrc;
7583*53ee8cc1Swenshuai.xi
7584*53ee8cc1Swenshuai.xi *pu32Cnt = HAL_TSP_Get_DisContiCnt(&TspDisContiCntInfo);
7585*53ee8cc1Swenshuai.xi
7586*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7587*53ee8cc1Swenshuai.xi }
7588*53ee8cc1Swenshuai.xi
MDrv_TSP_Get_DropPktCnt(DrvTSP_DropPktCnt_info * tspInfo,MS_U32 * pu32Cnt)7589*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_DropPktCnt(DrvTSP_DropPktCnt_info* tspInfo, MS_U32* pu32Cnt)
7590*53ee8cc1Swenshuai.xi {
7591*53ee8cc1Swenshuai.xi TSP_DropPktCnt_Info TspDropPktCntInfo;
7592*53ee8cc1Swenshuai.xi
7593*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7594*53ee8cc1Swenshuai.xi
7595*53ee8cc1Swenshuai.xi memset(&TspDropPktCntInfo, 0, sizeof(TSP_DisconPktCnt_Info));
7596*53ee8cc1Swenshuai.xi TspDropPktCntInfo.TspCmd = tspInfo->TspCmd;
7597*53ee8cc1Swenshuai.xi TspDropPktCntInfo.TspFifo = tspInfo->TspFifo;
7598*53ee8cc1Swenshuai.xi TspDropPktCntInfo.TspSrc = tspInfo->TspSrc;
7599*53ee8cc1Swenshuai.xi
7600*53ee8cc1Swenshuai.xi *pu32Cnt = HAL_TSP_Get_DropPktCnt(&TspDropPktCntInfo);
7601*53ee8cc1Swenshuai.xi
7602*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7603*53ee8cc1Swenshuai.xi }
7604*53ee8cc1Swenshuai.xi
MDrv_TSP_Get_LockPktCnt(DrvTSP_LockPktCnt_info * tspInfo,MS_U32 * pu32Cnt)7605*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_LockPktCnt(DrvTSP_LockPktCnt_info* tspInfo, MS_U32* pu32Cnt)
7606*53ee8cc1Swenshuai.xi {
7607*53ee8cc1Swenshuai.xi TSP_LockPktCnt_info TspLockCntInfo;
7608*53ee8cc1Swenshuai.xi
7609*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7610*53ee8cc1Swenshuai.xi
7611*53ee8cc1Swenshuai.xi memset(&TspLockCntInfo, 0, sizeof(TSP_LockPktCnt_info));
7612*53ee8cc1Swenshuai.xi TspLockCntInfo.TspCmd = tspInfo->TspCmd;
7613*53ee8cc1Swenshuai.xi TspLockCntInfo.TspTsif = tspInfo->TspTsif;
7614*53ee8cc1Swenshuai.xi
7615*53ee8cc1Swenshuai.xi *pu32Cnt = HAL_TSP_Get_LockPktCnt(&TspLockCntInfo);
7616*53ee8cc1Swenshuai.xi
7617*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7618*53ee8cc1Swenshuai.xi }
7619*53ee8cc1Swenshuai.xi
MDrv_TSP_Get_AVPktCnt(DrvTSP_AVPktCnt_info * tspInfo,MS_U32 * pu32Cnt)7620*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_AVPktCnt(DrvTSP_AVPktCnt_info* tspInfo, MS_U32* pu32Cnt)
7621*53ee8cc1Swenshuai.xi {
7622*53ee8cc1Swenshuai.xi TSP_AVPktCnt_info TspAVCntInfo;
7623*53ee8cc1Swenshuai.xi
7624*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7625*53ee8cc1Swenshuai.xi
7626*53ee8cc1Swenshuai.xi memset(&TspAVCntInfo, 0, sizeof(TSP_AVPktCnt_info));
7627*53ee8cc1Swenshuai.xi TspAVCntInfo.TspCmd = tspInfo->TspCmd;
7628*53ee8cc1Swenshuai.xi TspAVCntInfo.TspFifo = tspInfo->TspFifo;
7629*53ee8cc1Swenshuai.xi TspAVCntInfo.TspFifoSrc = tspInfo->TspFifoSrc;
7630*53ee8cc1Swenshuai.xi
7631*53ee8cc1Swenshuai.xi *pu32Cnt = HAL_TSP_GetAVPktCnt(&TspAVCntInfo);
7632*53ee8cc1Swenshuai.xi
7633*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7634*53ee8cc1Swenshuai.xi }
7635*53ee8cc1Swenshuai.xi #endif
7636*53ee8cc1Swenshuai.xi
7637*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7638*53ee8cc1Swenshuai.xi /// Get TEI Section error Packet count
7639*53ee8cc1Swenshuai.xi /// @param FltSrc \b IN: Filter source of packet
7640*53ee8cc1Swenshuai.xi /// @param pu32PktCnt \b OUT: pointer to store TEI packet count value
7641*53ee8cc1Swenshuai.xi /// @note
7642*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Get_SecTEI_PktCount(DrvTSP_FltType FltSrc,MS_U32 * pu32PktCnt)7643*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_SecTEI_PktCount(DrvTSP_FltType FltSrc, MS_U32* pu32PktCnt)
7644*53ee8cc1Swenshuai.xi {
7645*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7646*53ee8cc1Swenshuai.xi if(FltSrc == E_DRVTSP_FLT_SOURCE_TYPE_FILE)
7647*53ee8cc1Swenshuai.xi {
7648*53ee8cc1Swenshuai.xi *pu32PktCnt = HAL_TSP_Get_SecTEI_PktCount(1);
7649*53ee8cc1Swenshuai.xi }
7650*53ee8cc1Swenshuai.xi else
7651*53ee8cc1Swenshuai.xi {
7652*53ee8cc1Swenshuai.xi *pu32PktCnt = HAL_TSP_Get_SecTEI_PktCount(0);
7653*53ee8cc1Swenshuai.xi }
7654*53ee8cc1Swenshuai.xi
7655*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7656*53ee8cc1Swenshuai.xi }
7657*53ee8cc1Swenshuai.xi
7658*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7659*53ee8cc1Swenshuai.xi /// Reset Section TEI error Packet count
7660*53ee8cc1Swenshuai.xi /// @param FltSrc \b IN: Filter source of packet
7661*53ee8cc1Swenshuai.xi /// @note
7662*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Reset_SecTEI_PktCount(DrvTSP_FltType FltSrc)7663*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Reset_SecTEI_PktCount(DrvTSP_FltType FltSrc)
7664*53ee8cc1Swenshuai.xi {
7665*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7666*53ee8cc1Swenshuai.xi if(FltSrc == E_DRVTSP_FLT_SOURCE_TYPE_FILE)
7667*53ee8cc1Swenshuai.xi {
7668*53ee8cc1Swenshuai.xi HAL_TSP_Reset_SecTEI_PktCount(1);
7669*53ee8cc1Swenshuai.xi }
7670*53ee8cc1Swenshuai.xi else
7671*53ee8cc1Swenshuai.xi {
7672*53ee8cc1Swenshuai.xi HAL_TSP_Reset_SecTEI_PktCount(0);
7673*53ee8cc1Swenshuai.xi }
7674*53ee8cc1Swenshuai.xi
7675*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7676*53ee8cc1Swenshuai.xi }
7677*53ee8cc1Swenshuai.xi
7678*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7679*53ee8cc1Swenshuai.xi /// Get Section Dis-continuity Packet count
7680*53ee8cc1Swenshuai.xi /// @param u32FltID \b IN: Filter source of packet
7681*53ee8cc1Swenshuai.xi /// @param pu32PktCnt \b OUT: pointer to store Dis-continuity packet count value
7682*53ee8cc1Swenshuai.xi /// @note
7683*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Get_SecDisCont_PktCount(MS_U32 u32FltID,MS_U32 * pu32PktCnt)7684*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_SecDisCont_PktCount(MS_U32 u32FltID, MS_U32* pu32PktCnt)
7685*53ee8cc1Swenshuai.xi {
7686*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7687*53ee8cc1Swenshuai.xi *pu32PktCnt = HAL_TSP_Get_SecDisCont_PktCount(u32FltID);
7688*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7689*53ee8cc1Swenshuai.xi }
7690*53ee8cc1Swenshuai.xi
7691*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7692*53ee8cc1Swenshuai.xi /// Reset Section Dis-continuity Packet count
7693*53ee8cc1Swenshuai.xi /// @param u32FltID \b IN: Filter source of packet
7694*53ee8cc1Swenshuai.xi /// @note
7695*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_Reset_SecDisCont_PktCount(MS_U32 u32FltID)7696*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Reset_SecDisCont_PktCount(MS_U32 u32FltID)
7697*53ee8cc1Swenshuai.xi {
7698*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7699*53ee8cc1Swenshuai.xi HAL_TSP_Reset_SecDisCont_PktCount(u32FltID);
7700*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7701*53ee8cc1Swenshuai.xi }
7702*53ee8cc1Swenshuai.xi
7703*53ee8cc1Swenshuai.xi
7704*53ee8cc1Swenshuai.xi
7705*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7706*53ee8cc1Swenshuai.xi /// Scramble mask- enable mask of fifo/pvr for scramble stream
7707*53ee8cc1Swenshuai.xi /// @return TSP_Result
7708*53ee8cc1Swenshuai.xi /// @note
7709*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_DropScmbPkt(DrvTSP_FltType eFilterType,MS_BOOL bEnable)7710*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_DropScmbPkt(DrvTSP_FltType eFilterType, MS_BOOL bEnable)
7711*53ee8cc1Swenshuai.xi {
7712*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7713*53ee8cc1Swenshuai.xi switch (eFilterType)
7714*53ee8cc1Swenshuai.xi {
7715*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO:
7716*53ee8cc1Swenshuai.xi HAL_TSP_DropScmbPkt(0, bEnable);
7717*53ee8cc1Swenshuai.xi break;
7718*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO:
7719*53ee8cc1Swenshuai.xi HAL_TSP_DropScmbPkt(1, bEnable);
7720*53ee8cc1Swenshuai.xi break;
7721*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO2:
7722*53ee8cc1Swenshuai.xi HAL_TSP_DropScmbPkt(2, bEnable);
7723*53ee8cc1Swenshuai.xi break;
7724*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_VIDEO3D:
7725*53ee8cc1Swenshuai.xi HAL_TSP_DropScmbPkt(3, bEnable);
7726*53ee8cc1Swenshuai.xi break;
7727*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO3:
7728*53ee8cc1Swenshuai.xi HAL_TSP_DropScmbPkt(4, bEnable);
7729*53ee8cc1Swenshuai.xi break;
7730*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_AUDIO4:
7731*53ee8cc1Swenshuai.xi HAL_TSP_DropScmbPkt(5, bEnable);
7732*53ee8cc1Swenshuai.xi break;
7733*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PVR:
7734*53ee8cc1Swenshuai.xi HAL_TSP_DropScmbPkt(6, bEnable);
7735*53ee8cc1Swenshuai.xi break;
7736*53ee8cc1Swenshuai.xi case E_DRVTSP_FLT_TYPE_PVR1:
7737*53ee8cc1Swenshuai.xi HAL_TSP_DropScmbPkt(7, bEnable);
7738*53ee8cc1Swenshuai.xi break;
7739*53ee8cc1Swenshuai.xi default:
7740*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
7741*53ee8cc1Swenshuai.xi }
7742*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7743*53ee8cc1Swenshuai.xi }
7744*53ee8cc1Swenshuai.xi
7745*53ee8cc1Swenshuai.xi
7746*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
7747*53ee8cc1Swenshuai.xi ///Set or Get merge stream sync byte
7748*53ee8cc1Swenshuai.xi /// @param eIf \b IN: Eunm value of TSP TSIF selection
7749*53ee8cc1Swenshuai.xi /// @param u8StrId \b IN: Stream index
7750*53ee8cc1Swenshuai.xi /// @param pu8SyncByte \b IN: Pointer to store sync byte of merege streams
7751*53ee8cc1Swenshuai.xi /// @param bSet \b IN: TRUE to setting data or FALSE to getting table
7752*53ee8cc1Swenshuai.xi /// @return DRVTSP_OK - Success
7753*53ee8cc1Swenshuai.xi /// @return DRVTSP_FAIL - Failure
7754*53ee8cc1Swenshuai.xi /// @note: Currently, maxmum number is 8, and don't call this API when stream processing is started
7755*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_TSP_MStr_SyncByte(DrvTSP_If eIf,MS_U8 u8StrId,MS_U8 * pu8SyncByte,MS_BOOL bSet)7756*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_MStr_SyncByte(DrvTSP_If eIf, MS_U8 u8StrId, MS_U8* pu8SyncByte, MS_BOOL bSet)
7757*53ee8cc1Swenshuai.xi {
7758*53ee8cc1Swenshuai.xi #ifdef MERGE_STR_SUPPORT
7759*53ee8cc1Swenshuai.xi MS_U8 u8Path = 0;
7760*53ee8cc1Swenshuai.xi
7761*53ee8cc1Swenshuai.xi switch(eIf)
7762*53ee8cc1Swenshuai.xi {
7763*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_TS0:
7764*53ee8cc1Swenshuai.xi u8Path = TSP_SRC_FROM_TSIF0_LIVE;
7765*53ee8cc1Swenshuai.xi break;
7766*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_TS1:
7767*53ee8cc1Swenshuai.xi u8Path = TSP_SRC_FROM_TSIF1;
7768*53ee8cc1Swenshuai.xi break;
7769*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_TS2:
7770*53ee8cc1Swenshuai.xi u8Path = TSP_SRC_FROM_TSIF2;
7771*53ee8cc1Swenshuai.xi break;
7772*53ee8cc1Swenshuai.xi case E_DRVTSP_IF_FI:
7773*53ee8cc1Swenshuai.xi u8Path = TSP_SRC_FROM_TSIF0_FILE;
7774*53ee8cc1Swenshuai.xi break;
7775*53ee8cc1Swenshuai.xi default:
7776*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
7777*53ee8cc1Swenshuai.xi }
7778*53ee8cc1Swenshuai.xi
7779*53ee8cc1Swenshuai.xi _TSP_ENTRY();
7780*53ee8cc1Swenshuai.xi if(HAL_TSP_Set_Sync_Byte(u8Path, u8StrId, pu8SyncByte, bSet) == FALSE)
7781*53ee8cc1Swenshuai.xi {
7782*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_FAIL);
7783*53ee8cc1Swenshuai.xi }
7784*53ee8cc1Swenshuai.xi _TSP_RETURN(DRVTSP_OK);
7785*53ee8cc1Swenshuai.xi
7786*53ee8cc1Swenshuai.xi #else
7787*53ee8cc1Swenshuai.xi
7788*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
7789*53ee8cc1Swenshuai.xi #endif
7790*53ee8cc1Swenshuai.xi }
7791*53ee8cc1Swenshuai.xi
7792*53ee8cc1Swenshuai.xi //for kernel mode multiple process support, create eventid of callback thread of user mode in fitst time
7793*53ee8cc1Swenshuai.xi #ifdef DMX_UTOPIA_2K
7794*53ee8cc1Swenshuai.xi static char tspevt_name[] = "tspevt";
7795*53ee8cc1Swenshuai.xi #endif
MDrv_TSP_Create_IoSignal(DrvTSP_IoSignal * pstIoSignal)7796*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Create_IoSignal(DrvTSP_IoSignal *pstIoSignal)
7797*53ee8cc1Swenshuai.xi {
7798*53ee8cc1Swenshuai.xi #ifdef DMX_UTOPIA_2K
7799*53ee8cc1Swenshuai.xi MS_U32 u32ii = 0;
7800*53ee8cc1Swenshuai.xi
7801*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_MAX_PVRSIGFLAG_NUM; u32ii++)
7802*53ee8cc1Swenshuai.xi {
7803*53ee8cc1Swenshuai.xi pstIoSignal->u32PvrBufFullFlag[u32ii] = 0;
7804*53ee8cc1Swenshuai.xi }
7805*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_MAX_SIGFLAG_NUM; u32ii++)
7806*53ee8cc1Swenshuai.xi {
7807*53ee8cc1Swenshuai.xi pstIoSignal->u32SecRdyFlag[u32ii] = 0;
7808*53ee8cc1Swenshuai.xi pstIoSignal->u32SecOvfFlag[u32ii] = 0;
7809*53ee8cc1Swenshuai.xi }
7810*53ee8cc1Swenshuai.xi
7811*53ee8cc1Swenshuai.xi if(pstIoSignal->s32KerModeTspEvtId == -1)
7812*53ee8cc1Swenshuai.xi {
7813*53ee8cc1Swenshuai.xi if((pstIoSignal->s32KerModeTspEvtId = OSAL_TSP_EventCreate((MS_U8*)tspevt_name)) != -1)
7814*53ee8cc1Swenshuai.xi {
7815*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < DRVTSP_MAX_PROCESS_NUM; u32ii++)
7816*53ee8cc1Swenshuai.xi {
7817*53ee8cc1Swenshuai.xi if((_u32KPrcEvtTblUseFlag & (1 << u32ii)) == 0)
7818*53ee8cc1Swenshuai.xi {
7819*53ee8cc1Swenshuai.xi pstIoSignal->u32TblIndex = u32ii;
7820*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
7821*53ee8cc1Swenshuai.xi _stKModePrcEvtTbl[u32ii].tgid = current->tgid;
7822*53ee8cc1Swenshuai.xi #endif
7823*53ee8cc1Swenshuai.xi _stKModePrcEvtTbl[u32ii].s32TspEvtId = pstIoSignal->s32KerModeTspEvtId;
7824*53ee8cc1Swenshuai.xi _u32KPrcEvtTblUseFlag |= (1 << u32ii);
7825*53ee8cc1Swenshuai.xi break;
7826*53ee8cc1Swenshuai.xi }
7827*53ee8cc1Swenshuai.xi }
7828*53ee8cc1Swenshuai.xi
7829*53ee8cc1Swenshuai.xi //printf("[%s][%d] _u32KPrcEvtTblUseFlag %x , s32TspEvtId %x \n", __FUNCTION__, __LINE__, (int)_u32KPrcEvtTblUseFlag, (int)pstIoSignal->s32KerModeTspEvtId);
7830*53ee8cc1Swenshuai.xi
7831*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7832*53ee8cc1Swenshuai.xi }
7833*53ee8cc1Swenshuai.xi else
7834*53ee8cc1Swenshuai.xi {
7835*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
7836*53ee8cc1Swenshuai.xi }
7837*53ee8cc1Swenshuai.xi }
7838*53ee8cc1Swenshuai.xi
7839*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7840*53ee8cc1Swenshuai.xi #else
7841*53ee8cc1Swenshuai.xi return DRVTSP_NOT_SUPPORTED;
7842*53ee8cc1Swenshuai.xi #endif
7843*53ee8cc1Swenshuai.xi }
7844*53ee8cc1Swenshuai.xi
7845*53ee8cc1Swenshuai.xi // Send free event to end user mode callback thread, and delete event id
MDrv_TSP_Close_IoSignal(DrvTSP_IoSignal * pstIoSignal)7846*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Close_IoSignal(DrvTSP_IoSignal *pstIoSignal)
7847*53ee8cc1Swenshuai.xi {
7848*53ee8cc1Swenshuai.xi #ifdef DMX_UTOPIA_2K
7849*53ee8cc1Swenshuai.xi
7850*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
7851*53ee8cc1Swenshuai.xi MS_U32 u32ii = 0;
7852*53ee8cc1Swenshuai.xi
7853*53ee8cc1Swenshuai.xi pstIoSignal->s32KerModeTspEvtId = -1;
7854*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < DRVTSP_MAX_PROCESS_NUM; u32ii++)
7855*53ee8cc1Swenshuai.xi {
7856*53ee8cc1Swenshuai.xi if((_u32KPrcEvtTblUseFlag & (1 << u32ii)) != 0)
7857*53ee8cc1Swenshuai.xi {
7858*53ee8cc1Swenshuai.xi if(_stKModePrcEvtTbl[u32ii].tgid == current->tgid)
7859*53ee8cc1Swenshuai.xi {
7860*53ee8cc1Swenshuai.xi pstIoSignal->s32KerModeTspEvtId = _stKModePrcEvtTbl[u32ii].s32TspEvtId;
7861*53ee8cc1Swenshuai.xi break;
7862*53ee8cc1Swenshuai.xi }
7863*53ee8cc1Swenshuai.xi }
7864*53ee8cc1Swenshuai.xi }
7865*53ee8cc1Swenshuai.xi if(pstIoSignal->s32KerModeTspEvtId == -1)
7866*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
7867*53ee8cc1Swenshuai.xi #else
7868*53ee8cc1Swenshuai.xi pstIoSignal->s32KerModeTspEvtId = _s32TspEventId;
7869*53ee8cc1Swenshuai.xi #endif
7870*53ee8cc1Swenshuai.xi
7871*53ee8cc1Swenshuai.xi //printf("%s][%d] s32KerModeTspEvtId %x\n", __FUNCTION__, __LINE__, (int)pstIoSignal->s32KerModeTspEvtId);
7872*53ee8cc1Swenshuai.xi
7873*53ee8cc1Swenshuai.xi //to free CB process task, so send one event
7874*53ee8cc1Swenshuai.xi _db_flag = 1;
7875*53ee8cc1Swenshuai.xi _TSP_SetEvent(pstIoSignal->s32KerModeTspEvtId, TSP_TASK_EVENT_FLT_FREE);
7876*53ee8cc1Swenshuai.xi MsOS_DelayTask(3);
7877*53ee8cc1Swenshuai.xi
7878*53ee8cc1Swenshuai.xi while(_db_flag != 2)
7879*53ee8cc1Swenshuai.xi {
7880*53ee8cc1Swenshuai.xi _TSP_SetEvent(pstIoSignal->s32KerModeTspEvtId, TSP_TASK_EVENT_FLT_FREE);
7881*53ee8cc1Swenshuai.xi MsOS_DelayTask(3);
7882*53ee8cc1Swenshuai.xi }
7883*53ee8cc1Swenshuai.xi
7884*53ee8cc1Swenshuai.xi while(OSAL_TSP_EventDelete(pstIoSignal->s32KerModeTspEvtId) == FALSE)
7885*53ee8cc1Swenshuai.xi {
7886*53ee8cc1Swenshuai.xi _TSP_SetEvent(pstIoSignal->s32KerModeTspEvtId, TSP_TASK_EVENT_FLT_FREE);
7887*53ee8cc1Swenshuai.xi printf("Waiting for evet deleting... \n");
7888*53ee8cc1Swenshuai.xi MsOS_DelayTask(3);
7889*53ee8cc1Swenshuai.xi }
7890*53ee8cc1Swenshuai.xi pstIoSignal->s32KerModeTspEvtId = -1;
7891*53ee8cc1Swenshuai.xi
7892*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
7893*53ee8cc1Swenshuai.xi _u32KPrcEvtTblUseFlag &= ~(1 << u32ii);
7894*53ee8cc1Swenshuai.xi _stKModePrcEvtTbl[u32ii].s32TspEvtId = -1;
7895*53ee8cc1Swenshuai.xi _stKModePrcEvtTbl[u32ii].tgid = 0;
7896*53ee8cc1Swenshuai.xi #endif
7897*53ee8cc1Swenshuai.xi
7898*53ee8cc1Swenshuai.xi #endif
7899*53ee8cc1Swenshuai.xi
7900*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7901*53ee8cc1Swenshuai.xi }
7902*53ee8cc1Swenshuai.xi
7903*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------------
7904*53ee8cc1Swenshuai.xi // Refer to _TSP_Isr_ProcSelf, this is for user mode to getting events when using kernel dmx driver
7905*53ee8cc1Swenshuai.xi // Plese update both _TSP_Isr_ProcSelf & MDrv_TSP_Get_IoSignal at the same time for synchrony ISR evets processing flow
7906*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------------
MDrv_TSP_Wait_IoSignal(DrvTSP_IoSignal * pstIoSignal)7907*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Wait_IoSignal(DrvTSP_IoSignal *pstIoSignal)
7908*53ee8cc1Swenshuai.xi {
7909*53ee8cc1Swenshuai.xi #ifdef DMX_UTOPIA_2K
7910*53ee8cc1Swenshuai.xi MS_U32 u32ii, u32Evt = 0;
7911*53ee8cc1Swenshuai.xi MS_S32 s32Res = 0;
7912*53ee8cc1Swenshuai.xi
7913*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_MAX_PVRSIGFLAG_NUM; u32ii++)
7914*53ee8cc1Swenshuai.xi {
7915*53ee8cc1Swenshuai.xi pstIoSignal->u32PvrBufFullFlag[u32ii] = 0;
7916*53ee8cc1Swenshuai.xi }
7917*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < TSP_MAX_SIGFLAG_NUM; u32ii++)
7918*53ee8cc1Swenshuai.xi {
7919*53ee8cc1Swenshuai.xi pstIoSignal->u32SecRdyFlag[u32ii] = 0;
7920*53ee8cc1Swenshuai.xi pstIoSignal->u32SecOvfFlag[u32ii] = 0;
7921*53ee8cc1Swenshuai.xi }
7922*53ee8cc1Swenshuai.xi
7923*53ee8cc1Swenshuai.xi if((s32Res = MsOS_WaitEvent_Interrupt(pstIoSignal->s32KerModeTspEvtId, TSP_TASK_EVENT_GROUP_SELF|TSP_TASK_EVENT_FLT_FREE, &u32Evt, E_OR_CLEAR, MSOS_WAIT_FOREVER)) <= 0)
7924*53ee8cc1Swenshuai.xi {
7925*53ee8cc1Swenshuai.xi pstIoSignal->u32TspEvt = 0;
7926*53ee8cc1Swenshuai.xi
7927*53ee8cc1Swenshuai.xi if(s32Res < 0)
7928*53ee8cc1Swenshuai.xi return DRVTSP_FUNC_ERROR;
7929*53ee8cc1Swenshuai.xi else
7930*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
7931*53ee8cc1Swenshuai.xi }
7932*53ee8cc1Swenshuai.xi
7933*53ee8cc1Swenshuai.xi if((_db_flag == 1) && (u32Evt & TSP_TASK_EVENT_FLT_FREE))
7934*53ee8cc1Swenshuai.xi _db_flag = 2;
7935*53ee8cc1Swenshuai.xi
7936*53ee8cc1Swenshuai.xi pstIoSignal->u32TspEvt = u32Evt;
7937*53ee8cc1Swenshuai.xi //printf("TSP", "u32TspEvt %lx\n", pstIoSignal->u32TspEvt);
7938*53ee8cc1Swenshuai.xi
7939*53ee8cc1Swenshuai.xi #endif //end of MSOS_TYPE_LINUX_KERNEL
7940*53ee8cc1Swenshuai.xi
7941*53ee8cc1Swenshuai.xi return DRVTSP_OK;
7942*53ee8cc1Swenshuai.xi }
7943*53ee8cc1Swenshuai.xi
MDrv_TSP_Proc_IoSignal(DrvTSP_IoSignal * pstIoSignal)7944*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Proc_IoSignal(DrvTSP_IoSignal *pstIoSignal)
7945*53ee8cc1Swenshuai.xi {
7946*53ee8cc1Swenshuai.xi
7947*53ee8cc1Swenshuai.xi #ifdef DMX_UTOPIA_2K
7948*53ee8cc1Swenshuai.xi TSP_Result Ret = DRVTSP_OK;
7949*53ee8cc1Swenshuai.xi MS_U32 u32ii;
7950*53ee8cc1Swenshuai.xi MS_U32 u32GroupNum = (TSP_SECFLT_NUM + 31UL) >> 5UL;
7951*53ee8cc1Swenshuai.xi OSAL_TSP_ProcTypeParam Data;
7952*53ee8cc1Swenshuai.xi
7953*53ee8cc1Swenshuai.xi Data.u32FltId = 0xFFFFFFFFUL;
7954*53ee8cc1Swenshuai.xi Data.pRet = (void*)&Ret;
7955*53ee8cc1Swenshuai.xi Data.bInfiniteWait = TRUE;
7956*53ee8cc1Swenshuai.xi Data.bFromTask = TRUE;
7957*53ee8cc1Swenshuai.xi Data.u32PrcEvt = TSP_TASK_EVENT_FLT_FREE;
7958*53ee8cc1Swenshuai.xi
7959*53ee8cc1Swenshuai.xi if(pstIoSignal->u32TspEvt & TSP_TASK_EVENT_FLT_FREE)
7960*53ee8cc1Swenshuai.xi {
7961*53ee8cc1Swenshuai.xi _TSP_Isr_ProcSelf(&Data);
7962*53ee8cc1Swenshuai.xi pstIoSignal->u32TspEvt &= ~TSP_TASK_EVENT_FLT_FREE;
7963*53ee8cc1Swenshuai.xi }
7964*53ee8cc1Swenshuai.xi
7965*53ee8cc1Swenshuai.xi #ifndef NO_PVR
7966*53ee8cc1Swenshuai.xi // set PVR buffer events
7967*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))
7968*53ee8cc1Swenshuai.xi {
7969*53ee8cc1Swenshuai.xi if (_ptsp_res->_PvrEvtNotify[0] && _ptsp_res->_PvrCallback[0])
7970*53ee8cc1Swenshuai.xi {
7971*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))
7972*53ee8cc1Swenshuai.xi {
7973*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR0_RDY_SELF:
7974*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR0_RDY_POLL:
7975*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[0], E_DRVTSP_EVENT_PVRBUF_FULL))
7976*53ee8cc1Swenshuai.xi {
7977*53ee8cc1Swenshuai.xi pstIoSignal->u32PvrBufFullFlag[0] = 1UL;
7978*53ee8cc1Swenshuai.xi }
7979*53ee8cc1Swenshuai.xi break;
7980*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR1_RDY_SELF:
7981*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR1_RDY_POLL:
7982*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[0], E_DRVTSP_EVENT_PVRBUF_FULL))
7983*53ee8cc1Swenshuai.xi {
7984*53ee8cc1Swenshuai.xi pstIoSignal->u32PvrBufFullFlag[0] |= 2UL;
7985*53ee8cc1Swenshuai.xi }
7986*53ee8cc1Swenshuai.xi break;
7987*53ee8cc1Swenshuai.xi case (TSP_TASK_EVENT_PVR0_RDY_SELF | TSP_TASK_EVENT_PVR1_RDY_SELF):
7988*53ee8cc1Swenshuai.xi case (TSP_TASK_EVENT_PVR0_RDY_POLL | TSP_TASK_EVENT_PVR1_RDY_POLL):
7989*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[0], E_DRVTSP_EVENT_PVRBUF_OVERFLOW))
7990*53ee8cc1Swenshuai.xi {
7991*53ee8cc1Swenshuai.xi pstIoSignal->u32PvrBufFullFlag[0] = 0xFFUL;
7992*53ee8cc1Swenshuai.xi }
7993*53ee8cc1Swenshuai.xi break;
7994*53ee8cc1Swenshuai.xi default:
7995*53ee8cc1Swenshuai.xi break;
7996*53ee8cc1Swenshuai.xi }
7997*53ee8cc1Swenshuai.xi }
7998*53ee8cc1Swenshuai.xi }
7999*53ee8cc1Swenshuai.xi
8000*53ee8cc1Swenshuai.xi #if (TSP_PVR_IF_NUM > 1)
8001*53ee8cc1Swenshuai.xi if (pstIoSignal->u32TspEvt & (TSP_TASK_EVENT_PVR2PVR0_RDY_POLL|TSP_TASK_EVENT_PVR2PVR1_RDY_POLL|TSP_TASK_EVENT_PVR2PVR0_RDY_SELF|TSP_TASK_EVENT_PVR2PVR1_RDY_SELF))
8002*53ee8cc1Swenshuai.xi {
8003*53ee8cc1Swenshuai.xi if (_ptsp_res->_PvrEvtNotify[1] && _ptsp_res->_PvrCallback[1])
8004*53ee8cc1Swenshuai.xi {
8005*53ee8cc1Swenshuai.xi switch (pstIoSignal->u32TspEvt & (TSP_TASK_EVENT_PVR2PVR0_RDY_POLL|TSP_TASK_EVENT_PVR2PVR1_RDY_POLL|TSP_TASK_EVENT_PVR2PVR0_RDY_SELF|TSP_TASK_EVENT_PVR2PVR1_RDY_SELF))
8006*53ee8cc1Swenshuai.xi {
8007*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR2PVR0_RDY_SELF:
8008*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR2PVR0_RDY_POLL:
8009*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[1], E_DRVTSP_EVENT_PVRBUF_FULL))
8010*53ee8cc1Swenshuai.xi {
8011*53ee8cc1Swenshuai.xi pstIoSignal->u32PvrBufFullFlag[1] = 1UL;
8012*53ee8cc1Swenshuai.xi }
8013*53ee8cc1Swenshuai.xi break;
8014*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR2PVR1_RDY_SELF:
8015*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_PVR2PVR1_RDY_POLL:
8016*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[1], E_DRVTSP_EVENT_PVRBUF_FULL))
8017*53ee8cc1Swenshuai.xi {
8018*53ee8cc1Swenshuai.xi pstIoSignal->u32PvrBufFullFlag[1] = 2UL;
8019*53ee8cc1Swenshuai.xi }
8020*53ee8cc1Swenshuai.xi break;
8021*53ee8cc1Swenshuai.xi case (TSP_TASK_EVENT_PVR2PVR0_RDY_SELF | TSP_TASK_EVENT_PVR2PVR1_RDY_SELF):
8022*53ee8cc1Swenshuai.xi case (TSP_TASK_EVENT_PVR2PVR0_RDY_POLL | TSP_TASK_EVENT_PVR2PVR1_RDY_POLL):
8023*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[1], E_DRVTSP_EVENT_PVRBUF_OVERFLOW))
8024*53ee8cc1Swenshuai.xi {
8025*53ee8cc1Swenshuai.xi pstIoSignal->u32PvrBufFullFlag[1] = 0xFFUL;
8026*53ee8cc1Swenshuai.xi }
8027*53ee8cc1Swenshuai.xi break;
8028*53ee8cc1Swenshuai.xi }
8029*53ee8cc1Swenshuai.xi }
8030*53ee8cc1Swenshuai.xi }
8031*53ee8cc1Swenshuai.xi #endif //endof TS2_IF_SUPPORT
8032*53ee8cc1Swenshuai.xi
8033*53ee8cc1Swenshuai.xi #ifdef TS3_IF_SUPPORT
8034*53ee8cc1Swenshuai.xi if (pstIoSignal->u32TspEvt & (TSP_TASK_EVENT_CBPVR0_RDY_SELF|TSP_TASK_EVENT_CBPVR0_RDY_POLL))
8035*53ee8cc1Swenshuai.xi {
8036*53ee8cc1Swenshuai.xi if (_ptsp_res->_PvrEvtNotify[2] && _ptsp_res->_PvrCallback[2])
8037*53ee8cc1Swenshuai.xi {
8038*53ee8cc1Swenshuai.xi switch (pstIoSignal->u32TspEvt & (TSP_TASK_EVENT_CBPVR0_RDY_SELF | TSP_TASK_EVENT_CBPVR0_RDY_POLL))
8039*53ee8cc1Swenshuai.xi {
8040*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_CBPVR0_RDY_SELF:
8041*53ee8cc1Swenshuai.xi case TSP_TASK_EVENT_CBPVR0_RDY_POLL:
8042*53ee8cc1Swenshuai.xi if (HAS_FLAG(_ptsp_res->_PvrEvtNotify[2], E_DRVTSP_EVENT_PVRBUF_FULL))
8043*53ee8cc1Swenshuai.xi {
8044*53ee8cc1Swenshuai.xi pstIoSignal->u32PvrBufFullFlag[2] = 1UL;
8045*53ee8cc1Swenshuai.xi }
8046*53ee8cc1Swenshuai.xi break;
8047*53ee8cc1Swenshuai.xi }
8048*53ee8cc1Swenshuai.xi }
8049*53ee8cc1Swenshuai.xi #endif
8050*53ee8cc1Swenshuai.xi
8051*53ee8cc1Swenshuai.xi #endif //end of NO_PVR
8052*53ee8cc1Swenshuai.xi
8053*53ee8cc1Swenshuai.xi if (pstIoSignal->u32TspEvt & TSP_TASK_EVENT_SECTION_SELF)
8054*53ee8cc1Swenshuai.xi {
8055*53ee8cc1Swenshuai.xi for(u32ii = 0; u32ii < u32GroupNum; u32ii++)
8056*53ee8cc1Swenshuai.xi {
8057*53ee8cc1Swenshuai.xi MDrv_TSP_Get_SecEvents(u32ii, pstIoSignal);
8058*53ee8cc1Swenshuai.xi }
8059*53ee8cc1Swenshuai.xi }
8060*53ee8cc1Swenshuai.xi
8061*53ee8cc1Swenshuai.xi #endif //end of MSOS_TYPE_LINUX_KERN
8062*53ee8cc1Swenshuai.xi
8063*53ee8cc1Swenshuai.xi return DRVTSP_OK;
8064*53ee8cc1Swenshuai.xi }
8065*53ee8cc1Swenshuai.xi
8066*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Get_SecEvents(MS_U32 u32Group, DrvTSP_IoSignal *pstIoSignal)
8067*53ee8cc1Swenshuai.xi {
8068*53ee8cc1Swenshuai.xi MS_U32 u32PidFltGroup = 0, u32SecFlt = 0, u32PidFlt = 0;
8069*53ee8cc1Swenshuai.xi MS_U32 u32RdyMask = 0, u32OvfMask = 0;
8070*53ee8cc1Swenshuai.xi
8071*53ee8cc1Swenshuai.xi _TSP_GetModeSecRdy(u32Group, 0xFFFFFFFFUL, &u32RdyMask, OSAL_EVENT_OR_CLEAR);
8072*53ee8cc1Swenshuai.xi _TSP_GetModeSecOvf(u32Group, 0xFFFFFFFFUL, &u32OvfMask, OSAL_EVENT_OR_CLEAR);
8073*53ee8cc1Swenshuai.xi //pstIoSignal->u32SecRdyFlag[u32Group] = u32RdyMask;
8074*53ee8cc1Swenshuai.xi //pstIoSignal->u32SecOvfFlag[u32Group] = u32OvfMask;
8075*53ee8cc1Swenshuai.xi
8076*53ee8cc1Swenshuai.xi //ULOGD("TSP", "[DMX] %ld , %lx, %lx \n", u32Group, u32RdyMask, u32OvfMask);
8077*53ee8cc1Swenshuai.xi
8078*53ee8cc1Swenshuai.xi u32SecFlt = u32Group << 5UL;
8079*53ee8cc1Swenshuai.xi while(u32RdyMask)
8080*53ee8cc1Swenshuai.xi {
8081*53ee8cc1Swenshuai.xi if(u32RdyMask & 0x01UL)
8082*53ee8cc1Swenshuai.xi {
8083*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[pstIoSignal->u32Eng].FltMap[u32SecFlt] != u32SecFlt)
8084*53ee8cc1Swenshuai.xi {
8085*53ee8cc1Swenshuai.xi for(u32PidFlt = 0UL; u32PidFlt < TSP_PIDFLT_NUM_ALL; u32PidFlt++)
8086*53ee8cc1Swenshuai.xi {
8087*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[pstIoSignal->u32Eng].FltMap[u32PidFlt] == u32SecFlt)
8088*53ee8cc1Swenshuai.xi {
8089*53ee8cc1Swenshuai.xi break;
8090*53ee8cc1Swenshuai.xi }
8091*53ee8cc1Swenshuai.xi }
8092*53ee8cc1Swenshuai.xi }
8093*53ee8cc1Swenshuai.xi else
8094*53ee8cc1Swenshuai.xi {
8095*53ee8cc1Swenshuai.xi u32PidFlt = u32SecFlt;
8096*53ee8cc1Swenshuai.xi }
8097*53ee8cc1Swenshuai.xi if(u32PidFlt < TSP_PIDFLT_NUM_ALL)
8098*53ee8cc1Swenshuai.xi {
8099*53ee8cc1Swenshuai.xi if((_ptsp_res->_TspState[pstIoSignal->u32Eng].FltState[u32PidFlt] & E_DRVTSP_FLT_STATE_ENABLE)&&
8100*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[pstIoSignal->u32Eng].SecFltEvtNotify[u32SecFlt] & E_DRVTSP_EVENT_DATA_READY) &&
8101*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[pstIoSignal->u32Eng].SecFltCallback[u32SecFlt]))
8102*53ee8cc1Swenshuai.xi {
8103*53ee8cc1Swenshuai.xi u32PidFltGroup = u32PidFlt >> 5UL;
8104*53ee8cc1Swenshuai.xi pstIoSignal->u32SecRdyFlag[u32PidFltGroup] |= (1UL << (u32PidFlt & 0x1FUL));
8105*53ee8cc1Swenshuai.xi }
8106*53ee8cc1Swenshuai.xi }
8107*53ee8cc1Swenshuai.xi }
8108*53ee8cc1Swenshuai.xi u32RdyMask >>= 1UL;
8109*53ee8cc1Swenshuai.xi u32SecFlt++;
8110*53ee8cc1Swenshuai.xi }
8111*53ee8cc1Swenshuai.xi
8112*53ee8cc1Swenshuai.xi u32SecFlt = u32Group << 5UL;
8113*53ee8cc1Swenshuai.xi while(u32OvfMask)
8114*53ee8cc1Swenshuai.xi {
8115*53ee8cc1Swenshuai.xi if(u32OvfMask & 0x01UL)
8116*53ee8cc1Swenshuai.xi {
8117*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[pstIoSignal->u32Eng].FltMap[u32SecFlt] != u32SecFlt)
8118*53ee8cc1Swenshuai.xi {
8119*53ee8cc1Swenshuai.xi for(u32PidFlt = 0UL; u32PidFlt < TSP_PIDFLT_NUM_ALL; u32PidFlt++)
8120*53ee8cc1Swenshuai.xi {
8121*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[pstIoSignal->u32Eng].FltMap[u32PidFlt] == u32SecFlt)
8122*53ee8cc1Swenshuai.xi {
8123*53ee8cc1Swenshuai.xi break;
8124*53ee8cc1Swenshuai.xi }
8125*53ee8cc1Swenshuai.xi }
8126*53ee8cc1Swenshuai.xi }
8127*53ee8cc1Swenshuai.xi else
8128*53ee8cc1Swenshuai.xi {
8129*53ee8cc1Swenshuai.xi u32PidFlt = u32SecFlt;
8130*53ee8cc1Swenshuai.xi }
8131*53ee8cc1Swenshuai.xi if(u32PidFlt < TSP_PIDFLT_NUM_ALL)
8132*53ee8cc1Swenshuai.xi {
8133*53ee8cc1Swenshuai.xi if(_ptsp_res->_TspState[pstIoSignal->u32Eng].FltState[u32PidFlt] & E_DRVTSP_FLT_STATE_ENABLE)
8134*53ee8cc1Swenshuai.xi {
8135*53ee8cc1Swenshuai.xi _TSP_IND_LOCK(); // disable overflow filter
8136*53ee8cc1Swenshuai.xi _TSP_PidFlt_Disable(pstIoSignal->u32Eng, u32PidFlt); // ???? move out --> OK // // critical section
8137*53ee8cc1Swenshuai.xi _TSP_IND_UNLOCK();
8138*53ee8cc1Swenshuai.xi }
8139*53ee8cc1Swenshuai.xi if ((_ptsp_res->_TspState[pstIoSignal->u32Eng].FltState[u32PidFlt] != E_DRVTSP_FLT_STATE_FREE) &&
8140*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[pstIoSignal->u32Eng].SecFltEvtNotify[u32SecFlt] & E_DRVTSP_EVENT_BUF_OVERFLOW) &&
8141*53ee8cc1Swenshuai.xi (_ptsp_res->_TspState[pstIoSignal->u32Eng].SecFltCallback[u32SecFlt]))
8142*53ee8cc1Swenshuai.xi {
8143*53ee8cc1Swenshuai.xi u32PidFltGroup = u32PidFlt >> 5UL;
8144*53ee8cc1Swenshuai.xi pstIoSignal->u32SecOvfFlag[u32PidFltGroup] |= (1UL << (u32PidFlt & 0x1FUL));
8145*53ee8cc1Swenshuai.xi }
8146*53ee8cc1Swenshuai.xi }
8147*53ee8cc1Swenshuai.xi }
8148*53ee8cc1Swenshuai.xi u32OvfMask >>= 1UL;
8149*53ee8cc1Swenshuai.xi u32SecFlt++;
8150*53ee8cc1Swenshuai.xi }
8151*53ee8cc1Swenshuai.xi
8152*53ee8cc1Swenshuai.xi return DRVTSP_OK;
8153*53ee8cc1Swenshuai.xi }
8154*53ee8cc1Swenshuai.xi
8155*53ee8cc1Swenshuai.xi #ifdef SECURE_PVR_ENABLE
8156*53ee8cc1Swenshuai.xi
8157*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Ree_TeeCmdSystem_Init()
8158*53ee8cc1Swenshuai.xi {
8159*53ee8cc1Swenshuai.xi MDrv_SYS_ReadKernelCmdLine();
8160*53ee8cc1Swenshuai.xi MDrv_SYS_GetTEEInfo(&_ptsp_res->_teemode);
8161*53ee8cc1Swenshuai.xi //printf("[%s][%d] _teemode %x \n", __FUNCTION__, __LINE__, (int)_ptsp_res->_teemode.OsType);
8162*53ee8cc1Swenshuai.xi
8163*53ee8cc1Swenshuai.xi //_ptsp_res->_teemode.OsType = SYS_TEEINFO_OSTYPE_OPTEE;
8164*53ee8cc1Swenshuai.xi if(_ptsp_res->_teemode.OsType == SYS_TEEINFO_OSTYPE_NUTTX)
8165*53ee8cc1Swenshuai.xi {
8166*53ee8cc1Swenshuai.xi if(_TSP_REE_RegisterMBX() == FALSE)
8167*53ee8cc1Swenshuai.xi {
8168*53ee8cc1Swenshuai.xi MS_DEBUG_MSG(TSP_DBG ("[%s] Register Mailbox failed!\n", __FUNCTION__));
8169*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
8170*53ee8cc1Swenshuai.xi }
8171*53ee8cc1Swenshuai.xi }
8172*53ee8cc1Swenshuai.xi
8173*53ee8cc1Swenshuai.xi return DRVTSP_OK;
8174*53ee8cc1Swenshuai.xi }
8175*53ee8cc1Swenshuai.xi
8176*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Ree_TeeCmdSystem_Exit()
8177*53ee8cc1Swenshuai.xi {
8178*53ee8cc1Swenshuai.xi _bTSPMbxInitFlag = FALSE;
8179*53ee8cc1Swenshuai.xi _u8TSPMbxMsgClass = 0;
8180*53ee8cc1Swenshuai.xi
8181*53ee8cc1Swenshuai.xi return DRVTSP_OK;
8182*53ee8cc1Swenshuai.xi }
8183*53ee8cc1Swenshuai.xi
8184*53ee8cc1Swenshuai.xi TSP_Result MDrv_TSP_Ree_SendTeeCmd(TSP_REE_TO_TEE_CMD_TYPE cmd_type, void* param, size_t datasize)
8185*53ee8cc1Swenshuai.xi {
8186*53ee8cc1Swenshuai.xi //printf("[%s][%d] OsType %x , cmd_type %x\n", __FUNCTION__, __LINE__, _ptsp_res->_teemode.OsType, (int)cmd_type);
8187*53ee8cc1Swenshuai.xi //printf("sizeof PHY %d \n", sizeof(MS_PHY));
8188*53ee8cc1Swenshuai.xi
8189*53ee8cc1Swenshuai.xi if(_ptsp_res->_teemode.OsType == SYS_TEEINFO_OSTYPE_NUTTX)
8190*53ee8cc1Swenshuai.xi {
8191*53ee8cc1Swenshuai.xi if(_TSP_Ree_SendMBXMsg(cmd_type, param) == TRUE)
8192*53ee8cc1Swenshuai.xi return DRVTSP_OK;
8193*53ee8cc1Swenshuai.xi else
8194*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
8195*53ee8cc1Swenshuai.xi }
8196*53ee8cc1Swenshuai.xi else if(_ptsp_res->_teemode.OsType == SYS_TEEINFO_OSTYPE_OPTEE)
8197*53ee8cc1Swenshuai.xi {
8198*53ee8cc1Swenshuai.xi unsigned int ret, ret_orig= 0;
8199*53ee8cc1Swenshuai.xi
8200*53ee8cc1Swenshuai.xi if ((ret = MDrv_SYS_TEEC_InitializeContext(_device, &mstar_teec_ctx)) != TEEC_SUCCESS)
8201*53ee8cc1Swenshuai.xi {
8202*53ee8cc1Swenshuai.xi printf("%s %d: Init Context failed, err code: %x\n",__FUNCTION__,__LINE__, (int)ret);
8203*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
8204*53ee8cc1Swenshuai.xi }
8205*53ee8cc1Swenshuai.xi if ((ret = MDrv_SYS_TEEC_Open(&mstar_teec_ctx, &session, &uuid, TEEC_LOGIN_PUBLIC, NULL, NULL, &ret_orig)) != TEEC_SUCCESS)
8206*53ee8cc1Swenshuai.xi {
8207*53ee8cc1Swenshuai.xi printf("%s %d: TEEC Open session failed, err code: %x\n",__FUNCTION__,__LINE__, (int)ret);
8208*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
8209*53ee8cc1Swenshuai.xi }
8210*53ee8cc1Swenshuai.xi if(datasize == 0)
8211*53ee8cc1Swenshuai.xi {
8212*53ee8cc1Swenshuai.xi op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE,TEEC_NONE, TEEC_NONE);
8213*53ee8cc1Swenshuai.xi }
8214*53ee8cc1Swenshuai.xi else
8215*53ee8cc1Swenshuai.xi {
8216*53ee8cc1Swenshuai.xi op.params[0].tmpref.buffer = param;
8217*53ee8cc1Swenshuai.xi op.params[0].tmpref.size = datasize;
8218*53ee8cc1Swenshuai.xi op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
8219*53ee8cc1Swenshuai.xi }
8220*53ee8cc1Swenshuai.xi
8221*53ee8cc1Swenshuai.xi if ((ret = MDrv_SYS_TEEC_InvokeCmd(&session, cmd_type, &op, &ret_orig)) != TEEC_SUCCESS)
8222*53ee8cc1Swenshuai.xi {
8223*53ee8cc1Swenshuai.xi printf("%s %d: TEEC Invoke command failed, err code: %x\n",__FUNCTION__,__LINE__, (int)ret);
8224*53ee8cc1Swenshuai.xi }
8225*53ee8cc1Swenshuai.xi MDrv_SYS_TEEC_Close(&session);
8226*53ee8cc1Swenshuai.xi MDrv_SYS_TEEC_FinalizeContext(&mstar_teec_ctx);
8227*53ee8cc1Swenshuai.xi if(ret == TEEC_SUCCESS)
8228*53ee8cc1Swenshuai.xi {
8229*53ee8cc1Swenshuai.xi return DRVTSP_OK;
8230*53ee8cc1Swenshuai.xi }
8231*53ee8cc1Swenshuai.xi }
8232*53ee8cc1Swenshuai.xi
8233*53ee8cc1Swenshuai.xi return DRVTSP_FAIL;
8234*53ee8cc1Swenshuai.xi }
8235*53ee8cc1Swenshuai.xi
8236*53ee8cc1Swenshuai.xi #endif //SECURE_PVR_ENABLE
8237