xref: /utopia/UTPA2-700.0.x/modules/dmx/hal/k7u/multi_pvr/halMultiPVR.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi // file   halMultiPVR.c
97*53ee8cc1Swenshuai.xi // @brief  Multi-PVR HAL
98*53ee8cc1Swenshuai.xi // @author MStar Semiconductor,Inc.
99*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////////////////
100*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
101*53ee8cc1Swenshuai.xi     #include <linux/string.h>
102*53ee8cc1Swenshuai.xi #else
103*53ee8cc1Swenshuai.xi     #include <string.h>
104*53ee8cc1Swenshuai.xi #endif
105*53ee8cc1Swenshuai.xi 
106*53ee8cc1Swenshuai.xi #include    "MsCommon.h"
107*53ee8cc1Swenshuai.xi #include    "regMultiPVR.h"
108*53ee8cc1Swenshuai.xi #include    "halMultiPVR.h"
109*53ee8cc1Swenshuai.xi 
110*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
111*53ee8cc1Swenshuai.xi //  Driver Compiler Option
112*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
113*53ee8cc1Swenshuai.xi 
114*53ee8cc1Swenshuai.xi 
115*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
116*53ee8cc1Swenshuai.xi //  TSP Hardware Abstraction Layer
117*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
118*53ee8cc1Swenshuai.xi static REG_MULTI_PVR_ENG_Ctrl   *_RegMultiPvrCtrl   = NULL;
119*53ee8cc1Swenshuai.xi 
120*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
121*53ee8cc1Swenshuai.xi //  Local Functions
122*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
REG32_R(REG32_MULTI_PVR * reg)123*53ee8cc1Swenshuai.xi static MS_U32 REG32_R(REG32_MULTI_PVR *reg)
124*53ee8cc1Swenshuai.xi {
125*53ee8cc1Swenshuai.xi     MS_U32              value = 0;
126*53ee8cc1Swenshuai.xi     value  = (reg)->low;
127*53ee8cc1Swenshuai.xi     value |= (reg)->high << 16;
128*53ee8cc1Swenshuai.xi     return value;
129*53ee8cc1Swenshuai.xi }
130*53ee8cc1Swenshuai.xi 
REG16_R(REG16_MULTI_PVR * reg)131*53ee8cc1Swenshuai.xi static MS_U16 REG16_R(REG16_MULTI_PVR *reg)
132*53ee8cc1Swenshuai.xi {
133*53ee8cc1Swenshuai.xi     MS_U16              value = 0;
134*53ee8cc1Swenshuai.xi     value = (reg)->data;
135*53ee8cc1Swenshuai.xi     return value;
136*53ee8cc1Swenshuai.xi }
137*53ee8cc1Swenshuai.xi 
138*53ee8cc1Swenshuai.xi #define REG32_W(reg, value)             {   (reg)->low = ((value) & 0x0000FFFF);    \
139*53ee8cc1Swenshuai.xi                                             (reg)->high = ((value) >> 16); }
140*53ee8cc1Swenshuai.xi 
141*53ee8cc1Swenshuai.xi #define REG16_W(reg, value)             {   (reg)->data = ((value) & 0x0000FFFF);   }
142*53ee8cc1Swenshuai.xi 
143*53ee8cc1Swenshuai.xi #define _AND_(flag, bit)                ((flag) & (bit))
144*53ee8cc1Swenshuai.xi 
145*53ee8cc1Swenshuai.xi #define _SET_(flag, bit)                ((flag) | (bit))
146*53ee8cc1Swenshuai.xi #define _CLR_(flag, bit)                ((flag) & (~(bit)))
147*53ee8cc1Swenshuai.xi 
148*53ee8cc1Swenshuai.xi #define REG16_SET(reg, value)           REG16_W(reg, _SET_(REG16_R(reg), value))
149*53ee8cc1Swenshuai.xi #define REG32_SET(reg, value)           REG32_W(reg, _SET_(REG32_R(reg), value))
150*53ee8cc1Swenshuai.xi #define REG16_CLR(reg, value)           REG16_W(reg, _CLR_(REG16_R(reg), value))
151*53ee8cc1Swenshuai.xi #define REG32_CLR(reg, value)           REG32_W(reg, _CLR_(REG32_R(reg), value))
152*53ee8cc1Swenshuai.xi 
153*53ee8cc1Swenshuai.xi #define REG16_MSK_W(reg, mask, value)   REG16_W((reg), _CLR_(REG16_R(reg), (mask)) | _AND_((value), (mask)))
154*53ee8cc1Swenshuai.xi #define REG32_MSK_W(reg, mask, value)   REG32_W((reg), _CLR_(REG32_R(reg), (mask)) | _AND_((value), (mask)))
155*53ee8cc1Swenshuai.xi 
156*53ee8cc1Swenshuai.xi typedef struct
157*53ee8cc1Swenshuai.xi {
158*53ee8cc1Swenshuai.xi     MS_U16  VCID        : 8;
159*53ee8cc1Swenshuai.xi     MS_U16  RdPos       : 3;
160*53ee8cc1Swenshuai.xi     MS_U16  Clr         : 1;
161*53ee8cc1Swenshuai.xi     MS_U16  RW          : 1;
162*53ee8cc1Swenshuai.xi     MS_U16  Active      : 1;
163*53ee8cc1Swenshuai.xi     MS_U16  RdAddrLsb   : 1;
164*53ee8cc1Swenshuai.xi     MS_U16  PingpongEn  : 1;
165*53ee8cc1Swenshuai.xi } ST_ACPU_CMD;
166*53ee8cc1Swenshuai.xi 
167*53ee8cc1Swenshuai.xi typedef struct
168*53ee8cc1Swenshuai.xi {
169*53ee8cc1Swenshuai.xi     MS_U16  AlignEn     : 1;
170*53ee8cc1Swenshuai.xi     MS_U16  MiuSel      : 2;
171*53ee8cc1Swenshuai.xi     MS_U16  IntEn       : 1;
172*53ee8cc1Swenshuai.xi     MS_U16  MOBF        : 5;
173*53ee8cc1Swenshuai.xi     MS_U16  SecureFlag  : 1;
174*53ee8cc1Swenshuai.xi     MS_U16  TimestampEn : 1;
175*53ee8cc1Swenshuai.xi     MS_U16  Padding     : 5;
176*53ee8cc1Swenshuai.xi } ST_ACPU_FLAG;
177*53ee8cc1Swenshuai.xi 
_HAL_MultiPVR_IdrW(ST_ACPU_CMD stCmd,ST_ACPU_FLAG stFlag,MS_U32 u32Head,MS_U32 u32Tail)178*53ee8cc1Swenshuai.xi static void _HAL_MultiPVR_IdrW(ST_ACPU_CMD stCmd, ST_ACPU_FLAG stFlag, MS_U32 u32Head, MS_U32 u32Tail)
179*53ee8cc1Swenshuai.xi {
180*53ee8cc1Swenshuai.xi     REG32_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_43_44, u32Head);
181*53ee8cc1Swenshuai.xi     REG32_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_45_46, u32Tail);
182*53ee8cc1Swenshuai.xi     REG16_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_41, *((MS_U16*)&stCmd));
183*53ee8cc1Swenshuai.xi     REG16_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_42, *((MS_U16*)&stFlag));
184*53ee8cc1Swenshuai.xi     REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_40, CFG_MULTI_PVR_40_REG_ACPU_ACTIVE);
185*53ee8cc1Swenshuai.xi }
186*53ee8cc1Swenshuai.xi 
187*53ee8cc1Swenshuai.xi //acpu_rd_position = 0 (used size)
188*53ee8cc1Swenshuai.xi //                 = 1 (acpu_flag)
189*53ee8cc1Swenshuai.xi //                 = 4 (tail)
190*53ee8cc1Swenshuai.xi //                 = 5 (head)
_HAL_MultiPVR_IdrR(MS_U32 u32ChId,MS_U8 u8RdPos,MS_BOOL bRdAddrLsb)191*53ee8cc1Swenshuai.xi static MS_U32 _HAL_MultiPVR_IdrR(MS_U32 u32ChId, MS_U8 u8RdPos, MS_BOOL bRdAddrLsb)
192*53ee8cc1Swenshuai.xi {
193*53ee8cc1Swenshuai.xi     ST_ACPU_CMD stCmd;
194*53ee8cc1Swenshuai.xi 
195*53ee8cc1Swenshuai.xi     memset(&stCmd, 0, sizeof(ST_ACPU_CMD));
196*53ee8cc1Swenshuai.xi     stCmd.VCID = u32ChId & 0xFF;
197*53ee8cc1Swenshuai.xi     stCmd.RdPos = u8RdPos;
198*53ee8cc1Swenshuai.xi     stCmd.RdAddrLsb = bRdAddrLsb;
199*53ee8cc1Swenshuai.xi     REG16_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_41, *((MS_U16*)&stCmd));
200*53ee8cc1Swenshuai.xi     REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_40, CFG_MULTI_PVR_40_REG_ACPU_ACTIVE);
201*53ee8cc1Swenshuai.xi 
202*53ee8cc1Swenshuai.xi     return REG32_R(&_RegMultiPvrCtrl->CFG_MULTI_PVR_47_48);
203*53ee8cc1Swenshuai.xi }
204*53ee8cc1Swenshuai.xi 
205*53ee8cc1Swenshuai.xi #define MULTI_PVR_GET_USED_SIZE0(ChId)      ({ MS_U32  u32RetVal = _HAL_MultiPVR_IdrR(ChId, 0, 0); u32RetVal; })
206*53ee8cc1Swenshuai.xi #define MULTI_PVR_GET_USED_SIZE1(ChId)      ({ MS_U32  u32RetVal = _HAL_MultiPVR_IdrR(ChId, 0, 1); u32RetVal; })
207*53ee8cc1Swenshuai.xi #define MULTI_PVR_GET_ACPU_FLAG(ChId)       ({ MS_U32  u32RetVal = _HAL_MultiPVR_IdrR(ChId, 1, 0) >> 16; u32RetVal; })
208*53ee8cc1Swenshuai.xi #define MULTI_PVR_GET_HEAD0(ChId)           ({ MS_U32  u32RetVal = _HAL_MultiPVR_IdrR(ChId, 5, 0); u32RetVal; })
209*53ee8cc1Swenshuai.xi #define MULTI_PVR_GET_TAIL0(ChId)           ({ MS_U32  u32RetVal = _HAL_MultiPVR_IdrR(ChId, 4, 0); u32RetVal; })
210*53ee8cc1Swenshuai.xi #define MULTI_PVR_GET_HEAD1(ChId)           ({ MS_U32  u32RetVal = _HAL_MultiPVR_IdrR(ChId, 5, 1); u32RetVal; })
211*53ee8cc1Swenshuai.xi #define MULTI_PVR_GET_TAIL1(ChId)           ({ MS_U32  u32RetVal = _HAL_MultiPVR_IdrR(ChId, 4, 1); u32RetVal; })
212*53ee8cc1Swenshuai.xi 
213*53ee8cc1Swenshuai.xi #define MULTI_PVR_ENG_CHK(PvrEng, RetVal)   if(PvrEng >= TSP_MULTI_PVR_ENG_NUM)                                                     \
214*53ee8cc1Swenshuai.xi                                             {                                                                                       \
215*53ee8cc1Swenshuai.xi                                                 HAL_MULTI_PVR_DBGMSG(E_HAL_MULTI_PVR_DBG_LEVEL_ERR,                                 \
216*53ee8cc1Swenshuai.xi                                                                      E_HAL_MULTI_PVR_DBG_MODEL_ALL,                                 \
217*53ee8cc1Swenshuai.xi                                                                      printf("[MULTI_PVR_ERR][%s][%d] Wrong PVR Engine : 0x%x !!\n", \
218*53ee8cc1Swenshuai.xi                                                                             __FUNCTION__, __LINE__, PvrEng)                         \
219*53ee8cc1Swenshuai.xi                                                                     );                                                              \
220*53ee8cc1Swenshuai.xi                                                 return RetVal;                                                                      \
221*53ee8cc1Swenshuai.xi                                             }
222*53ee8cc1Swenshuai.xi 
223*53ee8cc1Swenshuai.xi #define MULTI_PVR_CHID_CHK(PvrChId, RetVal) if(PvrChId >= TSP_MULTI_PVR_CH_NUM)                                                     \
224*53ee8cc1Swenshuai.xi                                             {                                                                                       \
225*53ee8cc1Swenshuai.xi                                                 HAL_MULTI_PVR_DBGMSG(E_HAL_MULTI_PVR_DBG_LEVEL_ERR,                                 \
226*53ee8cc1Swenshuai.xi                                                                      E_HAL_MULTI_PVR_DBG_MODEL_ALL,                                 \
227*53ee8cc1Swenshuai.xi                                                                      printf("[MULTI_PVR_ERR][%s][%d] Wrong PVR ChId : 0x%x !!\n",   \
228*53ee8cc1Swenshuai.xi                                                                             __FUNCTION__, __LINE__, PvrChId)                        \
229*53ee8cc1Swenshuai.xi                                                                     );                                                              \
230*53ee8cc1Swenshuai.xi                                                 return RetVal;                                                                      \
231*53ee8cc1Swenshuai.xi                                             }
232*53ee8cc1Swenshuai.xi 
233*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
234*53ee8cc1Swenshuai.xi //  Debug Message
235*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
236*53ee8cc1Swenshuai.xi typedef enum
237*53ee8cc1Swenshuai.xi {
238*53ee8cc1Swenshuai.xi     E_HAL_MULTI_PVR_DBG_LEVEL_NONE,     // no debug message shown
239*53ee8cc1Swenshuai.xi     E_HAL_MULTI_PVR_DBG_LEVEL_ERR,      // only shows error message that can't be recover
240*53ee8cc1Swenshuai.xi     E_HAL_MULTI_PVR_DBG_LEVEL_WARN,     // error case can be recover, like retry
241*53ee8cc1Swenshuai.xi     E_HAL_MULTI_PVR_DBG_LEVEL_EVENT,    // event that is okay but better known, ex: timestamp ring, file circular, etc.
242*53ee8cc1Swenshuai.xi     E_HAL_MULTI_PVR_DBG_LEVEL_INFO,     // information for internal parameter
243*53ee8cc1Swenshuai.xi     E_HAL_MULTI_PVR_DBG_LEVEL_FUNC,     // Function trace and input parameter trace
244*53ee8cc1Swenshuai.xi     E_HAL_MULTI_PVR_DBG_LEVEL_TRACE,    // debug trace
245*53ee8cc1Swenshuai.xi } EN_HAL_MULTI_PVR_DBGMSG_LEVEL;
246*53ee8cc1Swenshuai.xi 
247*53ee8cc1Swenshuai.xi typedef enum
248*53ee8cc1Swenshuai.xi {
249*53ee8cc1Swenshuai.xi     E_HAL_MULTI_PVR_DBG_MODEL_NONE,     // @temporarily , need to refine
250*53ee8cc1Swenshuai.xi     E_HAL_MULTI_PVR_DBG_MODEL_ALL,
251*53ee8cc1Swenshuai.xi } EN_HAL_MULTI_PVR_DBGMSG_MODEL;
252*53ee8cc1Swenshuai.xi 
253*53ee8cc1Swenshuai.xi #define HAL_MULTI_PVR_DBGMSG(_level,_model,_f) do {if(_u32MultiPvrDbgLevel >= (_level)&&((_u32MultiPvrDbgModel&_model)!=0)) (_f);} while(0)
254*53ee8cc1Swenshuai.xi static MS_U32  _u32MultiPvrDbgLevel = E_HAL_MULTI_PVR_DBG_LEVEL_ERR;
255*53ee8cc1Swenshuai.xi static MS_U32  _u32MultiPvrDbgModel = E_HAL_MULTI_PVR_DBG_MODEL_ALL;
256*53ee8cc1Swenshuai.xi 
257*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_SetBank(MS_VIRT u32BankAddr)258*53ee8cc1Swenshuai.xi void HAL_MultiPVR_SetBank(MS_VIRT u32BankAddr)
259*53ee8cc1Swenshuai.xi {
260*53ee8cc1Swenshuai.xi     _RegMultiPvrCtrl = (REG_MULTI_PVR_ENG_Ctrl*)(u32BankAddr + 0xC1400);    //MultiPVR: 0x160A
261*53ee8cc1Swenshuai.xi }
262*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_Init(MS_U32 u32PVREng,MS_U32 pktDmxId)263*53ee8cc1Swenshuai.xi void HAL_MultiPVR_Init(MS_U32 u32PVREng, MS_U32 pktDmxId)
264*53ee8cc1Swenshuai.xi {
265*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng,);
266*53ee8cc1Swenshuai.xi 
267*53ee8cc1Swenshuai.xi     // input src
268*53ee8cc1Swenshuai.xi     REG16_MSK_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_71, CFG_MULTI_PVR_71_REG_INPUT_SRC_MASK, (((MS_U16)pktDmxId) << CFG_MULTI_PVR_71_REG_INPUT_SRC_SHIFT));
269*53ee8cc1Swenshuai.xi 
270*53ee8cc1Swenshuai.xi     // record ts
271*53ee8cc1Swenshuai.xi     REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_RECORD_TS);
272*53ee8cc1Swenshuai.xi 
273*53ee8cc1Swenshuai.xi     // record null
274*53ee8cc1Swenshuai.xi     REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_DIS_NULL_PKT);
275*53ee8cc1Swenshuai.xi 
276*53ee8cc1Swenshuai.xi     // enbale Multi-PVR
277*53ee8cc1Swenshuai.xi     REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_00, CFG_MULTI_PVR_00_REG_PVR_STR2MI_EN);
278*53ee8cc1Swenshuai.xi }
279*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_Exit(MS_U32 u32PVREng)280*53ee8cc1Swenshuai.xi void HAL_MultiPVR_Exit(MS_U32 u32PVREng)
281*53ee8cc1Swenshuai.xi {
282*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng,);
283*53ee8cc1Swenshuai.xi 
284*53ee8cc1Swenshuai.xi     // disable Multi-PVR
285*53ee8cc1Swenshuai.xi     REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_00, CFG_MULTI_PVR_00_REG_PVR_STR2MI_EN);
286*53ee8cc1Swenshuai.xi 
287*53ee8cc1Swenshuai.xi     // clear input src
288*53ee8cc1Swenshuai.xi     REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_71, CFG_MULTI_PVR_71_REG_INPUT_SRC_MASK);
289*53ee8cc1Swenshuai.xi 
290*53ee8cc1Swenshuai.xi     // reset record ts
291*53ee8cc1Swenshuai.xi     REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_RECORD_TS);
292*53ee8cc1Swenshuai.xi 
293*53ee8cc1Swenshuai.xi     // reset record null
294*53ee8cc1Swenshuai.xi     REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_DIS_NULL_PKT);
295*53ee8cc1Swenshuai.xi }
296*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_FlushData(MS_U32 u32PVREng)297*53ee8cc1Swenshuai.xi void HAL_MultiPVR_FlushData(MS_U32 u32PVREng)
298*53ee8cc1Swenshuai.xi {
299*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng,);
300*53ee8cc1Swenshuai.xi 
301*53ee8cc1Swenshuai.xi     REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_00, CFG_MULTI_PVR_00_REG_PVR_DMA_FLUSH_EN);
302*53ee8cc1Swenshuai.xi     REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_00, CFG_MULTI_PVR_00_REG_PVR_DMA_FLUSH_EN);
303*53ee8cc1Swenshuai.xi }
304*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_Skip_Scrmb(MS_U32 u32PVREng,MS_BOOL bSkip)305*53ee8cc1Swenshuai.xi void HAL_MultiPVR_Skip_Scrmb(MS_U32 u32PVREng, MS_BOOL bSkip)
306*53ee8cc1Swenshuai.xi {
307*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng,);
308*53ee8cc1Swenshuai.xi 
309*53ee8cc1Swenshuai.xi     if(bSkip)
310*53ee8cc1Swenshuai.xi     {
311*53ee8cc1Swenshuai.xi         REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_MASK_SCR_PVR_EN);
312*53ee8cc1Swenshuai.xi     }
313*53ee8cc1Swenshuai.xi     else
314*53ee8cc1Swenshuai.xi     {
315*53ee8cc1Swenshuai.xi         REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_MASK_SCR_PVR_EN);
316*53ee8cc1Swenshuai.xi     }
317*53ee8cc1Swenshuai.xi }
318*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_Block_Dis(MS_U32 u32PVREng,MS_BOOL bDisable)319*53ee8cc1Swenshuai.xi void HAL_MultiPVR_Block_Dis(MS_U32 u32PVREng, MS_BOOL bDisable)
320*53ee8cc1Swenshuai.xi {
321*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng,);
322*53ee8cc1Swenshuai.xi 
323*53ee8cc1Swenshuai.xi     if(bDisable)
324*53ee8cc1Swenshuai.xi     {
325*53ee8cc1Swenshuai.xi         REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_PVR_BLOCK_DISABLE);
326*53ee8cc1Swenshuai.xi     }
327*53ee8cc1Swenshuai.xi     else
328*53ee8cc1Swenshuai.xi     {
329*53ee8cc1Swenshuai.xi         REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_PVR_BLOCK_DISABLE);
330*53ee8cc1Swenshuai.xi     }
331*53ee8cc1Swenshuai.xi }
332*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_BurstLen(MS_U32 u32PVREng,MS_U16 u16BurstMode)333*53ee8cc1Swenshuai.xi void HAL_MultiPVR_BurstLen(MS_U32 u32PVREng, MS_U16 u16BurstMode)
334*53ee8cc1Swenshuai.xi {
335*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng,);
336*53ee8cc1Swenshuai.xi 
337*53ee8cc1Swenshuai.xi     REG16_MSK_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_00, CFG_MULTI_PVR_00_REG_PVR_BURST_LEN_MASK, (u16BurstMode << CFG_MULTI_PVR_00_REG_PVR_BURST_LEN_SHIFT));
338*53ee8cc1Swenshuai.xi }
339*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_Start(MS_U32 u32PVREng,MS_U32 u32ChId)340*53ee8cc1Swenshuai.xi void HAL_MultiPVR_Start(MS_U32 u32PVREng, MS_U32 u32ChId)
341*53ee8cc1Swenshuai.xi {
342*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng,);
343*53ee8cc1Swenshuai.xi     MULTI_PVR_CHID_CHK(u32ChId,);
344*53ee8cc1Swenshuai.xi 
345*53ee8cc1Swenshuai.xi     ST_ACPU_CMD stCmd;
346*53ee8cc1Swenshuai.xi     ST_ACPU_FLAG stFlag;
347*53ee8cc1Swenshuai.xi 
348*53ee8cc1Swenshuai.xi     memset(&stCmd, 0, sizeof(ST_ACPU_CMD));
349*53ee8cc1Swenshuai.xi     memset(&stFlag, 0, sizeof(ST_ACPU_FLAG));
350*53ee8cc1Swenshuai.xi 
351*53ee8cc1Swenshuai.xi     // read head , tail
352*53ee8cc1Swenshuai.xi     MS_U32  u32Head0 = MULTI_PVR_GET_HEAD0(u32ChId);
353*53ee8cc1Swenshuai.xi     MS_U32  u32Head1 = MULTI_PVR_GET_HEAD1(u32ChId);
354*53ee8cc1Swenshuai.xi     MS_U32  u32Tail0 = MULTI_PVR_GET_TAIL0(u32ChId);
355*53ee8cc1Swenshuai.xi     MS_U32  u32Tail1 = MULTI_PVR_GET_TAIL1(u32ChId);
356*53ee8cc1Swenshuai.xi 
357*53ee8cc1Swenshuai.xi     // read acpu_flag
358*53ee8cc1Swenshuai.xi     *((MS_U16*)&stFlag) = MULTI_PVR_GET_ACPU_FLAG(u32ChId);
359*53ee8cc1Swenshuai.xi 
360*53ee8cc1Swenshuai.xi     // write pingpong buf #0
361*53ee8cc1Swenshuai.xi     stCmd.VCID = u32ChId & 0xFF;
362*53ee8cc1Swenshuai.xi     stCmd.Clr = 1;
363*53ee8cc1Swenshuai.xi     stCmd.RW = 1;
364*53ee8cc1Swenshuai.xi     stCmd.Active = 1;   // PVR
365*53ee8cc1Swenshuai.xi     stCmd.RdAddrLsb = 0;
366*53ee8cc1Swenshuai.xi     stCmd.PingpongEn = 1;
367*53ee8cc1Swenshuai.xi     _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head0, u32Tail0);
368*53ee8cc1Swenshuai.xi 
369*53ee8cc1Swenshuai.xi     // write pingpong buf #1
370*53ee8cc1Swenshuai.xi     stCmd.RdAddrLsb = 1;
371*53ee8cc1Swenshuai.xi     _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head1, u32Tail1);
372*53ee8cc1Swenshuai.xi }
373*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_Stop(MS_U32 u32PVREng,MS_U32 u32ChId)374*53ee8cc1Swenshuai.xi void HAL_MultiPVR_Stop(MS_U32 u32PVREng, MS_U32 u32ChId)
375*53ee8cc1Swenshuai.xi {
376*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng,);
377*53ee8cc1Swenshuai.xi     MULTI_PVR_CHID_CHK(u32ChId,);
378*53ee8cc1Swenshuai.xi 
379*53ee8cc1Swenshuai.xi     ST_ACPU_CMD stCmd;
380*53ee8cc1Swenshuai.xi     ST_ACPU_FLAG stFlag;
381*53ee8cc1Swenshuai.xi 
382*53ee8cc1Swenshuai.xi     memset(&stCmd, 0, sizeof(ST_ACPU_CMD));
383*53ee8cc1Swenshuai.xi     memset(&stFlag, 0, sizeof(ST_ACPU_FLAG));
384*53ee8cc1Swenshuai.xi 
385*53ee8cc1Swenshuai.xi     // read head , tail
386*53ee8cc1Swenshuai.xi     MS_U32  u32Head0 = MULTI_PVR_GET_HEAD0(u32ChId);
387*53ee8cc1Swenshuai.xi     MS_U32  u32Head1 = MULTI_PVR_GET_HEAD1(u32ChId);
388*53ee8cc1Swenshuai.xi     MS_U32  u32Tail0 = MULTI_PVR_GET_TAIL0(u32ChId);
389*53ee8cc1Swenshuai.xi     MS_U32  u32Tail1 = MULTI_PVR_GET_TAIL1(u32ChId);
390*53ee8cc1Swenshuai.xi 
391*53ee8cc1Swenshuai.xi     // read acpu_flag
392*53ee8cc1Swenshuai.xi     *((MS_U16*)&stFlag) = MULTI_PVR_GET_ACPU_FLAG(u32ChId);
393*53ee8cc1Swenshuai.xi 
394*53ee8cc1Swenshuai.xi     // write pingpong buf #0
395*53ee8cc1Swenshuai.xi     stCmd.VCID = u32ChId & 0xFF;
396*53ee8cc1Swenshuai.xi     stCmd.Clr = 1;
397*53ee8cc1Swenshuai.xi     stCmd.RW = 1;
398*53ee8cc1Swenshuai.xi     stCmd.Active = 0;   // drop pkt
399*53ee8cc1Swenshuai.xi     stCmd.RdAddrLsb = 0;
400*53ee8cc1Swenshuai.xi     stCmd.PingpongEn = 1;
401*53ee8cc1Swenshuai.xi     _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head0, u32Tail0);
402*53ee8cc1Swenshuai.xi 
403*53ee8cc1Swenshuai.xi     // write pingpong buf #1
404*53ee8cc1Swenshuai.xi     stCmd.RdAddrLsb = 1;
405*53ee8cc1Swenshuai.xi     _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head1, u32Tail1);
406*53ee8cc1Swenshuai.xi }
407*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_Pause(MS_U32 u32PVREng,MS_BOOL bPause)408*53ee8cc1Swenshuai.xi void HAL_MultiPVR_Pause(MS_U32 u32PVREng, MS_BOOL bPause)
409*53ee8cc1Swenshuai.xi {
410*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng,);
411*53ee8cc1Swenshuai.xi 
412*53ee8cc1Swenshuai.xi     if(bPause)
413*53ee8cc1Swenshuai.xi     {
414*53ee8cc1Swenshuai.xi         REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_00, CFG_MULTI_PVR_00_REG_PVR_STR2MI_PAUSE);
415*53ee8cc1Swenshuai.xi     }
416*53ee8cc1Swenshuai.xi     else
417*53ee8cc1Swenshuai.xi     {
418*53ee8cc1Swenshuai.xi         REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_00, CFG_MULTI_PVR_00_REG_PVR_STR2MI_PAUSE);
419*53ee8cc1Swenshuai.xi     }
420*53ee8cc1Swenshuai.xi }
421*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_RecPid(MS_U32 u32PVREng,MS_BOOL bSet)422*53ee8cc1Swenshuai.xi void HAL_MultiPVR_RecPid(MS_U32 u32PVREng, MS_BOOL bSet)
423*53ee8cc1Swenshuai.xi {
424*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng,);
425*53ee8cc1Swenshuai.xi 
426*53ee8cc1Swenshuai.xi     if(bSet)
427*53ee8cc1Swenshuai.xi     {
428*53ee8cc1Swenshuai.xi         REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_RECORD_ALL);
429*53ee8cc1Swenshuai.xi     }
430*53ee8cc1Swenshuai.xi     else
431*53ee8cc1Swenshuai.xi     {
432*53ee8cc1Swenshuai.xi         REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_RECORD_ALL);
433*53ee8cc1Swenshuai.xi     }
434*53ee8cc1Swenshuai.xi }
435*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_RecNull(MS_U32 u32PVREng,MS_BOOL bSet)436*53ee8cc1Swenshuai.xi void HAL_MultiPVR_RecNull(MS_U32 u32PVREng, MS_BOOL bSet)
437*53ee8cc1Swenshuai.xi {
438*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng,);
439*53ee8cc1Swenshuai.xi 
440*53ee8cc1Swenshuai.xi     if(bSet)
441*53ee8cc1Swenshuai.xi     {
442*53ee8cc1Swenshuai.xi         REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_DIS_NULL_PKT);
443*53ee8cc1Swenshuai.xi     }
444*53ee8cc1Swenshuai.xi     else
445*53ee8cc1Swenshuai.xi     {
446*53ee8cc1Swenshuai.xi         REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_DIS_NULL_PKT);
447*53ee8cc1Swenshuai.xi     }
448*53ee8cc1Swenshuai.xi }
449*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_SetStr2Miu_StartAddr(MS_U32 u32PVREng,MS_U32 u32ChId,MS_U32 u32StartAddr0,MS_U32 u32StartAddr1)450*53ee8cc1Swenshuai.xi void HAL_MultiPVR_SetStr2Miu_StartAddr(MS_U32 u32PVREng, MS_U32 u32ChId, MS_U32 u32StartAddr0, MS_U32 u32StartAddr1)
451*53ee8cc1Swenshuai.xi {
452*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng,);
453*53ee8cc1Swenshuai.xi     MULTI_PVR_CHID_CHK(u32ChId,);
454*53ee8cc1Swenshuai.xi 
455*53ee8cc1Swenshuai.xi     ST_ACPU_CMD stCmd;
456*53ee8cc1Swenshuai.xi     ST_ACPU_FLAG stFlag;
457*53ee8cc1Swenshuai.xi 
458*53ee8cc1Swenshuai.xi     memset(&stCmd, 0, sizeof(ST_ACPU_CMD));
459*53ee8cc1Swenshuai.xi     memset(&stFlag, 0, sizeof(ST_ACPU_FLAG));
460*53ee8cc1Swenshuai.xi 
461*53ee8cc1Swenshuai.xi     // read tail
462*53ee8cc1Swenshuai.xi     MS_U32  u32Tail0 = MULTI_PVR_GET_TAIL0(u32ChId);
463*53ee8cc1Swenshuai.xi     MS_U32  u32Tail1 = MULTI_PVR_GET_TAIL1(u32ChId);
464*53ee8cc1Swenshuai.xi 
465*53ee8cc1Swenshuai.xi     // read acpu_flag
466*53ee8cc1Swenshuai.xi     *((MS_U16*)&stFlag) = MULTI_PVR_GET_ACPU_FLAG(u32ChId);
467*53ee8cc1Swenshuai.xi 
468*53ee8cc1Swenshuai.xi     // write pingpong buf #0
469*53ee8cc1Swenshuai.xi     stCmd.VCID = u32ChId & 0xFF;
470*53ee8cc1Swenshuai.xi     stCmd.Clr = 1;
471*53ee8cc1Swenshuai.xi     stCmd.RW = 1;
472*53ee8cc1Swenshuai.xi     stCmd.Active = 0;   // drop pkt
473*53ee8cc1Swenshuai.xi     stCmd.RdAddrLsb = 0;
474*53ee8cc1Swenshuai.xi     stCmd.PingpongEn = 1;
475*53ee8cc1Swenshuai.xi     _HAL_MultiPVR_IdrW(stCmd, stFlag, u32StartAddr0, u32Tail0);
476*53ee8cc1Swenshuai.xi 
477*53ee8cc1Swenshuai.xi     // write pingpong buf #1
478*53ee8cc1Swenshuai.xi     stCmd.RdAddrLsb = 1;
479*53ee8cc1Swenshuai.xi     _HAL_MultiPVR_IdrW(stCmd, stFlag, u32StartAddr1, u32Tail1);
480*53ee8cc1Swenshuai.xi }
481*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_SetStr2Miu_EndAddr(MS_U32 u32PVREng,MS_U32 u32ChId,MS_U32 u32EndAddr0,MS_U32 u32EndAddr1)482*53ee8cc1Swenshuai.xi void HAL_MultiPVR_SetStr2Miu_EndAddr(MS_U32 u32PVREng, MS_U32 u32ChId, MS_U32 u32EndAddr0, MS_U32 u32EndAddr1)
483*53ee8cc1Swenshuai.xi {
484*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng,);
485*53ee8cc1Swenshuai.xi     MULTI_PVR_CHID_CHK(u32ChId,);
486*53ee8cc1Swenshuai.xi 
487*53ee8cc1Swenshuai.xi     ST_ACPU_CMD stCmd;
488*53ee8cc1Swenshuai.xi     ST_ACPU_FLAG stFlag;
489*53ee8cc1Swenshuai.xi 
490*53ee8cc1Swenshuai.xi     memset(&stCmd, 0, sizeof(ST_ACPU_CMD));
491*53ee8cc1Swenshuai.xi     memset(&stFlag, 0, sizeof(ST_ACPU_FLAG));
492*53ee8cc1Swenshuai.xi 
493*53ee8cc1Swenshuai.xi     // read head
494*53ee8cc1Swenshuai.xi     MS_U32  u32Head0 = MULTI_PVR_GET_HEAD0(u32ChId);
495*53ee8cc1Swenshuai.xi     MS_U32  u32Head1 = MULTI_PVR_GET_HEAD1(u32ChId);
496*53ee8cc1Swenshuai.xi 
497*53ee8cc1Swenshuai.xi     // read acpu_flag
498*53ee8cc1Swenshuai.xi     *((MS_U16*)&stFlag) = MULTI_PVR_GET_ACPU_FLAG(u32ChId);
499*53ee8cc1Swenshuai.xi 
500*53ee8cc1Swenshuai.xi     // write pingpong buf #0
501*53ee8cc1Swenshuai.xi     stCmd.VCID = u32ChId & 0xFF;
502*53ee8cc1Swenshuai.xi     stCmd.Clr = 1;
503*53ee8cc1Swenshuai.xi     stCmd.RW = 1;
504*53ee8cc1Swenshuai.xi     stCmd.Active = 0;   // drop pkt
505*53ee8cc1Swenshuai.xi     stCmd.RdAddrLsb = 0;
506*53ee8cc1Swenshuai.xi     stCmd.PingpongEn = 1;
507*53ee8cc1Swenshuai.xi     _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head0, u32EndAddr0);
508*53ee8cc1Swenshuai.xi 
509*53ee8cc1Swenshuai.xi     // write pingpong buf #1
510*53ee8cc1Swenshuai.xi     stCmd.RdAddrLsb = 1;
511*53ee8cc1Swenshuai.xi     _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head1, u32EndAddr1);
512*53ee8cc1Swenshuai.xi }
513*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_GetWritePtr(MS_U32 u32PVREng,MS_U32 u32ChId)514*53ee8cc1Swenshuai.xi MS_U32 HAL_MultiPVR_GetWritePtr(MS_U32 u32PVREng, MS_U32 u32ChId)
515*53ee8cc1Swenshuai.xi {
516*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng, 0);
517*53ee8cc1Swenshuai.xi     MULTI_PVR_CHID_CHK(u32ChId, 0);
518*53ee8cc1Swenshuai.xi 
519*53ee8cc1Swenshuai.xi     MS_U32  u32UsedSize0 = MULTI_PVR_GET_USED_SIZE0(u32ChId);
520*53ee8cc1Swenshuai.xi 
521*53ee8cc1Swenshuai.xi     if(u32UsedSize0 == 0)
522*53ee8cc1Swenshuai.xi     {
523*53ee8cc1Swenshuai.xi         MS_U32  u32UsedSize1 = MULTI_PVR_GET_USED_SIZE1(u32ChId);
524*53ee8cc1Swenshuai.xi 
525*53ee8cc1Swenshuai.xi         if(u32UsedSize1 == 0)
526*53ee8cc1Swenshuai.xi         {
527*53ee8cc1Swenshuai.xi             REG16_MSK_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_50, CFG_MULTI_PVR_50_REG_SGDMA_OUT_VC_STATUS_SEL_MASK, ((MS_U16)u32ChId << CFG_MULTI_PVR_50_REG_SGDMA_OUT_VC_STATUS_SEL_SHIFT));
528*53ee8cc1Swenshuai.xi             MS_BOOL bPingpongPtr = (REG16_R(&_RegMultiPvrCtrl->CFG_MULTI_PVR_51) & CFG_MULTI_PVR_51_REG_SGDMA_OUT_VC_STATUS_PINGPONG_PTR);
529*53ee8cc1Swenshuai.xi 
530*53ee8cc1Swenshuai.xi             if(bPingpongPtr)
531*53ee8cc1Swenshuai.xi             {
532*53ee8cc1Swenshuai.xi                 return MULTI_PVR_GET_HEAD1(u32ChId);
533*53ee8cc1Swenshuai.xi             }
534*53ee8cc1Swenshuai.xi             else
535*53ee8cc1Swenshuai.xi             {
536*53ee8cc1Swenshuai.xi                 return MULTI_PVR_GET_HEAD0(u32ChId);
537*53ee8cc1Swenshuai.xi             }
538*53ee8cc1Swenshuai.xi         }
539*53ee8cc1Swenshuai.xi         else
540*53ee8cc1Swenshuai.xi         {
541*53ee8cc1Swenshuai.xi             return (MULTI_PVR_GET_HEAD1(u32ChId) + u32UsedSize1);
542*53ee8cc1Swenshuai.xi         }
543*53ee8cc1Swenshuai.xi     }
544*53ee8cc1Swenshuai.xi     else
545*53ee8cc1Swenshuai.xi     {
546*53ee8cc1Swenshuai.xi         return (MULTI_PVR_GET_HEAD0(u32ChId) + u32UsedSize0);
547*53ee8cc1Swenshuai.xi     }
548*53ee8cc1Swenshuai.xi }
549*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_SetStrPacketMode(MS_U32 u32PVREng,MS_U32 u32ChId,MS_BOOL bSet)550*53ee8cc1Swenshuai.xi void HAL_MultiPVR_SetStrPacketMode(MS_U32 u32PVREng, MS_U32 u32ChId, MS_BOOL bSet)
551*53ee8cc1Swenshuai.xi {
552*53ee8cc1Swenshuai.xi     MULTI_PVR_ENG_CHK(u32PVREng,);
553*53ee8cc1Swenshuai.xi     MULTI_PVR_CHID_CHK(u32ChId,);
554*53ee8cc1Swenshuai.xi 
555*53ee8cc1Swenshuai.xi     ST_ACPU_CMD stCmd;
556*53ee8cc1Swenshuai.xi     ST_ACPU_FLAG stFlag;
557*53ee8cc1Swenshuai.xi 
558*53ee8cc1Swenshuai.xi     memset(&stCmd, 0, sizeof(ST_ACPU_CMD));
559*53ee8cc1Swenshuai.xi     memset(&stFlag, 0, sizeof(ST_ACPU_FLAG));
560*53ee8cc1Swenshuai.xi 
561*53ee8cc1Swenshuai.xi     // read head , tail
562*53ee8cc1Swenshuai.xi     MS_U32  u32Head0 = MULTI_PVR_GET_HEAD0(u32ChId);
563*53ee8cc1Swenshuai.xi     MS_U32  u32Head1 = MULTI_PVR_GET_HEAD1(u32ChId);
564*53ee8cc1Swenshuai.xi     MS_U32  u32Tail0 = MULTI_PVR_GET_TAIL0(u32ChId);
565*53ee8cc1Swenshuai.xi     MS_U32  u32Tail1 = MULTI_PVR_GET_TAIL1(u32ChId);
566*53ee8cc1Swenshuai.xi 
567*53ee8cc1Swenshuai.xi     // read acpu_flag
568*53ee8cc1Swenshuai.xi     *((MS_U16*)&stFlag) = MULTI_PVR_GET_ACPU_FLAG(u32ChId);
569*53ee8cc1Swenshuai.xi 
570*53ee8cc1Swenshuai.xi     stFlag.TimestampEn = !!bSet;    // 188 or 192
571*53ee8cc1Swenshuai.xi 
572*53ee8cc1Swenshuai.xi     // write pingpong buf #0
573*53ee8cc1Swenshuai.xi     stCmd.VCID = u32ChId & 0xFF;
574*53ee8cc1Swenshuai.xi     stCmd.Clr = 1;
575*53ee8cc1Swenshuai.xi     stCmd.RW = 1;
576*53ee8cc1Swenshuai.xi     stCmd.Active = 0;   // drop pkt
577*53ee8cc1Swenshuai.xi     stCmd.RdAddrLsb = 0;
578*53ee8cc1Swenshuai.xi     stCmd.PingpongEn = 1;
579*53ee8cc1Swenshuai.xi     _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head0, u32Tail0);
580*53ee8cc1Swenshuai.xi 
581*53ee8cc1Swenshuai.xi     // write pingpong buf #1
582*53ee8cc1Swenshuai.xi     stCmd.RdAddrLsb = 1;
583*53ee8cc1Swenshuai.xi     _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head1, u32Tail1);
584*53ee8cc1Swenshuai.xi }
585*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_SetPVRTimeStamp(MS_U32 u32PVREng,MS_U32 u32ChId,MS_U32 u32Stamp)586*53ee8cc1Swenshuai.xi void HAL_MultiPVR_SetPVRTimeStamp(MS_U32 u32PVREng, MS_U32 u32ChId, MS_U32 u32Stamp)
587*53ee8cc1Swenshuai.xi {
588*53ee8cc1Swenshuai.xi     // Not support...
589*53ee8cc1Swenshuai.xi     // (1) live-in: use FIQ timestamp
590*53ee8cc1Swenshuai.xi     // (2) file-in: can't write to PVR
591*53ee8cc1Swenshuai.xi }
592*53ee8cc1Swenshuai.xi 
HAL_MultiPVR_GetPVRTimeStamp(MS_U32 u32PVREng,MS_U32 u32ChId)593*53ee8cc1Swenshuai.xi MS_U32 HAL_MultiPVR_GetPVRTimeStamp(MS_U32 u32PVREng, MS_U32 u32ChId)
594*53ee8cc1Swenshuai.xi {
595*53ee8cc1Swenshuai.xi     // Not support...
596*53ee8cc1Swenshuai.xi     // (1) live-in: use FIQ timestamp
597*53ee8cc1Swenshuai.xi     // (2) file-in: can't write to PVR
598*53ee8cc1Swenshuai.xi     return 0;
599*53ee8cc1Swenshuai.xi }
600