xref: /utopia/UTPA2-700.0.x/modules/vdec_lite/drv/hvd_lite/drvHVD_EX.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi ///
97*53ee8cc1Swenshuai.xi /// file    drvHVD_EX.c
98*53ee8cc1Swenshuai.xi /// @brief  HVD Driver Interface
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
100*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi 
102*53ee8cc1Swenshuai.xi 
103*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
104*53ee8cc1Swenshuai.xi //  Include Files
105*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
106*53ee8cc1Swenshuai.xi // Common Definition
107*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
108*53ee8cc1Swenshuai.xi #include <linux/string.h>
109*53ee8cc1Swenshuai.xi #else
110*53ee8cc1Swenshuai.xi #include <string.h>
111*53ee8cc1Swenshuai.xi #endif
112*53ee8cc1Swenshuai.xi #include "drvHVD_Common.h"
113*53ee8cc1Swenshuai.xi #include "drvHVD_EX.h"
114*53ee8cc1Swenshuai.xi #include "drvHVD_def.h"
115*53ee8cc1Swenshuai.xi 
116*53ee8cc1Swenshuai.xi #include "fwHVD_if.h"
117*53ee8cc1Swenshuai.xi #include "halVPU_EX.h"
118*53ee8cc1Swenshuai.xi #include "halHVD_EX.h"
119*53ee8cc1Swenshuai.xi #include "regHVD_EX.h"
120*53ee8cc1Swenshuai.xi #include "drvSYS.h"
121*53ee8cc1Swenshuai.xi #include "HVD_EX_Common.h"
122*53ee8cc1Swenshuai.xi #if defined(SUPPORT_CMA)
123*53ee8cc1Swenshuai.xi #include "drvCMAPool.h"
124*53ee8cc1Swenshuai.xi #include "msos/linux/ion_uapi.h"
125*53ee8cc1Swenshuai.xi #include "msos/linux/mdrv_cma_pool_st.h"
126*53ee8cc1Swenshuai.xi #endif
127*53ee8cc1Swenshuai.xi 
128*53ee8cc1Swenshuai.xi #if HVD_ENABLE_AUTO_SET_REG_BASE
129*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
130*53ee8cc1Swenshuai.xi #endif
131*53ee8cc1Swenshuai.xi 
132*53ee8cc1Swenshuai.xi #if (!defined(MSOS_TYPE_NUTTX) && !defined(MSOS_TYPE_OPTEE)) || defined(SUPPORT_X_MODEL_FEATURE)
133*53ee8cc1Swenshuai.xi 
134*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
135*53ee8cc1Swenshuai.xi     #define VPRINTF printk
136*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_ECOS)
137*53ee8cc1Swenshuai.xi     #define VPRINTF diag_printf
138*53ee8cc1Swenshuai.xi #else
139*53ee8cc1Swenshuai.xi     #ifndef ANDROID
140*53ee8cc1Swenshuai.xi         #define VPRINTF printf
141*53ee8cc1Swenshuai.xi     #else
142*53ee8cc1Swenshuai.xi         #include <sys/mman.h>
143*53ee8cc1Swenshuai.xi         #include <cutils/ashmem.h>
144*53ee8cc1Swenshuai.xi         #include <cutils/log.h>
145*53ee8cc1Swenshuai.xi 
146*53ee8cc1Swenshuai.xi         #define VPRINTF ALOGD
147*53ee8cc1Swenshuai.xi     #endif
148*53ee8cc1Swenshuai.xi #endif
149*53ee8cc1Swenshuai.xi 
150*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
151*53ee8cc1Swenshuai.xi //  Driver Compiler Options
152*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
153*53ee8cc1Swenshuai.xi //#define SUPPORT_X_MODEL_FEATURE
154*53ee8cc1Swenshuai.xi //#define SUPPORT_X_MODEL_HVD_FEATURE //there is a side effect for CB when enable this define.should find the root cause then enable it
155*53ee8cc1Swenshuai.xi #define DISABLE_ISR_DETACH
156*53ee8cc1Swenshuai.xi 
157*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
158*53ee8cc1Swenshuai.xi //  Local Defines
159*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
160*53ee8cc1Swenshuai.xi 
161*53ee8cc1Swenshuai.xi // Drv memory usage
162*53ee8cc1Swenshuai.xi #if defined(REDLION_LINUX_KERNEL_ENVI)
163*53ee8cc1Swenshuai.xi #define HVD_DTV_VIDEO_DELAY         0   // ms
164*53ee8cc1Swenshuai.xi #else
165*53ee8cc1Swenshuai.xi #define HVD_DTV_VIDEO_DELAY         0   // ms
166*53ee8cc1Swenshuai.xi #endif
167*53ee8cc1Swenshuai.xi #define HVD_FW_CMD_TIMEOUT_DEFAULT      100     // ms
168*53ee8cc1Swenshuai.xi #define HVD_FW_EXIT_ACTION_TIMEOUT      3500    // ms
169*53ee8cc1Swenshuai.xi 
170*53ee8cc1Swenshuai.xi #ifdef VDEC3
171*53ee8cc1Swenshuai.xi #define HVD_MAX_STREAMS         16
172*53ee8cc1Swenshuai.xi #else
173*53ee8cc1Swenshuai.xi #define HVD_MAX_STREAMS         2
174*53ee8cc1Swenshuai.xi #endif
175*53ee8cc1Swenshuai.xi 
176*53ee8cc1Swenshuai.xi #define HVD_CTRL_INIT_FINISHED          BIT(0)  // deflaut: 0
177*53ee8cc1Swenshuai.xi #define HVD_CTRL_PROCESSING             BIT(1)  // deflaut: 0
178*53ee8cc1Swenshuai.xi #define HVD_CTRL_DATA_END               BIT(2)  // deflaut: 0
179*53ee8cc1Swenshuai.xi #define HVD_CTRL_DISPLAY_CTRL           BIT(3)  // deflaut: 0
180*53ee8cc1Swenshuai.xi #define HVD_CTRL_DISP_INFO_RDY          BIT(4)  // deflaut: 0
181*53ee8cc1Swenshuai.xi 
182*53ee8cc1Swenshuai.xi #define HVD_CTRL_DISP_OUTSIDE           BIT(5)//BIT(9)  // deflaut: 0
183*53ee8cc1Swenshuai.xi typedef enum
184*53ee8cc1Swenshuai.xi {
185*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_NONE = 0,   //decode -> decode_finish
186*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_INIT,
187*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_TRIGGER_DISP,
188*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_SEEK2PTS,
189*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_MAX,
190*53ee8cc1Swenshuai.xi } HVD_Check_Cmd;
191*53ee8cc1Swenshuai.xi 
192*53ee8cc1Swenshuai.xi #define HVD_MIU_PROTECT_HVD     BIT(0)
193*53ee8cc1Swenshuai.xi #define HVD_MIU_PROTECT_MVD     BIT(1)
194*53ee8cc1Swenshuai.xi #define HVD_MIU_PROTECT_VPU     BIT(2)
195*53ee8cc1Swenshuai.xi 
196*53ee8cc1Swenshuai.xi #define _DRV_HVD_EX_Entry(u8DrvId)                                     \
197*53ee8cc1Swenshuai.xi     do                                                              \
198*53ee8cc1Swenshuai.xi     {                                                               \
199*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode |= HVD_CTRL_PROCESSING;    \
200*53ee8cc1Swenshuai.xi     } while (0)
201*53ee8cc1Swenshuai.xi 
202*53ee8cc1Swenshuai.xi #define _DRV_HVD_EX_RET(u8DrvId, _ret_)                             \
203*53ee8cc1Swenshuai.xi     do                                                              \
204*53ee8cc1Swenshuai.xi     {                                                               \
205*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode &= (~HVD_CTRL_PROCESSING); \
206*53ee8cc1Swenshuai.xi         return (_ret_);                                             \
207*53ee8cc1Swenshuai.xi     } while (0)
208*53ee8cc1Swenshuai.xi 
209*53ee8cc1Swenshuai.xi #define _DRV_HVD_Inited(u8DrvId,_ret_)  \
210*53ee8cc1Swenshuai.xi     do                          \
211*53ee8cc1Swenshuai.xi     {                           \
212*53ee8cc1Swenshuai.xi         if (!(pHVDDrvContext->bHVDIsInited[u8DrvId]))      \
213*53ee8cc1Swenshuai.xi         {                       \
214*53ee8cc1Swenshuai.xi             return _ret_;       \
215*53ee8cc1Swenshuai.xi         }                       \
216*53ee8cc1Swenshuai.xi     } while (0)
217*53ee8cc1Swenshuai.xi 
218*53ee8cc1Swenshuai.xi #define _DRV_HVD_Rsting(u8DrvId,_ret_)  \
219*53ee8cc1Swenshuai.xi     do                          \
220*53ee8cc1Swenshuai.xi     {                           \
221*53ee8cc1Swenshuai.xi         if (pHVDDrvContext->bHVDIsIniting[u8DrvId])      \
222*53ee8cc1Swenshuai.xi         {                       \
223*53ee8cc1Swenshuai.xi             return _ret_;       \
224*53ee8cc1Swenshuai.xi         }                       \
225*53ee8cc1Swenshuai.xi     } while (0)
226*53ee8cc1Swenshuai.xi 
227*53ee8cc1Swenshuai.xi #define _DRV_HVD_Ctrl(u8DrvId, x)    ( pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode & (x) )
228*53ee8cc1Swenshuai.xi 
229*53ee8cc1Swenshuai.xi #define _DRV_HVD_SetCtrl(u8DrvId, x)                \
230*53ee8cc1Swenshuai.xi     do                                              \
231*53ee8cc1Swenshuai.xi     {                                               \
232*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode |= (x);    \
233*53ee8cc1Swenshuai.xi     } while (0)
234*53ee8cc1Swenshuai.xi 
235*53ee8cc1Swenshuai.xi #ifndef UNUSED
236*53ee8cc1Swenshuai.xi #define UNUSED(x) (void)(x)
237*53ee8cc1Swenshuai.xi #endif
238*53ee8cc1Swenshuai.xi 
239*53ee8cc1Swenshuai.xi #define _MS_TO_90K(x)         (x*90)  //ms ==> 90k counter
240*53ee8cc1Swenshuai.xi #define _90K_TO_MS(x)         (x/90)  //90k counter ==> ms
241*53ee8cc1Swenshuai.xi 
242*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
243*53ee8cc1Swenshuai.xi //  Local Structures
244*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
245*53ee8cc1Swenshuai.xi 
246*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
247*53ee8cc1Swenshuai.xi // Local Functions Prototype
248*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
249*53ee8cc1Swenshuai.xi static void            _HVD_EX_SetShareInfoAddr(MS_U32 u32Id);
250*53ee8cc1Swenshuai.xi static HVD_EX_Result   _HVD_EX_InitVariables(MS_U32 u32Id, HVD_EX_MemCfg *pStMemCfg, HVD_Init_Params *pStInitParams);
251*53ee8cc1Swenshuai.xi static HVD_EX_Result   _HVD_EX_Check_Cmd(MS_U32 u32Id, HVD_Check_Cmd eCmd);
252*53ee8cc1Swenshuai.xi #ifdef VDEC3
253*53ee8cc1Swenshuai.xi static HVD_EX_Result   _HVD_EX_InitRegCPU(MS_U32 u32Id, MS_BOOL bFWdecideFB);
254*53ee8cc1Swenshuai.xi #else
255*53ee8cc1Swenshuai.xi static HVD_EX_Result   _HVD_EX_InitRegCPU(MS_U32 u32Id);
256*53ee8cc1Swenshuai.xi #endif
257*53ee8cc1Swenshuai.xi static HVD_EX_Result   _HVD_EX_SetSyncMode(MS_U32 u32Id, HVD_Sync_Tbl_Type eMode);
258*53ee8cc1Swenshuai.xi static HVD_EX_Result   _HVD_EX_InitFW_AVC(MS_U32 u32Id);
259*53ee8cc1Swenshuai.xi static HVD_EX_Result   _HVD_EX_InitFW_RM(MS_U32 u32Id);
260*53ee8cc1Swenshuai.xi static HVD_EX_Result   _HVD_EX_CheckFWVersion(MS_U32 u32Id);
261*53ee8cc1Swenshuai.xi static HVD_EX_Result   _HVD_EX_InitFW(MS_U32 u32Id);
262*53ee8cc1Swenshuai.xi static MS_BOOL      _HVD_EX_IsAllBufferEmpty(MS_U32 u32Id, MS_BOOL bFlush);
263*53ee8cc1Swenshuai.xi #ifndef VDEC3
264*53ee8cc1Swenshuai.xi static MS_BOOL      _HVD_EX_IsAllBufferEmpty_VP8(MS_U32 u32Id);
265*53ee8cc1Swenshuai.xi #endif
266*53ee8cc1Swenshuai.xi static MS_U8        _HVD_EX_GetDrvId(MS_U32 u32Id);
267*53ee8cc1Swenshuai.xi 
268*53ee8cc1Swenshuai.xi #if defined(REDLION_LINUX_KERNEL_ENVI)
269*53ee8cc1Swenshuai.xi static MS_S32 _HVD_EX_ISRHandler(void);
270*53ee8cc1Swenshuai.xi #else
271*53ee8cc1Swenshuai.xi static void _HVD_EX_ISRHandler(void);
272*53ee8cc1Swenshuai.xi #endif
273*53ee8cc1Swenshuai.xi 
274*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_ReportLow32BitPTS(MS_U32 u32Id, MS_U32 u32PTS);
275*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_Map2HVDErrCode(MS_U32 u32ErrCode);
276*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_Map2HVDESBufStatus(MS_U32 u32ESBufStatus);
277*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_GetMIUBase(MS_U8 u8DrvId, MS_U32 u32MIU);
278*53ee8cc1Swenshuai.xi 
279*53ee8cc1Swenshuai.xi #if 0
280*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
281*53ee8cc1Swenshuai.xi //  Global Variables
282*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
283*53ee8cc1Swenshuai.xi MS_U32 u32UartCtrl = (E_HVD_UART_CTRL_ERR | E_HVD_UART_CTRL_MUST);
284*53ee8cc1Swenshuai.xi MS_U32 u32InitSysTimeBase = 0;
285*53ee8cc1Swenshuai.xi 
286*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
287*53ee8cc1Swenshuai.xi //  Local Variables
288*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
289*53ee8cc1Swenshuai.xi static MSIF_Version _drv_hvd_version =
290*53ee8cc1Swenshuai.xi {
291*53ee8cc1Swenshuai.xi     .DDI = {HVD_DRV_VERSION,},
292*53ee8cc1Swenshuai.xi };
293*53ee8cc1Swenshuai.xi static MS_BOOL bHVDIsInited;
294*53ee8cc1Swenshuai.xi static MS_BOOL bHVDIsIniting;
295*53ee8cc1Swenshuai.xi static HVD_EX_DrvInfo DrvInfo;
296*53ee8cc1Swenshuai.xi static HVD_EX_Drv_Ctrl gHVDCtrl_EX[HVD_MAX_STREAMS] =
297*53ee8cc1Swenshuai.xi {
298*53ee8cc1Swenshuai.xi     {   .bUsed              = FALSE,
299*53ee8cc1Swenshuai.xi     },
300*53ee8cc1Swenshuai.xi     {   .bUsed              = FALSE,
301*53ee8cc1Swenshuai.xi     },
302*53ee8cc1Swenshuai.xi };
303*53ee8cc1Swenshuai.xi 
304*53ee8cc1Swenshuai.xi static MS_BOOL bHVDIsrAttached = FALSE;
305*53ee8cc1Swenshuai.xi #endif
306*53ee8cc1Swenshuai.xi MS_U32 u32UartCtrl = (E_HVD_UART_CTRL_ERR | E_HVD_UART_CTRL_MUST);
307*53ee8cc1Swenshuai.xi 
308*53ee8cc1Swenshuai.xi typedef struct
309*53ee8cc1Swenshuai.xi {
310*53ee8cc1Swenshuai.xi     MS_U32 u32InitSysTimeBase[HVD_MAX_STREAMS];
311*53ee8cc1Swenshuai.xi     MS_BOOL bHVDIsInited[HVD_MAX_STREAMS];
312*53ee8cc1Swenshuai.xi     MS_BOOL bHVDIsIniting[HVD_MAX_STREAMS];
313*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl gHVDCtrl_EX[HVD_MAX_STREAMS];
314*53ee8cc1Swenshuai.xi     MS_BOOL bCMAUsed;
315*53ee8cc1Swenshuai.xi #if defined(SUPPORT_CMA)
316*53ee8cc1Swenshuai.xi     struct CMA_Pool_Init_Param cmaInitParam[2]; // support two MIU
317*53ee8cc1Swenshuai.xi     struct CMA_Pool_Free_Param cmaFreeParam[2][HVD_MAX_STREAMS];
318*53ee8cc1Swenshuai.xi     MS_BOOL bCMATwoMIU[HVD_MAX_STREAMS];
319*53ee8cc1Swenshuai.xi #endif
320*53ee8cc1Swenshuai.xi     MS_BOOL bVPUIsSecureMode;
321*53ee8cc1Swenshuai.xi     //pre_set
322*53ee8cc1Swenshuai.xi     HVD_Pre_Ctrl gHVDPreCtrl[HVD_MAX_STREAMS];
323*53ee8cc1Swenshuai.xi #ifdef VDEC3
324*53ee8cc1Swenshuai.xi     MS_BOOL bFWdecideFB;
325*53ee8cc1Swenshuai.xi #endif
326*53ee8cc1Swenshuai.xi } HVD_Drv_CTX;
327*53ee8cc1Swenshuai.xi 
328*53ee8cc1Swenshuai.xi //global variables
329*53ee8cc1Swenshuai.xi HVD_Drv_CTX* pHVDDrvContext = NULL;
330*53ee8cc1Swenshuai.xi HVD_Drv_CTX gHVDDrvContext;
331*53ee8cc1Swenshuai.xi MSIF_Version _drv_hvd_version =
332*53ee8cc1Swenshuai.xi {
333*53ee8cc1Swenshuai.xi     .DDI = {HVD_DRV_VERSION,},
334*53ee8cc1Swenshuai.xi };
335*53ee8cc1Swenshuai.xi HVD_EX_DrvInfo DrvInfo;
336*53ee8cc1Swenshuai.xi 
337*53ee8cc1Swenshuai.xi 
338*53ee8cc1Swenshuai.xi MS_BOOL bHVDIsIsrAttached      = FALSE;  //check HVD isr already attached, avoid HVD+HVD re-attached
339*53ee8cc1Swenshuai.xi MS_BOOL bEVDIsIsrAttached      = FALSE;  //check EVD isr already attached, avoid EVD+EVD re-attached
340*53ee8cc1Swenshuai.xi MS_BOOL bEVDLITEIsIsrAttached  = FALSE;  //check EVDLITE isr already attached, avoid EVDLITE+EVDLITE re-attached
341*53ee8cc1Swenshuai.xi MS_BOOL bHVDDisableISRFlag     = TRUE;
342*53ee8cc1Swenshuai.xi MS_BOOL bEVDDisableISRFlag     = TRUE;
343*53ee8cc1Swenshuai.xi MS_BOOL bEVDLITEDisableISRFlag = TRUE;
344*53ee8cc1Swenshuai.xi 
345*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
346*53ee8cc1Swenshuai.xi //  Debug Functions
347*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
348*53ee8cc1Swenshuai.xi 
349*53ee8cc1Swenshuai.xi 
350*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
351*53ee8cc1Swenshuai.xi //  Local Functions
352*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_HVD_MapRetEx(HVD_Return eHvd_Ret)353*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_MapRetEx(HVD_Return eHvd_Ret)
354*53ee8cc1Swenshuai.xi {
355*53ee8cc1Swenshuai.xi     HVD_EX_Result eRes = E_HVD_EX_FAIL;
356*53ee8cc1Swenshuai.xi     switch(eHvd_Ret)
357*53ee8cc1Swenshuai.xi     {
358*53ee8cc1Swenshuai.xi         case E_HVD_RETURN_FAIL              : eRes = E_HVD_EX_FAIL;break;
359*53ee8cc1Swenshuai.xi         case E_HVD_RETURN_SUCCESS           : eRes = E_HVD_EX_OK;break;
360*53ee8cc1Swenshuai.xi         case E_HVD_RETURN_INVALID_PARAMETER : eRes = E_HVD_EX_RET_INVALID_PARAMETER;break;
361*53ee8cc1Swenshuai.xi         case E_HVD_RETURN_ILLEGAL_ACCESS    : eRes = E_HVD_EX_RET_ILLEGAL_ACCESS;break;
362*53ee8cc1Swenshuai.xi         case E_HVD_RETURN_HARDWARE_BREAKDOWN: eRes = E_HVD_EX_RET_HARDWARE_BREAKDOWN;break;
363*53ee8cc1Swenshuai.xi         case E_HVD_RETURN_OUTOF_MEMORY      : eRes = E_HVD_EX_RET_OUTOF_MEMORY;break;
364*53ee8cc1Swenshuai.xi         case E_HVD_RETURN_UNSUPPORTED       : eRes = E_HVD_EX_RET_UNSUPPORTED;break;
365*53ee8cc1Swenshuai.xi         case E_HVD_RETURN_TIMEOUT           : eRes = E_HVD_EX_RET_TIMEOUT;break;
366*53ee8cc1Swenshuai.xi         case E_HVD_RETURN_NOTREADY          : eRes = E_HVD_EX_RET_NOTREADY;break;
367*53ee8cc1Swenshuai.xi         case E_HVD_RETURN_MEMORY_OVERWIRTE  : eRes = E_HVD_EX_RET_MEMORY_OVERWIRTE;break;
368*53ee8cc1Swenshuai.xi         case E_HVD_RETURN_ES_FULL           : eRes = E_HVD_EX_RET_QUEUE_FULL;break;
369*53ee8cc1Swenshuai.xi         case E_HVD_RETURN_RE_INIT           : eRes = E_HVD_EX_RET_RE_INIT;break;
370*53ee8cc1Swenshuai.xi         case E_HVD_RETURN_NOT_RUNNING       : eRes = E_HVD_EX_RET_NOT_RUNNING;break;
371*53ee8cc1Swenshuai.xi         default: break;
372*53ee8cc1Swenshuai.xi     }
373*53ee8cc1Swenshuai.xi     return eRes;
374*53ee8cc1Swenshuai.xi }
375*53ee8cc1Swenshuai.xi 
_HVD_EX_Context_Init(void)376*53ee8cc1Swenshuai.xi static void _HVD_EX_Context_Init(void)
377*53ee8cc1Swenshuai.xi {
378*53ee8cc1Swenshuai.xi     return;
379*53ee8cc1Swenshuai.xi }
380*53ee8cc1Swenshuai.xi 
_HVD_EX_SetShareInfoAddr(MS_U32 u32Id)381*53ee8cc1Swenshuai.xi static void _HVD_EX_SetShareInfoAddr(MS_U32 u32Id)
382*53ee8cc1Swenshuai.xi {
383*53ee8cc1Swenshuai.xi     MS_U32 u32ShmAddr = HAL_VPU_EX_GetSHMAddr();
384*53ee8cc1Swenshuai.xi 
385*53ee8cc1Swenshuai.xi     HAL_VPU_EX_SetShareInfoAddr(u32Id, u32ShmAddr);
386*53ee8cc1Swenshuai.xi 
387*53ee8cc1Swenshuai.xi     return;
388*53ee8cc1Swenshuai.xi }
389*53ee8cc1Swenshuai.xi 
_HVD_EX_InitVariables(MS_U32 u32Id,HVD_EX_MemCfg * pStMemCfg,HVD_Init_Params * pStInitParams)390*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_InitVariables(MS_U32 u32Id, HVD_EX_MemCfg *pStMemCfg, HVD_Init_Params *pStInitParams)
391*53ee8cc1Swenshuai.xi {
392*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
393*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
394*53ee8cc1Swenshuai.xi 
395*53ee8cc1Swenshuai.xi     memset((void *) pCtrl, 0, sizeof(HVD_EX_Drv_Ctrl));
396*53ee8cc1Swenshuai.xi     pCtrl->bFrmRateSupported = TRUE;
397*53ee8cc1Swenshuai.xi 
398*53ee8cc1Swenshuai.xi     // PreSetControl
399*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetPreCtrlVariables(u32Id,(MS_VIRT)(&pHVDDrvContext->gHVDPreCtrl[u8DrvId]));
400*53ee8cc1Swenshuai.xi 
401*53ee8cc1Swenshuai.xi     if (sizeof(HVD_Init_Params) == sizeof(HVD_EX_InitSettings))
402*53ee8cc1Swenshuai.xi     {
403*53ee8cc1Swenshuai.xi         HVD_memcpy((void *) &pCtrl->InitParams, pStInitParams, sizeof(HVD_Init_Params));
404*53ee8cc1Swenshuai.xi     }
405*53ee8cc1Swenshuai.xi     else
406*53ee8cc1Swenshuai.xi     {
407*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("HVD struct define is diff: HVD_Init_Params(%u) vs HVD_Init_Settings(%u)\n",
408*53ee8cc1Swenshuai.xi                     (MS_U32) sizeof(HVD_Init_Params), (MS_U32) sizeof(HVD_EX_InitSettings));
409*53ee8cc1Swenshuai.xi         return E_HVD_EX_FAIL;
410*53ee8cc1Swenshuai.xi     }
411*53ee8cc1Swenshuai.xi 
412*53ee8cc1Swenshuai.xi     // fill memory
413*53ee8cc1Swenshuai.xi     if (pStMemCfg->u32MIU1BaseAddr == 0)
414*53ee8cc1Swenshuai.xi     {
415*53ee8cc1Swenshuai.xi     // Get physical address from MIU selection= E_CHIP_MIU_2 and offset=0x10000000
416*53ee8cc1Swenshuai.xi         _miu_offset_to_phy(E_CHIP_MIU_1, 0, pCtrl->MemMap.u32MIU1BaseAddr);
417*53ee8cc1Swenshuai.xi         _miu_offset_to_phy(E_CHIP_MIU_2, 0, pCtrl->MemMap.u32MIU2BaseAddr);
418*53ee8cc1Swenshuai.xi 
419*53ee8cc1Swenshuai.xi     }
420*53ee8cc1Swenshuai.xi     else
421*53ee8cc1Swenshuai.xi     {
422*53ee8cc1Swenshuai.xi         pCtrl->MemMap.u32MIU1BaseAddr = pStMemCfg->u32MIU1BaseAddr; /// TODO : pStMemCfg need member u32MIU2BaseAddr
423*53ee8cc1Swenshuai.xi     }
424*53ee8cc1Swenshuai.xi 
425*53ee8cc1Swenshuai.xi     pCtrl->MemMap.eFWSourceType = (HVD_FWInputSourceType) pStMemCfg->eFWSourceType;
426*53ee8cc1Swenshuai.xi     pCtrl->MemMap.u32FWBinaryVAddr = pStMemCfg->u32FWBinaryVAddr;
427*53ee8cc1Swenshuai.xi     pCtrl->MemMap.u32FWBinaryAddr = (MS_U32) pStMemCfg->u32FWBinaryAddr;
428*53ee8cc1Swenshuai.xi     pCtrl->MemMap.u32FWBinarySize = pStMemCfg->u32FWBinarySize;
429*53ee8cc1Swenshuai.xi     pCtrl->MemMap.u32VLCBinaryVAddr = pStMemCfg->u32VLCBinaryVAddr;
430*53ee8cc1Swenshuai.xi     pCtrl->MemMap.u32VLCBinaryAddr = (MS_U32) pStMemCfg->u32VLCBinaryAddr;
431*53ee8cc1Swenshuai.xi     pCtrl->MemMap.u32VLCBinarySize = pStMemCfg->u32VLCBinarySize;
432*53ee8cc1Swenshuai.xi     pCtrl->MemMap.u32CodeBufVAddr = pStMemCfg->u32CodeBufVAddr;
433*53ee8cc1Swenshuai.xi     pCtrl->MemMap.u32CodeBufAddr = (MS_U32) pStMemCfg->u32CodeBufAddr;
434*53ee8cc1Swenshuai.xi     pCtrl->MemMap.u32CodeBufSize = pStMemCfg->u32CodeBufSize;
435*53ee8cc1Swenshuai.xi     pCtrl->MemMap.u32FrameBufVAddr = pStMemCfg->u32FrameBufVAddr;
436*53ee8cc1Swenshuai.xi     pCtrl->MemMap.u32FrameBufAddr = (MS_U32) pStMemCfg->u32FrameBufAddr;
437*53ee8cc1Swenshuai.xi     pCtrl->MemMap.u32FrameBufSize = pStMemCfg->u32FrameBufSize;
438*53ee8cc1Swenshuai.xi #ifdef VDEC3
439*53ee8cc1Swenshuai.xi     pCtrl->MemMap.u32TotalBitstreamBufAddr = pStMemCfg->u32TotalBitstreamBufAddr;
440*53ee8cc1Swenshuai.xi     pCtrl->MemMap.u32TotalBitstreamBufSize = pStMemCfg->u32TotalBitstreamBufSize;
441*53ee8cc1Swenshuai.xi #endif
442*53ee8cc1Swenshuai.xi 
443*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
444*53ee8cc1Swenshuai.xi     if (((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_MVC) &&
445*53ee8cc1Swenshuai.xi         ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_DUAL_ES_MASK) == HVD_INIT_DUAL_ES_ENABLE))
446*53ee8cc1Swenshuai.xi     {
447*53ee8cc1Swenshuai.xi         HVD_EX_Drv_Ctrl *pDrvCtrl_sub = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId+1]);
448*53ee8cc1Swenshuai.xi         memset((void *) pDrvCtrl_sub, 0, sizeof(HVD_EX_Drv_Ctrl));
449*53ee8cc1Swenshuai.xi 
450*53ee8cc1Swenshuai.xi         /// Copy to sub view ctrl
451*53ee8cc1Swenshuai.xi         HVD_memcpy((void *) &pDrvCtrl_sub->InitParams, pStInitParams, sizeof(HVD_Init_Params));
452*53ee8cc1Swenshuai.xi 
453*53ee8cc1Swenshuai.xi         // fill memory
454*53ee8cc1Swenshuai.xi         if (pStMemCfg->u32MIU1BaseAddr == 0)
455*53ee8cc1Swenshuai.xi         {
456*53ee8cc1Swenshuai.xi             _miu_offset_to_phy(E_CHIP_MIU_1, 0, pDrvCtrl_sub->MemMap.u32MIU1BaseAddr);
457*53ee8cc1Swenshuai.xi             _miu_offset_to_phy(E_CHIP_MIU_2, 0, pDrvCtrl_sub->MemMap.u32MIU2BaseAddr);
458*53ee8cc1Swenshuai.xi         }
459*53ee8cc1Swenshuai.xi         else
460*53ee8cc1Swenshuai.xi         {
461*53ee8cc1Swenshuai.xi             pDrvCtrl_sub->MemMap.u32MIU1BaseAddr = pStMemCfg->u32MIU1BaseAddr; /// TODO : pStMemCfg need member u32MIU2BaseAddr
462*53ee8cc1Swenshuai.xi         }
463*53ee8cc1Swenshuai.xi 
464*53ee8cc1Swenshuai.xi         pCtrl->MemMap.u32BitstreamBufVAddr= pStMemCfg->u32BitstreamBufVAddr;
465*53ee8cc1Swenshuai.xi         pCtrl->MemMap.u32BitstreamBufAddr = (MS_PHY) pStMemCfg->u32BitstreamBufAddr ;
466*53ee8cc1Swenshuai.xi         #if 1
467*53ee8cc1Swenshuai.xi         pCtrl->MemMap.u32BitstreamBufSize = pStMemCfg->u32BitstreamBufSize/2 ;
468*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->MemMap.u32BitstreamBufVAddr = pStMemCfg->u32BitstreamBufVAddr + pStMemCfg->u32BitstreamBufSize/2;
469*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->MemMap.u32BitstreamBufAddr  = (MS_PHY) pStMemCfg->u32BitstreamBufAddr + pStMemCfg->u32BitstreamBufSize/2;
470*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->MemMap.u32BitstreamBufSize  = pStMemCfg->u32BitstreamBufSize/2 ;
471*53ee8cc1Swenshuai.xi         #else
472*53ee8cc1Swenshuai.xi         pCtrl->MemMap.u32BitstreamBufSize = (pStMemCfg->u32BitstreamBufSize*57/128) ;
473*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->MemMap.u32BitstreamBufVAddr = pStMemCfg->u32BitstreamBufVAddr + (pStMemCfg->u32BitstreamBufSize*57/128);
474*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->MemMap.u32BitstreamBufAddr  = (MS_PHY) pStMemCfg->u32BitstreamBufAddr + (pStMemCfg->u32BitstreamBufSize*57/128);
475*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->MemMap.u32BitstreamBufSize  = (pStMemCfg->u32BitstreamBufSize*71/128) ;
476*53ee8cc1Swenshuai.xi         #endif
477*53ee8cc1Swenshuai.xi 
478*53ee8cc1Swenshuai.xi         pCtrl->MemMap.u32DrvProcessBufVAddr = pDrvCtrl_sub->MemMap.u32DrvProcessBufVAddr = pStMemCfg->u32DrvProcessBufVAddr;
479*53ee8cc1Swenshuai.xi         pCtrl->MemMap.u32DrvProcessBufAddr  = pDrvCtrl_sub->MemMap.u32DrvProcessBufAddr  = (MS_PHY) pStMemCfg->u32DrvProcessBufAddr;
480*53ee8cc1Swenshuai.xi         pCtrl->MemMap.u32DrvProcessBufSize  = pDrvCtrl_sub->MemMap.u32DrvProcessBufSize  = pStMemCfg->u32DrvProcessBufSize;
481*53ee8cc1Swenshuai.xi 
482*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->MemMap.u32CodeBufVAddr = pStMemCfg->u32CodeBufVAddr;
483*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->MemMap.u32CodeBufAddr = (MS_PHY) pStMemCfg->u32CodeBufAddr;
484*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->MemMap.u32CodeBufSize = pStMemCfg->u32CodeBufSize;
485*53ee8cc1Swenshuai.xi 
486*53ee8cc1Swenshuai.xi         HVD_EX_MSG_INF("[MVC] Bitstream buffer: 1st = [0x%lx, 0x%lx, 0x%lx], 2nd = [0x%lx, 0x%lx, 0x%lx].\n",
487*53ee8cc1Swenshuai.xi         (unsigned long) pCtrl->MemMap.u32BitstreamBufVAddr,
488*53ee8cc1Swenshuai.xi         (unsigned long)pCtrl->MemMap.u32BitstreamBufAddr,
489*53ee8cc1Swenshuai.xi         (unsigned long)pCtrl->MemMap.u32BitstreamBufSize,
490*53ee8cc1Swenshuai.xi         (unsigned long) pDrvCtrl_sub->MemMap.u32BitstreamBufVAddr,
491*53ee8cc1Swenshuai.xi         (unsigned long)pDrvCtrl_sub->MemMap.u32BitstreamBufAddr,
492*53ee8cc1Swenshuai.xi         (unsigned long)pDrvCtrl_sub->MemMap.u32BitstreamBufSize);
493*53ee8cc1Swenshuai.xi     }
494*53ee8cc1Swenshuai.xi     else
495*53ee8cc1Swenshuai.xi #endif
496*53ee8cc1Swenshuai.xi     {
497*53ee8cc1Swenshuai.xi         pCtrl->MemMap.u32BitstreamBufVAddr = pStMemCfg->u32BitstreamBufVAddr;
498*53ee8cc1Swenshuai.xi         pCtrl->MemMap.u32BitstreamBufAddr = (MS_U32) pStMemCfg->u32BitstreamBufAddr;
499*53ee8cc1Swenshuai.xi         pCtrl->MemMap.u32BitstreamBufSize = pStMemCfg->u32BitstreamBufSize;
500*53ee8cc1Swenshuai.xi         pCtrl->MemMap.u32DrvProcessBufVAddr = pStMemCfg->u32DrvProcessBufVAddr;
501*53ee8cc1Swenshuai.xi         pCtrl->MemMap.u32DrvProcessBufAddr = (MS_U32) pStMemCfg->u32DrvProcessBufAddr;
502*53ee8cc1Swenshuai.xi         pCtrl->MemMap.u32DrvProcessBufSize = pStMemCfg->u32DrvProcessBufSize;
503*53ee8cc1Swenshuai.xi     }
504*53ee8cc1Swenshuai.xi 
505*53ee8cc1Swenshuai.xi     HVD_EX_MSG_INF("HVD mmap: MIU1base:0x%lx, MIU2base:0x%lx,FW(type:%d addr=0x%lx size=0x%x), VLC(addr=0x%lx size=0x%x), Code(addr=0x%lx size=0x%x), FB(addr=0x%lx size=0x%x), Bit(addr=0x%lx size=0x%x), Drv(addr=0x%lx size=0x%x)\n",
506*53ee8cc1Swenshuai.xi          (unsigned long)pCtrl->MemMap.u32MIU1BaseAddr,
507*53ee8cc1Swenshuai.xi          (unsigned long)pCtrl->MemMap.u32MIU2BaseAddr,
508*53ee8cc1Swenshuai.xi          pCtrl->MemMap.eFWSourceType, (unsigned long)pCtrl->MemMap.u32FWBinaryAddr, pCtrl->MemMap.u32FWBinarySize,
509*53ee8cc1Swenshuai.xi          (unsigned long)pCtrl->MemMap.u32VLCBinaryAddr, pCtrl->MemMap.u32VLCBinarySize,
510*53ee8cc1Swenshuai.xi          (unsigned long)pCtrl->MemMap.u32CodeBufAddr, pCtrl->MemMap.u32CodeBufSize,
511*53ee8cc1Swenshuai.xi          (unsigned long)pCtrl->MemMap.u32FrameBufAddr, pCtrl->MemMap.u32FrameBufSize,
512*53ee8cc1Swenshuai.xi          (unsigned long)pCtrl->MemMap.u32BitstreamBufAddr, pCtrl->MemMap.u32BitstreamBufSize,
513*53ee8cc1Swenshuai.xi          (unsigned long)pCtrl->MemMap.u32DrvProcessBufAddr, pCtrl->MemMap.u32DrvProcessBufSize);
514*53ee8cc1Swenshuai.xi 
515*53ee8cc1Swenshuai.xi     pCtrl->InitParams.u16DecoderClock = HAL_HVD_EX_GetCorretClock(pStInitParams->u16DecoderClock);
516*53ee8cc1Swenshuai.xi     pCtrl->InitParams.u16ChipECONum = (MS_U16)MDrv_SYS_GetChipRev();
517*53ee8cc1Swenshuai.xi 
518*53ee8cc1Swenshuai.xi 
519*53ee8cc1Swenshuai.xi     HVD_EX_MSG_INF("[VDEC]pCtrl->InitParams.u16ChipECONum : %d \n ", pCtrl->InitParams.u16ChipECONum);
520*53ee8cc1Swenshuai.xi 
521*53ee8cc1Swenshuai.xi     MS_U32 i;
522*53ee8cc1Swenshuai.xi     pCtrl->CloseCaptionInfo.u8ParsingStatus = 0xff;
523*53ee8cc1Swenshuai.xi     pCtrl->CloseCaptionInfo.u8BufMiuSel[0] = pCtrl->CloseCaptionInfo.u8BufMiuSel[1] = E_CHIP_MIU_0;
524*53ee8cc1Swenshuai.xi     pCtrl->CloseCaptionInfo.b708Enable = FALSE;
525*53ee8cc1Swenshuai.xi     pCtrl->CloseCaptionInfo.u32FWUsrDataRIdx = pCtrl->CloseCaptionInfo.u32FWUsrDataWIdx = 0;
526*53ee8cc1Swenshuai.xi     pCtrl->CloseCaptionInfo.u32PktLen708 = 0;
527*53ee8cc1Swenshuai.xi     pCtrl->CloseCaptionInfo.u32PktHdrAddr708 = 0;
528*53ee8cc1Swenshuai.xi 
529*53ee8cc1Swenshuai.xi 
530*53ee8cc1Swenshuai.xi     for (i=0;i<2;i++)
531*53ee8cc1Swenshuai.xi     {
532*53ee8cc1Swenshuai.xi         pCtrl->CloseCaptionInfo.u32RingBufStartPAddr[i] = 0;
533*53ee8cc1Swenshuai.xi         pCtrl->CloseCaptionInfo.u32RingBufLen[i] = 0;
534*53ee8cc1Swenshuai.xi         pCtrl->CloseCaptionInfo.u32RingBufVacancy[i] = 0;
535*53ee8cc1Swenshuai.xi         pCtrl->CloseCaptionInfo.u32RingBufRPAddr[i] = 0;
536*53ee8cc1Swenshuai.xi         pCtrl->CloseCaptionInfo.u32RingBufWPAddr[i] = 0;
537*53ee8cc1Swenshuai.xi         pCtrl->CloseCaptionInfo.bOverFlow[i] = FALSE;
538*53ee8cc1Swenshuai.xi     }
539*53ee8cc1Swenshuai.xi 
540*53ee8cc1Swenshuai.xi     pCtrl->CloseCaptionInfo.b608InfoEnhance = FALSE;
541*53ee8cc1Swenshuai.xi 
542*53ee8cc1Swenshuai.xi #if HVD_ENABLE_STOP_ACCESS_OVER_256
543*53ee8cc1Swenshuai.xi     pCtrl->bCannotAccessMIU256 = TRUE;
544*53ee8cc1Swenshuai.xi #endif
545*53ee8cc1Swenshuai.xi 
546*53ee8cc1Swenshuai.xi     pCtrl->bAutoRmLastZeroByte = TRUE;
547*53ee8cc1Swenshuai.xi     pCtrl->u32CmdTimeout = HVD_FW_CMD_TIMEOUT_DEFAULT;
548*53ee8cc1Swenshuai.xi 
549*53ee8cc1Swenshuai.xi     if (pStInitParams->u8TurboInit & E_HVD_EX_TURBOINIT_FW_RELOAD)
550*53ee8cc1Swenshuai.xi     {
551*53ee8cc1Swenshuai.xi         pCtrl->bTurboFWMode = TRUE;
552*53ee8cc1Swenshuai.xi     }
553*53ee8cc1Swenshuai.xi 
554*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetMiuBurstLevel(pCtrl, E_HVD_BURST_CNT_DISABLE);
555*53ee8cc1Swenshuai.xi 
556*53ee8cc1Swenshuai.xi     pCtrl->u32FlushRstPtr = 0;
557*53ee8cc1Swenshuai.xi 
558*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
559*53ee8cc1Swenshuai.xi }
560*53ee8cc1Swenshuai.xi 
_HVD_EX_Check_Cmd(MS_U32 u32Id,HVD_Check_Cmd eCmd)561*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_Check_Cmd(MS_U32 u32Id, HVD_Check_Cmd eCmd)
562*53ee8cc1Swenshuai.xi {
563*53ee8cc1Swenshuai.xi     MS_U32 u32Tmp0 = 0;
564*53ee8cc1Swenshuai.xi     MS_U32 u32Tmp1 = 0;
565*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
566*53ee8cc1Swenshuai.xi 
567*53ee8cc1Swenshuai.xi     switch (eCmd)
568*53ee8cc1Swenshuai.xi     {
569*53ee8cc1Swenshuai.xi         case E_HVD_CHECK_CMD_INIT:
570*53ee8cc1Swenshuai.xi         {
571*53ee8cc1Swenshuai.xi             if (!(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8TurboInit & E_HVD_EX_TURBOINIT_CHECK))
572*53ee8cc1Swenshuai.xi             {
573*53ee8cc1Swenshuai.xi                 // Check mode
574*53ee8cc1Swenshuai.xi                 u32Tmp0 = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK;
575*53ee8cc1Swenshuai.xi 
576*53ee8cc1Swenshuai.xi                 if (!MDrv_HVD_EX_GetCaps((HVD_EX_Codec) u32Tmp0))
577*53ee8cc1Swenshuai.xi                 {
578*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("Init: HW not support type:%d\n", eCmd);
579*53ee8cc1Swenshuai.xi                     return E_HVD_EX_RET_UNSUPPORTED;
580*53ee8cc1Swenshuai.xi                 }
581*53ee8cc1Swenshuai.xi 
582*53ee8cc1Swenshuai.xi                 u32Tmp0 = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK;
583*53ee8cc1Swenshuai.xi 
584*53ee8cc1Swenshuai.xi                 if (u32Tmp0 == HVD_INIT_MAIN_LIVE_STREAM)
585*53ee8cc1Swenshuai.xi                 {
586*53ee8cc1Swenshuai.xi                     if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_INPUT_MASK) == HVD_INIT_INPUT_DRV)
587*53ee8cc1Swenshuai.xi                     {
588*53ee8cc1Swenshuai.xi                         HVD_EX_MSG_ERR("Init: Live stream mode can not use Drv input\n");
589*53ee8cc1Swenshuai.xi                         return E_HVD_EX_RET_INVALID_PARAMETER;
590*53ee8cc1Swenshuai.xi                     }
591*53ee8cc1Swenshuai.xi                     if (!(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & (HVD_INIT_UTOPIA_ENVI | HVD_INIT_DBG_FW)))
592*53ee8cc1Swenshuai.xi                     {
593*53ee8cc1Swenshuai.xi                         // need not to check this under debug mode
594*53ee8cc1Swenshuai.xi                         if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_START_CODE_MASK) ==
595*53ee8cc1Swenshuai.xi                             HVD_INIT_START_CODE_REMOVED)
596*53ee8cc1Swenshuai.xi                         {
597*53ee8cc1Swenshuai.xi                             HVD_EX_MSG_ERR("Init: Live stream mode must have start code\n");
598*53ee8cc1Swenshuai.xi                             return E_HVD_EX_RET_INVALID_PARAMETER;
599*53ee8cc1Swenshuai.xi                         }
600*53ee8cc1Swenshuai.xi                         if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_NON)
601*53ee8cc1Swenshuai.xi                         {
602*53ee8cc1Swenshuai.xi                             HVD_EX_MSG_ERR("Init: Live stream mode can not use none ATS sync mode\n");
603*53ee8cc1Swenshuai.xi                             return E_HVD_EX_RET_INVALID_PARAMETER;
604*53ee8cc1Swenshuai.xi                         }
605*53ee8cc1Swenshuai.xi                     }
606*53ee8cc1Swenshuai.xi                 }
607*53ee8cc1Swenshuai.xi                 else if ((u32Tmp0 == HVD_INIT_MAIN_FILE_RAW) || (u32Tmp0 == HVD_INIT_MAIN_FILE_TS))
608*53ee8cc1Swenshuai.xi                 {
609*53ee8cc1Swenshuai.xi                     if (!(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & (HVD_INIT_UTOPIA_ENVI | HVD_INIT_DBG_FW)))
610*53ee8cc1Swenshuai.xi                     {
611*53ee8cc1Swenshuai.xi                         if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_DTS)
612*53ee8cc1Swenshuai.xi                             && (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_STS)
613*53ee8cc1Swenshuai.xi                             && (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_PTS)
614*53ee8cc1Swenshuai.xi                             && (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_NON))
615*53ee8cc1Swenshuai.xi                         {
616*53ee8cc1Swenshuai.xi                             HVD_EX_MSG_ERR("Init: sync mode is not set. use default value:%d\n",
617*53ee8cc1Swenshuai.xi                                         (MS_U16) E_HVD_SYNC_TBL_TYPE_PTS);
618*53ee8cc1Swenshuai.xi                             pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8SyncType = E_HVD_SYNC_TBL_TYPE_PTS;
619*53ee8cc1Swenshuai.xi                         }
620*53ee8cc1Swenshuai.xi                     }
621*53ee8cc1Swenshuai.xi                 }
622*53ee8cc1Swenshuai.xi                 else if ((u32Tmp0 != HVD_INIT_MAIN_FILE_RAW) && (u32Tmp0 != HVD_INIT_MAIN_FILE_TS))
623*53ee8cc1Swenshuai.xi                 {
624*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("Init: main type can not be recognized:%d\n", u32Tmp0);
625*53ee8cc1Swenshuai.xi                     return E_HVD_EX_RET_INVALID_PARAMETER;
626*53ee8cc1Swenshuai.xi                 }
627*53ee8cc1Swenshuai.xi 
628*53ee8cc1Swenshuai.xi                 // check memory map
629*53ee8cc1Swenshuai.xi                 if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU1BaseAddr == 0)
630*53ee8cc1Swenshuai.xi                 {
631*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("Init: MIU 1 Base addr should not be zero\n");
632*53ee8cc1Swenshuai.xi                     return E_HVD_EX_RET_INVALID_PARAMETER;
633*53ee8cc1Swenshuai.xi                 }
634*53ee8cc1Swenshuai.xi 
635*53ee8cc1Swenshuai.xi                 if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr & 0x7FF) != 0)
636*53ee8cc1Swenshuai.xi                 {
637*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("Init: Error HVD code address(0x%lx) must 2048 byte alignment\n",
638*53ee8cc1Swenshuai.xi                                 (unsigned long)pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr);
639*53ee8cc1Swenshuai.xi                     return E_HVD_EX_RET_INVALID_PARAMETER;
640*53ee8cc1Swenshuai.xi                 }
641*53ee8cc1Swenshuai.xi             }
642*53ee8cc1Swenshuai.xi 
643*53ee8cc1Swenshuai.xi             u32Tmp0 = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK;
644*53ee8cc1Swenshuai.xi             u32Tmp1 = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_INPUT_MASK;
645*53ee8cc1Swenshuai.xi 
646*53ee8cc1Swenshuai.xi             if (u32Tmp0 != HVD_INIT_MAIN_LIVE_STREAM)
647*53ee8cc1Swenshuai.xi             {
648*53ee8cc1Swenshuai.xi                 if (u32Tmp1 == HVD_INIT_INPUT_DRV)
649*53ee8cc1Swenshuai.xi                 {
650*53ee8cc1Swenshuai.xi                     // check if driver process buffer is in bitstream buffer.
651*53ee8cc1Swenshuai.xi                     MS_U32 tmpAddr = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufAddr;
652*53ee8cc1Swenshuai.xi 
653*53ee8cc1Swenshuai.xi                     if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufAddr == 0)
654*53ee8cc1Swenshuai.xi                     {
655*53ee8cc1Swenshuai.xi                         HVD_EX_MSG_ERR("Init: Drv process buffer address should not be zero\n");
656*53ee8cc1Swenshuai.xi                         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bNoDrvProccBuf = TRUE;
657*53ee8cc1Swenshuai.xi                         //return E_HVD_EX_RET_INVALID_PARAMETER;
658*53ee8cc1Swenshuai.xi                     }
659*53ee8cc1Swenshuai.xi 
660*53ee8cc1Swenshuai.xi                     if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufAddr > tmpAddr)
661*53ee8cc1Swenshuai.xi                         || (tmpAddr >
662*53ee8cc1Swenshuai.xi                             (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufAddr +
663*53ee8cc1Swenshuai.xi                              pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufSize)))
664*53ee8cc1Swenshuai.xi                     {
665*53ee8cc1Swenshuai.xi                         HVD_EX_MSG_ERR
666*53ee8cc1Swenshuai.xi                             ("Init: The driver process buffer shall be located in the bitstream buffer under file mode(TS or MP4) and Drv input.\n");
667*53ee8cc1Swenshuai.xi                         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bNoDrvProccBuf = TRUE;
668*53ee8cc1Swenshuai.xi                         //return E_HVD_EX_RET_INVALID_PARAMETER;
669*53ee8cc1Swenshuai.xi                     }
670*53ee8cc1Swenshuai.xi 
671*53ee8cc1Swenshuai.xi                     if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufSize
672*53ee8cc1Swenshuai.xi                         <
673*53ee8cc1Swenshuai.xi                         (HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) << 3) +
674*53ee8cc1Swenshuai.xi                          8))
675*53ee8cc1Swenshuai.xi                     {
676*53ee8cc1Swenshuai.xi                         HVD_EX_MSG_ERR
677*53ee8cc1Swenshuai.xi                             ("Init: File mode(TS or MP4) and Drv input must set the process buffer size and must be larger than %u Bytes:%d\n",
678*53ee8cc1Swenshuai.xi                              pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufSize,
679*53ee8cc1Swenshuai.xi                              (MS_U32) (HVD_BBU_ST_ADDR_IN_BITSTREAMBUF +
680*53ee8cc1Swenshuai.xi                                        (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) << 3) + 8));
681*53ee8cc1Swenshuai.xi                         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bNoDrvProccBuf = TRUE;
682*53ee8cc1Swenshuai.xi                         //return E_HVD_EX_RET_OUTOF_MEMORY;
683*53ee8cc1Swenshuai.xi                     }
684*53ee8cc1Swenshuai.xi 
685*53ee8cc1Swenshuai.xi                     if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufSize > 1)
686*53ee8cc1Swenshuai.xi                     {
687*53ee8cc1Swenshuai.xi                         tmpAddr =
688*53ee8cc1Swenshuai.xi                             pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufAddr +
689*53ee8cc1Swenshuai.xi                             pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufSize - 1;
690*53ee8cc1Swenshuai.xi                     }
691*53ee8cc1Swenshuai.xi                     else
692*53ee8cc1Swenshuai.xi                     {
693*53ee8cc1Swenshuai.xi                         tmpAddr = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufAddr;
694*53ee8cc1Swenshuai.xi                     }
695*53ee8cc1Swenshuai.xi 
696*53ee8cc1Swenshuai.xi                     if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufAddr > tmpAddr)
697*53ee8cc1Swenshuai.xi                         || (tmpAddr >
698*53ee8cc1Swenshuai.xi                             (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufAddr +
699*53ee8cc1Swenshuai.xi                              pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufSize)))
700*53ee8cc1Swenshuai.xi                     {
701*53ee8cc1Swenshuai.xi                         HVD_EX_MSG_ERR
702*53ee8cc1Swenshuai.xi                             ("Init: The driver process buffer shall be located in the bitstream buffer under file mode(TS or PS) and Drv input.\n");
703*53ee8cc1Swenshuai.xi                         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bNoDrvProccBuf = TRUE;
704*53ee8cc1Swenshuai.xi                         //return E_HVD_EX_RET_INVALID_PARAMETER;
705*53ee8cc1Swenshuai.xi                     }
706*53ee8cc1Swenshuai.xi                 }
707*53ee8cc1Swenshuai.xi                 else
708*53ee8cc1Swenshuai.xi                 {
709*53ee8cc1Swenshuai.xi                 // TODO: check if the TSP MIU sel is the same with the MIU lacation of process buffer.
710*53ee8cc1Swenshuai.xi                 }
711*53ee8cc1Swenshuai.xi             }
712*53ee8cc1Swenshuai.xi             break;
713*53ee8cc1Swenshuai.xi         }
714*53ee8cc1Swenshuai.xi         case E_HVD_CHECK_CMD_SEEK2PTS:
715*53ee8cc1Swenshuai.xi         case E_HVD_CHECK_CMD_TRIGGER_DISP:
716*53ee8cc1Swenshuai.xi         {
717*53ee8cc1Swenshuai.xi #if 0
718*53ee8cc1Swenshuai.xi             if (MDrv_HVD_EX_GetPlayMode(E_HVD_EX_GMODE_IS_SYNC_ON))
719*53ee8cc1Swenshuai.xi             {
720*53ee8cc1Swenshuai.xi                 HVD_EX_MSG_ERR("Cmd type:%d Sync Active: %lx\n", (MS_U16) eCmd,
721*53ee8cc1Swenshuai.xi                             (MS_S32) MDrv_HVD_EX_GetPlayMode(E_HVD_EX_GMODE_IS_SYNC_ON));
722*53ee8cc1Swenshuai.xi                 return E_HVD_EX_RET_ILLEGAL_ACCESS;
723*53ee8cc1Swenshuai.xi             }
724*53ee8cc1Swenshuai.xi #endif
725*53ee8cc1Swenshuai.xi             break;
726*53ee8cc1Swenshuai.xi         }
727*53ee8cc1Swenshuai.xi         default:
728*53ee8cc1Swenshuai.xi             return E_HVD_EX_OK;
729*53ee8cc1Swenshuai.xi     }
730*53ee8cc1Swenshuai.xi 
731*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
732*53ee8cc1Swenshuai.xi }
733*53ee8cc1Swenshuai.xi #ifdef VDEC3
_HVD_EX_InitRegCPU(MS_U32 u32Id,MS_BOOL bFWdecideFB)734*53ee8cc1Swenshuai.xi HVD_EX_Result _HVD_EX_InitRegCPU(MS_U32 u32Id, MS_BOOL bFWdecideFB)
735*53ee8cc1Swenshuai.xi #else
736*53ee8cc1Swenshuai.xi HVD_EX_Result _HVD_EX_InitRegCPU(MS_U32 u32Id)
737*53ee8cc1Swenshuai.xi #endif
738*53ee8cc1Swenshuai.xi {
739*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
740*53ee8cc1Swenshuai.xi 
741*53ee8cc1Swenshuai.xi     // check MIU select
742*53ee8cc1Swenshuai.xi     if (!(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8TurboInit & E_HVD_EX_TURBOINIT_CHECK))
743*53ee8cc1Swenshuai.xi     {
744*53ee8cc1Swenshuai.xi         HAL_HVD_EX_CheckMIUSel(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_UTOPIA_ENVI);
745*53ee8cc1Swenshuai.xi     }
746*53ee8cc1Swenshuai.xi #ifdef VDEC3
747*53ee8cc1Swenshuai.xi     return (HVD_EX_Result) HAL_HVD_EX_InitRegCPU(u32Id,bFWdecideFB);
748*53ee8cc1Swenshuai.xi #else
749*53ee8cc1Swenshuai.xi     return (HVD_EX_Result) HAL_HVD_EX_InitRegCPU(u32Id);
750*53ee8cc1Swenshuai.xi #endif
751*53ee8cc1Swenshuai.xi }
752*53ee8cc1Swenshuai.xi 
_HVD_EX_RstVariables(MS_U32 u32Id)753*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_RstVariables(MS_U32 u32Id)
754*53ee8cc1Swenshuai.xi {
755*53ee8cc1Swenshuai.xi     //MS_BOOL bBitMIU1 = FALSE;
756*53ee8cc1Swenshuai.xi     //MS_BOOL bCodeMIU1 = FALSE;
757*53ee8cc1Swenshuai.xi     MS_U8 u8BitMiuSel;
758*53ee8cc1Swenshuai.xi     MS_U32 u32BitStartOffset;
759*53ee8cc1Swenshuai.xi     MS_U8 u8CodeMiuSel;
760*53ee8cc1Swenshuai.xi     MS_U32 u32CodeStartOffset;
761*53ee8cc1Swenshuai.xi     MS_U8 u8FrmMiuSel;
762*53ee8cc1Swenshuai.xi     MS_U32 u32FrmStartOffset;
763*53ee8cc1Swenshuai.xi     MS_U8 u8DrvProccMiuSel;
764*53ee8cc1Swenshuai.xi     MS_U32 u32DrvProccStartOffset;
765*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
766*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
767*53ee8cc1Swenshuai.xi 
768*53ee8cc1Swenshuai.xi     // Init control flg
769*53ee8cc1Swenshuai.xi     pCtrl->u32CtrlMode = 0;
770*53ee8cc1Swenshuai.xi 
771*53ee8cc1Swenshuai.xi     #if 1
772*53ee8cc1Swenshuai.xi     _phy_to_miu_offset(u8CodeMiuSel, u32CodeStartOffset, pCtrl->MemMap.u32CodeBufAddr);
773*53ee8cc1Swenshuai.xi     pCtrl->u8CodeMiuSel = u8CodeMiuSel;
774*53ee8cc1Swenshuai.xi     _phy_to_miu_offset(u8BitMiuSel, u32BitStartOffset, pCtrl->MemMap.u32BitstreamBufAddr);
775*53ee8cc1Swenshuai.xi     pCtrl->u8ESMiuSel = u8BitMiuSel;
776*53ee8cc1Swenshuai.xi     _phy_to_miu_offset(u8FrmMiuSel, u32FrmStartOffset, pCtrl->MemMap.u32FrameBufAddr);
777*53ee8cc1Swenshuai.xi     pCtrl->u8FrmMiuSel = u8FrmMiuSel;
778*53ee8cc1Swenshuai.xi     pCtrl->u8Frm2MiuSel = u8FrmMiuSel;
779*53ee8cc1Swenshuai.xi     _phy_to_miu_offset(u8DrvProccMiuSel, u32DrvProccStartOffset, pCtrl->MemMap.u32DrvProcessBufAddr);
780*53ee8cc1Swenshuai.xi     pCtrl->u8DrvProccMiuSel = u8DrvProccMiuSel;
781*53ee8cc1Swenshuai.xi     #else
782*53ee8cc1Swenshuai.xi     if (pCtrl->MemMap.u32CodeBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
783*53ee8cc1Swenshuai.xi     {
784*53ee8cc1Swenshuai.xi         pCtrl->u32CtrlMode |= HVD_CTRL_CODE_MIU_1;
785*53ee8cc1Swenshuai.xi         bCodeMIU1 = TRUE;
786*53ee8cc1Swenshuai.xi     }
787*53ee8cc1Swenshuai.xi 
788*53ee8cc1Swenshuai.xi     if (pCtrl->MemMap.u32BitstreamBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
789*53ee8cc1Swenshuai.xi     {
790*53ee8cc1Swenshuai.xi         pCtrl->u32CtrlMode |= HVD_CTRL_ES_MIU_1;
791*53ee8cc1Swenshuai.xi         bBitMIU1 = TRUE;
792*53ee8cc1Swenshuai.xi     }
793*53ee8cc1Swenshuai.xi 
794*53ee8cc1Swenshuai.xi     if (pCtrl->MemMap.u32FrameBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
795*53ee8cc1Swenshuai.xi     {
796*53ee8cc1Swenshuai.xi         pCtrl->u32CtrlMode |= HVD_CTRL_FRM_MIU_1;
797*53ee8cc1Swenshuai.xi     }
798*53ee8cc1Swenshuai.xi 
799*53ee8cc1Swenshuai.xi     if (pCtrl->MemMap.u32DrvProcessBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
800*53ee8cc1Swenshuai.xi     {
801*53ee8cc1Swenshuai.xi         pCtrl->u32CtrlMode |= HVD_CTRL_DRVPROCC_MIU_1;
802*53ee8cc1Swenshuai.xi     }
803*53ee8cc1Swenshuai.xi     #endif
804*53ee8cc1Swenshuai.xi 
805*53ee8cc1Swenshuai.xi     if (!pCtrl->bNoDrvProccBuf)
806*53ee8cc1Swenshuai.xi     {
807*53ee8cc1Swenshuai.xi         // init nal table buffer start address.
808*53ee8cc1Swenshuai.xi         if ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
809*53ee8cc1Swenshuai.xi         {
810*53ee8cc1Swenshuai.xi             if (u8BitMiuSel != u8CodeMiuSel)
811*53ee8cc1Swenshuai.xi             {
812*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
813*53ee8cc1Swenshuai.xi                 if( ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_MVC) &&
814*53ee8cc1Swenshuai.xi                     ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_DUAL_ES_MASK) == HVD_INIT_DUAL_ES_ENABLE) &&
815*53ee8cc1Swenshuai.xi                     (pCtrl->MemMap.u32DrvProcessBufSize > (HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB)<<1 ) <<3) + 8) ))
816*53ee8cc1Swenshuai.xi                 {
817*53ee8cc1Swenshuai.xi                     pCtrl->u32BBUTblInBitstreamBufAddr = HVD_BBU_ST_ADDR_IN_BITSTREAMBUF;
818*53ee8cc1Swenshuai.xi                     if( (( pCtrl->u32BBUTblInBitstreamBufAddr + pCtrl->MemMap.u32DrvProcessBufAddr) % 8) != 0)
819*53ee8cc1Swenshuai.xi                     {
820*53ee8cc1Swenshuai.xi                         pCtrl->u32BBUTblInBitstreamBufAddr = pCtrl->u32BBUTblInBitstreamBufAddr + pCtrl->MemMap.u32DrvProcessBufAddr + 7;
821*53ee8cc1Swenshuai.xi                         pCtrl->u32BBUTblInBitstreamBufAddr -= (pCtrl->u32BBUTblInBitstreamBufAddr ) % 8;
822*53ee8cc1Swenshuai.xi                         pCtrl->u32BBUTblInBitstreamBufAddr -= pCtrl->MemMap.u32DrvProcessBufAddr;
823*53ee8cc1Swenshuai.xi                         HVD_EX_MSG_ERR("Nal table in bitstream buffer start address is not aligned. old:%lx new:%lx" , (unsigned long) HVD_BBU_ST_ADDR_IN_BITSTREAMBUF, (unsigned long) pCtrl->u32BBUTblInBitstreamBufAddr  );
824*53ee8cc1Swenshuai.xi                     }
825*53ee8cc1Swenshuai.xi 
826*53ee8cc1Swenshuai.xi                     /// Setting BBU for MVC dual bbu input
827*53ee8cc1Swenshuai.xi                     HVD_EX_Drv_Ctrl *pDrvCtrl_sub = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId+1]);
828*53ee8cc1Swenshuai.xi                     pDrvCtrl_sub->u32BBUTblInBitstreamBufAddr = HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) << 3); //// need to check
829*53ee8cc1Swenshuai.xi                     if( (( pDrvCtrl_sub->u32BBUTblInBitstreamBufAddr + pDrvCtrl_sub->MemMap.u32DrvProcessBufAddr) % 8) != 0)
830*53ee8cc1Swenshuai.xi                     {
831*53ee8cc1Swenshuai.xi                         pDrvCtrl_sub->u32BBUTblInBitstreamBufAddr = pDrvCtrl_sub->u32BBUTblInBitstreamBufAddr + pDrvCtrl_sub->MemMap.u32DrvProcessBufAddr + 7;
832*53ee8cc1Swenshuai.xi                         pDrvCtrl_sub->u32BBUTblInBitstreamBufAddr -= (pDrvCtrl_sub->u32BBUTblInBitstreamBufAddr ) % 8;
833*53ee8cc1Swenshuai.xi                         pDrvCtrl_sub->u32BBUTblInBitstreamBufAddr -= pDrvCtrl_sub->MemMap.u32DrvProcessBufAddr;
834*53ee8cc1Swenshuai.xi                         HVD_EX_MSG_ERR("[MVC]: Nal table in bitstream buffer start address is not aligned. old:%lx new:%lx" ,  (unsigned long) HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) << 3)  , (unsigned long) pCtrl->u32BBUTblInBitstreamBufAddr);
835*53ee8cc1Swenshuai.xi                     }
836*53ee8cc1Swenshuai.xi 
837*53ee8cc1Swenshuai.xi                 }
838*53ee8cc1Swenshuai.xi                 else
839*53ee8cc1Swenshuai.xi #endif
840*53ee8cc1Swenshuai.xi                 if (pCtrl->MemMap.u32DrvProcessBufSize >
841*53ee8cc1Swenshuai.xi                     (HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) + 8)))
842*53ee8cc1Swenshuai.xi                 {
843*53ee8cc1Swenshuai.xi                     pCtrl->u32BBUTblInBitstreamBufAddr = HVD_BBU_ST_ADDR_IN_BITSTREAMBUF;
844*53ee8cc1Swenshuai.xi 
845*53ee8cc1Swenshuai.xi                     if (((pCtrl->u32BBUTblInBitstreamBufAddr + pCtrl->MemMap.u32DrvProcessBufAddr) % 8) != 0)
846*53ee8cc1Swenshuai.xi                     {
847*53ee8cc1Swenshuai.xi                         pCtrl->u32BBUTblInBitstreamBufAddr =
848*53ee8cc1Swenshuai.xi                         pCtrl->u32BBUTblInBitstreamBufAddr + pCtrl->MemMap.u32DrvProcessBufAddr + 7;
849*53ee8cc1Swenshuai.xi                         pCtrl->u32BBUTblInBitstreamBufAddr -= (pCtrl->u32BBUTblInBitstreamBufAddr) % 8;
850*53ee8cc1Swenshuai.xi                         pCtrl->u32BBUTblInBitstreamBufAddr -= pCtrl->MemMap.u32DrvProcessBufAddr;
851*53ee8cc1Swenshuai.xi                         HVD_EX_MSG_ERR
852*53ee8cc1Swenshuai.xi                             ("Nal table in bitstream buffer start address is not aligned. old:%x new:%x",
853*53ee8cc1Swenshuai.xi                              (MS_U32) HVD_BBU_ST_ADDR_IN_BITSTREAMBUF, pCtrl->u32BBUTblInBitstreamBufAddr);
854*53ee8cc1Swenshuai.xi                     }
855*53ee8cc1Swenshuai.xi                 }
856*53ee8cc1Swenshuai.xi                 else
857*53ee8cc1Swenshuai.xi                 {
858*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR
859*53ee8cc1Swenshuai.xi                         ("Driver process buffer size is not enough for driver input path. input:%x required:%lx",
860*53ee8cc1Swenshuai.xi                          (MS_U32) pCtrl->MemMap.u32DrvProcessBufSize,
861*53ee8cc1Swenshuai.xi                          (unsigned long)(HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) << 3) +
862*53ee8cc1Swenshuai.xi                           8));
863*53ee8cc1Swenshuai.xi                     return E_HVD_EX_RET_OUTOF_MEMORY;
864*53ee8cc1Swenshuai.xi                 }
865*53ee8cc1Swenshuai.xi             }
866*53ee8cc1Swenshuai.xi         }
867*53ee8cc1Swenshuai.xi 
868*53ee8cc1Swenshuai.xi         // init AVI NULL packet pattern && RM flush pattern
869*53ee8cc1Swenshuai.xi         if ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
870*53ee8cc1Swenshuai.xi         {
871*53ee8cc1Swenshuai.xi             MS_U8 *pNULLPattern = NULL;
872*53ee8cc1Swenshuai.xi             pCtrl->u32NULLPacketAddr = pCtrl->MemMap.u32DrvProcessBufAddr;
873*53ee8cc1Swenshuai.xi             // TODO: use other non-cachable VA addr
874*53ee8cc1Swenshuai.xi             //Use shared memory instead of f/w code buffer.
875*53ee8cc1Swenshuai.xi             pNULLPattern = (MS_U8 *) HAL_HVD_EX_GetShmAddr(u32Id);
876*53ee8cc1Swenshuai.xi             if(pNULLPattern == NULL)
877*53ee8cc1Swenshuai.xi             {
878*53ee8cc1Swenshuai.xi                 HVD_EX_MSG_ERR("########## VDEC patch for Debug %s %d###########\n", __FUNCTION__, __LINE__);
879*53ee8cc1Swenshuai.xi                 return E_HVD_EX_FAIL;
880*53ee8cc1Swenshuai.xi             }
881*53ee8cc1Swenshuai.xi             memset((void *) pNULLPattern, 0, 12);
882*53ee8cc1Swenshuai.xi 
883*53ee8cc1Swenshuai.xi             switch ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
884*53ee8cc1Swenshuai.xi             {
885*53ee8cc1Swenshuai.xi                 case HVD_INIT_HW_AVC:
886*53ee8cc1Swenshuai.xi                 case HVD_INIT_HW_AVS:
887*53ee8cc1Swenshuai.xi                 case HVD_INIT_HW_MVC:
888*53ee8cc1Swenshuai.xi             #if SUPPORT_EVD
889*53ee8cc1Swenshuai.xi                 case HVD_INIT_HW_VP9: // MStar VP9 or G2 VP9
890*53ee8cc1Swenshuai.xi                 case HVD_INIT_HW_HEVC:
891*53ee8cc1Swenshuai.xi             #endif
892*53ee8cc1Swenshuai.xi                 {
893*53ee8cc1Swenshuai.xi                     if (pCtrl->InitParams.u32ModeFlag & HVD_INIT_START_CODE_MASK)
894*53ee8cc1Swenshuai.xi                     {
895*53ee8cc1Swenshuai.xi                         // start code removed
896*53ee8cc1Swenshuai.xi                         pCtrl->u32NULLPacketSize = 8;
897*53ee8cc1Swenshuai.xi 
898*53ee8cc1Swenshuai.xi                         if (pCtrl->MemMap.u32DrvProcessBufSize < pCtrl->u32NULLPacketSize)
899*53ee8cc1Swenshuai.xi                         {
900*53ee8cc1Swenshuai.xi                             return E_HVD_EX_RET_OUTOF_MEMORY;
901*53ee8cc1Swenshuai.xi                         }
902*53ee8cc1Swenshuai.xi 
903*53ee8cc1Swenshuai.xi                         memset((void *) pNULLPattern, 0xAA, pCtrl->u32NULLPacketSize);
904*53ee8cc1Swenshuai.xi                         pNULLPattern[4] = 0X55;
905*53ee8cc1Swenshuai.xi                     }
906*53ee8cc1Swenshuai.xi                     else            // start code remained
907*53ee8cc1Swenshuai.xi                     {
908*53ee8cc1Swenshuai.xi                         pCtrl->u32NULLPacketSize = 12;
909*53ee8cc1Swenshuai.xi 
910*53ee8cc1Swenshuai.xi                         if (pCtrl->MemMap.u32DrvProcessBufSize < pCtrl->u32NULLPacketSize)
911*53ee8cc1Swenshuai.xi                         {
912*53ee8cc1Swenshuai.xi                             return E_HVD_EX_RET_OUTOF_MEMORY;
913*53ee8cc1Swenshuai.xi                         }
914*53ee8cc1Swenshuai.xi 
915*53ee8cc1Swenshuai.xi                         memset((void *) pNULLPattern, 0xAA, pCtrl->u32NULLPacketSize);
916*53ee8cc1Swenshuai.xi 
917*53ee8cc1Swenshuai.xi                         pNULLPattern[0] = 0;
918*53ee8cc1Swenshuai.xi                         pNULLPattern[1] = 0;
919*53ee8cc1Swenshuai.xi                         pNULLPattern[2] = 1;
920*53ee8cc1Swenshuai.xi                         pNULLPattern[3] = 0xFF;
921*53ee8cc1Swenshuai.xi                         pNULLPattern[8] = 0X55;
922*53ee8cc1Swenshuai.xi                     }
923*53ee8cc1Swenshuai.xi 
924*53ee8cc1Swenshuai.xi                     //if (bBitMIU1 != bCodeMIU1)
925*53ee8cc1Swenshuai.xi                     if(u8BitMiuSel != u8CodeMiuSel)
926*53ee8cc1Swenshuai.xi                     {
927*53ee8cc1Swenshuai.xi #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
928*53ee8cc1Swenshuai.xi                         HAL_HVD_EX_FlushMemory();
929*53ee8cc1Swenshuai.xi                         HVD_dmacpy(pCtrl->MemMap.u32DrvProcessBufAddr, pCtrl->MemMap.u32CodeBufAddr,
930*53ee8cc1Swenshuai.xi                                    pCtrl->u32NULLPacketSize);
931*53ee8cc1Swenshuai.xi #else
932*53ee8cc1Swenshuai.xi                         HVD_memcpy((void *) (pCtrl->MemMap.u32DrvProcessBufVAddr), pNULLPattern,
933*53ee8cc1Swenshuai.xi                                    pCtrl->u32NULLPacketSize);
934*53ee8cc1Swenshuai.xi                         HAL_HVD_EX_FlushMemory();
935*53ee8cc1Swenshuai.xi #endif
936*53ee8cc1Swenshuai.xi                     }
937*53ee8cc1Swenshuai.xi                     else
938*53ee8cc1Swenshuai.xi                     {
939*53ee8cc1Swenshuai.xi                         HVD_memcpy((void *) (pCtrl->MemMap.u32DrvProcessBufVAddr), pNULLPattern,
940*53ee8cc1Swenshuai.xi                                    pCtrl->u32NULLPacketSize);
941*53ee8cc1Swenshuai.xi                         HAL_HVD_EX_FlushMemory();
942*53ee8cc1Swenshuai.xi                     }
943*53ee8cc1Swenshuai.xi 
944*53ee8cc1Swenshuai.xi                     break;
945*53ee8cc1Swenshuai.xi                 }
946*53ee8cc1Swenshuai.xi                 case HVD_INIT_HW_RM:
947*53ee8cc1Swenshuai.xi                 {
948*53ee8cc1Swenshuai.xi                     // RM has no NULL packet
949*53ee8cc1Swenshuai.xi                     pCtrl->u32NULLPacketSize = 0;
950*53ee8cc1Swenshuai.xi                     pCtrl->u32NULLPacketAddr = 0;
951*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
952*53ee8cc1Swenshuai.xi                     pCtrl->u32RV_FlushPacketAddr = pCtrl->MemMap.u32DrvProcessBufAddr;
953*53ee8cc1Swenshuai.xi                     pCtrl->u32RV_FlushPacketSize = 8;
954*53ee8cc1Swenshuai.xi 
955*53ee8cc1Swenshuai.xi                     if (pCtrl->MemMap.u32DrvProcessBufSize < pCtrl->u32RV_FlushPacketSize)
956*53ee8cc1Swenshuai.xi                     {
957*53ee8cc1Swenshuai.xi                         return E_HVD_EX_RET_OUTOF_MEMORY;
958*53ee8cc1Swenshuai.xi                     }
959*53ee8cc1Swenshuai.xi                     memset((void *) pNULLPattern, 0xFF, pCtrl->u32RV_FlushPacketSize);
960*53ee8cc1Swenshuai.xi                     {
961*53ee8cc1Swenshuai.xi #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
962*53ee8cc1Swenshuai.xi                         HAL_HVD_EX_FlushMemory();
963*53ee8cc1Swenshuai.xi                         HVD_dmacpy(pCtrl->MemMap.u32DrvProcessBufAddr, pCtrl->MemMap.u32CodeBufAddr,
964*53ee8cc1Swenshuai.xi                                    pCtrl->u32RV_FlushPacketSize);
965*53ee8cc1Swenshuai.xi #else
966*53ee8cc1Swenshuai.xi                         HVD_memcpy((void *) (pCtrl->MemMap.u32DrvProcessBufVAddr), pNULLPattern,
967*53ee8cc1Swenshuai.xi                                    pCtrl->u32RV_FlushPacketSize);
968*53ee8cc1Swenshuai.xi                         HAL_HVD_EX_FlushMemory();
969*53ee8cc1Swenshuai.xi #endif
970*53ee8cc1Swenshuai.xi                     }
971*53ee8cc1Swenshuai.xi #endif
972*53ee8cc1Swenshuai.xi                     break;
973*53ee8cc1Swenshuai.xi                 }
974*53ee8cc1Swenshuai.xi                 default:
975*53ee8cc1Swenshuai.xi                     pCtrl->u32NULLPacketSize = 0;
976*53ee8cc1Swenshuai.xi                     pCtrl->u32NULLPacketAddr = 0;
977*53ee8cc1Swenshuai.xi                     break;
978*53ee8cc1Swenshuai.xi             }
979*53ee8cc1Swenshuai.xi         }
980*53ee8cc1Swenshuai.xi         else
981*53ee8cc1Swenshuai.xi         {
982*53ee8cc1Swenshuai.xi             pCtrl->u32NULLPacketSize = 0;
983*53ee8cc1Swenshuai.xi             pCtrl->u32NULLPacketAddr = 0;
984*53ee8cc1Swenshuai.xi         }
985*53ee8cc1Swenshuai.xi     }
986*53ee8cc1Swenshuai.xi 
987*53ee8cc1Swenshuai.xi     // reset other driver control variables
988*53ee8cc1Swenshuai.xi     pCtrl->u32StepDecodeCnt = 0;
989*53ee8cc1Swenshuai.xi     pCtrl->u32LastESRptr = 0;
990*53ee8cc1Swenshuai.xi     pCtrl->u32BBUPacketCnt = 0;
991*53ee8cc1Swenshuai.xi     pCtrl->u32BBUWptr_Fired = 0;
992*53ee8cc1Swenshuai.xi     pCtrl->u32LastErrCode = 0;
993*53ee8cc1Swenshuai.xi     pCtrl->bIsDispInfoChg = 0;
994*53ee8cc1Swenshuai.xi 
995*53ee8cc1Swenshuai.xi     memset((void *) &(pCtrl->LastNal), 0, sizeof(HVD_Nal_Entry));
996*53ee8cc1Swenshuai.xi     memset((void *) &(pCtrl->LivingStatus), 0, sizeof(HVD_Alive_Status));
997*53ee8cc1Swenshuai.xi 
998*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
999*53ee8cc1Swenshuai.xi     if((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_MVC)
1000*53ee8cc1Swenshuai.xi     {
1001*53ee8cc1Swenshuai.xi         /// TODO: MVC want to used 2nd HVDCtrl data.
1002*53ee8cc1Swenshuai.xi         //u8DrvId = _HVD_EX_GetDrvId(u32Id);
1003*53ee8cc1Swenshuai.xi         //pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId + 1]);
1004*53ee8cc1Swenshuai.xi         HVD_EX_Drv_Ctrl *pDrvCtrl_sub = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId+1]);
1005*53ee8cc1Swenshuai.xi 
1006*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->u32StepDecodeCnt = 0;
1007*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->u32LastESRptr = 0;
1008*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->u32BBUPacketCnt = 0;
1009*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->u32BBUWptr_Fired = 0;
1010*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->u32LastErrCode = 0;
1011*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->bIsDispInfoChg = 0;
1012*53ee8cc1Swenshuai.xi 
1013*53ee8cc1Swenshuai.xi         memset((void *) &(pDrvCtrl_sub->LastNal), 0, sizeof(HVD_Nal_Entry));
1014*53ee8cc1Swenshuai.xi 
1015*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->bNoDrvProccBuf        = pCtrl->bNoDrvProccBuf;
1016*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->bAutoRmLastZeroByte   = pCtrl->bAutoRmLastZeroByte;
1017*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->bCannotAccessMIU256   = pCtrl->bCannotAccessMIU256;
1018*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->u32CmdTimeout         = pCtrl->u32CmdTimeout;
1019*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->u32CtrlMode           = pCtrl->u32CtrlMode;
1020*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->u32DummyWriteBuf      = pCtrl->u32DummyWriteBuf;
1021*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->u32NULLPacketSize     = pCtrl->u32NULLPacketSize;
1022*53ee8cc1Swenshuai.xi         pDrvCtrl_sub->u32NULLPacketAddr     = pCtrl->u32NULLPacketAddr;
1023*53ee8cc1Swenshuai.xi     }
1024*53ee8cc1Swenshuai.xi #endif
1025*53ee8cc1Swenshuai.xi     // Init HAL variables
1026*53ee8cc1Swenshuai.xi     return (HVD_EX_Result) HAL_HVD_EX_InitVariables(u32Id);
1027*53ee8cc1Swenshuai.xi }
1028*53ee8cc1Swenshuai.xi 
1029*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1030*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: _HVD_EX_SetSyncMode()
1031*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the way to sync video time stamp and STC.
1032*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : sync type
1033*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : only work under (eMode == E_HVD_EX_SYNC_ATS) , video delay toward Audio time stamp. It's minimun value is 0, and maximun value is 4500 ( unit:ms)
1034*53ee8cc1Swenshuai.xi /// @return -The result of command set sync type
1035*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
_HVD_EX_SetSyncMode(MS_U32 u32Id,HVD_Sync_Tbl_Type eMode)1036*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_SetSyncMode(MS_U32 u32Id, HVD_Sync_Tbl_Type eMode)
1037*53ee8cc1Swenshuai.xi {
1038*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_OK;
1039*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1040*53ee8cc1Swenshuai.xi 
1041*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
1042*53ee8cc1Swenshuai.xi 
1043*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_TYPE, eMode);
1044*53ee8cc1Swenshuai.xi 
1045*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
1046*53ee8cc1Swenshuai.xi }
1047*53ee8cc1Swenshuai.xi 
_HVD_EX_InitFW_AVC(MS_U32 u32Id)1048*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_InitFW_AVC(MS_U32 u32Id)
1049*53ee8cc1Swenshuai.xi {
1050*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1051*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
1052*53ee8cc1Swenshuai.xi     MS_U32 u32InitMode = pCtrl->InitParams.u32ModeFlag;
1053*53ee8cc1Swenshuai.xi 
1054*53ee8cc1Swenshuai.xi     // common settings
1055*53ee8cc1Swenshuai.xi     if (!(pCtrl->InitParams.u8TurboInit & E_HVD_EX_TURBOINIT_DISPLAY))
1056*53ee8cc1Swenshuai.xi     {
1057*53ee8cc1Swenshuai.xi         _HVD_EX_SetSyncMode(u32Id, (HVD_Sync_Tbl_Type) pCtrl->InitParams.u8SyncType);
1058*53ee8cc1Swenshuai.xi 
1059*53ee8cc1Swenshuai.xi         if (pCtrl->InitParams.u8MinFrmGap)
1060*53ee8cc1Swenshuai.xi         {
1061*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_MIN_FRAME_GAP, pCtrl->InitParams.u8MinFrmGap);
1062*53ee8cc1Swenshuai.xi         }
1063*53ee8cc1Swenshuai.xi 
1064*53ee8cc1Swenshuai.xi         if (pCtrl->InitParams.u32MaxDecTick)
1065*53ee8cc1Swenshuai.xi         {
1066*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_MAX_DEC_TICK, pCtrl->InitParams.u32MaxDecTick);
1067*53ee8cc1Swenshuai.xi         }
1068*53ee8cc1Swenshuai.xi 
1069*53ee8cc1Swenshuai.xi         if (pCtrl->InitParams.u16Pitch)
1070*53ee8cc1Swenshuai.xi         {
1071*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PITCH, pCtrl->InitParams.u16Pitch);
1072*53ee8cc1Swenshuai.xi         }
1073*53ee8cc1Swenshuai.xi 
1074*53ee8cc1Swenshuai.xi         if (pCtrl->InitParams.bSyncEachFrm)
1075*53ee8cc1Swenshuai.xi         {
1076*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_EACH_FRM, TRUE);
1077*53ee8cc1Swenshuai.xi         }
1078*53ee8cc1Swenshuai.xi 
1079*53ee8cc1Swenshuai.xi         if (pCtrl->InitParams.bFastDisplay)
1080*53ee8cc1Swenshuai.xi         {
1081*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FAST_DISP, TRUE);
1082*53ee8cc1Swenshuai.xi         }
1083*53ee8cc1Swenshuai.xi 
1084*53ee8cc1Swenshuai.xi         if (pCtrl->InitParams.bDynamicScaling)
1085*53ee8cc1Swenshuai.xi         {
1086*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DYNAMIC_SCALE, TRUE);
1087*53ee8cc1Swenshuai.xi         }
1088*53ee8cc1Swenshuai.xi 
1089*53ee8cc1Swenshuai.xi         if (pCtrl->InitParams.bUserData)
1090*53ee8cc1Swenshuai.xi         {
1091*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DPO_CC, TRUE);
1092*53ee8cc1Swenshuai.xi         }
1093*53ee8cc1Swenshuai.xi     }
1094*53ee8cc1Swenshuai.xi 
1095*53ee8cc1Swenshuai.xi     if (pCtrl->InitParams.u8TimeUnit)
1096*53ee8cc1Swenshuai.xi     {
1097*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_TIME_UNIT_TYPE, pCtrl->InitParams.u8TimeUnit);
1098*53ee8cc1Swenshuai.xi     }
1099*53ee8cc1Swenshuai.xi 
1100*53ee8cc1Swenshuai.xi     // specific settings
1101*53ee8cc1Swenshuai.xi     switch (u32InitMode & HVD_INIT_MAIN_MASK)
1102*53ee8cc1Swenshuai.xi     {
1103*53ee8cc1Swenshuai.xi         case HVD_INIT_MAIN_FILE_RAW:
1104*53ee8cc1Swenshuai.xi         {
1105*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIS_VDEAD, TRUE);
1106*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_IGNORE_ERR_REF, TRUE);
1107*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FORCE_RESET_HW, TRUE);
1108*53ee8cc1Swenshuai.xi 
1109*53ee8cc1Swenshuai.xi             if (!(pCtrl->InitParams.u8TurboInit & E_HVD_EX_TURBOINIT_DISPLAY))
1110*53ee8cc1Swenshuai.xi             {
1111*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_REPEAT_LAST_FIELD, TRUE);
1112*53ee8cc1Swenshuai.xi             }
1113*53ee8cc1Swenshuai.xi 
1114*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PARSER_BYPASS, TRUE);
1115*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_GET_MORE_FRM_BUF, TRUE);
1116*53ee8cc1Swenshuai.xi 
1117*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DYNAMIC_SCALE_RESV_N_BUFFER, TRUE);
1118*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_CTRL_SPEED_IN_DISP_ONLY, TRUE);
1119*53ee8cc1Swenshuai.xi             break;
1120*53ee8cc1Swenshuai.xi         }
1121*53ee8cc1Swenshuai.xi         case HVD_INIT_MAIN_FILE_TS:
1122*53ee8cc1Swenshuai.xi         {
1123*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIS_VDEAD, TRUE);
1124*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_IGNORE_ERR_REF, TRUE);
1125*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FORCE_RESET_HW, TRUE);
1126*53ee8cc1Swenshuai.xi 
1127*53ee8cc1Swenshuai.xi             if (!(pCtrl->InitParams.u8TurboInit & E_HVD_EX_TURBOINIT_DISPLAY))
1128*53ee8cc1Swenshuai.xi             {
1129*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_REPEAT_LAST_FIELD, TRUE);
1130*53ee8cc1Swenshuai.xi             }
1131*53ee8cc1Swenshuai.xi 
1132*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ES_FULL_STOP, TRUE);
1133*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AVOID_PTS_TBL_OVERFLOW, TRUE);
1134*53ee8cc1Swenshuai.xi 
1135*53ee8cc1Swenshuai.xi             if((u32InitMode & HVD_INIT_HW_MASK) == HVD_INIT_HW_MVC)
1136*53ee8cc1Swenshuai.xi             {
1137*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SpareBandwidth(u32Id);  //// For MVC
1138*53ee8cc1Swenshuai.xi             }
1139*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DYNAMIC_SCALE_RESV_N_BUFFER, TRUE);
1140*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_CTRL_SPEED_IN_DISP_ONLY, TRUE);
1141*53ee8cc1Swenshuai.xi             break;
1142*53ee8cc1Swenshuai.xi         }
1143*53ee8cc1Swenshuai.xi         case HVD_INIT_MAIN_LIVE_STREAM:
1144*53ee8cc1Swenshuai.xi         {
1145*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_IGNORE_ERR_REF, TRUE);
1146*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FORCE_RESET_HW, TRUE);
1147*53ee8cc1Swenshuai.xi 
1148*53ee8cc1Swenshuai.xi             if (pCtrl->InitParams.u8TimeUnit)
1149*53ee8cc1Swenshuai.xi             {
1150*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_VIDEO_DELAY, (MS_U32) HVD_DTV_VIDEO_DELAY);
1151*53ee8cc1Swenshuai.xi             }
1152*53ee8cc1Swenshuai.xi             else
1153*53ee8cc1Swenshuai.xi             {
1154*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_VIDEO_DELAY, (MS_U32) HVD_DTV_VIDEO_DELAY * 90);
1155*53ee8cc1Swenshuai.xi             }
1156*53ee8cc1Swenshuai.xi 
1157*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ES_FULL_STOP, TRUE);
1158*53ee8cc1Swenshuai.xi 
1159*53ee8cc1Swenshuai.xi             break;
1160*53ee8cc1Swenshuai.xi         }
1161*53ee8cc1Swenshuai.xi         default:
1162*53ee8cc1Swenshuai.xi             break;
1163*53ee8cc1Swenshuai.xi     }
1164*53ee8cc1Swenshuai.xi 
1165*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
1166*53ee8cc1Swenshuai.xi }
1167*53ee8cc1Swenshuai.xi 
_HVD_EX_InitFW_RM(MS_U32 u32Id)1168*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_InitFW_RM(MS_U32 u32Id)
1169*53ee8cc1Swenshuai.xi {
1170*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1171*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
1172*53ee8cc1Swenshuai.xi     MS_U32 u32InitMode = pCtrl->InitParams.u32ModeFlag;
1173*53ee8cc1Swenshuai.xi 
1174*53ee8cc1Swenshuai.xi     // common settings
1175*53ee8cc1Swenshuai.xi     if (!(pCtrl->InitParams.u8TurboInit & E_HVD_EX_TURBOINIT_DISPLAY))
1176*53ee8cc1Swenshuai.xi     {
1177*53ee8cc1Swenshuai.xi         _HVD_EX_SetSyncMode(u32Id, (HVD_Sync_Tbl_Type) pCtrl->InitParams.u8SyncType);
1178*53ee8cc1Swenshuai.xi 
1179*53ee8cc1Swenshuai.xi         if (pCtrl->InitParams.u16Pitch)
1180*53ee8cc1Swenshuai.xi         {
1181*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PITCH, pCtrl->InitParams.u16Pitch);
1182*53ee8cc1Swenshuai.xi         }
1183*53ee8cc1Swenshuai.xi 
1184*53ee8cc1Swenshuai.xi         if (pCtrl->InitParams.bSyncEachFrm)
1185*53ee8cc1Swenshuai.xi         {
1186*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_EACH_FRM, TRUE);
1187*53ee8cc1Swenshuai.xi         }
1188*53ee8cc1Swenshuai.xi 
1189*53ee8cc1Swenshuai.xi         if (pCtrl->InitParams.bFastDisplay)
1190*53ee8cc1Swenshuai.xi         {
1191*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FAST_DISP, TRUE);
1192*53ee8cc1Swenshuai.xi         }
1193*53ee8cc1Swenshuai.xi 
1194*53ee8cc1Swenshuai.xi         if (pCtrl->InitParams.bDynamicScaling)
1195*53ee8cc1Swenshuai.xi         {
1196*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DYNAMIC_SCALE, TRUE);
1197*53ee8cc1Swenshuai.xi         }
1198*53ee8cc1Swenshuai.xi     }
1199*53ee8cc1Swenshuai.xi 
1200*53ee8cc1Swenshuai.xi     if (pCtrl->InitParams.u8TimeUnit)
1201*53ee8cc1Swenshuai.xi     {
1202*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_TIME_UNIT_TYPE, pCtrl->InitParams.u8TimeUnit);
1203*53ee8cc1Swenshuai.xi     }
1204*53ee8cc1Swenshuai.xi 
1205*53ee8cc1Swenshuai.xi     // specific settings
1206*53ee8cc1Swenshuai.xi     switch (u32InitMode & HVD_INIT_MAIN_MASK)
1207*53ee8cc1Swenshuai.xi     {
1208*53ee8cc1Swenshuai.xi         case HVD_INIT_MAIN_FILE_RAW:
1209*53ee8cc1Swenshuai.xi             break;
1210*53ee8cc1Swenshuai.xi         case HVD_INIT_MAIN_FILE_TS:
1211*53ee8cc1Swenshuai.xi         case HVD_INIT_MAIN_LIVE_STREAM:
1212*53ee8cc1Swenshuai.xi         default:
1213*53ee8cc1Swenshuai.xi             break;
1214*53ee8cc1Swenshuai.xi     }
1215*53ee8cc1Swenshuai.xi 
1216*53ee8cc1Swenshuai.xi     // fix FFx4 display error
1217*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FORCE_RESET_HW, TRUE);
1218*53ee8cc1Swenshuai.xi 
1219*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
1220*53ee8cc1Swenshuai.xi }
1221*53ee8cc1Swenshuai.xi 
_HVD_EX_CheckFWVersion(MS_U32 u32Id)1222*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_CheckFWVersion(MS_U32 u32Id)
1223*53ee8cc1Swenshuai.xi {
1224*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1225*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
1226*53ee8cc1Swenshuai.xi 
1227*53ee8cc1Swenshuai.xi     // check FW version ID
1228*53ee8cc1Swenshuai.xi     if (!(pCtrl->InitParams.u8TurboInit & E_HVD_EX_TURBOINIT_CHECK))
1229*53ee8cc1Swenshuai.xi     {
1230*53ee8cc1Swenshuai.xi         if ((HVD_FW_IF_VERSION >> 16) != (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_IF_VERSION_ID) >> 16))
1231*53ee8cc1Swenshuai.xi         {
1232*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("fw interface and binary is not the same. fw ID: interface:%x binary:%lx\n",
1233*53ee8cc1Swenshuai.xi                         (MS_U32) HVD_FW_IF_VERSION, (unsigned long)HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_IF_VERSION_ID));
1234*53ee8cc1Swenshuai.xi             return E_HVD_EX_FAIL;
1235*53ee8cc1Swenshuai.xi         }
1236*53ee8cc1Swenshuai.xi     }
1237*53ee8cc1Swenshuai.xi 
1238*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
1239*53ee8cc1Swenshuai.xi }
1240*53ee8cc1Swenshuai.xi 
_HVD_EX_InitFW(MS_U32 u32Id)1241*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_InitFW(MS_U32 u32Id)
1242*53ee8cc1Swenshuai.xi {
1243*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_OK;
1244*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1245*53ee8cc1Swenshuai.xi 
1246*53ee8cc1Swenshuai.xi     eRet = _HVD_EX_CheckFWVersion(u32Id);
1247*53ee8cc1Swenshuai.xi 
1248*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
1249*53ee8cc1Swenshuai.xi     {
1250*53ee8cc1Swenshuai.xi         return eRet;
1251*53ee8cc1Swenshuai.xi     }
1252*53ee8cc1Swenshuai.xi 
1253*53ee8cc1Swenshuai.xi     switch (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK)
1254*53ee8cc1Swenshuai.xi     {
1255*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVC:
1256*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVS:
1257*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_MVC:
1258*53ee8cc1Swenshuai.xi      #if SUPPORT_EVD
1259*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_VP9: // MStar VP9 or G2 VP9
1260*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_HEVC:
1261*53ee8cc1Swenshuai.xi      #endif
1262*53ee8cc1Swenshuai.xi             eRet = _HVD_EX_InitFW_AVC(u32Id);
1263*53ee8cc1Swenshuai.xi             break;
1264*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_RM:
1265*53ee8cc1Swenshuai.xi             eRet = _HVD_EX_InitFW_RM(u32Id);
1266*53ee8cc1Swenshuai.xi             break;
1267*53ee8cc1Swenshuai.xi         default:
1268*53ee8cc1Swenshuai.xi             break;
1269*53ee8cc1Swenshuai.xi     }
1270*53ee8cc1Swenshuai.xi 
1271*53ee8cc1Swenshuai.xi     HAL_HVD_EX_PowerSaving(u32Id);
1272*53ee8cc1Swenshuai.xi 
1273*53ee8cc1Swenshuai.xi     return eRet;
1274*53ee8cc1Swenshuai.xi }
1275*53ee8cc1Swenshuai.xi 
_HVD_EX_IsAllBufferEmpty(MS_U32 u32Id,MS_BOOL bFlush)1276*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_EX_IsAllBufferEmpty(MS_U32 u32Id, MS_BOOL bFlush)
1277*53ee8cc1Swenshuai.xi {
1278*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1279*53ee8cc1Swenshuai.xi     MS_U32 u32PlaybackType = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK;
1280*53ee8cc1Swenshuai.xi     MS_BOOL bCondition;
1281*53ee8cc1Swenshuai.xi #ifndef VDEC3
1282*53ee8cc1Swenshuai.xi     MS_U32 u32FwIdleThreshold = 5000;
1283*53ee8cc1Swenshuai.xi #endif
1284*53ee8cc1Swenshuai.xi     //MS_U32 u8DispCntThreshold = 0;
1285*53ee8cc1Swenshuai.xi     if (u32PlaybackType == HVD_INIT_MAIN_FILE_RAW)
1286*53ee8cc1Swenshuai.xi     {
1287*53ee8cc1Swenshuai.xi         #ifdef VDEC3
1288*53ee8cc1Swenshuai.xi         MS_VIRT u32VBBUAddr = MDrv_HVD_EX_GetData(u32Id, E_HVD_EX_GDATA_TYPE_VBBU_ADDR);
1289*53ee8cc1Swenshuai.xi         if (!HAL_VPU_EX_IsVBBUEmpty(u32Id, u32VBBUAddr))
1290*53ee8cc1Swenshuai.xi         #else
1291*53ee8cc1Swenshuai.xi         if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_Q_NUMB) != 0)
1292*53ee8cc1Swenshuai.xi         #endif
1293*53ee8cc1Swenshuai.xi         {
1294*53ee8cc1Swenshuai.xi             return FALSE;
1295*53ee8cc1Swenshuai.xi         }
1296*53ee8cc1Swenshuai.xi     }
1297*53ee8cc1Swenshuai.xi     else                        //if( u32PlaybackType == HVD_INIT_MAIN_FILE_TS ) TSP input
1298*53ee8cc1Swenshuai.xi     {
1299*53ee8cc1Swenshuai.xi #if 0
1300*53ee8cc1Swenshuai.xi         if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_READ_PTR) != HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_WRITE_PTR))
1301*53ee8cc1Swenshuai.xi         {
1302*53ee8cc1Swenshuai.xi             return FALSE;
1303*53ee8cc1Swenshuai.xi         }
1304*53ee8cc1Swenshuai.xi #endif
1305*53ee8cc1Swenshuai.xi     }
1306*53ee8cc1Swenshuai.xi #ifndef VDEC3
1307*53ee8cc1Swenshuai.xi     if(_DRV_HVD_Ctrl(u8DrvId, HVD_CTRL_DISP_OUTSIDE))
1308*53ee8cc1Swenshuai.xi #endif
1309*53ee8cc1Swenshuai.xi     {
1310*53ee8cc1Swenshuai.xi         #ifdef VDEC3
1311*53ee8cc1Swenshuai.xi         //if ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_Q_NUMB) == 0) && HAL_HVD_EX_DispFrameAllViewed(u32Id) && (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_FLUSH_STATUS) == E_HVD_EX_FLUSH_DONE || HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_PLAYBACK_FINISH)))
1312*53ee8cc1Swenshuai.xi         bCondition = (bFlush)? (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_FLUSH_STATUS) == E_HVD_EX_FLUSH_DONE):
1313*53ee8cc1Swenshuai.xi                                            (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_FLUSH_STATUS) == E_HVD_EX_FLUSH_DONE || HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_PLAYBACK_FINISH));
1314*53ee8cc1Swenshuai.xi 
1315*53ee8cc1Swenshuai.xi         if (bCondition && (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_Q_NUMB) == 0) && HAL_HVD_EX_DispFrameAllViewed(u32Id))
1316*53ee8cc1Swenshuai.xi         #else
1317*53ee8cc1Swenshuai.xi         if ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_Q_NUMB) == 0 && HAL_HVD_EX_DispFrameAllViewed(u32Id)) &&
1318*53ee8cc1Swenshuai.xi             ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT) > u32FwIdleThreshold)||((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_FLUSH_STATUS) == E_HVD_EX_FLUSH_DONE) )))
1319*53ee8cc1Swenshuai.xi         #endif
1320*53ee8cc1Swenshuai.xi         {
1321*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FW_FLUSH_STATUS,  (MS_U32)E_HVD_EX_FLUSH_NONE);
1322*53ee8cc1Swenshuai.xi 
1323*53ee8cc1Swenshuai.xi             return TRUE;
1324*53ee8cc1Swenshuai.xi         }
1325*53ee8cc1Swenshuai.xi 
1326*53ee8cc1Swenshuai.xi         return FALSE;
1327*53ee8cc1Swenshuai.xi     }
1328*53ee8cc1Swenshuai.xi #ifndef VDEC3
1329*53ee8cc1Swenshuai.xi     //other Queues
1330*53ee8cc1Swenshuai.xi     //LOGD("R: %d %d %d", HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_Q_NUMB), HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_Q_NUMB), HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT));
1331*53ee8cc1Swenshuai.xi     if (((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_Q_NUMB) == 0) && (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_Q_NUMB) == u8DispCntThreshold)) &&
1332*53ee8cc1Swenshuai.xi         ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT) > u32FwIdleThreshold)||((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_FLUSH_STATUS) == E_HVD_EX_FLUSH_DONE) )))
1333*53ee8cc1Swenshuai.xi     {
1334*53ee8cc1Swenshuai.xi         //HVD_PRINT("Flush success, flush_status: %d !!!\n",HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_FLUSH_STATUS));
1335*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FW_FLUSH_STATUS,  (MS_U32)E_HVD_EX_FLUSH_NONE);
1336*53ee8cc1Swenshuai.xi 
1337*53ee8cc1Swenshuai.xi         return TRUE;
1338*53ee8cc1Swenshuai.xi     }
1339*53ee8cc1Swenshuai.xi     else
1340*53ee8cc1Swenshuai.xi     {
1341*53ee8cc1Swenshuai.xi         return FALSE;
1342*53ee8cc1Swenshuai.xi     }
1343*53ee8cc1Swenshuai.xi #endif
1344*53ee8cc1Swenshuai.xi }
1345*53ee8cc1Swenshuai.xi 
1346*53ee8cc1Swenshuai.xi #ifndef VDEC3
_HVD_EX_IsAllBufferEmpty_VP8(MS_U32 u32Id)1347*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_EX_IsAllBufferEmpty_VP8(MS_U32 u32Id)
1348*53ee8cc1Swenshuai.xi {
1349*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1350*53ee8cc1Swenshuai.xi     MS_U32 u32PlaybackType = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK;
1351*53ee8cc1Swenshuai.xi     MS_U32 u32FwIdleThreshold = 5000;
1352*53ee8cc1Swenshuai.xi     MS_U32 u8DispCntThreshold = 0;
1353*53ee8cc1Swenshuai.xi 
1354*53ee8cc1Swenshuai.xi     if (u32PlaybackType == HVD_INIT_MAIN_FILE_RAW)
1355*53ee8cc1Swenshuai.xi     {
1356*53ee8cc1Swenshuai.xi         if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_Q_NUMB) != 0)
1357*53ee8cc1Swenshuai.xi         {
1358*53ee8cc1Swenshuai.xi             return FALSE;
1359*53ee8cc1Swenshuai.xi         }
1360*53ee8cc1Swenshuai.xi     }
1361*53ee8cc1Swenshuai.xi 
1362*53ee8cc1Swenshuai.xi #if 0
1363*53ee8cc1Swenshuai.xi     if(_DRV_HVD_Ctrl(u8DrvId, HVD_CTRL_DISP_OUTSIDE))
1364*53ee8cc1Swenshuai.xi     {
1365*53ee8cc1Swenshuai.xi         u32FwIdleThreshold = 5;
1366*53ee8cc1Swenshuai.xi     }
1367*53ee8cc1Swenshuai.xi #endif
1368*53ee8cc1Swenshuai.xi     if(_DRV_HVD_Ctrl(u8DrvId, HVD_CTRL_DISP_OUTSIDE))
1369*53ee8cc1Swenshuai.xi     {
1370*53ee8cc1Swenshuai.xi         if ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_READ_PTR) == HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_WRITE_PTR) && HAL_HVD_EX_DispFrameAllViewed(u32Id)) &&
1371*53ee8cc1Swenshuai.xi             ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT) > u32FwIdleThreshold)||((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_FLUSH_STATUS) == E_HVD_EX_FLUSH_DONE) )))
1372*53ee8cc1Swenshuai.xi         {
1373*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FW_FLUSH_STATUS,  (MS_U32)E_HVD_EX_FLUSH_NONE);
1374*53ee8cc1Swenshuai.xi 
1375*53ee8cc1Swenshuai.xi             return TRUE;
1376*53ee8cc1Swenshuai.xi         }
1377*53ee8cc1Swenshuai.xi 
1378*53ee8cc1Swenshuai.xi         return FALSE;
1379*53ee8cc1Swenshuai.xi     }
1380*53ee8cc1Swenshuai.xi     // other Queues
1381*53ee8cc1Swenshuai.xi     if (((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_Q_NUMB) == 0) && (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_Q_NUMB) == u8DispCntThreshold)) &&
1382*53ee8cc1Swenshuai.xi         ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT) > u32FwIdleThreshold) || (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_FLUSH_STATUS) == E_HVD_EX_FLUSH_DONE) ))
1383*53ee8cc1Swenshuai.xi     {
1384*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FW_FLUSH_STATUS,  (MS_U32)E_HVD_EX_FLUSH_NONE);
1385*53ee8cc1Swenshuai.xi         return TRUE;
1386*53ee8cc1Swenshuai.xi     }
1387*53ee8cc1Swenshuai.xi     else
1388*53ee8cc1Swenshuai.xi     {
1389*53ee8cc1Swenshuai.xi         return FALSE;
1390*53ee8cc1Swenshuai.xi     }
1391*53ee8cc1Swenshuai.xi }
1392*53ee8cc1Swenshuai.xi #endif
1393*53ee8cc1Swenshuai.xi 
1394*53ee8cc1Swenshuai.xi #if defined(REDLION_LINUX_KERNEL_ENVI)
_HVD_EX_ISRHandler(void)1395*53ee8cc1Swenshuai.xi static MS_S32 _HVD_EX_ISRHandler(void)
1396*53ee8cc1Swenshuai.xi {
1397*53ee8cc1Swenshuai.xi     if (gHVDISRCtrl.pfnISRCallBack != NULL)
1398*53ee8cc1Swenshuai.xi     {
1399*53ee8cc1Swenshuai.xi         gHVDISRCtrl.bInISR = TRUE;
1400*53ee8cc1Swenshuai.xi         gHVDISRCtrl.u32ISRInfo = HAL_HVD_EX_GetData(E_HVD_GDATA_HVD_ISR_STATUS);
1401*53ee8cc1Swenshuai.xi 
1402*53ee8cc1Swenshuai.xi         if (gHVDISRCtrl.u32ISRInfo)
1403*53ee8cc1Swenshuai.xi         {
1404*53ee8cc1Swenshuai.xi             HAL_HVD_EX_EnableISR(FALSE);
1405*53ee8cc1Swenshuai.xi             gHVDISRCtrl.pfnISRCallBack();
1406*53ee8cc1Swenshuai.xi             HAL_HVD_EX_EnableISR(TRUE);
1407*53ee8cc1Swenshuai.xi         }
1408*53ee8cc1Swenshuai.xi     }
1409*53ee8cc1Swenshuai.xi     else
1410*53ee8cc1Swenshuai.xi     {
1411*53ee8cc1Swenshuai.xi         HVD_EX_MSG_DBG("ISR callback is NULL.\n");
1412*53ee8cc1Swenshuai.xi     }
1413*53ee8cc1Swenshuai.xi 
1414*53ee8cc1Swenshuai.xi     gHVDISRCtrl.bInISR = FALSE;
1415*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetClearISR();
1416*53ee8cc1Swenshuai.xi     if (TRUE == OSAL_HVD_ISR_Enable())//enable cpu interrupt mask
1417*53ee8cc1Swenshuai.xi     {
1418*53ee8cc1Swenshuai.xi         _bHVDDisableISRFlag = FALSE;
1419*53ee8cc1Swenshuai.xi     }
1420*53ee8cc1Swenshuai.xi     return 1;
1421*53ee8cc1Swenshuai.xi }
1422*53ee8cc1Swenshuai.xi #else
_HVD_EX_ISRHandler(void)1423*53ee8cc1Swenshuai.xi static void _HVD_EX_ISRHandler(void)
1424*53ee8cc1Swenshuai.xi {
1425*53ee8cc1Swenshuai.xi     MS_U8 u8Idx;
1426*53ee8cc1Swenshuai.xi     HVD_ISRCallBack pfnCb = NULL;
1427*53ee8cc1Swenshuai.xi     //we can attach only one ISR, so we need to check the INT is from which decoder.
1428*53ee8cc1Swenshuai.xi     for (u8Idx = 0; u8Idx < HVD_MAX_STREAMS; u8Idx++)
1429*53ee8cc1Swenshuai.xi     {
1430*53ee8cc1Swenshuai.xi         if (pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.eHWDecIsr == E_HWDEC_ISR_HVD)
1431*53ee8cc1Swenshuai.xi         {
1432*53ee8cc1Swenshuai.xi             pfnCb = pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.pfnISRCallBack;
1433*53ee8cc1Swenshuai.xi 
1434*53ee8cc1Swenshuai.xi             if (pfnCb)
1435*53ee8cc1Swenshuai.xi             {
1436*53ee8cc1Swenshuai.xi                 pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.bInISR = TRUE;
1437*53ee8cc1Swenshuai.xi                 pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.u32ISRInfo = HAL_HVD_EX_GetData(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid, E_HVD_GDATA_HVD_ISR_STATUS);
1438*53ee8cc1Swenshuai.xi 
1439*53ee8cc1Swenshuai.xi                 if (pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.u32ISRInfo)
1440*53ee8cc1Swenshuai.xi                 {
1441*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(HAL_CHIP_SUPPORT_EVD)
1442*53ee8cc1Swenshuai.xi                     //make fake stream id to disable/enable ISR.(only for calling HAL_HVD_EX_EnableISR)
1443*53ee8cc1Swenshuai.xi 
1444*53ee8cc1Swenshuai.xi                     HAL_HVD_EX_EnableISR(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid, FALSE);
1445*53ee8cc1Swenshuai.xi                     pfnCb(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid);
1446*53ee8cc1Swenshuai.xi                     HAL_HVD_EX_EnableISR(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid, TRUE);
1447*53ee8cc1Swenshuai.xi #else
1448*53ee8cc1Swenshuai.xi                     HAL_HVD_EX_EnableISR(FALSE);
1449*53ee8cc1Swenshuai.xi                     pfnCb(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid);
1450*53ee8cc1Swenshuai.xi                     HAL_HVD_EX_EnableISR(TRUE);
1451*53ee8cc1Swenshuai.xi #endif
1452*53ee8cc1Swenshuai.xi                 }
1453*53ee8cc1Swenshuai.xi             }
1454*53ee8cc1Swenshuai.xi             else
1455*53ee8cc1Swenshuai.xi             {
1456*53ee8cc1Swenshuai.xi                 HVD_EX_MSG_DBG("ISR callback is NULL.\n");
1457*53ee8cc1Swenshuai.xi             }
1458*53ee8cc1Swenshuai.xi 
1459*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.bInISR = FALSE;
1460*53ee8cc1Swenshuai.xi         }
1461*53ee8cc1Swenshuai.xi     }
1462*53ee8cc1Swenshuai.xi 
1463*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetClearISR(REG_HVD_BASE);
1464*53ee8cc1Swenshuai.xi 
1465*53ee8cc1Swenshuai.xi     if (TRUE == OSAL_HVD_ISR_Enable(HVD_ISR_VECTOR))//enable cpu interrupt mask
1466*53ee8cc1Swenshuai.xi     {
1467*53ee8cc1Swenshuai.xi         bHVDDisableISRFlag = FALSE;
1468*53ee8cc1Swenshuai.xi     }
1469*53ee8cc1Swenshuai.xi }
1470*53ee8cc1Swenshuai.xi 
_EVD_EX_ISRHandler(void)1471*53ee8cc1Swenshuai.xi static void _EVD_EX_ISRHandler(void)
1472*53ee8cc1Swenshuai.xi {
1473*53ee8cc1Swenshuai.xi     MS_U8 u8Idx;
1474*53ee8cc1Swenshuai.xi     HVD_ISRCallBack pfnCb = NULL;
1475*53ee8cc1Swenshuai.xi 
1476*53ee8cc1Swenshuai.xi     //we can attach only one ISR, so we need to check the INT is from which decoder.
1477*53ee8cc1Swenshuai.xi     for (u8Idx = 0; u8Idx < HVD_MAX_STREAMS; u8Idx++)
1478*53ee8cc1Swenshuai.xi     {
1479*53ee8cc1Swenshuai.xi         if (pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.eHWDecIsr == E_HWDEC_ISR_EVD)
1480*53ee8cc1Swenshuai.xi         {
1481*53ee8cc1Swenshuai.xi             pfnCb = pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.pfnISRCallBack;
1482*53ee8cc1Swenshuai.xi 
1483*53ee8cc1Swenshuai.xi             if (pfnCb)
1484*53ee8cc1Swenshuai.xi             {
1485*53ee8cc1Swenshuai.xi                 pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.bInISR = TRUE;
1486*53ee8cc1Swenshuai.xi                 pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.u32ISRInfo = HAL_HVD_EX_GetData(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid, E_HVD_GDATA_HVD_ISR_STATUS);
1487*53ee8cc1Swenshuai.xi 
1488*53ee8cc1Swenshuai.xi                 if (pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.u32ISRInfo)
1489*53ee8cc1Swenshuai.xi                 {
1490*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(HAL_CHIP_SUPPORT_EVD)
1491*53ee8cc1Swenshuai.xi                     //make fake stream id to disable/enable ISR.(only for calling HAL_HVD_EX_EnableISR)
1492*53ee8cc1Swenshuai.xi 
1493*53ee8cc1Swenshuai.xi                     HAL_HVD_EX_EnableISR(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid, FALSE);
1494*53ee8cc1Swenshuai.xi                     pfnCb(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid);
1495*53ee8cc1Swenshuai.xi                     HAL_HVD_EX_EnableISR(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid, TRUE);
1496*53ee8cc1Swenshuai.xi #else
1497*53ee8cc1Swenshuai.xi                     HAL_HVD_EX_EnableISR(FALSE);
1498*53ee8cc1Swenshuai.xi                     pfnCb(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid);
1499*53ee8cc1Swenshuai.xi                     HAL_HVD_EX_EnableISR(TRUE);
1500*53ee8cc1Swenshuai.xi #endif
1501*53ee8cc1Swenshuai.xi                 }
1502*53ee8cc1Swenshuai.xi             }
1503*53ee8cc1Swenshuai.xi             else
1504*53ee8cc1Swenshuai.xi             {
1505*53ee8cc1Swenshuai.xi                 HVD_EX_MSG_DBG("ISR callback is NULL.\n");
1506*53ee8cc1Swenshuai.xi             }
1507*53ee8cc1Swenshuai.xi 
1508*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.bInISR = FALSE;
1509*53ee8cc1Swenshuai.xi         }
1510*53ee8cc1Swenshuai.xi     }
1511*53ee8cc1Swenshuai.xi 
1512*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetClearISR(REG_EVD_BASE);
1513*53ee8cc1Swenshuai.xi 
1514*53ee8cc1Swenshuai.xi     if (TRUE == OSAL_HVD_ISR_Enable(EVD_ISR_VECTOR))//enable cpu interrupt mask
1515*53ee8cc1Swenshuai.xi     {
1516*53ee8cc1Swenshuai.xi         bEVDDisableISRFlag = FALSE;
1517*53ee8cc1Swenshuai.xi     }
1518*53ee8cc1Swenshuai.xi }
1519*53ee8cc1Swenshuai.xi 
_EVDLITE_EX_ISRHandler(void)1520*53ee8cc1Swenshuai.xi static void _EVDLITE_EX_ISRHandler(void)
1521*53ee8cc1Swenshuai.xi {
1522*53ee8cc1Swenshuai.xi     MS_U8 u8Idx;
1523*53ee8cc1Swenshuai.xi     HVD_ISRCallBack pfnCb = NULL;
1524*53ee8cc1Swenshuai.xi 
1525*53ee8cc1Swenshuai.xi     //we can attach only one ISR, so we need to check the INT is from which decoder.
1526*53ee8cc1Swenshuai.xi     for (u8Idx = 0; u8Idx < HVD_MAX_STREAMS; u8Idx++)
1527*53ee8cc1Swenshuai.xi     {
1528*53ee8cc1Swenshuai.xi         if (pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.eHWDecIsr == E_HWDEC_ISR_EVDLITE)
1529*53ee8cc1Swenshuai.xi         {
1530*53ee8cc1Swenshuai.xi             pfnCb = pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.pfnISRCallBack;
1531*53ee8cc1Swenshuai.xi 
1532*53ee8cc1Swenshuai.xi             if (pfnCb)
1533*53ee8cc1Swenshuai.xi             {
1534*53ee8cc1Swenshuai.xi                 pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.bInISR = TRUE;
1535*53ee8cc1Swenshuai.xi                 pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.u32ISRInfo = HAL_HVD_EX_GetData(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid, E_HVD_GDATA_HVD_ISR_STATUS);
1536*53ee8cc1Swenshuai.xi 
1537*53ee8cc1Swenshuai.xi                 if (pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.u32ISRInfo)
1538*53ee8cc1Swenshuai.xi                 {
1539*53ee8cc1Swenshuai.xi                     #if defined(CHIP_KANO) || defined(CHIP_KASTOR) || defined(CHIP_CURRY)
1540*53ee8cc1Swenshuai.xi                     //make fake stream id to disable/enable ISR.(only for calling HAL_HVD_EX_EnableISR)
1541*53ee8cc1Swenshuai.xi 
1542*53ee8cc1Swenshuai.xi                     HAL_HVD_EX_EnableISR(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid, FALSE);
1543*53ee8cc1Swenshuai.xi                     pfnCb(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid);
1544*53ee8cc1Swenshuai.xi                     HAL_HVD_EX_EnableISR(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid, TRUE);
1545*53ee8cc1Swenshuai.xi                     #else
1546*53ee8cc1Swenshuai.xi                     HAL_HVD_EX_EnableISR(FALSE);
1547*53ee8cc1Swenshuai.xi                     pfnCb(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid);
1548*53ee8cc1Swenshuai.xi                     HAL_HVD_EX_EnableISR(TRUE);
1549*53ee8cc1Swenshuai.xi                     #endif
1550*53ee8cc1Swenshuai.xi                 }
1551*53ee8cc1Swenshuai.xi             }
1552*53ee8cc1Swenshuai.xi             else
1553*53ee8cc1Swenshuai.xi             {
1554*53ee8cc1Swenshuai.xi                 HVD_EX_MSG_DBG("ISR callback is NULL.\n");
1555*53ee8cc1Swenshuai.xi             }
1556*53ee8cc1Swenshuai.xi 
1557*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.bInISR = FALSE;
1558*53ee8cc1Swenshuai.xi         }
1559*53ee8cc1Swenshuai.xi     }
1560*53ee8cc1Swenshuai.xi 
1561*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetClearISR(REG_EVD_LITE_BASE);
1562*53ee8cc1Swenshuai.xi 
1563*53ee8cc1Swenshuai.xi     if (TRUE == OSAL_HVD_ISR_Enable(EVD_LITE_ISR_VECTOR))//enable cpu interrupt mask
1564*53ee8cc1Swenshuai.xi     {
1565*53ee8cc1Swenshuai.xi         bEVDLITEDisableISRFlag = FALSE;
1566*53ee8cc1Swenshuai.xi     }
1567*53ee8cc1Swenshuai.xi }
1568*53ee8cc1Swenshuai.xi #endif
1569*53ee8cc1Swenshuai.xi 
_HVD_EX_RecoverySettings(MS_U32 u32Id)1570*53ee8cc1Swenshuai.xi HVD_EX_Result _HVD_EX_RecoverySettings(MS_U32 u32Id)
1571*53ee8cc1Swenshuai.xi {
1572*53ee8cc1Swenshuai.xi // TODO: complete this function. and consider more cases. step decoder, display?
1573*53ee8cc1Swenshuai.xi     HVD_EX_Result eRst = E_HVD_EX_OK;
1574*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1575*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
1576*53ee8cc1Swenshuai.xi 
1577*53ee8cc1Swenshuai.xi     switch (pCtrl->InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK)
1578*53ee8cc1Swenshuai.xi     {
1579*53ee8cc1Swenshuai.xi         case HVD_INIT_MAIN_LIVE_STREAM:
1580*53ee8cc1Swenshuai.xi         {
1581*53ee8cc1Swenshuai.xi     // temp solution
1582*53ee8cc1Swenshuai.xi             // must before play().
1583*53ee8cc1Swenshuai.xi             if ((pCtrl->Settings.DispInfoTH.u32FrmrateLowBound != 0) ||
1584*53ee8cc1Swenshuai.xi                 (pCtrl->Settings.DispInfoTH.u32FrmrateUpBound != 0) ||
1585*53ee8cc1Swenshuai.xi                 (pCtrl->Settings.DispInfoTH.u32MvopLowBound != 0) || (pCtrl->Settings.DispInfoTH.u32MvopUpBound != 0))
1586*53ee8cc1Swenshuai.xi             {
1587*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_DISP_INFO_TH, (MS_VIRT) (&pCtrl->Settings.DispInfoTH));
1588*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_UPDATE_DISP_THRESHOLD, 0);
1589*53ee8cc1Swenshuai.xi             }
1590*53ee8cc1Swenshuai.xi 
1591*53ee8cc1Swenshuai.xi             if (pCtrl->Settings.u32IsrEvent)
1592*53ee8cc1Swenshuai.xi             {
1593*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ISR_TYPE, pCtrl->Settings.u32IsrEvent);
1594*53ee8cc1Swenshuai.xi             }
1595*53ee8cc1Swenshuai.xi 
1596*53ee8cc1Swenshuai.xi         #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(HAL_CHIP_SUPPORT_EVD)
1597*53ee8cc1Swenshuai.xi             HAL_HVD_EX_EnableISR(u32Id, pCtrl->Settings.bEnISR);
1598*53ee8cc1Swenshuai.xi         #else
1599*53ee8cc1Swenshuai.xi             HAL_HVD_EX_EnableISR(pCtrl->Settings.bEnISR);
1600*53ee8cc1Swenshuai.xi         #endif
1601*53ee8cc1Swenshuai.xi             // play()
1602*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PLAY, 0);
1603*53ee8cc1Swenshuai.xi 
1604*53ee8cc1Swenshuai.xi             if (pCtrl->Settings.u8SkipMode)
1605*53ee8cc1Swenshuai.xi             {
1606*53ee8cc1Swenshuai.xi                 if (E_HVD_EX_OK != (eRst = MDrv_HVD_EX_SetSkipDecMode(u32Id, (HVD_EX_SkipDecode) (pCtrl->Settings.u8SkipMode))))
1607*53ee8cc1Swenshuai.xi                 {
1608*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("Set Skip Mode fail!!.\n");
1609*53ee8cc1Swenshuai.xi                     return eRst;
1610*53ee8cc1Swenshuai.xi                 }
1611*53ee8cc1Swenshuai.xi             }
1612*53ee8cc1Swenshuai.xi 
1613*53ee8cc1Swenshuai.xi             if (pCtrl->Settings.bIsShowErrFrm)
1614*53ee8cc1Swenshuai.xi             {
1615*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_ERR_FRM, TRUE);
1616*53ee8cc1Swenshuai.xi             }
1617*53ee8cc1Swenshuai.xi 
1618*53ee8cc1Swenshuai.xi             if (pCtrl->Settings.u8FrcMode)
1619*53ee8cc1Swenshuai.xi             {
1620*53ee8cc1Swenshuai.xi                 if (E_HVD_EX_OK != (eRst = MDrv_HVD_EX_SetFrcMode(u8DrvId, (HVD_EX_FrmRateConvMode) (pCtrl->Settings.u8FrcMode))))
1621*53ee8cc1Swenshuai.xi                 {
1622*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("Set Frc Mode fail!!.\n");
1623*53ee8cc1Swenshuai.xi                     return eRst;
1624*53ee8cc1Swenshuai.xi                 }
1625*53ee8cc1Swenshuai.xi             }
1626*53ee8cc1Swenshuai.xi 
1627*53ee8cc1Swenshuai.xi             if (pCtrl->Settings.bIsErrConceal)
1628*53ee8cc1Swenshuai.xi             {
1629*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ERR_CONCEAL, TRUE);
1630*53ee8cc1Swenshuai.xi             }
1631*53ee8cc1Swenshuai.xi 
1632*53ee8cc1Swenshuai.xi             if (pCtrl->Settings.bAutoFreeES)
1633*53ee8cc1Swenshuai.xi             {
1634*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AUTO_FREE_ES, TRUE);
1635*53ee8cc1Swenshuai.xi             }
1636*53ee8cc1Swenshuai.xi 
1637*53ee8cc1Swenshuai.xi             if (pCtrl->Settings.bDisDeblocking)
1638*53ee8cc1Swenshuai.xi             {
1639*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIS_DBF, TRUE);
1640*53ee8cc1Swenshuai.xi             }
1641*53ee8cc1Swenshuai.xi 
1642*53ee8cc1Swenshuai.xi             if (pCtrl->Settings.bDisQuarterPixel)
1643*53ee8cc1Swenshuai.xi             {
1644*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIS_QUART_PIXEL, TRUE);
1645*53ee8cc1Swenshuai.xi             }
1646*53ee8cc1Swenshuai.xi 
1647*53ee8cc1Swenshuai.xi             if (pCtrl->Settings.bIsSyncOn)
1648*53ee8cc1Swenshuai.xi             {
1649*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_ACTIVE, TRUE);
1650*53ee8cc1Swenshuai.xi             }
1651*53ee8cc1Swenshuai.xi 
1652*53ee8cc1Swenshuai.xi             if (pCtrl->Settings.u32SyncTolerance)
1653*53ee8cc1Swenshuai.xi             {
1654*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_TOLERANCE, pCtrl->Settings.u32SyncTolerance);
1655*53ee8cc1Swenshuai.xi             }
1656*53ee8cc1Swenshuai.xi 
1657*53ee8cc1Swenshuai.xi             if (pCtrl->Settings.u32SyncRepeatTH)
1658*53ee8cc1Swenshuai.xi             {
1659*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_THRESHOLD, pCtrl->Settings.u32SyncRepeatTH);
1660*53ee8cc1Swenshuai.xi             }
1661*53ee8cc1Swenshuai.xi 
1662*53ee8cc1Swenshuai.xi             if (pCtrl->Settings.u32SyncVideoDelay)
1663*53ee8cc1Swenshuai.xi             {
1664*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_VIDEO_DELAY, pCtrl->Settings.u32SyncVideoDelay);
1665*53ee8cc1Swenshuai.xi             }
1666*53ee8cc1Swenshuai.xi 
1667*53ee8cc1Swenshuai.xi             if (pCtrl->Settings.u32SyncFreeRunTH)
1668*53ee8cc1Swenshuai.xi             {
1669*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FREERUN_THRESHOLD, pCtrl->Settings.u32SyncFreeRunTH);
1670*53ee8cc1Swenshuai.xi             }
1671*53ee8cc1Swenshuai.xi 
1672*53ee8cc1Swenshuai.xi             if (E_HVD_BURST_CNT_DISABLE != (HVD_MIU_Burst_Cnt_Ctrl) pCtrl->Settings.u32MiuBurstLevel)
1673*53ee8cc1Swenshuai.xi             {
1674*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_MIU_BURST_CNT, pCtrl->Settings.u32MiuBurstLevel);
1675*53ee8cc1Swenshuai.xi             }
1676*53ee8cc1Swenshuai.xi 
1677*53ee8cc1Swenshuai.xi             //HAL_HVD_EX_SetCmd(E_HVD_CMD_BLUE_SCREEN, FALSE);
1678*53ee8cc1Swenshuai.xi             pCtrl->bStepDecoding = 0;
1679*53ee8cc1Swenshuai.xi 
1680*53ee8cc1Swenshuai.xi             break;
1681*53ee8cc1Swenshuai.xi         }
1682*53ee8cc1Swenshuai.xi         case HVD_INIT_MAIN_FILE_RAW:
1683*53ee8cc1Swenshuai.xi         default:
1684*53ee8cc1Swenshuai.xi             pCtrl->bStepDecoding = 0;
1685*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PLAY, 0);
1686*53ee8cc1Swenshuai.xi             break;
1687*53ee8cc1Swenshuai.xi     }
1688*53ee8cc1Swenshuai.xi 
1689*53ee8cc1Swenshuai.xi     return eRst;
1690*53ee8cc1Swenshuai.xi }
1691*53ee8cc1Swenshuai.xi 
MDrv_HVD_checkISR(MS_U32 u32Id,MS_U8 u8DrvId,HWDEC_ISR_TYPE hwdec_Isr_type)1692*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_checkISR(MS_U32 u32Id, MS_U8 u8DrvId, HWDEC_ISR_TYPE hwdec_Isr_type)
1693*53ee8cc1Swenshuai.xi {
1694*53ee8cc1Swenshuai.xi     MS_U8 i = 0;
1695*53ee8cc1Swenshuai.xi     MS_BOOL bUsed = FALSE;
1696*53ee8cc1Swenshuai.xi     for(i = 0; i < HVD_MAX_STREAMS; i++)
1697*53ee8cc1Swenshuai.xi     {
1698*53ee8cc1Swenshuai.xi         if(i != u8DrvId)
1699*53ee8cc1Swenshuai.xi         {
1700*53ee8cc1Swenshuai.xi             if((hwdec_Isr_type == pHVDDrvContext->gHVDCtrl_EX[i].HVDISRCtrl.eHWDecIsr)
1701*53ee8cc1Swenshuai.xi             && (TRUE == pHVDDrvContext->gHVDCtrl_EX[i].bUsed))
1702*53ee8cc1Swenshuai.xi             {
1703*53ee8cc1Swenshuai.xi                 bUsed = TRUE;
1704*53ee8cc1Swenshuai.xi                 break;
1705*53ee8cc1Swenshuai.xi             }
1706*53ee8cc1Swenshuai.xi         }
1707*53ee8cc1Swenshuai.xi     }
1708*53ee8cc1Swenshuai.xi 
1709*53ee8cc1Swenshuai.xi     return bUsed;
1710*53ee8cc1Swenshuai.xi }
1711*53ee8cc1Swenshuai.xi 
_HVD_EX_Rst(MS_U32 u32Id,MS_BOOL bErrHandle)1712*53ee8cc1Swenshuai.xi HVD_EX_Result _HVD_EX_Rst(MS_U32 u32Id, MS_BOOL bErrHandle)
1713*53ee8cc1Swenshuai.xi {
1714*53ee8cc1Swenshuai.xi     HVD_EX_Result eRst = E_HVD_EX_RET_ILLEGAL_ACCESS;
1715*53ee8cc1Swenshuai.xi     MS_U8 u8Cidx = HAL_HVD_EX_GetCidx(u32Id);
1716*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1717*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
1718*53ee8cc1Swenshuai.xi 
1719*53ee8cc1Swenshuai.xi     if (bErrHandle == TRUE)
1720*53ee8cc1Swenshuai.xi     {
1721*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("HVD Not supported reset(TRUE) yet\n");
1722*53ee8cc1Swenshuai.xi         return E_HVD_EX_RET_INVALID_PARAMETER;
1723*53ee8cc1Swenshuai.xi     }
1724*53ee8cc1Swenshuai.xi 
1725*53ee8cc1Swenshuai.xi     pHVDDrvContext->bHVDIsIniting[u8DrvId] = TRUE;
1726*53ee8cc1Swenshuai.xi 
1727*53ee8cc1Swenshuai.xi #if (defined(CHIP_NAPOLI))
1728*53ee8cc1Swenshuai.xi     if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_RM)
1729*53ee8cc1Swenshuai.xi     {
1730*53ee8cc1Swenshuai.xi         if(!HAL_HVD_EX_Is_RM_Supported(u32Id))
1731*53ee8cc1Swenshuai.xi             return E_HVD_EX_RET_UNSUPPORTED;
1732*53ee8cc1Swenshuai.xi     }
1733*53ee8cc1Swenshuai.xi #endif
1734*53ee8cc1Swenshuai.xi 
1735*53ee8cc1Swenshuai.xi     // disable ISR when there is no one using ISR
1736*53ee8cc1Swenshuai.xi #if defined(HIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(HAL_CHIP_SUPPORT_EVD)
1737*53ee8cc1Swenshuai.xi     MS_BOOL bUsed;
1738*53ee8cc1Swenshuai.xi     #if defined(CHIP_KANO) || defined(CHIP_CURRY)
1739*53ee8cc1Swenshuai.xi     if (u8Cidx == HWDEC_EVD_LITE)
1740*53ee8cc1Swenshuai.xi     {
1741*53ee8cc1Swenshuai.xi         bUsed = MDrv_HVD_checkISR(u32Id, u8DrvId, E_HWDEC_ISR_EVDLITE);
1742*53ee8cc1Swenshuai.xi     }
1743*53ee8cc1Swenshuai.xi     else
1744*53ee8cc1Swenshuai.xi     #endif
1745*53ee8cc1Swenshuai.xi     if (((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_HEVC) || ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP9))
1746*53ee8cc1Swenshuai.xi     {
1747*53ee8cc1Swenshuai.xi         bUsed = MDrv_HVD_checkISR(u32Id, u8DrvId, E_HWDEC_ISR_EVD);
1748*53ee8cc1Swenshuai.xi     }
1749*53ee8cc1Swenshuai.xi     else
1750*53ee8cc1Swenshuai.xi     {
1751*53ee8cc1Swenshuai.xi         bUsed = MDrv_HVD_checkISR(u32Id, u8DrvId, E_HWDEC_ISR_HVD);
1752*53ee8cc1Swenshuai.xi     }
1753*53ee8cc1Swenshuai.xi 
1754*53ee8cc1Swenshuai.xi     if (bUsed == FALSE)
1755*53ee8cc1Swenshuai.xi         HAL_HVD_EX_EnableISR(u32Id, FALSE);
1756*53ee8cc1Swenshuai.xi #else
1757*53ee8cc1Swenshuai.xi     HAL_HVD_EX_EnableISR(FALSE);
1758*53ee8cc1Swenshuai.xi #endif
1759*53ee8cc1Swenshuai.xi 
1760*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1761*53ee8cc1Swenshuai.xi     HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
1762*53ee8cc1Swenshuai.xi #endif
1763*53ee8cc1Swenshuai.xi 
1764*53ee8cc1Swenshuai.xi     eRst = _HVD_EX_RstVariables(u32Id);
1765*53ee8cc1Swenshuai.xi 
1766*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_EX_OK)
1767*53ee8cc1Swenshuai.xi     {
1768*53ee8cc1Swenshuai.xi         goto DRV_HVD_Rst_Failed;
1769*53ee8cc1Swenshuai.xi     }
1770*53ee8cc1Swenshuai.xi 
1771*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1772*53ee8cc1Swenshuai.xi     HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
1773*53ee8cc1Swenshuai.xi #endif
1774*53ee8cc1Swenshuai.xi 
1775*53ee8cc1Swenshuai.xi #ifdef VDEC3
1776*53ee8cc1Swenshuai.xi     eRst = (HVD_EX_Result) HAL_HVD_EX_InitShareMem(u32Id, pHVDDrvContext->bFWdecideFB, pHVDDrvContext->bCMAUsed);
1777*53ee8cc1Swenshuai.xi #else
1778*53ee8cc1Swenshuai.xi     eRst = (HVD_EX_Result) HAL_HVD_EX_InitShareMem(u32Id);
1779*53ee8cc1Swenshuai.xi #endif
1780*53ee8cc1Swenshuai.xi 
1781*53ee8cc1Swenshuai.xi     if (E_HVD_EX_OK != eRst)
1782*53ee8cc1Swenshuai.xi     {
1783*53ee8cc1Swenshuai.xi         goto DRV_HVD_Rst_Failed;
1784*53ee8cc1Swenshuai.xi     }
1785*53ee8cc1Swenshuai.xi 
1786*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1787*53ee8cc1Swenshuai.xi     HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
1788*53ee8cc1Swenshuai.xi #endif
1789*53ee8cc1Swenshuai.xi #ifdef VDEC3
1790*53ee8cc1Swenshuai.xi     eRst = _HVD_EX_InitRegCPU(u32Id,pHVDDrvContext->bFWdecideFB);
1791*53ee8cc1Swenshuai.xi #else
1792*53ee8cc1Swenshuai.xi     eRst = _HVD_EX_InitRegCPU(u32Id);
1793*53ee8cc1Swenshuai.xi #endif
1794*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_EX_OK)
1795*53ee8cc1Swenshuai.xi     {
1796*53ee8cc1Swenshuai.xi         goto DRV_HVD_Rst_Failed;
1797*53ee8cc1Swenshuai.xi     }
1798*53ee8cc1Swenshuai.xi 
1799*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1800*53ee8cc1Swenshuai.xi     HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
1801*53ee8cc1Swenshuai.xi #endif
1802*53ee8cc1Swenshuai.xi 
1803*53ee8cc1Swenshuai.xi     eRst = _HVD_EX_InitFW(u32Id);
1804*53ee8cc1Swenshuai.xi 
1805*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_EX_OK)
1806*53ee8cc1Swenshuai.xi     {
1807*53ee8cc1Swenshuai.xi         goto DRV_HVD_Rst_Failed;
1808*53ee8cc1Swenshuai.xi     }
1809*53ee8cc1Swenshuai.xi 
1810*53ee8cc1Swenshuai.xi     eRst = E_HVD_EX_OK;
1811*53ee8cc1Swenshuai.xi 
1812*53ee8cc1Swenshuai.xi DRV_HVD_Rst_Failed:
1813*53ee8cc1Swenshuai.xi     // disable ISR when there is no one using ISR
1814*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(HAL_CHIP_SUPPORT_EVD)
1815*53ee8cc1Swenshuai.xi     bUsed = FALSE;
1816*53ee8cc1Swenshuai.xi     #if defined(CHIP_KANO) || defined(CHIP_CURRY)
1817*53ee8cc1Swenshuai.xi     if (u8Cidx == HWDEC_EVD_LITE)
1818*53ee8cc1Swenshuai.xi     {
1819*53ee8cc1Swenshuai.xi         bUsed = MDrv_HVD_checkISR(u32Id, u8DrvId, E_HWDEC_ISR_EVDLITE);
1820*53ee8cc1Swenshuai.xi     }
1821*53ee8cc1Swenshuai.xi     else
1822*53ee8cc1Swenshuai.xi     #endif
1823*53ee8cc1Swenshuai.xi     if (((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_HEVC) || ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP9))
1824*53ee8cc1Swenshuai.xi     {
1825*53ee8cc1Swenshuai.xi         bUsed = MDrv_HVD_checkISR(u32Id, u8DrvId, E_HWDEC_ISR_EVD);
1826*53ee8cc1Swenshuai.xi     }
1827*53ee8cc1Swenshuai.xi     else
1828*53ee8cc1Swenshuai.xi     {
1829*53ee8cc1Swenshuai.xi         bUsed = MDrv_HVD_checkISR(u32Id, u8DrvId, E_HWDEC_ISR_HVD);
1830*53ee8cc1Swenshuai.xi     }
1831*53ee8cc1Swenshuai.xi 
1832*53ee8cc1Swenshuai.xi     if (bUsed == FALSE)
1833*53ee8cc1Swenshuai.xi         HAL_HVD_EX_EnableISR(u32Id, FALSE);
1834*53ee8cc1Swenshuai.xi #else
1835*53ee8cc1Swenshuai.xi     HAL_HVD_EX_EnableISR(pCtrl->Settings.bEnISR);
1836*53ee8cc1Swenshuai.xi #endif
1837*53ee8cc1Swenshuai.xi     pHVDDrvContext->bHVDIsIniting[u8DrvId] = FALSE;
1838*53ee8cc1Swenshuai.xi 
1839*53ee8cc1Swenshuai.xi #if defined(SUPPORT_CMA)
1840*53ee8cc1Swenshuai.xi     if (pHVDDrvContext->bCMAUsed)
1841*53ee8cc1Swenshuai.xi     {
1842*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_CMA_USED, 1);
1843*53ee8cc1Swenshuai.xi         /*if (((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_HEVC) ||
1844*53ee8cc1Swenshuai.xi             ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_VP9))
1845*53ee8cc1Swenshuai.xi         {
1846*53ee8cc1Swenshuai.xi             pHVDDrvContext->bCMATwoMIU[u8DrvId] = 1;
1847*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_CMA_TWO_MIU, 1);
1848*53ee8cc1Swenshuai.xi 
1849*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_DUAL_R2_CMD_FB2ADDR, pHVDDrvContext->cmaInitParam[1].heap_miu_start_offset);
1850*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetCmd(u32Id, E_DUAL_R2_CMD_FB2SIZE, pHVDDrvContext->cmaInitParam[1].heap_length);
1851*53ee8cc1Swenshuai.xi         }
1852*53ee8cc1Swenshuai.xi         else
1853*53ee8cc1Swenshuai.xi         {
1854*53ee8cc1Swenshuai.xi             pHVDDrvContext->bCMATwoMIU[u8DrvId] = 0;
1855*53ee8cc1Swenshuai.xi             HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_CMA_TWO_MIU, 0);
1856*53ee8cc1Swenshuai.xi         }*/
1857*53ee8cc1Swenshuai.xi 
1858*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetCmd(u32Id, E_DUAL_R2_CMD_FBADDR, pHVDDrvContext->cmaInitParam[0].heap_miu_start_offset);
1859*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetCmd(u32Id, E_DUAL_R2_CMD_FBSIZE, pHVDDrvContext->cmaInitParam[0].heap_length);
1860*53ee8cc1Swenshuai.xi     }
1861*53ee8cc1Swenshuai.xi #endif
1862*53ee8cc1Swenshuai.xi     return eRst;
1863*53ee8cc1Swenshuai.xi }
1864*53ee8cc1Swenshuai.xi 
_HVD_EX_GetDrvId(MS_U32 u32Id)1865*53ee8cc1Swenshuai.xi static MS_U8 _HVD_EX_GetDrvId(MS_U32 u32Id)
1866*53ee8cc1Swenshuai.xi {
1867*53ee8cc1Swenshuai.xi     return (0xFF & (u32Id >> 16));
1868*53ee8cc1Swenshuai.xi }
1869*53ee8cc1Swenshuai.xi 
_HVD_EX_GetDispInfo(MS_U32 u32Id,HVD_EX_DispInfo * pInfo,MS_BOOL bClearSeqChg)1870*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_GetDispInfo(MS_U32 u32Id, HVD_EX_DispInfo *pInfo, MS_BOOL bClearSeqChg)
1871*53ee8cc1Swenshuai.xi {
1872*53ee8cc1Swenshuai.xi     MS_U32 u32Seqtimes = 10;
1873*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
1874*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1875*53ee8cc1Swenshuai.xi     MS_VIRT u32DispInfoAddr = 0;
1876*53ee8cc1Swenshuai.xi 
1877*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
1878*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
1879*53ee8cc1Swenshuai.xi 
1880*53ee8cc1Swenshuai.xi     if (!(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode & HVD_CTRL_DISP_INFO_RDY))
1881*53ee8cc1Swenshuai.xi     {
1882*53ee8cc1Swenshuai.xi         if (MDrv_HVD_EX_CheckDispInfoRdy(u32Id) == E_HVD_EX_RET_NOTREADY)
1883*53ee8cc1Swenshuai.xi         {
1884*53ee8cc1Swenshuai.xi             return E_HVD_EX_RET_NOTREADY;
1885*53ee8cc1Swenshuai.xi         }
1886*53ee8cc1Swenshuai.xi     }
1887*53ee8cc1Swenshuai.xi 
1888*53ee8cc1Swenshuai.xi     if (pInfo == NULL)
1889*53ee8cc1Swenshuai.xi     {
1890*53ee8cc1Swenshuai.xi         return E_HVD_EX_RET_INVALID_PARAMETER;
1891*53ee8cc1Swenshuai.xi     }
1892*53ee8cc1Swenshuai.xi 
1893*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
1894*53ee8cc1Swenshuai.xi 
1895*53ee8cc1Swenshuai.xi     if (TRUE == bClearSeqChg)
1896*53ee8cc1Swenshuai.xi     {
1897*53ee8cc1Swenshuai.xi   HVD_GETDISPINFO_START:
1898*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_GET_DISP_INFO_START, 0);
1899*53ee8cc1Swenshuai.xi         u32DispInfoAddr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_INFO_ADDR);
1900*53ee8cc1Swenshuai.xi         if(u32DispInfoAddr == 0)
1901*53ee8cc1Swenshuai.xi         {
1902*53ee8cc1Swenshuai.xi             return E_HVD_EX_RET_NOTREADY;
1903*53ee8cc1Swenshuai.xi         }
1904*53ee8cc1Swenshuai.xi         HVD_memcpy((void *) pInfo, (void *) u32DispInfoAddr, sizeof(HVD_Display_Info));
1905*53ee8cc1Swenshuai.xi         //Check if another SeqChg occurs
1906*53ee8cc1Swenshuai.xi         if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_DISP_INFO_UNCOPYED))
1907*53ee8cc1Swenshuai.xi         {
1908*53ee8cc1Swenshuai.xi             u32Seqtimes--;
1909*53ee8cc1Swenshuai.xi             if (u32Seqtimes > 0)
1910*53ee8cc1Swenshuai.xi             {
1911*53ee8cc1Swenshuai.xi                 goto HVD_GETDISPINFO_START;
1912*53ee8cc1Swenshuai.xi             }
1913*53ee8cc1Swenshuai.xi             else
1914*53ee8cc1Swenshuai.xi             {
1915*53ee8cc1Swenshuai.xi                 HVD_EX_MSG_ERR("GetDispInfo Timeout:%d\n",
1916*53ee8cc1Swenshuai.xi                             (MS_S16) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_DISP_INFO_UNCOPYED));
1917*53ee8cc1Swenshuai.xi                 _DRV_HVD_EX_RET(u8DrvId, E_HVD_EX_RET_TIMEOUT);
1918*53ee8cc1Swenshuai.xi             }
1919*53ee8cc1Swenshuai.xi         }
1920*53ee8cc1Swenshuai.xi     }
1921*53ee8cc1Swenshuai.xi     else
1922*53ee8cc1Swenshuai.xi     {
1923*53ee8cc1Swenshuai.xi         u32DispInfoAddr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_INFO_ADDR);
1924*53ee8cc1Swenshuai.xi         if(u32DispInfoAddr == 0)
1925*53ee8cc1Swenshuai.xi         {
1926*53ee8cc1Swenshuai.xi             return E_HVD_EX_RET_NOTREADY;
1927*53ee8cc1Swenshuai.xi         }
1928*53ee8cc1Swenshuai.xi         HVD_memcpy((void *) pInfo, (void *)u32DispInfoAddr, sizeof(HVD_Display_Info));
1929*53ee8cc1Swenshuai.xi     }
1930*53ee8cc1Swenshuai.xi 
1931*53ee8cc1Swenshuai.xi     eRet = E_HVD_EX_OK;
1932*53ee8cc1Swenshuai.xi 
1933*53ee8cc1Swenshuai.xi     if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bIsDispInfoChg)
1934*53ee8cc1Swenshuai.xi     {
1935*53ee8cc1Swenshuai.xi         HVD_EX_MSG_DBG("u32FrameRate=%u, u8Interlace=%x, u16HorSize=%u, u16VerSize=%u, \
1936*53ee8cc1Swenshuai.xi u16Crop R/L=%u/%u, u16Crop B/T=%u/%u, u8AspectRate=%u, u16SarWidth=%u \
1937*53ee8cc1Swenshuai.xi u16SarHeight=%u, u16Pitch=%u, u8ColourPrimaries=%u\n",
1938*53ee8cc1Swenshuai.xi             pInfo->u32FrameRate,
1939*53ee8cc1Swenshuai.xi             pInfo->u8Interlace,
1940*53ee8cc1Swenshuai.xi             pInfo->u16HorSize,
1941*53ee8cc1Swenshuai.xi             pInfo->u16VerSize,
1942*53ee8cc1Swenshuai.xi             pInfo->u16CropRight, pInfo->u16CropLeft,
1943*53ee8cc1Swenshuai.xi             pInfo->u16CropBottom, pInfo->u16CropTop,
1944*53ee8cc1Swenshuai.xi             pInfo->u8AspectRate,
1945*53ee8cc1Swenshuai.xi             pInfo->u16SarWidth,
1946*53ee8cc1Swenshuai.xi             pInfo->u16SarHeight,
1947*53ee8cc1Swenshuai.xi             pInfo->u16Pitch,
1948*53ee8cc1Swenshuai.xi             pInfo->u8ColourPrimaries);
1949*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bIsDispInfoChg = FALSE;
1950*53ee8cc1Swenshuai.xi     }
1951*53ee8cc1Swenshuai.xi 
1952*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
1953*53ee8cc1Swenshuai.xi }
1954*53ee8cc1Swenshuai.xi 
_HVD_EX_ReportLow32BitPTS(MS_U32 u32Id,MS_U32 u32PTS)1955*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_ReportLow32BitPTS(MS_U32 u32Id, MS_U32 u32PTS)
1956*53ee8cc1Swenshuai.xi {
1957*53ee8cc1Swenshuai.xi     MS_U32 u32RetPTS = u32PTS;
1958*53ee8cc1Swenshuai.xi     MS_U32 u32UpperInMs = (HVD_U32_MAX/90);
1959*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1960*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
1961*53ee8cc1Swenshuai.xi 
1962*53ee8cc1Swenshuai.xi     if(u32RetPTS != HVD_U32_MAX)
1963*53ee8cc1Swenshuai.xi     {
1964*53ee8cc1Swenshuai.xi         if (pCtrl->InitParams.u8TimeUnit)
1965*53ee8cc1Swenshuai.xi         {
1966*53ee8cc1Swenshuai.xi             //unit: ms
1967*53ee8cc1Swenshuai.xi             if (u32RetPTS > u32UpperInMs)
1968*53ee8cc1Swenshuai.xi             {
1969*53ee8cc1Swenshuai.xi                 u32RetPTS = u32RetPTS - u32UpperInMs;
1970*53ee8cc1Swenshuai.xi             }
1971*53ee8cc1Swenshuai.xi         }
1972*53ee8cc1Swenshuai.xi         else
1973*53ee8cc1Swenshuai.xi         {
1974*53ee8cc1Swenshuai.xi             //unit: 90KHz, bit 33 is not included in u32PTS, no need to handle
1975*53ee8cc1Swenshuai.xi         }
1976*53ee8cc1Swenshuai.xi     }
1977*53ee8cc1Swenshuai.xi     return u32RetPTS;
1978*53ee8cc1Swenshuai.xi }
1979*53ee8cc1Swenshuai.xi 
_HVD_EX_Map2HVDErrCode(MS_U32 u32ErrCode)1980*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_Map2HVDErrCode(MS_U32 u32ErrCode)
1981*53ee8cc1Swenshuai.xi {
1982*53ee8cc1Swenshuai.xi 
1983*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=E_HVD_EX_ERRCODE_GENERAL_BASE;
1984*53ee8cc1Swenshuai.xi 
1985*53ee8cc1Swenshuai.xi 
1986*53ee8cc1Swenshuai.xi     switch (u32ErrCode)
1987*53ee8cc1Swenshuai.xi     {
1988*53ee8cc1Swenshuai.xi         case E_HVD_ERR_OUT_OF_SPEC:
1989*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_OUT_OF_SPEC;
1990*53ee8cc1Swenshuai.xi             break;
1991*53ee8cc1Swenshuai.xi         case E_HVD_ERR_UNKNOW_ERR:
1992*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_UNKNOW_ERR;
1993*53ee8cc1Swenshuai.xi             break;
1994*53ee8cc1Swenshuai.xi         case E_HVD_ERR_HW_BREAK_DOWN:
1995*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_HW_BREAK_DOWN;
1996*53ee8cc1Swenshuai.xi             break;
1997*53ee8cc1Swenshuai.xi         case E_HVD_ERR_HW_DEC_TIMEOUT:
1998*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_HW_DEC_TIMEOUT;
1999*53ee8cc1Swenshuai.xi             break;
2000*53ee8cc1Swenshuai.xi         case E_HVD_ERR_OUT_OF_MEMORY:
2001*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_OUT_OF_MEMORY;
2002*53ee8cc1Swenshuai.xi             break;
2003*53ee8cc1Swenshuai.xi         case E_HVD_ERR_UNKNOWN_CODEC:
2004*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_UNKNOWN_CODEC;
2005*53ee8cc1Swenshuai.xi             break;
2006*53ee8cc1Swenshuai.xi         case E_HVD_ERR_RES_NOT_SUPPORT:
2007*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_RES_NOT_SUPPORT;
2008*53ee8cc1Swenshuai.xi             break;
2009*53ee8cc1Swenshuai.xi         case E_HVD_ERR_AVC_SPS_BROKEN:
2010*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_AVC_SPS_BROKEN;
2011*53ee8cc1Swenshuai.xi             break;
2012*53ee8cc1Swenshuai.xi         case E_HVD_ERR_AVC_SPS_NOT_IN_SPEC:
2013*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_AVC_SPS_NOT_IN_SPEC;
2014*53ee8cc1Swenshuai.xi             break;
2015*53ee8cc1Swenshuai.xi         case E_HVD_ERR_AVC_SPS_NOT_ENOUGH_FRM:
2016*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_AVC_SPS_NOT_ENOUGH_FRM;
2017*53ee8cc1Swenshuai.xi             break;
2018*53ee8cc1Swenshuai.xi         case E_HVD_ERR_AVC_PPS_BROKEN:
2019*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_AVC_PPS_BROKEN;
2020*53ee8cc1Swenshuai.xi             break;
2021*53ee8cc1Swenshuai.xi         case E_HVD_ERR_AVC_REF_LIST:
2022*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_AVC_REF_LIST;
2023*53ee8cc1Swenshuai.xi             break;
2024*53ee8cc1Swenshuai.xi         case E_HVD_ERR_AVC_NO_REF:
2025*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_AVC_NO_REF;
2026*53ee8cc1Swenshuai.xi             break;
2027*53ee8cc1Swenshuai.xi         case E_HVD_ERR_AVC_RES:
2028*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_AVC_RES;
2029*53ee8cc1Swenshuai.xi             break;
2030*53ee8cc1Swenshuai.xi         case E_HVD_ERR_AVS_RES:
2031*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_AVS_RES;
2032*53ee8cc1Swenshuai.xi             break;
2033*53ee8cc1Swenshuai.xi         case E_HVD_ERR_RM_PACKET_HEADER:
2034*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_RM_PACKET_HEADER;
2035*53ee8cc1Swenshuai.xi             break;
2036*53ee8cc1Swenshuai.xi         case E_HVD_ERR_RM_FRAME_HEADER:
2037*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_RM_FRAME_HEADER;
2038*53ee8cc1Swenshuai.xi             break;
2039*53ee8cc1Swenshuai.xi         case E_HVD_ERR_RM_SLICE_HEADER:
2040*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_RM_SLICE_HEADER;
2041*53ee8cc1Swenshuai.xi             break;
2042*53ee8cc1Swenshuai.xi         case E_HVD_ERR_RM_BYTE_CNT:
2043*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_RM_BYTE_CNT;
2044*53ee8cc1Swenshuai.xi             break;
2045*53ee8cc1Swenshuai.xi         case E_HVD_ERR_RM_DISP_TIMEOUT:
2046*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_RM_DISP_TIMEOUT;
2047*53ee8cc1Swenshuai.xi             break;
2048*53ee8cc1Swenshuai.xi         case E_HVD_ERR_RM_NO_REF:
2049*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_RM_NO_REF;
2050*53ee8cc1Swenshuai.xi             break;
2051*53ee8cc1Swenshuai.xi         case E_HVD_ERR_RM_RES:
2052*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_RM_RES;
2053*53ee8cc1Swenshuai.xi             break;
2054*53ee8cc1Swenshuai.xi         case E_HVD_ERR_RM_VLC:
2055*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_RM_VLC;
2056*53ee8cc1Swenshuai.xi             break;
2057*53ee8cc1Swenshuai.xi         case E_HVD_ERR_RM_SIZE_OUT_FB_LAYOUT:
2058*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ERRCODE_RM_SIZE_OUT_FB_LAYOUT;
2059*53ee8cc1Swenshuai.xi             break;
2060*53ee8cc1Swenshuai.xi         default:
2061*53ee8cc1Swenshuai.xi             break;
2062*53ee8cc1Swenshuai.xi     }
2063*53ee8cc1Swenshuai.xi     return u32Ret;
2064*53ee8cc1Swenshuai.xi }
2065*53ee8cc1Swenshuai.xi 
_HVD_EX_Map2HVDESBufStatus(MS_U32 u32ESBufStatus)2066*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_Map2HVDESBufStatus(MS_U32 u32ESBufStatus)
2067*53ee8cc1Swenshuai.xi {
2068*53ee8cc1Swenshuai.xi 
2069*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = E_HVD_EX_ES_BUF_STATUS_UNKNOWN;
2070*53ee8cc1Swenshuai.xi 
2071*53ee8cc1Swenshuai.xi 
2072*53ee8cc1Swenshuai.xi     switch (u32ESBufStatus)
2073*53ee8cc1Swenshuai.xi     {
2074*53ee8cc1Swenshuai.xi         case E_HVD_ES_BUF_STATUS_UNDERFLOW:
2075*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ES_BUF_STATUS_UNDERFLOW;
2076*53ee8cc1Swenshuai.xi             break;
2077*53ee8cc1Swenshuai.xi         case E_HVD_ES_BUF_STATUS_OVERFLOW:
2078*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ES_BUF_STATUS_OVERFLOW;
2079*53ee8cc1Swenshuai.xi             break;
2080*53ee8cc1Swenshuai.xi         case E_HVD_ES_BUF_STATUS_NORMAL:
2081*53ee8cc1Swenshuai.xi             u32Ret = E_HVD_EX_ES_BUF_STATUS_NORMAL;
2082*53ee8cc1Swenshuai.xi             break;
2083*53ee8cc1Swenshuai.xi         default:
2084*53ee8cc1Swenshuai.xi             break;
2085*53ee8cc1Swenshuai.xi     }
2086*53ee8cc1Swenshuai.xi     return u32Ret;
2087*53ee8cc1Swenshuai.xi }
2088*53ee8cc1Swenshuai.xi 
_HVD_EX_GetMIUBase(MS_U8 u8DrvId,MS_U32 u32MIU)2089*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_GetMIUBase(MS_U8 u8DrvId, MS_U32 u32MIU)
2090*53ee8cc1Swenshuai.xi {
2091*53ee8cc1Swenshuai.xi     if (u32MIU == 1)
2092*53ee8cc1Swenshuai.xi         return pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU1BaseAddr;
2093*53ee8cc1Swenshuai.xi     else if (u32MIU == 2)
2094*53ee8cc1Swenshuai.xi         return pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU2BaseAddr;
2095*53ee8cc1Swenshuai.xi     else
2096*53ee8cc1Swenshuai.xi         return 0;
2097*53ee8cc1Swenshuai.xi }
2098*53ee8cc1Swenshuai.xi 
2099*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
2100*53ee8cc1Swenshuai.xi //  Global Functions
2101*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
2102*53ee8cc1Swenshuai.xi 
2103*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2104*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetOSRegBase()
2105*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set system register base
2106*53ee8cc1Swenshuai.xi /// @param -u32RegBaseAddr \b IN :  system register base
2107*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetOSRegBase(MS_VIRT u32RegBaseAddr)2108*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_SetOSRegBase(MS_VIRT u32RegBaseAddr)
2109*53ee8cc1Swenshuai.xi {
2110*53ee8cc1Swenshuai.xi     #if defined (__aarch64__)
2111*53ee8cc1Swenshuai.xi     HVD_EX_MSG_DBG("u32RiuBaseAddr=%lx\n", u32RegBaseAddr);
2112*53ee8cc1Swenshuai.xi     #else
2113*53ee8cc1Swenshuai.xi     HVD_EX_MSG_DBG("u32RiuBaseAddr=%x\n", u32RegBaseAddr);
2114*53ee8cc1Swenshuai.xi     #endif
2115*53ee8cc1Swenshuai.xi     HAL_HVD_EX_InitRegBase(u32RegBaseAddr);
2116*53ee8cc1Swenshuai.xi }
2117*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_SetCtrlsBase(MS_U32 u32Id)2118*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_SetCtrlsBase(MS_U32 u32Id)
2119*53ee8cc1Swenshuai.xi {
2120*53ee8cc1Swenshuai.xi     // for MJPEG, need to be modified later
2121*53ee8cc1Swenshuai.xi     MS_U8 u8Offset = HAL_VPU_EX_GetTaskId(u32Id);
2122*53ee8cc1Swenshuai.xi     UNUSED(u8Offset);
2123*53ee8cc1Swenshuai.xi     // The Driver Ctrl base should be set with parameter [0]
2124*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetDrvCtrlsBase(&(pHVDDrvContext->gHVDCtrl_EX[0]));
2125*53ee8cc1Swenshuai.xi 
2126*53ee8cc1Swenshuai.xi }
2127*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_MJPEG_InitSharemem(MS_U32 u32Id,MS_U32 u32CodeBufVAddr)2128*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_MJPEG_InitSharemem(MS_U32 u32Id, MS_U32 u32CodeBufVAddr)
2129*53ee8cc1Swenshuai.xi {
2130*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2131*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl1 = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
2132*53ee8cc1Swenshuai.xi     memset((void *) pCtrl1, 0, sizeof(HVD_EX_Drv_Ctrl));
2133*53ee8cc1Swenshuai.xi     pCtrl1->InitParams.u32ModeFlag |=HVD_INIT_HW_MJPEG;
2134*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufVAddr = u32CodeBufVAddr;
2135*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr = MS_VA2PA(u32CodeBufVAddr);
2136*53ee8cc1Swenshuai.xi     pHVDDrvContext->bHVDIsInited[u8DrvId] = TRUE;
2137*53ee8cc1Swenshuai.xi     HVD_Pre_Ctrl *pCtrl = &(pHVDDrvContext->gHVDPreCtrl[u8DrvId]);
2138*53ee8cc1Swenshuai.xi 
2139*53ee8cc1Swenshuai.xi     memset((void *) pCtrl, 0, sizeof(HVD_Pre_Ctrl));
2140*53ee8cc1Swenshuai.xi 
2141*53ee8cc1Swenshuai.xi     // PreSetControl
2142*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetPreCtrlVariables(u32Id,(MS_VIRT)(&pHVDDrvContext->gHVDPreCtrl[u8DrvId]));
2143*53ee8cc1Swenshuai.xi 
2144*53ee8cc1Swenshuai.xi     HVD_EX_MSG_INF("u8DrvId=%d, PA:[0x%lx, 0x%lx], VA:[0x%lx, 0x%lx], [0x%lx]\n", u8DrvId,
2145*53ee8cc1Swenshuai.xi 	(unsigned long)pHVDDrvContext->gHVDCtrl_EX[0].MemMap.u32CodeBufAddr,
2146*53ee8cc1Swenshuai.xi 	(unsigned long)pHVDDrvContext->gHVDCtrl_EX[1].MemMap.u32CodeBufAddr,
2147*53ee8cc1Swenshuai.xi 	(unsigned long)pHVDDrvContext->gHVDCtrl_EX[0].MemMap.u32CodeBufVAddr,
2148*53ee8cc1Swenshuai.xi 	(unsigned long)pHVDDrvContext->gHVDCtrl_EX[1].MemMap.u32CodeBufVAddr,
2149*53ee8cc1Swenshuai.xi 	(unsigned long)HAL_HVD_EX_GetShmAddr(u32Id));
2150*53ee8cc1Swenshuai.xi 
2151*53ee8cc1Swenshuai.xi #ifdef VDEC3
2152*53ee8cc1Swenshuai.xi     HAL_HVD_EX_InitShareMem(u32Id, FALSE, pHVDDrvContext->bCMAUsed); // FIXME
2153*53ee8cc1Swenshuai.xi #else
2154*53ee8cc1Swenshuai.xi     HAL_HVD_EX_InitShareMem(u32Id);
2155*53ee8cc1Swenshuai.xi #endif
2156*53ee8cc1Swenshuai.xi 
2157*53ee8cc1Swenshuai.xi }
2158*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_MJPEG_Exit(MS_U32 u32Id)2159*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_MJPEG_Exit(MS_U32 u32Id)
2160*53ee8cc1Swenshuai.xi {
2161*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2162*53ee8cc1Swenshuai.xi     MS_U8 u8HalIdx   = _HVD_EX_GetStreamIdx(u32Id);
2163*53ee8cc1Swenshuai.xi     pHVDDrvContext->bHVDIsInited[u8DrvId] = FALSE;
2164*53ee8cc1Swenshuai.xi     HAL_VPU_EX_ReleaseFreeStream(u8HalIdx);
2165*53ee8cc1Swenshuai.xi }
2166*53ee8cc1Swenshuai.xi 
MDrv_HVD_Init_Share_Mem(void)2167*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_Init_Share_Mem(void)
2168*53ee8cc1Swenshuai.xi {
2169*53ee8cc1Swenshuai.xi #if ((defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL) || defined(MSOS_TYPE_ECOS)) && (!defined(SUPPORT_X_MODEL_FEATURE)))
2170*53ee8cc1Swenshuai.xi     MS_U32 u32ShmId;
2171*53ee8cc1Swenshuai.xi     MS_VIRT u32Addr;
2172*53ee8cc1Swenshuai.xi     MS_U32 u32BufSize;
2173*53ee8cc1Swenshuai.xi 
2174*53ee8cc1Swenshuai.xi 
2175*53ee8cc1Swenshuai.xi     if (FALSE == MsOS_SHM_GetId( (MS_U8*)"Linux HVD driver",
2176*53ee8cc1Swenshuai.xi                                   sizeof(HVD_Drv_CTX),
2177*53ee8cc1Swenshuai.xi                                   &u32ShmId,
2178*53ee8cc1Swenshuai.xi                                   &u32Addr,
2179*53ee8cc1Swenshuai.xi                                   &u32BufSize,
2180*53ee8cc1Swenshuai.xi                                   MSOS_SHM_QUERY))
2181*53ee8cc1Swenshuai.xi     {
2182*53ee8cc1Swenshuai.xi         if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux HVD driver",
2183*53ee8cc1Swenshuai.xi                                      sizeof(HVD_Drv_CTX),
2184*53ee8cc1Swenshuai.xi                                      &u32ShmId,
2185*53ee8cc1Swenshuai.xi                                      &u32Addr,
2186*53ee8cc1Swenshuai.xi                                      &u32BufSize,
2187*53ee8cc1Swenshuai.xi                                      MSOS_SHM_CREATE))
2188*53ee8cc1Swenshuai.xi         {
2189*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("[%s]SHM allocation failed!!!use global structure instead!!!\n",__FUNCTION__);
2190*53ee8cc1Swenshuai.xi             if(pHVDDrvContext == NULL)
2191*53ee8cc1Swenshuai.xi             {
2192*53ee8cc1Swenshuai.xi                 pHVDDrvContext = &gHVDDrvContext;
2193*53ee8cc1Swenshuai.xi                 memset(pHVDDrvContext,0,sizeof(HVD_Drv_CTX));
2194*53ee8cc1Swenshuai.xi                 _HVD_EX_Context_Init();
2195*53ee8cc1Swenshuai.xi                 HVD_PRINT("[%s]Global structure init Success!!!\n",__FUNCTION__);
2196*53ee8cc1Swenshuai.xi             }
2197*53ee8cc1Swenshuai.xi             else
2198*53ee8cc1Swenshuai.xi             {
2199*53ee8cc1Swenshuai.xi                 HVD_PRINT("[%s]Global structure exists!!!\n",__FUNCTION__);
2200*53ee8cc1Swenshuai.xi             }
2201*53ee8cc1Swenshuai.xi             //return E_HVD_EX_FAIL;
2202*53ee8cc1Swenshuai.xi         }
2203*53ee8cc1Swenshuai.xi         else
2204*53ee8cc1Swenshuai.xi         {
2205*53ee8cc1Swenshuai.xi             memset((MS_U8*)u32Addr,0,sizeof(HVD_Drv_CTX));
2206*53ee8cc1Swenshuai.xi             pHVDDrvContext = (HVD_Drv_CTX*)u32Addr; // for one process
2207*53ee8cc1Swenshuai.xi             _HVD_EX_Context_Init();
2208*53ee8cc1Swenshuai.xi         }
2209*53ee8cc1Swenshuai.xi     }
2210*53ee8cc1Swenshuai.xi     else
2211*53ee8cc1Swenshuai.xi     {
2212*53ee8cc1Swenshuai.xi         pHVDDrvContext = (HVD_Drv_CTX*)u32Addr; // for another process
2213*53ee8cc1Swenshuai.xi     }
2214*53ee8cc1Swenshuai.xi #else
2215*53ee8cc1Swenshuai.xi     if(pHVDDrvContext == NULL)
2216*53ee8cc1Swenshuai.xi     {
2217*53ee8cc1Swenshuai.xi         pHVDDrvContext = &gHVDDrvContext;
2218*53ee8cc1Swenshuai.xi         memset(pHVDDrvContext,0,sizeof(HVD_Drv_CTX));
2219*53ee8cc1Swenshuai.xi         _HVD_EX_Context_Init();
2220*53ee8cc1Swenshuai.xi     }
2221*53ee8cc1Swenshuai.xi #endif
2222*53ee8cc1Swenshuai.xi 
2223*53ee8cc1Swenshuai.xi     if(HAL_HVD_EX_Init_Share_Mem() != TRUE)
2224*53ee8cc1Swenshuai.xi     {
2225*53ee8cc1Swenshuai.xi         return E_HVD_EX_FAIL;
2226*53ee8cc1Swenshuai.xi     }
2227*53ee8cc1Swenshuai.xi 
2228*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetDrvCtrlsBase(&(pHVDDrvContext->gHVDCtrl_EX[0]));
2229*53ee8cc1Swenshuai.xi 
2230*53ee8cc1Swenshuai.xi     if(HAL_VPU_EX_Init_Share_Mem() != TRUE)
2231*53ee8cc1Swenshuai.xi     {
2232*53ee8cc1Swenshuai.xi         return E_HVD_EX_FAIL;
2233*53ee8cc1Swenshuai.xi     }
2234*53ee8cc1Swenshuai.xi 
2235*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
2236*53ee8cc1Swenshuai.xi }
2237*53ee8cc1Swenshuai.xi 
2238*53ee8cc1Swenshuai.xi // Action
2239*53ee8cc1Swenshuai.xi #ifdef VDEC3
MDrv_HVD_EX_GetFreeStream(MS_U32 * pu32Id,HVD_EX_DRV_StreamType eStreamType,MS_BOOL bIsEVD,MS_BOOL bIsNStreamMode)2240*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetFreeStream(MS_U32 *pu32Id, HVD_EX_DRV_StreamType eStreamType, MS_BOOL bIsEVD, MS_BOOL bIsNStreamMode)
2241*53ee8cc1Swenshuai.xi #else
2242*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetFreeStream(MS_U32 *pu32Id, HVD_EX_DRV_StreamType eStreamType, MS_BOOL bIsEVD)
2243*53ee8cc1Swenshuai.xi #endif
2244*53ee8cc1Swenshuai.xi {
2245*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2246*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
2247*53ee8cc1Swenshuai.xi     MS_U32 u32VPUStreamId = 0;
2248*53ee8cc1Swenshuai.xi     MS_U32 u32HVDStreamId = 0;
2249*53ee8cc1Swenshuai.xi 
2250*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
2251*53ee8cc1Swenshuai.xi #ifndef VDEC3
2252*53ee8cc1Swenshuai.xi     //Get drvIdx
2253*53ee8cc1Swenshuai.xi     switch (eStreamType)
2254*53ee8cc1Swenshuai.xi     {
2255*53ee8cc1Swenshuai.xi         case E_HVD_EX_DRV_MAIN_STREAM:
2256*53ee8cc1Swenshuai.xi             i = 0;
2257*53ee8cc1Swenshuai.xi             break;
2258*53ee8cc1Swenshuai.xi         case E_HVD_EX_DRV_SUB_STREAM:
2259*53ee8cc1Swenshuai.xi             i = 1;
2260*53ee8cc1Swenshuai.xi             break;
2261*53ee8cc1Swenshuai.xi         case E_HVD_EX_DRV_MVC_STREAM:
2262*53ee8cc1Swenshuai.xi             i = 0;
2263*53ee8cc1Swenshuai.xi             break;
2264*53ee8cc1Swenshuai.xi         case E_HVD_EX_DRV_STREAM_NONE:
2265*53ee8cc1Swenshuai.xi         default:
2266*53ee8cc1Swenshuai.xi             i = HVD_MAX_STREAMS;
2267*53ee8cc1Swenshuai.xi             break;
2268*53ee8cc1Swenshuai.xi     }
2269*53ee8cc1Swenshuai.xi 
2270*53ee8cc1Swenshuai.xi     if (i == HVD_MAX_STREAMS)
2271*53ee8cc1Swenshuai.xi     {
2272*53ee8cc1Swenshuai.xi         return E_HVD_EX_FAIL;
2273*53ee8cc1Swenshuai.xi     }
2274*53ee8cc1Swenshuai.xi #endif
2275*53ee8cc1Swenshuai.xi     if (E_HVD_EX_DRV_MAIN_STREAM == eStreamType)
2276*53ee8cc1Swenshuai.xi     {
2277*53ee8cc1Swenshuai.xi #ifdef VDEC3
2278*53ee8cc1Swenshuai.xi         u32VPUStreamId = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_MAIN_STREAM, bIsEVD, bIsNStreamMode);
2279*53ee8cc1Swenshuai.xi         u32HVDStreamId = (MS_U32) HAL_HVD_EX_GetFreeStream(E_HAL_HVD_MAIN_STREAM, bIsEVD, bIsNStreamMode);
2280*53ee8cc1Swenshuai.xi #else
2281*53ee8cc1Swenshuai.xi         u32VPUStreamId = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_MAIN_STREAM, bIsEVD);
2282*53ee8cc1Swenshuai.xi         u32HVDStreamId = (MS_U32) HAL_HVD_EX_GetFreeStream(E_HAL_HVD_MAIN_STREAM, bIsEVD);
2283*53ee8cc1Swenshuai.xi #endif
2284*53ee8cc1Swenshuai.xi 
2285*53ee8cc1Swenshuai.xi         if(u32HVDStreamId == E_HAL_HVD_STREAM_NONE)
2286*53ee8cc1Swenshuai.xi         {
2287*53ee8cc1Swenshuai.xi             HAL_VPU_EX_ReleaseFreeStream(0);
2288*53ee8cc1Swenshuai.xi         }
2289*53ee8cc1Swenshuai.xi 
2290*53ee8cc1Swenshuai.xi         if (u32VPUStreamId && u32HVDStreamId)
2291*53ee8cc1Swenshuai.xi         {
2292*53ee8cc1Swenshuai.xi             *pu32Id = (i << 16 | u32HVDStreamId << 8 | u32VPUStreamId);
2293*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_OK;
2294*53ee8cc1Swenshuai.xi         }
2295*53ee8cc1Swenshuai.xi     }
2296*53ee8cc1Swenshuai.xi     else if (E_HVD_EX_DRV_SUB_STREAM == eStreamType)
2297*53ee8cc1Swenshuai.xi     {
2298*53ee8cc1Swenshuai.xi #ifdef VDEC3
2299*53ee8cc1Swenshuai.xi         u32VPUStreamId = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_SUB_STREAM, bIsEVD, bIsNStreamMode);
2300*53ee8cc1Swenshuai.xi #else
2301*53ee8cc1Swenshuai.xi         u32VPUStreamId = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_SUB_STREAM, bIsEVD);
2302*53ee8cc1Swenshuai.xi #endif
2303*53ee8cc1Swenshuai.xi         if(u32VPUStreamId == E_HAL_VPU_STREAM_NONE)
2304*53ee8cc1Swenshuai.xi         {
2305*53ee8cc1Swenshuai.xi             return E_HVD_EX_FAIL;
2306*53ee8cc1Swenshuai.xi         }
2307*53ee8cc1Swenshuai.xi #ifdef VDEC3
2308*53ee8cc1Swenshuai.xi         u32HVDStreamId = (MS_U32) HAL_HVD_EX_GetFreeStream(E_HAL_HVD_SUB_STREAM, bIsEVD, bIsNStreamMode);
2309*53ee8cc1Swenshuai.xi #else
2310*53ee8cc1Swenshuai.xi         u32HVDStreamId = (MS_U32) HAL_HVD_EX_GetFreeStream(E_HAL_HVD_SUB_STREAM, bIsEVD);
2311*53ee8cc1Swenshuai.xi #endif
2312*53ee8cc1Swenshuai.xi 
2313*53ee8cc1Swenshuai.xi         if(u32HVDStreamId == E_HAL_HVD_STREAM_NONE)
2314*53ee8cc1Swenshuai.xi         {
2315*53ee8cc1Swenshuai.xi             HAL_VPU_EX_ReleaseFreeStream(1);
2316*53ee8cc1Swenshuai.xi         }
2317*53ee8cc1Swenshuai.xi 
2318*53ee8cc1Swenshuai.xi         if (u32VPUStreamId && u32HVDStreamId)
2319*53ee8cc1Swenshuai.xi         {
2320*53ee8cc1Swenshuai.xi             *pu32Id = (i << 16 | u32HVDStreamId << 8 | u32VPUStreamId);
2321*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_OK;
2322*53ee8cc1Swenshuai.xi         }
2323*53ee8cc1Swenshuai.xi     }
2324*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
2325*53ee8cc1Swenshuai.xi     else if (E_HVD_EX_DRV_MVC_STREAM == eStreamType)
2326*53ee8cc1Swenshuai.xi     {
2327*53ee8cc1Swenshuai.xi #ifdef VDEC3
2328*53ee8cc1Swenshuai.xi         u32VPUStreamId = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_MVC_STREAM, bIsEVD, bIsNStreamMode);
2329*53ee8cc1Swenshuai.xi         u32HVDStreamId = (MS_U32) HAL_HVD_EX_GetFreeStream(E_HAL_HVD_MVC_STREAM, bIsEVD, bIsNStreamMode);
2330*53ee8cc1Swenshuai.xi #else
2331*53ee8cc1Swenshuai.xi         u32VPUStreamId = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_MVC_STREAM, bIsEVD);
2332*53ee8cc1Swenshuai.xi         u32HVDStreamId = (MS_U32) HAL_HVD_EX_GetFreeStream(E_HAL_HVD_MVC_STREAM, bIsEVD);
2333*53ee8cc1Swenshuai.xi #endif
2334*53ee8cc1Swenshuai.xi 
2335*53ee8cc1Swenshuai.xi         if(u32HVDStreamId == E_HAL_HVD_STREAM_NONE)
2336*53ee8cc1Swenshuai.xi         {
2337*53ee8cc1Swenshuai.xi             HAL_VPU_EX_ReleaseFreeStream(0);
2338*53ee8cc1Swenshuai.xi         }
2339*53ee8cc1Swenshuai.xi 
2340*53ee8cc1Swenshuai.xi         if (u32VPUStreamId && u32HVDStreamId)
2341*53ee8cc1Swenshuai.xi         {
2342*53ee8cc1Swenshuai.xi             *pu32Id = (i << 16 | u32HVDStreamId << 8 | u32VPUStreamId);
2343*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_OK;
2344*53ee8cc1Swenshuai.xi         }
2345*53ee8cc1Swenshuai.xi     }
2346*53ee8cc1Swenshuai.xi #endif
2347*53ee8cc1Swenshuai.xi #ifdef VDEC3
2348*53ee8cc1Swenshuai.xi     else if ((eStreamType >=  E_HVD_EX_DRV_N_STREAM) && (eStreamType < E_HVD_EX_DRV_N_STREAM + HVD_MAX_STREAMS))
2349*53ee8cc1Swenshuai.xi     {
2350*53ee8cc1Swenshuai.xi         u32VPUStreamId = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_N_STREAM + (eStreamType - E_HVD_EX_DRV_N_STREAM), bIsEVD, bIsNStreamMode);
2351*53ee8cc1Swenshuai.xi         u32HVDStreamId = (MS_U32) HAL_HVD_EX_GetFreeStream(E_HAL_HVD_N_STREAM + (eStreamType - E_HVD_EX_DRV_N_STREAM), bIsEVD, bIsNStreamMode);
2352*53ee8cc1Swenshuai.xi 
2353*53ee8cc1Swenshuai.xi         if(u32HVDStreamId == E_HAL_HVD_STREAM_NONE)
2354*53ee8cc1Swenshuai.xi         {
2355*53ee8cc1Swenshuai.xi             HAL_VPU_EX_ReleaseFreeStream(eStreamType - E_HVD_EX_DRV_N_STREAM);
2356*53ee8cc1Swenshuai.xi         }
2357*53ee8cc1Swenshuai.xi 
2358*53ee8cc1Swenshuai.xi         if (u32VPUStreamId && u32HVDStreamId)
2359*53ee8cc1Swenshuai.xi         {
2360*53ee8cc1Swenshuai.xi             *pu32Id = ((u32HVDStreamId & 0x0F) << 16 | u32HVDStreamId << 8 | u32VPUStreamId);
2361*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_OK;
2362*53ee8cc1Swenshuai.xi         }
2363*53ee8cc1Swenshuai.xi     }
2364*53ee8cc1Swenshuai.xi #endif
2365*53ee8cc1Swenshuai.xi     else
2366*53ee8cc1Swenshuai.xi     {
2367*53ee8cc1Swenshuai.xi         HVD_PRINT("%s:%s:Stream type=%d is unexpected\n", __FILE__, __FUNCTION__, eStreamType);
2368*53ee8cc1Swenshuai.xi     }
2369*53ee8cc1Swenshuai.xi 
2370*53ee8cc1Swenshuai.xi     return eRet;
2371*53ee8cc1Swenshuai.xi }
2372*53ee8cc1Swenshuai.xi 
2373*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2374*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Init()
2375*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  HVD driver initialization
2376*53ee8cc1Swenshuai.xi /// @param -pStMemCfg \b IN :  pointer to the memory config of HVD driver
2377*53ee8cc1Swenshuai.xi /// @param -pStInitSettings \b IN :  Initialization of HVD driver
2378*53ee8cc1Swenshuai.xi /// @return -The result of initialization process
2379*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2380*53ee8cc1Swenshuai.xi #ifdef VDEC3
MDrv_HVD_EX_Init(MS_U32 u32Id,HVD_EX_MemCfg * pStMemCfg,HVD_EX_InitSettings * pStInitSettings,MS_BOOL bFWdecideFB,MS_BOOL bDRVdecideBS)2381*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Init(MS_U32 u32Id, HVD_EX_MemCfg *pStMemCfg, HVD_EX_InitSettings *pStInitSettings, MS_BOOL bFWdecideFB, MS_BOOL bDRVdecideBS)
2382*53ee8cc1Swenshuai.xi #else
2383*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Init(MS_U32 u32Id, HVD_EX_MemCfg *pStMemCfg, HVD_EX_InitSettings *pStInitSettings)
2384*53ee8cc1Swenshuai.xi #endif
2385*53ee8cc1Swenshuai.xi {
2386*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_FAIL;
2387*53ee8cc1Swenshuai.xi     MS_U8 u8Cidx = HAL_HVD_EX_GetCidx(u32Id);
2388*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2389*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
2390*53ee8cc1Swenshuai.xi 
2391*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
2392*53ee8cc1Swenshuai.xi 
2393*53ee8cc1Swenshuai.xi #ifdef VDEC3
2394*53ee8cc1Swenshuai.xi     pHVDDrvContext->bFWdecideFB = bFWdecideFB;
2395*53ee8cc1Swenshuai.xi #endif
2396*53ee8cc1Swenshuai.xi 
2397*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
2398*53ee8cc1Swenshuai.xi     pHVDDrvContext->u32InitSysTimeBase[u8DrvId] = HVD_GetSysTime_ms();
2399*53ee8cc1Swenshuai.xi #endif
2400*53ee8cc1Swenshuai.xi 
2401*53ee8cc1Swenshuai.xi     if ((pStMemCfg == NULL) || (pStInitSettings == NULL))
2402*53ee8cc1Swenshuai.xi     {
2403*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("Init params are invalid\n");
2404*53ee8cc1Swenshuai.xi         return E_HVD_EX_RET_INVALID_PARAMETER;
2405*53ee8cc1Swenshuai.xi     }
2406*53ee8cc1Swenshuai.xi #ifndef CONFIG_MBOOT  //Add For GPL (content protection)
2407*53ee8cc1Swenshuai.xi     if(_MDrv_HVD_AUTH_IPCheck(pStInitSettings->u32ModeFlag) == FALSE)
2408*53ee8cc1Swenshuai.xi     {
2409*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("[%s]User using invaild key !!!\n",__FUNCTION__);
2410*53ee8cc1Swenshuai.xi         return E_HVD_EX_RET_INVALID_PARAMETER;
2411*53ee8cc1Swenshuai.xi     }
2412*53ee8cc1Swenshuai.xi #endif
2413*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetDrvCtrlsBase(&(pHVDDrvContext->gHVDCtrl_EX[0]));
2414*53ee8cc1Swenshuai.xi 
2415*53ee8cc1Swenshuai.xi #if HVD_ENABLE_AUTO_SET_REG_BASE
2416*53ee8cc1Swenshuai.xi     {
2417*53ee8cc1Swenshuai.xi         MS_PHY  u32NonPMBankSize = 0;
2418*53ee8cc1Swenshuai.xi         MS_VIRT u32RiuBaseAdd = 0;
2419*53ee8cc1Swenshuai.xi 
2420*53ee8cc1Swenshuai.xi         if (!MDrv_MMIO_GetBASE(&u32RiuBaseAdd, &u32NonPMBankSize, MS_MODULE_HW))
2421*53ee8cc1Swenshuai.xi         {
2422*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("MMIO_GetBASE failure\n");
2423*53ee8cc1Swenshuai.xi             return eRet;
2424*53ee8cc1Swenshuai.xi         }
2425*53ee8cc1Swenshuai.xi         else
2426*53ee8cc1Swenshuai.xi         {
2427*53ee8cc1Swenshuai.xi             HVD_EX_MSG_DBG("u32RiuBaseAdd=0x%lx\n", (unsigned long)u32RiuBaseAdd);
2428*53ee8cc1Swenshuai.xi             HAL_HVD_EX_InitRegBase(u32RiuBaseAdd);
2429*53ee8cc1Swenshuai.xi         }
2430*53ee8cc1Swenshuai.xi 
2431*53ee8cc1Swenshuai.xi         #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(HAL_CHIP_SUPPORT_EVD)
2432*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetHwRegBase(u32Id, pStInitSettings->u32ModeFlag); //HVD or EVD
2433*53ee8cc1Swenshuai.xi         #endif
2434*53ee8cc1Swenshuai.xi     }
2435*53ee8cc1Swenshuai.xi #endif
2436*53ee8cc1Swenshuai.xi 
2437*53ee8cc1Swenshuai.xi     HVD_EX_MSG_DBG("system call type: Mutex:%d clock:%d delay:%d asm_sync:%d\n",
2438*53ee8cc1Swenshuai.xi                  HVD_ENABLE_MUTEX_PROTECT, HVD_SYSTEM_CLOCK_TYPE, HVD_SYSTEM_DELAY_MS_TYPE, HVD_MEMORY_BARRIER_TYPE);
2439*53ee8cc1Swenshuai.xi 
2440*53ee8cc1Swenshuai.xi     if (u32UartCtrl & E_HVD_UART_CTRL_INFO)
2441*53ee8cc1Swenshuai.xi     {
2442*53ee8cc1Swenshuai.xi         MS_U32 u32delaytime = 5;
2443*53ee8cc1Swenshuai.xi         MS_U32 u32FirstTime = HVD_GetSysTime_ms();
2444*53ee8cc1Swenshuai.xi         MS_U32 u32SecondTime = 0;
2445*53ee8cc1Swenshuai.xi 
2446*53ee8cc1Swenshuai.xi         HVD_Delay_ms(u32delaytime);
2447*53ee8cc1Swenshuai.xi         u32SecondTime = HVD_GetSysTime_ms();
2448*53ee8cc1Swenshuai.xi 
2449*53ee8cc1Swenshuai.xi         HVD_EX_MSG_DBG("MSOS API check: 1st:%u 2nd:%u delay:%u dif:%u\n",
2450*53ee8cc1Swenshuai.xi                      u32FirstTime, u32SecondTime, u32delaytime, u32SecondTime - u32FirstTime);
2451*53ee8cc1Swenshuai.xi     }
2452*53ee8cc1Swenshuai.xi 
2453*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
2454*53ee8cc1Swenshuai.xi     HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
2455*53ee8cc1Swenshuai.xi #endif
2456*53ee8cc1Swenshuai.xi 
2457*53ee8cc1Swenshuai.xi     if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bUsed)
2458*53ee8cc1Swenshuai.xi     {
2459*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("re-init HVD Driver\n");
2460*53ee8cc1Swenshuai.xi 
2461*53ee8cc1Swenshuai.xi #if HVD_ENABLE_REINIT_FAILED
2462*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_RET_RE_INIT;
2463*53ee8cc1Swenshuai.xi         return eRet;
2464*53ee8cc1Swenshuai.xi #endif
2465*53ee8cc1Swenshuai.xi     }
2466*53ee8cc1Swenshuai.xi 
2467*53ee8cc1Swenshuai.xi     // disable ISR when there is no one using ISR
2468*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(HAL_CHIP_SUPPORT_EVD)
2469*53ee8cc1Swenshuai.xi     MS_BOOL bUsed;
2470*53ee8cc1Swenshuai.xi     #if defined(CHIP_KANO) || defined(CHIP_CURRY)
2471*53ee8cc1Swenshuai.xi     if (u8Cidx == HWDEC_EVD_LITE)
2472*53ee8cc1Swenshuai.xi     {
2473*53ee8cc1Swenshuai.xi         bUsed = MDrv_HVD_checkISR(u32Id, u8DrvId, E_HWDEC_ISR_EVDLITE);
2474*53ee8cc1Swenshuai.xi     }
2475*53ee8cc1Swenshuai.xi     else
2476*53ee8cc1Swenshuai.xi     #endif
2477*53ee8cc1Swenshuai.xi     if (((pStInitSettings->u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_HEVC) || ((pStInitSettings->u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP9))
2478*53ee8cc1Swenshuai.xi     {
2479*53ee8cc1Swenshuai.xi         bUsed = MDrv_HVD_checkISR(u32Id, u8DrvId, E_HWDEC_ISR_EVD);
2480*53ee8cc1Swenshuai.xi     }
2481*53ee8cc1Swenshuai.xi     else
2482*53ee8cc1Swenshuai.xi     {
2483*53ee8cc1Swenshuai.xi         bUsed = MDrv_HVD_checkISR(u32Id, u8DrvId, E_HWDEC_ISR_HVD);
2484*53ee8cc1Swenshuai.xi     }
2485*53ee8cc1Swenshuai.xi 
2486*53ee8cc1Swenshuai.xi     if (bUsed == FALSE)
2487*53ee8cc1Swenshuai.xi         HAL_HVD_EX_EnableISR(u32Id, FALSE);
2488*53ee8cc1Swenshuai.xi #else
2489*53ee8cc1Swenshuai.xi     HAL_HVD_EX_EnableISR(FALSE);
2490*53ee8cc1Swenshuai.xi #endif
2491*53ee8cc1Swenshuai.xi     // For TEE
2492*53ee8cc1Swenshuai.xi     _HVD_EX_SetShareInfoAddr(u32Id);
2493*53ee8cc1Swenshuai.xi 
2494*53ee8cc1Swenshuai.xi     eRet = _HVD_EX_InitVariables(u32Id, pStMemCfg, (HVD_Init_Params *) pStInitSettings);
2495*53ee8cc1Swenshuai.xi 
2496*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
2497*53ee8cc1Swenshuai.xi     {
2498*53ee8cc1Swenshuai.xi         return eRet;
2499*53ee8cc1Swenshuai.xi     }
2500*53ee8cc1Swenshuai.xi 
2501*53ee8cc1Swenshuai.xi #ifdef VDEC3
2502*53ee8cc1Swenshuai.xi     pCtrl->bNStreamMode = bDRVdecideBS;
2503*53ee8cc1Swenshuai.xi #endif
2504*53ee8cc1Swenshuai.xi 
2505*53ee8cc1Swenshuai.xi #if SUPPORT_EVD
2506*53ee8cc1Swenshuai.xi #if defined(CHIP_KANO) || defined(CHIP_CURRY)
2507*53ee8cc1Swenshuai.xi     if (u8Cidx == HWDEC_EVD_LITE)
2508*53ee8cc1Swenshuai.xi     {
2509*53ee8cc1Swenshuai.xi         pCtrl->HVDISRCtrl.eHWDecIsr = E_HWDEC_ISR_EVDLITE;
2510*53ee8cc1Swenshuai.xi     }
2511*53ee8cc1Swenshuai.xi     else
2512*53ee8cc1Swenshuai.xi #endif
2513*53ee8cc1Swenshuai.xi     if ((pStInitSettings->u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_HEVC)
2514*53ee8cc1Swenshuai.xi     {
2515*53ee8cc1Swenshuai.xi         pCtrl->HVDISRCtrl.eHWDecIsr = E_HWDEC_ISR_EVD;
2516*53ee8cc1Swenshuai.xi     }
2517*53ee8cc1Swenshuai.xi #if SUPPORT_G2VP9
2518*53ee8cc1Swenshuai.xi     else if((pStInitSettings->u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP9)
2519*53ee8cc1Swenshuai.xi     {
2520*53ee8cc1Swenshuai.xi         pCtrl->HVDISRCtrl.eHWDecIsr = E_HWDEC_ISR_G2VP9;
2521*53ee8cc1Swenshuai.xi     }
2522*53ee8cc1Swenshuai.xi #endif
2523*53ee8cc1Swenshuai.xi #if SUPPORT_MSVP9
2524*53ee8cc1Swenshuai.xi     else if((pStInitSettings->u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP9)
2525*53ee8cc1Swenshuai.xi     {
2526*53ee8cc1Swenshuai.xi         pCtrl->HVDISRCtrl.eHWDecIsr = E_HWDEC_ISR_EVD;
2527*53ee8cc1Swenshuai.xi     }
2528*53ee8cc1Swenshuai.xi #endif
2529*53ee8cc1Swenshuai.xi     else
2530*53ee8cc1Swenshuai.xi #endif
2531*53ee8cc1Swenshuai.xi     {
2532*53ee8cc1Swenshuai.xi         pCtrl->HVDISRCtrl.eHWDecIsr = E_HWDEC_ISR_HVD;
2533*53ee8cc1Swenshuai.xi     }
2534*53ee8cc1Swenshuai.xi 
2535*53ee8cc1Swenshuai.xi 
2536*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
2537*53ee8cc1Swenshuai.xi     HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
2538*53ee8cc1Swenshuai.xi #endif
2539*53ee8cc1Swenshuai.xi 
2540*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
2541*53ee8cc1Swenshuai.xi 
2542*53ee8cc1Swenshuai.xi     eRet = _HVD_EX_Check_Cmd(u32Id, E_HVD_CHECK_CMD_INIT);
2543*53ee8cc1Swenshuai.xi 
2544*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
2545*53ee8cc1Swenshuai.xi     {
2546*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
2547*53ee8cc1Swenshuai.xi     }
2548*53ee8cc1Swenshuai.xi 
2549*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
2550*53ee8cc1Swenshuai.xi     HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
2551*53ee8cc1Swenshuai.xi #endif
2552*53ee8cc1Swenshuai.xi 
2553*53ee8cc1Swenshuai.xi #ifdef VDEC3
2554*53ee8cc1Swenshuai.xi #if SUPPORT_G2VP9
2555*53ee8cc1Swenshuai.xi     HAL_VPU_EX_SetBitstreamBufAddress(u32Id, pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32TotalBitstreamBufAddr);
2556*53ee8cc1Swenshuai.xi #endif
2557*53ee8cc1Swenshuai.xi 
2558*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32BBUId = HAL_HVD_EX_GetBBUId(u32Id);
2559*53ee8cc1Swenshuai.xi 
2560*53ee8cc1Swenshuai.xi     if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32BBUId == HAL_HVD_INVALID_BBU_ID)
2561*53ee8cc1Swenshuai.xi     {
2562*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_FAIL;
2563*53ee8cc1Swenshuai.xi 
2564*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("driver init failed due to no valid bbu id.\n");
2565*53ee8cc1Swenshuai.xi 
2566*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
2567*53ee8cc1Swenshuai.xi     }
2568*53ee8cc1Swenshuai.xi #endif
2569*53ee8cc1Swenshuai.xi 
2570*53ee8cc1Swenshuai.xi     eRet = _HVD_EX_Init_(u32Id,pStInitSettings->u32ModeFlag);
2571*53ee8cc1Swenshuai.xi 
2572*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
2573*53ee8cc1Swenshuai.xi     {
2574*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
2575*53ee8cc1Swenshuai.xi     }
2576*53ee8cc1Swenshuai.xi 
2577*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
2578*53ee8cc1Swenshuai.xi     HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
2579*53ee8cc1Swenshuai.xi #endif
2580*53ee8cc1Swenshuai.xi 
2581*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32DummyWriteBuf = MsOS_PA2KSEG1(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr + HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_DUMMY_WRITE_ADDR));
2582*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode |= HVD_CTRL_INIT_FINISHED;
2583*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bUsed = TRUE;
2584*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32Sid = u32Id;
2585*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
2586*53ee8cc1Swenshuai.xi     if((pStInitSettings->u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_MVC)
2587*53ee8cc1Swenshuai.xi     {
2588*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId+1].u32CtrlMode |= HVD_CTRL_INIT_FINISHED;
2589*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId+1].bUsed = TRUE;
2590*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId+1].u32Sid = u32Id+0x00011000;
2591*53ee8cc1Swenshuai.xi         pHVDDrvContext->bHVDIsInited[u8DrvId+1] = TRUE;
2592*53ee8cc1Swenshuai.xi     }
2593*53ee8cc1Swenshuai.xi #endif /// HVD_ENABLE_MVC
2594*53ee8cc1Swenshuai.xi     pHVDDrvContext->bHVDIsInited[u8DrvId] = TRUE;
2595*53ee8cc1Swenshuai.xi     eRet = E_HVD_EX_OK;
2596*53ee8cc1Swenshuai.xi 
2597*53ee8cc1Swenshuai.xi     HVD_EX_MSG_INF("driver Init successfully.\n");
2598*53ee8cc1Swenshuai.xi 
2599*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
2600*53ee8cc1Swenshuai.xi }
2601*53ee8cc1Swenshuai.xi 
2602*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2603*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Rst()
2604*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Reset HVD driver
2605*53ee8cc1Swenshuai.xi /// @param -bErrHandle \b IN :  reset option HVD driver
2606*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Reset HVD to clear mode.( do not recovery SPS)
2607*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Reset HVD to clear mode, and recovery SPS.
2608*53ee8cc1Swenshuai.xi /// @return -The result of reset process
2609*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Rst(MS_U32 u32Id,MS_BOOL bErrHandle)2610*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Rst(MS_U32 u32Id, MS_BOOL bErrHandle)
2611*53ee8cc1Swenshuai.xi {
2612*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2613*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2614*53ee8cc1Swenshuai.xi 
2615*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
2616*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
2617*53ee8cc1Swenshuai.xi 
2618*53ee8cc1Swenshuai.xi     if (bErrHandle == TRUE)
2619*53ee8cc1Swenshuai.xi     {
2620*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("HVD Not supported reset(TRUE) yet\n");
2621*53ee8cc1Swenshuai.xi         return E_HVD_EX_RET_INVALID_PARAMETER;
2622*53ee8cc1Swenshuai.xi     }
2623*53ee8cc1Swenshuai.xi 
2624*53ee8cc1Swenshuai.xi     if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) != HVD_INIT_MAIN_LIVE_STREAM)
2625*53ee8cc1Swenshuai.xi     {
2626*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("HVD rst() only support live stream mode\n");
2627*53ee8cc1Swenshuai.xi         return E_HVD_EX_RET_INVALID_PARAMETER;
2628*53ee8cc1Swenshuai.xi     }
2629*53ee8cc1Swenshuai.xi 
2630*53ee8cc1Swenshuai.xi     //In this function we should delete task and then create task.
2631*53ee8cc1Swenshuai.xi     HVD_EX_SetRstFlag(u32Id, TRUE);
2632*53ee8cc1Swenshuai.xi 
2633*53ee8cc1Swenshuai.xi     eRet = _HVD_EX_Rst(u32Id, bErrHandle);
2634*53ee8cc1Swenshuai.xi 
2635*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
2636*53ee8cc1Swenshuai.xi     {
2637*53ee8cc1Swenshuai.xi         return (eRet);
2638*53ee8cc1Swenshuai.xi     }
2639*53ee8cc1Swenshuai.xi 
2640*53ee8cc1Swenshuai.xi     eRet = _HVD_EX_RecoverySettings(u32Id);
2641*53ee8cc1Swenshuai.xi 
2642*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
2643*53ee8cc1Swenshuai.xi     {
2644*53ee8cc1Swenshuai.xi         return (eRet);
2645*53ee8cc1Swenshuai.xi     }
2646*53ee8cc1Swenshuai.xi 
2647*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode |= HVD_CTRL_INIT_FINISHED;
2648*53ee8cc1Swenshuai.xi     pHVDDrvContext->bHVDIsInited[u8DrvId] = TRUE;
2649*53ee8cc1Swenshuai.xi 
2650*53ee8cc1Swenshuai.xi     return eRet;
2651*53ee8cc1Swenshuai.xi }
2652*53ee8cc1Swenshuai.xi 
2653*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2654*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Play()
2655*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Play HVD
2656*53ee8cc1Swenshuai.xi /// @return -The result of command play
2657*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Play(MS_U32 u32Id)2658*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Play(MS_U32 u32Id)
2659*53ee8cc1Swenshuai.xi {
2660*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2661*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2662*53ee8cc1Swenshuai.xi 
2663*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
2664*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
2665*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
2666*53ee8cc1Swenshuai.xi 
2667*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
2668*53ee8cc1Swenshuai.xi     if (MDrv_HVD_EX_GetPlayState(u32Id) != E_HVD_EX_GSTATE_PLAY || pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bStepDecoding)
2669*53ee8cc1Swenshuai.xi #endif
2670*53ee8cc1Swenshuai.xi     {
2671*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PLAY, 0);
2672*53ee8cc1Swenshuai.xi 
2673*53ee8cc1Swenshuai.xi         if (eRet != E_HVD_EX_OK)
2674*53ee8cc1Swenshuai.xi         {
2675*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
2676*53ee8cc1Swenshuai.xi         }
2677*53ee8cc1Swenshuai.xi     }
2678*53ee8cc1Swenshuai.xi 
2679*53ee8cc1Swenshuai.xi     // step display off
2680*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_TRIGGER_DISP, 0);
2681*53ee8cc1Swenshuai.xi 
2682*53ee8cc1Swenshuai.xi     if (eRet == E_HVD_EX_OK)
2683*53ee8cc1Swenshuai.xi     {
2684*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode &= ~HVD_CTRL_DISPLAY_CTRL;
2685*53ee8cc1Swenshuai.xi     }
2686*53ee8cc1Swenshuai.xi 
2687*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
2688*53ee8cc1Swenshuai.xi }
2689*53ee8cc1Swenshuai.xi 
2690*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2691*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Exit()
2692*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Stop HVD and release resource.
2693*53ee8cc1Swenshuai.xi /// @return -The result of command stop
2694*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Exit(MS_U32 u32Id)2695*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Exit(MS_U32 u32Id)
2696*53ee8cc1Swenshuai.xi {
2697*53ee8cc1Swenshuai.xi     MS_U32 u32Timer = 0;
2698*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2699*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2700*53ee8cc1Swenshuai.xi     MS_U8 u8HalIdx   = _HVD_EX_GetStreamIdx(u32Id);
2701*53ee8cc1Swenshuai.xi 
2702*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
2703*53ee8cc1Swenshuai.xi     HAL_VPU_EX_ReleaseFreeStream(u8HalIdx);
2704*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
2705*53ee8cc1Swenshuai.xi     _DRV_HVD_Rsting(u8DrvId,eRet);
2706*53ee8cc1Swenshuai.xi 
2707*53ee8cc1Swenshuai.xi #if 0
2708*53ee8cc1Swenshuai.xi     #if defined(SUPPORT_CMA)
2709*53ee8cc1Swenshuai.xi     if (pHVDDrvContext->bCMAUsed)
2710*53ee8cc1Swenshuai.xi     {
2711*53ee8cc1Swenshuai.xi         if (MApi_CMA_Pool_PutMem(&pHVDDrvContext->cmaFreeParam[0][u8DrvId]) == FALSE)
2712*53ee8cc1Swenshuai.xi             return E_HVD_EX_RET_CMA_ERROR;
2713*53ee8cc1Swenshuai.xi         HVD_EX_MSG_DBG("[0x%lx]MApi_CMA_Pool_PutMem: offset=0x%lx, len=0x%lx\n", u32Id, pHVDDrvContext->cmaFreeParam[0][u8DrvId].offset_in_pool, pHVDDrvContext->cmaFreeParam[0][u8DrvId].length);
2714*53ee8cc1Swenshuai.xi         if (pHVDDrvContext->bCMATwoMIU[u8DrvId])
2715*53ee8cc1Swenshuai.xi         {
2716*53ee8cc1Swenshuai.xi             if (MApi_CMA_Pool_PutMem(&pHVDDrvContext->cmaFreeParam[1][u8DrvId]) == FALSE)
2717*53ee8cc1Swenshuai.xi                 return E_HVD_EX_RET_CMA_ERROR;
2718*53ee8cc1Swenshuai.xi             HVD_EX_MSG_DBG("[0x%lx]MApi_CMA_Pool_PutMem: offset=0x%lx, len=0x%lx\n", u32Id, pHVDDrvContext->cmaFreeParam[1][u8DrvId].offset_in_pool, pHVDDrvContext->cmaFreeParam[1][u8DrvId].length);
2719*53ee8cc1Swenshuai.xi         }
2720*53ee8cc1Swenshuai.xi     }
2721*53ee8cc1Swenshuai.xi     #endif
2722*53ee8cc1Swenshuai.xi #endif
2723*53ee8cc1Swenshuai.xi 
2724*53ee8cc1Swenshuai.xi #ifdef VDEC3
2725*53ee8cc1Swenshuai.xi     if (!HAL_HVD_EX_FreeBBUId(u32Id, pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32BBUId))
2726*53ee8cc1Swenshuai.xi     {
2727*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("free bbu id (%d) failed\n", pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32BBUId);
2728*53ee8cc1Swenshuai.xi     }
2729*53ee8cc1Swenshuai.xi #endif
2730*53ee8cc1Swenshuai.xi 
2731*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
2732*53ee8cc1Swenshuai.xi     if((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_MVC)
2733*53ee8cc1Swenshuai.xi     {
2734*53ee8cc1Swenshuai.xi         pHVDDrvContext->bHVDIsInited[u8DrvId+1] = FALSE;
2735*53ee8cc1Swenshuai.xi     }
2736*53ee8cc1Swenshuai.xi #endif /// HVD_ENABLE_MVC
2737*53ee8cc1Swenshuai.xi 
2738*53ee8cc1Swenshuai.xi     do
2739*53ee8cc1Swenshuai.xi     {
2740*53ee8cc1Swenshuai.xi         u32Timer++;
2741*53ee8cc1Swenshuai.xi 
2742*53ee8cc1Swenshuai.xi         if (u32Timer >= HVD_FW_EXIT_ACTION_TIMEOUT)
2743*53ee8cc1Swenshuai.xi         {
2744*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_RET_TIMEOUT;
2745*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("exit time out~~~`\n");
2746*53ee8cc1Swenshuai.xi             //return eRet;
2747*53ee8cc1Swenshuai.xi             break;
2748*53ee8cc1Swenshuai.xi         }
2749*53ee8cc1Swenshuai.xi         else
2750*53ee8cc1Swenshuai.xi         {
2751*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
2752*53ee8cc1Swenshuai.xi         }
2753*53ee8cc1Swenshuai.xi     } while (_DRV_HVD_Ctrl(u8DrvId, HVD_CTRL_PROCESSING));
2754*53ee8cc1Swenshuai.xi 
2755*53ee8cc1Swenshuai.xi     // release ISR callback
2756*53ee8cc1Swenshuai.xi     if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].HVDISRCtrl.bRegISR)
2757*53ee8cc1Swenshuai.xi     {
2758*53ee8cc1Swenshuai.xi         if (E_HVD_EX_OK != MDrv_HVD_EX_SetISREvent(u32Id, E_HVD_EX_ISR_NONE, NULL))
2759*53ee8cc1Swenshuai.xi         {
2760*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("MDrv_HVD_EX_Exit: dettach isr fail\n");
2761*53ee8cc1Swenshuai.xi         }
2762*53ee8cc1Swenshuai.xi     }
2763*53ee8cc1Swenshuai.xi     pHVDDrvContext->bHVDIsInited[u8DrvId] = FALSE;
2764*53ee8cc1Swenshuai.xi     // close HVD FW
2765*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_DeInit(u32Id);
2766*53ee8cc1Swenshuai.xi 
2767*53ee8cc1Swenshuai.xi     if(eRet == E_HVD_EX_RET_TIMEOUT)
2768*53ee8cc1Swenshuai.xi     {
2769*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("force delete task  ,cause cmd timeout \n");
2770*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_OK;
2771*53ee8cc1Swenshuai.xi     }
2772*53ee8cc1Swenshuai.xi 
2773*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
2774*53ee8cc1Swenshuai.xi     if((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_MVC)
2775*53ee8cc1Swenshuai.xi     {
2776*53ee8cc1Swenshuai.xi         memset((void *) &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId+1]), 0, sizeof(HVD_EX_Drv_Ctrl));
2777*53ee8cc1Swenshuai.xi     }
2778*53ee8cc1Swenshuai.xi #endif /// HVD_ENABLE_MVC
2779*53ee8cc1Swenshuai.xi 
2780*53ee8cc1Swenshuai.xi     // reset internal control variables
2781*53ee8cc1Swenshuai.xi     memset((void *) &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]), 0, sizeof(HVD_EX_Drv_Ctrl));
2782*53ee8cc1Swenshuai.xi     memset((void *) &(pHVDDrvContext->gHVDPreCtrl[u8DrvId]), 0, sizeof(HVD_Pre_Ctrl));
2783*53ee8cc1Swenshuai.xi 
2784*53ee8cc1Swenshuai.xi     return eRet;
2785*53ee8cc1Swenshuai.xi }
2786*53ee8cc1Swenshuai.xi 
2787*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2788*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Pause()
2789*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Pause HVD
2790*53ee8cc1Swenshuai.xi /// @return -The result of command pause
2791*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Pause(MS_U32 u32Id)2792*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Pause(MS_U32 u32Id)
2793*53ee8cc1Swenshuai.xi {
2794*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2795*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2796*53ee8cc1Swenshuai.xi 
2797*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
2798*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
2799*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
2800*53ee8cc1Swenshuai.xi 
2801*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PAUSE, 0);
2802*53ee8cc1Swenshuai.xi 
2803*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
2804*53ee8cc1Swenshuai.xi     {
2805*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
2806*53ee8cc1Swenshuai.xi     }
2807*53ee8cc1Swenshuai.xi 
2808*53ee8cc1Swenshuai.xi     // step display off
2809*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_TRIGGER_DISP, 0);
2810*53ee8cc1Swenshuai.xi 
2811*53ee8cc1Swenshuai.xi     if (eRet == E_HVD_EX_OK)
2812*53ee8cc1Swenshuai.xi     {
2813*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode &= ~HVD_CTRL_DISPLAY_CTRL;
2814*53ee8cc1Swenshuai.xi     }
2815*53ee8cc1Swenshuai.xi 
2816*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
2817*53ee8cc1Swenshuai.xi }
2818*53ee8cc1Swenshuai.xi 
2819*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2820*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Flush()
2821*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Flush queue and buffer
2822*53ee8cc1Swenshuai.xi /// @param -bShowLast \b IN :  TRUE / FALSE
2823*53ee8cc1Swenshuai.xi ///                 -FALSE(0): show current displayed frame
2824*53ee8cc1Swenshuai.xi ///                 -TRUE(1): show last decoded frame
2825*53ee8cc1Swenshuai.xi /// @return -The result of command flush
2826*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Flush(MS_U32 u32Id,MS_BOOL bShowLast)2827*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Flush(MS_U32 u32Id, MS_BOOL bShowLast)
2828*53ee8cc1Swenshuai.xi {
2829*53ee8cc1Swenshuai.xi     MS_U32 u32Times = 0;
2830*53ee8cc1Swenshuai.xi     MS_U32 u32FlushTime = 0;
2831*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2832*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2833*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
2834*53ee8cc1Swenshuai.xi 
2835*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
2836*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
2837*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
2838*53ee8cc1Swenshuai.xi 
2839*53ee8cc1Swenshuai.xi     // pause first
2840*53ee8cc1Swenshuai.xi     if (MDrv_HVD_EX_GetPlayState(u32Id) != E_HVD_EX_GSTATE_PAUSE)
2841*53ee8cc1Swenshuai.xi     {
2842*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PAUSE, 0);
2843*53ee8cc1Swenshuai.xi 
2844*53ee8cc1Swenshuai.xi         if (eRet != E_HVD_EX_OK)
2845*53ee8cc1Swenshuai.xi         {
2846*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
2847*53ee8cc1Swenshuai.xi         }
2848*53ee8cc1Swenshuai.xi 
2849*53ee8cc1Swenshuai.xi         // check flush done
2850*53ee8cc1Swenshuai.xi         while (1)
2851*53ee8cc1Swenshuai.xi         {
2852*53ee8cc1Swenshuai.xi             if (MDrv_HVD_EX_GetPlayState(u32Id) == E_HVD_EX_GSTATE_PAUSE)
2853*53ee8cc1Swenshuai.xi             {
2854*53ee8cc1Swenshuai.xi                 break;
2855*53ee8cc1Swenshuai.xi             }
2856*53ee8cc1Swenshuai.xi 
2857*53ee8cc1Swenshuai.xi             u32Times++;
2858*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
2859*53ee8cc1Swenshuai.xi 
2860*53ee8cc1Swenshuai.xi             if (u32Times > 100)
2861*53ee8cc1Swenshuai.xi             {
2862*53ee8cc1Swenshuai.xi                 HVD_EX_MSG_INF("pause in flush() not finished.\n");
2863*53ee8cc1Swenshuai.xi                 break;
2864*53ee8cc1Swenshuai.xi             }
2865*53ee8cc1Swenshuai.xi         }
2866*53ee8cc1Swenshuai.xi     }
2867*53ee8cc1Swenshuai.xi 
2868*53ee8cc1Swenshuai.xi     // step display off
2869*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_TRIGGER_DISP, 0);
2870*53ee8cc1Swenshuai.xi 
2871*53ee8cc1Swenshuai.xi     if (eRet == E_HVD_EX_OK)
2872*53ee8cc1Swenshuai.xi     {
2873*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode &= ~HVD_CTRL_DISPLAY_CTRL;
2874*53ee8cc1Swenshuai.xi     }
2875*53ee8cc1Swenshuai.xi 
2876*53ee8cc1Swenshuai.xi #ifndef VDEC3
2877*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
2878*53ee8cc1Swenshuai.xi     if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_RM)
2879*53ee8cc1Swenshuai.xi     {
2880*53ee8cc1Swenshuai.xi         if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].LastNal.bRVBrokenPacket)
2881*53ee8cc1Swenshuai.xi         {
2882*53ee8cc1Swenshuai.xi             HVD_BBU_Info bbuInfo = {0,0,0,0,0,0,0,0,0,0} ;
2883*53ee8cc1Swenshuai.xi 
2884*53ee8cc1Swenshuai.xi             HVD_EX_MSG_INF("push dummy packet for broken by us packet\n");
2885*53ee8cc1Swenshuai.xi 
2886*53ee8cc1Swenshuai.xi             bbuInfo.u32Length       = bbuInfo.u32AllocLength = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32RV_FlushPacketSize;
2887*53ee8cc1Swenshuai.xi             bbuInfo.u32Staddr       = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32RV_FlushPacketAddr - pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufAddr;
2888*53ee8cc1Swenshuai.xi             bbuInfo.u32OriPktAddr   = bbuInfo.u32Staddr;
2889*53ee8cc1Swenshuai.xi             bbuInfo.bRVBrokenPacket = FALSE;
2890*53ee8cc1Swenshuai.xi 
2891*53ee8cc1Swenshuai.xi             eRet = (HVD_EX_Result) HAL_HVD_EX_PushPacket(u32Id, (HVD_BBU_Info *) &bbuInfo);
2892*53ee8cc1Swenshuai.xi         }
2893*53ee8cc1Swenshuai.xi     }
2894*53ee8cc1Swenshuai.xi #endif
2895*53ee8cc1Swenshuai.xi 
2896*53ee8cc1Swenshuai.xi     // fire all packet to FW
2897*53ee8cc1Swenshuai.xi     if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR_FIRED) != HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR))
2898*53ee8cc1Swenshuai.xi     {
2899*53ee8cc1Swenshuai.xi         HAL_HVD_EX_UpdateESWptr_Fire(u32Id);
2900*53ee8cc1Swenshuai.xi     }
2901*53ee8cc1Swenshuai.xi #endif
2902*53ee8cc1Swenshuai.xi 
2903*53ee8cc1Swenshuai.xi     // send command
2904*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FW_FLUSH_STATUS,  (MS_U32)E_HVD_EX_FLUSH_RUNNING);
2905*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FLUSH, (MS_U32) bShowLast);
2906*53ee8cc1Swenshuai.xi 
2907*53ee8cc1Swenshuai.xi     u32FlushTime = 0;
2908*53ee8cc1Swenshuai.xi 
2909*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
2910*53ee8cc1Swenshuai.xi     {
2911*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
2912*53ee8cc1Swenshuai.xi     }
2913*53ee8cc1Swenshuai.xi 
2914*53ee8cc1Swenshuai.xi     // check flush done only for raw file mode
2915*53ee8cc1Swenshuai.xi     if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
2916*53ee8cc1Swenshuai.xi     {
2917*53ee8cc1Swenshuai.xi         while (1)
2918*53ee8cc1Swenshuai.xi         {
2919*53ee8cc1Swenshuai.xi #ifndef VDEC3
2920*53ee8cc1Swenshuai.xi             //_DRV_HVD_PushDummy();
2921*53ee8cc1Swenshuai.xi             if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_VP8)
2922*53ee8cc1Swenshuai.xi             {
2923*53ee8cc1Swenshuai.xi                 if (_HVD_EX_IsAllBufferEmpty_VP8(u32Id))
2924*53ee8cc1Swenshuai.xi                 {
2925*53ee8cc1Swenshuai.xi                     eRet = E_HVD_EX_OK;
2926*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_INF("[Check Flush Done] flush queue empty\n");
2927*53ee8cc1Swenshuai.xi                     break;
2928*53ee8cc1Swenshuai.xi                 }
2929*53ee8cc1Swenshuai.xi             }
2930*53ee8cc1Swenshuai.xi             else
2931*53ee8cc1Swenshuai.xi #endif
2932*53ee8cc1Swenshuai.xi             {
2933*53ee8cc1Swenshuai.xi #ifdef VDEC3
2934*53ee8cc1Swenshuai.xi                 if (_HVD_EX_IsAllBufferEmpty(u32Id, TRUE))
2935*53ee8cc1Swenshuai.xi #else
2936*53ee8cc1Swenshuai.xi                 if (_HVD_EX_IsAllBufferEmpty(u32Id) && (u32FlushTime >= 50))
2937*53ee8cc1Swenshuai.xi #endif
2938*53ee8cc1Swenshuai.xi                 {
2939*53ee8cc1Swenshuai.xi                     eRet = E_HVD_EX_OK;
2940*53ee8cc1Swenshuai.xi                     break;
2941*53ee8cc1Swenshuai.xi                 }
2942*53ee8cc1Swenshuai.xi             }
2943*53ee8cc1Swenshuai.xi             u32Times++;
2944*53ee8cc1Swenshuai.xi             u32FlushTime++;
2945*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
2946*53ee8cc1Swenshuai.xi             if (u32Times > 1000)
2947*53ee8cc1Swenshuai.xi             {
2948*53ee8cc1Swenshuai.xi                 HVD_EX_MSG_ERR("Flush() timeout failed: BBU:%lu Dec:%lu Disp:%lu Idle:%lu ESr:%lx ESw:%lx\n",
2949*53ee8cc1Swenshuai.xi                             (unsigned long)HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_Q_NUMB),
2950*53ee8cc1Swenshuai.xi                             (unsigned long)HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_Q_NUMB),
2951*53ee8cc1Swenshuai.xi                             (unsigned long)HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_Q_NUMB),
2952*53ee8cc1Swenshuai.xi                             (unsigned long)HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT),
2953*53ee8cc1Swenshuai.xi                             (unsigned long)HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_READ_PTR), (unsigned long)HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_WRITE_PTR));
2954*53ee8cc1Swenshuai.xi                 eRet = E_HVD_EX_FAIL;
2955*53ee8cc1Swenshuai.xi                 break;
2956*53ee8cc1Swenshuai.xi             }
2957*53ee8cc1Swenshuai.xi         }
2958*53ee8cc1Swenshuai.xi         // reset byte_cnt
2959*53ee8cc1Swenshuai.xi         HAL_HVD_EX_RstPTSCtrlVariable(u32Id);
2960*53ee8cc1Swenshuai.xi     }
2961*53ee8cc1Swenshuai.xi #ifndef VDEC3
2962*53ee8cc1Swenshuai.xi     switch ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
2963*53ee8cc1Swenshuai.xi     {
2964*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_VP8:
2965*53ee8cc1Swenshuai.xi             //HVD_PRINT("[DRV1] BBU WRp = %x, RDp = %x\n",HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR),HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_READ_PTR));
2966*53ee8cc1Swenshuai.xi             //HAL_HVD_EX_SetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR, HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_READ_PTR));
2967*53ee8cc1Swenshuai.xi             //HVD_PRINT("[DRV2] BBU WRp = %x, RDp = %x\n",HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR),HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_READ_PTR));
2968*53ee8cc1Swenshuai.xi             HAL_HVD_EX_UpdateESWptr_Fire(u32Id);
2969*53ee8cc1Swenshuai.xi             break;
2970*53ee8cc1Swenshuai.xi         default:
2971*53ee8cc1Swenshuai.xi             break;
2972*53ee8cc1Swenshuai.xi     }
2973*53ee8cc1Swenshuai.xi #endif
2974*53ee8cc1Swenshuai.xi 
2975*53ee8cc1Swenshuai.xi     HAL_HVD_EX_FlushRstShareMem(u32Id);
2976*53ee8cc1Swenshuai.xi     pCtrl->u32FlushRstPtr = 1;
2977*53ee8cc1Swenshuai.xi 
2978*53ee8cc1Swenshuai.xi     // MediaCodec need this to let scan mode to be normal.
2979*53ee8cc1Swenshuai.xi     if (0)                      //bPlayback)
2980*53ee8cc1Swenshuai.xi     {
2981*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PLAY, 0);
2982*53ee8cc1Swenshuai.xi 
2983*53ee8cc1Swenshuai.xi         if (eRet != E_HVD_EX_OK)
2984*53ee8cc1Swenshuai.xi         {
2985*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
2986*53ee8cc1Swenshuai.xi         }
2987*53ee8cc1Swenshuai.xi     }
2988*53ee8cc1Swenshuai.xi 
2989*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
2990*53ee8cc1Swenshuai.xi }
2991*53ee8cc1Swenshuai.xi 
2992*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2993*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_StepDisp()
2994*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Trigger HVD to show one frame
2995*53ee8cc1Swenshuai.xi /// @return -The result of command trigger display
2996*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_StepDisp(MS_U32 u32Id)2997*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_StepDisp(MS_U32 u32Id)
2998*53ee8cc1Swenshuai.xi {
2999*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3000*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3001*53ee8cc1Swenshuai.xi 
3002*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
3003*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
3004*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
3005*53ee8cc1Swenshuai.xi 
3006*53ee8cc1Swenshuai.xi     // check command
3007*53ee8cc1Swenshuai.xi     eRet = _HVD_EX_Check_Cmd(u8DrvId, E_HVD_CHECK_CMD_TRIGGER_DISP);
3008*53ee8cc1Swenshuai.xi 
3009*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
3010*53ee8cc1Swenshuai.xi     {
3011*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
3012*53ee8cc1Swenshuai.xi     }
3013*53ee8cc1Swenshuai.xi 
3014*53ee8cc1Swenshuai.xi     // step display on
3015*53ee8cc1Swenshuai.xi     if (_DRV_HVD_Ctrl(u8DrvId, HVD_CTRL_DISPLAY_CTRL))
3016*53ee8cc1Swenshuai.xi     {
3017*53ee8cc1Swenshuai.xi         if (MDrv_HVD_EX_IsFrameShowed(u32Id))
3018*53ee8cc1Swenshuai.xi         {
3019*53ee8cc1Swenshuai.xi             eRet = (HVD_EX_Result) HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_TRIGGER_DISP, 1);
3020*53ee8cc1Swenshuai.xi         }
3021*53ee8cc1Swenshuai.xi         else
3022*53ee8cc1Swenshuai.xi         {
3023*53ee8cc1Swenshuai.xi             HVD_EX_MSG_INF("Previous Step Display command is not finished\n");
3024*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_OK;
3025*53ee8cc1Swenshuai.xi         }
3026*53ee8cc1Swenshuai.xi     }
3027*53ee8cc1Swenshuai.xi     else
3028*53ee8cc1Swenshuai.xi     {
3029*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_TRIGGER_DISP, 1);
3030*53ee8cc1Swenshuai.xi 
3031*53ee8cc1Swenshuai.xi         if (eRet == E_HVD_EX_OK)
3032*53ee8cc1Swenshuai.xi         {
3033*53ee8cc1Swenshuai.xi             _DRV_HVD_SetCtrl(u8DrvId, HVD_CTRL_DISPLAY_CTRL);
3034*53ee8cc1Swenshuai.xi         }
3035*53ee8cc1Swenshuai.xi     }
3036*53ee8cc1Swenshuai.xi     // enter play mode
3037*53ee8cc1Swenshuai.xi     if (1)                      //HAL_HVD_EX_GetData(E_HVD_GDATA_FW_STATE) == E_HVD_FW_PAUSE )
3038*53ee8cc1Swenshuai.xi     {
3039*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PLAY, 0);
3040*53ee8cc1Swenshuai.xi 
3041*53ee8cc1Swenshuai.xi         if (eRet != E_HVD_EX_OK)
3042*53ee8cc1Swenshuai.xi         {
3043*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
3044*53ee8cc1Swenshuai.xi         }
3045*53ee8cc1Swenshuai.xi     }
3046*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
3047*53ee8cc1Swenshuai.xi }
3048*53ee8cc1Swenshuai.xi 
3049*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3050*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_StepDecode()
3051*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Step decode one frame
3052*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_StepDecode(MS_U32 u32Id)3053*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_StepDecode(MS_U32 u32Id)
3054*53ee8cc1Swenshuai.xi {
3055*53ee8cc1Swenshuai.xi     MS_U32 u32Times = 0;
3056*53ee8cc1Swenshuai.xi     MS_U32 FWState = 0;
3057*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3058*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3059*53ee8cc1Swenshuai.xi 
3060*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
3061*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
3062*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
3063*53ee8cc1Swenshuai.xi 
3064*53ee8cc1Swenshuai.xi     // check if step decoding
3065*53ee8cc1Swenshuai.xi     if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bStepDecoding)
3066*53ee8cc1Swenshuai.xi     {
3067*53ee8cc1Swenshuai.xi         if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32StepDecodeCnt == HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DECODE_CNT))
3068*53ee8cc1Swenshuai.xi         {
3069*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_RET_NOTREADY;
3070*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
3071*53ee8cc1Swenshuai.xi         }
3072*53ee8cc1Swenshuai.xi     }
3073*53ee8cc1Swenshuai.xi 
3074*53ee8cc1Swenshuai.xi     // Pause first
3075*53ee8cc1Swenshuai.xi     FWState = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_STATE);
3076*53ee8cc1Swenshuai.xi 
3077*53ee8cc1Swenshuai.xi     if (FWState != (MS_U32) E_HVD_FW_PAUSE)
3078*53ee8cc1Swenshuai.xi     {
3079*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PAUSE, 0);
3080*53ee8cc1Swenshuai.xi 
3081*53ee8cc1Swenshuai.xi         if (eRet != E_HVD_EX_OK)
3082*53ee8cc1Swenshuai.xi         {
3083*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
3084*53ee8cc1Swenshuai.xi         }
3085*53ee8cc1Swenshuai.xi         while (FWState != ((MS_U32) E_HVD_FW_PAUSE) && u32Times <= 10000)
3086*53ee8cc1Swenshuai.xi         {
3087*53ee8cc1Swenshuai.xi             FWState = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_STATE);
3088*53ee8cc1Swenshuai.xi             u32Times++;
3089*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
3090*53ee8cc1Swenshuai.xi         }
3091*53ee8cc1Swenshuai.xi         if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_STATE) != E_HVD_FW_PAUSE)
3092*53ee8cc1Swenshuai.xi         {
3093*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_FAIL;
3094*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
3095*53ee8cc1Swenshuai.xi         }
3096*53ee8cc1Swenshuai.xi     }
3097*53ee8cc1Swenshuai.xi 
3098*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bStepDecoding = TRUE;
3099*53ee8cc1Swenshuai.xi     // get decode cnt
3100*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32StepDecodeCnt = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DECODE_CNT);
3101*53ee8cc1Swenshuai.xi     // step decode
3102*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_STEP_DECODE, 0);
3103*53ee8cc1Swenshuai.xi 
3104*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
3105*53ee8cc1Swenshuai.xi }
3106*53ee8cc1Swenshuai.xi 
3107*53ee8cc1Swenshuai.xi // set command, action, status, input
3108*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3109*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_PushQueue()
3110*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  push one entry into the decoding table(BBU table).
3111*53ee8cc1Swenshuai.xi /// @param -pInfo \b IN :  Pointer to the information of input packet.
3112*53ee8cc1Swenshuai.xi /// @return -The result of command push queue
3113*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_PushQueue(MS_U32 u32Id,HVD_EX_PacketInfo * pInfo)3114*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_PushQueue(MS_U32 u32Id, HVD_EX_PacketInfo *pInfo)
3115*53ee8cc1Swenshuai.xi {
3116*53ee8cc1Swenshuai.xi #ifdef VDEC3
3117*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3118*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl  = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
3119*53ee8cc1Swenshuai.xi     HAL_VPU_EX_PacketInfo stVpuPkt;
3120*53ee8cc1Swenshuai.xi 
3121*53ee8cc1Swenshuai.xi     if (pCtrl->bNStreamMode)
3122*53ee8cc1Swenshuai.xi         stVpuPkt.u32Offset    = pInfo->u32Staddr + (pCtrl->MemMap.u32BitstreamBufAddr - pCtrl->MemMap.u32TotalBitstreamBufAddr); // NStream will share the same ES buffer
3123*53ee8cc1Swenshuai.xi     else
3124*53ee8cc1Swenshuai.xi         stVpuPkt.u32Offset    = pInfo->u32Staddr;
3125*53ee8cc1Swenshuai.xi 
3126*53ee8cc1Swenshuai.xi     stVpuPkt.u32Length    = pInfo->u32Length;
3127*53ee8cc1Swenshuai.xi     stVpuPkt.u64TimeStamp = (MS_U64)pInfo->u32TimeStamp;
3128*53ee8cc1Swenshuai.xi     //If in display queue mode
3129*53ee8cc1Swenshuai.xi     stVpuPkt.u64TimeStamp |= ((MS_U64)pInfo->u32ID_H << 32);
3130*53ee8cc1Swenshuai.xi     stVpuPkt.u32ID_H      = pInfo->u32ID_H;
3131*53ee8cc1Swenshuai.xi     stVpuPkt.u32ID_L      = pInfo->u32ID_L;
3132*53ee8cc1Swenshuai.xi 
3133*53ee8cc1Swenshuai.xi     MS_VIRT u32VBBUAddr = MDrv_HVD_EX_GetData(u32Id, E_HVD_EX_GDATA_TYPE_VBBU_ADDR);
3134*53ee8cc1Swenshuai.xi 
3135*53ee8cc1Swenshuai.xi     return (HVD_EX_Result)HAL_VPU_EX_Push2VBBU(u32Id, &stVpuPkt, u32VBBUAddr);
3136*53ee8cc1Swenshuai.xi #else
3137*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet      = E_HVD_EX_RET_ILLEGAL_ACCESS;
3138*53ee8cc1Swenshuai.xi     MS_BOOL bNULLPacket     = FALSE;
3139*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId           = _HVD_EX_GetDrvId(u32Id);
3140*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl  = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
3141*53ee8cc1Swenshuai.xi     HVD_BBU_Info bbuInfo;
3142*53ee8cc1Swenshuai.xi 
3143*53ee8cc1Swenshuai.xi     //******** for 4kx2k stream ********//
3144*53ee8cc1Swenshuai.xi     MS_U8 u8Part = 0;
3145*53ee8cc1Swenshuai.xi     MS_BOOL bPartToBeSend[QUANTITY_AFTER_BROKEN_BY_US]={0};
3146*53ee8cc1Swenshuai.xi     MS_U32  u32PartLen[QUANTITY_AFTER_BROKEN_BY_US]={0};
3147*53ee8cc1Swenshuai.xi     MS_U32  u32PartAllocLen[QUANTITY_AFTER_BROKEN_BY_US]={0};
3148*53ee8cc1Swenshuai.xi 
3149*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
3150*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
3151*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
3152*53ee8cc1Swenshuai.xi 
3153*53ee8cc1Swenshuai.xi     if (pInfo == NULL)
3154*53ee8cc1Swenshuai.xi     {
3155*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_RET_INVALID_PARAMETER;
3156*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
3157*53ee8cc1Swenshuai.xi     }
3158*53ee8cc1Swenshuai.xi     else if ((pInfo->u32Length >= HVD_BBU_TAG_LIMITATION) && (pInfo->u32Length < MAX_QUANTITY))
3159*53ee8cc1Swenshuai.xi     {
3160*53ee8cc1Swenshuai.xi         HVD_EX_MSG_DBG("input packet size(0x%lx) larger than HW_bbu_tag_limit max packet size(0x%x), AllocLength(0x%lx); to play 4kx2k stream, break it by us \n",
3161*53ee8cc1Swenshuai.xi                     pInfo->u32Length, HVD_BBU_TAG_LIMITATION, pInfo->u32AllocLength);
3162*53ee8cc1Swenshuai.xi 
3163*53ee8cc1Swenshuai.xi         bPartToBeSend[1] = TRUE;
3164*53ee8cc1Swenshuai.xi         u32PartLen[1] = pInfo->u32Length - QUANTITY_LENGTH;
3165*53ee8cc1Swenshuai.xi         u32PartAllocLen[1] = pInfo->u32AllocLength - QUANTITY_LENGTH;
3166*53ee8cc1Swenshuai.xi 
3167*53ee8cc1Swenshuai.xi         pInfo->u32Length = QUANTITY_LENGTH;
3168*53ee8cc1Swenshuai.xi         pInfo->u32AllocLength = QUANTITY_LENGTH;
3169*53ee8cc1Swenshuai.xi         pInfo->u32Staddr |= HVD_RV_BROKEN_BY_US_MASK;
3170*53ee8cc1Swenshuai.xi 
3171*53ee8cc1Swenshuai.xi         MS_U32 i;
3172*53ee8cc1Swenshuai.xi         for(i=2; i< QUANTITY_AFTER_BROKEN_BY_US; i++)
3173*53ee8cc1Swenshuai.xi         {
3174*53ee8cc1Swenshuai.xi             if (u32PartLen[i-1] >= QUANTITY_LENGTH)
3175*53ee8cc1Swenshuai.xi             {
3176*53ee8cc1Swenshuai.xi                 bPartToBeSend[i] = TRUE;
3177*53ee8cc1Swenshuai.xi                 u32PartLen[i] = u32PartLen[i-1] - QUANTITY_LENGTH;
3178*53ee8cc1Swenshuai.xi                 u32PartAllocLen[i] = u32PartAllocLen[i-1] - QUANTITY_LENGTH;
3179*53ee8cc1Swenshuai.xi                 u32PartLen[i-1] = QUANTITY_LENGTH;
3180*53ee8cc1Swenshuai.xi                 u32PartAllocLen[i-1] = QUANTITY_LENGTH;
3181*53ee8cc1Swenshuai.xi             }
3182*53ee8cc1Swenshuai.xi             else
3183*53ee8cc1Swenshuai.xi             {
3184*53ee8cc1Swenshuai.xi                 break;
3185*53ee8cc1Swenshuai.xi             }
3186*53ee8cc1Swenshuai.xi         }
3187*53ee8cc1Swenshuai.xi 
3188*53ee8cc1Swenshuai.xi     }
3189*53ee8cc1Swenshuai.xi     else if (pInfo->u32Length >= MAX_QUANTITY)
3190*53ee8cc1Swenshuai.xi     {
3191*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("input packet size(0x%lx) larger than SW_defined_4kx2k max packet size(0x%x), AllocLength(0x%lx) \n",
3192*53ee8cc1Swenshuai.xi                     pInfo->u32Length, MAX_QUANTITY, pInfo->u32AllocLength);
3193*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_RET_INVALID_PARAMETER;
3194*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
3195*53ee8cc1Swenshuai.xi     }
3196*53ee8cc1Swenshuai.xi     else if ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_INPUT_MASK) == HVD_INIT_INPUT_TSP)
3197*53ee8cc1Swenshuai.xi     {
3198*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("Init mode is TSP input and PushQueue() is not supported in TSP input\n");
3199*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3200*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
3201*53ee8cc1Swenshuai.xi     }
3202*53ee8cc1Swenshuai.xi     /*
3203*53ee8cc1Swenshuai.xi     else if (((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) != HVD_INIT_HW_RM) &&
3204*53ee8cc1Swenshuai.xi              (pInfo->u32Staddr >= pCtrl->MemMap.u32BitstreamBufSize))
3205*53ee8cc1Swenshuai.xi     {
3206*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_RET_INVALID_PARAMETER;
3207*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
3208*53ee8cc1Swenshuai.xi     }*/
3209*53ee8cc1Swenshuai.xi 
3210*53ee8cc1Swenshuai.xi     bbuInfo.u32ID_H         = pInfo->u32ID_H;
3211*53ee8cc1Swenshuai.xi     bbuInfo.u32ID_L         = pInfo->u32ID_L;
3212*53ee8cc1Swenshuai.xi     bbuInfo.u32Length       = pInfo->u32Length;
3213*53ee8cc1Swenshuai.xi     bbuInfo.u32TimeStamp    = pInfo->u32TimeStamp;
3214*53ee8cc1Swenshuai.xi     bbuInfo.u32AllocLength  = pInfo->u32AllocLength;
3215*53ee8cc1Swenshuai.xi 
3216*53ee8cc1Swenshuai.xi     if (pInfo->u32Staddr & HVD_RV_BROKEN_BY_US_MASK)
3217*53ee8cc1Swenshuai.xi     {
3218*53ee8cc1Swenshuai.xi         bbuInfo.bRVBrokenPacket = TRUE;
3219*53ee8cc1Swenshuai.xi         bbuInfo.u32OriPktAddr = pInfo->u32Staddr & (~HVD_RV_BROKEN_BY_US_MASK);
3220*53ee8cc1Swenshuai.xi         bbuInfo.u32Staddr = pInfo->u32Staddr & (~HVD_RV_BROKEN_BY_US_MASK);
3221*53ee8cc1Swenshuai.xi     }
3222*53ee8cc1Swenshuai.xi     else
3223*53ee8cc1Swenshuai.xi     {
3224*53ee8cc1Swenshuai.xi         bbuInfo.bRVBrokenPacket = FALSE;
3225*53ee8cc1Swenshuai.xi         bbuInfo.u32OriPktAddr = pInfo->u32Staddr;
3226*53ee8cc1Swenshuai.xi         bbuInfo.u32Staddr = pInfo->u32Staddr;
3227*53ee8cc1Swenshuai.xi     }
3228*53ee8cc1Swenshuai.xi 
3229*53ee8cc1Swenshuai.xi 
3230*53ee8cc1Swenshuai.xi     if ( !bbuInfo.bRVBrokenPacket &&
3231*53ee8cc1Swenshuai.xi              (pInfo->u32Staddr >= pCtrl->MemMap.u32BitstreamBufSize))
3232*53ee8cc1Swenshuai.xi     {
3233*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_RET_INVALID_PARAMETER;
3234*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
3235*53ee8cc1Swenshuai.xi     }
3236*53ee8cc1Swenshuai.xi 
3237*53ee8cc1Swenshuai.xi 
3238*53ee8cc1Swenshuai.xi     bbuInfo.u32Staddr2 = pInfo->u32Staddr2;
3239*53ee8cc1Swenshuai.xi     bbuInfo.u32Length2 = pInfo->u32Length2;
3240*53ee8cc1Swenshuai.xi 
3241*53ee8cc1Swenshuai.xi     // invalid packet
3242*53ee8cc1Swenshuai.xi     if ((bbuInfo.u32TimeStamp != HVD_U32_MAX) && (bbuInfo.u32Length == 0))
3243*53ee8cc1Swenshuai.xi     {
3244*53ee8cc1Swenshuai.xi         HVD_EX_MSG_INF("Invalid Packet(size:0x%lx PTS:0x%lx)\n ", bbuInfo.u32Length, bbuInfo.u32TimeStamp);
3245*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_RET_INVALID_PARAMETER;
3246*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
3247*53ee8cc1Swenshuai.xi     }
3248*53ee8cc1Swenshuai.xi     // AVI NULL packet
3249*53ee8cc1Swenshuai.xi #if HVD_ENABLE_AUTO_AVI_NULL_PACKET
3250*53ee8cc1Swenshuai.xi     else if ((bbuInfo.u32TimeStamp == HVD_U32_MAX) && (bbuInfo.u32Length == 0))
3251*53ee8cc1Swenshuai.xi     {
3252*53ee8cc1Swenshuai.xi         if (pCtrl->bNoDrvProccBuf)
3253*53ee8cc1Swenshuai.xi         {
3254*53ee8cc1Swenshuai.xi             HVD_EX_MSG_INF
3255*53ee8cc1Swenshuai.xi                 ("AVI Null Packet(size:0x%lx PTS:0x%lx), but do not have enough driver process buffer(0x%lx)\n ",
3256*53ee8cc1Swenshuai.xi                  pInfo->u32Length, bbuInfo.u32TimeStamp, pCtrl->MemMap.u32DrvProcessBufSize);
3257*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3258*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
3259*53ee8cc1Swenshuai.xi         }
3260*53ee8cc1Swenshuai.xi         else
3261*53ee8cc1Swenshuai.xi         {
3262*53ee8cc1Swenshuai.xi             bNULLPacket = TRUE;
3263*53ee8cc1Swenshuai.xi             bbuInfo.u32Length = pCtrl->u32NULLPacketSize;
3264*53ee8cc1Swenshuai.xi             bbuInfo.u32Staddr = pCtrl->u32NULLPacketAddr - pCtrl->MemMap.u32BitstreamBufAddr;
3265*53ee8cc1Swenshuai.xi         }
3266*53ee8cc1Swenshuai.xi     }
3267*53ee8cc1Swenshuai.xi #endif
3268*53ee8cc1Swenshuai.xi 
3269*53ee8cc1Swenshuai.xi     // the else are all normal cases.
3270*53ee8cc1Swenshuai.xi     if (MDrv_HVD_EX_GetBBUVacancy(u32Id) != 0)
3271*53ee8cc1Swenshuai.xi     {
3272*53ee8cc1Swenshuai.xi         MS_U32 u32ESRptr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_READ_PTR);
3273*53ee8cc1Swenshuai.xi         MS_U32 u32ESWptr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_WRITE_PTR);
3274*53ee8cc1Swenshuai.xi 
3275*53ee8cc1Swenshuai.xi         if ((u32ESRptr <= u32ESWptr) &&
3276*53ee8cc1Swenshuai.xi             (pCtrl->MemMap.u32BitstreamBufSize < bbuInfo.u32Staddr + bbuInfo.u32Length))
3277*53ee8cc1Swenshuai.xi         {
3278*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("input packet (0x%lx 0x%lx 0x%lx) may cause bitstream buffer overflow (0x%lx 0x%lx) 0x%lx\n ",
3279*53ee8cc1Swenshuai.xi                         bbuInfo.u32Staddr, bbuInfo.u32Length, bbuInfo.u32Staddr + bbuInfo.u32Length,
3280*53ee8cc1Swenshuai.xi                         u32ESRptr, u32ESWptr, pCtrl->MemMap.u32BitstreamBufSize);
3281*53ee8cc1Swenshuai.xi         }
3282*53ee8cc1Swenshuai.xi 
3283*53ee8cc1Swenshuai.xi         if ((u32ESWptr < u32ESRptr) &&
3284*53ee8cc1Swenshuai.xi             (u32ESWptr < bbuInfo.u32Staddr) &&
3285*53ee8cc1Swenshuai.xi             (bbuInfo.u32Staddr < u32ESRptr) &&
3286*53ee8cc1Swenshuai.xi             (u32ESRptr <= bbuInfo.u32Staddr + bbuInfo.u32Length))
3287*53ee8cc1Swenshuai.xi         {
3288*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("input packet (staddr=0x%lx, len=0x%lx) may overwrite undecoded data (rptr=0x%lx wptr=0x%lx)\n ",
3289*53ee8cc1Swenshuai.xi                         bbuInfo.u32Staddr, bbuInfo.u32Length, u32ESRptr, u32ESWptr);
3290*53ee8cc1Swenshuai.xi         }
3291*53ee8cc1Swenshuai.xi 
3292*53ee8cc1Swenshuai.xi         if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_Q_NUMB) &&
3293*53ee8cc1Swenshuai.xi             (!bNULLPacket) &&
3294*53ee8cc1Swenshuai.xi             (pCtrl->MemMap.u32DrvProcessBufSize != 0) &&
3295*53ee8cc1Swenshuai.xi             (pCtrl->MemMap.u32BitstreamBufAddr <= pCtrl->MemMap.u32DrvProcessBufAddr) &&
3296*53ee8cc1Swenshuai.xi             (pCtrl->MemMap.u32DrvProcessBufAddr < (pCtrl->MemMap.u32BitstreamBufAddr + pCtrl->MemMap.u32BitstreamBufSize)))
3297*53ee8cc1Swenshuai.xi         {
3298*53ee8cc1Swenshuai.xi             MS_U32 u32Lower = pCtrl->MemMap.u32DrvProcessBufAddr - pCtrl->MemMap.u32BitstreamBufAddr;
3299*53ee8cc1Swenshuai.xi             MS_U32 u32Upper = u32Lower + pCtrl->MemMap.u32DrvProcessBufSize;
3300*53ee8cc1Swenshuai.xi 
3301*53ee8cc1Swenshuai.xi             if (((u32Lower <= bbuInfo.u32Staddr) && (bbuInfo.u32Staddr < u32Upper)) ||
3302*53ee8cc1Swenshuai.xi                 ((u32Lower <= (bbuInfo.u32Staddr + bbuInfo.u32Length)) && ((bbuInfo.u32Staddr + bbuInfo.u32Length) < u32Upper)) ||
3303*53ee8cc1Swenshuai.xi                 ((bbuInfo.u32Staddr < u32Lower) && (u32Upper <= (bbuInfo.u32Staddr + bbuInfo.u32Length))))
3304*53ee8cc1Swenshuai.xi             {
3305*53ee8cc1Swenshuai.xi                 HVD_EX_MSG_ERR("input packet (0x%lx 0x%lx 0x%lx) is located in HVD driver process buffer(0x%lx 0x%lx)\n ",
3306*53ee8cc1Swenshuai.xi                      bbuInfo.u32Staddr, bbuInfo.u32Length, bbuInfo.u32Staddr + bbuInfo.u32Length,
3307*53ee8cc1Swenshuai.xi                      u32Lower, u32Upper);
3308*53ee8cc1Swenshuai.xi             }
3309*53ee8cc1Swenshuai.xi         }
3310*53ee8cc1Swenshuai.xi 
3311*53ee8cc1Swenshuai.xi         //for debug
3312*53ee8cc1Swenshuai.xi         #if 0
3313*53ee8cc1Swenshuai.xi         {
3314*53ee8cc1Swenshuai.xi             HVD_EX_MSG_INF("HVD : %u (%u %u) ID:%x input packet (%x %x %x) (%x %x %x) (%u %u %u)\n ",
3315*53ee8cc1Swenshuai.xi                          pCtrl->u32BBUPacketCnt, MDrv_HVD_EX_GetDataErrCnt(u32Id), MDrv_HVD_EX_GetDecErrCnt(u32Id),
3316*53ee8cc1Swenshuai.xi                          bbuInfo.u32ID_L, bbuInfo.u32Staddr + bbuInfo.u32Length, bbuInfo.u32Length,
3317*53ee8cc1Swenshuai.xi                          bbuInfo.u32Staddr, u32ESRptr, pCtrl->MemMap.u32BitstreamBufSize, u32ESWptr,
3318*53ee8cc1Swenshuai.xi                          MDrv_HVD_EX_GetBBUVacancy(u32Id), HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_READ_PTR),
3319*53ee8cc1Swenshuai.xi                          HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR));
3320*53ee8cc1Swenshuai.xi         }
3321*53ee8cc1Swenshuai.xi         #endif
3322*53ee8cc1Swenshuai.xi 
3323*53ee8cc1Swenshuai.xi         if ( (!bbuInfo.bRVBrokenPacket)&&
3324*53ee8cc1Swenshuai.xi             ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) != HVD_INIT_HW_RM) &&
3325*53ee8cc1Swenshuai.xi             ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) != HVD_INIT_HW_VP8) &&
3326*53ee8cc1Swenshuai.xi             (pCtrl->bAutoRmLastZeroByte) &&
3327*53ee8cc1Swenshuai.xi             ((!pCtrl->bCannotAccessMIU256) || ((pCtrl->bCannotAccessMIU256) && (pCtrl->MemMap.u32BitstreamBufAddr < pCtrl->MemMap.u32MIU1BaseAddr))))
3328*53ee8cc1Swenshuai.xi         {
3329*53ee8cc1Swenshuai.xi             if ((pCtrl->u8SecureMode == E_HVD_SECURE_MODE_NONE) && (!(pHVDDrvContext->bVPUIsSecureMode)))
3330*53ee8cc1Swenshuai.xi             {
3331*53ee8cc1Swenshuai.xi                     MS_U32 ModifyCnt = 0;
3332*53ee8cc1Swenshuai.xi                     MS_U32 u32tmp = 0;
3333*53ee8cc1Swenshuai.xi                     MS_U8 *pByte = NULL;
3334*53ee8cc1Swenshuai.xi                     u32tmp = (bbuInfo.u32Staddr + bbuInfo.u32Length - 1);
3335*53ee8cc1Swenshuai.xi                     if (u32tmp >= pCtrl->MemMap.u32BitstreamBufSize)
3336*53ee8cc1Swenshuai.xi                     {
3337*53ee8cc1Swenshuai.xi                         u32tmp -= pCtrl->MemMap.u32BitstreamBufSize;
3338*53ee8cc1Swenshuai.xi                     }
3339*53ee8cc1Swenshuai.xi                     u32tmp += pCtrl->MemMap.u32BitstreamBufVAddr;
3340*53ee8cc1Swenshuai.xi                     pByte = (MS_U8 *) u32tmp;
3341*53ee8cc1Swenshuai.xi 
3342*53ee8cc1Swenshuai.xi                 if((bbuInfo.u32Length > 2)
3343*53ee8cc1Swenshuai.xi                 && ((*pByte == 0) && (*(pByte-1) == 0) && (*(pByte-2) == 0)))
3344*53ee8cc1Swenshuai.xi                 {
3345*53ee8cc1Swenshuai.xi                     //301385:
3346*53ee8cc1Swenshuai.xi                     //more then 2 zero bytes after valid bytes.
3347*53ee8cc1Swenshuai.xi                     //no need to remove pending zero bytes to prevent system busy
3348*53ee8cc1Swenshuai.xi                     //HVD_PRINT("no need to remove pending zero~~\n");
3349*53ee8cc1Swenshuai.xi                 }
3350*53ee8cc1Swenshuai.xi                 else
3351*53ee8cc1Swenshuai.xi                 {
3352*53ee8cc1Swenshuai.xi #if 1 //use if-condition instead of while-loop
3353*53ee8cc1Swenshuai.xi                     if(*pByte == 0)
3354*53ee8cc1Swenshuai.xi                     {
3355*53ee8cc1Swenshuai.xi                         ModifyCnt++;
3356*53ee8cc1Swenshuai.xi                         bbuInfo.u32Length--;
3357*53ee8cc1Swenshuai.xi                         pByte--;
3358*53ee8cc1Swenshuai.xi 
3359*53ee8cc1Swenshuai.xi                         if(bbuInfo.u32Length && (*pByte == 0))
3360*53ee8cc1Swenshuai.xi                         {
3361*53ee8cc1Swenshuai.xi                             ModifyCnt++;
3362*53ee8cc1Swenshuai.xi                             bbuInfo.u32Length--;
3363*53ee8cc1Swenshuai.xi                         }
3364*53ee8cc1Swenshuai.xi                     }
3365*53ee8cc1Swenshuai.xi #else
3366*53ee8cc1Swenshuai.xi                     while (1)           //for( ModifyCnt=0 ; ModifyCnt<3;ModifyCnt++ )
3367*53ee8cc1Swenshuai.xi                     {
3368*53ee8cc1Swenshuai.xi                         if (bbuInfo.u32Length)
3369*53ee8cc1Swenshuai.xi                         {
3370*53ee8cc1Swenshuai.xi                             if (*pByte == 0)
3371*53ee8cc1Swenshuai.xi                             {
3372*53ee8cc1Swenshuai.xi                                 /*
3373*53ee8cc1Swenshuai.xi                                    if( ModifyCnt == 2 )
3374*53ee8cc1Swenshuai.xi                                    {
3375*53ee8cc1Swenshuai.xi                                    gHVDPacket.u32Length+=ModifyCnt;
3376*53ee8cc1Swenshuai.xi                                    }
3377*53ee8cc1Swenshuai.xi                                    else
3378*53ee8cc1Swenshuai.xi                                  */
3379*53ee8cc1Swenshuai.xi                                 {
3380*53ee8cc1Swenshuai.xi                                     ModifyCnt++;
3381*53ee8cc1Swenshuai.xi                                     bbuInfo.u32Length--;
3382*53ee8cc1Swenshuai.xi                                     pByte--;
3383*53ee8cc1Swenshuai.xi                                 }
3384*53ee8cc1Swenshuai.xi                             }
3385*53ee8cc1Swenshuai.xi                             else
3386*53ee8cc1Swenshuai.xi                             {
3387*53ee8cc1Swenshuai.xi                                 break;
3388*53ee8cc1Swenshuai.xi                             }
3389*53ee8cc1Swenshuai.xi                         }
3390*53ee8cc1Swenshuai.xi                         else
3391*53ee8cc1Swenshuai.xi                         {
3392*53ee8cc1Swenshuai.xi                             break;
3393*53ee8cc1Swenshuai.xi                         }
3394*53ee8cc1Swenshuai.xi                     }
3395*53ee8cc1Swenshuai.xi #endif
3396*53ee8cc1Swenshuai.xi                 }
3397*53ee8cc1Swenshuai.xi 
3398*53ee8cc1Swenshuai.xi                 if (ModifyCnt != 0)
3399*53ee8cc1Swenshuai.xi                 {
3400*53ee8cc1Swenshuai.xi                     //HVD_MSG_INFO("HVD remove last zero byte:%u\n" , ModifyCnt);
3401*53ee8cc1Swenshuai.xi                 }
3402*53ee8cc1Swenshuai.xi 
3403*53ee8cc1Swenshuai.xi                 if (bbuInfo.u32Length == 0)
3404*53ee8cc1Swenshuai.xi                 {
3405*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("Packet with all zero bytes(staddr:0x%x remove zero bytes:%u)\n ",
3406*53ee8cc1Swenshuai.xi                                 bbuInfo.u32Staddr, ModifyCnt);
3407*53ee8cc1Swenshuai.xi                     eRet = E_HVD_EX_OK;
3408*53ee8cc1Swenshuai.xi                     _DRV_HVD_EX_RET(u8DrvId, eRet);
3409*53ee8cc1Swenshuai.xi                 }
3410*53ee8cc1Swenshuai.xi             }
3411*53ee8cc1Swenshuai.xi         }
3412*53ee8cc1Swenshuai.xi         /*
3413*53ee8cc1Swenshuai.xi            {
3414*53ee8cc1Swenshuai.xi            MS_U8 *pByte=NULL;
3415*53ee8cc1Swenshuai.xi            pByte = (MS_U8 *)((gHVDCtrl.MemMap.u32BitstreamBufVAddr) + gHVDPacket.u32Staddr );
3416*53ee8cc1Swenshuai.xi            HVD_MSG_INFO("HVD remove last zero byte:%02x%02x%02x%02x\n" ,
3417*53ee8cc1Swenshuai.xi            *pByte  , *(pByte+1) , *(pByte+2) , *(pByte+3) );
3418*53ee8cc1Swenshuai.xi            }
3419*53ee8cc1Swenshuai.xi          */
3420*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_PushPacket(u32Id, (HVD_BBU_Info *) &bbuInfo);
3421*53ee8cc1Swenshuai.xi         pCtrl->u32FlushRstPtr = 0;
3422*53ee8cc1Swenshuai.xi     }
3423*53ee8cc1Swenshuai.xi     else
3424*53ee8cc1Swenshuai.xi     {
3425*53ee8cc1Swenshuai.xi         HVD_EX_MSG_DBG("Push queue full\n");
3426*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_RET_QUEUE_FULL;
3427*53ee8cc1Swenshuai.xi     }
3428*53ee8cc1Swenshuai.xi 
3429*53ee8cc1Swenshuai.xi     for ( u8Part = 1; u8Part < QUANTITY_AFTER_BROKEN_BY_US; u8Part++)
3430*53ee8cc1Swenshuai.xi     {
3431*53ee8cc1Swenshuai.xi         if (bPartToBeSend[u8Part])
3432*53ee8cc1Swenshuai.xi         {
3433*53ee8cc1Swenshuai.xi             pInfo->u32Staddr &= (~HVD_RV_BROKEN_BY_US_MASK);
3434*53ee8cc1Swenshuai.xi             pInfo->u32Staddr += QUANTITY_LENGTH;
3435*53ee8cc1Swenshuai.xi 
3436*53ee8cc1Swenshuai.xi             bbuInfo.u32ID_H         = pInfo->u32ID_H;
3437*53ee8cc1Swenshuai.xi             bbuInfo.u32ID_L         = pInfo->u32ID_L;
3438*53ee8cc1Swenshuai.xi             bbuInfo.u32Length       = u32PartLen[u8Part];
3439*53ee8cc1Swenshuai.xi             bbuInfo.u32TimeStamp    = pInfo->u32TimeStamp;
3440*53ee8cc1Swenshuai.xi             bbuInfo.u32AllocLength  = u32PartAllocLen[u8Part];
3441*53ee8cc1Swenshuai.xi 
3442*53ee8cc1Swenshuai.xi             if (u8Part != (QUANTITY_AFTER_BROKEN_BY_US - 1))
3443*53ee8cc1Swenshuai.xi             {
3444*53ee8cc1Swenshuai.xi                 if (bPartToBeSend[u8Part+1])
3445*53ee8cc1Swenshuai.xi                 {
3446*53ee8cc1Swenshuai.xi                     bbuInfo.bRVBrokenPacket = TRUE;
3447*53ee8cc1Swenshuai.xi                 }
3448*53ee8cc1Swenshuai.xi                 else
3449*53ee8cc1Swenshuai.xi                 {
3450*53ee8cc1Swenshuai.xi                     bbuInfo.bRVBrokenPacket = FALSE;
3451*53ee8cc1Swenshuai.xi                 }
3452*53ee8cc1Swenshuai.xi             }
3453*53ee8cc1Swenshuai.xi             else
3454*53ee8cc1Swenshuai.xi             {
3455*53ee8cc1Swenshuai.xi                 bbuInfo.bRVBrokenPacket = FALSE;
3456*53ee8cc1Swenshuai.xi             }
3457*53ee8cc1Swenshuai.xi 
3458*53ee8cc1Swenshuai.xi             bbuInfo.u32OriPktAddr = pInfo->u32Staddr;
3459*53ee8cc1Swenshuai.xi             bbuInfo.u32Staddr = pInfo->u32Staddr;
3460*53ee8cc1Swenshuai.xi 
3461*53ee8cc1Swenshuai.xi             bbuInfo.u32Staddr2 = pInfo->u32Staddr2;
3462*53ee8cc1Swenshuai.xi             bbuInfo.u32Length2 = pInfo->u32Length2;
3463*53ee8cc1Swenshuai.xi 
3464*53ee8cc1Swenshuai.xi             //if (MDrv_HVD_EX_GetBBUVacancy(u32Id) != 0)
3465*53ee8cc1Swenshuai.xi             {
3466*53ee8cc1Swenshuai.xi                 MS_U32 u32ESRptr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_READ_PTR);
3467*53ee8cc1Swenshuai.xi                 MS_U32 u32ESWptr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_WRITE_PTR);
3468*53ee8cc1Swenshuai.xi 
3469*53ee8cc1Swenshuai.xi                 if ((u32ESRptr <= u32ESWptr) &&
3470*53ee8cc1Swenshuai.xi                     (pCtrl->MemMap.u32BitstreamBufSize < bbuInfo.u32Staddr + bbuInfo.u32Length))
3471*53ee8cc1Swenshuai.xi                 {
3472*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("input packet (0x%lx 0x%lx 0x%lx) may cause bitstream buffer overflow (0x%lx 0x%lx) 0x%lx\n ",
3473*53ee8cc1Swenshuai.xi                                 bbuInfo.u32Staddr, bbuInfo.u32Length, bbuInfo.u32Staddr + bbuInfo.u32Length,
3474*53ee8cc1Swenshuai.xi                                 u32ESRptr, u32ESWptr, pCtrl->MemMap.u32BitstreamBufSize);
3475*53ee8cc1Swenshuai.xi                 }
3476*53ee8cc1Swenshuai.xi 
3477*53ee8cc1Swenshuai.xi                 if ((u32ESWptr < u32ESRptr) &&
3478*53ee8cc1Swenshuai.xi                     (u32ESWptr < bbuInfo.u32Staddr) &&
3479*53ee8cc1Swenshuai.xi                     (bbuInfo.u32Staddr < u32ESRptr) &&
3480*53ee8cc1Swenshuai.xi                     (u32ESRptr <= bbuInfo.u32Staddr + bbuInfo.u32Length))
3481*53ee8cc1Swenshuai.xi                 {
3482*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("input packet (staddr=0x%lx, len=0x%lx) may overwrite undecoded data (rptr=0x%lx wptr=0x%lx)\n ",
3483*53ee8cc1Swenshuai.xi                                 bbuInfo.u32Staddr, bbuInfo.u32Length, u32ESRptr, u32ESWptr);
3484*53ee8cc1Swenshuai.xi                 }
3485*53ee8cc1Swenshuai.xi 
3486*53ee8cc1Swenshuai.xi                 if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_Q_NUMB) &&
3487*53ee8cc1Swenshuai.xi                     (!bNULLPacket) &&
3488*53ee8cc1Swenshuai.xi                     (pCtrl->MemMap.u32DrvProcessBufSize != 0) &&
3489*53ee8cc1Swenshuai.xi                     (pCtrl->MemMap.u32BitstreamBufAddr <= pCtrl->MemMap.u32DrvProcessBufAddr) &&
3490*53ee8cc1Swenshuai.xi                     (pCtrl->MemMap.u32DrvProcessBufAddr < (pCtrl->MemMap.u32BitstreamBufAddr + pCtrl->MemMap.u32BitstreamBufSize)))
3491*53ee8cc1Swenshuai.xi                 {
3492*53ee8cc1Swenshuai.xi                     MS_U32 u32Lower = pCtrl->MemMap.u32DrvProcessBufAddr - pCtrl->MemMap.u32BitstreamBufAddr;
3493*53ee8cc1Swenshuai.xi                     MS_U32 u32Upper = u32Lower + pCtrl->MemMap.u32DrvProcessBufSize;
3494*53ee8cc1Swenshuai.xi 
3495*53ee8cc1Swenshuai.xi                     if (((u32Lower <= bbuInfo.u32Staddr) && (bbuInfo.u32Staddr < u32Upper)) ||
3496*53ee8cc1Swenshuai.xi                         ((u32Lower <= (bbuInfo.u32Staddr + bbuInfo.u32Length)) && ((bbuInfo.u32Staddr + bbuInfo.u32Length) < u32Upper)) ||
3497*53ee8cc1Swenshuai.xi                         ((bbuInfo.u32Staddr < u32Lower) && (u32Upper <= (bbuInfo.u32Staddr + bbuInfo.u32Length))))
3498*53ee8cc1Swenshuai.xi                     {
3499*53ee8cc1Swenshuai.xi                         HVD_EX_MSG_ERR("input packet (0x%lx 0x%lx 0x%lx) is located in HVD driver process buffer(0x%lx 0x%lx)\n ",
3500*53ee8cc1Swenshuai.xi                              bbuInfo.u32Staddr, bbuInfo.u32Length, bbuInfo.u32Staddr + bbuInfo.u32Length,
3501*53ee8cc1Swenshuai.xi                              u32Lower, u32Upper);
3502*53ee8cc1Swenshuai.xi                     }
3503*53ee8cc1Swenshuai.xi                 }
3504*53ee8cc1Swenshuai.xi 
3505*53ee8cc1Swenshuai.xi                 //for debug
3506*53ee8cc1Swenshuai.xi         #if 0
3507*53ee8cc1Swenshuai.xi                 {
3508*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_INF("HVD : %u (%u %u) ID:%x input packet (%x %x %x) (%x %x %x) (%u %u %u)\n ",
3509*53ee8cc1Swenshuai.xi                                  pCtrl->u32BBUPacketCnt, MDrv_HVD_EX_GetDataErrCnt(u32Id), MDrv_HVD_EX_GetDecErrCnt(u32Id),
3510*53ee8cc1Swenshuai.xi                                  bbuInfo.u32ID_L, bbuInfo.u32Staddr + bbuInfo.u32Length, bbuInfo.u32Length,
3511*53ee8cc1Swenshuai.xi                                  bbuInfo.u32Staddr, u32ESRptr, pCtrl->MemMap.u32BitstreamBufSize, u32ESWptr,
3512*53ee8cc1Swenshuai.xi                                  MDrv_HVD_EX_GetBBUVacancy(u32Id), HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_READ_PTR),
3513*53ee8cc1Swenshuai.xi                                  HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR));
3514*53ee8cc1Swenshuai.xi                 }
3515*53ee8cc1Swenshuai.xi         #endif
3516*53ee8cc1Swenshuai.xi 
3517*53ee8cc1Swenshuai.xi                 if (((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) != HVD_INIT_HW_RM) &&
3518*53ee8cc1Swenshuai.xi                     ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) != HVD_INIT_HW_VP8) &&
3519*53ee8cc1Swenshuai.xi                     (pCtrl->bAutoRmLastZeroByte) &&
3520*53ee8cc1Swenshuai.xi                     ((!pCtrl->bCannotAccessMIU256) || ((pCtrl->bCannotAccessMIU256) && (pCtrl->MemMap.u32BitstreamBufAddr < pCtrl->MemMap.u32MIU1BaseAddr))))
3521*53ee8cc1Swenshuai.xi                 {
3522*53ee8cc1Swenshuai.xi                     MS_U32 ModifyCnt = 0;
3523*53ee8cc1Swenshuai.xi                     while (1)           //for( ModifyCnt=0 ; ModifyCnt<3;ModifyCnt++ )
3524*53ee8cc1Swenshuai.xi                     {
3525*53ee8cc1Swenshuai.xi                         if (bbuInfo.u32Length)
3526*53ee8cc1Swenshuai.xi                         {
3527*53ee8cc1Swenshuai.xi                             MS_U8 *pByte = NULL;
3528*53ee8cc1Swenshuai.xi                             MS_U32 u32tmp = 0;
3529*53ee8cc1Swenshuai.xi                             u32tmp = (bbuInfo.u32Staddr + bbuInfo.u32Length - 1);
3530*53ee8cc1Swenshuai.xi                             if (u32tmp >= pCtrl->MemMap.u32BitstreamBufSize)
3531*53ee8cc1Swenshuai.xi                             {
3532*53ee8cc1Swenshuai.xi                                 u32tmp -= pCtrl->MemMap.u32BitstreamBufSize;
3533*53ee8cc1Swenshuai.xi                             }
3534*53ee8cc1Swenshuai.xi                             u32tmp += pCtrl->MemMap.u32BitstreamBufVAddr;
3535*53ee8cc1Swenshuai.xi                             pByte = (MS_U8 *) u32tmp;
3536*53ee8cc1Swenshuai.xi                             if (*pByte == 0)
3537*53ee8cc1Swenshuai.xi                             {
3538*53ee8cc1Swenshuai.xi                                 /*
3539*53ee8cc1Swenshuai.xi                                    if( ModifyCnt == 2 )
3540*53ee8cc1Swenshuai.xi                                    {
3541*53ee8cc1Swenshuai.xi                                    gHVDPacket.u32Length+=ModifyCnt;
3542*53ee8cc1Swenshuai.xi                                    }
3543*53ee8cc1Swenshuai.xi                                    else
3544*53ee8cc1Swenshuai.xi                                  */
3545*53ee8cc1Swenshuai.xi                                 {
3546*53ee8cc1Swenshuai.xi                                     ModifyCnt++;
3547*53ee8cc1Swenshuai.xi                                     bbuInfo.u32Length--;
3548*53ee8cc1Swenshuai.xi                                 }
3549*53ee8cc1Swenshuai.xi                             }
3550*53ee8cc1Swenshuai.xi                             else
3551*53ee8cc1Swenshuai.xi                             {
3552*53ee8cc1Swenshuai.xi                                 break;
3553*53ee8cc1Swenshuai.xi                             }
3554*53ee8cc1Swenshuai.xi                         }
3555*53ee8cc1Swenshuai.xi                         else
3556*53ee8cc1Swenshuai.xi                         {
3557*53ee8cc1Swenshuai.xi                             break;
3558*53ee8cc1Swenshuai.xi                         }
3559*53ee8cc1Swenshuai.xi                     }
3560*53ee8cc1Swenshuai.xi                     if (ModifyCnt != 0)
3561*53ee8cc1Swenshuai.xi                     {
3562*53ee8cc1Swenshuai.xi                         //HVD_MSG_INFO("HVD remove last zero byte:%u\n" , ModifyCnt);
3563*53ee8cc1Swenshuai.xi                     }
3564*53ee8cc1Swenshuai.xi                     if (bbuInfo.u32Length == 0)
3565*53ee8cc1Swenshuai.xi                     {
3566*53ee8cc1Swenshuai.xi                         HVD_EX_MSG_ERR("Packet with all zero bytes(staddr:0x%x remove zero bytes:%u)\n ",
3567*53ee8cc1Swenshuai.xi                                     bbuInfo.u32Staddr, ModifyCnt);
3568*53ee8cc1Swenshuai.xi                         eRet = E_HVD_EX_OK;
3569*53ee8cc1Swenshuai.xi                         _DRV_HVD_EX_RET(u8DrvId, eRet);
3570*53ee8cc1Swenshuai.xi                     }
3571*53ee8cc1Swenshuai.xi                 }
3572*53ee8cc1Swenshuai.xi                 /*
3573*53ee8cc1Swenshuai.xi                    {
3574*53ee8cc1Swenshuai.xi                    MS_U8 *pByte=NULL;
3575*53ee8cc1Swenshuai.xi                    pByte = (MS_U8 *)((gHVDCtrl.MemMap.u32BitstreamBufVAddr) + gHVDPacket.u32Staddr );
3576*53ee8cc1Swenshuai.xi                    HVD_MSG_INFO("HVD remove last zero byte:%02x%02x%02x%02x\n" ,
3577*53ee8cc1Swenshuai.xi                    *pByte  , *(pByte+1) , *(pByte+2) , *(pByte+3) );
3578*53ee8cc1Swenshuai.xi                    }
3579*53ee8cc1Swenshuai.xi                  */
3580*53ee8cc1Swenshuai.xi                 eRet = (HVD_EX_Result) HAL_HVD_EX_PushPacket(u32Id, (HVD_BBU_Info *) &bbuInfo);
3581*53ee8cc1Swenshuai.xi             }
3582*53ee8cc1Swenshuai.xi         }
3583*53ee8cc1Swenshuai.xi     }
3584*53ee8cc1Swenshuai.xi 
3585*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
3586*53ee8cc1Swenshuai.xi #endif
3587*53ee8cc1Swenshuai.xi }
3588*53ee8cc1Swenshuai.xi 
3589*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3590*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_PushQueue_Fire()
3591*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  fire all waiting entry into the decoding table(BBU table).
3592*53ee8cc1Swenshuai.xi /// @return -The result of command push queue fire
3593*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_PushQueue_Fire(MS_U32 u32Id)3594*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_PushQueue_Fire(MS_U32 u32Id)
3595*53ee8cc1Swenshuai.xi {
3596*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3597*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3598*53ee8cc1Swenshuai.xi 
3599*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
3600*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
3601*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
3602*53ee8cc1Swenshuai.xi 
3603*53ee8cc1Swenshuai.xi     HAL_HVD_EX_UpdateESWptr_Fire(u32Id);
3604*53ee8cc1Swenshuai.xi 
3605*53ee8cc1Swenshuai.xi     eRet = E_HVD_EX_OK;
3606*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
3607*53ee8cc1Swenshuai.xi }
3608*53ee8cc1Swenshuai.xi 
3609*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3610*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_DecodeIFrame()
3611*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Decode I frame only under driver input path.
3612*53ee8cc1Swenshuai.xi /// @param -u32SrcSt \b IN :  The physical address if user has input packet.
3613*53ee8cc1Swenshuai.xi /// @param -u32SrcSize \b IN :  The packet size if user has input packet.
3614*53ee8cc1Swenshuai.xi /// @return -The result of command decode I frame.
3615*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_DecodeIFrame(MS_U32 u32Id,MS_PHY u32SrcSt,MS_U32 u32SrcSize)3616*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_DecodeIFrame(MS_U32 u32Id, MS_PHY u32SrcSt, MS_U32 u32SrcSize)
3617*53ee8cc1Swenshuai.xi {
3618*53ee8cc1Swenshuai.xi     MS_U32 timer = 300;
3619*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3620*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3621*53ee8cc1Swenshuai.xi 
3622*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
3623*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
3624*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
3625*53ee8cc1Swenshuai.xi 
3626*53ee8cc1Swenshuai.xi     eRet = MDrv_HVD_EX_Pause(u32Id);
3627*53ee8cc1Swenshuai.xi 
3628*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
3629*53ee8cc1Swenshuai.xi     {
3630*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
3631*53ee8cc1Swenshuai.xi     }
3632*53ee8cc1Swenshuai.xi 
3633*53ee8cc1Swenshuai.xi     // skip decode I
3634*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SKIP_DEC, E_HVD_EX_SKIP_DECODE_I);
3635*53ee8cc1Swenshuai.xi 
3636*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
3637*53ee8cc1Swenshuai.xi     {
3638*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
3639*53ee8cc1Swenshuai.xi     }
3640*53ee8cc1Swenshuai.xi 
3641*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_I_DIRECT, TRUE);
3642*53ee8cc1Swenshuai.xi 
3643*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
3644*53ee8cc1Swenshuai.xi     {
3645*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
3646*53ee8cc1Swenshuai.xi     }
3647*53ee8cc1Swenshuai.xi     eRet = MDrv_HVD_EX_StepDecode(u32Id);
3648*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
3649*53ee8cc1Swenshuai.xi     {
3650*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
3651*53ee8cc1Swenshuai.xi     }
3652*53ee8cc1Swenshuai.xi 
3653*53ee8cc1Swenshuai.xi     if (E_HVD_INIT_INPUT_DRV == (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK))
3654*53ee8cc1Swenshuai.xi     {
3655*53ee8cc1Swenshuai.xi         HVD_EX_PacketInfo packet = {0,0,0,0,0,0,0,0};
3656*53ee8cc1Swenshuai.xi 
3657*53ee8cc1Swenshuai.xi         if (u32SrcSize == 0)
3658*53ee8cc1Swenshuai.xi         {
3659*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_RET_INVALID_PARAMETER;
3660*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("decode I frame input packet size is zero\n");
3661*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
3662*53ee8cc1Swenshuai.xi         }
3663*53ee8cc1Swenshuai.xi 
3664*53ee8cc1Swenshuai.xi         packet.u32Staddr = u32SrcSt - pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufAddr;
3665*53ee8cc1Swenshuai.xi         packet.u32Length = u32SrcSize;
3666*53ee8cc1Swenshuai.xi 
3667*53ee8cc1Swenshuai.xi         if ((packet.u32Staddr + packet.u32Length) > pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufSize)
3668*53ee8cc1Swenshuai.xi         {
3669*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_RET_INVALID_PARAMETER;
3670*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR
3671*53ee8cc1Swenshuai.xi                 ("decode I frame memory overflow, the packet end address is over ES buffer end address\n");
3672*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
3673*53ee8cc1Swenshuai.xi         }
3674*53ee8cc1Swenshuai.xi         packet.u32TimeStamp = 0xFFFFFFFF;
3675*53ee8cc1Swenshuai.xi         packet.u32ID_L = 0;
3676*53ee8cc1Swenshuai.xi         packet.u32ID_H = 0;
3677*53ee8cc1Swenshuai.xi         eRet = MDrv_HVD_EX_PushQueue(u32Id, &packet);
3678*53ee8cc1Swenshuai.xi         if (E_HVD_EX_OK != eRet)
3679*53ee8cc1Swenshuai.xi         {
3680*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("decode I frame push queue fail %x\n", eRet);
3681*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
3682*53ee8cc1Swenshuai.xi         }
3683*53ee8cc1Swenshuai.xi 
3684*53ee8cc1Swenshuai.xi         HAL_HVD_EX_UpdateESWptr_Fire(u32Id);
3685*53ee8cc1Swenshuai.xi     }
3686*53ee8cc1Swenshuai.xi     while (timer)
3687*53ee8cc1Swenshuai.xi     {
3688*53ee8cc1Swenshuai.xi         HVD_Delay_ms(1);
3689*53ee8cc1Swenshuai.xi         if (MDrv_HVD_EX_IsStepDecodeDone(u32Id))
3690*53ee8cc1Swenshuai.xi         {
3691*53ee8cc1Swenshuai.xi             break;
3692*53ee8cc1Swenshuai.xi         }
3693*53ee8cc1Swenshuai.xi         timer--;
3694*53ee8cc1Swenshuai.xi     }
3695*53ee8cc1Swenshuai.xi     if (timer == 0)
3696*53ee8cc1Swenshuai.xi     {
3697*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_FAIL;
3698*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("decode I frame time out, not enough data\n");
3699*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
3700*53ee8cc1Swenshuai.xi     }
3701*53ee8cc1Swenshuai.xi     eRet = E_HVD_EX_OK;
3702*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
3703*53ee8cc1Swenshuai.xi }
3704*53ee8cc1Swenshuai.xi 
3705*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3706*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDataEnd()
3707*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Upper layer set this to inform driver that there are no more data will be pushed.
3708*53ee8cc1Swenshuai.xi /// @param -bEnd \b IN :  Enable/ Disable
3709*53ee8cc1Swenshuai.xi ///                 -FALSE(0): normal status( default )
3710*53ee8cc1Swenshuai.xi ///                 -TRUE(1): ending status
3711*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDataEnd(MS_U32 u32Id,MS_BOOL bEnd)3712*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDataEnd(MS_U32 u32Id, MS_BOOL bEnd)
3713*53ee8cc1Swenshuai.xi {
3714*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3715*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3716*53ee8cc1Swenshuai.xi 
3717*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
3718*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
3719*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
3720*53ee8cc1Swenshuai.xi 
3721*53ee8cc1Swenshuai.xi     if (bEnd)
3722*53ee8cc1Swenshuai.xi     {
3723*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode |= HVD_CTRL_DATA_END;
3724*53ee8cc1Swenshuai.xi     }
3725*53ee8cc1Swenshuai.xi     else
3726*53ee8cc1Swenshuai.xi     {
3727*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode &= ~HVD_CTRL_DATA_END;
3728*53ee8cc1Swenshuai.xi     }
3729*53ee8cc1Swenshuai.xi 
3730*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PLAYBACK_FINISH, bEnd);
3731*53ee8cc1Swenshuai.xi 
3732*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
3733*53ee8cc1Swenshuai.xi }
3734*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_SetCalFrameRate(MS_U32 u32Id,MS_BOOL bEnable)3735*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetCalFrameRate(MS_U32 u32Id,MS_BOOL bEnable)
3736*53ee8cc1Swenshuai.xi {
3737*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_OK;
3738*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3739*53ee8cc1Swenshuai.xi 
3740*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDPreCtrl[u8DrvId].bCalFrameRate = bEnable;
3741*53ee8cc1Swenshuai.xi 
3742*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
3743*53ee8cc1Swenshuai.xi }
3744*53ee8cc1Swenshuai.xi 
3745*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3746*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDispErrFrm()
3747*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable/ Disable to decode and show error(broken) frames
3748*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN :  Enable/ Disable
3749*53ee8cc1Swenshuai.xi ///                 -FALSE(0): hide error frames
3750*53ee8cc1Swenshuai.xi ///                 -TRUE(1): show error frames
3751*53ee8cc1Swenshuai.xi /// @return -The result of command set display error frames
3752*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDispErrFrm(MS_U32 u32Id,MS_BOOL bEnable)3753*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDispErrFrm(MS_U32 u32Id, MS_BOOL bEnable)
3754*53ee8cc1Swenshuai.xi {
3755*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3756*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3757*53ee8cc1Swenshuai.xi 
3758*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
3759*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
3760*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
3761*53ee8cc1Swenshuai.xi 
3762*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_ERR_FRM, bEnable);
3763*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.bIsShowErrFrm = bEnable;
3764*53ee8cc1Swenshuai.xi 
3765*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
3766*53ee8cc1Swenshuai.xi }
3767*53ee8cc1Swenshuai.xi 
3768*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3769*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDispRepeatField()
3770*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable/ Disable to show last field when FW needs to show repeated field
3771*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN :  Enable/ Disable
3772*53ee8cc1Swenshuai.xi ///                 -FALSE(0): disable this mode
3773*53ee8cc1Swenshuai.xi ///                 -TRUE(1): enable this mode
3774*53ee8cc1Swenshuai.xi /// @return -The result of command set display repeated field
3775*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDispRepeatField(MS_U32 u32Id,MS_BOOL bEnable)3776*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDispRepeatField(MS_U32 u32Id, MS_BOOL bEnable)
3777*53ee8cc1Swenshuai.xi {
3778*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3779*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3780*53ee8cc1Swenshuai.xi 
3781*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
3782*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
3783*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
3784*53ee8cc1Swenshuai.xi 
3785*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_REPEAT_LAST_FIELD, bEnable);
3786*53ee8cc1Swenshuai.xi 
3787*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
3788*53ee8cc1Swenshuai.xi }
3789*53ee8cc1Swenshuai.xi 
3790*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3791*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetSkipDecMode()
3792*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set the decoding frame type.
3793*53ee8cc1Swenshuai.xi /// @param -eDecType \b IN : decoding frame type
3794*53ee8cc1Swenshuai.xi /// @return -The result of command set skip decode mode
3795*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetSkipDecMode(MS_U32 u32Id,HVD_EX_SkipDecode eDecType)3796*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSkipDecMode(MS_U32 u32Id, HVD_EX_SkipDecode eDecType)
3797*53ee8cc1Swenshuai.xi {
3798*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3799*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3800*53ee8cc1Swenshuai.xi 
3801*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
3802*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
3803*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
3804*53ee8cc1Swenshuai.xi 
3805*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
3806*53ee8cc1Swenshuai.xi     if ((HVD_EX_SkipDecode) HAL_HVD_EX_GetData(E_HVD_GDATA_SKIP_MODE) != eDecType)
3807*53ee8cc1Swenshuai.xi #endif
3808*53ee8cc1Swenshuai.xi     {
3809*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SKIP_DEC, eDecType);
3810*53ee8cc1Swenshuai.xi 
3811*53ee8cc1Swenshuai.xi         if (eRet != E_HVD_EX_OK)
3812*53ee8cc1Swenshuai.xi         {
3813*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
3814*53ee8cc1Swenshuai.xi         }
3815*53ee8cc1Swenshuai.xi 
3816*53ee8cc1Swenshuai.xi         if (eDecType == E_HVD_EX_SKIP_DECODE_I)
3817*53ee8cc1Swenshuai.xi         {
3818*53ee8cc1Swenshuai.xi             eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_I_DIRECT, TRUE);
3819*53ee8cc1Swenshuai.xi         }
3820*53ee8cc1Swenshuai.xi         else
3821*53ee8cc1Swenshuai.xi         {
3822*53ee8cc1Swenshuai.xi             eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_I_DIRECT, FALSE);
3823*53ee8cc1Swenshuai.xi         }
3824*53ee8cc1Swenshuai.xi     }
3825*53ee8cc1Swenshuai.xi 
3826*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.u8SkipMode = (MS_U8) eDecType;
3827*53ee8cc1Swenshuai.xi 
3828*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
3829*53ee8cc1Swenshuai.xi }
3830*53ee8cc1Swenshuai.xi #ifdef VDEC3_FB
3831*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3832*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetFrmBuffAddr()
3833*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the frame buffer address.
3834*53ee8cc1Swenshuai.xi /// @param -u32FrmBuffAddr \b IN : frame buffer address.
3835*53ee8cc1Swenshuai.xi /// @return -The result of command set frame buffer address.
3836*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetFrmBuffAddr(MS_U32 u32Id,MS_PHY u32FrmBuffAddr)3837*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetFrmBuffAddr(MS_U32 u32Id, MS_PHY u32FrmBuffAddr)
3838*53ee8cc1Swenshuai.xi {
3839*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3840*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3841*53ee8cc1Swenshuai.xi 
3842*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
3843*53ee8cc1Swenshuai.xi //    _DRV_HVD_Inited(u8DrvId,eRet);
3844*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
3845*53ee8cc1Swenshuai.xi 
3846*53ee8cc1Swenshuai.xi     HVD_EX_MSG_DBG("Drv: set u32FrmBuffAddr = 0x%X\n", (MS_U32) u32FrmBuffAddr);
3847*53ee8cc1Swenshuai.xi 
3848*53ee8cc1Swenshuai.xi //#if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
3849*53ee8cc1Swenshuai.xi //    if (HAL_HVD_EX_GetData(E_HVD_GDATA_DISPLAY_DURATION) != u32FrmBuffAddr)
3850*53ee8cc1Swenshuai.xi //#endif
3851*53ee8cc1Swenshuai.xi     {
3852*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_DUAL_R2_CMD_FBADDR, u32FrmBuffAddr);
3853*53ee8cc1Swenshuai.xi     }
3854*53ee8cc1Swenshuai.xi /*#if HVD_ENABLE_WAIT_CMD_FINISHED
3855*53ee8cc1Swenshuai.xi     if (eRet == E_HVD_EX_OK)
3856*53ee8cc1Swenshuai.xi     {
3857*53ee8cc1Swenshuai.xi         MS_U32 timer = HVD_DRV_CMD_WAIT_FINISH_TIMEOUT;
3858*53ee8cc1Swenshuai.xi         while (timer)
3859*53ee8cc1Swenshuai.xi         {
3860*53ee8cc1Swenshuai.xi             if (HAL_HVD_EX_GetData(E_HVD_GDATA_DISPLAY_DURATION) == u32FrmBuffAddr)
3861*53ee8cc1Swenshuai.xi             {
3862*53ee8cc1Swenshuai.xi                 break;
3863*53ee8cc1Swenshuai.xi             }
3864*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
3865*53ee8cc1Swenshuai.xi             timer--;
3866*53ee8cc1Swenshuai.xi         }
3867*53ee8cc1Swenshuai.xi     }
3868*53ee8cc1Swenshuai.xi #endif*/
3869*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
3870*53ee8cc1Swenshuai.xi }
3871*53ee8cc1Swenshuai.xi 
3872*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3873*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetFrmBuffSize()
3874*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the frame buffer size.
3875*53ee8cc1Swenshuai.xi /// @param -u32FrmBuffSize \b IN : frame buffer size.
3876*53ee8cc1Swenshuai.xi /// @return -The result of command set frame buffer size.
3877*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetFrmBuffSize(MS_U32 u32Id,MS_U32 u32FrmBuffSize)3878*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetFrmBuffSize(MS_U32 u32Id, MS_U32 u32FrmBuffSize)
3879*53ee8cc1Swenshuai.xi {
3880*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3881*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3882*53ee8cc1Swenshuai.xi 
3883*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
3884*53ee8cc1Swenshuai.xi //    _DRV_HVD_Inited(u8DrvId,eRet);
3885*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
3886*53ee8cc1Swenshuai.xi 
3887*53ee8cc1Swenshuai.xi     HVD_EX_MSG_DBG("Drv: set FrmBuffSize = 0x%X\n", (MS_U32) u32FrmBuffSize);
3888*53ee8cc1Swenshuai.xi 
3889*53ee8cc1Swenshuai.xi //#if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
3890*53ee8cc1Swenshuai.xi //    if (HAL_HVD_EX_GetData(E_HVD_GDATA_DISPLAY_DURATION) != u32FrmBuffSize)
3891*53ee8cc1Swenshuai.xi //#endif
3892*53ee8cc1Swenshuai.xi     {
3893*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_DUAL_R2_CMD_FBSIZE, u32FrmBuffSize);
3894*53ee8cc1Swenshuai.xi     }
3895*53ee8cc1Swenshuai.xi /*#if HVD_ENABLE_WAIT_CMD_FINISHED
3896*53ee8cc1Swenshuai.xi     if (eRet == E_HVD_EX_OK)
3897*53ee8cc1Swenshuai.xi     {
3898*53ee8cc1Swenshuai.xi         MS_U32 timer = HVD_DRV_CMD_WAIT_FINISH_TIMEOUT;
3899*53ee8cc1Swenshuai.xi         while (timer)
3900*53ee8cc1Swenshuai.xi         {
3901*53ee8cc1Swenshuai.xi             if (HAL_HVD_EX_GetData(E_HVD_GDATA_DISPLAY_DURATION) == u32FrmBuffSize)
3902*53ee8cc1Swenshuai.xi             {
3903*53ee8cc1Swenshuai.xi                 break;
3904*53ee8cc1Swenshuai.xi             }
3905*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
3906*53ee8cc1Swenshuai.xi             timer--;
3907*53ee8cc1Swenshuai.xi         }
3908*53ee8cc1Swenshuai.xi     }
3909*53ee8cc1Swenshuai.xi #endif*/
3910*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
3911*53ee8cc1Swenshuai.xi }
3912*53ee8cc1Swenshuai.xi #endif
3913*53ee8cc1Swenshuai.xi 
3914*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3915*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetMaxCMASize()
3916*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the max cma frame buffer size.
3917*53ee8cc1Swenshuai.xi /// @param -u32MaxCMASize \b IN : max CMA frame buffer size.
3918*53ee8cc1Swenshuai.xi /// @param -u32MaxCMASize2 \b IN : max CMA frame buffer2 size.
3919*53ee8cc1Swenshuai.xi /// @return -The result of command set frame buffer address.
3920*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetCodecCapInfo(int eCodecType,void * pCodecCapInfo)3921*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetCodecCapInfo( int eCodecType, void *pCodecCapInfo)
3922*53ee8cc1Swenshuai.xi {
3923*53ee8cc1Swenshuai.xi     if(HAL_VPU_EX_GetCodecCapInfo(  eCodecType, pCodecCapInfo))
3924*53ee8cc1Swenshuai.xi         return E_HVD_RETURN_SUCCESS;
3925*53ee8cc1Swenshuai.xi     else
3926*53ee8cc1Swenshuai.xi         return E_HVD_RETURN_FAIL;
3927*53ee8cc1Swenshuai.xi }
3928*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_SetDVXCShmBuff(MS_U32 u32Id,MS_PHY u32FWBaseAddr,MS_PHY u32DVXCShmAddr,MS_SIZE u32DVXCShmSize)3929*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDVXCShmBuff(MS_U32 u32Id, MS_PHY u32FWBaseAddr, MS_PHY u32DVXCShmAddr, MS_SIZE u32DVXCShmSize)
3930*53ee8cc1Swenshuai.xi {
3931*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3932*53ee8cc1Swenshuai.xi 
3933*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3934*53ee8cc1Swenshuai.xi 
3935*53ee8cc1Swenshuai.xi     MS_U8 u8XCShmMiuSel;
3936*53ee8cc1Swenshuai.xi     MS_U32 u32XCShmStartOffset;
3937*53ee8cc1Swenshuai.xi 
3938*53ee8cc1Swenshuai.xi     MS_U8 u8FWBaseMiuSel;
3939*53ee8cc1Swenshuai.xi     MS_U32 u32FWBaseOffset;
3940*53ee8cc1Swenshuai.xi 
3941*53ee8cc1Swenshuai.xi     MS_U32 u32MIUSel;
3942*53ee8cc1Swenshuai.xi 
3943*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
3944*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
3945*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
3946*53ee8cc1Swenshuai.xi 
3947*53ee8cc1Swenshuai.xi     HVD_PRINT("Drv: SetDVXCShmAddr=0x%llx FWBaseAddr=0x%llx SetDVXCShmSize=0x%x\n",
3948*53ee8cc1Swenshuai.xi         (unsigned long long int) u32DVXCShmAddr, (unsigned long long int)u32FWBaseAddr, u32DVXCShmSize);
3949*53ee8cc1Swenshuai.xi 
3950*53ee8cc1Swenshuai.xi     _phy_to_miu_offset(u8FWBaseMiuSel, u32FWBaseOffset, u32FWBaseAddr);
3951*53ee8cc1Swenshuai.xi     _phy_to_miu_offset(u8XCShmMiuSel, u32XCShmStartOffset, u32DVXCShmAddr);
3952*53ee8cc1Swenshuai.xi 
3953*53ee8cc1Swenshuai.xi     if (u8FWBaseMiuSel != u8XCShmMiuSel)
3954*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("[ERROR] XC share memory and VDEC Code base MIU selections are different\n");
3955*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SET_DV_XC_SHM_ADDR, (unsigned long)(u32XCShmStartOffset - u32FWBaseOffset));
3956*53ee8cc1Swenshuai.xi 
3957*53ee8cc1Swenshuai.xi     if (eRet == E_HVD_EX_OK)
3958*53ee8cc1Swenshuai.xi     {
3959*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result)HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_DV_XC_SHM_SIZE, u32DVXCShmSize);
3960*53ee8cc1Swenshuai.xi         u32MIUSel = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_MIU_SEL);
3961*53ee8cc1Swenshuai.xi 
3962*53ee8cc1Swenshuai.xi         u32MIUSel &= (~(VDEC_MIUSEL_MASK << VDEC_XCSHM_MIUSEL));
3963*53ee8cc1Swenshuai.xi         u32MIUSel |= (u8XCShmMiuSel << VDEC_XCSHM_MIUSEL);
3964*53ee8cc1Swenshuai.xi 
3965*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_MIU_SEL, u32MIUSel);
3966*53ee8cc1Swenshuai.xi     }
3967*53ee8cc1Swenshuai.xi 
3968*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
3969*53ee8cc1Swenshuai.xi 
3970*53ee8cc1Swenshuai.xi }
3971*53ee8cc1Swenshuai.xi 
3972*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3973*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetFrmBuffAddr()
3974*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the frame buffer address.
3975*53ee8cc1Swenshuai.xi /// @param -u32FrmBuffAddr \b IN : frame buffer address.
3976*53ee8cc1Swenshuai.xi /// @return -The result of command set frame buffer address.
3977*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetFrmBuff2(MS_U32 u32Id,MS_PHY u32FrmBuffAddr,MS_U32 u32FrmBuffSize)3978*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetFrmBuff2(MS_U32 u32Id, MS_PHY u32FrmBuffAddr, MS_U32 u32FrmBuffSize)
3979*53ee8cc1Swenshuai.xi {
3980*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3981*53ee8cc1Swenshuai.xi     MS_U8 u8Frm2MiuSel;
3982*53ee8cc1Swenshuai.xi     MS_U32 u32FrmStartOffset;
3983*53ee8cc1Swenshuai.xi     MS_U32 u32MIUSel;
3984*53ee8cc1Swenshuai.xi 
3985*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
3986*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
3987*53ee8cc1Swenshuai.xi 
3988*53ee8cc1Swenshuai.xi     HVD_EX_MSG_DBG("Drv: set u32FrmBuff2Addr = 0x%lX\n", (unsigned long)u32FrmBuffAddr);
3989*53ee8cc1Swenshuai.xi 
3990*53ee8cc1Swenshuai.xi     _phy_to_miu_offset(u8Frm2MiuSel, u32FrmStartOffset, u32FrmBuffAddr);
3991*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8Frm2MiuSel = u8Frm2MiuSel;
3992*53ee8cc1Swenshuai.xi 
3993*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FRAMEBUF2_ADDR, u32FrmStartOffset);
3994*53ee8cc1Swenshuai.xi 
3995*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FRAMEBUF2_SIZE, u32FrmBuffSize);
3996*53ee8cc1Swenshuai.xi 
3997*53ee8cc1Swenshuai.xi     u32MIUSel = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_MIU_SEL);
3998*53ee8cc1Swenshuai.xi #if defined(CHIP_MONET) || defined(CHIP_KANO) || defined(CHIP_CURRY)
3999*53ee8cc1Swenshuai.xi     u32MIUSel &= (~(VDEC_MIUSEL_MASK << VDEC_CHROMA8_MIUSEL));
4000*53ee8cc1Swenshuai.xi     u32MIUSel &= (~(VDEC_MIUSEL_MASK << VDEC_CHROMA2_MIUSEL));
4001*53ee8cc1Swenshuai.xi     u32MIUSel |= (u8Frm2MiuSel << VDEC_CHROMA8_MIUSEL);
4002*53ee8cc1Swenshuai.xi     u32MIUSel |= (u8Frm2MiuSel << VDEC_CHROMA2_MIUSEL);
4003*53ee8cc1Swenshuai.xi #else
4004*53ee8cc1Swenshuai.xi     u32MIUSel &= (~(VDEC_MIUSEL_MASK << VDEC_LUMA2_MIUSEL));
4005*53ee8cc1Swenshuai.xi     u32MIUSel &= (~(VDEC_MIUSEL_MASK << VDEC_CHROMA2_MIUSEL));
4006*53ee8cc1Swenshuai.xi     u32MIUSel |= (u8Frm2MiuSel << VDEC_LUMA2_MIUSEL);
4007*53ee8cc1Swenshuai.xi     u32MIUSel |= (u8Frm2MiuSel << VDEC_CHROMA2_MIUSEL);
4008*53ee8cc1Swenshuai.xi #endif
4009*53ee8cc1Swenshuai.xi     u32MIUSel &= (~(VDEC_MIUSEL_MASK << VDEC_BUF2_MIUSEL));
4010*53ee8cc1Swenshuai.xi     u32MIUSel |= (u8Frm2MiuSel << VDEC_BUF2_MIUSEL);
4011*53ee8cc1Swenshuai.xi 
4012*53ee8cc1Swenshuai.xi #if SUPPORT_G2VP9
4013*53ee8cc1Swenshuai.xi     if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_VP9)
4014*53ee8cc1Swenshuai.xi     {
4015*53ee8cc1Swenshuai.xi         u32MIUSel &= (~(VDEC_MIUSEL_MASK << VDEC_LUMA8_MIUSEL));
4016*53ee8cc1Swenshuai.xi         u32MIUSel &= (~(VDEC_MIUSEL_MASK << VDEC_CHROMA8_MIUSEL));
4017*53ee8cc1Swenshuai.xi         u32MIUSel |= (u8Frm2MiuSel << VDEC_LUMA8_MIUSEL);
4018*53ee8cc1Swenshuai.xi         u32MIUSel |= (u8Frm2MiuSel << VDEC_CHROMA8_MIUSEL);
4019*53ee8cc1Swenshuai.xi     }
4020*53ee8cc1Swenshuai.xi #endif
4021*53ee8cc1Swenshuai.xi 
4022*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_MIU_SEL, u32MIUSel);
4023*53ee8cc1Swenshuai.xi 
4024*53ee8cc1Swenshuai.xi     return E_HVD_RETURN_SUCCESS;
4025*53ee8cc1Swenshuai.xi }
4026*53ee8cc1Swenshuai.xi 
4027*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4028*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDispSpeed()
4029*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the display speed type.
4030*53ee8cc1Swenshuai.xi /// @param -eSpeed \b IN : display speed type
4031*53ee8cc1Swenshuai.xi /// @return -The result of command set display speed type
4032*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDispSpeed(MS_U32 u32Id,HVD_EX_DispSpeed eSpeed)4033*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDispSpeed(MS_U32 u32Id, HVD_EX_DispSpeed eSpeed)
4034*53ee8cc1Swenshuai.xi {
4035*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4036*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4037*53ee8cc1Swenshuai.xi 
4038*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4039*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4040*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4041*53ee8cc1Swenshuai.xi 
4042*53ee8cc1Swenshuai.xi     HVD_EX_MSG_DBG("%d\n", (MS_S16) eSpeed);
4043*53ee8cc1Swenshuai.xi 
4044*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
4045*53ee8cc1Swenshuai.xi     if (HAL_HVD_EX_GetData(E_HVD_GDATA_DISPLAY_DURATION) != eSpeed)
4046*53ee8cc1Swenshuai.xi #endif
4047*53ee8cc1Swenshuai.xi     {
4048*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_SPEED, eSpeed);
4049*53ee8cc1Swenshuai.xi     }
4050*53ee8cc1Swenshuai.xi #if HVD_ENABLE_WAIT_CMD_FINISHED
4051*53ee8cc1Swenshuai.xi     if (eRet == E_HVD_EX_OK)
4052*53ee8cc1Swenshuai.xi     {
4053*53ee8cc1Swenshuai.xi         MS_U32 timer = HVD_DRV_CMD_WAIT_FINISH_TIMEOUT;
4054*53ee8cc1Swenshuai.xi         while (timer)
4055*53ee8cc1Swenshuai.xi         {
4056*53ee8cc1Swenshuai.xi             if (HAL_HVD_EX_GetData(E_HVD_GDATA_DISPLAY_DURATION) == eSpeed)
4057*53ee8cc1Swenshuai.xi             {
4058*53ee8cc1Swenshuai.xi                 break;
4059*53ee8cc1Swenshuai.xi             }
4060*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
4061*53ee8cc1Swenshuai.xi             timer--;
4062*53ee8cc1Swenshuai.xi         }
4063*53ee8cc1Swenshuai.xi     }
4064*53ee8cc1Swenshuai.xi #endif
4065*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4066*53ee8cc1Swenshuai.xi }
4067*53ee8cc1Swenshuai.xi 
4068*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4069*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetSyncActive()
4070*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable/disable the sync of video time stamp and STC.
4071*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/ Disable
4072*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable sync mode
4073*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable sync mode
4074*53ee8cc1Swenshuai.xi /// @return -The result of command set sync active
4075*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetSyncActive(MS_U32 u32Id,MS_BOOL bEnable)4076*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSyncActive(MS_U32 u32Id, MS_BOOL bEnable)
4077*53ee8cc1Swenshuai.xi {
4078*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4079*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4080*53ee8cc1Swenshuai.xi 
4081*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4082*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4083*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4084*53ee8cc1Swenshuai.xi 
4085*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
4086*53ee8cc1Swenshuai.xi     if (HAL_HVD_EX_GetData(E_HVD_GDATA_IS_SYNC_ON) != bEnable)
4087*53ee8cc1Swenshuai.xi #endif
4088*53ee8cc1Swenshuai.xi     {
4089*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_ACTIVE, bEnable);
4090*53ee8cc1Swenshuai.xi     }
4091*53ee8cc1Swenshuai.xi #if HVD_ENABLE_WAIT_CMD_FINISHED
4092*53ee8cc1Swenshuai.xi     if (eRet == E_HVD_EX_OK)
4093*53ee8cc1Swenshuai.xi     {
4094*53ee8cc1Swenshuai.xi         MS_U32 timer = HVD_DRV_CMD_WAIT_FINISH_TIMEOUT;
4095*53ee8cc1Swenshuai.xi         while (timer)
4096*53ee8cc1Swenshuai.xi         {
4097*53ee8cc1Swenshuai.xi             if (HAL_HVD_EX_GetData(E_HVD_GDATA_IS_SYNC_ON) == bEnable)
4098*53ee8cc1Swenshuai.xi             {
4099*53ee8cc1Swenshuai.xi                 break;
4100*53ee8cc1Swenshuai.xi             }
4101*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
4102*53ee8cc1Swenshuai.xi             timer--;
4103*53ee8cc1Swenshuai.xi         }
4104*53ee8cc1Swenshuai.xi     }
4105*53ee8cc1Swenshuai.xi #endif
4106*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.bIsSyncOn = bEnable;
4107*53ee8cc1Swenshuai.xi 
4108*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4109*53ee8cc1Swenshuai.xi }
4110*53ee8cc1Swenshuai.xi 
4111*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4112*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDropMode()
4113*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the way to drop decoded frames.
4114*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : Drop display type.
4115*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : The argument of eMode
4116*53ee8cc1Swenshuai.xi ///     -( eMode == E_HVD_DROP_DISPLAY_AUTO)  , Enable: (u32Arg = TRUE); Disable: (u32Arg = FALSE)
4117*53ee8cc1Swenshuai.xi ///     -( eMode == E_HVD_EX_DROP_DISPLAY_ONCE)  , u32Arg = not zero
4118*53ee8cc1Swenshuai.xi /// @return -The result of command set display speed type
4119*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDropMode(MS_U32 u32Id,HVD_EX_DropDisp eMode,MS_U32 u32Arg)4120*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDropMode(MS_U32 u32Id, HVD_EX_DropDisp eMode, MS_U32 u32Arg)
4121*53ee8cc1Swenshuai.xi {
4122*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4123*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4124*53ee8cc1Swenshuai.xi 
4125*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4126*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4127*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4128*53ee8cc1Swenshuai.xi 
4129*53ee8cc1Swenshuai.xi     if (eMode == E_HVD_EX_DROP_DISPLAY_AUTO)
4130*53ee8cc1Swenshuai.xi     {
4131*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DROP_DISP_AUTO, u32Arg);
4132*53ee8cc1Swenshuai.xi     }
4133*53ee8cc1Swenshuai.xi     else if (eMode == E_HVD_EX_DROP_DISPLAY_ONCE)
4134*53ee8cc1Swenshuai.xi     {
4135*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DROP_DISP_ONCE, u32Arg);
4136*53ee8cc1Swenshuai.xi     }
4137*53ee8cc1Swenshuai.xi     else
4138*53ee8cc1Swenshuai.xi     {
4139*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_RET_INVALID_PARAMETER;
4140*53ee8cc1Swenshuai.xi     }
4141*53ee8cc1Swenshuai.xi 
4142*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4143*53ee8cc1Swenshuai.xi }
4144*53ee8cc1Swenshuai.xi 
4145*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4146*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_RstPTS()
4147*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Reset HVD sync table
4148*53ee8cc1Swenshuai.xi /// @param -u32PTS \b IN : PTS base
4149*53ee8cc1Swenshuai.xi /// @return -The result of command reset PTS
4150*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_RstPTS(MS_U32 u32Id,MS_U32 u32PTS)4151*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_RstPTS(MS_U32 u32Id, MS_U32 u32PTS)
4152*53ee8cc1Swenshuai.xi {
4153*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4154*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4155*53ee8cc1Swenshuai.xi 
4156*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4157*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4158*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4159*53ee8cc1Swenshuai.xi 
4160*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_RESET_PTS, u32PTS);
4161*53ee8cc1Swenshuai.xi 
4162*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4163*53ee8cc1Swenshuai.xi }
4164*53ee8cc1Swenshuai.xi 
4165*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4166*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetFrcMode()
4167*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set the frame rate convert mode.
4168*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : mode type
4169*53ee8cc1Swenshuai.xi /// @return -The result of command set frame rate convert mode
4170*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetFrcMode(MS_U32 u32Id,HVD_EX_FrmRateConvMode eMode)4171*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetFrcMode(MS_U32 u32Id, HVD_EX_FrmRateConvMode eMode)
4172*53ee8cc1Swenshuai.xi {
4173*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4174*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4175*53ee8cc1Swenshuai.xi 
4176*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4177*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4178*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4179*53ee8cc1Swenshuai.xi 
4180*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FRC_MODE, eMode);
4181*53ee8cc1Swenshuai.xi 
4182*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.u8FrcMode = (MS_U8) eMode;
4183*53ee8cc1Swenshuai.xi 
4184*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4185*53ee8cc1Swenshuai.xi }
4186*53ee8cc1Swenshuai.xi 
4187*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4188*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetSyncTolerance()
4189*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the tolerance of FW reporting sync reach.
4190*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : tolerance.
4191*53ee8cc1Swenshuai.xi /// @return -The result of command set sync tolerance
4192*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetSyncTolerance(MS_U32 u32Id,MS_U32 u32Arg)4193*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSyncTolerance(MS_U32 u32Id, MS_U32 u32Arg)
4194*53ee8cc1Swenshuai.xi {
4195*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4196*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4197*53ee8cc1Swenshuai.xi 
4198*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4199*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4200*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4201*53ee8cc1Swenshuai.xi 
4202*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_TOLERANCE, u32Arg);
4203*53ee8cc1Swenshuai.xi 
4204*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.u32SyncTolerance = u32Arg;
4205*53ee8cc1Swenshuai.xi 
4206*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4207*53ee8cc1Swenshuai.xi }
4208*53ee8cc1Swenshuai.xi 
4209*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4210*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetSyncVideoDelay()
4211*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the video delay from STC when sync mode active.
4212*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : The video delay. unit:ms
4213*53ee8cc1Swenshuai.xi /// @return -The result of command set sync video delay
4214*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetSyncVideoDelay(MS_U32 u32Id,MS_U32 u32Arg)4215*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSyncVideoDelay(MS_U32 u32Id, MS_U32 u32Arg)
4216*53ee8cc1Swenshuai.xi {
4217*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4218*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4219*53ee8cc1Swenshuai.xi 
4220*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4221*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4222*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4223*53ee8cc1Swenshuai.xi 
4224*53ee8cc1Swenshuai.xi     if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_LIVE_STREAM)
4225*53ee8cc1Swenshuai.xi     {
4226*53ee8cc1Swenshuai.xi         if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8TimeUnit)
4227*53ee8cc1Swenshuai.xi         {
4228*53ee8cc1Swenshuai.xi             eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_VIDEO_DELAY, (MS_U32) (u32Arg + HVD_DTV_VIDEO_DELAY));
4229*53ee8cc1Swenshuai.xi         }
4230*53ee8cc1Swenshuai.xi         else
4231*53ee8cc1Swenshuai.xi         {
4232*53ee8cc1Swenshuai.xi             eRet =
4233*53ee8cc1Swenshuai.xi                 (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_VIDEO_DELAY, u32Arg + ((MS_U32) HVD_DTV_VIDEO_DELAY * 90));
4234*53ee8cc1Swenshuai.xi         }
4235*53ee8cc1Swenshuai.xi     }
4236*53ee8cc1Swenshuai.xi     else
4237*53ee8cc1Swenshuai.xi     {
4238*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_VIDEO_DELAY, u32Arg);
4239*53ee8cc1Swenshuai.xi     }
4240*53ee8cc1Swenshuai.xi 
4241*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.u32SyncVideoDelay = u32Arg;
4242*53ee8cc1Swenshuai.xi 
4243*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4244*53ee8cc1Swenshuai.xi }
4245*53ee8cc1Swenshuai.xi 
4246*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4247*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetSyncFreeRunTH()
4248*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the tolerance of FW reporting sync reach.
4249*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : theashold.
4250*53ee8cc1Swenshuai.xi ///                     - 0 : use FW default value
4251*53ee8cc1Swenshuai.xi ///                     - 0xFFFFFFFF : never free run, FW always do sync action.
4252*53ee8cc1Swenshuai.xi /// @return -The result of command set sync tolerance
4253*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetSyncFreeRunTH(MS_U32 u32Id,MS_U32 u32Arg)4254*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSyncFreeRunTH(MS_U32 u32Id, MS_U32 u32Arg)
4255*53ee8cc1Swenshuai.xi {
4256*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4257*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4258*53ee8cc1Swenshuai.xi 
4259*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4260*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4261*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4262*53ee8cc1Swenshuai.xi 
4263*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FREERUN_THRESHOLD, u32Arg);
4264*53ee8cc1Swenshuai.xi 
4265*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.u32SyncFreeRunTH = u32Arg;
4266*53ee8cc1Swenshuai.xi 
4267*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4268*53ee8cc1Swenshuai.xi }
4269*53ee8cc1Swenshuai.xi 
4270*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4271*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetSyncRepeatTH()
4272*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the repeat threashold under sync mode.
4273*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : repeat times. 0x01 ~ 0xFF
4274*53ee8cc1Swenshuai.xi ///                 0xff - repeat current frame until STC catch up PTS.
4275*53ee8cc1Swenshuai.xi /// @return -The result of command set sync repeat threashold
4276*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetSyncRepeatTH(MS_U32 u32Id,MS_U32 u32Arg)4277*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSyncRepeatTH(MS_U32 u32Id, MS_U32 u32Arg)
4278*53ee8cc1Swenshuai.xi {
4279*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4280*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4281*53ee8cc1Swenshuai.xi 
4282*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4283*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4284*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4285*53ee8cc1Swenshuai.xi 
4286*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_THRESHOLD, u32Arg);
4287*53ee8cc1Swenshuai.xi 
4288*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.u32SyncRepeatTH = u32Arg;
4289*53ee8cc1Swenshuai.xi 
4290*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4291*53ee8cc1Swenshuai.xi }
4292*53ee8cc1Swenshuai.xi 
4293*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4294*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetErrConceal()
4295*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable/Disable error concealment.
4296*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
4297*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable error concealment.
4298*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable error concealment.
4299*53ee8cc1Swenshuai.xi /// @return -The result of command set sync tolerance
4300*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetErrConceal(MS_U32 u32Id,MS_BOOL bEnable)4301*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetErrConceal(MS_U32 u32Id, MS_BOOL bEnable)
4302*53ee8cc1Swenshuai.xi {
4303*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4304*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4305*53ee8cc1Swenshuai.xi 
4306*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4307*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4308*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4309*53ee8cc1Swenshuai.xi 
4310*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ERR_CONCEAL, bEnable);
4311*53ee8cc1Swenshuai.xi 
4312*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.bIsErrConceal = bEnable;
4313*53ee8cc1Swenshuai.xi 
4314*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4315*53ee8cc1Swenshuai.xi }
4316*53ee8cc1Swenshuai.xi 
4317*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4318*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDbgLevel()
4319*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set debug level
4320*53ee8cc1Swenshuai.xi /// @param -elevel \b IN : debug level
4321*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDbgLevel(MS_U32 u32Id,HVD_EX_UartLevel eLevel)4322*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_SetDbgLevel(MS_U32 u32Id, HVD_EX_UartLevel eLevel)
4323*53ee8cc1Swenshuai.xi {
4324*53ee8cc1Swenshuai.xi     VPU_EX_UartLevel eVpuLevel = E_VPU_EX_UART_LEVEL_NONE;
4325*53ee8cc1Swenshuai.xi 
4326*53ee8cc1Swenshuai.xi     switch (eLevel)
4327*53ee8cc1Swenshuai.xi     {
4328*53ee8cc1Swenshuai.xi         case E_HVD_EX_UART_LEVEL_ERR:
4329*53ee8cc1Swenshuai.xi         {
4330*53ee8cc1Swenshuai.xi             u32UartCtrl = E_HVD_UART_CTRL_ERR;
4331*53ee8cc1Swenshuai.xi             eVpuLevel = E_VPU_EX_UART_LEVEL_ERR;
4332*53ee8cc1Swenshuai.xi             break;
4333*53ee8cc1Swenshuai.xi         }
4334*53ee8cc1Swenshuai.xi         case E_HVD_EX_UART_LEVEL_INFO:
4335*53ee8cc1Swenshuai.xi         {
4336*53ee8cc1Swenshuai.xi             u32UartCtrl = E_HVD_UART_CTRL_INFO | E_HVD_UART_CTRL_ERR;
4337*53ee8cc1Swenshuai.xi             eVpuLevel = E_VPU_EX_UART_LEVEL_INFO;
4338*53ee8cc1Swenshuai.xi             break;
4339*53ee8cc1Swenshuai.xi         }
4340*53ee8cc1Swenshuai.xi         case E_HVD_EX_UART_LEVEL_DBG:
4341*53ee8cc1Swenshuai.xi         {
4342*53ee8cc1Swenshuai.xi             u32UartCtrl = E_HVD_UART_CTRL_DBG | E_HVD_UART_CTRL_ERR | E_HVD_UART_CTRL_INFO;
4343*53ee8cc1Swenshuai.xi             eVpuLevel = E_VPU_EX_UART_LEVEL_DBG;
4344*53ee8cc1Swenshuai.xi             break;
4345*53ee8cc1Swenshuai.xi         }
4346*53ee8cc1Swenshuai.xi         case E_HVD_EX_UART_LEVEL_TRACE:
4347*53ee8cc1Swenshuai.xi         {
4348*53ee8cc1Swenshuai.xi             u32UartCtrl = E_HVD_UART_CTRL_TRACE | E_HVD_UART_CTRL_ERR | E_HVD_UART_CTRL_INFO | E_HVD_UART_CTRL_DBG;
4349*53ee8cc1Swenshuai.xi             eVpuLevel = E_VPU_EX_UART_LEVEL_TRACE;
4350*53ee8cc1Swenshuai.xi             break;
4351*53ee8cc1Swenshuai.xi         }
4352*53ee8cc1Swenshuai.xi         case E_HVD_EX_UART_LEVEL_FW:
4353*53ee8cc1Swenshuai.xi         {
4354*53ee8cc1Swenshuai.xi             u32UartCtrl = E_HVD_UART_CTRL_DISABLE;
4355*53ee8cc1Swenshuai.xi 
4356*53ee8cc1Swenshuai.xi             HAL_HVD_EX_UartSwitch2FW(u32Id, TRUE);
4357*53ee8cc1Swenshuai.xi             break;
4358*53ee8cc1Swenshuai.xi         }
4359*53ee8cc1Swenshuai.xi         default:
4360*53ee8cc1Swenshuai.xi         {
4361*53ee8cc1Swenshuai.xi             u32UartCtrl = E_HVD_UART_CTRL_DISABLE;
4362*53ee8cc1Swenshuai.xi             eVpuLevel = E_VPU_EX_UART_LEVEL_ERR;
4363*53ee8cc1Swenshuai.xi             break;
4364*53ee8cc1Swenshuai.xi         }
4365*53ee8cc1Swenshuai.xi     }
4366*53ee8cc1Swenshuai.xi 
4367*53ee8cc1Swenshuai.xi     HAL_VPU_EX_SetDbgLevel(eVpuLevel);
4368*53ee8cc1Swenshuai.xi }
4369*53ee8cc1Swenshuai.xi 
4370*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4371*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SeekToPTS()
4372*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW decode to the input PTS by using full decoding speed. If FW reaches (equal to or larger than) input PTS, FW will pause automatically. This function can not work under MDrv_HVD_EX_SetSyncActive(TRUE).
4373*53ee8cc1Swenshuai.xi /// @param -u32PTS \b IN : specific PTS.
4374*53ee8cc1Swenshuai.xi ///                 -0: disable this mode. FW will go back to previous status (play or pause).
4375*53ee8cc1Swenshuai.xi ///                 -any not zero: enable this mode
4376*53ee8cc1Swenshuai.xi /// @return -The result of command seek to specific PTS.
4377*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SeekToPTS(MS_U32 u32Id,MS_U32 u32PTS)4378*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SeekToPTS(MS_U32 u32Id, MS_U32 u32PTS)
4379*53ee8cc1Swenshuai.xi {
4380*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4381*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4382*53ee8cc1Swenshuai.xi 
4383*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4384*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4385*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4386*53ee8cc1Swenshuai.xi 
4387*53ee8cc1Swenshuai.xi     eRet = _HVD_EX_Check_Cmd(u8DrvId, E_HVD_CHECK_CMD_SEEK2PTS);
4388*53ee8cc1Swenshuai.xi 
4389*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
4390*53ee8cc1Swenshuai.xi     {
4391*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
4392*53ee8cc1Swenshuai.xi     }
4393*53ee8cc1Swenshuai.xi 
4394*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_JUMP_TO_PTS, u32PTS);
4395*53ee8cc1Swenshuai.xi 
4396*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4397*53ee8cc1Swenshuai.xi }
4398*53ee8cc1Swenshuai.xi 
4399*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4400*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SkipToPTS()
4401*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW skip to the input PTS by using full decoding speed and start decode again after input PTS.
4402*53ee8cc1Swenshuai.xi /// @param -u32PTS \b IN : specific PTS.
4403*53ee8cc1Swenshuai.xi ///                 -0: disable this mode. FW will go back to previous status (play or pause).
4404*53ee8cc1Swenshuai.xi ///                 -any not zero: enable this mode
4405*53ee8cc1Swenshuai.xi /// @return -The result of command seek to specific PTS.
4406*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SkipToPTS(MS_U32 u32Id,MS_U32 u32PTS)4407*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SkipToPTS(MS_U32 u32Id, MS_U32 u32PTS)
4408*53ee8cc1Swenshuai.xi {
4409*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4410*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4411*53ee8cc1Swenshuai.xi 
4412*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4413*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4414*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4415*53ee8cc1Swenshuai.xi 
4416*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SKIP_TO_PTS, u32PTS);
4417*53ee8cc1Swenshuai.xi 
4418*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4419*53ee8cc1Swenshuai.xi }
4420*53ee8cc1Swenshuai.xi 
4421*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4422*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetFreezeImg()
4423*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW stop updating frames when vsync, but decoding process is still going.
4424*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
4425*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable freeze image.
4426*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable freeze image.
4427*53ee8cc1Swenshuai.xi /// @return -The result of command freeze image.
4428*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetFreezeImg(MS_U32 u32Id,MS_BOOL bEnable)4429*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetFreezeImg(MS_U32 u32Id, MS_BOOL bEnable)
4430*53ee8cc1Swenshuai.xi {
4431*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4432*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4433*53ee8cc1Swenshuai.xi 
4434*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4435*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4436*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4437*53ee8cc1Swenshuai.xi 
4438*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FREEZE_IMG, bEnable);
4439*53ee8cc1Swenshuai.xi 
4440*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4441*53ee8cc1Swenshuai.xi }
4442*53ee8cc1Swenshuai.xi 
4443*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4444*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetBlueScreen()
4445*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW stop updating frames when vsync and keep blue screen , but decoding process is still going.
4446*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
4447*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable blue screen.
4448*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable blue screen.
4449*53ee8cc1Swenshuai.xi /// @return -The result of command set blue screen.
4450*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetBlueScreen(MS_U32 u32Id,MS_BOOL bEnable)4451*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetBlueScreen(MS_U32 u32Id, MS_BOOL bEnable)
4452*53ee8cc1Swenshuai.xi {
4453*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4454*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4455*53ee8cc1Swenshuai.xi 
4456*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4457*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4458*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4459*53ee8cc1Swenshuai.xi 
4460*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_BLUE_SCREEN, bEnable);
4461*53ee8cc1Swenshuai.xi 
4462*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4463*53ee8cc1Swenshuai.xi }
4464*53ee8cc1Swenshuai.xi 
4465*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4466*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDispOneField()
4467*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW only show one field(top field only).
4468*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
4469*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable display one field.
4470*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable display one field.
4471*53ee8cc1Swenshuai.xi /// @return -The result of command display one field.
4472*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDispOneField(MS_U32 u32Id,MS_BOOL bEnable)4473*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDispOneField(MS_U32 u32Id, MS_BOOL bEnable)
4474*53ee8cc1Swenshuai.xi {
4475*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4476*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4477*53ee8cc1Swenshuai.xi 
4478*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4479*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4480*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4481*53ee8cc1Swenshuai.xi 
4482*53ee8cc1Swenshuai.xi     if (bEnable)
4483*53ee8cc1Swenshuai.xi     {
4484*53ee8cc1Swenshuai.xi         // force to show top field only.
4485*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_ONE_FIELD, E_HVD_FIELD_CTRL_TOP);
4486*53ee8cc1Swenshuai.xi     }
4487*53ee8cc1Swenshuai.xi     else
4488*53ee8cc1Swenshuai.xi     {
4489*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_ONE_FIELD, E_HVD_FIELD_CTRL_OFF);
4490*53ee8cc1Swenshuai.xi     }
4491*53ee8cc1Swenshuai.xi 
4492*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4493*53ee8cc1Swenshuai.xi }
4494*53ee8cc1Swenshuai.xi 
4495*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4496*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetISREvent()
4497*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set the ISR event type sended by HVD fw.
4498*53ee8cc1Swenshuai.xi /// @param -u32Event \b IN : event types
4499*53ee8cc1Swenshuai.xi /// @param -fnISRHandler \b IN : function pointer to a interrupt handler.
4500*53ee8cc1Swenshuai.xi /// @return -The result of command set ISR event.
4501*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetISREvent(MS_U32 u32Id,MS_U32 u32Event,HVD_InterruptCb fnISRHandler)4502*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetISREvent(MS_U32 u32Id, MS_U32 u32Event, HVD_InterruptCb fnISRHandler)
4503*53ee8cc1Swenshuai.xi {
4504*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4505*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4506*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
4507*53ee8cc1Swenshuai.xi 
4508*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4509*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4510*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4511*53ee8cc1Swenshuai.xi 
4512*53ee8cc1Swenshuai.xi     if (u32Event == E_HVD_EX_ISR_NONE)
4513*53ee8cc1Swenshuai.xi     {
4514*53ee8cc1Swenshuai.xi         MS_U32 i = 0;
4515*53ee8cc1Swenshuai.xi         MS_BOOL bUsed = FALSE;
4516*53ee8cc1Swenshuai.xi         pCtrl->Settings.bEnISR = FALSE;
4517*53ee8cc1Swenshuai.xi 
4518*53ee8cc1Swenshuai.xi         // Fix the ISR imbalance of Enable and Disable
4519*53ee8cc1Swenshuai.xi         if (pCtrl->HVDISRCtrl.eHWDecIsr == E_HWDEC_ISR_HVD)  // hvd case
4520*53ee8cc1Swenshuai.xi         {
4521*53ee8cc1Swenshuai.xi             for (i = 0; i < HVD_MAX_STREAMS; i++)
4522*53ee8cc1Swenshuai.xi             {
4523*53ee8cc1Swenshuai.xi                 if (i != u8DrvId)
4524*53ee8cc1Swenshuai.xi                 {
4525*53ee8cc1Swenshuai.xi                     if ((E_HWDEC_ISR_HVD == pHVDDrvContext->gHVDCtrl_EX[i].HVDISRCtrl.eHWDecIsr)
4526*53ee8cc1Swenshuai.xi                      && (TRUE == pHVDDrvContext->gHVDCtrl_EX[i].bUsed))
4527*53ee8cc1Swenshuai.xi                     {
4528*53ee8cc1Swenshuai.xi                         bUsed = TRUE;
4529*53ee8cc1Swenshuai.xi                         break;
4530*53ee8cc1Swenshuai.xi                     }
4531*53ee8cc1Swenshuai.xi                 }
4532*53ee8cc1Swenshuai.xi             }
4533*53ee8cc1Swenshuai.xi 
4534*53ee8cc1Swenshuai.xi             if ((bHVDDisableISRFlag != TRUE) && (FALSE == bUsed))
4535*53ee8cc1Swenshuai.xi             {
4536*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(HAL_CHIP_SUPPORT_EVD)
4537*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_EnableISR(u32Id, FALSE);
4538*53ee8cc1Swenshuai.xi #else
4539*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_EnableISR(FALSE);
4540*53ee8cc1Swenshuai.xi #endif
4541*53ee8cc1Swenshuai.xi                 bHVDDisableISRFlag = OSAL_HVD_ISR_Disable(HVD_ISR_VECTOR);
4542*53ee8cc1Swenshuai.xi                 if (bHVDDisableISRFlag == FALSE)
4543*53ee8cc1Swenshuai.xi                 {
4544*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("%s Disable Interrupt Fail\n", __FUNCTION__);
4545*53ee8cc1Swenshuai.xi                 }
4546*53ee8cc1Swenshuai.xi 
4547*53ee8cc1Swenshuai.xi #if !defined(SUPPORT_X_MODEL_HVD_FEATURE) && !defined(DISABLE_ISR_DETACH)
4548*53ee8cc1Swenshuai.xi                 if (TRUE == bHVDIsIsrAttached)
4549*53ee8cc1Swenshuai.xi                 {
4550*53ee8cc1Swenshuai.xi                     OSAL_HVD_ISR_Detach(HVD_ISR_VECTOR);
4551*53ee8cc1Swenshuai.xi                     bHVDIsIsrAttached = FALSE;
4552*53ee8cc1Swenshuai.xi                 }
4553*53ee8cc1Swenshuai.xi #endif
4554*53ee8cc1Swenshuai.xi             }
4555*53ee8cc1Swenshuai.xi         }
4556*53ee8cc1Swenshuai.xi         #if SUPPORT_EVD
4557*53ee8cc1Swenshuai.xi         else if (pCtrl->HVDISRCtrl.eHWDecIsr == E_HWDEC_ISR_EVD)  // evd case
4558*53ee8cc1Swenshuai.xi         {
4559*53ee8cc1Swenshuai.xi             for (i = 0; i < HVD_MAX_STREAMS; i++)
4560*53ee8cc1Swenshuai.xi             {
4561*53ee8cc1Swenshuai.xi                 if (i != u8DrvId)
4562*53ee8cc1Swenshuai.xi                 {
4563*53ee8cc1Swenshuai.xi                     if ((E_HWDEC_ISR_EVD == pHVDDrvContext->gHVDCtrl_EX[i].HVDISRCtrl.eHWDecIsr)
4564*53ee8cc1Swenshuai.xi                      && (TRUE == pHVDDrvContext->gHVDCtrl_EX[i].bUsed))
4565*53ee8cc1Swenshuai.xi                     {
4566*53ee8cc1Swenshuai.xi                         bUsed = TRUE;
4567*53ee8cc1Swenshuai.xi                         break;
4568*53ee8cc1Swenshuai.xi                     }
4569*53ee8cc1Swenshuai.xi                 }
4570*53ee8cc1Swenshuai.xi             }
4571*53ee8cc1Swenshuai.xi 
4572*53ee8cc1Swenshuai.xi             if ((bEVDDisableISRFlag != TRUE) && (FALSE == bUsed))
4573*53ee8cc1Swenshuai.xi             {
4574*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(HAL_CHIP_SUPPORT_EVD)
4575*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_EnableISR(u32Id, FALSE);
4576*53ee8cc1Swenshuai.xi #else
4577*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_EnableISR(FALSE);
4578*53ee8cc1Swenshuai.xi #endif
4579*53ee8cc1Swenshuai.xi                 bEVDDisableISRFlag = OSAL_HVD_ISR_Disable(EVD_ISR_VECTOR);
4580*53ee8cc1Swenshuai.xi                 if (bEVDDisableISRFlag == FALSE)
4581*53ee8cc1Swenshuai.xi                 {
4582*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("%s Disable Interrupt Fail\n", __FUNCTION__);
4583*53ee8cc1Swenshuai.xi                 }
4584*53ee8cc1Swenshuai.xi 
4585*53ee8cc1Swenshuai.xi #if !defined(SUPPORT_X_MODEL_HVD_FEATURE) && !defined(DISABLE_ISR_DETACH)
4586*53ee8cc1Swenshuai.xi                 if (TRUE == bEVDIsIsrAttached)
4587*53ee8cc1Swenshuai.xi                 {
4588*53ee8cc1Swenshuai.xi                     OSAL_HVD_ISR_Detach(EVD_ISR_VECTOR);
4589*53ee8cc1Swenshuai.xi                     bEVDIsIsrAttached = FALSE;
4590*53ee8cc1Swenshuai.xi                 }
4591*53ee8cc1Swenshuai.xi #endif
4592*53ee8cc1Swenshuai.xi             }
4593*53ee8cc1Swenshuai.xi         }
4594*53ee8cc1Swenshuai.xi         #if defined(CHIP_KANO) || defined(CHIP_CURRY)
4595*53ee8cc1Swenshuai.xi         else if (pCtrl->HVDISRCtrl.eHWDecIsr == E_HWDEC_ISR_EVDLITE)  // evdlite case
4596*53ee8cc1Swenshuai.xi         {
4597*53ee8cc1Swenshuai.xi             for (i = 0; i < HVD_MAX_STREAMS; i++)
4598*53ee8cc1Swenshuai.xi             {
4599*53ee8cc1Swenshuai.xi                 if (i != u8DrvId)
4600*53ee8cc1Swenshuai.xi                 {
4601*53ee8cc1Swenshuai.xi                     if ((E_HWDEC_ISR_EVDLITE == pHVDDrvContext->gHVDCtrl_EX[i].HVDISRCtrl.eHWDecIsr)
4602*53ee8cc1Swenshuai.xi                      && (TRUE == pHVDDrvContext->gHVDCtrl_EX[i].bUsed))
4603*53ee8cc1Swenshuai.xi                     {
4604*53ee8cc1Swenshuai.xi                         bUsed = TRUE;
4605*53ee8cc1Swenshuai.xi                         break;
4606*53ee8cc1Swenshuai.xi                     }
4607*53ee8cc1Swenshuai.xi                 }
4608*53ee8cc1Swenshuai.xi             }
4609*53ee8cc1Swenshuai.xi 
4610*53ee8cc1Swenshuai.xi             if ((bEVDLITEDisableISRFlag != TRUE) && (FALSE == bUsed))
4611*53ee8cc1Swenshuai.xi             {
4612*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(HAL_CHIP_SUPPORT_EVD)
4613*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_EnableISR(u32Id, FALSE);
4614*53ee8cc1Swenshuai.xi #else
4615*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_EnableISR(FALSE);
4616*53ee8cc1Swenshuai.xi #endif
4617*53ee8cc1Swenshuai.xi                 bEVDLITEDisableISRFlag = OSAL_HVD_ISR_Disable(EVD_LITE_ISR_VECTOR);
4618*53ee8cc1Swenshuai.xi                 if (bEVDLITEDisableISRFlag == FALSE)
4619*53ee8cc1Swenshuai.xi                 {
4620*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("%s Disable Interrupt Fail\n", __FUNCTION__);
4621*53ee8cc1Swenshuai.xi                 }
4622*53ee8cc1Swenshuai.xi 
4623*53ee8cc1Swenshuai.xi #if !defined(SUPPORT_X_MODEL_HVD_FEATURE) && !defined(DISABLE_ISR_DETACH)
4624*53ee8cc1Swenshuai.xi                 if (TRUE == bEVDLITEIsIsrAttached)
4625*53ee8cc1Swenshuai.xi                 {
4626*53ee8cc1Swenshuai.xi                     OSAL_HVD_ISR_Detach(EVD_LITE_ISR_VECTOR);
4627*53ee8cc1Swenshuai.xi                     bEVDLITEIsIsrAttached = FALSE;
4628*53ee8cc1Swenshuai.xi                 }
4629*53ee8cc1Swenshuai.xi #endif
4630*53ee8cc1Swenshuai.xi             }
4631*53ee8cc1Swenshuai.xi         }
4632*53ee8cc1Swenshuai.xi         #endif
4633*53ee8cc1Swenshuai.xi         #endif
4634*53ee8cc1Swenshuai.xi 
4635*53ee8cc1Swenshuai.xi         pCtrl->HVDISRCtrl.bRegISR = FALSE;
4636*53ee8cc1Swenshuai.xi         pCtrl->HVDISRCtrl.pfnISRCallBack = NULL;
4637*53ee8cc1Swenshuai.xi         pCtrl->Settings.u32IsrEvent = (MS_U32) E_HVD_EX_ISR_NONE;
4638*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_OK;
4639*53ee8cc1Swenshuai.xi     }
4640*53ee8cc1Swenshuai.xi     else
4641*53ee8cc1Swenshuai.xi     {
4642*53ee8cc1Swenshuai.xi         if (fnISRHandler != NULL)
4643*53ee8cc1Swenshuai.xi         {
4644*53ee8cc1Swenshuai.xi #if 1 //If ISR handler has been registerred, we only need to reset event flag.
4645*53ee8cc1Swenshuai.xi             if (pCtrl->HVDISRCtrl.bRegISR)
4646*53ee8cc1Swenshuai.xi             {
4647*53ee8cc1Swenshuai.xi                 pCtrl->HVDISRCtrl.pfnISRCallBack = (HVD_ISRCallBack) fnISRHandler;
4648*53ee8cc1Swenshuai.xi                 eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ISR_TYPE, u32Event);
4649*53ee8cc1Swenshuai.xi 
4650*53ee8cc1Swenshuai.xi                 if (eRet != E_HVD_EX_OK)
4651*53ee8cc1Swenshuai.xi                 {
4652*53ee8cc1Swenshuai.xi                     _DRV_HVD_EX_RET(u8DrvId, eRet);
4653*53ee8cc1Swenshuai.xi                 }
4654*53ee8cc1Swenshuai.xi 
4655*53ee8cc1Swenshuai.xi                 pCtrl->Settings.u32IsrEvent = u32Event;
4656*53ee8cc1Swenshuai.xi                 eRet = E_HVD_EX_OK;
4657*53ee8cc1Swenshuai.xi             }
4658*53ee8cc1Swenshuai.xi             else
4659*53ee8cc1Swenshuai.xi             {
4660*53ee8cc1Swenshuai.xi                 MS_U32 u32IsrVector = HVD_ISR_VECTOR;
4661*53ee8cc1Swenshuai.xi                 pCtrl->HVDISRCtrl.pfnISRCallBack = (HVD_ISRCallBack) fnISRHandler;
4662*53ee8cc1Swenshuai.xi 
4663*53ee8cc1Swenshuai.xi                 if (E_HWDEC_ISR_HVD == pCtrl->HVDISRCtrl.eHWDecIsr)
4664*53ee8cc1Swenshuai.xi                 {
4665*53ee8cc1Swenshuai.xi                     u32IsrVector = HVD_ISR_VECTOR;
4666*53ee8cc1Swenshuai.xi 
4667*53ee8cc1Swenshuai.xi                     if (FALSE == bHVDIsIsrAttached)
4668*53ee8cc1Swenshuai.xi                     {
4669*53ee8cc1Swenshuai.xi                         if (OSAL_HVD_ISR_Attach(u32IsrVector, (void*)_HVD_EX_ISRHandler) != TRUE)
4670*53ee8cc1Swenshuai.xi                         {
4671*53ee8cc1Swenshuai.xi                             HVD_EX_MSG_ERR("fail to attach _HVD_EX_ISRHandler!\n");
4672*53ee8cc1Swenshuai.xi                             return E_HVD_EX_FAIL;
4673*53ee8cc1Swenshuai.xi                         }
4674*53ee8cc1Swenshuai.xi                         HVD_PRINT("attach ISR number:%d\n", HVD_ISR_VECTOR);
4675*53ee8cc1Swenshuai.xi                         bHVDIsIsrAttached = TRUE;
4676*53ee8cc1Swenshuai.xi                     }
4677*53ee8cc1Swenshuai.xi                 }
4678*53ee8cc1Swenshuai.xi                 #if SUPPORT_EVD
4679*53ee8cc1Swenshuai.xi                 else if (E_HWDEC_ISR_EVD == pCtrl->HVDISRCtrl.eHWDecIsr)
4680*53ee8cc1Swenshuai.xi                 {
4681*53ee8cc1Swenshuai.xi                     u32IsrVector = EVD_ISR_VECTOR;
4682*53ee8cc1Swenshuai.xi 
4683*53ee8cc1Swenshuai.xi                     if (FALSE == bEVDIsIsrAttached)
4684*53ee8cc1Swenshuai.xi                     {
4685*53ee8cc1Swenshuai.xi                         if (OSAL_HVD_ISR_Attach(u32IsrVector, (void*)_EVD_EX_ISRHandler) != TRUE)
4686*53ee8cc1Swenshuai.xi                         {
4687*53ee8cc1Swenshuai.xi                             HVD_EX_MSG_ERR("fail to attach _EVD_EX_ISRHandler!\n");
4688*53ee8cc1Swenshuai.xi                             return E_HVD_EX_FAIL;
4689*53ee8cc1Swenshuai.xi                         }
4690*53ee8cc1Swenshuai.xi                         HVD_PRINT("attach ISR number:%d\n", EVD_ISR_VECTOR);
4691*53ee8cc1Swenshuai.xi                         bEVDIsIsrAttached = TRUE;
4692*53ee8cc1Swenshuai.xi                     }
4693*53ee8cc1Swenshuai.xi                 }
4694*53ee8cc1Swenshuai.xi                 #if defined(CHIP_KANO) || defined(CHIP_CURRY)
4695*53ee8cc1Swenshuai.xi                 else if (E_HWDEC_ISR_EVDLITE == pCtrl->HVDISRCtrl.eHWDecIsr)
4696*53ee8cc1Swenshuai.xi                 {
4697*53ee8cc1Swenshuai.xi                     u32IsrVector = EVD_LITE_ISR_VECTOR;
4698*53ee8cc1Swenshuai.xi 
4699*53ee8cc1Swenshuai.xi                     if (FALSE == bEVDLITEIsIsrAttached)
4700*53ee8cc1Swenshuai.xi                     {
4701*53ee8cc1Swenshuai.xi                         if (OSAL_HVD_ISR_Attach(u32IsrVector, (void*)_EVDLITE_EX_ISRHandler) != TRUE)
4702*53ee8cc1Swenshuai.xi                         {
4703*53ee8cc1Swenshuai.xi                             HVD_EX_MSG_ERR("fail to attach _EVDLITE_EX_ISRHandler!\n");
4704*53ee8cc1Swenshuai.xi                             return E_HVD_EX_FAIL;
4705*53ee8cc1Swenshuai.xi                         }
4706*53ee8cc1Swenshuai.xi                         HVD_PRINT("attach ISR number:%d\n", EVD_LITE_ISR_VECTOR);
4707*53ee8cc1Swenshuai.xi                         bEVDLITEIsIsrAttached = TRUE;
4708*53ee8cc1Swenshuai.xi                     }
4709*53ee8cc1Swenshuai.xi                 }
4710*53ee8cc1Swenshuai.xi                 #endif
4711*53ee8cc1Swenshuai.xi                 #endif
4712*53ee8cc1Swenshuai.xi 
4713*53ee8cc1Swenshuai.xi                 if (OSAL_HVD_ISR_Enable(u32IsrVector) != TRUE)
4714*53ee8cc1Swenshuai.xi                 {
4715*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("fail to OSAL_HVD_IntEnable!\n");
4716*53ee8cc1Swenshuai.xi                     return E_HVD_EX_FAIL;
4717*53ee8cc1Swenshuai.xi                 }
4718*53ee8cc1Swenshuai.xi 
4719*53ee8cc1Swenshuai.xi                 eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ISR_TYPE, u32Event);
4720*53ee8cc1Swenshuai.xi 
4721*53ee8cc1Swenshuai.xi                 if (eRet != E_HVD_EX_OK)
4722*53ee8cc1Swenshuai.xi                 {
4723*53ee8cc1Swenshuai.xi                     _DRV_HVD_EX_RET(u8DrvId, eRet);
4724*53ee8cc1Swenshuai.xi                 }
4725*53ee8cc1Swenshuai.xi 
4726*53ee8cc1Swenshuai.xi                 pCtrl->Settings.u32IsrEvent = u32Event;
4727*53ee8cc1Swenshuai.xi                 pCtrl->Settings.bEnISR = TRUE;
4728*53ee8cc1Swenshuai.xi             #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(HAL_CHIP_SUPPORT_EVD)
4729*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_EnableISR(u32Id, TRUE);
4730*53ee8cc1Swenshuai.xi             #else
4731*53ee8cc1Swenshuai.xi                 HAL_HVD_EX_EnableISR(TRUE);
4732*53ee8cc1Swenshuai.xi             #endif
4733*53ee8cc1Swenshuai.xi                 pCtrl->HVDISRCtrl.bRegISR = TRUE;
4734*53ee8cc1Swenshuai.xi                 eRet = E_HVD_EX_OK;
4735*53ee8cc1Swenshuai.xi             }
4736*53ee8cc1Swenshuai.xi #else
4737*53ee8cc1Swenshuai.xi             HAL_HVD_EX_EnableISR(FALSE);
4738*53ee8cc1Swenshuai.xi 
4739*53ee8cc1Swenshuai.xi             if (pCtrl->HVDISRCtrl.bRegISR)
4740*53ee8cc1Swenshuai.xi             {
4741*53ee8cc1Swenshuai.xi                 OSAL_HVD_ISR_Detach();
4742*53ee8cc1Swenshuai.xi                 pCtrl->HVDISRCtrl.bRegISR = FALSE;
4743*53ee8cc1Swenshuai.xi             }
4744*53ee8cc1Swenshuai.xi 
4745*53ee8cc1Swenshuai.xi             pCtrl->HVDISRCtrl.pfnISRCallBack = (HVD_ISRCallBack) fnISRHandler;
4746*53ee8cc1Swenshuai.xi             OSAL_HVD_ISR_Attach((void *) _HVD_EX_ISRHandler);
4747*53ee8cc1Swenshuai.xi             OSAL_HVD_ISR_Enable();
4748*53ee8cc1Swenshuai.xi 
4749*53ee8cc1Swenshuai.xi             HVD_EX_MSG_INF("attach ISR number:%d\n", HVD_ISR_VECTOR);
4750*53ee8cc1Swenshuai.xi             eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ISR_TYPE, u32Event);
4751*53ee8cc1Swenshuai.xi             pCtrl->Settings.u32IsrEvent = u32Event;
4752*53ee8cc1Swenshuai.xi 
4753*53ee8cc1Swenshuai.xi             if (eRet != E_HVD_EX_OK)
4754*53ee8cc1Swenshuai.xi             {
4755*53ee8cc1Swenshuai.xi                 _DRV_HVD_EX_RET(u8DrvId, eRet);
4756*53ee8cc1Swenshuai.xi             }
4757*53ee8cc1Swenshuai.xi 
4758*53ee8cc1Swenshuai.xi             HAL_HVD_EX_EnableISR(TRUE);
4759*53ee8cc1Swenshuai.xi             pCtrl->HVDISRCtrl.bRegISR = TRUE;
4760*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_OK;
4761*53ee8cc1Swenshuai.xi #endif
4762*53ee8cc1Swenshuai.xi         }
4763*53ee8cc1Swenshuai.xi         else
4764*53ee8cc1Swenshuai.xi         {
4765*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("SetISREvent with NULL pointer. ISR type:%u\n", u32Event);
4766*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_RET_INVALID_PARAMETER;
4767*53ee8cc1Swenshuai.xi         }
4768*53ee8cc1Swenshuai.xi     }
4769*53ee8cc1Swenshuai.xi 
4770*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4771*53ee8cc1Swenshuai.xi }
4772*53ee8cc1Swenshuai.xi 
4773*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4774*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetEnableISR()
4775*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable/Disable HVD interrupt.
4776*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
4777*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable interrupt.
4778*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable interrupt.
4779*53ee8cc1Swenshuai.xi /// @return -The result of command set enable ISR.
4780*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetEnableISR(MS_U32 u32Id,MS_BOOL bEnable)4781*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_SetEnableISR(MS_U32 u32Id, MS_BOOL bEnable)
4782*53ee8cc1Swenshuai.xi {
4783*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4784*53ee8cc1Swenshuai.xi 
4785*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4786*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
4787*53ee8cc1Swenshuai.xi 
4788*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(HAL_CHIP_SUPPORT_EVD)
4789*53ee8cc1Swenshuai.xi     HAL_HVD_EX_EnableISR(u32Id, bEnable);
4790*53ee8cc1Swenshuai.xi #else
4791*53ee8cc1Swenshuai.xi     HAL_HVD_EX_EnableISR(bEnable);
4792*53ee8cc1Swenshuai.xi #endif
4793*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.bEnISR = bEnable;
4794*53ee8cc1Swenshuai.xi 
4795*53ee8cc1Swenshuai.xi     return TRUE;
4796*53ee8cc1Swenshuai.xi }
4797*53ee8cc1Swenshuai.xi 
4798*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4799*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetForceISR()
4800*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: test the HVD interrupt function. Force FW send one interrupt.
4801*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
4802*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Clear force interrupt status from HK.
4803*53ee8cc1Swenshuai.xi ///                 -TRUE(1): force one interrupt from HK.
4804*53ee8cc1Swenshuai.xi /// @return -The result of command set force ISR.
4805*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetForceISR(MS_U32 u32Id,MS_BOOL bEnable)4806*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_SetForceISR(MS_U32 u32Id, MS_BOOL bEnable)
4807*53ee8cc1Swenshuai.xi {
4808*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4809*53ee8cc1Swenshuai.xi     //_DRV_HVD_Inited(FALSE);
4810*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(HAL_CHIP_SUPPORT_EVD)
4811*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetForceISR(u32Id, bEnable);
4812*53ee8cc1Swenshuai.xi #else
4813*53ee8cc1Swenshuai.xi     UNUSED(u32Id);
4814*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetForceISR(bEnable);
4815*53ee8cc1Swenshuai.xi #endif
4816*53ee8cc1Swenshuai.xi     return TRUE;
4817*53ee8cc1Swenshuai.xi }
4818*53ee8cc1Swenshuai.xi 
4819*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4820*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetMVOPDone()
4821*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: tell FW MVOP is ready for futher decode.
4822*53ee8cc1Swenshuai.xi /// @return -The result of command.
4823*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetMVOPDone(MS_U32 u32Id)4824*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_SetMVOPDone(MS_U32 u32Id)
4825*53ee8cc1Swenshuai.xi {
4826*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4827*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4828*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4829*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
4830*53ee8cc1Swenshuai.xi 
4831*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_BLUE_SCREEN, FALSE);
4832*53ee8cc1Swenshuai.xi 
4833*53ee8cc1Swenshuai.xi     if (E_HVD_EX_OK == eRet)
4834*53ee8cc1Swenshuai.xi     {
4835*53ee8cc1Swenshuai.xi         return TRUE;
4836*53ee8cc1Swenshuai.xi     }
4837*53ee8cc1Swenshuai.xi     else
4838*53ee8cc1Swenshuai.xi     {
4839*53ee8cc1Swenshuai.xi         return FALSE;
4840*53ee8cc1Swenshuai.xi     }
4841*53ee8cc1Swenshuai.xi }
4842*53ee8cc1Swenshuai.xi 
4843*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4844*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetVirtualBox()
4845*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set DS width and Height to F/W
4846*53ee8cc1Swenshuai.xi /// @param -u16Width \b IN :  frame width
4847*53ee8cc1Swenshuai.xi /// @param -u16Height \b IN :  frame height
4848*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetVirtualBox(MS_U32 u32Id,MS_U16 u16Width,MS_U16 u16Height)4849*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetVirtualBox(MS_U32 u32Id, MS_U16 u16Width, MS_U16 u16Height)
4850*53ee8cc1Swenshuai.xi {
4851*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4852*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4853*53ee8cc1Swenshuai.xi 
4854*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4855*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4856*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4857*53ee8cc1Swenshuai.xi 
4858*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_VIRTUAL_BOX_WIDTH, u16Width);
4859*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_VIRTUAL_BOX_HEIGHT, u16Height);
4860*53ee8cc1Swenshuai.xi 
4861*53ee8cc1Swenshuai.xi     eRet = E_HVD_EX_OK;
4862*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4863*53ee8cc1Swenshuai.xi }
4864*53ee8cc1Swenshuai.xi 
4865*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4866*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDynScalingParam()
4867*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Pass scalar parameters to decoder
4868*53ee8cc1Swenshuai.xi /// @return -The result of command.
4869*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDynScalingParam(MS_U32 u32Id,void * pStAddr,MS_U32 u32Size)4870*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDynScalingParam(MS_U32 u32Id, void *pStAddr, MS_U32 u32Size)
4871*53ee8cc1Swenshuai.xi {
4872*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4873*53ee8cc1Swenshuai.xi     MS_U32 addr = 0;
4874*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4875*53ee8cc1Swenshuai.xi 
4876*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4877*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4878*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4879*53ee8cc1Swenshuai.xi 
4880*53ee8cc1Swenshuai.xi     if ((pStAddr == NULL) || (u32Size == 0))
4881*53ee8cc1Swenshuai.xi     {
4882*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_RET_INVALID_PARAMETER;
4883*53ee8cc1Swenshuai.xi         _DRV_HVD_Inited(u8DrvId,eRet);
4884*53ee8cc1Swenshuai.xi     }
4885*53ee8cc1Swenshuai.xi     else
4886*53ee8cc1Swenshuai.xi     {
4887*53ee8cc1Swenshuai.xi         // 1. copy data input data array
4888*53ee8cc1Swenshuai.xi         addr = MDrv_HVD_EX_GetDynamicScalingInfo(u32Id, E_HVD_EX_DS_INFO_ADDR);
4889*53ee8cc1Swenshuai.xi 
4890*53ee8cc1Swenshuai.xi         if(addr == 0x0)
4891*53ee8cc1Swenshuai.xi         {
4892*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_FAIL;
4893*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
4894*53ee8cc1Swenshuai.xi         }
4895*53ee8cc1Swenshuai.xi 
4896*53ee8cc1Swenshuai.xi         HVD_memcpy(MS_PA2KSEG1(addr), pStAddr, u32Size);
4897*53ee8cc1Swenshuai.xi 
4898*53ee8cc1Swenshuai.xi         // 2. while till FW finish it.
4899*53ee8cc1Swenshuai.xi          eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SCALER_INFO_NOTIFY, ((MS_U8 *)pStAddr)[0]);
4900*53ee8cc1Swenshuai.xi     }
4901*53ee8cc1Swenshuai.xi 
4902*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4903*53ee8cc1Swenshuai.xi }
4904*53ee8cc1Swenshuai.xi 
4905*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4906*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDispInfoTH()
4907*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the upper and lower limitation of a valid SPS.
4908*53ee8cc1Swenshuai.xi /// @param -DispInfoTH \b IN : tolerance.
4909*53ee8cc1Swenshuai.xi /// @return -The result of command set display inforation threshold
4910*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDispInfoTH(MS_U32 u32Id,HVD_EX_DispInfoThreshold * DispInfoTH)4911*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDispInfoTH(MS_U32 u32Id, HVD_EX_DispInfoThreshold *DispInfoTH)
4912*53ee8cc1Swenshuai.xi {
4913*53ee8cc1Swenshuai.xi     HVD_Disp_Info_TH DispInfoTHTmp;
4914*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4915*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4916*53ee8cc1Swenshuai.xi 
4917*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4918*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4919*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4920*53ee8cc1Swenshuai.xi 
4921*53ee8cc1Swenshuai.xi     if (DispInfoTH == NULL)
4922*53ee8cc1Swenshuai.xi     {
4923*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
4924*53ee8cc1Swenshuai.xi     }
4925*53ee8cc1Swenshuai.xi 
4926*53ee8cc1Swenshuai.xi     DispInfoTHTmp.u32FrmrateLowBound = DispInfoTH->u32FrmrateLowBound;
4927*53ee8cc1Swenshuai.xi     DispInfoTHTmp.u32FrmrateUpBound = DispInfoTH->u32FrmrateUpBound;
4928*53ee8cc1Swenshuai.xi     DispInfoTHTmp.u32MvopLowBound = DispInfoTH->u32MvopLowBound;
4929*53ee8cc1Swenshuai.xi     DispInfoTHTmp.u32MvopUpBound = DispInfoTH->u32MvopUpBound;
4930*53ee8cc1Swenshuai.xi 
4931*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_DISP_INFO_TH, (MS_VIRT) (&DispInfoTHTmp));
4932*53ee8cc1Swenshuai.xi 
4933*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_UPDATE_DISP_THRESHOLD, 0);
4934*53ee8cc1Swenshuai.xi 
4935*53ee8cc1Swenshuai.xi     HVD_memcpy((void *) &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.DispInfoTH), (void *) (DispInfoTH), sizeof(HVD_EX_DispInfoThreshold));
4936*53ee8cc1Swenshuai.xi 
4937*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4938*53ee8cc1Swenshuai.xi }
4939*53ee8cc1Swenshuai.xi 
4940*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4941*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetIgnoreErrRef()
4942*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Turn on / off ignore error reference.
4943*53ee8cc1Swenshuai.xi /// @param -b bFastDisplay \b IN :  Enable/ Disable
4944*53ee8cc1Swenshuai.xi ///                 -FALSE(0): handle error reference
4945*53ee8cc1Swenshuai.xi ///                 -TRUE(1): ignore error reference
4946*53ee8cc1Swenshuai.xi /// @return -The result of command set ignore error reference
4947*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetIgnoreErrRef(MS_U32 u32Id,MS_BOOL bIgnore)4948*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetIgnoreErrRef(MS_U32 u32Id, MS_BOOL bIgnore)
4949*53ee8cc1Swenshuai.xi {
4950*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4951*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4952*53ee8cc1Swenshuai.xi 
4953*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4954*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4955*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4956*53ee8cc1Swenshuai.xi 
4957*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_IGNORE_ERR_REF, bIgnore);
4958*53ee8cc1Swenshuai.xi 
4959*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4960*53ee8cc1Swenshuai.xi }
4961*53ee8cc1Swenshuai.xi 
4962*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4963*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_ForceFollowDTVSpec()
4964*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Turn on / off Force follow DTV Spec
4965*53ee8cc1Swenshuai.xi /// @param -b bEnable \b IN :  Enable/ Disable
4966*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable
4967*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable
4968*53ee8cc1Swenshuai.xi /// @return -The result of command set force follow DTV spec
4969*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_ForceFollowDTVSpec(MS_U32 u32Id,MS_BOOL bEnable)4970*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_ForceFollowDTVSpec(MS_U32 u32Id, MS_BOOL bEnable)
4971*53ee8cc1Swenshuai.xi {
4972*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4973*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4974*53ee8cc1Swenshuai.xi 
4975*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4976*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4977*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
4978*53ee8cc1Swenshuai.xi 
4979*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FORCE_DTV_SPEC, bEnable);
4980*53ee8cc1Swenshuai.xi 
4981*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
4982*53ee8cc1Swenshuai.xi }
4983*53ee8cc1Swenshuai.xi 
4984*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4985*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetFastDisplay()
4986*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Turn on / off fast display.
4987*53ee8cc1Swenshuai.xi /// @param -b bFastDisplay \b IN :  Enable/ Disable
4988*53ee8cc1Swenshuai.xi ///                 -FALSE(0): normal display
4989*53ee8cc1Swenshuai.xi ///                 -TRUE(1): fast display
4990*53ee8cc1Swenshuai.xi /// @return -The result of command set fast display
4991*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetFastDisplay(MS_U32 u32Id,MS_BOOL bFastDisplay)4992*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetFastDisplay(MS_U32 u32Id, MS_BOOL bFastDisplay)
4993*53ee8cc1Swenshuai.xi {
4994*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4995*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4996*53ee8cc1Swenshuai.xi 
4997*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
4998*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
4999*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
5000*53ee8cc1Swenshuai.xi 
5001*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FAST_DISP, bFastDisplay);
5002*53ee8cc1Swenshuai.xi 
5003*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
5004*53ee8cc1Swenshuai.xi }
5005*53ee8cc1Swenshuai.xi 
5006*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5007*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_DispOutsideMode()
5008*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Turn on / off Disp control method which handle by app side
5009*53ee8cc1Swenshuai.xi /// @param -b bEnable \b IN :  Enable/ Disable
5010*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable
5011*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable
5012*53ee8cc1Swenshuai.xi /// @return -
5013*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_DispOutsideMode(MS_U32 u32Id,MS_BOOL bEnable)5014*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_DispOutsideMode(MS_U32 u32Id, MS_BOOL bEnable)
5015*53ee8cc1Swenshuai.xi {
5016*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
5017*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5018*53ee8cc1Swenshuai.xi 
5019*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5020*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
5021*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
5022*53ee8cc1Swenshuai.xi     _DRV_HVD_SetCtrl(u8DrvId, HVD_CTRL_DISP_OUTSIDE);
5023*53ee8cc1Swenshuai.xi //change to open max setting ,wait f/w release new fwHVD_if
5024*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ENABLE_DISP_OUTSIDE, bEnable);
5025*53ee8cc1Swenshuai.xi 
5026*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
5027*53ee8cc1Swenshuai.xi }
5028*53ee8cc1Swenshuai.xi // check status
5029*53ee8cc1Swenshuai.xi 
5030*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5031*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsISROccured()
5032*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Check if the ISR is occured or not.
5033*53ee8cc1Swenshuai.xi /// @return - Is occured or not
5034*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): interrupt is not occured.
5035*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): interrupt has been occured.
5036*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsISROccured(MS_U32 u32Id)5037*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsISROccured(MS_U32 u32Id)
5038*53ee8cc1Swenshuai.xi {
5039*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5040*53ee8cc1Swenshuai.xi     //_DRV_HVD_Inited(FALSE);
5041*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(HAL_CHIP_SUPPORT_EVD)
5042*53ee8cc1Swenshuai.xi     return HAL_HVD_EX_IsISROccured(u32Id);
5043*53ee8cc1Swenshuai.xi #else
5044*53ee8cc1Swenshuai.xi     UNUSED(u32Id);
5045*53ee8cc1Swenshuai.xi     return HAL_HVD_EX_IsISROccured();
5046*53ee8cc1Swenshuai.xi #endif
5047*53ee8cc1Swenshuai.xi }
5048*53ee8cc1Swenshuai.xi 
5049*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5050*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsDispFinish()
5051*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Check this file mode display is finish or not. only work after MDrv_HVD_EX_SetDataEnd(TRUE)
5052*53ee8cc1Swenshuai.xi /// @return - Is finish or not
5053*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Not finish or Not in file mode playback
5054*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Display Finished.
5055*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsDispFinish(MS_U32 u32Id)5056*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsDispFinish(MS_U32 u32Id)
5057*53ee8cc1Swenshuai.xi {
5058*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5059*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5060*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5061*53ee8cc1Swenshuai.xi 
5062*53ee8cc1Swenshuai.xi     if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_LIVE_STREAM)
5063*53ee8cc1Swenshuai.xi     {
5064*53ee8cc1Swenshuai.xi         return FALSE;
5065*53ee8cc1Swenshuai.xi     }
5066*53ee8cc1Swenshuai.xi 
5067*53ee8cc1Swenshuai.xi     if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode & HVD_CTRL_DATA_END)
5068*53ee8cc1Swenshuai.xi     {
5069*53ee8cc1Swenshuai.xi #ifndef VDEC3
5070*53ee8cc1Swenshuai.xi         if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_VP8)
5071*53ee8cc1Swenshuai.xi         {
5072*53ee8cc1Swenshuai.xi             if (_HVD_EX_IsAllBufferEmpty_VP8(u32Id))
5073*53ee8cc1Swenshuai.xi             {
5074*53ee8cc1Swenshuai.xi                 return TRUE;
5075*53ee8cc1Swenshuai.xi             }
5076*53ee8cc1Swenshuai.xi             else
5077*53ee8cc1Swenshuai.xi             {
5078*53ee8cc1Swenshuai.xi                 return FALSE;
5079*53ee8cc1Swenshuai.xi             }
5080*53ee8cc1Swenshuai.xi         }
5081*53ee8cc1Swenshuai.xi         else
5082*53ee8cc1Swenshuai.xi #endif
5083*53ee8cc1Swenshuai.xi         {
5084*53ee8cc1Swenshuai.xi             if (_HVD_EX_IsAllBufferEmpty(u32Id, FALSE))
5085*53ee8cc1Swenshuai.xi             {
5086*53ee8cc1Swenshuai.xi                 return TRUE;
5087*53ee8cc1Swenshuai.xi             }
5088*53ee8cc1Swenshuai.xi             else
5089*53ee8cc1Swenshuai.xi             {
5090*53ee8cc1Swenshuai.xi                 //_DRV_HVD_PushDummy();
5091*53ee8cc1Swenshuai.xi                 return FALSE;
5092*53ee8cc1Swenshuai.xi             }
5093*53ee8cc1Swenshuai.xi         }
5094*53ee8cc1Swenshuai.xi     }
5095*53ee8cc1Swenshuai.xi     else
5096*53ee8cc1Swenshuai.xi     {
5097*53ee8cc1Swenshuai.xi         return FALSE;
5098*53ee8cc1Swenshuai.xi     }
5099*53ee8cc1Swenshuai.xi }
5100*53ee8cc1Swenshuai.xi 
5101*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5102*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsFrameShowed()
5103*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Is HVD Frame showed after TriggerDisp(TRUE) or first frame showed
5104*53ee8cc1Swenshuai.xi /// @return - Is frame showed or not
5105*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): New Framed showed
5106*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Not showed
5107*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsFrameShowed(MS_U32 u32Id)5108*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsFrameShowed(MS_U32 u32Id)
5109*53ee8cc1Swenshuai.xi {
5110*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5111*53ee8cc1Swenshuai.xi 
5112*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5113*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5114*53ee8cc1Swenshuai.xi 
5115*53ee8cc1Swenshuai.xi     if (!HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_1ST_FRM_RDY))
5116*53ee8cc1Swenshuai.xi     {
5117*53ee8cc1Swenshuai.xi         // 1st frame not ready or AV sync not ready
5118*53ee8cc1Swenshuai.xi         return FALSE;
5119*53ee8cc1Swenshuai.xi     }
5120*53ee8cc1Swenshuai.xi     else
5121*53ee8cc1Swenshuai.xi     {
5122*53ee8cc1Swenshuai.xi         // 1st frame showed or AV sync ready
5123*53ee8cc1Swenshuai.xi         if (_DRV_HVD_Ctrl(u8DrvId, HVD_CTRL_DISPLAY_CTRL))
5124*53ee8cc1Swenshuai.xi         {
5125*53ee8cc1Swenshuai.xi             // control display
5126*53ee8cc1Swenshuai.xi             return (MS_BOOL) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_FRAME_SHOWED);
5127*53ee8cc1Swenshuai.xi         }
5128*53ee8cc1Swenshuai.xi         else
5129*53ee8cc1Swenshuai.xi         {
5130*53ee8cc1Swenshuai.xi             // cotrol decode
5131*53ee8cc1Swenshuai.xi             return TRUE;
5132*53ee8cc1Swenshuai.xi         }
5133*53ee8cc1Swenshuai.xi     }
5134*53ee8cc1Swenshuai.xi }
5135*53ee8cc1Swenshuai.xi 
5136*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5137*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsStepDecodeDone()
5138*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Is HVD step decode done after step decode command.
5139*53ee8cc1Swenshuai.xi /// @return - TRUE/FALSE
5140*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): decoding, or user did not send corresponding step decode command.
5141*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): decode done
5142*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsStepDecodeDone(MS_U32 u32Id)5143*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsStepDecodeDone(MS_U32 u32Id)
5144*53ee8cc1Swenshuai.xi {
5145*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
5146*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5147*53ee8cc1Swenshuai.xi 
5148*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5149*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5150*53ee8cc1Swenshuai.xi 
5151*53ee8cc1Swenshuai.xi     if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bStepDecoding)
5152*53ee8cc1Swenshuai.xi     {
5153*53ee8cc1Swenshuai.xi         if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32StepDecodeCnt !=
5154*53ee8cc1Swenshuai.xi             HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DECODE_CNT))
5155*53ee8cc1Swenshuai.xi         {
5156*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32StepDecodeCnt = 0;
5157*53ee8cc1Swenshuai.xi             bRet = TRUE;
5158*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bStepDecoding = FALSE;
5159*53ee8cc1Swenshuai.xi         }
5160*53ee8cc1Swenshuai.xi     }
5161*53ee8cc1Swenshuai.xi 
5162*53ee8cc1Swenshuai.xi     return bRet;
5163*53ee8cc1Swenshuai.xi }
5164*53ee8cc1Swenshuai.xi 
5165*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5166*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_CheckDispInfoRdy()
5167*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check display info ready and correct or not
5168*53ee8cc1Swenshuai.xi /// @return -The result of command check display infor ready or not
5169*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_CheckDispInfoRdy(MS_U32 u32Id)5170*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CheckDispInfoRdy(MS_U32 u32Id)
5171*53ee8cc1Swenshuai.xi {
5172*53ee8cc1Swenshuai.xi     MS_U32 u32ErrCode = 0;
5173*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
5174*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5175*53ee8cc1Swenshuai.xi 
5176*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5177*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
5178*53ee8cc1Swenshuai.xi 
5179*53ee8cc1Swenshuai.xi     #if defined(SUPPORT_CMA)
5180*53ee8cc1Swenshuai.xi     if (pHVDDrvContext->bCMAUsed && !HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_CMA_ALLOC_DONE))
5181*53ee8cc1Swenshuai.xi     {
5182*53ee8cc1Swenshuai.xi         HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
5183*53ee8cc1Swenshuai.xi         struct CMA_Pool_Alloc_Param alloc_param, alloc_param2;
5184*53ee8cc1Swenshuai.xi         MS_U32 framebuf_size, framebuf_size2 = 0;
5185*53ee8cc1Swenshuai.xi         MS_U8 u8BitMiuSel = 0;
5186*53ee8cc1Swenshuai.xi         MS_U8 u8CodeMiuSel = 0;
5187*53ee8cc1Swenshuai.xi         MS_U8 u8FBMiuSel = 0, u8FB2MiuSel = 0;
5188*53ee8cc1Swenshuai.xi         MS_U32 u32BitStartOffset;
5189*53ee8cc1Swenshuai.xi         MS_U32 u32CodeStartOffset;
5190*53ee8cc1Swenshuai.xi 
5191*53ee8cc1Swenshuai.xi         framebuf_size = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FRAMEBUF_SIZE);
5192*53ee8cc1Swenshuai.xi         if (framebuf_size == 0)
5193*53ee8cc1Swenshuai.xi             return E_HVD_EX_RET_NOTREADY;
5194*53ee8cc1Swenshuai.xi 
5195*53ee8cc1Swenshuai.xi         if (pHVDDrvContext->bCMATwoMIU[u8DrvId])
5196*53ee8cc1Swenshuai.xi         {
5197*53ee8cc1Swenshuai.xi             framebuf_size2 = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FRAMEBUF2_SIZE);
5198*53ee8cc1Swenshuai.xi             if (framebuf_size2 == 0)
5199*53ee8cc1Swenshuai.xi                 return E_HVD_EX_RET_NOTREADY;
5200*53ee8cc1Swenshuai.xi         }
5201*53ee8cc1Swenshuai.xi         alloc_param.pool_handle_id = pHVDDrvContext->cmaInitParam[0].pool_handle_id;
5202*53ee8cc1Swenshuai.xi         alloc_param.offset_in_pool = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FRAMEBUF_ADDR) - pHVDDrvContext->cmaInitParam[0].heap_miu_start_offset;
5203*53ee8cc1Swenshuai.xi         alloc_param.length = framebuf_size;
5204*53ee8cc1Swenshuai.xi         alloc_param.flags = CMA_FLAG_VIRT_ADDR;
5205*53ee8cc1Swenshuai.xi         if (MApi_CMA_Pool_GetMem(&alloc_param) == FALSE)
5206*53ee8cc1Swenshuai.xi             return E_HVD_EX_RET_CMA_ERROR;
5207*53ee8cc1Swenshuai.xi 
5208*53ee8cc1Swenshuai.xi         VPRINTF("[VDEC][%d]MApi_CMA_Pool_GetMem in hvd: alloc_param.pool_handle_id=%x, alloc_param.flags=%x, alloc_param.offset_in_pool=%llx, alloc_param.length=%x\n",
5209*53ee8cc1Swenshuai.xi                                 (unsigned int)u8DrvId,
5210*53ee8cc1Swenshuai.xi                                 (unsigned int)alloc_param.pool_handle_id,
5211*53ee8cc1Swenshuai.xi                                 (unsigned int)alloc_param.flags,
5212*53ee8cc1Swenshuai.xi                                 (unsigned long long int)alloc_param.offset_in_pool,
5213*53ee8cc1Swenshuai.xi                                 (unsigned int)alloc_param.length);
5214*53ee8cc1Swenshuai.xi 
5215*53ee8cc1Swenshuai.xi         pHVDDrvContext->cmaFreeParam[0][u8DrvId].pool_handle_id = alloc_param.pool_handle_id;
5216*53ee8cc1Swenshuai.xi         pHVDDrvContext->cmaFreeParam[0][u8DrvId].offset_in_pool = alloc_param.offset_in_pool;
5217*53ee8cc1Swenshuai.xi         pHVDDrvContext->cmaFreeParam[0][u8DrvId].length = alloc_param.length;
5218*53ee8cc1Swenshuai.xi         u8FBMiuSel = pHVDDrvContext->cmaInitParam[0].miu;
5219*53ee8cc1Swenshuai.xi         HVD_EX_MSG_DBG("[0x%lx]MApi_CMA_Pool_GetMem:offset=0x%lx, len=0x%lx, miu=%ld\n", u32Id, alloc_param.offset_in_pool, alloc_param.length, pHVDDrvContext->cmaInitParam[0].miu);
5220*53ee8cc1Swenshuai.xi 
5221*53ee8cc1Swenshuai.xi         if (pHVDDrvContext->bCMATwoMIU[u8DrvId])
5222*53ee8cc1Swenshuai.xi         {
5223*53ee8cc1Swenshuai.xi             alloc_param2.pool_handle_id = pHVDDrvContext->cmaInitParam[1].pool_handle_id;
5224*53ee8cc1Swenshuai.xi             alloc_param2.offset_in_pool = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FRAMEBUF2_ADDR) - pHVDDrvContext->cmaInitParam[1].heap_miu_start_offset;
5225*53ee8cc1Swenshuai.xi             alloc_param2.length = framebuf_size2;
5226*53ee8cc1Swenshuai.xi             alloc_param2.flags = CMA_FLAG_VIRT_ADDR;
5227*53ee8cc1Swenshuai.xi             if (MApi_CMA_Pool_GetMem(&alloc_param2) == FALSE)
5228*53ee8cc1Swenshuai.xi                 return E_HVD_EX_RET_CMA_ERROR;
5229*53ee8cc1Swenshuai.xi 
5230*53ee8cc1Swenshuai.xi             VPRINTF("[VDEC][%d]MApi_CMA_Pool_GetMem in hvd2: alloc_param.pool_handle_id=%x, alloc_param.flags=%x, alloc_param.offset_in_pool=%llx, alloc_param.length=%x\n",
5231*53ee8cc1Swenshuai.xi                                 (unsigned int)u8DrvId,
5232*53ee8cc1Swenshuai.xi                                 (unsigned int)alloc_param.pool_handle_id,
5233*53ee8cc1Swenshuai.xi                                 (unsigned int)alloc_param.flags,
5234*53ee8cc1Swenshuai.xi                                 (unsigned long long int)alloc_param.offset_in_pool,
5235*53ee8cc1Swenshuai.xi                                 (unsigned int)alloc_param.length);
5236*53ee8cc1Swenshuai.xi 
5237*53ee8cc1Swenshuai.xi             pHVDDrvContext->cmaFreeParam[1][u8DrvId].pool_handle_id = alloc_param2.pool_handle_id;
5238*53ee8cc1Swenshuai.xi             pHVDDrvContext->cmaFreeParam[1][u8DrvId].offset_in_pool = alloc_param2.offset_in_pool;
5239*53ee8cc1Swenshuai.xi             pHVDDrvContext->cmaFreeParam[1][u8DrvId].length = alloc_param2.length;
5240*53ee8cc1Swenshuai.xi             u8FB2MiuSel = pHVDDrvContext->cmaInitParam[1].miu;
5241*53ee8cc1Swenshuai.xi             HVD_EX_MSG_DBG("[0x%lx]MApi_CMA_Pool_GetMem:offset=0x%lx, len=0x%lx, miu=%ld\n", u32Id, alloc_param2.offset_in_pool, alloc_param2.length, pHVDDrvContext->cmaInitParam[1].miu);
5242*53ee8cc1Swenshuai.xi         }
5243*53ee8cc1Swenshuai.xi         else
5244*53ee8cc1Swenshuai.xi         {
5245*53ee8cc1Swenshuai.xi             u8FB2MiuSel = u8FBMiuSel;
5246*53ee8cc1Swenshuai.xi         }
5247*53ee8cc1Swenshuai.xi 
5248*53ee8cc1Swenshuai.xi         _phy_to_miu_offset(u8BitMiuSel, u32BitStartOffset, pCtrl->MemMap.u32BitstreamBufAddr);
5249*53ee8cc1Swenshuai.xi         _phy_to_miu_offset(u8CodeMiuSel, u32CodeStartOffset, pCtrl->MemMap.u32CodeBufAddr);
5250*53ee8cc1Swenshuai.xi 
5251*53ee8cc1Swenshuai.xi         MS_U32 u32MIUSel = (u8BitMiuSel << VDEC_BS_MIUSEL) |
5252*53ee8cc1Swenshuai.xi                             (u8FBMiuSel << VDEC_LUMA8_MIUSEL) |
5253*53ee8cc1Swenshuai.xi //                            (u8FBMiuSel << VDEC_CHROMA8_MIUSEL) |
5254*53ee8cc1Swenshuai.xi //                            (u8FB2MiuSel << VDEC_LUMA2_MIUSEL) |
5255*53ee8cc1Swenshuai.xi                             (u8FB2MiuSel << VDEC_CHROMA2_MIUSEL) |
5256*53ee8cc1Swenshuai.xi                             (u8FBMiuSel << VDEC_HWBUF_MIUSEL) |
5257*53ee8cc1Swenshuai.xi                             (u8FBMiuSel << VDEC_BUF1_MIUSEL) |
5258*53ee8cc1Swenshuai.xi                             (u8FB2MiuSel << VDEC_BUF2_MIUSEL) |
5259*53ee8cc1Swenshuai.xi                             (u8FBMiuSel << VDEC_PPIN_MIUSEL);
5260*53ee8cc1Swenshuai.xi #ifdef CHIP_MONET
5261*53ee8cc1Swenshuai.xi         u32MIUSel |= (u8FB2MiuSel << VDEC_CHROMA8_MIUSEL) |
5262*53ee8cc1Swenshuai.xi                      (u8FBMiuSel << VDEC_LUMA2_MIUSEL);
5263*53ee8cc1Swenshuai.xi #else
5264*53ee8cc1Swenshuai.xi         u32MIUSel |= (u8FBMiuSel << VDEC_CHROMA8_MIUSEL) |
5265*53ee8cc1Swenshuai.xi                      (u8FB2MiuSel << VDEC_LUMA2_MIUSEL);
5266*53ee8cc1Swenshuai.xi #endif
5267*53ee8cc1Swenshuai.xi #if SUPPORT_G2VP9
5268*53ee8cc1Swenshuai.xi         if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_VP9)
5269*53ee8cc1Swenshuai.xi         {
5270*53ee8cc1Swenshuai.xi             u32MIUSel &= (~(VDEC_MIUSEL_MASK << VDEC_LUMA8_MIUSEL));
5271*53ee8cc1Swenshuai.xi             u32MIUSel &= (~(VDEC_MIUSEL_MASK << VDEC_CHROMA8_MIUSEL));
5272*53ee8cc1Swenshuai.xi             u32MIUSel |= (u8FB2MiuSel << VDEC_LUMA8_MIUSEL);
5273*53ee8cc1Swenshuai.xi             u32MIUSel |= (u8FB2MiuSel << VDEC_CHROMA8_MIUSEL);
5274*53ee8cc1Swenshuai.xi         }
5275*53ee8cc1Swenshuai.xi #endif
5276*53ee8cc1Swenshuai.xi 
5277*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_MIU_SEL, u32MIUSel);
5278*53ee8cc1Swenshuai.xi 
5279*53ee8cc1Swenshuai.xi         HVD_EX_MSG_DBG("E_HVD_SDATA_MIU_SEL = 0x%lx\n", u32MIUSel);
5280*53ee8cc1Swenshuai.xi 
5281*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_CMA_ALLOC_DONE, 1);
5282*53ee8cc1Swenshuai.xi     }
5283*53ee8cc1Swenshuai.xi     #endif
5284*53ee8cc1Swenshuai.xi 
5285*53ee8cc1Swenshuai.xi     if (!(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode & HVD_CTRL_DISP_INFO_RDY))
5286*53ee8cc1Swenshuai.xi     {
5287*53ee8cc1Swenshuai.xi         if (!HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_DISP_INFO_CHANGE))
5288*53ee8cc1Swenshuai.xi         {
5289*53ee8cc1Swenshuai.xi             return E_HVD_EX_RET_NOTREADY;
5290*53ee8cc1Swenshuai.xi         }
5291*53ee8cc1Swenshuai.xi         else
5292*53ee8cc1Swenshuai.xi         {
5293*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bIsDispInfoChg = TRUE;
5294*53ee8cc1Swenshuai.xi             _DRV_HVD_SetCtrl(u8DrvId, HVD_CTRL_DISP_INFO_RDY);
5295*53ee8cc1Swenshuai.xi         }
5296*53ee8cc1Swenshuai.xi     }
5297*53ee8cc1Swenshuai.xi 
5298*53ee8cc1Swenshuai.xi     // check if FW report error
5299*53ee8cc1Swenshuai.xi     u32ErrCode = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ERROR_CODE);
5300*53ee8cc1Swenshuai.xi 
5301*53ee8cc1Swenshuai.xi     if (u32ErrCode != 0)
5302*53ee8cc1Swenshuai.xi     {
5303*53ee8cc1Swenshuai.xi         if (u32ErrCode == E_HVD_ERR_OUT_OF_MEMORY)
5304*53ee8cc1Swenshuai.xi         {
5305*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR
5306*53ee8cc1Swenshuai.xi                 ("FW error that Out of Memory:%x. Allocated frame buffer size is smaller than required.\n",
5307*53ee8cc1Swenshuai.xi                  u32ErrCode);
5308*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bIsDispInfoChg = FALSE;
5309*53ee8cc1Swenshuai.xi             return E_HVD_EX_RET_OUTOF_MEMORY;
5310*53ee8cc1Swenshuai.xi         }
5311*53ee8cc1Swenshuai.xi     }
5312*53ee8cc1Swenshuai.xi 
5313*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
5314*53ee8cc1Swenshuai.xi }
5315*53ee8cc1Swenshuai.xi 
5316*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5317*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsDispInfoChg()
5318*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check display info is changed or not
5319*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
5320*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): not changed
5321*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): changed
5322*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsDispInfoChg(MS_U32 u32Id)5323*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsDispInfoChg(MS_U32 u32Id)
5324*53ee8cc1Swenshuai.xi {
5325*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
5326*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5327*53ee8cc1Swenshuai.xi 
5328*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5329*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5330*53ee8cc1Swenshuai.xi 
5331*53ee8cc1Swenshuai.xi     bRet = (MS_BOOL) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_DISP_INFO_CHANGE);
5332*53ee8cc1Swenshuai.xi 
5333*53ee8cc1Swenshuai.xi     if (bRet)
5334*53ee8cc1Swenshuai.xi     {
5335*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bIsDispInfoChg = TRUE;
5336*53ee8cc1Swenshuai.xi         _DRV_HVD_SetCtrl(u8DrvId, HVD_CTRL_DISP_INFO_RDY);
5337*53ee8cc1Swenshuai.xi     }
5338*53ee8cc1Swenshuai.xi #if 0                           // debug use
5339*53ee8cc1Swenshuai.xi     {
5340*53ee8cc1Swenshuai.xi         static MS_U32 u32DecodeCnt = 0;
5341*53ee8cc1Swenshuai.xi         static MS_U32 u32IdleCnt = 0;
5342*53ee8cc1Swenshuai.xi         MS_U32 tmp = 0;
5343*53ee8cc1Swenshuai.xi         tmp = MDrv_HVD_EX_GetDecodeCnt(u32Id);
5344*53ee8cc1Swenshuai.xi 
5345*53ee8cc1Swenshuai.xi         if (u32DecodeCnt != tmp)
5346*53ee8cc1Swenshuai.xi         {
5347*53ee8cc1Swenshuai.xi             HVD_PRINT("%u decode cnt:%x PTS:%x\n", (MS_U32) bRet, tmp, MDrv_HVD_EX_GetPTS(u32Id));
5348*53ee8cc1Swenshuai.xi             u32DecodeCnt = tmp;
5349*53ee8cc1Swenshuai.xi         }
5350*53ee8cc1Swenshuai.xi         else
5351*53ee8cc1Swenshuai.xi         {
5352*53ee8cc1Swenshuai.xi             u32IdleCnt++;
5353*53ee8cc1Swenshuai.xi         }
5354*53ee8cc1Swenshuai.xi         if (u32IdleCnt > 1000)
5355*53ee8cc1Swenshuai.xi         {
5356*53ee8cc1Swenshuai.xi             HVD_PRINT("HVD: seems IDLE: %u decode cnt:%x PTS:%x\n", (MS_U32) bRet, tmp, MDrv_HVD_EX_GetPTS(u32Id));
5357*53ee8cc1Swenshuai.xi             u32IdleCnt = 0;
5358*53ee8cc1Swenshuai.xi         }
5359*53ee8cc1Swenshuai.xi     }
5360*53ee8cc1Swenshuai.xi #endif
5361*53ee8cc1Swenshuai.xi     return bRet;
5362*53ee8cc1Swenshuai.xi }
5363*53ee8cc1Swenshuai.xi 
5364*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5365*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsIdle()
5366*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check decoder is idle or not
5367*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
5368*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): decoder is not idle
5369*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): decoder is idle
5370*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsIdle(MS_U32 u32Id)5371*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsIdle(MS_U32 u32Id)
5372*53ee8cc1Swenshuai.xi {
5373*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5374*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5375*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5376*53ee8cc1Swenshuai.xi 
5377*53ee8cc1Swenshuai.xi     if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT) > HVD_FW_IDLE_THRESHOLD)
5378*53ee8cc1Swenshuai.xi     {
5379*53ee8cc1Swenshuai.xi         return TRUE;
5380*53ee8cc1Swenshuai.xi     }
5381*53ee8cc1Swenshuai.xi     else
5382*53ee8cc1Swenshuai.xi     {
5383*53ee8cc1Swenshuai.xi         return FALSE;
5384*53ee8cc1Swenshuai.xi     }
5385*53ee8cc1Swenshuai.xi }
5386*53ee8cc1Swenshuai.xi 
5387*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5388*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsSyncStart()
5389*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check decoder starts to do sync action(drop or repeat) or not.
5390*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
5391*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): decoder is not doing sync action
5392*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): decoder is doing sync action
5393*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsSyncStart(MS_U32 u32Id)5394*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsSyncStart(MS_U32 u32Id)
5395*53ee8cc1Swenshuai.xi {
5396*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5397*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5398*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5399*53ee8cc1Swenshuai.xi 
5400*53ee8cc1Swenshuai.xi     if ((MS_BOOL) MDrv_HVD_EX_GetPlayMode(u32Id, E_HVD_EX_GMODE_IS_SYNC_ON) == FALSE)
5401*53ee8cc1Swenshuai.xi     {
5402*53ee8cc1Swenshuai.xi         return FALSE;
5403*53ee8cc1Swenshuai.xi     }
5404*53ee8cc1Swenshuai.xi     if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_SYNC_START))
5405*53ee8cc1Swenshuai.xi     {
5406*53ee8cc1Swenshuai.xi         return TRUE;
5407*53ee8cc1Swenshuai.xi     }
5408*53ee8cc1Swenshuai.xi     else
5409*53ee8cc1Swenshuai.xi     {
5410*53ee8cc1Swenshuai.xi         return FALSE;
5411*53ee8cc1Swenshuai.xi     }
5412*53ee8cc1Swenshuai.xi }
5413*53ee8cc1Swenshuai.xi 
5414*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5415*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsSyncReach()
5416*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: The distance of Video time stamp and STC is closed enough.
5417*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
5418*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): The distance is not shorter than sync tolerance.
5419*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): The distance is shorter than sync tolerance.
5420*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsSyncReach(MS_U32 u32Id)5421*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsSyncReach(MS_U32 u32Id)
5422*53ee8cc1Swenshuai.xi {
5423*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5424*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5425*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5426*53ee8cc1Swenshuai.xi 
5427*53ee8cc1Swenshuai.xi     if ((MS_BOOL) MDrv_HVD_EX_GetPlayMode(u32Id, E_HVD_EX_GMODE_IS_SYNC_ON) == FALSE)
5428*53ee8cc1Swenshuai.xi     {
5429*53ee8cc1Swenshuai.xi         return FALSE;
5430*53ee8cc1Swenshuai.xi     }
5431*53ee8cc1Swenshuai.xi 
5432*53ee8cc1Swenshuai.xi     if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_SYNC_REACH))
5433*53ee8cc1Swenshuai.xi     {
5434*53ee8cc1Swenshuai.xi         return TRUE;
5435*53ee8cc1Swenshuai.xi     }
5436*53ee8cc1Swenshuai.xi     else
5437*53ee8cc1Swenshuai.xi     {
5438*53ee8cc1Swenshuai.xi         return FALSE;
5439*53ee8cc1Swenshuai.xi     }
5440*53ee8cc1Swenshuai.xi }
5441*53ee8cc1Swenshuai.xi 
5442*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5443*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsLowDelay()
5444*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if current stream has low delay flag in SPS.
5445*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
5446*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Low delay flag not found.
5447*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Low delay flag found.
5448*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsLowDelay(MS_U32 u32Id)5449*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsLowDelay(MS_U32 u32Id)
5450*53ee8cc1Swenshuai.xi {
5451*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5452*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5453*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5454*53ee8cc1Swenshuai.xi 
5455*53ee8cc1Swenshuai.xi     if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_AVC_LOW_DELAY))
5456*53ee8cc1Swenshuai.xi     {
5457*53ee8cc1Swenshuai.xi         return TRUE;
5458*53ee8cc1Swenshuai.xi     }
5459*53ee8cc1Swenshuai.xi     else
5460*53ee8cc1Swenshuai.xi     {
5461*53ee8cc1Swenshuai.xi         return FALSE;
5462*53ee8cc1Swenshuai.xi     }
5463*53ee8cc1Swenshuai.xi }
5464*53ee8cc1Swenshuai.xi 
5465*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5466*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsIFrmFound()
5467*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if I frame found after Init() or flush().
5468*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
5469*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): I frame is not found.
5470*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): I frame has been found.
5471*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsIFrmFound(MS_U32 u32Id)5472*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsIFrmFound(MS_U32 u32Id)
5473*53ee8cc1Swenshuai.xi {
5474*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5475*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5476*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5477*53ee8cc1Swenshuai.xi 
5478*53ee8cc1Swenshuai.xi     if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_I_FRM_FOUND))
5479*53ee8cc1Swenshuai.xi     {
5480*53ee8cc1Swenshuai.xi         return TRUE;
5481*53ee8cc1Swenshuai.xi     }
5482*53ee8cc1Swenshuai.xi     else
5483*53ee8cc1Swenshuai.xi     {
5484*53ee8cc1Swenshuai.xi         return FALSE;
5485*53ee8cc1Swenshuai.xi     }
5486*53ee8cc1Swenshuai.xi }
5487*53ee8cc1Swenshuai.xi 
5488*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5489*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Is1stFrmRdy()
5490*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if first frame showed on screen after Init() or flush().
5491*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
5492*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): First frame is not showed.
5493*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): First frame is showed.
5494*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Is1stFrmRdy(MS_U32 u32Id)5495*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_Is1stFrmRdy(MS_U32 u32Id)
5496*53ee8cc1Swenshuai.xi {
5497*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5498*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5499*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5500*53ee8cc1Swenshuai.xi 
5501*53ee8cc1Swenshuai.xi     if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_1ST_FRM_RDY))
5502*53ee8cc1Swenshuai.xi     {
5503*53ee8cc1Swenshuai.xi         return TRUE;
5504*53ee8cc1Swenshuai.xi     }
5505*53ee8cc1Swenshuai.xi     else
5506*53ee8cc1Swenshuai.xi     {
5507*53ee8cc1Swenshuai.xi         return FALSE;
5508*53ee8cc1Swenshuai.xi     }
5509*53ee8cc1Swenshuai.xi }
5510*53ee8cc1Swenshuai.xi 
5511*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5512*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsAllBufferEmpty()
5513*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if all of the buffers(display, decoded, BBU, bitstream) are empty.
5514*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
5515*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Not Empty.
5516*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Empty.
5517*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsAllBufferEmpty(MS_U32 u32Id)5518*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsAllBufferEmpty(MS_U32 u32Id)
5519*53ee8cc1Swenshuai.xi {
5520*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5521*53ee8cc1Swenshuai.xi     //HVD_MSG_TRACE();
5522*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5523*53ee8cc1Swenshuai.xi 
5524*53ee8cc1Swenshuai.xi     if (_HVD_EX_IsAllBufferEmpty(u32Id, FALSE))
5525*53ee8cc1Swenshuai.xi     {
5526*53ee8cc1Swenshuai.xi         return TRUE;
5527*53ee8cc1Swenshuai.xi     }
5528*53ee8cc1Swenshuai.xi     else
5529*53ee8cc1Swenshuai.xi     {
5530*53ee8cc1Swenshuai.xi         return FALSE;
5531*53ee8cc1Swenshuai.xi     }
5532*53ee8cc1Swenshuai.xi #if 0
5533*53ee8cc1Swenshuai.xi     if (u32Times > 200)
5534*53ee8cc1Swenshuai.xi     {
5535*53ee8cc1Swenshuai.xi         HVD_EX_MSG_INF("Flush() timeout failed:BBU:%u Dec:%u Disp:%u Idle:%u ESr:%x ESw:%x  \n",
5536*53ee8cc1Swenshuai.xi                      HAL_HVD_EX_GetData(E_HVD_GDATA_BBU_Q_NUMB),
5537*53ee8cc1Swenshuai.xi                      HAL_HVD_EX_GetData(E_HVD_GDATA_DEC_Q_NUMB),
5538*53ee8cc1Swenshuai.xi                      HAL_HVD_EX_GetData(E_HVD_GDATA_DISP_Q_NUMB),
5539*53ee8cc1Swenshuai.xi                      HAL_HVD_EX_GetData(E_HVD_GDATA_VPU_IDLE_CNT),
5540*53ee8cc1Swenshuai.xi                      HAL_HVD_EX_GetData(E_HVD_GDATA_ES_READ_PTR), HAL_HVD_EX_GetData(E_HVD_GDATA_ES_WRITE_PTR));
5541*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_FAIL;
5542*53ee8cc1Swenshuai.xi         break;
5543*53ee8cc1Swenshuai.xi     }
5544*53ee8cc1Swenshuai.xi     return TRUE;
5545*53ee8cc1Swenshuai.xi #endif
5546*53ee8cc1Swenshuai.xi }
5547*53ee8cc1Swenshuai.xi 
5548*53ee8cc1Swenshuai.xi // get infomation
5549*53ee8cc1Swenshuai.xi 
5550*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5551*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetBBUVacancy()
5552*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the vacancy of BBU queue.
5553*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
5554*53ee8cc1Swenshuai.xi /// @retval     -0: queue is full.
5555*53ee8cc1Swenshuai.xi /// @retval     -not zero: queue is not full.
5556*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetBBUVacancy(MS_U32 u32Id)5557*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetBBUVacancy(MS_U32 u32Id)
5558*53ee8cc1Swenshuai.xi {
5559*53ee8cc1Swenshuai.xi #ifdef VDEC3
5560*53ee8cc1Swenshuai.xi     MS_U32 u32VBBUAddr = MDrv_HVD_EX_GetData(u32Id, E_HVD_EX_GDATA_TYPE_VBBU_ADDR);
5561*53ee8cc1Swenshuai.xi     return HAL_VPU_EX_GetVBBUVacancy(u32Id, u32VBBUAddr);
5562*53ee8cc1Swenshuai.xi #else
5563*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5564*53ee8cc1Swenshuai.xi     MS_U32 u32BBUQnumb = 0;
5565*53ee8cc1Swenshuai.xi     MS_U32 u32BBUTotal = 0;
5566*53ee8cc1Swenshuai.xi     MS_U32 u32PTSQnumb = 0;
5567*53ee8cc1Swenshuai.xi     MS_U32 u32PTSTotal = 0;
5568*53ee8cc1Swenshuai.xi 
5569*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5570*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5571*53ee8cc1Swenshuai.xi 
5572*53ee8cc1Swenshuai.xi     u32BBUTotal = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TOTAL_TBL_ENTRY);
5573*53ee8cc1Swenshuai.xi     u32BBUQnumb = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_Q_NUMB);
5574*53ee8cc1Swenshuai.xi 
5575*53ee8cc1Swenshuai.xi     if (u32BBUTotal < u32BBUQnumb)
5576*53ee8cc1Swenshuai.xi     {
5577*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("Total BBUs(%lx) is less than the current(%lx)\n", u32BBUTotal, u32BBUQnumb);
5578*53ee8cc1Swenshuai.xi         u32BBUQnumb = 0;
5579*53ee8cc1Swenshuai.xi     }
5580*53ee8cc1Swenshuai.xi     else
5581*53ee8cc1Swenshuai.xi     {
5582*53ee8cc1Swenshuai.xi         u32BBUQnumb = u32BBUTotal - u32BBUQnumb;
5583*53ee8cc1Swenshuai.xi 
5584*53ee8cc1Swenshuai.xi         if (u32BBUQnumb < MIN_BBU_VACANCY_FOR_4K2K)
5585*53ee8cc1Swenshuai.xi         {
5586*53ee8cc1Swenshuai.xi             HVD_EX_MSG_DBG("BBU Vacancy(%lx) is less than MIN_BBU_VACANCY_FOR_4K2K(%x)\n", u32BBUQnumb, MIN_BBU_VACANCY_FOR_4K2K);
5587*53ee8cc1Swenshuai.xi             u32BBUQnumb = 0;
5588*53ee8cc1Swenshuai.xi         }
5589*53ee8cc1Swenshuai.xi     }
5590*53ee8cc1Swenshuai.xi 
5591*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
5592*53ee8cc1Swenshuai.xi     if ( u32BBUQnumb &&
5593*53ee8cc1Swenshuai.xi          ( (HAL_HVD_EX_CheckMVCID(u32Id) == FALSE) ||
5594*53ee8cc1Swenshuai.xi           ((HAL_HVD_EX_CheckMVCID(u32Id) == TRUE) && (E_VDEC_EX_MAIN_VIEW == HAL_HVD_EX_GetView(u32Id))) )
5595*53ee8cc1Swenshuai.xi         )
5596*53ee8cc1Swenshuai.xi #else
5597*53ee8cc1Swenshuai.xi     if (u32BBUQnumb)
5598*53ee8cc1Swenshuai.xi #endif
5599*53ee8cc1Swenshuai.xi     {
5600*53ee8cc1Swenshuai.xi         u32PTSTotal = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_PTS_TOTAL_ENTRY_NUMB) - 1; // add -1 for full case
5601*53ee8cc1Swenshuai.xi         u32PTSQnumb = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_PTS_Q_NUMB);
5602*53ee8cc1Swenshuai.xi 
5603*53ee8cc1Swenshuai.xi         if (u32PTSTotal <= u32PTSQnumb)
5604*53ee8cc1Swenshuai.xi         {
5605*53ee8cc1Swenshuai.xi             HVD_EX_MSG_DBG
5606*53ee8cc1Swenshuai.xi                 ("Warn: GetBBUVacancy has error that total PTS Q number(%lx) is smaller than current PTS Q number(%lx)\n",
5607*53ee8cc1Swenshuai.xi                  u32PTSTotal, u32PTSQnumb);
5608*53ee8cc1Swenshuai.xi             u32BBUQnumb = 0;
5609*53ee8cc1Swenshuai.xi         }
5610*53ee8cc1Swenshuai.xi     }
5611*53ee8cc1Swenshuai.xi 
5612*53ee8cc1Swenshuai.xi     return u32BBUQnumb;
5613*53ee8cc1Swenshuai.xi #endif
5614*53ee8cc1Swenshuai.xi }
5615*53ee8cc1Swenshuai.xi 
5616*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5617*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetDispInfo()
5618*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get video display information
5619*53ee8cc1Swenshuai.xi /// @param -pinfo \b OUT : pointer to video display information.
5620*53ee8cc1Swenshuai.xi /// @return -The result of command get display information
5621*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetDispInfo(MS_U32 u32Id,HVD_EX_DispInfo * pInfo)5622*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetDispInfo(MS_U32 u32Id, HVD_EX_DispInfo *pInfo)
5623*53ee8cc1Swenshuai.xi {
5624*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_FAIL;
5625*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5626*53ee8cc1Swenshuai.xi 
5627*53ee8cc1Swenshuai.xi     eRet = _HVD_EX_GetDispInfo(u32Id, pInfo, TRUE);
5628*53ee8cc1Swenshuai.xi     if (E_HVD_EX_OK == eRet)
5629*53ee8cc1Swenshuai.xi     {
5630*53ee8cc1Swenshuai.xi         HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
5631*53ee8cc1Swenshuai.xi         pCtrl->bFrmRateSupported = HAL_HVD_EX_GetFrmRateIsSupported(u32Id, pInfo->u16HorSize, pInfo->u16VerSize, pInfo->u32FrameRate);
5632*53ee8cc1Swenshuai.xi         HVD_EX_MSG_DBG("bFrmRateSupported[0x%x]=%x\n", u8DrvId, pCtrl->bFrmRateSupported);
5633*53ee8cc1Swenshuai.xi     }
5634*53ee8cc1Swenshuai.xi 
5635*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
5636*53ee8cc1Swenshuai.xi     if (HVD_INIT_HW_RM == (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
5637*53ee8cc1Swenshuai.xi     {
5638*53ee8cc1Swenshuai.xi         //RM is always displayed by 60 frames per sec.
5639*53ee8cc1Swenshuai.xi         pInfo->u32FrameRate = 60000;
5640*53ee8cc1Swenshuai.xi         HVD_EX_MSG_DBG("rm force set 60fps\n");
5641*53ee8cc1Swenshuai.xi     }
5642*53ee8cc1Swenshuai.xi #endif
5643*53ee8cc1Swenshuai.xi 
5644*53ee8cc1Swenshuai.xi     return eRet;
5645*53ee8cc1Swenshuai.xi }
5646*53ee8cc1Swenshuai.xi 
5647*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5648*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetPtsStcDiff()
5649*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get the difference of PTS and STC
5650*53ee8cc1Swenshuai.xi /// @return - PTS
5651*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetPtsStcDiff(MS_U32 u32Id)5652*53ee8cc1Swenshuai.xi MS_S64 MDrv_HVD_EX_GetPtsStcDiff(MS_U32 u32Id)
5653*53ee8cc1Swenshuai.xi {
5654*53ee8cc1Swenshuai.xi     MS_S64 s64PTS = 0;
5655*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5656*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5657*53ee8cc1Swenshuai.xi 
5658*53ee8cc1Swenshuai.xi     s64PTS = HAL_HVD_EX_GetData_EX(u32Id, E_HVD_GDATA_PTS_STC_DIFF);
5659*53ee8cc1Swenshuai.xi 
5660*53ee8cc1Swenshuai.xi     return s64PTS;
5661*53ee8cc1Swenshuai.xi }
5662*53ee8cc1Swenshuai.xi 
5663*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5664*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetPTS()
5665*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the pts of current displayed video frame. unit: ms
5666*53ee8cc1Swenshuai.xi /// @return - PTS
5667*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetPTS(MS_U32 u32Id)5668*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetPTS(MS_U32 u32Id)
5669*53ee8cc1Swenshuai.xi {
5670*53ee8cc1Swenshuai.xi     MS_U32 u32PTS = 0;
5671*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5672*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5673*53ee8cc1Swenshuai.xi 
5674*53ee8cc1Swenshuai.xi     u32PTS = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_PTS);
5675*53ee8cc1Swenshuai.xi 
5676*53ee8cc1Swenshuai.xi     u32PTS = _HVD_EX_ReportLow32BitPTS(u32Id, u32PTS);
5677*53ee8cc1Swenshuai.xi 
5678*53ee8cc1Swenshuai.xi     return u32PTS;
5679*53ee8cc1Swenshuai.xi }
5680*53ee8cc1Swenshuai.xi 
5681*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5682*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetPTS()
5683*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the 33 bits pts of current displayed video frame. unit: ms
5684*53ee8cc1Swenshuai.xi /// @return - PTS
5685*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetU64PTS(MS_U32 u32Id)5686*53ee8cc1Swenshuai.xi MS_U64 MDrv_HVD_EX_GetU64PTS(MS_U32 u32Id)
5687*53ee8cc1Swenshuai.xi {
5688*53ee8cc1Swenshuai.xi     MS_U64 u64PTS = 0;
5689*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5690*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5691*53ee8cc1Swenshuai.xi 
5692*53ee8cc1Swenshuai.xi     u64PTS = *((MS_U64*)(HAL_HVD_EX_GetData(u32Id,E_HVD_GDATA_U64PTS)));
5693*53ee8cc1Swenshuai.xi 
5694*53ee8cc1Swenshuai.xi     return u64PTS;
5695*53ee8cc1Swenshuai.xi }
5696*53ee8cc1Swenshuai.xi 
5697*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5698*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetU64PTS_PreParse()
5699*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the 33 bits pts which is latest added into PTS table. unit: ms
5700*53ee8cc1Swenshuai.xi /// @return - PTS
5701*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetU64PTS_PreParse(MS_U32 u32Id)5702*53ee8cc1Swenshuai.xi MS_U64 MDrv_HVD_EX_GetU64PTS_PreParse(MS_U32 u32Id)
5703*53ee8cc1Swenshuai.xi {
5704*53ee8cc1Swenshuai.xi     MS_U64 u64PTS = 0;
5705*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5706*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5707*53ee8cc1Swenshuai.xi 
5708*53ee8cc1Swenshuai.xi     u64PTS = *((MS_U64*)(HAL_HVD_EX_GetData(u32Id,E_HVD_GDATA_U64PTS_PRE_PARSE)));
5709*53ee8cc1Swenshuai.xi     u64PTS = _90K_TO_MS(u64PTS); //ms
5710*53ee8cc1Swenshuai.xi 
5711*53ee8cc1Swenshuai.xi     return u64PTS;
5712*53ee8cc1Swenshuai.xi }
5713*53ee8cc1Swenshuai.xi 
5714*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5715*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetNextPTS()
5716*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the pts of next displayed video frame. unit: ms
5717*53ee8cc1Swenshuai.xi /// @return - PTS
5718*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetNextPTS(MS_U32 u32Id)5719*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetNextPTS(MS_U32 u32Id)
5720*53ee8cc1Swenshuai.xi {
5721*53ee8cc1Swenshuai.xi     MS_U32 u32PTS = 0;
5722*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5723*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5724*53ee8cc1Swenshuai.xi 
5725*53ee8cc1Swenshuai.xi     u32PTS = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_NEXT_PTS);
5726*53ee8cc1Swenshuai.xi 
5727*53ee8cc1Swenshuai.xi     u32PTS = _HVD_EX_ReportLow32BitPTS(u32Id, u32PTS);
5728*53ee8cc1Swenshuai.xi 
5729*53ee8cc1Swenshuai.xi     return u32PTS;
5730*53ee8cc1Swenshuai.xi }
5731*53ee8cc1Swenshuai.xi 
5732*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5733*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetNextDispQPtr()
5734*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the pointer of next displayed video frame.
5735*53ee8cc1Swenshuai.xi /// @return - Pointer in the display queue
5736*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetNextDispQPtr(MS_U32 u32Id)5737*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetNextDispQPtr(MS_U32 u32Id)
5738*53ee8cc1Swenshuai.xi {
5739*53ee8cc1Swenshuai.xi     MS_U32 u32Ptr = 0;
5740*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5741*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5742*53ee8cc1Swenshuai.xi 
5743*53ee8cc1Swenshuai.xi     //HVD_PRINT("GetNextDispQPtr DqNum=%ld, DqPtr=%ld\n", HAL_HVD_EX_GetData(E_HVD_GDATA_DISP_Q_NUMB), HAL_HVD_EX_GetData(E_HVD_GDATA_DISP_Q_PTR));
5744*53ee8cc1Swenshuai.xi     //if (HAL_HVD_EX_GetData(E_HVD_GDATA_DISP_Q_NUMB) != 0)
5745*53ee8cc1Swenshuai.xi     {
5746*53ee8cc1Swenshuai.xi         u32Ptr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_Q_PTR);
5747*53ee8cc1Swenshuai.xi     }
5748*53ee8cc1Swenshuai.xi 
5749*53ee8cc1Swenshuai.xi     return u32Ptr;
5750*53ee8cc1Swenshuai.xi }
5751*53ee8cc1Swenshuai.xi 
5752*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5753*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetDataErrCnt()
5754*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get accumulated data Error Count
5755*53ee8cc1Swenshuai.xi /// @return -data error count
5756*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetDataErrCnt(MS_U32 u32Id)5757*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetDataErrCnt(MS_U32 u32Id)
5758*53ee8cc1Swenshuai.xi {
5759*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5760*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5761*53ee8cc1Swenshuai.xi 
5762*53ee8cc1Swenshuai.xi     return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DATA_ERROR_CNT);
5763*53ee8cc1Swenshuai.xi }
5764*53ee8cc1Swenshuai.xi 
5765*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5766*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetDecErrCnt()
5767*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get accumulated decode Error Count
5768*53ee8cc1Swenshuai.xi /// @return -decode error count
5769*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetDecErrCnt(MS_U32 u32Id)5770*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetDecErrCnt(MS_U32 u32Id)
5771*53ee8cc1Swenshuai.xi {
5772*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5773*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5774*53ee8cc1Swenshuai.xi 
5775*53ee8cc1Swenshuai.xi     return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_ERROR_CNT);
5776*53ee8cc1Swenshuai.xi }
5777*53ee8cc1Swenshuai.xi 
5778*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5779*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetESWritePtr()
5780*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Elementary Stream buffer write point
5781*53ee8cc1Swenshuai.xi /// @return - ES buffer write point offset from bitstream buffer base
5782*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetESWritePtr(MS_U32 u32Id)5783*53ee8cc1Swenshuai.xi MS_VIRT MDrv_HVD_EX_GetESWritePtr(MS_U32 u32Id)
5784*53ee8cc1Swenshuai.xi {
5785*53ee8cc1Swenshuai.xi #ifdef VDEC3
5786*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5787*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl  = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
5788*53ee8cc1Swenshuai.xi     if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV) // File mode
5789*53ee8cc1Swenshuai.xi     {
5790*53ee8cc1Swenshuai.xi         MS_VIRT u32VBBUAddr = MDrv_HVD_EX_GetData(u32Id, E_HVD_EX_GDATA_TYPE_VBBU_ADDR);
5791*53ee8cc1Swenshuai.xi         MS_VIRT u32Wptr = HAL_VPU_EX_GetESWritePtr(u32Id, u32VBBUAddr);
5792*53ee8cc1Swenshuai.xi 
5793*53ee8cc1Swenshuai.xi         if (pCtrl->bNStreamMode)
5794*53ee8cc1Swenshuai.xi         {
5795*53ee8cc1Swenshuai.xi             if (u32Wptr != 0)
5796*53ee8cc1Swenshuai.xi                 u32Wptr = u32Wptr - (pCtrl->MemMap.u32BitstreamBufAddr - pCtrl->MemMap.u32TotalBitstreamBufAddr); // NStream will share the same ES buffer
5797*53ee8cc1Swenshuai.xi         }
5798*53ee8cc1Swenshuai.xi 
5799*53ee8cc1Swenshuai.xi         if (u32Wptr & HVD_RV_BROKEN_BY_US_MASK)
5800*53ee8cc1Swenshuai.xi             u32Wptr &= (~HVD_RV_BROKEN_BY_US_MASK);
5801*53ee8cc1Swenshuai.xi 
5802*53ee8cc1Swenshuai.xi         return u32Wptr;
5803*53ee8cc1Swenshuai.xi     }
5804*53ee8cc1Swenshuai.xi     else // TSP mode
5805*53ee8cc1Swenshuai.xi #endif
5806*53ee8cc1Swenshuai.xi     {
5807*53ee8cc1Swenshuai.xi         MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5808*53ee8cc1Swenshuai.xi         _DRV_HVD_Inited(u8DrvId,FALSE);
5809*53ee8cc1Swenshuai.xi 
5810*53ee8cc1Swenshuai.xi         return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_WRITE_PTR);
5811*53ee8cc1Swenshuai.xi     }
5812*53ee8cc1Swenshuai.xi }
5813*53ee8cc1Swenshuai.xi 
5814*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5815*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetESReadPtr()
5816*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Elementary Stream buffer read point
5817*53ee8cc1Swenshuai.xi /// @return - ES buffer read point offset from bitstream buffer base
5818*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetESReadPtr(MS_U32 u32Id)5819*53ee8cc1Swenshuai.xi MS_VIRT MDrv_HVD_EX_GetESReadPtr(MS_U32 u32Id)
5820*53ee8cc1Swenshuai.xi {
5821*53ee8cc1Swenshuai.xi #ifdef VDEC3
5822*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5823*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl  = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
5824*53ee8cc1Swenshuai.xi     if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV) // File mode
5825*53ee8cc1Swenshuai.xi     {
5826*53ee8cc1Swenshuai.xi         MS_VIRT u32VBBUAddr = MDrv_HVD_EX_GetData(u32Id, E_HVD_EX_GDATA_TYPE_VBBU_ADDR);
5827*53ee8cc1Swenshuai.xi         MS_VIRT u32Rptr = HAL_VPU_EX_GetESReadPtr(u32Id, u32VBBUAddr);
5828*53ee8cc1Swenshuai.xi 
5829*53ee8cc1Swenshuai.xi         if (pCtrl->bNStreamMode)
5830*53ee8cc1Swenshuai.xi         {
5831*53ee8cc1Swenshuai.xi             if (u32Rptr != 0)
5832*53ee8cc1Swenshuai.xi                 u32Rptr = u32Rptr - (pCtrl->MemMap.u32BitstreamBufAddr - pCtrl->MemMap.u32TotalBitstreamBufAddr); // NStream will share the same ES buffer
5833*53ee8cc1Swenshuai.xi         }
5834*53ee8cc1Swenshuai.xi 
5835*53ee8cc1Swenshuai.xi         if (u32Rptr & HVD_RV_BROKEN_BY_US_MASK)
5836*53ee8cc1Swenshuai.xi             u32Rptr &= (~HVD_RV_BROKEN_BY_US_MASK);
5837*53ee8cc1Swenshuai.xi 
5838*53ee8cc1Swenshuai.xi         return u32Rptr;
5839*53ee8cc1Swenshuai.xi 
5840*53ee8cc1Swenshuai.xi     }
5841*53ee8cc1Swenshuai.xi     else // TSP mode
5842*53ee8cc1Swenshuai.xi #endif
5843*53ee8cc1Swenshuai.xi     {
5844*53ee8cc1Swenshuai.xi         MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5845*53ee8cc1Swenshuai.xi         _DRV_HVD_Inited(u8DrvId,FALSE);
5846*53ee8cc1Swenshuai.xi 
5847*53ee8cc1Swenshuai.xi         return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_READ_PTR);
5848*53ee8cc1Swenshuai.xi     }
5849*53ee8cc1Swenshuai.xi }
5850*53ee8cc1Swenshuai.xi 
5851*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5852*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetESLevel()
5853*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Elementary Stream buffer level
5854*53ee8cc1Swenshuai.xi /// @return - ES buffer level (ES data size in bitstream buffer)
5855*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetESQuantity(MS_U32 u32Id)5856*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetESQuantity(MS_U32 u32Id)
5857*53ee8cc1Swenshuai.xi {
5858*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5859*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5860*53ee8cc1Swenshuai.xi 
5861*53ee8cc1Swenshuai.xi     return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_QUANTITY);
5862*53ee8cc1Swenshuai.xi }
5863*53ee8cc1Swenshuai.xi 
5864*53ee8cc1Swenshuai.xi #define FATAL_ERROR(x) ((x)==E_HVD_RETURN_OUTOF_MEMORY)
5865*53ee8cc1Swenshuai.xi 
5866*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5867*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetErrCode()
5868*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get error code
5869*53ee8cc1Swenshuai.xi /// @return - error code number
5870*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetErrCode(MS_U32 u32Id)5871*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetErrCode(MS_U32 u32Id)
5872*53ee8cc1Swenshuai.xi {
5873*53ee8cc1Swenshuai.xi // TODO: define driver error code  for upper layer
5874*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = 0;
5875*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5876*53ee8cc1Swenshuai.xi 
5877*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5878*53ee8cc1Swenshuai.xi 
5879*53ee8cc1Swenshuai.xi     u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ERROR_CODE);
5880*53ee8cc1Swenshuai.xi 
5881*53ee8cc1Swenshuai.xi     u32Ret = _HVD_EX_Map2HVDErrCode(u32Ret);
5882*53ee8cc1Swenshuai.xi 
5883*53ee8cc1Swenshuai.xi #ifdef SUPPORT_X_MODEL_FEATURE //We using the common compile option to handle X model
5884*53ee8cc1Swenshuai.xi     if (!FATAL_ERROR(u32Ret))
5885*53ee8cc1Swenshuai.xi #else
5886*53ee8cc1Swenshuai.xi     if (u32Ret)
5887*53ee8cc1Swenshuai.xi #endif
5888*53ee8cc1Swenshuai.xi     {
5889*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_ERROR_CODE, 0);
5890*53ee8cc1Swenshuai.xi     }
5891*53ee8cc1Swenshuai.xi 
5892*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32LastErrCode = u32Ret;
5893*53ee8cc1Swenshuai.xi 
5894*53ee8cc1Swenshuai.xi     return u32Ret;
5895*53ee8cc1Swenshuai.xi }
5896*53ee8cc1Swenshuai.xi 
5897*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5898*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetPlayMode()
5899*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get current play mode status.
5900*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : Mode type.
5901*53ee8cc1Swenshuai.xi /// @return - mode status
5902*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetPlayMode(MS_U32 u32Id,HVD_EX_GetModeStatus eMode)5903*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetPlayMode(MS_U32 u32Id, HVD_EX_GetModeStatus eMode)
5904*53ee8cc1Swenshuai.xi {
5905*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = 0;
5906*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5907*53ee8cc1Swenshuai.xi 
5908*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5909*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5910*53ee8cc1Swenshuai.xi 
5911*53ee8cc1Swenshuai.xi     switch (eMode)
5912*53ee8cc1Swenshuai.xi     {
5913*53ee8cc1Swenshuai.xi         case E_HVD_EX_GMODE_IS_SHOW_ERR_FRM:
5914*53ee8cc1Swenshuai.xi         case E_HVD_EX_GMODE_IS_REPEAT_LAST_FIELD:
5915*53ee8cc1Swenshuai.xi         case E_HVD_EX_GMODE_IS_ERR_CONCEAL:
5916*53ee8cc1Swenshuai.xi         case E_HVD_EX_GMODE_IS_SYNC_ON:
5917*53ee8cc1Swenshuai.xi         case E_HVD_EX_GMODE_IS_PLAYBACK_FINISH:
5918*53ee8cc1Swenshuai.xi         case E_HVD_EX_GMODE_SYNC_MODE:
5919*53ee8cc1Swenshuai.xi         case E_HVD_EX_GMODE_SKIP_MODE:
5920*53ee8cc1Swenshuai.xi         case E_HVD_EX_GMODE_DROP_MODE:
5921*53ee8cc1Swenshuai.xi         case E_HVD_EX_GMODE_DISPLAY_SPEED:
5922*53ee8cc1Swenshuai.xi         case E_HVD_EX_GMODE_FRC_MODE:
5923*53ee8cc1Swenshuai.xi             // TODO: add isr type here
5924*53ee8cc1Swenshuai.xi         case E_HVD_EX_GMODE_ISR_TYPE:
5925*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, (HVD_GetData) ((MS_U32) eMode + (MS_U32) E_HVD_GDATA_IS_SHOW_ERR_FRM));
5926*53ee8cc1Swenshuai.xi             break;
5927*53ee8cc1Swenshuai.xi         case E_HVD_EX_GMODE_IS_STEP_DISPLAY:
5928*53ee8cc1Swenshuai.xi             u32Ret = _DRV_HVD_Ctrl(u8DrvId, HVD_CTRL_DISPLAY_CTRL);
5929*53ee8cc1Swenshuai.xi             break;
5930*53ee8cc1Swenshuai.xi         case E_HVD_EX_GMODE_STREAM_TYPE:
5931*53ee8cc1Swenshuai.xi             u32Ret = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & E_HVD_INIT_MAIN_MASK;
5932*53ee8cc1Swenshuai.xi             break;
5933*53ee8cc1Swenshuai.xi         default:
5934*53ee8cc1Swenshuai.xi             break;
5935*53ee8cc1Swenshuai.xi     }
5936*53ee8cc1Swenshuai.xi 
5937*53ee8cc1Swenshuai.xi     return u32Ret;
5938*53ee8cc1Swenshuai.xi }
5939*53ee8cc1Swenshuai.xi 
5940*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5941*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetPlayState()
5942*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get current play state
5943*53ee8cc1Swenshuai.xi /// @return - play state
5944*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetPlayState(MS_U32 u32Id)5945*53ee8cc1Swenshuai.xi HVD_EX_GetPlayState MDrv_HVD_EX_GetPlayState(MS_U32 u32Id)
5946*53ee8cc1Swenshuai.xi {
5947*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5948*53ee8cc1Swenshuai.xi     MS_U32 u32FWstate = 0;
5949*53ee8cc1Swenshuai.xi     HVD_EX_GetPlayState eRet = E_HVD_EX_GSTATE_INIT;
5950*53ee8cc1Swenshuai.xi 
5951*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
5952*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
5953*53ee8cc1Swenshuai.xi 
5954*53ee8cc1Swenshuai.xi     u32FWstate = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_STATE);
5955*53ee8cc1Swenshuai.xi     u32FWstate &= E_HVD_FW_STATE_MASK;
5956*53ee8cc1Swenshuai.xi 
5957*53ee8cc1Swenshuai.xi     switch (u32FWstate)
5958*53ee8cc1Swenshuai.xi     {
5959*53ee8cc1Swenshuai.xi         case E_HVD_FW_INIT:
5960*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_GSTATE_INIT;
5961*53ee8cc1Swenshuai.xi             break;
5962*53ee8cc1Swenshuai.xi         case E_HVD_FW_PLAY:
5963*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_GSTATE_PLAY;
5964*53ee8cc1Swenshuai.xi             break;
5965*53ee8cc1Swenshuai.xi         case E_HVD_FW_PAUSE:
5966*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_GSTATE_PAUSE;
5967*53ee8cc1Swenshuai.xi             break;
5968*53ee8cc1Swenshuai.xi         case E_HVD_FW_STOP:
5969*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_GSTATE_STOP;
5970*53ee8cc1Swenshuai.xi             break;
5971*53ee8cc1Swenshuai.xi         default:
5972*53ee8cc1Swenshuai.xi             break;
5973*53ee8cc1Swenshuai.xi     }
5974*53ee8cc1Swenshuai.xi     return eRet;
5975*53ee8cc1Swenshuai.xi }
5976*53ee8cc1Swenshuai.xi 
5977*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5978*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetDecodeCnt()
5979*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get accumulated decoded frame Count
5980*53ee8cc1Swenshuai.xi /// @return - decoded frame Count
5981*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetDecodeCnt(MS_U32 u32Id)5982*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetDecodeCnt(MS_U32 u32Id)
5983*53ee8cc1Swenshuai.xi {
5984*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5985*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
5986*53ee8cc1Swenshuai.xi 
5987*53ee8cc1Swenshuai.xi     return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DECODE_CNT);
5988*53ee8cc1Swenshuai.xi }
5989*53ee8cc1Swenshuai.xi 
5990*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5991*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetActiveFormat()
5992*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get current AFD ID
5993*53ee8cc1Swenshuai.xi /// @return - AFD ID, 0xFF:invalid value
5994*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetActiveFormat(MS_U32 u32Id)5995*53ee8cc1Swenshuai.xi MS_U8 MDrv_HVD_EX_GetActiveFormat(MS_U32 u32Id)
5996*53ee8cc1Swenshuai.xi {
5997*53ee8cc1Swenshuai.xi     HVD_Display_Info *pDispInfo = NULL;
5998*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5999*53ee8cc1Swenshuai.xi 
6000*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
6001*53ee8cc1Swenshuai.xi 
6002*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,~0);
6003*53ee8cc1Swenshuai.xi 
6004*53ee8cc1Swenshuai.xi     if (!(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode & HVD_CTRL_DISP_INFO_RDY))
6005*53ee8cc1Swenshuai.xi     {
6006*53ee8cc1Swenshuai.xi         return 0;
6007*53ee8cc1Swenshuai.xi     }
6008*53ee8cc1Swenshuai.xi 
6009*53ee8cc1Swenshuai.xi     pDispInfo = (HVD_Display_Info *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_INFO_ADDR);
6010*53ee8cc1Swenshuai.xi 
6011*53ee8cc1Swenshuai.xi     if (pDispInfo != NULL)
6012*53ee8cc1Swenshuai.xi     {
6013*53ee8cc1Swenshuai.xi         return pDispInfo->u8AFD;
6014*53ee8cc1Swenshuai.xi     }
6015*53ee8cc1Swenshuai.xi     else
6016*53ee8cc1Swenshuai.xi     {
6017*53ee8cc1Swenshuai.xi         return ~0;
6018*53ee8cc1Swenshuai.xi     }
6019*53ee8cc1Swenshuai.xi }
6020*53ee8cc1Swenshuai.xi 
6021*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6022*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetInfo()
6023*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get information of HVD driver.
6024*53ee8cc1Swenshuai.xi /// @return - driver information
6025*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetInfo(void)6026*53ee8cc1Swenshuai.xi const HVD_EX_DrvInfo *MDrv_HVD_EX_GetInfo(void)
6027*53ee8cc1Swenshuai.xi {
6028*53ee8cc1Swenshuai.xi     DrvInfo.bAVC = MDrv_HVD_EX_GetCaps(E_HVD_EX_AVC);
6029*53ee8cc1Swenshuai.xi     DrvInfo.bAVS = MDrv_HVD_EX_GetCaps(E_HVD_EX_AVS);
6030*53ee8cc1Swenshuai.xi     DrvInfo.bRM = MDrv_HVD_EX_GetCaps(E_HVD_EX_RM);
6031*53ee8cc1Swenshuai.xi     DrvInfo.FWversion = HVD_FW_VERSION;
6032*53ee8cc1Swenshuai.xi     return &DrvInfo;
6033*53ee8cc1Swenshuai.xi }
6034*53ee8cc1Swenshuai.xi 
6035*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6036*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetLibVer()
6037*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get verion ID of HVD library.
6038*53ee8cc1Swenshuai.xi /// @param -pVerString \b OUT : pointer to HVD driver version ID.
6039*53ee8cc1Swenshuai.xi /// @return - driver library verion ID
6040*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetLibVer(const MSIF_Version ** ppVersion)6041*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetLibVer(const MSIF_Version ** ppVersion)
6042*53ee8cc1Swenshuai.xi {
6043*53ee8cc1Swenshuai.xi     if (!ppVersion)
6044*53ee8cc1Swenshuai.xi     {
6045*53ee8cc1Swenshuai.xi         return E_HVD_EX_FAIL;
6046*53ee8cc1Swenshuai.xi     }
6047*53ee8cc1Swenshuai.xi 
6048*53ee8cc1Swenshuai.xi     *ppVersion = &_drv_hvd_version;
6049*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
6050*53ee8cc1Swenshuai.xi }
6051*53ee8cc1Swenshuai.xi 
6052*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6053*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetStatus()
6054*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get status of HVD driver
6055*53ee8cc1Swenshuai.xi /// @param -pstatus \b OUT : driver status
6056*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
6057*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Low delay flag not found.
6058*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Low delay flag found.
6059*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetStatus(MS_U32 u32Id,HVD_EX_DrvStatus * pstatus)6060*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_GetStatus(MS_U32 u32Id, HVD_EX_DrvStatus *pstatus)
6061*53ee8cc1Swenshuai.xi {
6062*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6063*53ee8cc1Swenshuai.xi 
6064*53ee8cc1Swenshuai.xi     if (pstatus == NULL)
6065*53ee8cc1Swenshuai.xi     {
6066*53ee8cc1Swenshuai.xi         return FALSE;
6067*53ee8cc1Swenshuai.xi     }
6068*53ee8cc1Swenshuai.xi 
6069*53ee8cc1Swenshuai.xi     pstatus->bInit = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode & HVD_CTRL_INIT_FINISHED;
6070*53ee8cc1Swenshuai.xi     pstatus->bBusy = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode & HVD_CTRL_PROCESSING;
6071*53ee8cc1Swenshuai.xi 
6072*53ee8cc1Swenshuai.xi     return TRUE;
6073*53ee8cc1Swenshuai.xi }
6074*53ee8cc1Swenshuai.xi 
6075*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6076*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetFrmInfo()
6077*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get current displayed or decoded frame information of HVD driver
6078*53ee8cc1Swenshuai.xi /// @param -eType \b IN : Type of frame information
6079*53ee8cc1Swenshuai.xi /// @param -pInfo \b OUT : frame information
6080*53ee8cc1Swenshuai.xi /// @return -The result of command get frame information
6081*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetFrmInfo(MS_U32 u32Id,HVD_EX_GetFrmInfoType eType,HVD_EX_FrameInfo * pInfo)6082*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetFrmInfo(MS_U32 u32Id, HVD_EX_GetFrmInfoType eType, HVD_EX_FrameInfo * pInfo)
6083*53ee8cc1Swenshuai.xi {
6084*53ee8cc1Swenshuai.xi     HVD_Frm_Information *pFrmInfo = NULL;
6085*53ee8cc1Swenshuai.xi     HVD_Frm_Information_EXT_Entry *pFrmInfo_ext = NULL;
6086*53ee8cc1Swenshuai.xi 
6087*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6088*53ee8cc1Swenshuai.xi 
6089*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
6090*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,E_HVD_EX_FAIL);
6091*53ee8cc1Swenshuai.xi 
6092*53ee8cc1Swenshuai.xi     if (pInfo == NULL)
6093*53ee8cc1Swenshuai.xi     {
6094*53ee8cc1Swenshuai.xi         return E_HVD_EX_FAIL;
6095*53ee8cc1Swenshuai.xi     }
6096*53ee8cc1Swenshuai.xi 
6097*53ee8cc1Swenshuai.xi     if (eType == E_HVD_EX_GFRMINFO_DISPLAY)
6098*53ee8cc1Swenshuai.xi     {
6099*53ee8cc1Swenshuai.xi         pFrmInfo = (HVD_Frm_Information *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_FRM_INFO);
6100*53ee8cc1Swenshuai.xi     }
6101*53ee8cc1Swenshuai.xi     else if (eType == E_HVD_EX_GFRMINFO_DECODE)
6102*53ee8cc1Swenshuai.xi     {
6103*53ee8cc1Swenshuai.xi         pFrmInfo = (HVD_Frm_Information *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_FRM_INFO);
6104*53ee8cc1Swenshuai.xi     }
6105*53ee8cc1Swenshuai.xi     else if (eType == E_HVD_EX_GFRMINFO_NEXT_DISPLAY)
6106*53ee8cc1Swenshuai.xi     {
6107*53ee8cc1Swenshuai.xi         pFrmInfo = (HVD_Frm_Information *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_NEXT_DISP_FRM_INFO);
6108*53ee8cc1Swenshuai.xi         if(pFrmInfo != NULL)
6109*53ee8cc1Swenshuai.xi         {
6110*53ee8cc1Swenshuai.xi             pFrmInfo_ext = (HVD_Frm_Information_EXT_Entry *)HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_NEXT_DISP_FRM_INFO_EXT);
6111*53ee8cc1Swenshuai.xi         }
6112*53ee8cc1Swenshuai.xi     }
6113*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
6114*53ee8cc1Swenshuai.xi     else if (eType == E_HVD_EX_GFRMINFO_DISPLAY_SUB)
6115*53ee8cc1Swenshuai.xi     {
6116*53ee8cc1Swenshuai.xi         pFrmInfo = (HVD_Frm_Information *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_FRM_INFO_SUB);
6117*53ee8cc1Swenshuai.xi     }
6118*53ee8cc1Swenshuai.xi     else if (eType == E_HVD_EX_GFRMINFO_DECODE_SUB)
6119*53ee8cc1Swenshuai.xi     {
6120*53ee8cc1Swenshuai.xi         pFrmInfo = (HVD_Frm_Information *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_FRM_INFO_SUB);
6121*53ee8cc1Swenshuai.xi     }
6122*53ee8cc1Swenshuai.xi #endif ///HVD_ENABLE_MVC
6123*53ee8cc1Swenshuai.xi     else if (eType == E_HVD_EX_GFRMINFO_LAST_DISPLAY)
6124*53ee8cc1Swenshuai.xi     {
6125*53ee8cc1Swenshuai.xi         pFrmInfo = (HVD_Frm_Information *) pHVDDrvContext->gHVDCtrl_EX[u8DrvId].pLastFrmInfo;
6126*53ee8cc1Swenshuai.xi     }
6127*53ee8cc1Swenshuai.xi     else if (eType == E_HVD_EX_GFRMINFO_LAST_DISPLAY_EX)
6128*53ee8cc1Swenshuai.xi     {
6129*53ee8cc1Swenshuai.xi         pFrmInfo = (HVD_Frm_Information *) pHVDDrvContext->gHVDCtrl_EX[u8DrvId].pLastFrmInfo;
6130*53ee8cc1Swenshuai.xi         pFrmInfo_ext = (HVD_Frm_Information_EXT_Entry *) pHVDDrvContext->gHVDCtrl_EX[u8DrvId].pLastFrmInfo_ext;
6131*53ee8cc1Swenshuai.xi     }
6132*53ee8cc1Swenshuai.xi 
6133*53ee8cc1Swenshuai.xi     if (pFrmInfo != NULL)
6134*53ee8cc1Swenshuai.xi     {
6135*53ee8cc1Swenshuai.xi         MS_U32 u32Luma8MiuSel = (MS_U32)pFrmInfo->u2Luma0Miu;
6136*53ee8cc1Swenshuai.xi         MS_U32 u32Luma2MiuSel = (MS_U32)pFrmInfo->u2Luma1Miu;
6137*53ee8cc1Swenshuai.xi         MS_U32 u32Chroma8MiuSel = (MS_U32)pFrmInfo->u2Chroma0Miu;
6138*53ee8cc1Swenshuai.xi         MS_U32 u32Chroma2MiuSel = (MS_U32)pFrmInfo->u2Chroma1Miu;
6139*53ee8cc1Swenshuai.xi 
6140*53ee8cc1Swenshuai.xi         pInfo->u32LumaAddr = (MS_PHY) (pFrmInfo->u32LumaAddr + _HVD_EX_GetMIUBase(u8DrvId, u32Luma8MiuSel));
6141*53ee8cc1Swenshuai.xi         pInfo->u32ChromaAddr = (MS_PHY) (pFrmInfo->u32ChromaAddr + _HVD_EX_GetMIUBase(u8DrvId, u32Chroma8MiuSel));
6142*53ee8cc1Swenshuai.xi         pInfo->u32TimeStamp = pFrmInfo->u32TimeStamp;
6143*53ee8cc1Swenshuai.xi         pInfo->u32ID_L = pFrmInfo->u32ID_L;
6144*53ee8cc1Swenshuai.xi         pInfo->u32ID_H = pFrmInfo->u32ID_H;
6145*53ee8cc1Swenshuai.xi         pInfo->u32PrivateData = pFrmInfo->u32PrivateData; //[STB]only for AVC
6146*53ee8cc1Swenshuai.xi         pInfo->u16Pitch = pFrmInfo->u16Pitch;
6147*53ee8cc1Swenshuai.xi         pInfo->u16Height = pFrmInfo->u16Height;
6148*53ee8cc1Swenshuai.xi         pInfo->u16Width = pFrmInfo->u16Width;
6149*53ee8cc1Swenshuai.xi         pInfo->eFrmType = (HVD_EX_FrmType) (pFrmInfo->u8FrmType);
6150*53ee8cc1Swenshuai.xi         pInfo->eFieldType = (HVD_EX_FieldType) (pFrmInfo->u8FieldType);
6151*53ee8cc1Swenshuai.xi 
6152*53ee8cc1Swenshuai.xi         pInfo->u32LumaAddr_2bit = (MS_PHY) (pFrmInfo->u32LumaAddr_2bit + _HVD_EX_GetMIUBase(u8DrvId, u32Luma2MiuSel)) ;
6153*53ee8cc1Swenshuai.xi         pInfo->u32ChromaAddr_2bit = (MS_PHY) (pFrmInfo->u32ChromaAddr_2bit + _HVD_EX_GetMIUBase(u8DrvId, u32Chroma2MiuSel));
6154*53ee8cc1Swenshuai.xi         pInfo->u16Pitch_2bit = pFrmInfo->u16Pitch_2bit;
6155*53ee8cc1Swenshuai.xi         pInfo->u8LumaBitdepth = pFrmInfo->u8LumaBitdepth;
6156*53ee8cc1Swenshuai.xi         pInfo->u8ChromaBitdepth = pFrmInfo->u8ChromaBitdepth;
6157*53ee8cc1Swenshuai.xi 
6158*53ee8cc1Swenshuai.xi         if ((pInfo->u16Pitch == 0) && (pInfo->u16Width == 0) && (pInfo->u16Height == 0))
6159*53ee8cc1Swenshuai.xi         {
6160*53ee8cc1Swenshuai.xi             return E_HVD_EX_FAIL;
6161*53ee8cc1Swenshuai.xi         }
6162*53ee8cc1Swenshuai.xi 
6163*53ee8cc1Swenshuai.xi         if (eType == E_HVD_EX_GFRMINFO_NEXT_DISPLAY)
6164*53ee8cc1Swenshuai.xi         {
6165*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDCtrl_EX[u8DrvId].pLastFrmInfo = pFrmInfo;
6166*53ee8cc1Swenshuai.xi         }
6167*53ee8cc1Swenshuai.xi 
6168*53ee8cc1Swenshuai.xi         if(pFrmInfo_ext != NULL)
6169*53ee8cc1Swenshuai.xi         {
6170*53ee8cc1Swenshuai.xi             pInfo->u32LumaAddr_2bit = (MS_PHY)(pFrmInfo_ext->u32LumaAddrExt[HVD_FRM_INFO_EXT_TYPE_10BIT]
6171*53ee8cc1Swenshuai.xi                                                 + _HVD_EX_GetMIUBase(u8DrvId, u32Luma2MiuSel));
6172*53ee8cc1Swenshuai.xi             pInfo->u32ChromaAddr_2bit = (MS_PHY)(pFrmInfo_ext->u32ChromaAddrExt[HVD_FRM_INFO_EXT_TYPE_10BIT]
6173*53ee8cc1Swenshuai.xi                                                 + _HVD_EX_GetMIUBase(u8DrvId, u32Chroma2MiuSel));
6174*53ee8cc1Swenshuai.xi             pInfo->u32LumaAddrI = (MS_PHY)(pFrmInfo_ext->u32LumaAddrExt[HVD_FRM_INFO_EXT_TYPE_INTERLACE]
6175*53ee8cc1Swenshuai.xi                                                 + _HVD_EX_GetMIUBase(u8DrvId, u32Luma8MiuSel));
6176*53ee8cc1Swenshuai.xi             pInfo->u32LumaAddrI_2bit = (MS_PHY)(pFrmInfo_ext->u32LumaAddrExt[HVD_FRM_INFO_EXT_TYPE_10BIT_INTERLACE]
6177*53ee8cc1Swenshuai.xi                                                 + _HVD_EX_GetMIUBase(u8DrvId, u32Luma2MiuSel));
6178*53ee8cc1Swenshuai.xi             pInfo->u32ChromaAddrI = (MS_PHY)(pFrmInfo_ext->u32ChromaAddrExt[HVD_FRM_INFO_EXT_TYPE_INTERLACE]
6179*53ee8cc1Swenshuai.xi                                                 + _HVD_EX_GetMIUBase(u8DrvId, u32Chroma8MiuSel));
6180*53ee8cc1Swenshuai.xi             pInfo->u32ChromaAddrI_2bit = (MS_PHY)(pFrmInfo_ext->u32ChromaAddrExt[HVD_FRM_INFO_EXT_TYPE_10BIT_INTERLACE]
6181*53ee8cc1Swenshuai.xi                                                 + _HVD_EX_GetMIUBase(u8DrvId, u32Chroma2MiuSel));
6182*53ee8cc1Swenshuai.xi             pInfo->u32MFCodecInfo = pFrmInfo_ext->MFCodecInfo;
6183*53ee8cc1Swenshuai.xi             pInfo->u32LumaMFCbitlen = pFrmInfo_ext->u32LumaAddrExt[HVD_FRM_INFO_EXT_TYPE_MFCBITLEN];
6184*53ee8cc1Swenshuai.xi             pInfo->u32ChromaMFCbitlen = pFrmInfo_ext->u32ChromaAddrExt[HVD_FRM_INFO_EXT_TYPE_MFCBITLEN];
6185*53ee8cc1Swenshuai.xi 
6186*53ee8cc1Swenshuai.xi 
6187*53ee8cc1Swenshuai.xi             pInfo->u32MaxLuminance    = pFrmInfo_ext->maxLuminance;
6188*53ee8cc1Swenshuai.xi             pInfo->u32MinLuminance    = pFrmInfo_ext->minLuminance;
6189*53ee8cc1Swenshuai.xi             pInfo->u16Primaries[0][0] = pFrmInfo_ext->primaries[0][0];
6190*53ee8cc1Swenshuai.xi             pInfo->u16Primaries[0][1] = pFrmInfo_ext->primaries[0][1];
6191*53ee8cc1Swenshuai.xi             pInfo->u16Primaries[1][0] = pFrmInfo_ext->primaries[1][0];
6192*53ee8cc1Swenshuai.xi             pInfo->u16Primaries[1][1] = pFrmInfo_ext->primaries[1][1];
6193*53ee8cc1Swenshuai.xi             pInfo->u16Primaries[2][0] = pFrmInfo_ext->primaries[2][0];
6194*53ee8cc1Swenshuai.xi             pInfo->u16Primaries[2][1] = pFrmInfo_ext->primaries[2][1];
6195*53ee8cc1Swenshuai.xi             pInfo->u16WhitePoint[0]   = pFrmInfo_ext->whitePoint[0];
6196*53ee8cc1Swenshuai.xi             pInfo->u16WhitePoint[1]   = pFrmInfo_ext->whitePoint[1];
6197*53ee8cc1Swenshuai.xi 
6198*53ee8cc1Swenshuai.xi             pInfo->u8Frm_Info_Ext_avail       = pFrmInfo_ext->Frm_Info_Ext_avail;
6199*53ee8cc1Swenshuai.xi             pInfo->u8Colour_primaries         = pFrmInfo_ext->colour_primaries;
6200*53ee8cc1Swenshuai.xi             pInfo->u8Transfer_characteristics = pFrmInfo_ext->transfer_characteristics;
6201*53ee8cc1Swenshuai.xi             pInfo->u8Matrix_coefficients      = pFrmInfo_ext->matrix_coefficients;
6202*53ee8cc1Swenshuai.xi 
6203*53ee8cc1Swenshuai.xi             pInfo->u8DVMode = pFrmInfo_ext->u8DVMode;
6204*53ee8cc1Swenshuai.xi             pInfo->u32DVMetadataAddr = (MS_PHY)(pFrmInfo_ext->u32DVMetadataAddr);
6205*53ee8cc1Swenshuai.xi             if (pInfo->u8DVMode & 0x03) // we hide dolby vision infomation into Luma Interlace Address when dolby mode enable;
6206*53ee8cc1Swenshuai.xi             {
6207*53ee8cc1Swenshuai.xi                 pInfo->u32LumaAddrI = pInfo->u8DVMode;
6208*53ee8cc1Swenshuai.xi             }
6209*53ee8cc1Swenshuai.xi             pInfo->u32DVDMSize = pFrmInfo_ext->u32DVDMSize;
6210*53ee8cc1Swenshuai.xi             pInfo->u32DVCompSize = pFrmInfo_ext->u32DVCompSize;
6211*53ee8cc1Swenshuai.xi             pInfo->u8CurrentIndex = pFrmInfo_ext->u8CurrentIndex;
6212*53ee8cc1Swenshuai.xi             pInfo->u32HDRRegAddr = pFrmInfo_ext->u32DVRegAddr;
6213*53ee8cc1Swenshuai.xi             pInfo->u32HDRRegSize = pFrmInfo_ext->u32DVRegSize;
6214*53ee8cc1Swenshuai.xi             pInfo->u32HDRLutAddr = pFrmInfo_ext->u32DVLutAddr;
6215*53ee8cc1Swenshuai.xi             pInfo->u32HDRLutSize = pFrmInfo_ext->u32DVLutSize;
6216*53ee8cc1Swenshuai.xi             pInfo->bDMEnable = pFrmInfo_ext->bDMEnable;
6217*53ee8cc1Swenshuai.xi             pInfo->bCompEnable = pFrmInfo_ext->bCompEnable;
6218*53ee8cc1Swenshuai.xi             pInfo->u8ComplexityLevel = pFrmInfo_ext->u8ComplexityLevel;
6219*53ee8cc1Swenshuai.xi 
6220*53ee8cc1Swenshuai.xi             pInfo->u32ParWidth = pFrmInfo_ext->u32ParWidth;
6221*53ee8cc1Swenshuai.xi             pInfo->u32ParHeight = pFrmInfo_ext->u32ParHeight;
6222*53ee8cc1Swenshuai.xi             pInfo->u16CropRight = pFrmInfo_ext->u16CropRight;
6223*53ee8cc1Swenshuai.xi             pInfo->u16CropLeft = pFrmInfo_ext->u16CropLeft;
6224*53ee8cc1Swenshuai.xi             pInfo->u16CropBottom = pFrmInfo_ext->u16CropBottom;
6225*53ee8cc1Swenshuai.xi             pInfo->u16CropTop = pFrmInfo_ext->u16CropTop;
6226*53ee8cc1Swenshuai.xi 
6227*53ee8cc1Swenshuai.xi             pInfo->u8TileMode         = pFrmInfo_ext->u8TileMode;
6228*53ee8cc1Swenshuai.xi             pInfo->u16MIUBandwidth    = pFrmInfo_ext->u16MIUBandwidth;
6229*53ee8cc1Swenshuai.xi             pInfo->u16Bitrate         = pFrmInfo_ext->u16Bitrate;
6230*53ee8cc1Swenshuai.xi             pInfo->u8HTLBTableId      = pFrmInfo_ext->u8HTLBTableId;
6231*53ee8cc1Swenshuai.xi             pInfo->u8HTLBEntriesSize  = pFrmInfo_ext->u8HTLBEntriesSize;
6232*53ee8cc1Swenshuai.xi             pInfo->u32HTLBEntriesAddr = pFrmInfo_ext->u32HTLBEntriesAddr;
6233*53ee8cc1Swenshuai.xi 
6234*53ee8cc1Swenshuai.xi             if (eType == E_HVD_EX_GFRMINFO_NEXT_DISPLAY)
6235*53ee8cc1Swenshuai.xi             {
6236*53ee8cc1Swenshuai.xi                 pHVDDrvContext->gHVDCtrl_EX[u8DrvId].pLastFrmInfo_ext = pFrmInfo_ext;
6237*53ee8cc1Swenshuai.xi             }
6238*53ee8cc1Swenshuai.xi         }
6239*53ee8cc1Swenshuai.xi     }
6240*53ee8cc1Swenshuai.xi     else
6241*53ee8cc1Swenshuai.xi     {
6242*53ee8cc1Swenshuai.xi         return E_HVD_EX_FAIL;
6243*53ee8cc1Swenshuai.xi     }
6244*53ee8cc1Swenshuai.xi 
6245*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
6246*53ee8cc1Swenshuai.xi }
6247*53ee8cc1Swenshuai.xi 
6248*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6249*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetISRInfo()
6250*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get information of HVD driver interrupt
6251*53ee8cc1Swenshuai.xi /// @param -eType \b OUT : ISR information
6252*53ee8cc1Swenshuai.xi /// @return -the result of get ISR information
6253*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetISRInfo(MS_U32 u32Id,MS_U32 * eType)6254*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_GetISRInfo(MS_U32 u32Id, MS_U32 *eType)
6255*53ee8cc1Swenshuai.xi {
6256*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6257*53ee8cc1Swenshuai.xi 
6258*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
6259*53ee8cc1Swenshuai.xi 
6260*53ee8cc1Swenshuai.xi     if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].HVDISRCtrl.bInISR)
6261*53ee8cc1Swenshuai.xi     {
6262*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].HVDISRCtrl.u32ISRInfo |= HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_HVD_ISR_STATUS);
6263*53ee8cc1Swenshuai.xi         *eType = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].HVDISRCtrl.u32ISRInfo;
6264*53ee8cc1Swenshuai.xi     }
6265*53ee8cc1Swenshuai.xi     else
6266*53ee8cc1Swenshuai.xi     {
6267*53ee8cc1Swenshuai.xi         *eType = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_HVD_ISR_STATUS);
6268*53ee8cc1Swenshuai.xi     }
6269*53ee8cc1Swenshuai.xi 
6270*53ee8cc1Swenshuai.xi     HVD_EX_MSG_DBG("ISR=0x%x\n", *eType);
6271*53ee8cc1Swenshuai.xi 
6272*53ee8cc1Swenshuai.xi     return TRUE;
6273*53ee8cc1Swenshuai.xi }
6274*53ee8cc1Swenshuai.xi 
6275*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6276*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_CalLumaSum()
6277*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get the sum of luma data in a frame.
6278*53ee8cc1Swenshuai.xi /// @param -eType \b IN : Type of frame information
6279*53ee8cc1Swenshuai.xi /// @return -the sum
6280*53ee8cc1Swenshuai.xi /// @retval     -0xFFFFFFFF: error occer.
6281*53ee8cc1Swenshuai.xi /// @retval     -not zero: the sum.
6282*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_CalLumaSum(MS_U32 u32Id,HVD_EX_GetFrmInfoType eType)6283*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_CalLumaSum(MS_U32 u32Id, HVD_EX_GetFrmInfoType eType)
6284*53ee8cc1Swenshuai.xi {
6285*53ee8cc1Swenshuai.xi     HVD_Frm_Information *pFrmInfo = NULL;
6286*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = HVD_U32_MAX;
6287*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6288*53ee8cc1Swenshuai.xi 
6289*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
6290*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,u32Ret);
6291*53ee8cc1Swenshuai.xi 
6292*53ee8cc1Swenshuai.xi     if (eType == E_HVD_EX_GFRMINFO_DISPLAY)
6293*53ee8cc1Swenshuai.xi     {
6294*53ee8cc1Swenshuai.xi         pFrmInfo = (HVD_Frm_Information *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_FRM_INFO);
6295*53ee8cc1Swenshuai.xi     }
6296*53ee8cc1Swenshuai.xi     else if (eType == E_HVD_EX_GFRMINFO_DECODE)
6297*53ee8cc1Swenshuai.xi     {
6298*53ee8cc1Swenshuai.xi         pFrmInfo = (HVD_Frm_Information *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_FRM_INFO);
6299*53ee8cc1Swenshuai.xi     }
6300*53ee8cc1Swenshuai.xi 
6301*53ee8cc1Swenshuai.xi     if (pFrmInfo != NULL)
6302*53ee8cc1Swenshuai.xi     {
6303*53ee8cc1Swenshuai.xi         MS_U32 u32tmp = 0;
6304*53ee8cc1Swenshuai.xi         MS_U32 u32PitchCnt = 0;
6305*53ee8cc1Swenshuai.xi         MS_U32 u32HeightCnt = 0;
6306*53ee8cc1Swenshuai.xi         volatile MS_U8 *pLumaData = NULL;
6307*53ee8cc1Swenshuai.xi         // PA2VA
6308*53ee8cc1Swenshuai.xi         u32tmp = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32FrameBufAddr;
6309*53ee8cc1Swenshuai.xi 
6310*53ee8cc1Swenshuai.xi         if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8FrmMiuSel == E_CHIP_MIU_1/*u32CtrlMode & HVD_CTRL_FRM_MIU_1*/)
6311*53ee8cc1Swenshuai.xi         {
6312*53ee8cc1Swenshuai.xi             u32tmp -= pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU1BaseAddr;
6313*53ee8cc1Swenshuai.xi         }
6314*53ee8cc1Swenshuai.xi         else if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8FrmMiuSel == E_CHIP_MIU_2)
6315*53ee8cc1Swenshuai.xi         {
6316*53ee8cc1Swenshuai.xi             u32tmp -= pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU2BaseAddr;
6317*53ee8cc1Swenshuai.xi         }
6318*53ee8cc1Swenshuai.xi 
6319*53ee8cc1Swenshuai.xi         pLumaData = (volatile MS_U8 *) (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32FrameBufVAddr + (pFrmInfo->u32LumaAddr - u32tmp));
6320*53ee8cc1Swenshuai.xi 
6321*53ee8cc1Swenshuai.xi         for (u32HeightCnt = 0; u32HeightCnt < pFrmInfo->u16Height; u32HeightCnt++)
6322*53ee8cc1Swenshuai.xi         {
6323*53ee8cc1Swenshuai.xi             for (u32PitchCnt = 0; u32PitchCnt < pFrmInfo->u16Pitch; u32PitchCnt++)
6324*53ee8cc1Swenshuai.xi             {
6325*53ee8cc1Swenshuai.xi                 if (u32PitchCnt < pFrmInfo->u16Pitch)
6326*53ee8cc1Swenshuai.xi                 {
6327*53ee8cc1Swenshuai.xi                     u32Ret += (MS_U32) (*pLumaData);
6328*53ee8cc1Swenshuai.xi                 }
6329*53ee8cc1Swenshuai.xi                 pLumaData++;
6330*53ee8cc1Swenshuai.xi             }
6331*53ee8cc1Swenshuai.xi         }
6332*53ee8cc1Swenshuai.xi     }
6333*53ee8cc1Swenshuai.xi 
6334*53ee8cc1Swenshuai.xi     return u32Ret;
6335*53ee8cc1Swenshuai.xi }
6336*53ee8cc1Swenshuai.xi 
6337*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6338*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetUserData_Wptr()
6339*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get write pointer of user data.
6340*53ee8cc1Swenshuai.xi /// @return -the information of write pointer of user data.
6341*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetUserData_Wptr(MS_U32 u32Id)6342*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetUserData_Wptr(MS_U32 u32Id)
6343*53ee8cc1Swenshuai.xi {
6344*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6345*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = 0;
6346*53ee8cc1Swenshuai.xi 
6347*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
6348*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
6349*53ee8cc1Swenshuai.xi 
6350*53ee8cc1Swenshuai.xi     u32Ret = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_WPTR);
6351*53ee8cc1Swenshuai.xi 
6352*53ee8cc1Swenshuai.xi     return u32Ret;
6353*53ee8cc1Swenshuai.xi }
6354*53ee8cc1Swenshuai.xi 
6355*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6356*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetUserData_Packet()
6357*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get information of user data packet.
6358*53ee8cc1Swenshuai.xi /// @param -u32Idx \b IN : the pointer of required user data packet( valid range is 0 ~ 11 )
6359*53ee8cc1Swenshuai.xi /// @param -u32Size \b OUT : the size of required user data packet
6360*53ee8cc1Swenshuai.xi /// @return -the offset of user data packet form code buffer start address
6361*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetUserData_Packet(MS_U32 u32Id,MS_U32 u32Idx,MS_U32 * u32Size)6362*53ee8cc1Swenshuai.xi MS_VIRT MDrv_HVD_EX_GetUserData_Packet(MS_U32 u32Id, MS_U32 u32Idx, MS_U32 *u32Size)
6363*53ee8cc1Swenshuai.xi {
6364*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6365*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = 0;
6366*53ee8cc1Swenshuai.xi     MS_VIRT tmp = 0;
6367*53ee8cc1Swenshuai.xi     MS_U8 *pIdx = NULL;
6368*53ee8cc1Swenshuai.xi 
6369*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
6370*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
6371*53ee8cc1Swenshuai.xi 
6372*53ee8cc1Swenshuai.xi     *u32Size = 0;
6373*53ee8cc1Swenshuai.xi     tmp = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_IDX_TBL_SIZE);
6374*53ee8cc1Swenshuai.xi 
6375*53ee8cc1Swenshuai.xi     if (u32Idx >= tmp)
6376*53ee8cc1Swenshuai.xi     {
6377*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("input user data index(%u) is larger than max index(%lu)\n", u32Idx, (unsigned long)tmp);
6378*53ee8cc1Swenshuai.xi         return 0;
6379*53ee8cc1Swenshuai.xi     }
6380*53ee8cc1Swenshuai.xi     tmp = (MS_VIRT) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_IDX_TBL_ADDR);
6381*53ee8cc1Swenshuai.xi     if (tmp == 0)
6382*53ee8cc1Swenshuai.xi     {
6383*53ee8cc1Swenshuai.xi         HVD_EX_MSG_INF("HVD FW ERR: user data packet idx tbl base addr(%lx) is zero\n", (unsigned long)tmp);
6384*53ee8cc1Swenshuai.xi         return 0;
6385*53ee8cc1Swenshuai.xi     }
6386*53ee8cc1Swenshuai.xi 
6387*53ee8cc1Swenshuai.xi     pIdx = (MS_U8 *) (tmp + u32Idx);
6388*53ee8cc1Swenshuai.xi 
6389*53ee8cc1Swenshuai.xi     tmp = (MS_VIRT) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_PACKET_TBL_SIZE);
6390*53ee8cc1Swenshuai.xi     if ((*pIdx) >= tmp)
6391*53ee8cc1Swenshuai.xi     {
6392*53ee8cc1Swenshuai.xi         HVD_EX_MSG_INF("HVD FW ERR: user data packet tbl ptr(%lu) is larger than max size(%lu)\n", (unsigned long) (*pIdx), (unsigned long)tmp);
6393*53ee8cc1Swenshuai.xi         return 0;
6394*53ee8cc1Swenshuai.xi     }
6395*53ee8cc1Swenshuai.xi     tmp = (MS_VIRT) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_PACKET_TBL_ADDR);
6396*53ee8cc1Swenshuai.xi     if (tmp == 0)
6397*53ee8cc1Swenshuai.xi     {
6398*53ee8cc1Swenshuai.xi         HVD_EX_MSG_INF("HVD FW ERR: user data packet packet tbl base offset(%lx) is zero\n", (unsigned long)tmp);
6399*53ee8cc1Swenshuai.xi         return 0;
6400*53ee8cc1Swenshuai.xi     }
6401*53ee8cc1Swenshuai.xi     u32Ret = tmp;
6402*53ee8cc1Swenshuai.xi     tmp = (MS_VIRT) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_PACKET_SIZE);
6403*53ee8cc1Swenshuai.xi     if (tmp == 0)
6404*53ee8cc1Swenshuai.xi     {
6405*53ee8cc1Swenshuai.xi         HVD_EX_MSG_INF("HVD FW ERR: user data packet packet size(%lu) is zero\n", (unsigned long)tmp);
6406*53ee8cc1Swenshuai.xi         return 0;
6407*53ee8cc1Swenshuai.xi     }
6408*53ee8cc1Swenshuai.xi     *u32Size = tmp;
6409*53ee8cc1Swenshuai.xi     u32Ret += (MS_U32) (*pIdx) * tmp;
6410*53ee8cc1Swenshuai.xi     return u32Ret;
6411*53ee8cc1Swenshuai.xi }
6412*53ee8cc1Swenshuai.xi 
6413*53ee8cc1Swenshuai.xi // VDEC Interal control
6414*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6415*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GenPattern()
6416*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Generate spcific pattern to support some special function.
6417*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the virtual address of spcific pattern
6418*53ee8cc1Swenshuai.xi /// @param -u32VAddr \b IN : the virtual address of spcific pattern
6419*53ee8cc1Swenshuai.xi /// @param -u32Size \b IN, OUT :
6420*53ee8cc1Swenshuai.xi ///                             IN: the input array size.
6421*53ee8cc1Swenshuai.xi ///                             OUT: the used array size.
6422*53ee8cc1Swenshuai.xi /// @return -The result of command generate spcific pattern
6423*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GenPattern(MS_U32 u32Id,HVD_EX_PatternType eType,MS_VIRT u32VAddr,MS_U32 * pu32Size)6424*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GenPattern(MS_U32 u32Id, HVD_EX_PatternType eType, MS_VIRT u32VAddr, MS_U32 * pu32Size)
6425*53ee8cc1Swenshuai.xi {
6426*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6427*53ee8cc1Swenshuai.xi     MS_U8 *pDummyData = NULL;
6428*53ee8cc1Swenshuai.xi     MS_U32 u32MinPatternSize = 0;
6429*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6430*53ee8cc1Swenshuai.xi 
6431*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
6432*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
6433*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
6434*53ee8cc1Swenshuai.xi 
6435*53ee8cc1Swenshuai.xi     if (eType == E_HVD_EX_PATTERN_FLUSH)   // flush pattern
6436*53ee8cc1Swenshuai.xi     {
6437*53ee8cc1Swenshuai.xi         // Driver input need not to push flush pattern
6438*53ee8cc1Swenshuai.xi         if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
6439*53ee8cc1Swenshuai.xi         {
6440*53ee8cc1Swenshuai.xi             *pu32Size = 0;
6441*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_OK;
6442*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
6443*53ee8cc1Swenshuai.xi         }
6444*53ee8cc1Swenshuai.xi 
6445*53ee8cc1Swenshuai.xi         // TSP input process
6446*53ee8cc1Swenshuai.xi         if (u32VAddr == 0)
6447*53ee8cc1Swenshuai.xi         {
6448*53ee8cc1Swenshuai.xi             *pu32Size = 8 + 144;
6449*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("Flush Pattern address shall not be zero\n");
6450*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_RET_INVALID_PARAMETER;
6451*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
6452*53ee8cc1Swenshuai.xi         }
6453*53ee8cc1Swenshuai.xi 
6454*53ee8cc1Swenshuai.xi         switch ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
6455*53ee8cc1Swenshuai.xi         {
6456*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVC:
6457*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_MVC:
6458*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_VP8:
6459*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVS:
6460*53ee8cc1Swenshuai.xi         #if SUPPORT_EVD
6461*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_VP9:
6462*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_HEVC:
6463*53ee8cc1Swenshuai.xi         #endif
6464*53ee8cc1Swenshuai.xi             {
6465*53ee8cc1Swenshuai.xi                 u32MinPatternSize = 8 + 144;
6466*53ee8cc1Swenshuai.xi                 break;
6467*53ee8cc1Swenshuai.xi             }
6468*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_RM:
6469*53ee8cc1Swenshuai.xi             default:
6470*53ee8cc1Swenshuai.xi                 u32MinPatternSize = 0;
6471*53ee8cc1Swenshuai.xi                 break;
6472*53ee8cc1Swenshuai.xi         }
6473*53ee8cc1Swenshuai.xi 
6474*53ee8cc1Swenshuai.xi         if (*pu32Size < u32MinPatternSize)
6475*53ee8cc1Swenshuai.xi         {
6476*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("Flush Pattern must have at least %u bytes, input:%u\n", u32MinPatternSize,
6477*53ee8cc1Swenshuai.xi                         (MS_U32) (*pu32Size));
6478*53ee8cc1Swenshuai.xi             *pu32Size = u32MinPatternSize;
6479*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_RET_OUTOF_MEMORY;
6480*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
6481*53ee8cc1Swenshuai.xi         }
6482*53ee8cc1Swenshuai.xi 
6483*53ee8cc1Swenshuai.xi         *pu32Size = u32MinPatternSize;
6484*53ee8cc1Swenshuai.xi         pDummyData = (MS_U8 *) u32VAddr;
6485*53ee8cc1Swenshuai.xi 
6486*53ee8cc1Swenshuai.xi         memset((void *) pDummyData, 0, *pu32Size);
6487*53ee8cc1Swenshuai.xi 
6488*53ee8cc1Swenshuai.xi         switch ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
6489*53ee8cc1Swenshuai.xi         {
6490*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVC:
6491*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_MVC:
6492*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_VP8:
6493*53ee8cc1Swenshuai.xi         #if SUPPORT_EVD
6494*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_VP9:
6495*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_HEVC:
6496*53ee8cc1Swenshuai.xi         #endif
6497*53ee8cc1Swenshuai.xi             {
6498*53ee8cc1Swenshuai.xi                 pDummyData[0] = 0;
6499*53ee8cc1Swenshuai.xi                 pDummyData[1] = 0;
6500*53ee8cc1Swenshuai.xi                 pDummyData[2] = 1;
6501*53ee8cc1Swenshuai.xi                 pDummyData[3] = 0xFF;
6502*53ee8cc1Swenshuai.xi                 pDummyData[4] = 0xAA;
6503*53ee8cc1Swenshuai.xi                 pDummyData[5] = 0x55;
6504*53ee8cc1Swenshuai.xi                 pDummyData[6] = 0xAA;
6505*53ee8cc1Swenshuai.xi                 pDummyData[7] = 0x55;
6506*53ee8cc1Swenshuai.xi 
6507*53ee8cc1Swenshuai.xi                 break;
6508*53ee8cc1Swenshuai.xi             }
6509*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVS:
6510*53ee8cc1Swenshuai.xi             {
6511*53ee8cc1Swenshuai.xi                 pDummyData[0] = 0;
6512*53ee8cc1Swenshuai.xi                 pDummyData[1] = 0;
6513*53ee8cc1Swenshuai.xi                 pDummyData[2] = 1;
6514*53ee8cc1Swenshuai.xi                 pDummyData[3] = 0xB4;
6515*53ee8cc1Swenshuai.xi                 pDummyData[4] = 0xAA;
6516*53ee8cc1Swenshuai.xi                 pDummyData[5] = 0x55;
6517*53ee8cc1Swenshuai.xi                 pDummyData[6] = 0xAA;
6518*53ee8cc1Swenshuai.xi                 pDummyData[7] = 0x55;
6519*53ee8cc1Swenshuai.xi 
6520*53ee8cc1Swenshuai.xi                 break;
6521*53ee8cc1Swenshuai.xi             }
6522*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_RM:
6523*53ee8cc1Swenshuai.xi             default:
6524*53ee8cc1Swenshuai.xi                 break;
6525*53ee8cc1Swenshuai.xi         }
6526*53ee8cc1Swenshuai.xi     }
6527*53ee8cc1Swenshuai.xi     else if (eType == E_HVD_EX_PATTERN_FILEEND)    // dummy pattern
6528*53ee8cc1Swenshuai.xi     {
6529*53ee8cc1Swenshuai.xi         // Driver input need not to push dummy pattern
6530*53ee8cc1Swenshuai.xi         if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
6531*53ee8cc1Swenshuai.xi         {
6532*53ee8cc1Swenshuai.xi             *pu32Size = 0;
6533*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_OK;
6534*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
6535*53ee8cc1Swenshuai.xi         }
6536*53ee8cc1Swenshuai.xi 
6537*53ee8cc1Swenshuai.xi         // TSP input process
6538*53ee8cc1Swenshuai.xi         if (u32VAddr == 0)
6539*53ee8cc1Swenshuai.xi         {
6540*53ee8cc1Swenshuai.xi             *pu32Size = 8 + 144;
6541*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("Dummy Pattern address shall not be zero\n");
6542*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_RET_INVALID_PARAMETER;
6543*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
6544*53ee8cc1Swenshuai.xi         }
6545*53ee8cc1Swenshuai.xi 
6546*53ee8cc1Swenshuai.xi         switch ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
6547*53ee8cc1Swenshuai.xi         {
6548*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVC:
6549*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_MVC:
6550*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_VP8:
6551*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVS:
6552*53ee8cc1Swenshuai.xi         #if SUPPORT_EVD
6553*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_VP9:
6554*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_HEVC:
6555*53ee8cc1Swenshuai.xi         #endif
6556*53ee8cc1Swenshuai.xi                 u32MinPatternSize = 8 + 144;
6557*53ee8cc1Swenshuai.xi                 break;
6558*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_RM:
6559*53ee8cc1Swenshuai.xi             default:
6560*53ee8cc1Swenshuai.xi                 u32MinPatternSize = 0;
6561*53ee8cc1Swenshuai.xi                 break;
6562*53ee8cc1Swenshuai.xi         }
6563*53ee8cc1Swenshuai.xi 
6564*53ee8cc1Swenshuai.xi         if (*pu32Size < u32MinPatternSize)
6565*53ee8cc1Swenshuai.xi         {
6566*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("Dummy Pattern must have at least %u bytes, input:%u\n", u32MinPatternSize,
6567*53ee8cc1Swenshuai.xi                         (MS_U32) (*pu32Size));
6568*53ee8cc1Swenshuai.xi             *pu32Size = u32MinPatternSize;
6569*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_RET_OUTOF_MEMORY;
6570*53ee8cc1Swenshuai.xi             _DRV_HVD_EX_RET(u8DrvId, eRet);
6571*53ee8cc1Swenshuai.xi         }
6572*53ee8cc1Swenshuai.xi 
6573*53ee8cc1Swenshuai.xi         pDummyData = (MS_U8 *) u32VAddr;
6574*53ee8cc1Swenshuai.xi 
6575*53ee8cc1Swenshuai.xi         memset((void *) pDummyData, 0, *pu32Size);
6576*53ee8cc1Swenshuai.xi 
6577*53ee8cc1Swenshuai.xi         switch ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
6578*53ee8cc1Swenshuai.xi         {
6579*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVC:
6580*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_MVC:
6581*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_VP8:
6582*53ee8cc1Swenshuai.xi         #if SUPPORT_EVD
6583*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_VP9:
6584*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_HEVC:
6585*53ee8cc1Swenshuai.xi         #endif
6586*53ee8cc1Swenshuai.xi             {
6587*53ee8cc1Swenshuai.xi                 pDummyData[0] = 0;
6588*53ee8cc1Swenshuai.xi                 pDummyData[1] = 0;
6589*53ee8cc1Swenshuai.xi                 pDummyData[2] = 1;
6590*53ee8cc1Swenshuai.xi                 pDummyData[3] = 0xFF;
6591*53ee8cc1Swenshuai.xi                 pDummyData[4] = 0xFF;
6592*53ee8cc1Swenshuai.xi                 pDummyData[5] = 0xFF;
6593*53ee8cc1Swenshuai.xi                 pDummyData[6] = 0xFF;
6594*53ee8cc1Swenshuai.xi                 pDummyData[7] = 0xFF;
6595*53ee8cc1Swenshuai.xi 
6596*53ee8cc1Swenshuai.xi                 break;
6597*53ee8cc1Swenshuai.xi             }
6598*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVS:
6599*53ee8cc1Swenshuai.xi             {
6600*53ee8cc1Swenshuai.xi                 pDummyData[0] = 0;
6601*53ee8cc1Swenshuai.xi                 pDummyData[1] = 0;
6602*53ee8cc1Swenshuai.xi                 pDummyData[2] = 1;
6603*53ee8cc1Swenshuai.xi                 pDummyData[3] = 0xB4;
6604*53ee8cc1Swenshuai.xi                 pDummyData[4] = 0xAA;
6605*53ee8cc1Swenshuai.xi                 pDummyData[5] = 0x66;
6606*53ee8cc1Swenshuai.xi                 pDummyData[6] = 0xAA;
6607*53ee8cc1Swenshuai.xi                 pDummyData[7] = 0x66;
6608*53ee8cc1Swenshuai.xi 
6609*53ee8cc1Swenshuai.xi                 break;
6610*53ee8cc1Swenshuai.xi             }
6611*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_RM:
6612*53ee8cc1Swenshuai.xi             default:
6613*53ee8cc1Swenshuai.xi                 *pu32Size = u32MinPatternSize;
6614*53ee8cc1Swenshuai.xi                 break;
6615*53ee8cc1Swenshuai.xi         }
6616*53ee8cc1Swenshuai.xi     }
6617*53ee8cc1Swenshuai.xi 
6618*53ee8cc1Swenshuai.xi     eRet = E_HVD_EX_OK;
6619*53ee8cc1Swenshuai.xi 
6620*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
6621*53ee8cc1Swenshuai.xi }
6622*53ee8cc1Swenshuai.xi 
6623*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6624*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetPatternInfo()
6625*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get driver specific data information
6626*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the type of specific data information
6627*53ee8cc1Swenshuai.xi /// @return -the information of choosed type
6628*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetPatternInfo(MS_U32 u32Id,HVD_EX_PatternInfo eType)6629*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetPatternInfo(MS_U32 u32Id, HVD_EX_PatternInfo eType)
6630*53ee8cc1Swenshuai.xi {
6631*53ee8cc1Swenshuai.xi     MS_U32 eRet = 0;
6632*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6633*53ee8cc1Swenshuai.xi 
6634*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
6635*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
6636*53ee8cc1Swenshuai.xi 
6637*53ee8cc1Swenshuai.xi     switch (eType)
6638*53ee8cc1Swenshuai.xi     {
6639*53ee8cc1Swenshuai.xi         case E_HVD_EX_FLUSH_PATTERN_SIZE:
6640*53ee8cc1Swenshuai.xi         {
6641*53ee8cc1Swenshuai.xi             if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
6642*53ee8cc1Swenshuai.xi             {
6643*53ee8cc1Swenshuai.xi                 eRet = 0;
6644*53ee8cc1Swenshuai.xi             }
6645*53ee8cc1Swenshuai.xi             else if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_TS)
6646*53ee8cc1Swenshuai.xi             {
6647*53ee8cc1Swenshuai.xi                 eRet = 8 + 144;
6648*53ee8cc1Swenshuai.xi             }
6649*53ee8cc1Swenshuai.xi             break;
6650*53ee8cc1Swenshuai.xi         }
6651*53ee8cc1Swenshuai.xi         case E_HVD_EX_DUMMY_HW_FIFO:
6652*53ee8cc1Swenshuai.xi         {
6653*53ee8cc1Swenshuai.xi             if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
6654*53ee8cc1Swenshuai.xi             {
6655*53ee8cc1Swenshuai.xi                 eRet = 0;
6656*53ee8cc1Swenshuai.xi             }
6657*53ee8cc1Swenshuai.xi             else if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_TS)
6658*53ee8cc1Swenshuai.xi             {
6659*53ee8cc1Swenshuai.xi                 eRet = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_MAX_DUMMY_FIFO);
6660*53ee8cc1Swenshuai.xi             }
6661*53ee8cc1Swenshuai.xi             break;
6662*53ee8cc1Swenshuai.xi         }
6663*53ee8cc1Swenshuai.xi         default:
6664*53ee8cc1Swenshuai.xi             break;
6665*53ee8cc1Swenshuai.xi     }
6666*53ee8cc1Swenshuai.xi 
6667*53ee8cc1Swenshuai.xi     return eRet;
6668*53ee8cc1Swenshuai.xi }
6669*53ee8cc1Swenshuai.xi 
6670*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_GetDSBufMiuSelect(MS_U32 u32Id)6671*53ee8cc1Swenshuai.xi MS_U8 MDrv_HVD_EX_GetDSBufMiuSelect(MS_U32 u32Id)
6672*53ee8cc1Swenshuai.xi {
6673*53ee8cc1Swenshuai.xi     MS_U8 u8MiuSel;
6674*53ee8cc1Swenshuai.xi     MS_U32 u32StartOffset;
6675*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6676*53ee8cc1Swenshuai.xi 
6677*53ee8cc1Swenshuai.xi 
6678*53ee8cc1Swenshuai.xi     if(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8SettingMode & HVD_DRV_MODE_EXTERNAL_DS_BUFFER)
6679*53ee8cc1Swenshuai.xi     {
6680*53ee8cc1Swenshuai.xi         _phy_to_miu_offset(u8MiuSel, u32StartOffset, pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32ExternalDSbuf);
6681*53ee8cc1Swenshuai.xi     }
6682*53ee8cc1Swenshuai.xi     else
6683*53ee8cc1Swenshuai.xi     {
6684*53ee8cc1Swenshuai.xi         _phy_to_miu_offset(u8MiuSel, u32StartOffset, pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr);
6685*53ee8cc1Swenshuai.xi     }
6686*53ee8cc1Swenshuai.xi     return u8MiuSel;
6687*53ee8cc1Swenshuai.xi }
6688*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_GetPVRSeamlessInfo(MS_U32 u32Id,HVD_EX_PVR_Seamless_Info * param)6689*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_GetPVRSeamlessInfo(MS_U32 u32Id, HVD_EX_PVR_Seamless_Info* param)
6690*53ee8cc1Swenshuai.xi {
6691*53ee8cc1Swenshuai.xi     param->u64PTS = (MS_U64) HAL_HVD_EX_GetData_EX(u32Id, E_HVD_GDATA_TS_SEAMLESS_TARGET_PTS);
6692*53ee8cc1Swenshuai.xi     param->u32POC = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_TS_SEAMLESS_TARGET_POC);
6693*53ee8cc1Swenshuai.xi     param->u8FrameType = 0xFF;  // not support now
6694*53ee8cc1Swenshuai.xi 
6695*53ee8cc1Swenshuai.xi     return TRUE;
6696*53ee8cc1Swenshuai.xi }
6697*53ee8cc1Swenshuai.xi 
6698*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6699*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetDynamicScalingInfo()
6700*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get information of Dynamic Scaling
6701*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the type of specific information
6702*53ee8cc1Swenshuai.xi /// @return -the information of choosed type
6703*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetDynamicScalingInfo(MS_U32 u32Id,HVD_EX_DynamicScalingInfo eType)6704*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetDynamicScalingInfo(MS_U32 u32Id, HVD_EX_DynamicScalingInfo eType)
6705*53ee8cc1Swenshuai.xi {
6706*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = 0;
6707*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6708*53ee8cc1Swenshuai.xi     MS_U8 u8MiuSel;
6709*53ee8cc1Swenshuai.xi     MS_U32 u32StartOffset;
6710*53ee8cc1Swenshuai.xi 
6711*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
6712*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
6713*53ee8cc1Swenshuai.xi 
6714*53ee8cc1Swenshuai.xi     switch (eType)
6715*53ee8cc1Swenshuai.xi     {
6716*53ee8cc1Swenshuai.xi         case E_HVD_EX_DS_BUF_MIUSEL:
6717*53ee8cc1Swenshuai.xi             if(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8SettingMode & HVD_DRV_MODE_EXTERNAL_DS_BUFFER)
6718*53ee8cc1Swenshuai.xi             {
6719*53ee8cc1Swenshuai.xi                 if(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32ExternalDSbuf >= pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU1BaseAddr)
6720*53ee8cc1Swenshuai.xi                 {
6721*53ee8cc1Swenshuai.xi                     u32Ret = TRUE;
6722*53ee8cc1Swenshuai.xi                 }
6723*53ee8cc1Swenshuai.xi                 else
6724*53ee8cc1Swenshuai.xi                 {
6725*53ee8cc1Swenshuai.xi                     u32Ret = FALSE;
6726*53ee8cc1Swenshuai.xi                 }
6727*53ee8cc1Swenshuai.xi 
6728*53ee8cc1Swenshuai.xi                 _phy_to_miu_offset(u8MiuSel, u32StartOffset, pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32ExternalDSbuf);
6729*53ee8cc1Swenshuai.xi                 /* comment the dead code
6730*53ee8cc1Swenshuai.xi                 if(u8MiuSel >= E_CHIP_MIU_2)
6731*53ee8cc1Swenshuai.xi                 {
6732*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("u8MiuSel is %d !!, but return type is only Boolean. Please use MDrv_HVD_EX_GetDSBufMiuSelect() to get right miu select of DS buffer!\n",u8MiuSel);
6733*53ee8cc1Swenshuai.xi                 }
6734*53ee8cc1Swenshuai.xi                 */
6735*53ee8cc1Swenshuai.xi             }
6736*53ee8cc1Swenshuai.xi             else
6737*53ee8cc1Swenshuai.xi             {
6738*53ee8cc1Swenshuai.xi                 if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr >= pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU1BaseAddr)
6739*53ee8cc1Swenshuai.xi                 {
6740*53ee8cc1Swenshuai.xi                     u32Ret = TRUE;
6741*53ee8cc1Swenshuai.xi                 }
6742*53ee8cc1Swenshuai.xi                 else
6743*53ee8cc1Swenshuai.xi                 {
6744*53ee8cc1Swenshuai.xi                     u32Ret = FALSE;
6745*53ee8cc1Swenshuai.xi                 }
6746*53ee8cc1Swenshuai.xi 
6747*53ee8cc1Swenshuai.xi                 _phy_to_miu_offset(u8MiuSel, u32StartOffset, pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr);
6748*53ee8cc1Swenshuai.xi                 /* comment the dead code, the u8MiuSel must be MIU_0 or MIU_1
6749*53ee8cc1Swenshuai.xi                 if(u8MiuSel >= E_CHIP_MIU_2)
6750*53ee8cc1Swenshuai.xi                 {
6751*53ee8cc1Swenshuai.xi 
6752*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("u8MiuSel is %d !!, but return type is only Boolean. Please use MDrv_HVD_EX_GetDSBufMiuSelect() to get right miu select of DS buffer!\n",u8MiuSel);
6753*53ee8cc1Swenshuai.xi                 }
6754*53ee8cc1Swenshuai.xi                 */
6755*53ee8cc1Swenshuai.xi             }
6756*53ee8cc1Swenshuai.xi             break;
6757*53ee8cc1Swenshuai.xi         case E_HVD_EX_DS_BUF_ADDR:
6758*53ee8cc1Swenshuai.xi             if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8SettingMode & HVD_DRV_MODE_EXTERNAL_DS_BUFFER)
6759*53ee8cc1Swenshuai.xi             {
6760*53ee8cc1Swenshuai.xi                 u32Ret = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32ExternalDSbuf;
6761*53ee8cc1Swenshuai.xi                 ///HVD_PRINT("[EDS] E_HVD_EX_DS_BUF_ADDR 0x%lx.\n",u32Ret);
6762*53ee8cc1Swenshuai.xi             }
6763*53ee8cc1Swenshuai.xi             else
6764*53ee8cc1Swenshuai.xi             {
6765*53ee8cc1Swenshuai.xi                 u32Ret = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr + HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_DS_BUF_ADDR);
6766*53ee8cc1Swenshuai.xi 
6767*53ee8cc1Swenshuai.xi                 ///HVD_PRINT("[DS] DS_BUF_ADDR 0x%lx \n", u32Ret);
6768*53ee8cc1Swenshuai.xi                 ///HVD_PRINT("[EDS] E_HVD_EX_DS_BUF_ADDR Old.\n");
6769*53ee8cc1Swenshuai.xi             }
6770*53ee8cc1Swenshuai.xi             break;
6771*53ee8cc1Swenshuai.xi         case E_HVD_EX_DS_BUF_SIZE:
6772*53ee8cc1Swenshuai.xi             u32Ret = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_DS_BUF_SIZE);
6773*53ee8cc1Swenshuai.xi             break;
6774*53ee8cc1Swenshuai.xi         case E_HVD_EX_DS_VECTOR_DEPTH:
6775*53ee8cc1Swenshuai.xi             u32Ret = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_DS_VECTOR_DEPTH);
6776*53ee8cc1Swenshuai.xi             break;
6777*53ee8cc1Swenshuai.xi         case E_HVD_EX_DS_INFO_ADDR:
6778*53ee8cc1Swenshuai.xi             if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8SettingMode & HVD_DRV_MODE_EXTERNAL_DS_BUFFER)
6779*53ee8cc1Swenshuai.xi             {
6780*53ee8cc1Swenshuai.xi                 u32Ret = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32ExternalDSbuf + HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_DS_BUF_SIZE);//0xC00;
6781*53ee8cc1Swenshuai.xi                 ///HVD_PRINT("[EDS] E_HVD_EX_DS_INFO_ADDR 0x%lx.\n",u32Ret);
6782*53ee8cc1Swenshuai.xi             }
6783*53ee8cc1Swenshuai.xi             else
6784*53ee8cc1Swenshuai.xi             {
6785*53ee8cc1Swenshuai.xi                 u32Ret = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr + HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_DS_INFO_ADDR);
6786*53ee8cc1Swenshuai.xi 
6787*53ee8cc1Swenshuai.xi                 ///HVD_PRINT("[DS] DS_INFO_ADDR 0x%lx \n", u32Ret);
6788*53ee8cc1Swenshuai.xi             }
6789*53ee8cc1Swenshuai.xi             break;
6790*53ee8cc1Swenshuai.xi         case E_HVD_EX_DS_IS_ENABLED:
6791*53ee8cc1Swenshuai.xi             u32Ret = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_DS_IS_ENABLED);
6792*53ee8cc1Swenshuai.xi             break;
6793*53ee8cc1Swenshuai.xi        default:
6794*53ee8cc1Swenshuai.xi             break;
6795*53ee8cc1Swenshuai.xi     }
6796*53ee8cc1Swenshuai.xi     return u32Ret;
6797*53ee8cc1Swenshuai.xi }
6798*53ee8cc1Swenshuai.xi 
6799*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6800*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetData()
6801*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get target data from HVD driver
6802*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the type of the target data
6803*53ee8cc1Swenshuai.xi /// @return -the value of the target data
6804*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetData(MS_U32 u32Id,HVD_EX_GDataType eType)6805*53ee8cc1Swenshuai.xi MS_VIRT MDrv_HVD_EX_GetData(MS_U32 u32Id, HVD_EX_GDataType eType)
6806*53ee8cc1Swenshuai.xi {
6807*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6808*53ee8cc1Swenshuai.xi     MS_VIRT u32Ret = 0;
6809*53ee8cc1Swenshuai.xi 
6810*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
6811*53ee8cc1Swenshuai.xi 
6812*53ee8cc1Swenshuai.xi     switch (eType)
6813*53ee8cc1Swenshuai.xi     {
6814*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_DISP_CNT:
6815*53ee8cc1Swenshuai.xi         {
6816*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_CNT);
6817*53ee8cc1Swenshuai.xi             break;
6818*53ee8cc1Swenshuai.xi         }
6819*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_SKIP_CNT:
6820*53ee8cc1Swenshuai.xi         {
6821*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_SKIP_CNT);
6822*53ee8cc1Swenshuai.xi             break;
6823*53ee8cc1Swenshuai.xi         }
6824*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_DROP_CNT:
6825*53ee8cc1Swenshuai.xi         {
6826*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DROP_CNT);
6827*53ee8cc1Swenshuai.xi             break;
6828*53ee8cc1Swenshuai.xi         }
6829*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_IDLE_CNT:
6830*53ee8cc1Swenshuai.xi         {
6831*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT);
6832*53ee8cc1Swenshuai.xi             break;
6833*53ee8cc1Swenshuai.xi         }
6834*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_VSYNC_CNT:
6835*53ee8cc1Swenshuai.xi         {
6836*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VSYNC_CNT);
6837*53ee8cc1Swenshuai.xi             break;
6838*53ee8cc1Swenshuai.xi         }
6839*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_MAIN_LOOP_CNT:
6840*53ee8cc1Swenshuai.xi         {
6841*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_MAIN_LOOP_CNT);
6842*53ee8cc1Swenshuai.xi             break;
6843*53ee8cc1Swenshuai.xi         }
6844*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_AVC_LEVEL_IDC:
6845*53ee8cc1Swenshuai.xi         {
6846*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_AVC_LEVEL_IDC);
6847*53ee8cc1Swenshuai.xi             break;
6848*53ee8cc1Swenshuai.xi         }
6849*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_DISP_Q_SIZE:
6850*53ee8cc1Swenshuai.xi         {
6851*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_Q_NUMB);
6852*53ee8cc1Swenshuai.xi             break;
6853*53ee8cc1Swenshuai.xi         }
6854*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_ES_LEVEL:
6855*53ee8cc1Swenshuai.xi         {
6856*53ee8cc1Swenshuai.xi             u32Ret = (MS_U32) (HVD_EX_ESLevel) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_LEVEL);
6857*53ee8cc1Swenshuai.xi             break;
6858*53ee8cc1Swenshuai.xi         }
6859*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_AVC_VUI_DISP_INFO:
6860*53ee8cc1Swenshuai.xi         {
6861*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_AVC_VUI_DISP_INFO);
6862*53ee8cc1Swenshuai.xi             break;
6863*53ee8cc1Swenshuai.xi         }
6864*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_DISP_STC:
6865*53ee8cc1Swenshuai.xi         {
6866*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_STC);
6867*53ee8cc1Swenshuai.xi             break;
6868*53ee8cc1Swenshuai.xi         }
6869*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_USERDATA_IDX_TBL_SIZE:
6870*53ee8cc1Swenshuai.xi         {
6871*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_IDX_TBL_SIZE);
6872*53ee8cc1Swenshuai.xi             break;
6873*53ee8cc1Swenshuai.xi         }
6874*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_USERDATA_PACKET_SIZE:
6875*53ee8cc1Swenshuai.xi         {
6876*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_PACKET_SIZE);
6877*53ee8cc1Swenshuai.xi             break;
6878*53ee8cc1Swenshuai.xi         }
6879*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_REAL_FRAMERATE:
6880*53ee8cc1Swenshuai.xi         {
6881*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_REAL_FRAMERATE);
6882*53ee8cc1Swenshuai.xi             break;
6883*53ee8cc1Swenshuai.xi         }
6884*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_IS_ORI_INTERLACE_MODE:
6885*53ee8cc1Swenshuai.xi         {
6886*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_ORI_INTERLACE_MODE);
6887*53ee8cc1Swenshuai.xi             break;
6888*53ee8cc1Swenshuai.xi         }
6889*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_FRAME_MBS_ONLY_FLAG:
6890*53ee8cc1Swenshuai.xi         {
6891*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_TYPE_FRAME_MBS_ONLY_FLAG);
6892*53ee8cc1Swenshuai.xi             break;
6893*53ee8cc1Swenshuai.xi         }
6894*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_IS_LEAST_DISPQ_SIZE:
6895*53ee8cc1Swenshuai.xi         {
6896*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_TYPE_IS_LEAST_DISPQ_SIZE);
6897*53ee8cc1Swenshuai.xi             break;
6898*53ee8cc1Swenshuai.xi         }
6899*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_FIELD_PIC_FLAG:
6900*53ee8cc1Swenshuai.xi         {
6901*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FIELD_PIC_FLAG);
6902*53ee8cc1Swenshuai.xi             break;
6903*53ee8cc1Swenshuai.xi         }
6904*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_FW_CODEC_TYPE:
6905*53ee8cc1Swenshuai.xi         {
6906*53ee8cc1Swenshuai.xi             //u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_CODEC_TYPE);
6907*53ee8cc1Swenshuai.xi             switch(HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_CODEC_TYPE))
6908*53ee8cc1Swenshuai.xi             {
6909*53ee8cc1Swenshuai.xi                 case E_HVD_Codec_AVC:
6910*53ee8cc1Swenshuai.xi                 {
6911*53ee8cc1Swenshuai.xi                     u32Ret = E_HVD_EX_AVC;
6912*53ee8cc1Swenshuai.xi                     break;
6913*53ee8cc1Swenshuai.xi                 }
6914*53ee8cc1Swenshuai.xi                 case E_HVD_Codec_AVS:
6915*53ee8cc1Swenshuai.xi                 {
6916*53ee8cc1Swenshuai.xi                     u32Ret = E_HVD_EX_AVS;
6917*53ee8cc1Swenshuai.xi                     break;
6918*53ee8cc1Swenshuai.xi                 }
6919*53ee8cc1Swenshuai.xi                 case E_HVD_Codec_RM:
6920*53ee8cc1Swenshuai.xi                 {
6921*53ee8cc1Swenshuai.xi                     u32Ret = E_HVD_EX_RM;
6922*53ee8cc1Swenshuai.xi                     break;
6923*53ee8cc1Swenshuai.xi                 }
6924*53ee8cc1Swenshuai.xi                 case E_HVD_Codec_MVC:
6925*53ee8cc1Swenshuai.xi                 {
6926*53ee8cc1Swenshuai.xi                     u32Ret = E_HVD_EX_MVC;
6927*53ee8cc1Swenshuai.xi                     break;
6928*53ee8cc1Swenshuai.xi                 }
6929*53ee8cc1Swenshuai.xi                 case E_HVD_Codec_VP8:
6930*53ee8cc1Swenshuai.xi                 {
6931*53ee8cc1Swenshuai.xi                     u32Ret = E_HVD_EX_VP8;
6932*53ee8cc1Swenshuai.xi                     break;
6933*53ee8cc1Swenshuai.xi                 }
6934*53ee8cc1Swenshuai.xi                 case E_HVD_Codec_MJPEG:
6935*53ee8cc1Swenshuai.xi                 {
6936*53ee8cc1Swenshuai.xi                     u32Ret = E_HVD_EX_NONE;
6937*53ee8cc1Swenshuai.xi                     break;
6938*53ee8cc1Swenshuai.xi                 }
6939*53ee8cc1Swenshuai.xi                 case E_HVD_Codec_HEVC:
6940*53ee8cc1Swenshuai.xi                 {
6941*53ee8cc1Swenshuai.xi                     u32Ret = E_HVD_EX_HEVC;
6942*53ee8cc1Swenshuai.xi                     break;
6943*53ee8cc1Swenshuai.xi                 }
6944*53ee8cc1Swenshuai.xi                 case E_HVD_EX_VP9:
6945*53ee8cc1Swenshuai.xi                 {
6946*53ee8cc1Swenshuai.xi                     u32Ret = E_HVD_EX_VP9;
6947*53ee8cc1Swenshuai.xi                     break;
6948*53ee8cc1Swenshuai.xi                 }
6949*53ee8cc1Swenshuai.xi                 default:
6950*53ee8cc1Swenshuai.xi                 {
6951*53ee8cc1Swenshuai.xi                     u32Ret = E_HVD_EX_NONE;
6952*53ee8cc1Swenshuai.xi                     break;
6953*53ee8cc1Swenshuai.xi                 }
6954*53ee8cc1Swenshuai.xi             }
6955*53ee8cc1Swenshuai.xi             break;
6956*53ee8cc1Swenshuai.xi         }
6957*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_FRC_MODE:
6958*53ee8cc1Swenshuai.xi         {
6959*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FRC_MODE);
6960*53ee8cc1Swenshuai.xi             break;
6961*53ee8cc1Swenshuai.xi         }
6962*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_FW_STATUS_FLAG:
6963*53ee8cc1Swenshuai.xi         {
6964*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_STATUS_FLAG);
6965*53ee8cc1Swenshuai.xi             break;
6966*53ee8cc1Swenshuai.xi         }
6967*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_HVD_HW_MAX_PIXEL:
6968*53ee8cc1Swenshuai.xi         {
6969*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_HVD_HW_MAX_PIXEL);
6970*53ee8cc1Swenshuai.xi             break;
6971*53ee8cc1Swenshuai.xi         }
6972*53ee8cc1Swenshuai.xi #ifdef VDEC3
6973*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_VBBU_ADDR:
6974*53ee8cc1Swenshuai.xi         {
6975*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_VBBU_ADDR);
6976*53ee8cc1Swenshuai.xi             break;
6977*53ee8cc1Swenshuai.xi         }
6978*53ee8cc1Swenshuai.xi #endif
6979*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_VIDEO_FULL_RANGE_FLAG:
6980*53ee8cc1Swenshuai.xi         {
6981*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VIDEO_FULL_RANGE_FLAG);
6982*53ee8cc1Swenshuai.xi             break;
6983*53ee8cc1Swenshuai.xi         }
6984*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_GET_NOT_SUPPORT_INFO:
6985*53ee8cc1Swenshuai.xi         {
6986*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_GET_NOT_SUPPORT_INFO);
6987*53ee8cc1Swenshuai.xi             break;
6988*53ee8cc1Swenshuai.xi         }
6989*53ee8cc1Swenshuai.xi         case E_HVD_EX_GDATA_TYPE_GET_MIN_TSP_DATA_SIZE :
6990*53ee8cc1Swenshuai.xi         {
6991*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_GET_MIN_TSP_DATA_SIZE);
6992*53ee8cc1Swenshuai.xi             break;
6993*53ee8cc1Swenshuai.xi         }
6994*53ee8cc1Swenshuai.xi         default:
6995*53ee8cc1Swenshuai.xi             break;
6996*53ee8cc1Swenshuai.xi     }
6997*53ee8cc1Swenshuai.xi 
6998*53ee8cc1Swenshuai.xi     return u32Ret;
6999*53ee8cc1Swenshuai.xi }
7000*53ee8cc1Swenshuai.xi 
7001*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7002*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetMem_Dbg()
7003*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get any data from any memory address
7004*53ee8cc1Swenshuai.xi /// @param -u32Addr \b IN : the memory address of the target data
7005*53ee8cc1Swenshuai.xi /// @return -the value of the memory
7006*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetMem_Dbg(MS_U32 u32Id,MS_VIRT u32Addr)7007*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetMem_Dbg(MS_U32 u32Id, MS_VIRT u32Addr)
7008*53ee8cc1Swenshuai.xi {
7009*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7010*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = 0;
7011*53ee8cc1Swenshuai.xi 
7012*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7013*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,u32Ret);
7014*53ee8cc1Swenshuai.xi 
7015*53ee8cc1Swenshuai.xi     switch (u32Addr)
7016*53ee8cc1Swenshuai.xi     {
7017*53ee8cc1Swenshuai.xi         case 1:
7018*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_READ_PTR);
7019*53ee8cc1Swenshuai.xi             break;
7020*53ee8cc1Swenshuai.xi         case 2:
7021*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_PC_CNT);
7022*53ee8cc1Swenshuai.xi             break;
7023*53ee8cc1Swenshuai.xi         case 3:
7024*53ee8cc1Swenshuai.xi             u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR);
7025*53ee8cc1Swenshuai.xi             break;
7026*53ee8cc1Swenshuai.xi         default:
7027*53ee8cc1Swenshuai.xi             break;
7028*53ee8cc1Swenshuai.xi     }
7029*53ee8cc1Swenshuai.xi 
7030*53ee8cc1Swenshuai.xi     return u32Ret;
7031*53ee8cc1Swenshuai.xi }
7032*53ee8cc1Swenshuai.xi 
7033*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7034*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_DbgDumpStatus()
7035*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Dump specific information to standard output.
7036*53ee8cc1Swenshuai.xi /// @param -eFlag \b IN : the type of information.
7037*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_DbgDumpStatus(MS_U32 u32Id,HVD_EX_DumpStatus eFlag)7038*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_DbgDumpStatus(MS_U32 u32Id, HVD_EX_DumpStatus eFlag)
7039*53ee8cc1Swenshuai.xi {
7040*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7041*53ee8cc1Swenshuai.xi 
7042*53ee8cc1Swenshuai.xi     if (!(pHVDDrvContext->bHVDIsInited[u8DrvId]))
7043*53ee8cc1Swenshuai.xi     {
7044*53ee8cc1Swenshuai.xi         return;
7045*53ee8cc1Swenshuai.xi     }
7046*53ee8cc1Swenshuai.xi 
7047*53ee8cc1Swenshuai.xi     if (eFlag & E_HVD_EX_DUMP_STATUS_FW)
7048*53ee8cc1Swenshuai.xi     {
7049*53ee8cc1Swenshuai.xi         HAL_HVD_EX_Dump_FW_Status(u32Id);
7050*53ee8cc1Swenshuai.xi     }
7051*53ee8cc1Swenshuai.xi 
7052*53ee8cc1Swenshuai.xi     if (eFlag & E_HVD_EX_DUMP_STATUS_HW)
7053*53ee8cc1Swenshuai.xi     {
7054*53ee8cc1Swenshuai.xi         HAL_HVD_EX_Dump_HW_Status(HVD_U32_MAX);
7055*53ee8cc1Swenshuai.xi     }
7056*53ee8cc1Swenshuai.xi }
7057*53ee8cc1Swenshuai.xi 
7058*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7059*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetMem_Dbg()
7060*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set any data into any memory address
7061*53ee8cc1Swenshuai.xi /// @param -u32Addr \b IN : the memory address of the target destination
7062*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : the value of input content
7063*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetMem_Dbg(MS_U32 u32Id,MS_VIRT u32Addr,MS_U32 u32Arg)7064*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_SetMem_Dbg(MS_U32 u32Id, MS_VIRT u32Addr, MS_U32 u32Arg)
7065*53ee8cc1Swenshuai.xi {
7066*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7067*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetData_Dbg(u32Addr, u32Arg);
7068*53ee8cc1Swenshuai.xi }
7069*53ee8cc1Swenshuai.xi 
7070*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7071*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetData_Dbg()
7072*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set any FW debug command
7073*53ee8cc1Swenshuai.xi /// @param -u32Cmd \b IN : specify the FW command ID.
7074*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : specify the argument of FW command.
7075*53ee8cc1Swenshuai.xi /// @return -the result of debug command
7076*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetCmd_Dbg(MS_U32 u32Id,MS_U32 u32Cmd,MS_U32 u32Arg)7077*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetCmd_Dbg(MS_U32 u32Id, MS_U32 u32Cmd, MS_U32 u32Arg)
7078*53ee8cc1Swenshuai.xi {
7079*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7080*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7081*53ee8cc1Swenshuai.xi 
7082*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7083*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7084*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7085*53ee8cc1Swenshuai.xi 
7086*53ee8cc1Swenshuai.xi     // todo: consider more...
7087*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, (HVD_User_Cmd) u32Cmd, u32Arg);
7088*53ee8cc1Swenshuai.xi 
7089*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7090*53ee8cc1Swenshuai.xi }
7091*53ee8cc1Swenshuai.xi 
7092*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7093*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Set_Err_Tolerance()
7094*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set display error tolerance
7095*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : //[15:8]+[7:0] = (err_tolerance(0%~100%)+enable or disable)
7096*53ee8cc1Swenshuai.xi /// @return -the result of set err tolerance
7097*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Set_Err_Tolerance(MS_U32 u32Id,MS_U32 u32Arg)7098*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Set_Err_Tolerance(MS_U32 u32Id, MS_U32 u32Arg)
7099*53ee8cc1Swenshuai.xi {
7100*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7101*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7102*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7103*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7104*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7105*53ee8cc1Swenshuai.xi 
7106*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SET_DISP_ERROR_TOLERANCE, u32Arg);
7107*53ee8cc1Swenshuai.xi 
7108*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7109*53ee8cc1Swenshuai.xi 
7110*53ee8cc1Swenshuai.xi }
7111*53ee8cc1Swenshuai.xi 
7112*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7113*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDVInfo()
7114*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set DV profile and level
7115*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : //[15:8]+[7:0] = (profile+level)
7116*53ee8cc1Swenshuai.xi /// @return -the result of set DV profile and level
7117*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDVInfo(MS_U32 u32Id,MS_U32 u32Arg)7118*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDVInfo(MS_U32 u32Id, MS_U32 u32Arg)
7119*53ee8cc1Swenshuai.xi {
7120*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7121*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7122*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7123*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7124*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7125*53ee8cc1Swenshuai.xi 
7126*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_DV_INFO, u32Arg);
7127*53ee8cc1Swenshuai.xi 
7128*53ee8cc1Swenshuai.xi     eRet = E_HVD_EX_OK;
7129*53ee8cc1Swenshuai.xi 
7130*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7131*53ee8cc1Swenshuai.xi }
7132*53ee8cc1Swenshuai.xi 
7133*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7134*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Set_Slow_Sync()
7135*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set slow sync
7136*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : //[15:8]+[7:0] = (repeat period + drop period)
7137*53ee8cc1Swenshuai.xi /// @return -the result of set err tolerance
7138*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Set_Slow_Sync(MS_U32 u32Id,MS_U32 u32Arg)7139*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Set_Slow_Sync(MS_U32 u32Id, MS_U32 u32Arg)
7140*53ee8cc1Swenshuai.xi {
7141*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7142*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7143*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7144*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7145*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7146*53ee8cc1Swenshuai.xi 
7147*53ee8cc1Swenshuai.xi     eRet = _HVD_MapRetEx( HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SET_SLOW_SYNC, u32Arg));
7148*53ee8cc1Swenshuai.xi 
7149*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7150*53ee8cc1Swenshuai.xi 
7151*53ee8cc1Swenshuai.xi }
7152*53ee8cc1Swenshuai.xi 
7153*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7154*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetSettings_Pro()
7155*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set any FW debug command
7156*53ee8cc1Swenshuai.xi /// @param -eType \b IN : specify the type of setting.
7157*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : specify the argument of the setting.
7158*53ee8cc1Swenshuai.xi /// @return -the result of set professional settings.
7159*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetSettings_Pro(MS_U32 u32Id,HVD_EX_SSettingsType eType,MS_U32 u32Arg)7160*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSettings_Pro(MS_U32 u32Id, HVD_EX_SSettingsType eType, MS_U32 u32Arg)
7161*53ee8cc1Swenshuai.xi {
7162*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7163*53ee8cc1Swenshuai.xi     HVD_User_Cmd eCmd = E_HVD_CMD_INVALID_CMD;
7164*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7165*53ee8cc1Swenshuai.xi 
7166*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7167*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7168*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7169*53ee8cc1Swenshuai.xi 
7170*53ee8cc1Swenshuai.xi     switch (eType)
7171*53ee8cc1Swenshuai.xi     {
7172*53ee8cc1Swenshuai.xi         case E_HVD_EX_SSET_TIME_UNIT:
7173*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_TIME_UNIT_TYPE;
7174*53ee8cc1Swenshuai.xi             break;
7175*53ee8cc1Swenshuai.xi         case E_HVD_EX_SSET_PITCH:
7176*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_PITCH;
7177*53ee8cc1Swenshuai.xi             break;
7178*53ee8cc1Swenshuai.xi         case E_HVD_EX_SSET_SYNC_EACH_FRM:
7179*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_SYNC_EACH_FRM;
7180*53ee8cc1Swenshuai.xi             break;
7181*53ee8cc1Swenshuai.xi         case E_HVD_EX_SSET_MAX_DEC_TICK:
7182*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_MAX_DEC_TICK;
7183*53ee8cc1Swenshuai.xi             break;
7184*53ee8cc1Swenshuai.xi         case E_HVD_EX_SSET_AUTO_FREE_ES:
7185*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_AUTO_FREE_ES;
7186*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.bAutoFreeES = u32Arg;
7187*53ee8cc1Swenshuai.xi             break;
7188*53ee8cc1Swenshuai.xi         case E_HVD_EX_SSET_MIN_FRAME_GAP:
7189*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_MIN_FRAME_GAP;
7190*53ee8cc1Swenshuai.xi             break;
7191*53ee8cc1Swenshuai.xi         case E_HVD_EX_SSET_DISABLE_DEBLOCKING:
7192*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_DIS_DBF;
7193*53ee8cc1Swenshuai.xi             if (u32Arg > 2)
7194*53ee8cc1Swenshuai.xi             {
7195*53ee8cc1Swenshuai.xi                 u32Arg = 1;
7196*53ee8cc1Swenshuai.xi             }
7197*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.bDisDeblocking = u32Arg;
7198*53ee8cc1Swenshuai.xi             break;
7199*53ee8cc1Swenshuai.xi         case E_HVD_EX_SSET_DISABLE_QUARTER_PIXEL:
7200*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_DIS_QUART_PIXEL;
7201*53ee8cc1Swenshuai.xi             if (u32Arg > 2)
7202*53ee8cc1Swenshuai.xi             {
7203*53ee8cc1Swenshuai.xi                 u32Arg = 1;
7204*53ee8cc1Swenshuai.xi             }
7205*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.bDisQuarterPixel = u32Arg;
7206*53ee8cc1Swenshuai.xi             break;
7207*53ee8cc1Swenshuai.xi         case E_HVD_EX_SSET_MIU_BURST_CNT_LEVEL:
7208*53ee8cc1Swenshuai.xi             {
7209*53ee8cc1Swenshuai.xi                 pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.u32MiuBurstLevel = u32Arg;
7210*53ee8cc1Swenshuai.xi                 eCmd = E_HVD_CMD_MIU_BURST_CNT;
7211*53ee8cc1Swenshuai.xi 
7212*53ee8cc1Swenshuai.xi                 break;
7213*53ee8cc1Swenshuai.xi             }
7214*53ee8cc1Swenshuai.xi         default:
7215*53ee8cc1Swenshuai.xi             break;
7216*53ee8cc1Swenshuai.xi     }
7217*53ee8cc1Swenshuai.xi 
7218*53ee8cc1Swenshuai.xi     if (eCmd != E_HVD_CMD_INVALID_CMD)
7219*53ee8cc1Swenshuai.xi     {
7220*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, eCmd, u32Arg);
7221*53ee8cc1Swenshuai.xi     }
7222*53ee8cc1Swenshuai.xi     else
7223*53ee8cc1Swenshuai.xi     {
7224*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_RET_INVALID_PARAMETER;
7225*53ee8cc1Swenshuai.xi     }
7226*53ee8cc1Swenshuai.xi 
7227*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7228*53ee8cc1Swenshuai.xi }
7229*53ee8cc1Swenshuai.xi 
7230*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7231*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetCaps()
7232*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if HW support this format
7233*53ee8cc1Swenshuai.xi /// @param -u32Type \b IN : specify the format type
7234*53ee8cc1Swenshuai.xi /// @return - TRUE/ FALSE
7235*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): not supported by HW
7236*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): supported by HW
7237*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetCaps(HVD_EX_Codec u32Type)7238*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_GetCaps(HVD_EX_Codec u32Type)
7239*53ee8cc1Swenshuai.xi {
7240*53ee8cc1Swenshuai.xi     if(E_HVD_EX_HEVC == u32Type)
7241*53ee8cc1Swenshuai.xi #if SUPPORT_EVD
7242*53ee8cc1Swenshuai.xi         return TRUE;
7243*53ee8cc1Swenshuai.xi #else
7244*53ee8cc1Swenshuai.xi         return FALSE;
7245*53ee8cc1Swenshuai.xi #endif
7246*53ee8cc1Swenshuai.xi #if SUPPORT_G2VP9 && defined(VDEC3)
7247*53ee8cc1Swenshuai.xi     if(E_HVD_EX_VP9 == u32Type)
7248*53ee8cc1Swenshuai.xi         return TRUE;
7249*53ee8cc1Swenshuai.xi #endif
7250*53ee8cc1Swenshuai.xi 
7251*53ee8cc1Swenshuai.xi #if SUPPORT_MSVP9 && defined(VDEC3)
7252*53ee8cc1Swenshuai.xi     if(E_HVD_EX_VP9 == u32Type)
7253*53ee8cc1Swenshuai.xi         return TRUE;
7254*53ee8cc1Swenshuai.xi #endif
7255*53ee8cc1Swenshuai.xi 
7256*53ee8cc1Swenshuai.xi #if ( HVD_HW_VERSION == HVD_HW_HVD)
7257*53ee8cc1Swenshuai.xi     MS_U32 verID = HAL_HVD_EX_GetHWVersionID();
7258*53ee8cc1Swenshuai.xi     verID = verID >> 12;
7259*53ee8cc1Swenshuai.xi     switch (u32Type)
7260*53ee8cc1Swenshuai.xi     {
7261*53ee8cc1Swenshuai.xi         case E_HVD_EX_AVC:
7262*53ee8cc1Swenshuai.xi         case E_HVD_EX_AVS:
7263*53ee8cc1Swenshuai.xi         case E_HVD_EX_RM:
7264*53ee8cc1Swenshuai.xi         case E_HVD_EX_MVC:
7265*53ee8cc1Swenshuai.xi             if ((verID & BIT(u32Type)) == 0)
7266*53ee8cc1Swenshuai.xi             {
7267*53ee8cc1Swenshuai.xi                 return FALSE;
7268*53ee8cc1Swenshuai.xi             }
7269*53ee8cc1Swenshuai.xi             break;
7270*53ee8cc1Swenshuai.xi         case E_HVD_EX_VP8:
7271*53ee8cc1Swenshuai.xi             return TRUE;
7272*53ee8cc1Swenshuai.xi         default:
7273*53ee8cc1Swenshuai.xi             return FALSE;
7274*53ee8cc1Swenshuai.xi     }
7275*53ee8cc1Swenshuai.xi #else
7276*53ee8cc1Swenshuai.xi     if (u32Type != E_HVD_EX_AVC)
7277*53ee8cc1Swenshuai.xi     {
7278*53ee8cc1Swenshuai.xi         return FALSE;
7279*53ee8cc1Swenshuai.xi     }
7280*53ee8cc1Swenshuai.xi #endif
7281*53ee8cc1Swenshuai.xi     return TRUE;
7282*53ee8cc1Swenshuai.xi }
7283*53ee8cc1Swenshuai.xi 
MDrv_HVD_LinkWeakSymbolPatch(void)7284*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_LinkWeakSymbolPatch(void)
7285*53ee8cc1Swenshuai.xi {
7286*53ee8cc1Swenshuai.xi     return TRUE;
7287*53ee8cc1Swenshuai.xi }
7288*53ee8cc1Swenshuai.xi 
7289*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7290*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetAutoRmLstZeroByte
7291*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Turn on/off auto remove last zero byte
7292*53ee8cc1Swenshuai.xi /// @param -bOn \b IN : Turn on/off auto remove last zero byte
7293*53ee8cc1Swenshuai.xi /// @return -the result of turn on/off auto remove last zero byte
7294*53ee8cc1Swenshuai.xi ///\b NOTE: The default mode after initialization is On.
7295*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetAutoRmLstZeroByte(MS_U32 u32Id,MS_BOOL bOn)7296*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetAutoRmLstZeroByte(MS_U32 u32Id, MS_BOOL bOn)
7297*53ee8cc1Swenshuai.xi {
7298*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7299*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7300*53ee8cc1Swenshuai.xi 
7301*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7302*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7303*53ee8cc1Swenshuai.xi 
7304*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bAutoRmLastZeroByte = bOn;
7305*53ee8cc1Swenshuai.xi 
7306*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
7307*53ee8cc1Swenshuai.xi }
7308*53ee8cc1Swenshuai.xi 
7309*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7310*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsAlive
7311*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:Check Whether HVD is alive or not(check cnt)
7312*53ee8cc1Swenshuai.xi /// @return -the result of HVD alive status(E_HVD_EX_OK/E_HVD_EX_RET_NOT_RUNNING)
7313*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsAlive(MS_U32 u32Id)7314*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_IsAlive(MS_U32 u32Id)
7315*53ee8cc1Swenshuai.xi {
7316*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7317*53ee8cc1Swenshuai.xi 
7318*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7319*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,E_HVD_EX_FAIL);
7320*53ee8cc1Swenshuai.xi 
7321*53ee8cc1Swenshuai.xi     if (HAL_HVD_EX_IsAlive(u32Id))
7322*53ee8cc1Swenshuai.xi     {
7323*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].LivingStatus.u32DecCnt = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DECODE_CNT);
7324*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].LivingStatus.u32SkipCnt = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_SKIP_CNT);
7325*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].LivingStatus.u32IdleCnt = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT);
7326*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].LivingStatus.u32MainLoopCnt = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_MAIN_LOOP_CNT);
7327*53ee8cc1Swenshuai.xi 
7328*53ee8cc1Swenshuai.xi         return E_HVD_EX_OK;
7329*53ee8cc1Swenshuai.xi     }
7330*53ee8cc1Swenshuai.xi     else
7331*53ee8cc1Swenshuai.xi     {
7332*53ee8cc1Swenshuai.xi         return E_HVD_EX_RET_NOT_RUNNING;
7333*53ee8cc1Swenshuai.xi     }
7334*53ee8cc1Swenshuai.xi }
7335*53ee8cc1Swenshuai.xi 
7336*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7337*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetBalanceBW
7338*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: bandwidth adjustment
7339*53ee8cc1Swenshuai.xi /// @param -qp_cnt \b IN : QP threshold for overtime counter
7340*53ee8cc1Swenshuai.xi /// @param -db_cnt \b IN : Deblocking threshod for overtime counter
7341*53ee8cc1Swenshuai.xi /// @param -upper \b IN : upper bound for overtime counter
7342*53ee8cc1Swenshuai.xi /// @return -the result of command E_HVD_CMD_BALANCE_BW
7343*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetBalanceBW(MS_U32 u32Id,MS_U8 u8QPCnt,MS_U8 u8DBCnt,MS_U8 u8Upper)7344*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetBalanceBW(MS_U32 u32Id, MS_U8 u8QPCnt, MS_U8 u8DBCnt, MS_U8 u8Upper)
7345*53ee8cc1Swenshuai.xi {
7346*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_FAIL;
7347*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7348*53ee8cc1Swenshuai.xi 
7349*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7350*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7351*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7352*53ee8cc1Swenshuai.xi 
7353*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_BALANCE_BW, u8QPCnt | (u8DBCnt << 8) | (u8Upper << 16));
7354*53ee8cc1Swenshuai.xi 
7355*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7356*53ee8cc1Swenshuai.xi }
7357*53ee8cc1Swenshuai.xi 
7358*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7359*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetFdMaskDelayCnt()
7360*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set fd mask muting count
7361*53ee8cc1Swenshuai.xi /// @param -u8DelayCnt \b IN : 0~0xFF, Fdmask delay count, arg >= 0xFF -> use default
7362*53ee8cc1Swenshuai.xi /// @return -The result of command setting fd_mask muting count
7363*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetFdMaskDelayCnt(MS_U32 u32Id,MS_U8 u8DelayCnt)7364*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetFdMaskDelayCnt(MS_U32 u32Id, MS_U8 u8DelayCnt)
7365*53ee8cc1Swenshuai.xi {
7366*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7367*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7368*53ee8cc1Swenshuai.xi 
7369*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7370*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7371*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7372*53ee8cc1Swenshuai.xi 
7373*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FDMASK_DELAY_CNT, u8DelayCnt);
7374*53ee8cc1Swenshuai.xi 
7375*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7376*53ee8cc1Swenshuai.xi }
7377*53ee8cc1Swenshuai.xi 
7378*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7379*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetOutputFRCMode()
7380*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set output frame rate convert mode.
7381*53ee8cc1Swenshuai.xi /// @param -u8FrameRate \b IN : output vsync count.
7382*53ee8cc1Swenshuai.xi /// @param -u8Interlace \b IN : output scan type: 0:progress, 1:interlace field, 2: interlace frame.
7383*53ee8cc1Swenshuai.xi /// @return -The result of command setting output FRC mode
7384*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetOutputFRCMode(MS_U32 u32Id,MS_U8 u8FrameRate,MS_U8 u8Interlace)7385*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetOutputFRCMode(MS_U32 u32Id, MS_U8 u8FrameRate, MS_U8 u8Interlace)
7386*53ee8cc1Swenshuai.xi {
7387*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7388*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7389*53ee8cc1Swenshuai.xi 
7390*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7391*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7392*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7393*53ee8cc1Swenshuai.xi 
7394*53ee8cc1Swenshuai.xi     if ((u8Interlace != 0) && (u8Interlace != 1) && (u8Interlace != 2))
7395*53ee8cc1Swenshuai.xi     {
7396*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
7397*53ee8cc1Swenshuai.xi     }
7398*53ee8cc1Swenshuai.xi 
7399*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FRC_OUTPUT_FRAMERATE, u8FrameRate);
7400*53ee8cc1Swenshuai.xi 
7401*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_EX_OK)
7402*53ee8cc1Swenshuai.xi     {
7403*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
7404*53ee8cc1Swenshuai.xi     }
7405*53ee8cc1Swenshuai.xi 
7406*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FRC_OUTPUT_INTERLACE, u8Interlace);
7407*53ee8cc1Swenshuai.xi 
7408*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7409*53ee8cc1Swenshuai.xi }
7410*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_DispFrame(MS_U32 u32Id,MS_U32 u32FrmIdx)7411*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_DispFrame(MS_U32 u32Id, MS_U32 u32FrmIdx)
7412*53ee8cc1Swenshuai.xi {
7413*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7414*53ee8cc1Swenshuai.xi 
7415*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_DISPQ_STATUS_DISP, u32FrmIdx);
7416*53ee8cc1Swenshuai.xi 
7417*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
7418*53ee8cc1Swenshuai.xi }
7419*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_FreeFrame(MS_U32 u32Id,MS_U32 u32FrmIdx)7420*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_FreeFrame(MS_U32 u32Id, MS_U32 u32FrmIdx)
7421*53ee8cc1Swenshuai.xi {
7422*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7423*53ee8cc1Swenshuai.xi 
7424*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_DISPQ_STATUS_FREE, u32FrmIdx);
7425*53ee8cc1Swenshuai.xi 
7426*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
7427*53ee8cc1Swenshuai.xi }
7428*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_EnableDispQue(MS_U32 u32Id,MS_BOOL bEnable)7429*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_EnableDispQue(MS_U32 u32Id, MS_BOOL bEnable)
7430*53ee8cc1Swenshuai.xi {
7431*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7432*53ee8cc1Swenshuai.xi 
7433*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ENABLE_DISP_QUEUE, bEnable);
7434*53ee8cc1Swenshuai.xi 
7435*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
7436*53ee8cc1Swenshuai.xi }
7437*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_EnableVSizeAlign(MS_U32 u32Id,MS_BOOL bEnable)7438*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_EnableVSizeAlign(MS_U32 u32Id, MS_BOOL bEnable)
7439*53ee8cc1Swenshuai.xi {
7440*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7441*53ee8cc1Swenshuai.xi 
7442*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FORCE_ALIGN_VSIZE, bEnable);
7443*53ee8cc1Swenshuai.xi 
7444*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
7445*53ee8cc1Swenshuai.xi }
7446*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_ShowDecodeOrder(MS_U32 u32Id,MS_BOOL bEnable)7447*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_ShowDecodeOrder(MS_U32 u32Id, MS_BOOL bEnable)
7448*53ee8cc1Swenshuai.xi {
7449*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7450*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7451*53ee8cc1Swenshuai.xi 
7452*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7453*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7454*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7455*53ee8cc1Swenshuai.xi 
7456*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SHOW_DECODE_ORDER, bEnable);
7457*53ee8cc1Swenshuai.xi 
7458*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7459*53ee8cc1Swenshuai.xi }
7460*53ee8cc1Swenshuai.xi 
7461*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7462*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Disp_Ignore_Crop()
7463*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: ingore corp info
7464*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
7465*53ee8cc1Swenshuai.xi /// @return -The result of command setting fd_mask muting count
7466*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Disp_Ignore_Crop(MS_U32 u32Id,MS_BOOL bEnable)7467*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Disp_Ignore_Crop(MS_U32 u32Id, MS_BOOL bEnable)
7468*53ee8cc1Swenshuai.xi {
7469*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7470*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7471*53ee8cc1Swenshuai.xi 
7472*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7473*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7474*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7475*53ee8cc1Swenshuai.xi 
7476*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_IGNORE_CROP, bEnable);
7477*53ee8cc1Swenshuai.xi 
7478*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7479*53ee8cc1Swenshuai.xi }
7480*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_SuspendDynamicScale(MS_U32 u32Id,MS_BOOL bEnable)7481*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SuspendDynamicScale(MS_U32 u32Id, MS_BOOL bEnable)
7482*53ee8cc1Swenshuai.xi {
7483*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7484*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7485*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7486*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7487*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7488*53ee8cc1Swenshuai.xi 
7489*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SUSPEND_DYNAMIC_SCALE, bEnable);
7490*53ee8cc1Swenshuai.xi 
7491*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7492*53ee8cc1Swenshuai.xi }
7493*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_RmEnablePtsTbl(MS_U32 u32Id,MS_BOOL bEnable)7494*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_RmEnablePtsTbl(MS_U32 u32Id, MS_BOOL bEnable)
7495*53ee8cc1Swenshuai.xi {
7496*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7497*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7498*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7499*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7500*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7501*53ee8cc1Swenshuai.xi 
7502*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_RM_ENABLE_PTS_TBL, bEnable);
7503*53ee8cc1Swenshuai.xi 
7504*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7505*53ee8cc1Swenshuai.xi }
7506*53ee8cc1Swenshuai.xi 
7507*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_AutoExhaustESMode(MS_U32 u32Id,MS_U32 u32ESbound)7508*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_AutoExhaustESMode(MS_U32 u32Id, MS_U32 u32ESbound)
7509*53ee8cc1Swenshuai.xi {
7510*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7511*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7512*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7513*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7514*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7515*53ee8cc1Swenshuai.xi 
7516*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AUTO_EXHAUST_ES_MODE, u32ESbound);
7517*53ee8cc1Swenshuai.xi 
7518*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7519*53ee8cc1Swenshuai.xi }
7520*53ee8cc1Swenshuai.xi 
7521*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_SetMinTspSize(MS_U32 u32Id,MS_U32 u32Size)7522*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetMinTspSize(MS_U32 u32Id, MS_U32 u32Size)
7523*53ee8cc1Swenshuai.xi {
7524*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7525*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7526*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7527*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7528*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7529*53ee8cc1Swenshuai.xi 
7530*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SET_MIN_TSP_DATA_SIZE, u32Size);
7531*53ee8cc1Swenshuai.xi 
7532*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7533*53ee8cc1Swenshuai.xi }
7534*53ee8cc1Swenshuai.xi 
7535*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7536*53ee8cc1Swenshuai.xi /// Set HVD FRC drop type.
7537*53ee8cc1Swenshuai.xi /// @param u8DropType \b IN : drop type. 0:drop frame, 1:drop field. default:0
7538*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
7539*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_SetFRCDropType(MS_U32 u32Id,MS_U8 u8DropType)7540*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetFRCDropType(MS_U32 u32Id, MS_U8 u8DropType)
7541*53ee8cc1Swenshuai.xi {
7542*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_FAIL;
7543*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7544*53ee8cc1Swenshuai.xi 
7545*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7546*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7547*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7548*53ee8cc1Swenshuai.xi 
7549*53ee8cc1Swenshuai.xi     if (u8DropType != 0 && u8DropType != 1)
7550*53ee8cc1Swenshuai.xi     {
7551*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_RET_INVALID_PARAMETER;
7552*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
7553*53ee8cc1Swenshuai.xi     }
7554*53ee8cc1Swenshuai.xi 
7555*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FRC_DROP_MODE, u8DropType);
7556*53ee8cc1Swenshuai.xi 
7557*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7558*53ee8cc1Swenshuai.xi }
7559*53ee8cc1Swenshuai.xi 
7560*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7561*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetDrvFwVer()
7562*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get driver's FW version
7563*53ee8cc1Swenshuai.xi /// @return - Driver's FW version
7564*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetDrvFwVer(void)7565*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetDrvFwVer(void)
7566*53ee8cc1Swenshuai.xi {
7567*53ee8cc1Swenshuai.xi     return HVD_FW_VERSION;
7568*53ee8cc1Swenshuai.xi }
7569*53ee8cc1Swenshuai.xi 
7570*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7571*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetFwVer()
7572*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get driver's FW version
7573*53ee8cc1Swenshuai.xi /// @return - FW version obtained by querying FW
7574*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetFwVer(MS_U32 u32Id)7575*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetFwVer(MS_U32 u32Id)
7576*53ee8cc1Swenshuai.xi {
7577*53ee8cc1Swenshuai.xi     return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_VERSION_ID);
7578*53ee8cc1Swenshuai.xi }
7579*53ee8cc1Swenshuai.xi 
MDrv_HVD_SetSingleDecodeMode(MS_BOOL bEnable)7580*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_SetSingleDecodeMode(MS_BOOL bEnable)
7581*53ee8cc1Swenshuai.xi {
7582*53ee8cc1Swenshuai.xi     return HAL_VPU_EX_SetSingleDecodeMode(bEnable);
7583*53ee8cc1Swenshuai.xi }
7584*53ee8cc1Swenshuai.xi 
MDrv_HVD_SetSTCMode(MS_U32 u32Id,MS_U32 STCindex)7585*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_SetSTCMode(MS_U32 u32Id, MS_U32 STCindex)
7586*53ee8cc1Swenshuai.xi {
7587*53ee8cc1Swenshuai.xi     return HAL_VPU_EX_SetSTCMode(u32Id,STCindex);
7588*53ee8cc1Swenshuai.xi }
7589*53ee8cc1Swenshuai.xi 
MDrv_HVD_SetDecodeMode(MS_U32 u32Id,HVD_EX_DecModCfg * pstCfg)7590*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_SetDecodeMode(MS_U32 u32Id, HVD_EX_DecModCfg *pstCfg)
7591*53ee8cc1Swenshuai.xi {
7592*53ee8cc1Swenshuai.xi     MS_U8 i;
7593*53ee8cc1Swenshuai.xi     VPU_EX_DecModCfg stVpuDecModCfg;
7594*53ee8cc1Swenshuai.xi 
7595*53ee8cc1Swenshuai.xi     stVpuDecModCfg.u8DecMod   = pstCfg->u8DecMod;
7596*53ee8cc1Swenshuai.xi     stVpuDecModCfg.u8CodecCnt = pstCfg->u8CodecCnt;
7597*53ee8cc1Swenshuai.xi     for (i=0; ((i<pstCfg->u8CodecCnt)&&(i<HVD_MAX_DEC_NUM)); i++)
7598*53ee8cc1Swenshuai.xi     {
7599*53ee8cc1Swenshuai.xi         stVpuDecModCfg.u8CodecType[i] = pstCfg->u8CodecType[i];
7600*53ee8cc1Swenshuai.xi     }
7601*53ee8cc1Swenshuai.xi     stVpuDecModCfg.u8ArgSize  = pstCfg->u8ArgSize;
7602*53ee8cc1Swenshuai.xi     stVpuDecModCfg.u32Arg     = pstCfg->u32Arg;
7603*53ee8cc1Swenshuai.xi 
7604*53ee8cc1Swenshuai.xi     return HAL_VPU_EX_SetDecodeMode(u32Id, &stVpuDecModCfg);
7605*53ee8cc1Swenshuai.xi }
7606*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_SetBurstMode(MS_U32 u32Id,MS_BOOL bBurst)7607*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_SetBurstMode(MS_U32 u32Id, MS_BOOL bBurst)
7608*53ee8cc1Swenshuai.xi {
7609*53ee8cc1Swenshuai.xi     HVD_Return eCtrlRet = E_HVD_RETURN_FAIL;
7610*53ee8cc1Swenshuai.xi 
7611*53ee8cc1Swenshuai.xi     eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_BURST_MODE, bBurst);
7612*53ee8cc1Swenshuai.xi     if (E_HVD_RETURN_SUCCESS != eCtrlRet)
7613*53ee8cc1Swenshuai.xi     {
7614*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("E_DUAL_BURST_MODE NG eCtrlRet=%x\n", eCtrlRet);
7615*53ee8cc1Swenshuai.xi     }
7616*53ee8cc1Swenshuai.xi     else
7617*53ee8cc1Swenshuai.xi     {
7618*53ee8cc1Swenshuai.xi         HVD_EX_MSG_DBG("MJPEG!!! Set burst mode =%d success!!!!\n", bBurst);
7619*53ee8cc1Swenshuai.xi     }
7620*53ee8cc1Swenshuai.xi }
7621*53ee8cc1Swenshuai.xi 
7622*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7623*53ee8cc1Swenshuai.xi /// Force into interlace mode
7624*53ee8cc1Swenshuai.xi /// @param u8Mode \b IN : 0: Disable, 1: Enable
7625*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
7626*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_ForceInterlaceMode(MS_U32 u32Id,MS_U8 u8Mode)7627*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_ForceInterlaceMode(MS_U32 u32Id, MS_U8 u8Mode)
7628*53ee8cc1Swenshuai.xi {
7629*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_FAIL;
7630*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7631*53ee8cc1Swenshuai.xi 
7632*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7633*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7634*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7635*53ee8cc1Swenshuai.xi 
7636*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FORCE_INTERLACE, u8Mode);
7637*53ee8cc1Swenshuai.xi 
7638*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7639*53ee8cc1Swenshuai.xi }
7640*53ee8cc1Swenshuai.xi 
7641*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7642*53ee8cc1Swenshuai.xi /// Push Disp Q with Ref num
7643*53ee8cc1Swenshuai.xi /// @param u8Mode \b IN : 0: Disable, 1: Enable
7644*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
7645*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_PushDispQWithRefNum(MS_U32 u32Id,MS_U8 u8Mode)7646*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_PushDispQWithRefNum(MS_U32 u32Id, MS_U8 u8Mode)
7647*53ee8cc1Swenshuai.xi {
7648*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7649*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7650*53ee8cc1Swenshuai.xi 
7651*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7652*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7653*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7654*53ee8cc1Swenshuai.xi 
7655*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PUSH_DISPQ_WITH_REF_NUM, u8Mode);
7656*53ee8cc1Swenshuai.xi 
7657*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7658*53ee8cc1Swenshuai.xi }
7659*53ee8cc1Swenshuai.xi 
7660*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7661*53ee8cc1Swenshuai.xi /// Ignore HW error - PIC_OVERRUN
7662*53ee8cc1Swenshuai.xi /// @param bEnable \b IN : 0: Disable, 1: Enable
7663*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
7664*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_IgnorePicOverrun(MS_U32 u32Id,MS_BOOL bEnable)7665*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_IgnorePicOverrun(MS_U32 u32Id, MS_BOOL bEnable)
7666*53ee8cc1Swenshuai.xi {
7667*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7668*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7669*53ee8cc1Swenshuai.xi 
7670*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7671*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7672*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7673*53ee8cc1Swenshuai.xi 
7674*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_IGNORE_PIC_OVERRUN, bEnable);
7675*53ee8cc1Swenshuai.xi 
7676*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7677*53ee8cc1Swenshuai.xi }
7678*53ee8cc1Swenshuai.xi 
7679*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7680*53ee8cc1Swenshuai.xi /// Control speed in displaying time only.
7681*53ee8cc1Swenshuai.xi /// @param bEnable \b IN : 0: Original, control in decoding and displaying time, 1: Enable,control speed in displaying time only
7682*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
7683*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_CtlSpeedInDispOnly(MS_U32 u32Id,MS_BOOL bEnable)7684*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CtlSpeedInDispOnly(MS_U32 u32Id, MS_BOOL bEnable)
7685*53ee8cc1Swenshuai.xi {
7686*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7687*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7688*53ee8cc1Swenshuai.xi 
7689*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7690*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7691*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7692*53ee8cc1Swenshuai.xi 
7693*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_CTRL_SPEED_IN_DISP_ONLY, bEnable);
7694*53ee8cc1Swenshuai.xi 
7695*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7696*53ee8cc1Swenshuai.xi }
7697*53ee8cc1Swenshuai.xi 
7698*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7699*53ee8cc1Swenshuai.xi /// AVC support reference number over max DPB size when frame buffer is enough.
7700*53ee8cc1Swenshuai.xi /// @param bEnable \b IN : 0: Disable, 1: Enable
7701*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
7702*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_AVCSupportRefNumOverMaxDBPSize(MS_U32 u32Id,MS_BOOL bEnable)7703*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_AVCSupportRefNumOverMaxDBPSize(MS_U32 u32Id, MS_BOOL bEnable)
7704*53ee8cc1Swenshuai.xi {
7705*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7706*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7707*53ee8cc1Swenshuai.xi 
7708*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7709*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7710*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7711*53ee8cc1Swenshuai.xi 
7712*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AVC_SUPPORT_REF_NUM_OVER_MAX_DPB_SIZE, bEnable);
7713*53ee8cc1Swenshuai.xi 
7714*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7715*53ee8cc1Swenshuai.xi }
7716*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_ReturnInvalidAFD(MS_U32 u32Id,MS_BOOL bEnable)7717*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_ReturnInvalidAFD(MS_U32 u32Id, MS_BOOL bEnable)
7718*53ee8cc1Swenshuai.xi {
7719*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7720*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7721*53ee8cc1Swenshuai.xi 
7722*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7723*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7724*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7725*53ee8cc1Swenshuai.xi 
7726*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_RETURN_INVALID_AFD, bEnable);
7727*53ee8cc1Swenshuai.xi 
7728*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7729*53ee8cc1Swenshuai.xi }
7730*53ee8cc1Swenshuai.xi 
7731*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_AVCForceBrokenByUs(MS_U32 u32Id,MS_BOOL bEnable)7732*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_AVCForceBrokenByUs(MS_U32 u32Id, MS_BOOL bEnable)
7733*53ee8cc1Swenshuai.xi {
7734*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7735*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7736*53ee8cc1Swenshuai.xi 
7737*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7738*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7739*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7740*53ee8cc1Swenshuai.xi 
7741*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AVC_FORCE_BROKEN_BY_US, bEnable);
7742*53ee8cc1Swenshuai.xi 
7743*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7744*53ee8cc1Swenshuai.xi }
7745*53ee8cc1Swenshuai.xi 
7746*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7747*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Support_AVC2MVC()
7748*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set Support AVC to MVC
7749*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
7750*53ee8cc1Swenshuai.xi /// @return -The result of command setting fd_mask muting count
7751*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Support_AVC2MVC(MS_U32 u32Id,MS_BOOL bEnable)7752*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Support_AVC2MVC(MS_U32 u32Id, MS_BOOL bEnable)
7753*53ee8cc1Swenshuai.xi {
7754*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7755*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7756*53ee8cc1Swenshuai.xi 
7757*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7758*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7759*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7760*53ee8cc1Swenshuai.xi 
7761*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SUPPORT_AVC_TO_MVC, bEnable);
7762*53ee8cc1Swenshuai.xi 
7763*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7764*53ee8cc1Swenshuai.xi }
7765*53ee8cc1Swenshuai.xi 
7766*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7767*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_3DLR_View_Exchange()
7768*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: view exchange
7769*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
7770*53ee8cc1Swenshuai.xi /// @return -The result of command setting fd_mask muting count
7771*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_3DLR_View_Exchange(MS_U32 u32Id,MS_BOOL bEnable)7772*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_3DLR_View_Exchange(MS_U32 u32Id, MS_BOOL bEnable)
7773*53ee8cc1Swenshuai.xi {
7774*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7775*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7776*53ee8cc1Swenshuai.xi 
7777*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7778*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7779*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7780*53ee8cc1Swenshuai.xi 
7781*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_3DLR_VIEW_EXCHANGE, bEnable);
7782*53ee8cc1Swenshuai.xi 
7783*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7784*53ee8cc1Swenshuai.xi }
7785*53ee8cc1Swenshuai.xi 
7786*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7787*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetFrmRateIsSupported()
7788*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get if the framerate is supported
7789*53ee8cc1Swenshuai.xi /// @return -The result of supported or not.
7790*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetFrmRateIsSupported(MS_U32 u32Id)7791*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_GetFrmRateIsSupported(MS_U32 u32Id)
7792*53ee8cc1Swenshuai.xi {
7793*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7794*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
7795*53ee8cc1Swenshuai.xi     MS_BOOL bRet = pCtrl->bFrmRateSupported;
7796*53ee8cc1Swenshuai.xi 
7797*53ee8cc1Swenshuai.xi     return bRet;
7798*53ee8cc1Swenshuai.xi }
7799*53ee8cc1Swenshuai.xi 
7800*53ee8cc1Swenshuai.xi 
7801*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7802*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Enable_New_Slow_Motion()
7803*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: view exchange
7804*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
7805*53ee8cc1Swenshuai.xi /// @return -The result of command setting fd_mask muting count
7806*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Enable_New_Slow_Motion(MS_U32 u32Id,MS_BOOL bEnable)7807*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Enable_New_Slow_Motion(MS_U32 u32Id, MS_BOOL bEnable)
7808*53ee8cc1Swenshuai.xi {
7809*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7810*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7811*53ee8cc1Swenshuai.xi 
7812*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7813*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7814*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7815*53ee8cc1Swenshuai.xi 
7816*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ENABLE_NEW_SLOW_MOTION, bEnable);
7817*53ee8cc1Swenshuai.xi 
7818*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7819*53ee8cc1Swenshuai.xi }
7820*53ee8cc1Swenshuai.xi 
7821*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7822*53ee8cc1Swenshuai.xi /// Get SEI USER DATA Info
7823*53ee8cc1Swenshuai.xi /// @param pUsrInfo \b OUT : Get CC USER Data info
7824*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
7825*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_GetUserDataInfo(MS_U32 u32Id,HVD_EX_UserData_Info * pUsrInfo)7826*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetUserDataInfo(MS_U32 u32Id,HVD_EX_UserData_Info* pUsrInfo)
7827*53ee8cc1Swenshuai.xi {
7828*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_FAIL;
7829*53ee8cc1Swenshuai.xi     MS_U32 u32UserDataIdxSize = 0;
7830*53ee8cc1Swenshuai.xi     MS_U32 u32UsrDataIdxWptr = 0xFFFFFFFF;
7831*53ee8cc1Swenshuai.xi     MS_U32 u32UserDataSize = 0;
7832*53ee8cc1Swenshuai.xi     MS_VIRT u32UserDataAddr = 0;
7833*53ee8cc1Swenshuai.xi     MS_VIRT u32CodeVAddr = 0;
7834*53ee8cc1Swenshuai.xi     DTV_BUF_type* pHVD_User_Data = NULL;
7835*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7836*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7837*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7838*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7839*53ee8cc1Swenshuai.xi 
7840*53ee8cc1Swenshuai.xi     u32UserDataIdxSize = (MS_U32)HAL_HVD_EX_GetData(u32Id,E_HVD_GDATA_USERDATA_IDX_TBL_SIZE);
7841*53ee8cc1Swenshuai.xi     u32UsrDataIdxWptr = MDrv_HVD_EX_GetUserData_Wptr(u32Id);
7842*53ee8cc1Swenshuai.xi 
7843*53ee8cc1Swenshuai.xi     if (u32UsrDataIdxWptr != 0xFFFFFFFF)
7844*53ee8cc1Swenshuai.xi     {
7845*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataWr = u32UsrDataIdxWptr;
7846*53ee8cc1Swenshuai.xi     }
7847*53ee8cc1Swenshuai.xi 
7848*53ee8cc1Swenshuai.xi     if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataRd == pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataWr)
7849*53ee8cc1Swenshuai.xi     {   // User Data Buffer Empty
7850*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
7851*53ee8cc1Swenshuai.xi     }
7852*53ee8cc1Swenshuai.xi 
7853*53ee8cc1Swenshuai.xi     u32CodeVAddr = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufVAddr;
7854*53ee8cc1Swenshuai.xi     if(u32CodeVAddr == 0x0)
7855*53ee8cc1Swenshuai.xi     {
7856*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_FAIL;
7857*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
7858*53ee8cc1Swenshuai.xi     }
7859*53ee8cc1Swenshuai.xi 
7860*53ee8cc1Swenshuai.xi     u32UserDataAddr = MDrv_HVD_EX_GetUserData_Packet(u32Id,pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataRd, (MS_U32*)&u32UserDataSize );
7861*53ee8cc1Swenshuai.xi     if(u32UserDataAddr == 0x0)
7862*53ee8cc1Swenshuai.xi     {
7863*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_FAIL;
7864*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
7865*53ee8cc1Swenshuai.xi     }
7866*53ee8cc1Swenshuai.xi     u32UserDataAddr += u32CodeVAddr; // change to virtual address
7867*53ee8cc1Swenshuai.xi 
7868*53ee8cc1Swenshuai.xi     pHVD_User_Data = (DTV_BUF_type*)u32UserDataAddr;
7869*53ee8cc1Swenshuai.xi 
7870*53ee8cc1Swenshuai.xi     pUsrInfo->u16TmpRef = pHVD_User_Data->u16TempRefCnt;
7871*53ee8cc1Swenshuai.xi     pUsrInfo->u8PicStruct = pHVD_User_Data->pic_struct;
7872*53ee8cc1Swenshuai.xi     pUsrInfo->u8PicType = pHVD_User_Data->type;
7873*53ee8cc1Swenshuai.xi     pUsrInfo->u32Pts = pHVD_User_Data->pts;
7874*53ee8cc1Swenshuai.xi     pUsrInfo->u8ByteCnt = pHVD_User_Data->len;
7875*53ee8cc1Swenshuai.xi     pUsrInfo->u32DataBuf = (MS_VIRT)pHVD_User_Data->buf;
7876*53ee8cc1Swenshuai.xi 
7877*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataRd++;
7878*53ee8cc1Swenshuai.xi 
7879*53ee8cc1Swenshuai.xi     if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataRd >= u32UserDataIdxSize)
7880*53ee8cc1Swenshuai.xi     {
7881*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataRd = 0;
7882*53ee8cc1Swenshuai.xi     }
7883*53ee8cc1Swenshuai.xi 
7884*53ee8cc1Swenshuai.xi     eRet = E_HVD_EX_OK;
7885*53ee8cc1Swenshuai.xi 
7886*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7887*53ee8cc1Swenshuai.xi 
7888*53ee8cc1Swenshuai.xi }
7889*53ee8cc1Swenshuai.xi 
7890*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7891*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetUsrDataIsAvailable()
7892*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Is there new user data info.
7893*53ee8cc1Swenshuai.xi /// @return - TRUE/ FALSE
7894*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): no new user data info
7895*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): has new user data info
7896*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_GetUsrDataIsAvailable(MS_U32 u32Id)7897*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_GetUsrDataIsAvailable(MS_U32 u32Id)
7898*53ee8cc1Swenshuai.xi {
7899*53ee8cc1Swenshuai.xi 
7900*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7901*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
7902*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7903*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7904*53ee8cc1Swenshuai.xi     MS_U32 u32UsrDataIdxWptr = 0xFFFFFFFF;
7905*53ee8cc1Swenshuai.xi     u32UsrDataIdxWptr = MDrv_HVD_EX_GetUserData_Wptr(u32Id);
7906*53ee8cc1Swenshuai.xi 
7907*53ee8cc1Swenshuai.xi     if (u32UsrDataIdxWptr != 0xFFFFFFFF)
7908*53ee8cc1Swenshuai.xi     {
7909*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataWr = u32UsrDataIdxWptr;
7910*53ee8cc1Swenshuai.xi     }
7911*53ee8cc1Swenshuai.xi 
7912*53ee8cc1Swenshuai.xi     bRet = (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataWr == pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataRd)?FALSE:TRUE;
7913*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, bRet);
7914*53ee8cc1Swenshuai.xi }
7915*53ee8cc1Swenshuai.xi 
7916*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
7917*53ee8cc1Swenshuai.xi /// Set HVD DTV User Data Packet Mode
7918*53ee8cc1Swenshuai.xi /// @param u8UserDataMode \b IN : User Data Packet Mode. 0: DVB normal, 1: ATSC DirectTV. default:0
7919*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
7920*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_SetDTVUserDataMode(MS_U32 u32Id,MS_U8 u8UserDataMode)7921*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDTVUserDataMode(MS_U32 u32Id,MS_U8 u8UserDataMode)
7922*53ee8cc1Swenshuai.xi {
7923*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_FAIL;
7924*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7925*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7926*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7927*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7928*53ee8cc1Swenshuai.xi 
7929*53ee8cc1Swenshuai.xi 
7930*53ee8cc1Swenshuai.xi     if (u8UserDataMode == 0)
7931*53ee8cc1Swenshuai.xi     {
7932*53ee8cc1Swenshuai.xi         // Noraml DVB USER DATA
7933*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id,E_HVD_CMD_SET_USERDATA_MODE, 0);
7934*53ee8cc1Swenshuai.xi     }
7935*53ee8cc1Swenshuai.xi     else if (u8UserDataMode == 1)
7936*53ee8cc1Swenshuai.xi     {
7937*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id,E_HVD_CMD_SET_USERDATA_MODE, 1);
7938*53ee8cc1Swenshuai.xi     }
7939*53ee8cc1Swenshuai.xi     else if (u8UserDataMode == 2)
7940*53ee8cc1Swenshuai.xi     {
7941*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id,E_HVD_CMD_SET_USERDATA_MODE, 2);
7942*53ee8cc1Swenshuai.xi     }
7943*53ee8cc1Swenshuai.xi     else if (u8UserDataMode == 3)
7944*53ee8cc1Swenshuai.xi     {
7945*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id,E_HVD_CMD_SET_USERDATA_MODE, 3);
7946*53ee8cc1Swenshuai.xi     }
7947*53ee8cc1Swenshuai.xi     else if (u8UserDataMode == 7)
7948*53ee8cc1Swenshuai.xi     {
7949*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id,E_HVD_CMD_SET_USERDATA_MODE, 7);
7950*53ee8cc1Swenshuai.xi     }
7951*53ee8cc1Swenshuai.xi     else
7952*53ee8cc1Swenshuai.xi     {
7953*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id,E_HVD_CMD_SET_USERDATA_MODE, u8UserDataMode);
7954*53ee8cc1Swenshuai.xi         HVD_PRINT("Debug Mode for set user data mode \n");
7955*53ee8cc1Swenshuai.xi     }
7956*53ee8cc1Swenshuai.xi 
7957*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
7958*53ee8cc1Swenshuai.xi }
7959*53ee8cc1Swenshuai.xi 
7960*53ee8cc1Swenshuai.xi 
7961*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7962*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetFrmPackingArrSEI()
7963*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get if the Frame packing arrangement SEI data
7964*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : The frame packing SEI struct
7965*53ee8cc1Swenshuai.xi /// @return -The result of got the info. or not.
7966*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetFrmPackingArrSEI(MS_U32 u32Id,HVD_EX_FrmPackingSEI * pFrmPacking)7967*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetFrmPackingArrSEI(MS_U32 u32Id, HVD_EX_FrmPackingSEI *pFrmPacking)
7968*53ee8cc1Swenshuai.xi {
7969*53ee8cc1Swenshuai.xi 
7970*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7971*53ee8cc1Swenshuai.xi     MS_VIRT u32FPAFrameAddr = 0 ;
7972*53ee8cc1Swenshuai.xi     MS_U32 u32CodeVaddr = 0 ;
7973*53ee8cc1Swenshuai.xi     HVD_Frame_packing_SEI *pFrmPackingSrc = NULL;
7974*53ee8cc1Swenshuai.xi     MS_BOOL bIn = FALSE;
7975*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7976*53ee8cc1Swenshuai.xi 
7977*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
7978*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
7979*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
7980*53ee8cc1Swenshuai.xi 
7981*53ee8cc1Swenshuai.xi     u32CodeVaddr = MS_PA2KSEG1((MS_U32)(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr));
7982*53ee8cc1Swenshuai.xi     if(u32CodeVaddr == 0x0)
7983*53ee8cc1Swenshuai.xi     {
7984*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_FAIL;
7985*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
7986*53ee8cc1Swenshuai.xi     }
7987*53ee8cc1Swenshuai.xi 
7988*53ee8cc1Swenshuai.xi     u32FPAFrameAddr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FRM_PACKING_SEI_DATA);
7989*53ee8cc1Swenshuai.xi 
7990*53ee8cc1Swenshuai.xi     //u32FPAFrameAddr = HAL_HVD_EX_GetData(u8DrvId,E_HVD_GDATA_FRM_PACKING_SEI_DATA);
7991*53ee8cc1Swenshuai.xi     if(u32FPAFrameAddr == 0x0)
7992*53ee8cc1Swenshuai.xi     {
7993*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_FAIL;
7994*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
7995*53ee8cc1Swenshuai.xi     }
7996*53ee8cc1Swenshuai.xi 
7997*53ee8cc1Swenshuai.xi     u32FPAFrameAddr = MS_PA2KSEG1((MS_U32)(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr+u32FPAFrameAddr)); // change to virtual address
7998*53ee8cc1Swenshuai.xi 
7999*53ee8cc1Swenshuai.xi     pFrmPackingSrc = (HVD_Frame_packing_SEI *)u32FPAFrameAddr;
8000*53ee8cc1Swenshuai.xi 
8001*53ee8cc1Swenshuai.xi     if(pFrmPacking != NULL)
8002*53ee8cc1Swenshuai.xi     {
8003*53ee8cc1Swenshuai.xi         if(pFrmPackingSrc->bvaild == TRUE)
8004*53ee8cc1Swenshuai.xi         {
8005*53ee8cc1Swenshuai.xi             bIn = TRUE;
8006*53ee8cc1Swenshuai.xi             pFrmPacking->bvaild                         = pFrmPackingSrc->bvaild;
8007*53ee8cc1Swenshuai.xi             pFrmPacking->bUsed                          = pFrmPackingSrc->bUsed;
8008*53ee8cc1Swenshuai.xi             pFrmPacking->u8Frm_packing_arr_cnl_flag     = pFrmPackingSrc->u8Frm_packing_arr_cnl_flag;
8009*53ee8cc1Swenshuai.xi             pFrmPacking->u8Frm_packing_arr_type         = pFrmPackingSrc->u8Frm_packing_arr_type;
8010*53ee8cc1Swenshuai.xi             pFrmPacking->u8content_interpretation_type  = pFrmPackingSrc->u8content_interpretation_type;
8011*53ee8cc1Swenshuai.xi             pFrmPacking->u1Quincunx_sampling_flag       = pFrmPackingSrc->u1Quincunx_sampling_flag;
8012*53ee8cc1Swenshuai.xi             pFrmPacking->u1Spatial_flipping_flag        = pFrmPackingSrc->u1Spatial_flipping_flag;
8013*53ee8cc1Swenshuai.xi             pFrmPacking->u1Frame0_flipping_flag         = pFrmPackingSrc->u1Frame0_flipping_flag;
8014*53ee8cc1Swenshuai.xi             pFrmPacking->u1Field_views_flag             = pFrmPackingSrc->u1Field_views_flag;
8015*53ee8cc1Swenshuai.xi             pFrmPacking->u1Current_frame_is_frame0_flag = pFrmPackingSrc->u1Current_frame_is_frame0_flag;
8016*53ee8cc1Swenshuai.xi             pFrmPacking->u1Frame0_self_contained_flag   = pFrmPackingSrc->u1Frame0_self_contained_flag;
8017*53ee8cc1Swenshuai.xi             pFrmPacking->u1Frame1_self_contained_flag   = pFrmPackingSrc->u1Frame1_self_contained_flag;
8018*53ee8cc1Swenshuai.xi             pFrmPacking->u4Frame0_grid_position_x       = pFrmPackingSrc->u4Frame0_grid_position_x;
8019*53ee8cc1Swenshuai.xi             pFrmPacking->u4Frame0_grid_position_y       = pFrmPackingSrc->u4Frame0_grid_position_y;
8020*53ee8cc1Swenshuai.xi             pFrmPacking->u4Frame1_grid_position_x       = pFrmPackingSrc->u4Frame1_grid_position_x;
8021*53ee8cc1Swenshuai.xi             pFrmPacking->u4Frame1_grid_position_y       = pFrmPackingSrc->u4Frame1_grid_position_y;
8022*53ee8cc1Swenshuai.xi             pFrmPacking->u16CropRight                   = pFrmPackingSrc->u16CropRight;
8023*53ee8cc1Swenshuai.xi             pFrmPacking->u16CropLeft                    = pFrmPackingSrc->u16CropLeft;
8024*53ee8cc1Swenshuai.xi             pFrmPacking->u16CropBottom                  = pFrmPackingSrc->u16CropBottom;
8025*53ee8cc1Swenshuai.xi             pFrmPacking->u16CropTop                     = pFrmPackingSrc->u16CropTop;
8026*53ee8cc1Swenshuai.xi 
8027*53ee8cc1Swenshuai.xi             if(pFrmPackingSrc->u8payload_len > 32)
8028*53ee8cc1Swenshuai.xi             {
8029*53ee8cc1Swenshuai.xi                 pFrmPacking->u8payload_len = 32;
8030*53ee8cc1Swenshuai.xi             }
8031*53ee8cc1Swenshuai.xi             else
8032*53ee8cc1Swenshuai.xi             {
8033*53ee8cc1Swenshuai.xi                 pFrmPacking->u8payload_len = pFrmPackingSrc->u8payload_len;
8034*53ee8cc1Swenshuai.xi             }
8035*53ee8cc1Swenshuai.xi 
8036*53ee8cc1Swenshuai.xi             pFrmPacking->u8WaitSPS  = pFrmPackingSrc->u8WaitSPS;
8037*53ee8cc1Swenshuai.xi             pFrmPacking->u32payload = (MS_VIRT)pFrmPackingSrc->u8payload;
8038*53ee8cc1Swenshuai.xi 
8039*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_OK;
8040*53ee8cc1Swenshuai.xi         }
8041*53ee8cc1Swenshuai.xi         else
8042*53ee8cc1Swenshuai.xi         {
8043*53ee8cc1Swenshuai.xi             eRet = E_HVD_EX_FAIL;
8044*53ee8cc1Swenshuai.xi         }
8045*53ee8cc1Swenshuai.xi         HVD_EX_MSG_DBG("SEI status (%d): %d %d %d %d %d %d %d %d\n",bIn,
8046*53ee8cc1Swenshuai.xi                 pFrmPacking->bvaild,pFrmPacking->bUsed,pFrmPacking->u8Frm_packing_arr_cnl_flag,pFrmPacking->u8Frm_packing_arr_type,
8047*53ee8cc1Swenshuai.xi                 pFrmPacking->u16CropRight,pFrmPacking->u16CropLeft,pFrmPacking->u16CropBottom,pFrmPacking->u16CropTop);
8048*53ee8cc1Swenshuai.xi     }
8049*53ee8cc1Swenshuai.xi     else
8050*53ee8cc1Swenshuai.xi     {
8051*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_FAIL;
8052*53ee8cc1Swenshuai.xi     }
8053*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
8054*53ee8cc1Swenshuai.xi }
8055*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_GetDisplayColourVolumeArrSEI(MS_U32 u32Id,HVD_EX_DisplayColourVolumeSEI * pDisplayColourVolume)8056*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetDisplayColourVolumeArrSEI(MS_U32 u32Id, HVD_EX_DisplayColourVolumeSEI *pDisplayColourVolume)
8057*53ee8cc1Swenshuai.xi {
8058*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_FAIL;
8059*53ee8cc1Swenshuai.xi     MS_VIRT u32DCVFrameAddr = 0 ;
8060*53ee8cc1Swenshuai.xi 
8061*53ee8cc1Swenshuai.xi     HVD_EX_DisplayColourVolumeSEI *pDisplayColourVolumeSrc = NULL;
8062*53ee8cc1Swenshuai.xi     MS_BOOL bIn = FALSE;
8063*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8064*53ee8cc1Swenshuai.xi 
8065*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
8066*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
8067*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
8068*53ee8cc1Swenshuai.xi 
8069*53ee8cc1Swenshuai.xi     u32DCVFrameAddr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISPLAYCOLOURVOLUME_SEI_DATA);//get data
8070*53ee8cc1Swenshuai.xi 
8071*53ee8cc1Swenshuai.xi     if(u32DCVFrameAddr == 0x0)
8072*53ee8cc1Swenshuai.xi     {
8073*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_FAIL;
8074*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
8075*53ee8cc1Swenshuai.xi     }
8076*53ee8cc1Swenshuai.xi 
8077*53ee8cc1Swenshuai.xi     u32DCVFrameAddr = MS_PA2KSEG1((MS_U32)(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr+u32DCVFrameAddr)); // change to virtual address
8078*53ee8cc1Swenshuai.xi 
8079*53ee8cc1Swenshuai.xi     pDisplayColourVolumeSrc = (HVD_EX_DisplayColourVolumeSEI *)u32DCVFrameAddr;
8080*53ee8cc1Swenshuai.xi 
8081*53ee8cc1Swenshuai.xi     if(pDisplayColourVolume != NULL)
8082*53ee8cc1Swenshuai.xi     {
8083*53ee8cc1Swenshuai.xi         bIn = TRUE;
8084*53ee8cc1Swenshuai.xi 
8085*53ee8cc1Swenshuai.xi         pDisplayColourVolume->bColourVolumeSEIEnabled         = pDisplayColourVolumeSrc->bColourVolumeSEIEnabled;
8086*53ee8cc1Swenshuai.xi         pDisplayColourVolume->u32MaxLuminance                 = pDisplayColourVolumeSrc->u32MaxLuminance;
8087*53ee8cc1Swenshuai.xi         pDisplayColourVolume->u32MinLuminance                 = pDisplayColourVolumeSrc->u32MinLuminance;
8088*53ee8cc1Swenshuai.xi         pDisplayColourVolume->u16Primaries[0][0]              = pDisplayColourVolumeSrc->u16Primaries[0][0];
8089*53ee8cc1Swenshuai.xi         pDisplayColourVolume->u16Primaries[0][1]              = pDisplayColourVolumeSrc->u16Primaries[0][1];
8090*53ee8cc1Swenshuai.xi         pDisplayColourVolume->u16Primaries[1][0]              = pDisplayColourVolumeSrc->u16Primaries[1][0];
8091*53ee8cc1Swenshuai.xi         pDisplayColourVolume->u16Primaries[1][1]              = pDisplayColourVolumeSrc->u16Primaries[1][1];
8092*53ee8cc1Swenshuai.xi         pDisplayColourVolume->u16Primaries[2][0]              = pDisplayColourVolumeSrc->u16Primaries[2][0];
8093*53ee8cc1Swenshuai.xi         pDisplayColourVolume->u16Primaries[2][1]              = pDisplayColourVolumeSrc->u16Primaries[2][1];
8094*53ee8cc1Swenshuai.xi         pDisplayColourVolume->u16WhitePoint[0]                = pDisplayColourVolumeSrc->u16WhitePoint[0];
8095*53ee8cc1Swenshuai.xi         pDisplayColourVolume->u16WhitePoint[1]                = pDisplayColourVolumeSrc->u16WhitePoint[1];
8096*53ee8cc1Swenshuai.xi 
8097*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_OK;
8098*53ee8cc1Swenshuai.xi     }
8099*53ee8cc1Swenshuai.xi     else
8100*53ee8cc1Swenshuai.xi     {
8101*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_FAIL;
8102*53ee8cc1Swenshuai.xi     }
8103*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
8104*53ee8cc1Swenshuai.xi }
8105*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_GetContentLightLevelInfoSEI(MS_U32 u32Id,HVD_EX_ContentLightLevelInfoSEI * pContentLightLevel)8106*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetContentLightLevelInfoSEI(MS_U32 u32Id, HVD_EX_ContentLightLevelInfoSEI *pContentLightLevel)
8107*53ee8cc1Swenshuai.xi {
8108*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_FAIL;
8109*53ee8cc1Swenshuai.xi     MS_VIRT u32CLLIAddr = 0 ;
8110*53ee8cc1Swenshuai.xi 
8111*53ee8cc1Swenshuai.xi     HVD_EX_ContentLightLevelInfoSEI *pContentLightLevelInfoSrc = NULL;
8112*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8113*53ee8cc1Swenshuai.xi 
8114*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
8115*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
8116*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
8117*53ee8cc1Swenshuai.xi 
8118*53ee8cc1Swenshuai.xi     u32CLLIAddr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_CONTENT_LIGHT_LEVEL_INFO);//get data
8119*53ee8cc1Swenshuai.xi 
8120*53ee8cc1Swenshuai.xi     if(u32CLLIAddr == 0x0)
8121*53ee8cc1Swenshuai.xi     {
8122*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_FAIL;
8123*53ee8cc1Swenshuai.xi         _DRV_HVD_EX_RET(u8DrvId, eRet);
8124*53ee8cc1Swenshuai.xi     }
8125*53ee8cc1Swenshuai.xi 
8126*53ee8cc1Swenshuai.xi     u32CLLIAddr = MS_PA2KSEG1((MS_U32)(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr+u32CLLIAddr)); // change to virtual address
8127*53ee8cc1Swenshuai.xi     pContentLightLevelInfoSrc = (HVD_EX_ContentLightLevelInfoSEI *)u32CLLIAddr;
8128*53ee8cc1Swenshuai.xi     if(pContentLightLevel != NULL)
8129*53ee8cc1Swenshuai.xi     {
8130*53ee8cc1Swenshuai.xi         pContentLightLevel->bUsed                     = pContentLightLevelInfoSrc->bUsed;
8131*53ee8cc1Swenshuai.xi         pContentLightLevel->ContentLightLevelEnabled  = pContentLightLevelInfoSrc->ContentLightLevelEnabled;
8132*53ee8cc1Swenshuai.xi         pContentLightLevel->maxContentLightLevel      = pContentLightLevelInfoSrc->maxContentLightLevel;
8133*53ee8cc1Swenshuai.xi         pContentLightLevel->maxPicAverageLightLevel   = pContentLightLevelInfoSrc->maxPicAverageLightLevel;
8134*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_OK;
8135*53ee8cc1Swenshuai.xi     }
8136*53ee8cc1Swenshuai.xi     else
8137*53ee8cc1Swenshuai.xi     {
8138*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_FAIL;
8139*53ee8cc1Swenshuai.xi     }
8140*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
8141*53ee8cc1Swenshuai.xi }
8142*53ee8cc1Swenshuai.xi 
8143*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8144*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_DynamicScalingResvNBuffer()
8145*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: use N buffers for Dynamic Scaling
8146*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
8147*53ee8cc1Swenshuai.xi /// @return -The result of command to enable/disable N buffer for DS
8148*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_DynamicScalingResvNBuffer(MS_U32 u32Id,MS_BOOL bEnable)8149*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_DynamicScalingResvNBuffer(MS_U32 u32Id, MS_BOOL bEnable)
8150*53ee8cc1Swenshuai.xi {
8151*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8152*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8153*53ee8cc1Swenshuai.xi 
8154*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
8155*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
8156*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
8157*53ee8cc1Swenshuai.xi 
8158*53ee8cc1Swenshuai.xi     //HVD_PRINT("MDrv_HVD_EX_DynamicScalingResvNBuffer bEnable = %d\n", bEnable);
8159*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DYNAMIC_SCALE_RESV_N_BUFFER, bEnable);
8160*53ee8cc1Swenshuai.xi 
8161*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
8162*53ee8cc1Swenshuai.xi }
8163*53ee8cc1Swenshuai.xi 
8164*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8165*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetBBUQNum()
8166*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get BBU Q number
8167*53ee8cc1Swenshuai.xi /// @return - BBU Q number
8168*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetBBUQNum(MS_U32 u32Id)8169*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetBBUQNum(MS_U32 u32Id)
8170*53ee8cc1Swenshuai.xi {
8171*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8172*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
8173*53ee8cc1Swenshuai.xi 
8174*53ee8cc1Swenshuai.xi     return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_Q_NUMB);
8175*53ee8cc1Swenshuai.xi }
8176*53ee8cc1Swenshuai.xi 
8177*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8178*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetDispFrmNum()
8179*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Disp frame number
8180*53ee8cc1Swenshuai.xi /// @return - Disp frame number
8181*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetDispFrmNum(MS_U32 u32Id)8182*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetDispFrmNum(MS_U32 u32Id)
8183*53ee8cc1Swenshuai.xi {
8184*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8185*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
8186*53ee8cc1Swenshuai.xi 
8187*53ee8cc1Swenshuai.xi     return HAL_HVD_EX_GetDispFrmNum(u32Id);
8188*53ee8cc1Swenshuai.xi }
8189*53ee8cc1Swenshuai.xi 
8190*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8191*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetHVDClock()
8192*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set hvd clock speed
8193*53ee8cc1Swenshuai.xi /// @return - The result of setting hvd clock speed
8194*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetHVDClockSpeed(HVD_EX_ClockSpeed eClockSpeed)8195*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetHVDClockSpeed(HVD_EX_ClockSpeed eClockSpeed)
8196*53ee8cc1Swenshuai.xi {
8197*53ee8cc1Swenshuai.xi #if defined(CHIP_A3)
8198*53ee8cc1Swenshuai.xi     HAL_HVD_EX_ClockSpeed eHVDClockSpeed = E_HVD_EX_CLOCK_SPEED_NONE;
8199*53ee8cc1Swenshuai.xi     switch (eClockSpeed)
8200*53ee8cc1Swenshuai.xi     {
8201*53ee8cc1Swenshuai.xi         case E_HVD_EX_CLOCK_SPEED_HIGHEST:
8202*53ee8cc1Swenshuai.xi             eHVDClockSpeed = E_HAL_HVD_EX_CLOCK_SPEED_HIGHEST;
8203*53ee8cc1Swenshuai.xi             break;
8204*53ee8cc1Swenshuai.xi         case E_HVD_EX_CLOCK_SPEED_HIGH:
8205*53ee8cc1Swenshuai.xi             eHVDClockSpeed = E_HAL_HVD_EX_CLOCK_SPEED_HIGH;
8206*53ee8cc1Swenshuai.xi             break;
8207*53ee8cc1Swenshuai.xi         case E_HVD_EX_CLOCK_SPEED_MEDIUM:
8208*53ee8cc1Swenshuai.xi             eHVDClockSpeed = E_HAL_HVD_EX_CLOCK_SPEED_MEDIUM;
8209*53ee8cc1Swenshuai.xi             break;
8210*53ee8cc1Swenshuai.xi         case E_HVD_EX_CLOCK_SPEED_LOW:
8211*53ee8cc1Swenshuai.xi             eHVDClockSpeed = E_HAL_HVD_EX_CLOCK_SPEED_LOW;
8212*53ee8cc1Swenshuai.xi             break;
8213*53ee8cc1Swenshuai.xi         case E_HVD_EX_CLOCK_SPEED_LOWEST:
8214*53ee8cc1Swenshuai.xi             eHVDClockSpeed = E_HAL_HVD_EX_CLOCK_SPEED_LOWEST;
8215*53ee8cc1Swenshuai.xi             break;
8216*53ee8cc1Swenshuai.xi         case E_HVD_EX_CLOCK_SPEED_DEFAULT:
8217*53ee8cc1Swenshuai.xi             eHVDClockSpeed = E_HAL_HVD_EX_CLOCK_SPEED_DEFAULT;
8218*53ee8cc1Swenshuai.xi             break;
8219*53ee8cc1Swenshuai.xi         default:
8220*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("hvd clock setting is wrong(%d)\n", eClockSpeed);
8221*53ee8cc1Swenshuai.xi             return E_HVD_EX_FAIL;
8222*53ee8cc1Swenshuai.xi             break;
8223*53ee8cc1Swenshuai.xi     }
8224*53ee8cc1Swenshuai.xi 
8225*53ee8cc1Swenshuai.xi     if(E_HVD_RETURN_SUCCESS != HAL_HVD_EX_SetClockSpeed(eHVDClockSpeed))
8226*53ee8cc1Swenshuai.xi     {
8227*53ee8cc1Swenshuai.xi         return E_HVD_EX_FAIL;
8228*53ee8cc1Swenshuai.xi     }
8229*53ee8cc1Swenshuai.xi 
8230*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
8231*53ee8cc1Swenshuai.xi #else
8232*53ee8cc1Swenshuai.xi     UNUSED(eClockSpeed);
8233*53ee8cc1Swenshuai.xi     HVD_PRINT("This chip does not support hvd clock presetting~\n");
8234*53ee8cc1Swenshuai.xi     return E_HVD_EX_RET_UNSUPPORTED;
8235*53ee8cc1Swenshuai.xi #endif
8236*53ee8cc1Swenshuai.xi }
8237*53ee8cc1Swenshuai.xi 
8238*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8239*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetVPUClockSpeed()
8240*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set vpu clock speed
8241*53ee8cc1Swenshuai.xi /// @return - The result of setting vpu clock speed
8242*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetVPUClockSpeed(HVD_EX_ClockSpeed eClockSpeed)8243*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetVPUClockSpeed(HVD_EX_ClockSpeed eClockSpeed)
8244*53ee8cc1Swenshuai.xi {
8245*53ee8cc1Swenshuai.xi #if defined(CHIP_A3)
8246*53ee8cc1Swenshuai.xi     HAL_VPU_EX_ClockSpeedType eVPUClockSpeed = E_HAL_VPU_EX_CLOCK_SPEED_NONE;
8247*53ee8cc1Swenshuai.xi     switch (eClockSpeed)
8248*53ee8cc1Swenshuai.xi     {
8249*53ee8cc1Swenshuai.xi         case E_HVD_EX_CLOCK_SPEED_HIGHEST:
8250*53ee8cc1Swenshuai.xi             eVPUClockSpeed = E_HAL_VPU_EX_CLOCK_SPEED_HIGHEST;
8251*53ee8cc1Swenshuai.xi             break;
8252*53ee8cc1Swenshuai.xi         case E_HVD_EX_CLOCK_SPEED_HIGH:
8253*53ee8cc1Swenshuai.xi             eVPUClockSpeed = E_HAL_VPU_EX_CLOCK_SPEED_HIGH;
8254*53ee8cc1Swenshuai.xi             break;
8255*53ee8cc1Swenshuai.xi         case E_HVD_EX_CLOCK_SPEED_MEDIUM:
8256*53ee8cc1Swenshuai.xi             eVPUClockSpeed = E_HAL_VPU_EX_CLOCK_SPEED_MEDIUM;
8257*53ee8cc1Swenshuai.xi             break;
8258*53ee8cc1Swenshuai.xi         case E_HVD_EX_CLOCK_SPEED_LOW:
8259*53ee8cc1Swenshuai.xi             eVPUClockSpeed = E_HAL_VPU_EX_CLOCK_SPEED_LOW;
8260*53ee8cc1Swenshuai.xi             break;
8261*53ee8cc1Swenshuai.xi         case E_HVD_EX_CLOCK_SPEED_LOWEST:
8262*53ee8cc1Swenshuai.xi             eVPUClockSpeed = E_HAL_VPU_EX_CLOCK_SPEED_LOWEST;
8263*53ee8cc1Swenshuai.xi             break;
8264*53ee8cc1Swenshuai.xi         case E_HVD_EX_CLOCK_SPEED_DEFAULT:
8265*53ee8cc1Swenshuai.xi             eVPUClockSpeed = E_HAL_VPU_EX_CLOCK_SPEED_DEFAULT;
8266*53ee8cc1Swenshuai.xi             break;
8267*53ee8cc1Swenshuai.xi         default:
8268*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("vpu clock setting is wrong(%d)\n", eVPUClockSpeed);
8269*53ee8cc1Swenshuai.xi             return E_HVD_EX_FAIL;
8270*53ee8cc1Swenshuai.xi             break;
8271*53ee8cc1Swenshuai.xi     }
8272*53ee8cc1Swenshuai.xi 
8273*53ee8cc1Swenshuai.xi     if(FALSE == HAL_VPU_EX_SetClockSpeedType(eVPUClockSpeed))
8274*53ee8cc1Swenshuai.xi     {
8275*53ee8cc1Swenshuai.xi         return E_HVD_EX_FAIL;
8276*53ee8cc1Swenshuai.xi     }
8277*53ee8cc1Swenshuai.xi 
8278*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
8279*53ee8cc1Swenshuai.xi #else
8280*53ee8cc1Swenshuai.xi     UNUSED(eClockSpeed);
8281*53ee8cc1Swenshuai.xi     HVD_PRINT("This chip does not support vpu clock presetting~\n");
8282*53ee8cc1Swenshuai.xi     return E_HVD_EX_RET_UNSUPPORTED;
8283*53ee8cc1Swenshuai.xi #endif
8284*53ee8cc1Swenshuai.xi }
8285*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_SetHVDColBBUMode(MS_U32 u32Id,MS_U8 bEnable)8286*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetHVDColBBUMode(MS_U32 u32Id, MS_U8 bEnable)
8287*53ee8cc1Swenshuai.xi {
8288*53ee8cc1Swenshuai.xi #if (defined(CHIP_EDISON) || defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3)) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MUJI) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET) || defined(CHIP_MANHATTAN) || defined(CHIP_KANO) || defined(CHIP_CURRY)
8289*53ee8cc1Swenshuai.xi     if(E_HVD_RETURN_SUCCESS != HAL_HVD_EX_SetHVDColBBUMode(u32Id, bEnable))
8290*53ee8cc1Swenshuai.xi         return E_HVD_EX_FAIL;
8291*53ee8cc1Swenshuai.xi #endif
8292*53ee8cc1Swenshuai.xi     return E_HVD_EX_OK;
8293*53ee8cc1Swenshuai.xi }
8294*53ee8cc1Swenshuai.xi 
8295*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8296*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_DSReportDispInfoChange()
8297*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Setting report display info change info. when DS enabled.
8298*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
8299*53ee8cc1Swenshuai.xi /// @return -The result of command to enable/disable Report display info change info.
8300*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_DSReportDispInfoChange(MS_U32 u32Id,MS_BOOL bEnable)8301*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_DSReportDispInfoChange(MS_U32 u32Id, MS_BOOL bEnable)
8302*53ee8cc1Swenshuai.xi {
8303*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8304*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8305*53ee8cc1Swenshuai.xi 
8306*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
8307*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
8308*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
8309*53ee8cc1Swenshuai.xi 
8310*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DS_RESET_XC_DISP_WIN, bEnable);
8311*53ee8cc1Swenshuai.xi 
8312*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
8313*53ee8cc1Swenshuai.xi 
8314*53ee8cc1Swenshuai.xi }
8315*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_SetSecureMode(MS_U32 u32Id,MS_U32 u32SecureMode)8316*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSecureMode(MS_U32 u32Id, MS_U32 u32SecureMode)
8317*53ee8cc1Swenshuai.xi {
8318*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8319*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8320*53ee8cc1Swenshuai.xi 
8321*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
8322*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
8323*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
8324*53ee8cc1Swenshuai.xi 
8325*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8SecureMode = (MS_U8)u32SecureMode;
8326*53ee8cc1Swenshuai.xi 
8327*53ee8cc1Swenshuai.xi      _DRV_HVD_EX_RET(u8DrvId, eRet);
8328*53ee8cc1Swenshuai.xi }
8329*53ee8cc1Swenshuai.xi 
8330*53ee8cc1Swenshuai.xi 
8331*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8332*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SupportRefNumOverMaxDpbSize()
8333*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Support h264 FHD ref frame up to 6
8334*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
8335*53ee8cc1Swenshuai.xi /// @return -The result of command to enable/disable support h264 FHD ref frame up to 6
8336*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SupportRefNumOverMaxDpbSize(MS_U32 u32Id,MS_BOOL bEnable)8337*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SupportRefNumOverMaxDpbSize(MS_U32 u32Id, MS_BOOL bEnable)
8338*53ee8cc1Swenshuai.xi {
8339*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8340*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8341*53ee8cc1Swenshuai.xi 
8342*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
8343*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
8344*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
8345*53ee8cc1Swenshuai.xi 
8346*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AVC_SUPPORT_REF_NUM_OVER_MAX_DPB_SIZE, bEnable);
8347*53ee8cc1Swenshuai.xi 
8348*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
8349*53ee8cc1Swenshuai.xi }
8350*53ee8cc1Swenshuai.xi 
8351*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8352*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_RVU_Setting_Mode()
8353*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: RVU settings
8354*53ee8cc1Swenshuai.xi /// @param -u32Param \u32 IN : 0: diable, 1: Drop B-frame and force IDR.
8355*53ee8cc1Swenshuai.xi /// @return -The result of command setting E_HVD_CMD_RVU_SETTING_MODE
8356*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_RVU_Setting_Mode(MS_U32 u32Id,MS_U32 u32Param)8357*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_RVU_Setting_Mode(MS_U32 u32Id, MS_U32 u32Param)
8358*53ee8cc1Swenshuai.xi {
8359*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8360*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8361*53ee8cc1Swenshuai.xi 
8362*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
8363*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
8364*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
8365*53ee8cc1Swenshuai.xi 
8366*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_RVU_SETTING_MODE, u32Param);
8367*53ee8cc1Swenshuai.xi 
8368*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
8369*53ee8cc1Swenshuai.xi }
8370*53ee8cc1Swenshuai.xi 
8371*53ee8cc1Swenshuai.xi 
8372*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8373*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_FramerateHandling()
8374*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: FramerateHandling
8375*53ee8cc1Swenshuai.xi /// @brief \b A.Case of (timing_info_present_flag == 1)
8376*53ee8cc1Swenshuai.xi /// @brief \b   i.Use num_units_in_tick and time_scale
8377*53ee8cc1Swenshuai.xi /// @brief \b   ii.framerate = time_scale / num_units_in_tick / 2
8378*53ee8cc1Swenshuai.xi /// @brief \b   iii.If calculated framerate from ii.
8379*53ee8cc1Swenshuai.xi /// @brief \b   iv.If there is no time_scale or num_units_in_tick, framerate should be 30fps as default vaule.
8380*53ee8cc1Swenshuai.xi /// @brief \b B.Case of timing_info_present_flag == 0
8381*53ee8cc1Swenshuai.xi /// @brief \b   i.Use framerate from application
8382*53ee8cc1Swenshuai.xi /// @brief \b C.If there is no VUI information, use framerate from application
8383*53ee8cc1Swenshuai.xi /// @param -bu32FrameRate \b IN : framerate from application
8384*53ee8cc1Swenshuai.xi /// @return -The result of command for handling framerate
8385*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_FramerateHandling(MS_U32 u32Id,MS_U32 u32FrameRate)8386*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_FramerateHandling(MS_U32 u32Id, MS_U32 u32FrameRate)
8387*53ee8cc1Swenshuai.xi {
8388*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8389*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8390*53ee8cc1Swenshuai.xi 
8391*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
8392*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
8393*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
8394*53ee8cc1Swenshuai.xi 
8395*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FRAMERATE_HANDLING, u32FrameRate);
8396*53ee8cc1Swenshuai.xi 
8397*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
8398*53ee8cc1Swenshuai.xi }
8399*53ee8cc1Swenshuai.xi 
8400*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8401*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_DualNonBlockMode()
8402*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: handle dual non blocking mode
8403*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
8404*53ee8cc1Swenshuai.xi /// @return -The result of command setting E_HVD_CMD_DUAL_NON_BLOCK_MODE
8405*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_DualNonBlockMode(MS_U32 u32Id,MS_BOOL bEnable)8406*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_DualNonBlockMode(MS_U32 u32Id, MS_BOOL bEnable)
8407*53ee8cc1Swenshuai.xi {
8408*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8409*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8410*53ee8cc1Swenshuai.xi 
8411*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
8412*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
8413*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
8414*53ee8cc1Swenshuai.xi 
8415*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DUAL_NON_BLOCK_MODE, bEnable);
8416*53ee8cc1Swenshuai.xi 
8417*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
8418*53ee8cc1Swenshuai.xi }
8419*53ee8cc1Swenshuai.xi 
8420*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8421*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IgnorePicStructDisplay()
8422*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Ignore Pic_struct when display progressive frame.
8423*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
8424*53ee8cc1Swenshuai.xi /// @return -The result of command to enable/disable ignore Pic_struct when display progressive frame.
8425*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IgnorePicStructDisplay(MS_U32 u32Id,MS_U32 param)8426*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_IgnorePicStructDisplay(MS_U32 u32Id, MS_U32 param)
8427*53ee8cc1Swenshuai.xi {
8428*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8429*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8430*53ee8cc1Swenshuai.xi 
8431*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
8432*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
8433*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
8434*53ee8cc1Swenshuai.xi 
8435*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_IGNORE_PIC_STRUCT_DISPLAY, param);
8436*53ee8cc1Swenshuai.xi 
8437*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
8438*53ee8cc1Swenshuai.xi }
8439*53ee8cc1Swenshuai.xi 
8440*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8441*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_InputPtsFreerunMode()
8442*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: video free run when the difference between input PTS and current STC is large than E_HVD_CMD_FREERUN_THRESHOLD + 1s.
8443*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
8444*53ee8cc1Swenshuai.xi /// @return -The result of command to enable/disable video free run when the difference between input PTS and current STC is large than E_HVD_CMD_FREERUN_THRESHOLD + 1s.
8445*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_InputPtsFreerunMode(MS_U32 u32Id,MS_U32 param)8446*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_InputPtsFreerunMode(MS_U32 u32Id, MS_U32 param)
8447*53ee8cc1Swenshuai.xi {
8448*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8449*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8450*53ee8cc1Swenshuai.xi 
8451*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
8452*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
8453*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
8454*53ee8cc1Swenshuai.xi 
8455*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_INPUT_PTS_FREERUN_MODE, param);
8456*53ee8cc1Swenshuai.xi 
8457*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
8458*53ee8cc1Swenshuai.xi }
8459*53ee8cc1Swenshuai.xi 
8460*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8461*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_ErrConcealStartSlice1stMB()
8462*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Error concealment from current slice first MB.(Need enable E_HVD_CMD_ERR_CONCEAL)
8463*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
8464*53ee8cc1Swenshuai.xi /// @return -The result of command to enable/disable Error concealment from current slice first MB.(Need enable E_HVD_CMD_ERR_CONCEAL)
8465*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_ErrConcealStartSlice1stMB(MS_U32 u32Id,MS_U32 param)8466*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_ErrConcealStartSlice1stMB(MS_U32 u32Id, MS_U32 param)
8467*53ee8cc1Swenshuai.xi {
8468*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8469*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8470*53ee8cc1Swenshuai.xi 
8471*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
8472*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
8473*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
8474*53ee8cc1Swenshuai.xi 
8475*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ERR_CONCEAL_SLICE_1ST_MB, param);
8476*53ee8cc1Swenshuai.xi 
8477*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
8478*53ee8cc1Swenshuai.xi }
8479*53ee8cc1Swenshuai.xi 
8480*53ee8cc1Swenshuai.xi 
8481*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8482*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetExternalDSBuffer()
8483*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set External DS buffer
8484*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : External DS buffer info.
8485*53ee8cc1Swenshuai.xi /// @return -The result of command to set external DS buffer.
8486*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetExternalDSBuffer(MS_U32 u32Id,HVD_EX_ExternalDSBuf * pExternalBuf)8487*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetExternalDSBuffer(MS_U32 u32Id, HVD_EX_ExternalDSBuf *pExternalBuf)
8488*53ee8cc1Swenshuai.xi {
8489*53ee8cc1Swenshuai.xi #define SIZE_3K 0xC00
8490*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8491*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8492*53ee8cc1Swenshuai.xi     HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
8493*53ee8cc1Swenshuai.xi     MS_BOOL bFWInMIU1 = FALSE;
8494*53ee8cc1Swenshuai.xi     MS_BOOL bExternalInMIU1 = FALSE;
8495*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8496*53ee8cc1Swenshuai.xi     MS_PHY u32DSBufAddr = pExternalBuf->u32DSBufAddr;
8497*53ee8cc1Swenshuai.xi 
8498*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
8499*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
8500*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
8501*53ee8cc1Swenshuai.xi 
8502*53ee8cc1Swenshuai.xi     if((pShm == NULL) || (pCtrl == NULL) || (pExternalBuf->u32DSBufSize < SIZE_3K)) /// DS buffer size need more than 3K (0xC00)
8503*53ee8cc1Swenshuai.xi     {
8504*53ee8cc1Swenshuai.xi         return E_HVD_EX_FAIL;
8505*53ee8cc1Swenshuai.xi     }
8506*53ee8cc1Swenshuai.xi 
8507*53ee8cc1Swenshuai.xi     #if defined(CHIP_MONACO) || defined(CHIP_MUJI) || defined(CHIP_MONET) || defined(CHIP_MANHATTAN) || defined(CHIP_KANO) || defined(CHIP_CURRY)
8508*53ee8cc1Swenshuai.xi     if(VPU_FORCE_MIU_MODE == 1)
8509*53ee8cc1Swenshuai.xi     {
8510*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("this chip does not support set external DS buffer since VPU_FORCE_MIU_MODE == 1 !!\n");
8511*53ee8cc1Swenshuai.xi         return E_HVD_EX_RET_UNSUPPORTED;
8512*53ee8cc1Swenshuai.xi     }
8513*53ee8cc1Swenshuai.xi     #endif
8514*53ee8cc1Swenshuai.xi 
8515*53ee8cc1Swenshuai.xi     ///HVD_PRINT("[EDS] 0x%lx, 0x%lx.\n",pCtrl->MemMap.u32CodeBufAddr,pCtrl->MemMap.u32MIU1BaseAddr);
8516*53ee8cc1Swenshuai.xi     if((pCtrl->MemMap.u32CodeBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr) && (pCtrl->MemMap.u32MIU1BaseAddr != 0))
8517*53ee8cc1Swenshuai.xi     {
8518*53ee8cc1Swenshuai.xi         bFWInMIU1 = TRUE;
8519*53ee8cc1Swenshuai.xi     }
8520*53ee8cc1Swenshuai.xi 
8521*53ee8cc1Swenshuai.xi     if((pExternalBuf->u32DSBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr)  && (pCtrl->MemMap.u32MIU1BaseAddr != 0) )
8522*53ee8cc1Swenshuai.xi     {
8523*53ee8cc1Swenshuai.xi         bExternalInMIU1 = TRUE;
8524*53ee8cc1Swenshuai.xi         u32DSBufAddr -= pCtrl->MemMap.u32MIU1BaseAddr;
8525*53ee8cc1Swenshuai.xi     }
8526*53ee8cc1Swenshuai.xi     //HVD_PRINT("[EDS] MIU %d, %d.\n",bFWInMIU1,bExternalInMIU1);
8527*53ee8cc1Swenshuai.xi 
8528*53ee8cc1Swenshuai.xi     /// If FW and external buf is in the same MIU, the External buffer do nothing.
8529*53ee8cc1Swenshuai.xi     if(bFWInMIU1 == bExternalInMIU1)
8530*53ee8cc1Swenshuai.xi     {
8531*53ee8cc1Swenshuai.xi         pShm->u32DSbufferAddr = u32DSBufAddr;
8532*53ee8cc1Swenshuai.xi     }
8533*53ee8cc1Swenshuai.xi     else
8534*53ee8cc1Swenshuai.xi     {
8535*53ee8cc1Swenshuai.xi         /// If FW and external buf is not in the same MIU, the External buffer add the VPU Miu base size
8536*53ee8cc1Swenshuai.xi         pShm->u32DSbufferAddr = u32DSBufAddr + HAL_VPU_EX_MIU1BASE();
8537*53ee8cc1Swenshuai.xi     }
8538*53ee8cc1Swenshuai.xi     pShm->u32DSBuffSize = pExternalBuf->u32DSBufSize;
8539*53ee8cc1Swenshuai.xi 
8540*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
8541*53ee8cc1Swenshuai.xi     ///HVD_PRINT("[EDS] DS addr = 0x%lx, size = 0x%lx.\n",pShm->u32DSbufferAddr,pShm->u32DSBuffSize);
8542*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_EXTERNAL_DS_BUF, TRUE);
8543*53ee8cc1Swenshuai.xi 
8544*53ee8cc1Swenshuai.xi     pCtrl->u8SettingMode |= HVD_DRV_MODE_EXTERNAL_DS_BUFFER;
8545*53ee8cc1Swenshuai.xi     pCtrl->u32ExternalDSbuf = pExternalBuf->u32DSBufAddr;
8546*53ee8cc1Swenshuai.xi 
8547*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
8548*53ee8cc1Swenshuai.xi }
8549*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_GetESBufferStatus(MS_U32 u32Id)8550*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetESBufferStatus(MS_U32 u32Id)
8551*53ee8cc1Swenshuai.xi {
8552*53ee8cc1Swenshuai.xi     MS_U32 u32Ret = 0;
8553*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8554*53ee8cc1Swenshuai.xi 
8555*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,FALSE);
8556*53ee8cc1Swenshuai.xi 
8557*53ee8cc1Swenshuai.xi     u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_ES_BUF_STATUS);
8558*53ee8cc1Swenshuai.xi     u32Ret = _HVD_EX_Map2HVDESBufStatus(u32Ret);
8559*53ee8cc1Swenshuai.xi 
8560*53ee8cc1Swenshuai.xi     return u32Ret;
8561*53ee8cc1Swenshuai.xi }
8562*53ee8cc1Swenshuai.xi 
_HVD_EX_CC_Update_UserData_Wptr(MS_U32 u32Id)8563*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_CC_Update_UserData_Wptr(MS_U32 u32Id)
8564*53ee8cc1Swenshuai.xi {
8565*53ee8cc1Swenshuai.xi 
8566*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8567*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8568*53ee8cc1Swenshuai.xi 
8569*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
8570*53ee8cc1Swenshuai.xi     MS_U32 u32UsrDataIdxWptr = MDrv_HVD_EX_GetUserData_Wptr(u32Id);
8571*53ee8cc1Swenshuai.xi 
8572*53ee8cc1Swenshuai.xi     if (u32UsrDataIdxWptr != 0xFFFFFFFF)
8573*53ee8cc1Swenshuai.xi         pCCInfo->u32FWUsrDataWIdx = u32UsrDataIdxWptr;
8574*53ee8cc1Swenshuai.xi 
8575*53ee8cc1Swenshuai.xi     return pCCInfo->u32FWUsrDataWIdx;
8576*53ee8cc1Swenshuai.xi }
8577*53ee8cc1Swenshuai.xi 
_HVD_EX_CC_Parse_AFD_data(MS_U8 ** pUserDataBuf)8578*53ee8cc1Swenshuai.xi static void _HVD_EX_CC_Parse_AFD_data(MS_U8 **pUserDataBuf)
8579*53ee8cc1Swenshuai.xi {
8580*53ee8cc1Swenshuai.xi 
8581*53ee8cc1Swenshuai.xi     (*pUserDataBuf)++;
8582*53ee8cc1Swenshuai.xi     (*pUserDataBuf)++;
8583*53ee8cc1Swenshuai.xi 
8584*53ee8cc1Swenshuai.xi }
8585*53ee8cc1Swenshuai.xi 
_HVD_EX_CC_Parse_BAR_data(MS_U8 ** pUserDataBuf)8586*53ee8cc1Swenshuai.xi static void _HVD_EX_CC_Parse_BAR_data(MS_U8 **pUserDataBuf)
8587*53ee8cc1Swenshuai.xi {
8588*53ee8cc1Swenshuai.xi 
8589*53ee8cc1Swenshuai.xi     MS_BOOL bTopBarFlag, bBottomBarFlag, bLeftBarFlag, bRightBarlag;
8590*53ee8cc1Swenshuai.xi 
8591*53ee8cc1Swenshuai.xi     bTopBarFlag    = (((**pUserDataBuf) & 0x80) == 0x80); //u_f(1,"top_bar_flag");
8592*53ee8cc1Swenshuai.xi     bBottomBarFlag = (((**pUserDataBuf) & 0x40) == 0x40); //u_f(1,"bottom_bar_flag");
8593*53ee8cc1Swenshuai.xi     bLeftBarFlag   = (((**pUserDataBuf) & 0x20) == 0x20); //u_f(1,"left_bar_flag");
8594*53ee8cc1Swenshuai.xi     bRightBarlag  = ((*((*pUserDataBuf)++) & 0x10) == 0x10); //u_f(1,"right_bar_flag"); u_f(4,"reserved");
8595*53ee8cc1Swenshuai.xi 
8596*53ee8cc1Swenshuai.xi     if (bTopBarFlag)
8597*53ee8cc1Swenshuai.xi     {
8598*53ee8cc1Swenshuai.xi         *pUserDataBuf += 2;
8599*53ee8cc1Swenshuai.xi     }
8600*53ee8cc1Swenshuai.xi 
8601*53ee8cc1Swenshuai.xi     if (bBottomBarFlag)
8602*53ee8cc1Swenshuai.xi     {
8603*53ee8cc1Swenshuai.xi         *pUserDataBuf += 2;
8604*53ee8cc1Swenshuai.xi     }
8605*53ee8cc1Swenshuai.xi 
8606*53ee8cc1Swenshuai.xi     if (bLeftBarFlag)
8607*53ee8cc1Swenshuai.xi     {
8608*53ee8cc1Swenshuai.xi         *pUserDataBuf += 2;
8609*53ee8cc1Swenshuai.xi     }
8610*53ee8cc1Swenshuai.xi 
8611*53ee8cc1Swenshuai.xi     if (bRightBarlag)
8612*53ee8cc1Swenshuai.xi     {
8613*53ee8cc1Swenshuai.xi         *pUserDataBuf += 2;
8614*53ee8cc1Swenshuai.xi     }
8615*53ee8cc1Swenshuai.xi 
8616*53ee8cc1Swenshuai.xi }
8617*53ee8cc1Swenshuai.xi 
_HVD_EX_CC_Parse_CC_data(MS_U32 u32Id,MS_U8 u8CCMode,MS_U8 ** pSrc,MS_U8 * pDst608,MS_U32 * pu32Dst608Len,MS_U8 * pDst708,MS_U32 * pu32Dst708Len,HVD_CC_608EnhanceInfo * pEhInfo608)8618*53ee8cc1Swenshuai.xi static void _HVD_EX_CC_Parse_CC_data(MS_U32 u32Id, MS_U8 u8CCMode,MS_U8 **pSrc, MS_U8 *pDst608, MS_U32 *pu32Dst608Len, MS_U8 *pDst708, MS_U32 *pu32Dst708Len, HVD_CC_608EnhanceInfo *pEhInfo608)
8619*53ee8cc1Swenshuai.xi {
8620*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8621*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8622*53ee8cc1Swenshuai.xi 
8623*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
8624*53ee8cc1Swenshuai.xi 
8625*53ee8cc1Swenshuai.xi     MS_U32 i,j;
8626*53ee8cc1Swenshuai.xi     MS_U32 u32CC_Count;
8627*53ee8cc1Swenshuai.xi     MS_U8 u8CC_Code;
8628*53ee8cc1Swenshuai.xi     MS_U8 u8CC_Type;
8629*53ee8cc1Swenshuai.xi     MS_U8 u8CC_Data1, u8CC_Data2;
8630*53ee8cc1Swenshuai.xi     MS_U32 u32Pad;
8631*53ee8cc1Swenshuai.xi 
8632*53ee8cc1Swenshuai.xi 
8633*53ee8cc1Swenshuai.xi 
8634*53ee8cc1Swenshuai.xi     u8CC_Code = *((*pSrc)++); //u_f(8,"cc_data_flag cc_count");
8635*53ee8cc1Swenshuai.xi 
8636*53ee8cc1Swenshuai.xi     u32CC_Count = u8CC_Code & 0x1F;            // cc_count
8637*53ee8cc1Swenshuai.xi     if (!(u8CC_Code & 0x40)) return;        // process_cc_data_flag
8638*53ee8cc1Swenshuai.xi 
8639*53ee8cc1Swenshuai.xi 
8640*53ee8cc1Swenshuai.xi 
8641*53ee8cc1Swenshuai.xi     (*pSrc)++; //u_f(8,"reserved 1");
8642*53ee8cc1Swenshuai.xi 
8643*53ee8cc1Swenshuai.xi 
8644*53ee8cc1Swenshuai.xi 
8645*53ee8cc1Swenshuai.xi     for (i=0;i<u32CC_Count;i++)
8646*53ee8cc1Swenshuai.xi     {
8647*53ee8cc1Swenshuai.xi         MS_U8 u8Code;
8648*53ee8cc1Swenshuai.xi 
8649*53ee8cc1Swenshuai.xi 
8650*53ee8cc1Swenshuai.xi         u8Code = *((*pSrc)++); // u_f(8,"cc_valid and cc_type");
8651*53ee8cc1Swenshuai.xi 
8652*53ee8cc1Swenshuai.xi 
8653*53ee8cc1Swenshuai.xi         u8CC_Type  = u8Code & 0x03;
8654*53ee8cc1Swenshuai.xi 
8655*53ee8cc1Swenshuai.xi         u8CC_Data1 = *((*pSrc)++); // u_f(8,"cc_data_1");
8656*53ee8cc1Swenshuai.xi         u8CC_Data2 = *((*pSrc)++); // u_f(8,"cc_data_2");
8657*53ee8cc1Swenshuai.xi 
8658*53ee8cc1Swenshuai.xi         if (!(u8Code & 0x04)) continue; // cc_valid
8659*53ee8cc1Swenshuai.xi 
8660*53ee8cc1Swenshuai.xi         //NTSC CC 608
8661*53ee8cc1Swenshuai.xi         if ((u8CC_Type == 0) || (u8CC_Type == 1))
8662*53ee8cc1Swenshuai.xi         {
8663*53ee8cc1Swenshuai.xi             //g_DTV_CC.ntsc_cc_data[g_DTV_CC.NTSC_element++] = (cc_type << 16) | (cc_data2 << 8) | (cc_data1);
8664*53ee8cc1Swenshuai.xi 
8665*53ee8cc1Swenshuai.xi             if(pCCInfo->b608InfoEnhance)
8666*53ee8cc1Swenshuai.xi             {
8667*53ee8cc1Swenshuai.xi                 if( ( (*pu32Dst608Len) + 16) > MAX_608_CC_LEN)
8668*53ee8cc1Swenshuai.xi                 {
8669*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("u32Dst608Len+16: %d is larger than MAX_608_CC_LEN !! \n",((*pu32Dst608Len)+16));
8670*53ee8cc1Swenshuai.xi                     return;
8671*53ee8cc1Swenshuai.xi                 }
8672*53ee8cc1Swenshuai.xi             }
8673*53ee8cc1Swenshuai.xi             else
8674*53ee8cc1Swenshuai.xi             {
8675*53ee8cc1Swenshuai.xi                 if( ( (*pu32Dst608Len) + 4) > MAX_608_CC_LEN)
8676*53ee8cc1Swenshuai.xi                 {
8677*53ee8cc1Swenshuai.xi                     HVD_EX_MSG_ERR("u32Dst608Len+4: %d is larger than MAX_608_CC_LEN !! \n",((*pu32Dst608Len)+4));
8678*53ee8cc1Swenshuai.xi                     return;
8679*53ee8cc1Swenshuai.xi                 }
8680*53ee8cc1Swenshuai.xi             }
8681*53ee8cc1Swenshuai.xi 
8682*53ee8cc1Swenshuai.xi             pDst608[(*pu32Dst608Len)++] = u8CC_Data1;
8683*53ee8cc1Swenshuai.xi             pDst608[(*pu32Dst608Len)++] = u8CC_Data2;
8684*53ee8cc1Swenshuai.xi             pDst608[(*pu32Dst608Len)++] = u8CC_Type;
8685*53ee8cc1Swenshuai.xi             pDst608[(*pu32Dst608Len)++] = 0;
8686*53ee8cc1Swenshuai.xi 
8687*53ee8cc1Swenshuai.xi             if (pCCInfo->b608InfoEnhance)
8688*53ee8cc1Swenshuai.xi             {
8689*53ee8cc1Swenshuai.xi                 //   PTS searched_pts;
8690*53ee8cc1Swenshuai.xi                 //search_pts(pContext, &searched_pts);
8691*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = (pEhInfo608->u16TmpRef&0xff);
8692*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u16TmpRef>>8)&0xff);
8693*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = (pEhInfo608->u16PicStruct&0xff);
8694*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u16PicStruct>>8)&0xff);
8695*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = (pEhInfo608->u32Pts&0xff);
8696*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u32Pts>>8)&0xff);
8697*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u32Pts>>16)&0xff);
8698*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u32Pts>>24)&0xff);
8699*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = pEhInfo608->u8UsrDataCnt;
8700*53ee8cc1Swenshuai.xi 
8701*53ee8cc1Swenshuai.xi                 // for enhance cc-608 data dump, 16bytes/pkt
8702*53ee8cc1Swenshuai.xi                 u32Pad = (*pu32Dst608Len) & 0xf; //align to 16 byte
8703*53ee8cc1Swenshuai.xi                 if(u32Pad) u32Pad = 16-u32Pad;
8704*53ee8cc1Swenshuai.xi                 for(j=0;j<u32Pad;j++)
8705*53ee8cc1Swenshuai.xi                     pDst608[(*pu32Dst608Len)++] = 0xff;
8706*53ee8cc1Swenshuai.xi 
8707*53ee8cc1Swenshuai.xi             }
8708*53ee8cc1Swenshuai.xi 
8709*53ee8cc1Swenshuai.xi 
8710*53ee8cc1Swenshuai.xi 
8711*53ee8cc1Swenshuai.xi 
8712*53ee8cc1Swenshuai.xi         }
8713*53ee8cc1Swenshuai.xi         else // ATSC_CC 708
8714*53ee8cc1Swenshuai.xi         {
8715*53ee8cc1Swenshuai.xi             if( ( (*pu32Dst708Len) + 4) > MAX_708_CC_LEN)
8716*53ee8cc1Swenshuai.xi             {
8717*53ee8cc1Swenshuai.xi                 HVD_EX_MSG_ERR(" u32Dst708Len+4: %d is larger than MAX_708_CC_LEN !! \n",((*pu32Dst708Len)+4));
8718*53ee8cc1Swenshuai.xi                 return;
8719*53ee8cc1Swenshuai.xi             }
8720*53ee8cc1Swenshuai.xi             pDst708[(*pu32Dst708Len)++] = u8CC_Data1;
8721*53ee8cc1Swenshuai.xi             pDst708[(*pu32Dst708Len)++] = u8CC_Data2;
8722*53ee8cc1Swenshuai.xi             pDst708[(*pu32Dst708Len)++] = u8CC_Type;
8723*53ee8cc1Swenshuai.xi             pDst708[(*pu32Dst708Len)++] = 0;
8724*53ee8cc1Swenshuai.xi 
8725*53ee8cc1Swenshuai.xi         }
8726*53ee8cc1Swenshuai.xi         //new DTV CC header
8727*53ee8cc1Swenshuai.xi 
8728*53ee8cc1Swenshuai.xi     }
8729*53ee8cc1Swenshuai.xi 
8730*53ee8cc1Swenshuai.xi 
8731*53ee8cc1Swenshuai.xi 
8732*53ee8cc1Swenshuai.xi     //padding cc608
8733*53ee8cc1Swenshuai.xi 
8734*53ee8cc1Swenshuai.xi 
8735*53ee8cc1Swenshuai.xi     if(u8CCMode & (CC_NTSC1|CC_NTSC2))
8736*53ee8cc1Swenshuai.xi     {
8737*53ee8cc1Swenshuai.xi         if (pCCInfo->b608InfoEnhance==0)
8738*53ee8cc1Swenshuai.xi         {   // for original cc-608 data dump, 16bytes/pkt
8739*53ee8cc1Swenshuai.xi 
8740*53ee8cc1Swenshuai.xi 
8741*53ee8cc1Swenshuai.xi             u32Pad = (*pu32Dst608Len) & 0x7;
8742*53ee8cc1Swenshuai.xi             if(u32Pad) u32Pad = 8 - u32Pad;
8743*53ee8cc1Swenshuai.xi 
8744*53ee8cc1Swenshuai.xi             if((u32Pad + (*pu32Dst608Len)) > MAX_608_CC_LEN)
8745*53ee8cc1Swenshuai.xi             {
8746*53ee8cc1Swenshuai.xi                 HVD_EX_MSG_ERR("u32Dst608Len:%d + u32Pad: %d is larger than MAX_608_CC_LEN !! \n",(*pu32Dst608Len), u32Pad);
8747*53ee8cc1Swenshuai.xi                 return;
8748*53ee8cc1Swenshuai.xi             }
8749*53ee8cc1Swenshuai.xi             for(i=0;i<u32Pad;i++)
8750*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = 0xff;
8751*53ee8cc1Swenshuai.xi         }
8752*53ee8cc1Swenshuai.xi     }
8753*53ee8cc1Swenshuai.xi 
8754*53ee8cc1Swenshuai.xi 
8755*53ee8cc1Swenshuai.xi }
8756*53ee8cc1Swenshuai.xi 
8757*53ee8cc1Swenshuai.xi 
_HVD_EX_CC_Extract_CCdata(MS_U32 u32Id,MS_U8 * pDst608Buf,MS_U32 * pu32Dst608Len,MS_U8 * pDst708Buf,MS_U32 * pu32Dst708Len,DTV_BUF_type * pUserData)8758*53ee8cc1Swenshuai.xi static void _HVD_EX_CC_Extract_CCdata(MS_U32 u32Id, MS_U8 *pDst608Buf ,MS_U32 *pu32Dst608Len,MS_U8 *pDst708Buf ,MS_U32 *pu32Dst708Len, DTV_BUF_type* pUserData)
8759*53ee8cc1Swenshuai.xi {
8760*53ee8cc1Swenshuai.xi 
8761*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8762*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8763*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
8764*53ee8cc1Swenshuai.xi 
8765*53ee8cc1Swenshuai.xi 
8766*53ee8cc1Swenshuai.xi 
8767*53ee8cc1Swenshuai.xi     MS_U8 * pUserDataStartBuf = &pUserData->buf[0];//&pSrcBuf[0];
8768*53ee8cc1Swenshuai.xi     MS_U8 * pUserDataBuf;
8769*53ee8cc1Swenshuai.xi 
8770*53ee8cc1Swenshuai.xi     pUserDataBuf = &pUserData->buf[0];
8771*53ee8cc1Swenshuai.xi 
8772*53ee8cc1Swenshuai.xi 
8773*53ee8cc1Swenshuai.xi     HVD_CC_608EnhanceInfo stEhInfo608;
8774*53ee8cc1Swenshuai.xi     stEhInfo608.u16TmpRef = pUserData->u16TempRefCnt;
8775*53ee8cc1Swenshuai.xi     stEhInfo608.u16PicStruct = (MS_U16)pUserData->pic_struct;
8776*53ee8cc1Swenshuai.xi     stEhInfo608.u32Pts = pUserData->pts;
8777*53ee8cc1Swenshuai.xi     stEhInfo608.u8UsrDataCnt = 0;
8778*53ee8cc1Swenshuai.xi 
8779*53ee8cc1Swenshuai.xi 
8780*53ee8cc1Swenshuai.xi     {
8781*53ee8cc1Swenshuai.xi         MS_U32 dvb_code;
8782*53ee8cc1Swenshuai.xi 
8783*53ee8cc1Swenshuai.xi         dvb_code = (*pUserDataBuf << 24) | (*(pUserDataBuf+1) << 16) | (*(pUserDataBuf+2) << 8) | *(pUserDataBuf+3); //(u_f(16,"provider_code") << 16) | u_f(16,"provider_code");
8784*53ee8cc1Swenshuai.xi         pUserDataBuf += 4;
8785*53ee8cc1Swenshuai.xi 
8786*53ee8cc1Swenshuai.xi         if (dvb_code == DTV_DTB1_CODE)
8787*53ee8cc1Swenshuai.xi         {
8788*53ee8cc1Swenshuai.xi             MS_U8 code;
8789*53ee8cc1Swenshuai.xi 
8790*53ee8cc1Swenshuai.xi             code = *pUserDataBuf++; //u_f(8,"code");
8791*53ee8cc1Swenshuai.xi 
8792*53ee8cc1Swenshuai.xi             if (code == DTV_CC_CODE)
8793*53ee8cc1Swenshuai.xi             {
8794*53ee8cc1Swenshuai.xi                 _HVD_EX_CC_Parse_CC_data(u32Id, pCCInfo->u8ParsingStatus,&pUserDataBuf, pDst608Buf, pu32Dst608Len, pDst708Buf, pu32Dst708Len, &stEhInfo608);
8795*53ee8cc1Swenshuai.xi             }
8796*53ee8cc1Swenshuai.xi             else if (code == DTV_BAR_CODE)
8797*53ee8cc1Swenshuai.xi             {
8798*53ee8cc1Swenshuai.xi                 _HVD_EX_CC_Parse_BAR_data(&pUserDataBuf);
8799*53ee8cc1Swenshuai.xi             }
8800*53ee8cc1Swenshuai.xi 
8801*53ee8cc1Swenshuai.xi         }
8802*53ee8cc1Swenshuai.xi         else if (dvb_code == DTV_AFD_CODE)
8803*53ee8cc1Swenshuai.xi         {
8804*53ee8cc1Swenshuai.xi             _HVD_EX_CC_Parse_AFD_data(&pUserDataBuf);
8805*53ee8cc1Swenshuai.xi         }
8806*53ee8cc1Swenshuai.xi 
8807*53ee8cc1Swenshuai.xi     }
8808*53ee8cc1Swenshuai.xi 
8809*53ee8cc1Swenshuai.xi 
8810*53ee8cc1Swenshuai.xi     if((pUserDataBuf - pUserDataStartBuf) > pUserData->len)
8811*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("ERROR!!!!  (pUserDataBuf - pUserDataStartBuf) > u32SrcLen\n");
8812*53ee8cc1Swenshuai.xi 
8813*53ee8cc1Swenshuai.xi 
8814*53ee8cc1Swenshuai.xi }
8815*53ee8cc1Swenshuai.xi 
8816*53ee8cc1Swenshuai.xi 
_HVD_EX_CC_RB_Have_Avail_Space(MS_U32 u32Id,MS_U8 u8CC608,MS_U32 u32QuerySize)8817*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_EX_CC_RB_Have_Avail_Space(MS_U32 u32Id, MS_U8 u8CC608, MS_U32 u32QuerySize)
8818*53ee8cc1Swenshuai.xi {
8819*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8820*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8821*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
8822*53ee8cc1Swenshuai.xi 
8823*53ee8cc1Swenshuai.xi     MS_U32 u32RingBufVacancy = pCCInfo->u32RingBufVacancy[u8CC608];
8824*53ee8cc1Swenshuai.xi     MS_U32 u32AlignCCLen;
8825*53ee8cc1Swenshuai.xi 
8826*53ee8cc1Swenshuai.xi     if ((u32QuerySize % HVD_CCRB_PACKET_LENGTH) != 0)
8827*53ee8cc1Swenshuai.xi     {
8828*53ee8cc1Swenshuai.xi         u32AlignCCLen = HVD_CCRB_PACKET_LENGTH * ((u32QuerySize / HVD_CCRB_PACKET_LENGTH)+1);
8829*53ee8cc1Swenshuai.xi     }
8830*53ee8cc1Swenshuai.xi     else
8831*53ee8cc1Swenshuai.xi     {
8832*53ee8cc1Swenshuai.xi         u32AlignCCLen = u32QuerySize;
8833*53ee8cc1Swenshuai.xi     }
8834*53ee8cc1Swenshuai.xi 
8835*53ee8cc1Swenshuai.xi 
8836*53ee8cc1Swenshuai.xi     if(u32RingBufVacancy >= u32AlignCCLen)
8837*53ee8cc1Swenshuai.xi         return TRUE;
8838*53ee8cc1Swenshuai.xi     else
8839*53ee8cc1Swenshuai.xi         return FALSE;
8840*53ee8cc1Swenshuai.xi 
8841*53ee8cc1Swenshuai.xi 
8842*53ee8cc1Swenshuai.xi }
8843*53ee8cc1Swenshuai.xi 
_HVD_EX_CC_Copy_CCdata_To_RB(MS_U32 u32Id,MS_U8 u8CC608,MS_U8 * pSrcBuf,MS_U32 u32SrcLen)8844*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_EX_CC_Copy_CCdata_To_RB(MS_U32 u32Id, MS_U8 u8CC608,MS_U8 *pSrcBuf, MS_U32 u32SrcLen)
8845*53ee8cc1Swenshuai.xi {
8846*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8847*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8848*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
8849*53ee8cc1Swenshuai.xi 
8850*53ee8cc1Swenshuai.xi     MS_U32 u32RingBufRPAddr = pCCInfo->u32RingBufRPAddr[u8CC608];
8851*53ee8cc1Swenshuai.xi     MS_U32 u32RingBufWPAddr = pCCInfo->u32RingBufWPAddr[u8CC608];
8852*53ee8cc1Swenshuai.xi     MS_U32 u32AlignCCLen;
8853*53ee8cc1Swenshuai.xi 
8854*53ee8cc1Swenshuai.xi 
8855*53ee8cc1Swenshuai.xi 
8856*53ee8cc1Swenshuai.xi     if(u32SrcLen == 0)
8857*53ee8cc1Swenshuai.xi         return FALSE;
8858*53ee8cc1Swenshuai.xi 
8859*53ee8cc1Swenshuai.xi 
8860*53ee8cc1Swenshuai.xi 
8861*53ee8cc1Swenshuai.xi     u32AlignCCLen = u32SrcLen;
8862*53ee8cc1Swenshuai.xi 
8863*53ee8cc1Swenshuai.xi 
8864*53ee8cc1Swenshuai.xi     if(pCCInfo->u32RingBufVacancy[u8CC608] < u32AlignCCLen)
8865*53ee8cc1Swenshuai.xi     {
8866*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("overflow !!!, u32RingBufVacancy: %d, u32AlignLen: %d\n",pCCInfo->u32RingBufVacancy[u8CC608], u32AlignCCLen);
8867*53ee8cc1Swenshuai.xi         return TRUE;
8868*53ee8cc1Swenshuai.xi     }
8869*53ee8cc1Swenshuai.xi 
8870*53ee8cc1Swenshuai.xi 
8871*53ee8cc1Swenshuai.xi     if(u32RingBufWPAddr >= u32RingBufRPAddr)
8872*53ee8cc1Swenshuai.xi     {
8873*53ee8cc1Swenshuai.xi         if( (u32RingBufWPAddr + u32AlignCCLen) <= (pCCInfo->u32RingBufStartPAddr[u8CC608] + pCCInfo->u32RingBufLen[u8CC608]))
8874*53ee8cc1Swenshuai.xi         {
8875*53ee8cc1Swenshuai.xi 
8876*53ee8cc1Swenshuai.xi             HVD_memcpy((void *)(HVD_PA2VA(u32RingBufWPAddr)), (void *)pSrcBuf, u32AlignCCLen);
8877*53ee8cc1Swenshuai.xi 
8878*53ee8cc1Swenshuai.xi 
8879*53ee8cc1Swenshuai.xi             if((pCCInfo->u32RingBufWPAddr[u8CC608] + u32AlignCCLen) == (pCCInfo->u32RingBufStartPAddr[u8CC608] + pCCInfo->u32RingBufLen[u8CC608]))
8880*53ee8cc1Swenshuai.xi                 pCCInfo->u32RingBufWPAddr[u8CC608] = pCCInfo->u32RingBufStartPAddr[u8CC608];
8881*53ee8cc1Swenshuai.xi             else
8882*53ee8cc1Swenshuai.xi                 pCCInfo->u32RingBufWPAddr[u8CC608] += u32AlignCCLen;
8883*53ee8cc1Swenshuai.xi 
8884*53ee8cc1Swenshuai.xi             pCCInfo->u32RingBufVacancy[u8CC608] -= u32AlignCCLen;
8885*53ee8cc1Swenshuai.xi 
8886*53ee8cc1Swenshuai.xi         }
8887*53ee8cc1Swenshuai.xi         else
8888*53ee8cc1Swenshuai.xi         {
8889*53ee8cc1Swenshuai.xi             MS_U32 part1_len = (pCCInfo->u32RingBufStartPAddr[u8CC608] + pCCInfo->u32RingBufLen[u8CC608]) - u32RingBufWPAddr;
8890*53ee8cc1Swenshuai.xi             MS_U32 part2_len = u32AlignCCLen - part1_len;
8891*53ee8cc1Swenshuai.xi 
8892*53ee8cc1Swenshuai.xi 
8893*53ee8cc1Swenshuai.xi 
8894*53ee8cc1Swenshuai.xi 
8895*53ee8cc1Swenshuai.xi             {
8896*53ee8cc1Swenshuai.xi 
8897*53ee8cc1Swenshuai.xi 
8898*53ee8cc1Swenshuai.xi                 HVD_memcpy((void *)(HVD_PA2VA(u32RingBufWPAddr)),(void *)pSrcBuf, part1_len);
8899*53ee8cc1Swenshuai.xi 
8900*53ee8cc1Swenshuai.xi                 pCCInfo->u32RingBufWPAddr[u8CC608] = u32RingBufWPAddr = pCCInfo->u32RingBufStartPAddr[u8CC608];
8901*53ee8cc1Swenshuai.xi 
8902*53ee8cc1Swenshuai.xi                 HVD_memcpy((void *)(HVD_PA2VA(u32RingBufWPAddr)),(void *)(&pSrcBuf[part1_len]), part2_len);
8903*53ee8cc1Swenshuai.xi 
8904*53ee8cc1Swenshuai.xi                 pCCInfo->u32RingBufWPAddr[u8CC608] = u32RingBufWPAddr = pCCInfo->u32RingBufStartPAddr[u8CC608] + part2_len;
8905*53ee8cc1Swenshuai.xi                 pCCInfo->u32RingBufVacancy[u8CC608] -= u32AlignCCLen;
8906*53ee8cc1Swenshuai.xi             }
8907*53ee8cc1Swenshuai.xi 
8908*53ee8cc1Swenshuai.xi         }
8909*53ee8cc1Swenshuai.xi 
8910*53ee8cc1Swenshuai.xi     }
8911*53ee8cc1Swenshuai.xi     else
8912*53ee8cc1Swenshuai.xi     {
8913*53ee8cc1Swenshuai.xi 
8914*53ee8cc1Swenshuai.xi 
8915*53ee8cc1Swenshuai.xi         {
8916*53ee8cc1Swenshuai.xi 
8917*53ee8cc1Swenshuai.xi             HVD_memcpy((void *)(HVD_PA2VA(u32RingBufWPAddr)), (void *)pSrcBuf, u32AlignCCLen);
8918*53ee8cc1Swenshuai.xi             pCCInfo->u32RingBufWPAddr[u8CC608] += u32AlignCCLen;
8919*53ee8cc1Swenshuai.xi             pCCInfo->u32RingBufVacancy[u8CC608] -= u32AlignCCLen;
8920*53ee8cc1Swenshuai.xi         }
8921*53ee8cc1Swenshuai.xi 
8922*53ee8cc1Swenshuai.xi 
8923*53ee8cc1Swenshuai.xi     }
8924*53ee8cc1Swenshuai.xi 
8925*53ee8cc1Swenshuai.xi     return FALSE;
8926*53ee8cc1Swenshuai.xi }
8927*53ee8cc1Swenshuai.xi 
_HVD_EX_CC_Add_PaddingData_To_608(MS_U32 u32Id,MS_U8 * pSrcBuf,MS_U32 u32SrcLen)8928*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_EX_CC_Add_PaddingData_To_608(MS_U32 u32Id, MS_U8 *pSrcBuf, MS_U32 u32SrcLen)
8929*53ee8cc1Swenshuai.xi {
8930*53ee8cc1Swenshuai.xi 
8931*53ee8cc1Swenshuai.xi     MS_U32 u32AlignCCLen;
8932*53ee8cc1Swenshuai.xi     MS_U32 i;
8933*53ee8cc1Swenshuai.xi     MS_BOOL b608OverFlow;
8934*53ee8cc1Swenshuai.xi 
8935*53ee8cc1Swenshuai.xi     if ((u32SrcLen % HVD_CCRB_PACKET_LENGTH) != 0)
8936*53ee8cc1Swenshuai.xi     {
8937*53ee8cc1Swenshuai.xi         u32AlignCCLen = HVD_CCRB_PACKET_LENGTH * ((u32SrcLen / HVD_CCRB_PACKET_LENGTH)+1);
8938*53ee8cc1Swenshuai.xi     }
8939*53ee8cc1Swenshuai.xi     else
8940*53ee8cc1Swenshuai.xi     {
8941*53ee8cc1Swenshuai.xi         u32AlignCCLen = u32SrcLen;
8942*53ee8cc1Swenshuai.xi     }
8943*53ee8cc1Swenshuai.xi 
8944*53ee8cc1Swenshuai.xi 
8945*53ee8cc1Swenshuai.xi 
8946*53ee8cc1Swenshuai.xi     if(u32AlignCCLen > MAX_608_CC_LEN)
8947*53ee8cc1Swenshuai.xi     {
8948*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("u32AlignCCLen:%d > MAX_608_CC_LEN", u32AlignCCLen);
8949*53ee8cc1Swenshuai.xi         return TRUE;
8950*53ee8cc1Swenshuai.xi     }
8951*53ee8cc1Swenshuai.xi 
8952*53ee8cc1Swenshuai.xi 
8953*53ee8cc1Swenshuai.xi 
8954*53ee8cc1Swenshuai.xi     for(i =0; i < (u32AlignCCLen-u32SrcLen);i++)
8955*53ee8cc1Swenshuai.xi         pSrcBuf[u32SrcLen+i] = 0xff;// add padinng data
8956*53ee8cc1Swenshuai.xi 
8957*53ee8cc1Swenshuai.xi     b608OverFlow =_HVD_EX_CC_Copy_CCdata_To_RB(u32Id, 1, &(pSrcBuf[0]), u32AlignCCLen);
8958*53ee8cc1Swenshuai.xi     return b608OverFlow;
8959*53ee8cc1Swenshuai.xi 
8960*53ee8cc1Swenshuai.xi }
8961*53ee8cc1Swenshuai.xi 
_HVD_EX_CC_Add_PaddingData_To_708(MS_U32 u32Id,MS_U8 * pSrcBuf,MS_U32 u32SrcLen)8962*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_EX_CC_Add_PaddingData_To_708(MS_U32 u32Id, MS_U8 *pSrcBuf, MS_U32 u32SrcLen)
8963*53ee8cc1Swenshuai.xi {
8964*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8965*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8966*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
8967*53ee8cc1Swenshuai.xi 
8968*53ee8cc1Swenshuai.xi     MS_VIRT *u32RingBufWAddr = (MS_VIRT *)(HVD_PA2VA(pCCInfo->u32RingBufWPAddr[0]));
8969*53ee8cc1Swenshuai.xi 
8970*53ee8cc1Swenshuai.xi     MS_U8  u8CC_Type, u8CC_Data1, u8CC_Data2,u8Temp;
8971*53ee8cc1Swenshuai.xi     MS_U16 i,j,u16Pad,u16DataCount;
8972*53ee8cc1Swenshuai.xi     MS_U8  *pAddr;
8973*53ee8cc1Swenshuai.xi     MS_U8 u8CCPading[MAX_708_CC_LEN];
8974*53ee8cc1Swenshuai.xi     MS_BOOL b708OverFlow = FALSE;
8975*53ee8cc1Swenshuai.xi     u16DataCount = 0;
8976*53ee8cc1Swenshuai.xi 
8977*53ee8cc1Swenshuai.xi     for(j=0;j<u32SrcLen;j+=4)
8978*53ee8cc1Swenshuai.xi     {
8979*53ee8cc1Swenshuai.xi         u8CC_Data1 = *pSrcBuf++;
8980*53ee8cc1Swenshuai.xi         u8CC_Data2 = *pSrcBuf++;
8981*53ee8cc1Swenshuai.xi         u8CC_Type  = *pSrcBuf++;
8982*53ee8cc1Swenshuai.xi         u8Temp     = *pSrcBuf++;
8983*53ee8cc1Swenshuai.xi 
8984*53ee8cc1Swenshuai.xi         if(u8CC_Type==3) //padd_out();
8985*53ee8cc1Swenshuai.xi         {
8986*53ee8cc1Swenshuai.xi             if( pCCInfo->u32PktLen708 > 0 )
8987*53ee8cc1Swenshuai.xi             {
8988*53ee8cc1Swenshuai.xi                 u16Pad = pCCInfo->u32PktLen708;
8989*53ee8cc1Swenshuai.xi                 for (i=0;i<u16Pad;i++)
8990*53ee8cc1Swenshuai.xi                     u8CCPading[u16DataCount++] = 0xff;
8991*53ee8cc1Swenshuai.xi                 pCCInfo->u32PktLen708 = 0;
8992*53ee8cc1Swenshuai.xi #if 1
8993*53ee8cc1Swenshuai.xi 
8994*53ee8cc1Swenshuai.xi                 pAddr = (MS_U8 *)pCCInfo->u32PktHdrAddr708;
8995*53ee8cc1Swenshuai.xi                 if(pAddr)
8996*53ee8cc1Swenshuai.xi                 {
8997*53ee8cc1Swenshuai.xi                     u8Temp = *pAddr;
8998*53ee8cc1Swenshuai.xi                     u16Pad = (u8Temp&0x3f)<<1;
8999*53ee8cc1Swenshuai.xi                     if((i!=0)&&(u16Pad > i))
9000*53ee8cc1Swenshuai.xi                     {
9001*53ee8cc1Swenshuai.xi                         i = i>>1;
9002*53ee8cc1Swenshuai.xi                         u8Temp = u8Temp - i;
9003*53ee8cc1Swenshuai.xi                         *pAddr = (u8Temp&0xff);
9004*53ee8cc1Swenshuai.xi                     }
9005*53ee8cc1Swenshuai.xi                 }
9006*53ee8cc1Swenshuai.xi #endif
9007*53ee8cc1Swenshuai.xi             }
9008*53ee8cc1Swenshuai.xi 
9009*53ee8cc1Swenshuai.xi             u16Pad = (pCCInfo->u32RingBufWPAddr[0] + u16DataCount) & 7;
9010*53ee8cc1Swenshuai.xi             if(u16Pad) u16Pad = HVD_CCRB_PACKET_LENGTH-u16Pad;
9011*53ee8cc1Swenshuai.xi             for(i=0;i<u16Pad;i++)
9012*53ee8cc1Swenshuai.xi                 u8CCPading[u16DataCount++] = 0xff;
9013*53ee8cc1Swenshuai.xi 
9014*53ee8cc1Swenshuai.xi 
9015*53ee8cc1Swenshuai.xi             b708OverFlow =_HVD_EX_CC_Copy_CCdata_To_RB(u32Id, 0, u8CCPading, u16DataCount);
9016*53ee8cc1Swenshuai.xi             if(b708OverFlow)
9017*53ee8cc1Swenshuai.xi                 return TRUE;
9018*53ee8cc1Swenshuai.xi             pCCInfo->u32PktLen708 = (u8CC_Data1 & 0x3f)*2;
9019*53ee8cc1Swenshuai.xi             if(pCCInfo->u32PktLen708 == 0) pCCInfo->u32PktLen708 = 128;
9020*53ee8cc1Swenshuai.xi             u16DataCount = 0;
9021*53ee8cc1Swenshuai.xi 
9022*53ee8cc1Swenshuai.xi             pCCInfo->u32PktHdrAddr708 = (MS_VIRT)(u32RingBufWAddr);
9023*53ee8cc1Swenshuai.xi         }
9024*53ee8cc1Swenshuai.xi 
9025*53ee8cc1Swenshuai.xi         if(pCCInfo->u32PktLen708 > 0)
9026*53ee8cc1Swenshuai.xi         {
9027*53ee8cc1Swenshuai.xi             u8CCPading[u16DataCount++] = u8CC_Data1;
9028*53ee8cc1Swenshuai.xi             u8CCPading[u16DataCount++] = u8CC_Data2;
9029*53ee8cc1Swenshuai.xi             pCCInfo->u32PktLen708 = pCCInfo->u32PktLen708 - 2;
9030*53ee8cc1Swenshuai.xi         }
9031*53ee8cc1Swenshuai.xi         else
9032*53ee8cc1Swenshuai.xi         {
9033*53ee8cc1Swenshuai.xi             pCCInfo->u32PktLen708 = 0;
9034*53ee8cc1Swenshuai.xi         }
9035*53ee8cc1Swenshuai.xi     }
9036*53ee8cc1Swenshuai.xi 
9037*53ee8cc1Swenshuai.xi     if(u16DataCount > 0)
9038*53ee8cc1Swenshuai.xi     {
9039*53ee8cc1Swenshuai.xi         if( pCCInfo->u32PktLen708 ==0 )
9040*53ee8cc1Swenshuai.xi         {
9041*53ee8cc1Swenshuai.xi             u16Pad = (pCCInfo->u32RingBufWPAddr[0] + u16DataCount) & 7;
9042*53ee8cc1Swenshuai.xi             if(u16Pad) u16Pad = HVD_CCRB_PACKET_LENGTH-u16Pad;
9043*53ee8cc1Swenshuai.xi             for(i=0;i<u16Pad;i++)
9044*53ee8cc1Swenshuai.xi                 u8CCPading[u16DataCount++] = 0xff;
9045*53ee8cc1Swenshuai.xi 
9046*53ee8cc1Swenshuai.xi         }
9047*53ee8cc1Swenshuai.xi 
9048*53ee8cc1Swenshuai.xi         b708OverFlow = _HVD_EX_CC_Copy_CCdata_To_RB(u32Id, 0, u8CCPading, u16DataCount);
9049*53ee8cc1Swenshuai.xi         if(b708OverFlow)
9050*53ee8cc1Swenshuai.xi             return TRUE;
9051*53ee8cc1Swenshuai.xi     }
9052*53ee8cc1Swenshuai.xi 
9053*53ee8cc1Swenshuai.xi     return FALSE;
9054*53ee8cc1Swenshuai.xi 
9055*53ee8cc1Swenshuai.xi }
9056*53ee8cc1Swenshuai.xi 
9057*53ee8cc1Swenshuai.xi 
9058*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
9059*53ee8cc1Swenshuai.xi /// Closed Caption Driver Initialization
9060*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_Init(MS_U32 u32Id)9061*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CC_Init(MS_U32 u32Id)
9062*53ee8cc1Swenshuai.xi {
9063*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
9064*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9065*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
9066*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
9067*53ee8cc1Swenshuai.xi 
9068*53ee8cc1Swenshuai.xi 
9069*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
9070*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
9071*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
9072*53ee8cc1Swenshuai.xi 
9073*53ee8cc1Swenshuai.xi     pCCInfo->u8UserDataMode = (USER_DATA_MODE_DIRECTTV_CC|USER_DATA_MODE_ATSC_CC_RAW);
9074*53ee8cc1Swenshuai.xi 
9075*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SET_USERDATA_MODE, pCCInfo->u8UserDataMode);
9076*53ee8cc1Swenshuai.xi 
9077*53ee8cc1Swenshuai.xi     if (pCCInfo->u8ParsingStatus == 0xff)
9078*53ee8cc1Swenshuai.xi         pCCInfo->u8ParsingStatus = 0x00;
9079*53ee8cc1Swenshuai.xi 
9080*53ee8cc1Swenshuai.xi     //eRet = E_HVD_OK;
9081*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9082*53ee8cc1Swenshuai.xi }
9083*53ee8cc1Swenshuai.xi 
9084*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
9085*53ee8cc1Swenshuai.xi /// Set Closed Caption config
9086*53ee8cc1Swenshuai.xi /// @param u8Operation \b IN Digital Closed Caption Type
9087*53ee8cc1Swenshuai.xi /// @param u16BufferSize \b IN buffer size of the given hardware parser
9088*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
9089*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
9090*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
9091*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_SetCfg(MS_U32 u32Id,MS_U8 u8Operation,MS_U16 u16BufferSize,MS_U8 u8CC608)9092*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CC_SetCfg(MS_U32 u32Id, MS_U8 u8Operation, MS_U16 u16BufferSize, MS_U8 u8CC608)
9093*53ee8cc1Swenshuai.xi {
9094*53ee8cc1Swenshuai.xi 
9095*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
9096*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9097*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
9098*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
9099*53ee8cc1Swenshuai.xi 
9100*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
9101*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
9102*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
9103*53ee8cc1Swenshuai.xi 
9104*53ee8cc1Swenshuai.xi 
9105*53ee8cc1Swenshuai.xi 
9106*53ee8cc1Swenshuai.xi     pCCInfo->u32RingBufLen[u8CC608] =  pCCInfo->u32RingBufVacancy[u8CC608] = u16BufferSize;
9107*53ee8cc1Swenshuai.xi     pCCInfo->u8ParsingStatus |= u8Operation;
9108*53ee8cc1Swenshuai.xi     pCCInfo->u8ParsingStatus &= 0x07;
9109*53ee8cc1Swenshuai.xi 
9110*53ee8cc1Swenshuai.xi     HVD_EX_MSG_DBG("u8Operation: %x, u16BufferSize:%x, u8CC608:%d\n",u8Operation, u16BufferSize,u8CC608);
9111*53ee8cc1Swenshuai.xi 
9112*53ee8cc1Swenshuai.xi 
9113*53ee8cc1Swenshuai.xi     if (u8CC608==0x00)
9114*53ee8cc1Swenshuai.xi         pCCInfo->b708Enable = TRUE;
9115*53ee8cc1Swenshuai.xi 
9116*53ee8cc1Swenshuai.xi     eRet = E_HVD_EX_OK;
9117*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9118*53ee8cc1Swenshuai.xi 
9119*53ee8cc1Swenshuai.xi }
9120*53ee8cc1Swenshuai.xi 
9121*53ee8cc1Swenshuai.xi 
9122*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
9123*53ee8cc1Swenshuai.xi /// Set HVD Ring Buffer's Start Address
9124*53ee8cc1Swenshuai.xi /// @param u32StartAddress \b IN Ring Buffer's Address
9125*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
9126*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
9127*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
9128*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_Set_RB_StartAddr(MS_U32 u32Id,MS_PHY u32StartPAddress,MS_U8 u8CC608)9129*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CC_Set_RB_StartAddr(MS_U32 u32Id, MS_PHY u32StartPAddress, MS_U8 u8CC608)
9130*53ee8cc1Swenshuai.xi {
9131*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
9132*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9133*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
9134*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
9135*53ee8cc1Swenshuai.xi 
9136*53ee8cc1Swenshuai.xi     MS_U8 u8MiuSel;
9137*53ee8cc1Swenshuai.xi     MS_U32 u32StartOffset;
9138*53ee8cc1Swenshuai.xi 
9139*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
9140*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
9141*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
9142*53ee8cc1Swenshuai.xi 
9143*53ee8cc1Swenshuai.xi     _phy_to_miu_offset(u8MiuSel,u32StartOffset,u32StartPAddress);
9144*53ee8cc1Swenshuai.xi 
9145*53ee8cc1Swenshuai.xi     pCCInfo->u8BufMiuSel[u8CC608] = u8MiuSel;
9146*53ee8cc1Swenshuai.xi     /*
9147*53ee8cc1Swenshuai.xi     if ( (u32StartPAddress  &  pCtrl->MemMap.u32MIU1BaseAddr) == pCtrl->MemMap.u32MIU1BaseAddr)
9148*53ee8cc1Swenshuai.xi     {
9149*53ee8cc1Swenshuai.xi         pCCInfo->bBufMiu1[u8CC608] = TRUE;
9150*53ee8cc1Swenshuai.xi     }
9151*53ee8cc1Swenshuai.xi     else
9152*53ee8cc1Swenshuai.xi     {
9153*53ee8cc1Swenshuai.xi         pCCInfo->bBufMiu1[u8CC608] = FALSE;
9154*53ee8cc1Swenshuai.xi     }*/
9155*53ee8cc1Swenshuai.xi 
9156*53ee8cc1Swenshuai.xi 
9157*53ee8cc1Swenshuai.xi     HVD_EX_MSG_DBG("u32StartPAddress: 0x%lx ,u8CC608: 0x%x, pCCInfo->u8BufMiuSel[u8CC608]: %d, pCtrl->MemMap.u32MIU1BaseAddr: 0x%lx, pCtrl->MemMap.u32MIU2BaseAddr: 0x%lx\n",
9158*53ee8cc1Swenshuai.xi         (unsigned long)u32StartPAddress , u8CC608,pCCInfo->u8BufMiuSel[u8CC608], (unsigned long)pCtrl->MemMap.u32MIU1BaseAddr, (unsigned long)pCtrl->MemMap.u32MIU2BaseAddr);
9159*53ee8cc1Swenshuai.xi 
9160*53ee8cc1Swenshuai.xi 
9161*53ee8cc1Swenshuai.xi     pCCInfo->u32RingBufStartPAddr[u8CC608] = pCCInfo->u32RingBufRPAddr[u8CC608] = pCCInfo->u32RingBufWPAddr[u8CC608] = u32StartPAddress;
9162*53ee8cc1Swenshuai.xi     if(pCCInfo->u32RingBufLen[u8CC608] > 0)
9163*53ee8cc1Swenshuai.xi         pCCInfo->u32RingBufVacancy[u8CC608] = pCCInfo->u32RingBufLen[u8CC608];
9164*53ee8cc1Swenshuai.xi 
9165*53ee8cc1Swenshuai.xi 
9166*53ee8cc1Swenshuai.xi     _HVD_EX_CC_Update_UserData_Wptr(u32Id);
9167*53ee8cc1Swenshuai.xi     pCCInfo->u32FWUsrDataRIdx = /*pCCInfo->u32FWUsrDataPrevWIdx =*/ pCCInfo->u32FWUsrDataWIdx;
9168*53ee8cc1Swenshuai.xi 
9169*53ee8cc1Swenshuai.xi 
9170*53ee8cc1Swenshuai.xi     eRet = E_HVD_EX_OK;
9171*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9172*53ee8cc1Swenshuai.xi 
9173*53ee8cc1Swenshuai.xi }
9174*53ee8cc1Swenshuai.xi 
9175*53ee8cc1Swenshuai.xi 
9176*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
9177*53ee8cc1Swenshuai.xi /// Set HVD Ring Buffer's Read Address as Write Address
9178*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
9179*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
9180*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
9181*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_SyncRB_RdAddr2WrAddr(MS_U32 u32Id,MS_U8 u8CC608)9182*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CC_SyncRB_RdAddr2WrAddr(MS_U32 u32Id, MS_U8 u8CC608)
9183*53ee8cc1Swenshuai.xi {
9184*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
9185*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9186*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
9187*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
9188*53ee8cc1Swenshuai.xi 
9189*53ee8cc1Swenshuai.xi 
9190*53ee8cc1Swenshuai.xi     pCCInfo->u32RingBufRPAddr[u8CC608] = pCCInfo->u32RingBufWPAddr[u8CC608];//u32ReadAddress;
9191*53ee8cc1Swenshuai.xi     _HVD_EX_CC_Update_UserData_Wptr(u32Id);
9192*53ee8cc1Swenshuai.xi     pCCInfo->u32FWUsrDataRIdx = pCCInfo->u32FWUsrDataWIdx;
9193*53ee8cc1Swenshuai.xi     if(pCCInfo->u32RingBufLen[u8CC608] > 0)
9194*53ee8cc1Swenshuai.xi         pCCInfo->u32RingBufVacancy[u8CC608] = pCCInfo->u32RingBufLen[u8CC608];
9195*53ee8cc1Swenshuai.xi     eRet = E_HVD_EX_OK;
9196*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9197*53ee8cc1Swenshuai.xi 
9198*53ee8cc1Swenshuai.xi }
9199*53ee8cc1Swenshuai.xi 
9200*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
9201*53ee8cc1Swenshuai.xi /// Advance Read Address of HVD CC Ring Buffer by u32EachPacketSize
9202*53ee8cc1Swenshuai.xi /// @param u32EachPacketSize \b IN
9203*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
9204*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
9205*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
9206*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_Adv_RB_ReadAddr(MS_U32 u32Id,MS_U32 u32EachPacketSize,MS_U8 u8CC608)9207*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CC_Adv_RB_ReadAddr(MS_U32 u32Id, MS_U32 u32EachPacketSize, MS_U8 u8CC608)
9208*53ee8cc1Swenshuai.xi {
9209*53ee8cc1Swenshuai.xi 
9210*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_FAIL;
9211*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9212*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
9213*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
9214*53ee8cc1Swenshuai.xi 
9215*53ee8cc1Swenshuai.xi     MS_U32 u32ParsedDataSize;
9216*53ee8cc1Swenshuai.xi 
9217*53ee8cc1Swenshuai.xi     // Get the Parsed Data Size
9218*53ee8cc1Swenshuai.xi     if ((u32EachPacketSize % HVD_CCRB_PACKET_LENGTH) != 0)
9219*53ee8cc1Swenshuai.xi     {
9220*53ee8cc1Swenshuai.xi         u32ParsedDataSize = HVD_CCRB_PACKET_LENGTH * ((u32EachPacketSize / HVD_CCRB_PACKET_LENGTH)+1); //HVD_CCRB_PACKET_LENGTH bytes alignment
9221*53ee8cc1Swenshuai.xi     }
9222*53ee8cc1Swenshuai.xi     else
9223*53ee8cc1Swenshuai.xi     {
9224*53ee8cc1Swenshuai.xi         u32ParsedDataSize = u32EachPacketSize;
9225*53ee8cc1Swenshuai.xi     }
9226*53ee8cc1Swenshuai.xi 
9227*53ee8cc1Swenshuai.xi     if(u32ParsedDataSize > (pCCInfo->u32RingBufLen[u8CC608] - pCCInfo->u32RingBufVacancy[u8CC608]))
9228*53ee8cc1Swenshuai.xi     {
9229*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("MDrv_HVD_CC_Adv_RB_ReadAddr fail!, no enough data!, vacancy: %d, u32ParsedDataSize: %d, u32RingBufLen:%d, u32RingBufRPAddr: 0x%lx, u32RingBufWPAddr: 0x%lx\n",
9230*53ee8cc1Swenshuai.xi                         pCCInfo->u32RingBufVacancy[u8CC608], u32ParsedDataSize, pCCInfo->u32RingBufLen[u8CC608], (unsigned long)pCCInfo->u32RingBufRPAddr[u8CC608],(unsigned long)pCCInfo->u32RingBufWPAddr[u8CC608]);
9231*53ee8cc1Swenshuai.xi         return E_HVD_EX_FAIL;
9232*53ee8cc1Swenshuai.xi     }
9233*53ee8cc1Swenshuai.xi 
9234*53ee8cc1Swenshuai.xi 
9235*53ee8cc1Swenshuai.xi     if ((pCCInfo->u32RingBufRPAddr[u8CC608] + u32ParsedDataSize) < (pCCInfo->u32RingBufStartPAddr[u8CC608] + pCCInfo->u32RingBufLen[u8CC608]))
9236*53ee8cc1Swenshuai.xi     {
9237*53ee8cc1Swenshuai.xi         pCCInfo->u32RingBufRPAddr[u8CC608] += u32ParsedDataSize;
9238*53ee8cc1Swenshuai.xi     }
9239*53ee8cc1Swenshuai.xi     else
9240*53ee8cc1Swenshuai.xi     {
9241*53ee8cc1Swenshuai.xi         pCCInfo->u32RingBufRPAddr[u8CC608] = (u32ParsedDataSize + pCCInfo->u32RingBufRPAddr[u8CC608] - pCCInfo->u32RingBufLen[u8CC608]);
9242*53ee8cc1Swenshuai.xi     }
9243*53ee8cc1Swenshuai.xi 
9244*53ee8cc1Swenshuai.xi     pCCInfo->u32RingBufVacancy[u8CC608] += u32ParsedDataSize ;
9245*53ee8cc1Swenshuai.xi 
9246*53ee8cc1Swenshuai.xi     eRet = E_HVD_EX_OK;
9247*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9248*53ee8cc1Swenshuai.xi 
9249*53ee8cc1Swenshuai.xi }
9250*53ee8cc1Swenshuai.xi 
9251*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
9252*53ee8cc1Swenshuai.xi /// Stop HVD CC parsing
9253*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
9254*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
9255*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
9256*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_DisableParsing(MS_U32 u32Id,MS_U8 u8CC608)9257*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CC_DisableParsing(MS_U32 u32Id, MS_U8 u8CC608)
9258*53ee8cc1Swenshuai.xi {
9259*53ee8cc1Swenshuai.xi 
9260*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
9261*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9262*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
9263*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
9264*53ee8cc1Swenshuai.xi 
9265*53ee8cc1Swenshuai.xi     if (u8CC608==0)
9266*53ee8cc1Swenshuai.xi     {
9267*53ee8cc1Swenshuai.xi         pCCInfo->u8ParsingStatus &= ~0x04;
9268*53ee8cc1Swenshuai.xi         pCCInfo->b708Enable = FALSE;
9269*53ee8cc1Swenshuai.xi     }
9270*53ee8cc1Swenshuai.xi     else
9271*53ee8cc1Swenshuai.xi         pCCInfo->u8ParsingStatus &= ~0x03;
9272*53ee8cc1Swenshuai.xi 
9273*53ee8cc1Swenshuai.xi     pCCInfo->u8ParsingStatus &= 0x07;
9274*53ee8cc1Swenshuai.xi 
9275*53ee8cc1Swenshuai.xi     eRet = E_HVD_EX_OK;
9276*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9277*53ee8cc1Swenshuai.xi }
9278*53ee8cc1Swenshuai.xi 
9279*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_CC_GetInfo(MS_U32 u32Id,MS_U32 selector,MS_U8 type,MS_U32 * p1,MS_U32 * p2)9280*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CC_GetInfo(MS_U32 u32Id, MS_U32 selector, MS_U8 type, MS_U32 *p1, MS_U32 *p2)
9281*53ee8cc1Swenshuai.xi {
9282*53ee8cc1Swenshuai.xi 
9283*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
9284*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9285*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
9286*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
9287*53ee8cc1Swenshuai.xi 
9288*53ee8cc1Swenshuai.xi     // Functionality select
9289*53ee8cc1Swenshuai.xi     switch (selector)
9290*53ee8cc1Swenshuai.xi     {
9291*53ee8cc1Swenshuai.xi         case HVD_EX_CC_SELECTOR_708_SW:
9292*53ee8cc1Swenshuai.xi             *p1 = (MS_U32)pCCInfo->b708Enable;
9293*53ee8cc1Swenshuai.xi             break;
9294*53ee8cc1Swenshuai.xi 
9295*53ee8cc1Swenshuai.xi #if defined( MSOS_TYPE_LINUX )
9296*53ee8cc1Swenshuai.xi         case HVD_EX_CC_SELECTOR_RINGBUFFER:
9297*53ee8cc1Swenshuai.xi             {
9298*53ee8cc1Swenshuai.xi                 MS_U32 u32PAddr;
9299*53ee8cc1Swenshuai.xi                 u32PAddr = pCCInfo->u32RingBufStartPAddr[type];
9300*53ee8cc1Swenshuai.xi                 *p1 = u32PAddr;
9301*53ee8cc1Swenshuai.xi                 *p2 = (MS_U32) pCCInfo->u32RingBufLen[type];
9302*53ee8cc1Swenshuai.xi             }
9303*53ee8cc1Swenshuai.xi             break;
9304*53ee8cc1Swenshuai.xi #endif
9305*53ee8cc1Swenshuai.xi 
9306*53ee8cc1Swenshuai.xi         default:
9307*53ee8cc1Swenshuai.xi             *p1 = *p2 = 0;
9308*53ee8cc1Swenshuai.xi             break;
9309*53ee8cc1Swenshuai.xi     }
9310*53ee8cc1Swenshuai.xi     eRet = E_HVD_EX_OK;
9311*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9312*53ee8cc1Swenshuai.xi }
9313*53ee8cc1Swenshuai.xi 
9314*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_CC_IsHvdRstDone(MS_U32 u32Id,MS_U8 type)9315*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_CC_IsHvdRstDone(MS_U32 u32Id, MS_U8 type)
9316*53ee8cc1Swenshuai.xi {
9317*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
9318*53ee8cc1Swenshuai.xi 
9319*53ee8cc1Swenshuai.xi     bRet = TRUE;
9320*53ee8cc1Swenshuai.xi 
9321*53ee8cc1Swenshuai.xi     return bRet;
9322*53ee8cc1Swenshuai.xi }
9323*53ee8cc1Swenshuai.xi 
9324*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
9325*53ee8cc1Swenshuai.xi /// Get Overflow Status of HVD CC Ring Buffer
9326*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
9327*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
9328*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
9329*53ee8cc1Swenshuai.xi /// Return value:: Overflow Status Flag
9330*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_GetOverflowStatus(MS_U32 u32Id,MS_U8 u8CC608)9331*53ee8cc1Swenshuai.xi MS_U8 MDrv_HVD_EX_CC_GetOverflowStatus(MS_U32 u32Id, MS_U8 u8CC608)
9332*53ee8cc1Swenshuai.xi {
9333*53ee8cc1Swenshuai.xi 
9334*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9335*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
9336*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
9337*53ee8cc1Swenshuai.xi 
9338*53ee8cc1Swenshuai.xi     MS_BOOL bOverFlow = pCCInfo->bOverFlow[u8CC608];
9339*53ee8cc1Swenshuai.xi     pCCInfo->bOverFlow[u8CC608] = FALSE;
9340*53ee8cc1Swenshuai.xi     return (bOverFlow);
9341*53ee8cc1Swenshuai.xi }
9342*53ee8cc1Swenshuai.xi 
9343*53ee8cc1Swenshuai.xi 
9344*53ee8cc1Swenshuai.xi 
9345*53ee8cc1Swenshuai.xi 
9346*53ee8cc1Swenshuai.xi 
9347*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
9348*53ee8cc1Swenshuai.xi /// Get Write Address of HVD CC Ring Buffer
9349*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
9350*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
9351*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
9352*53ee8cc1Swenshuai.xi /// Return value:: Write Address
9353*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_Get_RB_WriteAddr(MS_U32 u32Id,MS_U8 u8CC608)9354*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_CC_Get_RB_WriteAddr(MS_U32 u32Id, MS_U8 u8CC608)
9355*53ee8cc1Swenshuai.xi {
9356*53ee8cc1Swenshuai.xi 
9357*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9358*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
9359*53ee8cc1Swenshuai.xi     MS_U32 u32UserDataIdxSize = 0;
9360*53ee8cc1Swenshuai.xi     MS_U32 u32UsrDataIdxWptr = 0xFFFFFFFF;
9361*53ee8cc1Swenshuai.xi     MS_U32 u32UserDataSize = 0;
9362*53ee8cc1Swenshuai.xi     MS_VIRT u32UserDataAddr = 0;
9363*53ee8cc1Swenshuai.xi     DTV_BUF_type* pHVD_User_Data = NULL;
9364*53ee8cc1Swenshuai.xi 
9365*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
9366*53ee8cc1Swenshuai.xi     MS_U32 u32FwParseCnt;
9367*53ee8cc1Swenshuai.xi     MS_U32 u32PAddr;
9368*53ee8cc1Swenshuai.xi 
9369*53ee8cc1Swenshuai.xi 
9370*53ee8cc1Swenshuai.xi     if ((pCCInfo->u8ParsingStatus == 0xff) || (pCCInfo->u8ParsingStatus == 0x00))
9371*53ee8cc1Swenshuai.xi     {
9372*53ee8cc1Swenshuai.xi 
9373*53ee8cc1Swenshuai.xi          u32PAddr = pCCInfo->u32RingBufWPAddr[u8CC608];
9374*53ee8cc1Swenshuai.xi         /*
9375*53ee8cc1Swenshuai.xi         if(!pCCInfo->bBufMiu1[u8CC608])
9376*53ee8cc1Swenshuai.xi             u32PAddr = u32PAddr & (pCtrl->MemMap.u32MIU1BaseAddr - 1);
9377*53ee8cc1Swenshuai.xi         */
9378*53ee8cc1Swenshuai.xi         if(pCCInfo->u8BufMiuSel[u8CC608] == E_CHIP_MIU_0)
9379*53ee8cc1Swenshuai.xi             u32PAddr = u32PAddr & (pCtrl->MemMap.u32MIU1BaseAddr - 1);
9380*53ee8cc1Swenshuai.xi 
9381*53ee8cc1Swenshuai.xi 
9382*53ee8cc1Swenshuai.xi         return u32PAddr;
9383*53ee8cc1Swenshuai.xi     }
9384*53ee8cc1Swenshuai.xi 
9385*53ee8cc1Swenshuai.xi     u32UserDataIdxSize = (MS_U32)HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_IDX_TBL_SIZE);
9386*53ee8cc1Swenshuai.xi 
9387*53ee8cc1Swenshuai.xi     u32UsrDataIdxWptr =_HVD_EX_CC_Update_UserData_Wptr(u32Id);
9388*53ee8cc1Swenshuai.xi 
9389*53ee8cc1Swenshuai.xi 
9390*53ee8cc1Swenshuai.xi 
9391*53ee8cc1Swenshuai.xi     if (pCCInfo->u32FWUsrDataRIdx == u32UsrDataIdxWptr)
9392*53ee8cc1Swenshuai.xi     {
9393*53ee8cc1Swenshuai.xi         // User Data Buffer Empty
9394*53ee8cc1Swenshuai.xi         HVD_EX_MSG_DBG("RIdx(%d) == WIdx(%d) , empty !!!\n", pCCInfo->u32FWUsrDataRIdx,u32UsrDataIdxWptr);
9395*53ee8cc1Swenshuai.xi         u32PAddr = pCCInfo->u32RingBufWPAddr[u8CC608];
9396*53ee8cc1Swenshuai.xi 
9397*53ee8cc1Swenshuai.xi         if(pCCInfo->u8BufMiuSel[u8CC608] == E_CHIP_MIU_0)
9398*53ee8cc1Swenshuai.xi             u32PAddr = u32PAddr & (pCtrl->MemMap.u32MIU1BaseAddr - 1);
9399*53ee8cc1Swenshuai.xi 
9400*53ee8cc1Swenshuai.xi         return u32PAddr;
9401*53ee8cc1Swenshuai.xi 
9402*53ee8cc1Swenshuai.xi     }
9403*53ee8cc1Swenshuai.xi     else if (u32UsrDataIdxWptr > pCCInfo->u32FWUsrDataRIdx)
9404*53ee8cc1Swenshuai.xi     {
9405*53ee8cc1Swenshuai.xi         u32FwParseCnt = u32UsrDataIdxWptr - pCCInfo->u32FWUsrDataRIdx;
9406*53ee8cc1Swenshuai.xi     }
9407*53ee8cc1Swenshuai.xi     else// pCCInfo->u32FWUsrDataWIdx < pCCInfo->u32FWUsrDataRIdx
9408*53ee8cc1Swenshuai.xi     {
9409*53ee8cc1Swenshuai.xi         u32FwParseCnt =  u32UserDataIdxSize - (pCCInfo->u32FWUsrDataRIdx - u32UsrDataIdxWptr);
9410*53ee8cc1Swenshuai.xi     }
9411*53ee8cc1Swenshuai.xi 
9412*53ee8cc1Swenshuai.xi     HVD_EX_MSG_DBG("u32FwParseCnt(%d)  !!!,  pCCInfo->u32RingBufWPAddr[%d]: 0x%lx\n", u32FwParseCnt, u8CC608,(unsigned long)pCCInfo->u32RingBufWPAddr[u8CC608] );
9413*53ee8cc1Swenshuai.xi 
9414*53ee8cc1Swenshuai.xi     MS_BOOL b608OverFlow = FALSE, b708OverFlow = FALSE;
9415*53ee8cc1Swenshuai.xi     MS_U8 *pCC608buf = &(pCCInfo->u8CC608buf[0]);
9416*53ee8cc1Swenshuai.xi     MS_U8 *pCC708buf = &(pCCInfo->u8CC708buf[0]);
9417*53ee8cc1Swenshuai.xi     MS_U32 u32CC608Len = 0;
9418*53ee8cc1Swenshuai.xi     MS_U32 u32CC708Len = 0;
9419*53ee8cc1Swenshuai.xi 
9420*53ee8cc1Swenshuai.xi 
9421*53ee8cc1Swenshuai.xi 
9422*53ee8cc1Swenshuai.xi 
9423*53ee8cc1Swenshuai.xi     while(u32FwParseCnt)
9424*53ee8cc1Swenshuai.xi     {
9425*53ee8cc1Swenshuai.xi 
9426*53ee8cc1Swenshuai.xi 
9427*53ee8cc1Swenshuai.xi 
9428*53ee8cc1Swenshuai.xi         if( (!_HVD_EX_CC_RB_Have_Avail_Space(u32Id, 1, MAX_608_CC_LEN)) || (!_HVD_EX_CC_RB_Have_Avail_Space(u32Id, 0, MAX_708_CC_LEN)))
9429*53ee8cc1Swenshuai.xi         {
9430*53ee8cc1Swenshuai.xi             HVD_EX_MSG_DBG("not have available space!!!\n");
9431*53ee8cc1Swenshuai.xi             break;
9432*53ee8cc1Swenshuai.xi         }
9433*53ee8cc1Swenshuai.xi         u32UserDataAddr = MDrv_HVD_EX_GetUserData_Packet(u32Id, pCCInfo->u32FWUsrDataRIdx, (MS_U32*)&u32UserDataSize);
9434*53ee8cc1Swenshuai.xi         u32UserDataAddr += pCtrl->MemMap.u32CodeBufVAddr; // change to virtual address
9435*53ee8cc1Swenshuai.xi 
9436*53ee8cc1Swenshuai.xi         pHVD_User_Data = (DTV_BUF_type*)u32UserDataAddr;
9437*53ee8cc1Swenshuai.xi 
9438*53ee8cc1Swenshuai.xi         u32CC608Len  = 0;
9439*53ee8cc1Swenshuai.xi         u32CC708Len  = 0;
9440*53ee8cc1Swenshuai.xi 
9441*53ee8cc1Swenshuai.xi 
9442*53ee8cc1Swenshuai.xi 
9443*53ee8cc1Swenshuai.xi         _HVD_EX_CC_Extract_CCdata(u32Id, pCC608buf, &u32CC608Len, pCC708buf, &u32CC708Len, pHVD_User_Data);
9444*53ee8cc1Swenshuai.xi 
9445*53ee8cc1Swenshuai.xi         if(u32CC608Len > 0)
9446*53ee8cc1Swenshuai.xi             b608OverFlow =_HVD_EX_CC_Add_PaddingData_To_608(u32Id, &(pCCInfo->u8CC608buf[0]), u32CC608Len);
9447*53ee8cc1Swenshuai.xi 
9448*53ee8cc1Swenshuai.xi 
9449*53ee8cc1Swenshuai.xi 
9450*53ee8cc1Swenshuai.xi 
9451*53ee8cc1Swenshuai.xi         if(u32CC708Len > 0)
9452*53ee8cc1Swenshuai.xi             b708OverFlow = _HVD_EX_CC_Add_PaddingData_To_708(u32Id, &(pCCInfo->u8CC708buf[0]), u32CC708Len);
9453*53ee8cc1Swenshuai.xi             //b708OverFlow =_HVD_CC_Copy_CCdata_To_RB(0, &CC708buf[0], u32CC708Len);
9454*53ee8cc1Swenshuai.xi 
9455*53ee8cc1Swenshuai.xi 
9456*53ee8cc1Swenshuai.xi 
9457*53ee8cc1Swenshuai.xi 
9458*53ee8cc1Swenshuai.xi         if(b608OverFlow)
9459*53ee8cc1Swenshuai.xi         {
9460*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("##### Critical error!!!! b608OverFlow: %d!!!\n",b608OverFlow);
9461*53ee8cc1Swenshuai.xi             pCCInfo->bOverFlow[1] = TRUE;
9462*53ee8cc1Swenshuai.xi         }
9463*53ee8cc1Swenshuai.xi 
9464*53ee8cc1Swenshuai.xi         if(b708OverFlow)
9465*53ee8cc1Swenshuai.xi         {
9466*53ee8cc1Swenshuai.xi             HVD_EX_MSG_ERR("##### Critical error!!!! b708OverFlow:%d !!!\n",b708OverFlow);
9467*53ee8cc1Swenshuai.xi             pCCInfo->bOverFlow[0] = TRUE;
9468*53ee8cc1Swenshuai.xi         }
9469*53ee8cc1Swenshuai.xi 
9470*53ee8cc1Swenshuai.xi 
9471*53ee8cc1Swenshuai.xi 
9472*53ee8cc1Swenshuai.xi         pCCInfo->u32FWUsrDataRIdx++;
9473*53ee8cc1Swenshuai.xi 
9474*53ee8cc1Swenshuai.xi         if (pCCInfo->u32FWUsrDataRIdx >= u32UserDataIdxSize)
9475*53ee8cc1Swenshuai.xi         {
9476*53ee8cc1Swenshuai.xi             pCCInfo->u32FWUsrDataRIdx = 0;
9477*53ee8cc1Swenshuai.xi         }
9478*53ee8cc1Swenshuai.xi 
9479*53ee8cc1Swenshuai.xi 
9480*53ee8cc1Swenshuai.xi         u32FwParseCnt--;
9481*53ee8cc1Swenshuai.xi     }
9482*53ee8cc1Swenshuai.xi 
9483*53ee8cc1Swenshuai.xi 
9484*53ee8cc1Swenshuai.xi     u32PAddr = pCCInfo->u32RingBufWPAddr[u8CC608];
9485*53ee8cc1Swenshuai.xi     if(pCCInfo->u8BufMiuSel[u8CC608] == E_CHIP_MIU_0)
9486*53ee8cc1Swenshuai.xi             u32PAddr = u32PAddr & (pCtrl->MemMap.u32MIU1BaseAddr - 1);
9487*53ee8cc1Swenshuai.xi 
9488*53ee8cc1Swenshuai.xi     return u32PAddr;
9489*53ee8cc1Swenshuai.xi 
9490*53ee8cc1Swenshuai.xi 
9491*53ee8cc1Swenshuai.xi 
9492*53ee8cc1Swenshuai.xi }
9493*53ee8cc1Swenshuai.xi 
9494*53ee8cc1Swenshuai.xi 
9495*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
9496*53ee8cc1Swenshuai.xi /// Get Read Address of HVD CC Ring Buffer
9497*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
9498*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
9499*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
9500*53ee8cc1Swenshuai.xi /// Return value:: Read Address
9501*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_Get_RB_ReadAddr(MS_U32 u32Id,MS_U8 u8CC608)9502*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_CC_Get_RB_ReadAddr(MS_U32 u32Id, MS_U8 u8CC608)
9503*53ee8cc1Swenshuai.xi {
9504*53ee8cc1Swenshuai.xi 
9505*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9506*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
9507*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
9508*53ee8cc1Swenshuai.xi 
9509*53ee8cc1Swenshuai.xi     MS_U32 u32PAddr = pCCInfo->u32RingBufRPAddr[u8CC608];
9510*53ee8cc1Swenshuai.xi     if(pCCInfo->u8BufMiuSel[u8CC608] == E_CHIP_MIU_0)
9511*53ee8cc1Swenshuai.xi             u32PAddr = u32PAddr & (pCtrl->MemMap.u32MIU1BaseAddr - 1);
9512*53ee8cc1Swenshuai.xi 
9513*53ee8cc1Swenshuai.xi     return u32PAddr;
9514*53ee8cc1Swenshuai.xi 
9515*53ee8cc1Swenshuai.xi }
9516*53ee8cc1Swenshuai.xi 
9517*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
9518*53ee8cc1Swenshuai.xi /// Enhance CC info mode, only support cc608
9519*53ee8cc1Swenshuai.xi /// @param bEnable \b IN
9520*53ee8cc1Swenshuai.xi ///   - # TRUE for enhance to dump the pts/tmp_ref info
9521*53ee8cc1Swenshuai.xi ///   - # FALSE for original
9522*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_InfoEnhanceMode(MS_U32 u32Id,MS_BOOL bEnable)9523*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_CC_InfoEnhanceMode(MS_U32 u32Id, MS_BOOL bEnable)
9524*53ee8cc1Swenshuai.xi {
9525*53ee8cc1Swenshuai.xi 
9526*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9527*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
9528*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
9529*53ee8cc1Swenshuai.xi 
9530*53ee8cc1Swenshuai.xi     pCCInfo->b608InfoEnhance = bEnable;
9531*53ee8cc1Swenshuai.xi 
9532*53ee8cc1Swenshuai.xi     return TRUE;
9533*53ee8cc1Swenshuai.xi }
9534*53ee8cc1Swenshuai.xi 
9535*53ee8cc1Swenshuai.xi 
9536*53ee8cc1Swenshuai.xi 
9537*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_SetExternal_CC608_Buffer(MS_U32 u32Id,MS_PHY u32Addr,MS_U32 u32Len)9538*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetExternal_CC608_Buffer(MS_U32 u32Id, MS_PHY u32Addr, MS_U32 u32Len)
9539*53ee8cc1Swenshuai.xi {
9540*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
9541*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9542*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
9543*53ee8cc1Swenshuai.xi     MS_U8 u8UserDataMode = (USER_DATA_MODE_DIRECTTV_CC|USER_DATA_MODE_ATSC_CC_RAW|USER_DATA_MODE_EXTERNAL_CC_BUFFER);
9544*53ee8cc1Swenshuai.xi     MS_U32 u32CCinfo;
9545*53ee8cc1Swenshuai.xi 
9546*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
9547*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
9548*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
9549*53ee8cc1Swenshuai.xi 
9550*53ee8cc1Swenshuai.xi     u32Addr <<= 10;// 1kbytes unit
9551*53ee8cc1Swenshuai.xi     u32Len  <<= 10; // 1kbytes unit
9552*53ee8cc1Swenshuai.xi 
9553*53ee8cc1Swenshuai.xi     // Read Ptr (4 bytes), Write Ptr (4 bytes), Latch Bit (2 bytes), overflow (2 bytes), Miu Base Address (4 bytes)
9554*53ee8cc1Swenshuai.xi     MS_U32 *u32ReadPtr = (MS_U32 *)(HVD_PA2VA(u32Addr));
9555*53ee8cc1Swenshuai.xi     MS_U32 *u32WritePtr = (MS_U32 *)(HVD_PA2VA(u32Addr+4));
9556*53ee8cc1Swenshuai.xi     MS_U32 *u32LatchOverflow = (MS_U32 *)(HVD_PA2VA(u32Addr+8));
9557*53ee8cc1Swenshuai.xi     MS_U32 *u32FWBinaryAddr = (MS_U32 *)(HVD_PA2VA(u32Addr+12));
9558*53ee8cc1Swenshuai.xi 
9559*53ee8cc1Swenshuai.xi     *u32ReadPtr = *u32WritePtr = u32Addr+EXT_608_CC_DATA_ALIGN;
9560*53ee8cc1Swenshuai.xi     *u32LatchOverflow = 0;
9561*53ee8cc1Swenshuai.xi 
9562*53ee8cc1Swenshuai.xi 
9563*53ee8cc1Swenshuai.xi     u32Addr -= pCtrl->MemMap.u32FWBinaryAddr;
9564*53ee8cc1Swenshuai.xi     *u32FWBinaryAddr = pCtrl->MemMap.u32FWBinaryAddr;
9565*53ee8cc1Swenshuai.xi 
9566*53ee8cc1Swenshuai.xi     u32CCinfo =  ((u32Addr >> 10) << 8) & 0xffffff00; //arg[31:8] * 1kbytes
9567*53ee8cc1Swenshuai.xi     u32CCinfo |= ((u32Len >> 10) & 0xff); //arg[7:0] *1kbytes
9568*53ee8cc1Swenshuai.xi 
9569*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SET_USERDATA_MODE, u8UserDataMode);
9570*53ee8cc1Swenshuai.xi 
9571*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ENABLE_EXTERNAL_CC_608_BUF, u32CCinfo);
9572*53ee8cc1Swenshuai.xi 
9573*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9574*53ee8cc1Swenshuai.xi 
9575*53ee8cc1Swenshuai.xi 
9576*53ee8cc1Swenshuai.xi }
9577*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_SetExternal_CC708_Buffer(MS_U32 u32Id,MS_PHY u32Addr,MS_U32 u32Len)9578*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetExternal_CC708_Buffer(MS_U32 u32Id, MS_PHY u32Addr, MS_U32 u32Len)
9579*53ee8cc1Swenshuai.xi {
9580*53ee8cc1Swenshuai.xi 
9581*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
9582*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9583*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
9584*53ee8cc1Swenshuai.xi     MS_U8 u8UserDataMode = (USER_DATA_MODE_DIRECTTV_CC|USER_DATA_MODE_ATSC_CC_RAW|USER_DATA_MODE_EXTERNAL_CC_BUFFER);
9585*53ee8cc1Swenshuai.xi     MS_U32 u32CCinfo;
9586*53ee8cc1Swenshuai.xi 
9587*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
9588*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
9589*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
9590*53ee8cc1Swenshuai.xi 
9591*53ee8cc1Swenshuai.xi     u32Addr <<= 10;// 1kbytes unit
9592*53ee8cc1Swenshuai.xi     u32Len  <<= 10; // 1kbytes unit
9593*53ee8cc1Swenshuai.xi 
9594*53ee8cc1Swenshuai.xi     // Read Ptr (4 bytes), Write Ptr (4 bytes), Latch Bit (2 bytes), overflow (2 bytes), Miu Base Address (4 bytes)
9595*53ee8cc1Swenshuai.xi     MS_U32 *u32ReadPtr = (MS_U32 *)(HVD_PA2VA(u32Addr));
9596*53ee8cc1Swenshuai.xi     MS_U32 *u32WritePtr = (MS_U32 *)(HVD_PA2VA(u32Addr+4));
9597*53ee8cc1Swenshuai.xi     MS_U32 *u32LatchOverflow = (MS_U32 *)(HVD_PA2VA(u32Addr+8));
9598*53ee8cc1Swenshuai.xi     MS_U32 *u32FWBinaryAddr = (MS_U32 *)(HVD_PA2VA(u32Addr+12));
9599*53ee8cc1Swenshuai.xi 
9600*53ee8cc1Swenshuai.xi 
9601*53ee8cc1Swenshuai.xi     MS_U32 i;
9602*53ee8cc1Swenshuai.xi     MS_U8 *u8ResvAddr = (MS_U8 *)((HVD_PA2VA(u32Addr))+EXT_CC_INFO_LENGTH);
9603*53ee8cc1Swenshuai.xi     for(i=0;i< (EXT_708_CC_DATA_ALIGN- EXT_CC_INFO_LENGTH) ;i++)
9604*53ee8cc1Swenshuai.xi     {
9605*53ee8cc1Swenshuai.xi         u8ResvAddr[i] = 0xff;
9606*53ee8cc1Swenshuai.xi     }
9607*53ee8cc1Swenshuai.xi 
9608*53ee8cc1Swenshuai.xi 
9609*53ee8cc1Swenshuai.xi 
9610*53ee8cc1Swenshuai.xi     *u32ReadPtr  = *u32WritePtr = u32Addr+EXT_708_CC_DATA_ALIGN;
9611*53ee8cc1Swenshuai.xi     *u32LatchOverflow = 0;
9612*53ee8cc1Swenshuai.xi 
9613*53ee8cc1Swenshuai.xi     u32Addr -= pCtrl->MemMap.u32FWBinaryAddr;
9614*53ee8cc1Swenshuai.xi     *u32FWBinaryAddr = pCtrl->MemMap.u32FWBinaryAddr;
9615*53ee8cc1Swenshuai.xi 
9616*53ee8cc1Swenshuai.xi 
9617*53ee8cc1Swenshuai.xi     u32CCinfo =  ((u32Addr >> 10) << 8) & 0xffffff00; //arg[31:8] * 1kbytes
9618*53ee8cc1Swenshuai.xi     u32CCinfo |= ((u32Len >> 10) & 0xff); //arg[7:0] *1kbytes
9619*53ee8cc1Swenshuai.xi 
9620*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SET_USERDATA_MODE, u8UserDataMode);
9621*53ee8cc1Swenshuai.xi 
9622*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ENABLE_EXTERNAL_CC_708_BUF, u32CCinfo);
9623*53ee8cc1Swenshuai.xi 
9624*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9625*53ee8cc1Swenshuai.xi }
9626*53ee8cc1Swenshuai.xi 
9627*53ee8cc1Swenshuai.xi 
9628*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
9629*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_ShowFirstFrameDirect()
9630*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Push First Frame to Display Queue Directly
9631*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
9632*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
9633*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_ShowFirstFrameDirect(MS_U32 u32Id,MS_BOOL bEnable)9634*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_ShowFirstFrameDirect(MS_U32 u32Id, MS_BOOL bEnable)
9635*53ee8cc1Swenshuai.xi {
9636*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
9637*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9638*53ee8cc1Swenshuai.xi 
9639*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
9640*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
9641*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
9642*53ee8cc1Swenshuai.xi 
9643*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SHOW_FIRST_FRAME_DIRECT, bEnable);
9644*53ee8cc1Swenshuai.xi 
9645*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9646*53ee8cc1Swenshuai.xi }
9647*53ee8cc1Swenshuai.xi 
9648*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
9649*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_AVCResizeDosDispPendBuf()
9650*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Resize disp pending buffer size for display outside mode(dos),
9651*53ee8cc1Swenshuai.xi /// @param -u32Size \b IN : size of display pending buffer
9652*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
9653*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_AVCResizeDosDispPendBuf(MS_U32 u32Id,MS_U32 u32Size)9654*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_AVCResizeDosDispPendBuf(MS_U32 u32Id, MS_U32 u32Size)
9655*53ee8cc1Swenshuai.xi {
9656*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
9657*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9658*53ee8cc1Swenshuai.xi 
9659*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
9660*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
9661*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
9662*53ee8cc1Swenshuai.xi 
9663*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AVC_RESIZE_DOS_DISP_PEND_BUF, u32Size);
9664*53ee8cc1Swenshuai.xi 
9665*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9666*53ee8cc1Swenshuai.xi }
9667*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
9668*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDmxFrameRate()
9669*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set the demuxer prefered frame rate.
9670*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : mode type
9671*53ee8cc1Swenshuai.xi /// @return -The result is successful or not
9672*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDmxFrameRate(MS_U32 u32Id,MS_U32 u32Value)9673*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDmxFrameRate(MS_U32 u32Id, MS_U32 u32Value)
9674*53ee8cc1Swenshuai.xi {
9675*53ee8cc1Swenshuai.xi     return (HVD_EX_Result) HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_DMX_FRAMERATE, u32Value);
9676*53ee8cc1Swenshuai.xi }
9677*53ee8cc1Swenshuai.xi 
9678*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
9679*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDmxFrameRateBase()
9680*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set the demuxer prefered frame rate.
9681*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : mode type
9682*53ee8cc1Swenshuai.xi /// @return -The result is successful or not
9683*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDmxFrameRateBase(MS_U32 u32Id,MS_U32 u32Value)9684*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDmxFrameRateBase(MS_U32 u32Id, MS_U32 u32Value)
9685*53ee8cc1Swenshuai.xi {
9686*53ee8cc1Swenshuai.xi     return (HVD_EX_Result) HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_DMX_FRAMERATEBASE, u32Value);
9687*53ee8cc1Swenshuai.xi }
9688*53ee8cc1Swenshuai.xi 
9689*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
9690*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetSupport2ndMVOPInterface()
9691*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get if support 2nd MVOP interface.
9692*53ee8cc1Swenshuai.xi /// @param : none
9693*53ee8cc1Swenshuai.xi /// @return -The result is true or false
9694*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetSupport2ndMVOPInterface(void)9695*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_GetSupport2ndMVOPInterface(void)
9696*53ee8cc1Swenshuai.xi {
9697*53ee8cc1Swenshuai.xi     return HAL_HVD_EX_GetSupport2ndMVOPInterface();
9698*53ee8cc1Swenshuai.xi }
9699*53ee8cc1Swenshuai.xi 
9700*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
9701*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetVPUSecureMode()
9702*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set secure mode for HVD Drv.
9703*53ee8cc1Swenshuai.xi /// @param : none
9704*53ee8cc1Swenshuai.xi /// @return -The result is true or false
9705*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetVPUSecureMode(MS_BOOL bEnable)9706*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_SetVPUSecureMode(MS_BOOL bEnable)
9707*53ee8cc1Swenshuai.xi {
9708*53ee8cc1Swenshuai.xi     pHVDDrvContext->bVPUIsSecureMode = bEnable;
9709*53ee8cc1Swenshuai.xi     return TRUE;
9710*53ee8cc1Swenshuai.xi }
9711*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_OnePendingBufferMode(MS_U32 u32Id,MS_BOOL bEnable)9712*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_OnePendingBufferMode(MS_U32 u32Id,MS_BOOL bEnable)
9713*53ee8cc1Swenshuai.xi {
9714*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_OK;
9715*53ee8cc1Swenshuai.xi 
9716*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9717*53ee8cc1Swenshuai.xi 
9718*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDPreCtrl[u8DrvId].bOnePendingBuffer = bEnable;
9719*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9720*53ee8cc1Swenshuai.xi }
9721*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_TsInBbuMode(MS_U32 u32Id,MS_BOOL bDisable)9722*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_TsInBbuMode(MS_U32 u32Id,MS_BOOL bDisable)
9723*53ee8cc1Swenshuai.xi {
9724*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_OK;
9725*53ee8cc1Swenshuai.xi 
9726*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9727*53ee8cc1Swenshuai.xi 
9728*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDPreCtrl[u8DrvId].bDisableTspInBbuMode = bDisable;
9729*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9730*53ee8cc1Swenshuai.xi }
9731*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_IapGnBufShareBWMode(MS_U32 u32Id,MS_BOOL bEnable,MS_PHY u32IapGnBufAddr,MS_U32 u32IapGnBufSize)9732*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_IapGnBufShareBWMode(MS_U32 u32Id,MS_BOOL bEnable, MS_PHY u32IapGnBufAddr, MS_U32 u32IapGnBufSize)
9733*53ee8cc1Swenshuai.xi {
9734*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_OK;
9735*53ee8cc1Swenshuai.xi 
9736*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9737*53ee8cc1Swenshuai.xi 
9738*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDPreCtrl[u8DrvId].stIapGnShBWMode.bEnable = bEnable;
9739*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDPreCtrl[u8DrvId].stIapGnShBWMode.u32IapGnBufAddr = u32IapGnBufAddr;
9740*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDPreCtrl[u8DrvId].stIapGnShBWMode.u32IapGnBufSize = u32IapGnBufSize;
9741*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9742*53ee8cc1Swenshuai.xi }
9743*53ee8cc1Swenshuai.xi 
9744*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
9745*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_FRC_OnlyShowTopField()
9746*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: enable/disable only show top filed for FRC mode
9747*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN :enable/disable
9748*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
9749*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_FRC_OnlyShowTopField(MS_U32 u32Id,MS_BOOL bEnable)9750*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_FRC_OnlyShowTopField(MS_U32 u32Id, MS_BOOL bEnable)
9751*53ee8cc1Swenshuai.xi {
9752*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_OK;
9753*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9754*53ee8cc1Swenshuai.xi 
9755*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
9756*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
9757*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
9758*53ee8cc1Swenshuai.xi 
9759*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FRC_ONLY_SHOW_TOP_FIELD, bEnable);
9760*53ee8cc1Swenshuai.xi 
9761*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9762*53ee8cc1Swenshuai.xi }
9763*53ee8cc1Swenshuai.xi 
9764*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
9765*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_DisableEsFullStop()
9766*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: enable/disable es full stop mode
9767*53ee8cc1Swenshuai.xi /// @param -bDisable \b IN :enable/disable
9768*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
9769*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_DisableEsFullStop(MS_U32 u32Id,MS_BOOL bDisable)9770*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_DisableEsFullStop(MS_U32 u32Id, MS_BOOL bDisable)
9771*53ee8cc1Swenshuai.xi {
9772*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_OK;
9773*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9774*53ee8cc1Swenshuai.xi 
9775*53ee8cc1Swenshuai.xi     if(bDisable)
9776*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ES_FULL_STOP, FALSE);
9777*53ee8cc1Swenshuai.xi     else
9778*53ee8cc1Swenshuai.xi         eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ES_FULL_STOP, TRUE);
9779*53ee8cc1Swenshuai.xi 
9780*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9781*53ee8cc1Swenshuai.xi }
9782*53ee8cc1Swenshuai.xi 
9783*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
9784*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_DirectSTCMode()
9785*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: enable/disable direct stc mode with u32StcInMs
9786*53ee8cc1Swenshuai.xi /// @param -u32StcInMs \b IN : enable with stc value/disable
9787*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
9788*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_DirectSTCMode(MS_U32 u32Id,MS_U32 u32StcInMs)9789*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_DirectSTCMode(MS_U32 u32Id, MS_U32 u32StcInMs)
9790*53ee8cc1Swenshuai.xi {
9791*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_OK;
9792*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9793*53ee8cc1Swenshuai.xi     HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
9794*53ee8cc1Swenshuai.xi     HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
9795*53ee8cc1Swenshuai.xi 
9796*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
9797*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
9798*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
9799*53ee8cc1Swenshuai.xi 
9800*53ee8cc1Swenshuai.xi     if (HWDEC_EVD_LITE == HAL_HVD_EX_GetCidx(u32Id))
9801*53ee8cc1Swenshuai.xi     {
9802*53ee8cc1Swenshuai.xi         if (u32StcInMs == 0xFFFFFFFF)
9803*53ee8cc1Swenshuai.xi         {
9804*53ee8cc1Swenshuai.xi             HVD_EX_MSG_DBG("[EVD LITE] disable direct stc mode \n");
9805*53ee8cc1Swenshuai.xi             eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIRECT_STC_MODE, FALSE);
9806*53ee8cc1Swenshuai.xi             pCtrl->bDirectSTCModeEnabled = FALSE;
9807*53ee8cc1Swenshuai.xi         }
9808*53ee8cc1Swenshuai.xi         else
9809*53ee8cc1Swenshuai.xi         {
9810*53ee8cc1Swenshuai.xi             pShm->u32DirectStcInMs = u32StcInMs;
9811*53ee8cc1Swenshuai.xi             MsOS_FlushMemory();
9812*53ee8cc1Swenshuai.xi 
9813*53ee8cc1Swenshuai.xi             if (pCtrl->bDirectSTCModeEnabled == FALSE)
9814*53ee8cc1Swenshuai.xi             {
9815*53ee8cc1Swenshuai.xi                 HVD_EX_MSG_DBG("[EVD LITE] enable direct stc mode \n");
9816*53ee8cc1Swenshuai.xi                 eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIRECT_STC_MODE, TRUE);
9817*53ee8cc1Swenshuai.xi                 pCtrl->bDirectSTCModeEnabled = TRUE;
9818*53ee8cc1Swenshuai.xi             }
9819*53ee8cc1Swenshuai.xi         }
9820*53ee8cc1Swenshuai.xi     }
9821*53ee8cc1Swenshuai.xi     else
9822*53ee8cc1Swenshuai.xi     {
9823*53ee8cc1Swenshuai.xi         // only Kano HWDEC_EVD_LITE need this patch
9824*53ee8cc1Swenshuai.xi     }
9825*53ee8cc1Swenshuai.xi 
9826*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9827*53ee8cc1Swenshuai.xi }
9828*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_PreSetMFCodecMode(MS_U32 u32Id,HVD_EX_MFCodec_mode eMFCodecMode)9829*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_PreSetMFCodecMode(MS_U32 u32Id, HVD_EX_MFCodec_mode eMFCodecMode)
9830*53ee8cc1Swenshuai.xi {
9831*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_OK;
9832*53ee8cc1Swenshuai.xi 
9833*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9834*53ee8cc1Swenshuai.xi 
9835*53ee8cc1Swenshuai.xi     switch(eMFCodecMode)
9836*53ee8cc1Swenshuai.xi     {
9837*53ee8cc1Swenshuai.xi         case E_HVD_EX_MFCODEC_DEFAULT:
9838*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDPreCtrl[u8DrvId].eMFCodecMode = E_HVD_DEF_MFCODEC_DEFAULT;
9839*53ee8cc1Swenshuai.xi             break;
9840*53ee8cc1Swenshuai.xi         case E_HVD_EX_MFCODEC_FORCE_ENABLE:
9841*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDPreCtrl[u8DrvId].eMFCodecMode = E_HVD_DEF_MFCODEC_FORCE_ENABLE;
9842*53ee8cc1Swenshuai.xi             break;
9843*53ee8cc1Swenshuai.xi         case E_HVD_EX_MFCODEC_FORCE_DISABLE:
9844*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDPreCtrl[u8DrvId].eMFCodecMode = E_HVD_DEF_MFCODEC_FORCE_DISABLE;
9845*53ee8cc1Swenshuai.xi             break;
9846*53ee8cc1Swenshuai.xi         default:
9847*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDPreCtrl[u8DrvId].eMFCodecMode = E_HVD_DEF_MFCODEC_DEFAULT;
9848*53ee8cc1Swenshuai.xi             break;
9849*53ee8cc1Swenshuai.xi     }
9850*53ee8cc1Swenshuai.xi 
9851*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9852*53ee8cc1Swenshuai.xi }
9853*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_PreSetDisplayMode(MS_U32 u32Id,HVD_EX_Display_mode eDisplayMode)9854*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_PreSetDisplayMode(MS_U32 u32Id, HVD_EX_Display_mode eDisplayMode)
9855*53ee8cc1Swenshuai.xi {
9856*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_OK;
9857*53ee8cc1Swenshuai.xi 
9858*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9859*53ee8cc1Swenshuai.xi 
9860*53ee8cc1Swenshuai.xi     switch(eDisplayMode)
9861*53ee8cc1Swenshuai.xi     {
9862*53ee8cc1Swenshuai.xi         case E_HVD_EX_DISPLAY_MODE_MCU:
9863*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDPreCtrl[u8DrvId].eDisplayMode = E_HVD_DISPLAY_MODE_MCU;
9864*53ee8cc1Swenshuai.xi             _DRV_HVD_SetCtrl(u8DrvId, HVD_CTRL_DISP_OUTSIDE);
9865*53ee8cc1Swenshuai.xi             break;
9866*53ee8cc1Swenshuai.xi         case E_HVD_EX_DISPLAY_MODE_HARDWIRE:
9867*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDPreCtrl[u8DrvId].eDisplayMode = E_HVD_DISPLAY_MODE_HARDWIRE;
9868*53ee8cc1Swenshuai.xi             break;
9869*53ee8cc1Swenshuai.xi         default:
9870*53ee8cc1Swenshuai.xi             pHVDDrvContext->gHVDPreCtrl[u8DrvId].eDisplayMode = E_HVD_DISPLAY_MODE_DEFAULT;
9871*53ee8cc1Swenshuai.xi             break;
9872*53ee8cc1Swenshuai.xi     }
9873*53ee8cc1Swenshuai.xi 
9874*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9875*53ee8cc1Swenshuai.xi }
9876*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_PreSetForce8BitMode(MS_U32 u32Id,MS_BOOL bForce8BitMode)9877*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_PreSetForce8BitMode(MS_U32 u32Id, MS_BOOL bForce8BitMode)
9878*53ee8cc1Swenshuai.xi {
9879*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_OK;
9880*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9881*53ee8cc1Swenshuai.xi 
9882*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDPreCtrl[u8DrvId].bForce8BitMode = bForce8BitMode;
9883*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9884*53ee8cc1Swenshuai.xi }
9885*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_PreSetVdecFeature(MS_U32 u32Id,HVD_EX_Feature eVdecFeature)9886*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_PreSetVdecFeature(MS_U32 u32Id, HVD_EX_Feature eVdecFeature)
9887*53ee8cc1Swenshuai.xi {
9888*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_OK;
9889*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9890*53ee8cc1Swenshuai.xi 
9891*53ee8cc1Swenshuai.xi     pHVDDrvContext->gHVDPreCtrl[u8DrvId].eVdecFeature = eVdecFeature;
9892*53ee8cc1Swenshuai.xi     HVD_EX_MSG_DBG("MDrv_HVD_EX_PreSetVdecFeature 0x%x\n", eVdecFeature);
9893*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9894*53ee8cc1Swenshuai.xi }
9895*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
9896*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetPTSUsecMode()
9897*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: enable/disable PTS output by micro second level,
9898*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN :enable/disable
9899*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
9900*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetPTSUsecMode(MS_U32 u32Id,MS_BOOL bEnable)9901*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetPTSUsecMode(MS_U32 u32Id, MS_BOOL bEnable)
9902*53ee8cc1Swenshuai.xi {
9903*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_OK;
9904*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9905*53ee8cc1Swenshuai.xi 
9906*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
9907*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
9908*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
9909*53ee8cc1Swenshuai.xi 
9910*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SET_PTS_US_MODE, bEnable);
9911*53ee8cc1Swenshuai.xi 
9912*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9913*53ee8cc1Swenshuai.xi }
9914*53ee8cc1Swenshuai.xi 
9915*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
9916*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_PVRTimeShiftSeamlessMode()
9917*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:
9918*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN :
9919*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
9920*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_PVRTimeShiftSeamlessMode(MS_U32 u32Id,MS_U8 u8Arg)9921*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_PVRTimeShiftSeamlessMode(MS_U32 u32Id, MS_U8 u8Arg)
9922*53ee8cc1Swenshuai.xi {
9923*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
9924*53ee8cc1Swenshuai.xi     MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
9925*53ee8cc1Swenshuai.xi 
9926*53ee8cc1Swenshuai.xi     HVD_EX_MSG_TRACE();
9927*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u8DrvId,eRet);
9928*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_Entry(u8DrvId);
9929*53ee8cc1Swenshuai.xi 
9930*53ee8cc1Swenshuai.xi     eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PVR_SEAMLESS_TIMESHIFT, u8Arg);
9931*53ee8cc1Swenshuai.xi 
9932*53ee8cc1Swenshuai.xi     if ((u8Arg == 1) || (u8Arg == 2))  //u8Arg=1 needs about 50ms, u8Arg=2 needs about 30ms
9933*53ee8cc1Swenshuai.xi     {
9934*53ee8cc1Swenshuai.xi         MS_U32 u32Status = (u8Arg==1)?(E_HVD_SEAMLESS_PAUSE_DECODE):(E_HVD_SEAMLESS_RESET_HW_DONE);
9935*53ee8cc1Swenshuai.xi         MS_U32 u32Times = 0;
9936*53ee8cc1Swenshuai.xi 
9937*53ee8cc1Swenshuai.xi         HVD_EX_MSG_DBG("TS Seamless. Arg=%d, polling status start at %d \n", u8Arg, HVD_GetSysTime_ms());
9938*53ee8cc1Swenshuai.xi 
9939*53ee8cc1Swenshuai.xi         while (1)
9940*53ee8cc1Swenshuai.xi         {
9941*53ee8cc1Swenshuai.xi             if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_TS_SEAMLESS_STATUS) & u32Status)
9942*53ee8cc1Swenshuai.xi             {
9943*53ee8cc1Swenshuai.xi                 HVD_EX_MSG_DBG("TS Seamless status change done. Arg=%d. Status=0x%x at %d \n", u8Arg, u32Status, HVD_GetSysTime_ms());
9944*53ee8cc1Swenshuai.xi                 break;
9945*53ee8cc1Swenshuai.xi             }
9946*53ee8cc1Swenshuai.xi 
9947*53ee8cc1Swenshuai.xi             u32Times++;
9948*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
9949*53ee8cc1Swenshuai.xi 
9950*53ee8cc1Swenshuai.xi             if (u32Times > 500)
9951*53ee8cc1Swenshuai.xi             {
9952*53ee8cc1Swenshuai.xi                 HVD_EX_MSG_ERR("Timeout!!! TS Seamless status change is not finished. Arg=%d. Status=0x%x at %d \n", u8Arg, u32Status, HVD_GetSysTime_ms());
9953*53ee8cc1Swenshuai.xi                 eRet = E_HVD_EX_FAIL;
9954*53ee8cc1Swenshuai.xi                 break;
9955*53ee8cc1Swenshuai.xi             }
9956*53ee8cc1Swenshuai.xi         }
9957*53ee8cc1Swenshuai.xi     }
9958*53ee8cc1Swenshuai.xi 
9959*53ee8cc1Swenshuai.xi     if (u8Arg > 0)
9960*53ee8cc1Swenshuai.xi     {
9961*53ee8cc1Swenshuai.xi         pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag = (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & ~HVD_INIT_MAIN_MASK) | HVD_INIT_MAIN_FILE_TS;
9962*53ee8cc1Swenshuai.xi     }
9963*53ee8cc1Swenshuai.xi 
9964*53ee8cc1Swenshuai.xi 
9965*53ee8cc1Swenshuai.xi     if (u8Arg == 2)
9966*53ee8cc1Swenshuai.xi     {
9967*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIS_VDEAD, TRUE);
9968*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_REPEAT_LAST_FIELD, TRUE);
9969*53ee8cc1Swenshuai.xi 
9970*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AVOID_PTS_TBL_OVERFLOW, TRUE);
9971*53ee8cc1Swenshuai.xi 
9972*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DYNAMIC_SCALE_RESV_N_BUFFER, TRUE);
9973*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_CTRL_SPEED_IN_DISP_ONLY, TRUE);
9974*53ee8cc1Swenshuai.xi     }
9975*53ee8cc1Swenshuai.xi 
9976*53ee8cc1Swenshuai.xi     _DRV_HVD_EX_RET(u8DrvId, eRet);
9977*53ee8cc1Swenshuai.xi }
9978*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_CHIP_Capability(void * pHWCap)9979*53ee8cc1Swenshuai.xi MS_U8 MDrv_HVD_EX_CHIP_Capability(void* pHWCap)
9980*53ee8cc1Swenshuai.xi {
9981*53ee8cc1Swenshuai.xi     return HAL_VPU_EX_CHIP_Capability(pHWCap);
9982*53ee8cc1Swenshuai.xi }
9983*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_GetDVSupportProfiles(MS_U32 * pu32DVSupportProfiles)9984*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetDVSupportProfiles(MS_U32 *pu32DVSupportProfiles)
9985*53ee8cc1Swenshuai.xi {
9986*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_FAIL;
9987*53ee8cc1Swenshuai.xi 
9988*53ee8cc1Swenshuai.xi     if (pu32DVSupportProfiles == NULL)
9989*53ee8cc1Swenshuai.xi     {
9990*53ee8cc1Swenshuai.xi         //E_HVD_EX_FAIL
9991*53ee8cc1Swenshuai.xi     }
9992*53ee8cc1Swenshuai.xi     else
9993*53ee8cc1Swenshuai.xi     {
9994*53ee8cc1Swenshuai.xi         *pu32DVSupportProfiles = HAL_HVD_EX_GetDVSupportProfiles();
9995*53ee8cc1Swenshuai.xi         return E_HVD_EX_OK;
9996*53ee8cc1Swenshuai.xi     }
9997*53ee8cc1Swenshuai.xi 
9998*53ee8cc1Swenshuai.xi     return eRet;
9999*53ee8cc1Swenshuai.xi }
10000*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_GetDVSupportHighestLevel(MS_U32 u32DVProfile,MS_U32 * pu32DVLevel)10001*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetDVSupportHighestLevel(MS_U32 u32DVProfile, MS_U32 *pu32DVLevel)
10002*53ee8cc1Swenshuai.xi {
10003*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_FAIL;
10004*53ee8cc1Swenshuai.xi 
10005*53ee8cc1Swenshuai.xi     if (pu32DVLevel == NULL)
10006*53ee8cc1Swenshuai.xi     {
10007*53ee8cc1Swenshuai.xi         //E_HVD_EX_FAIL
10008*53ee8cc1Swenshuai.xi     }
10009*53ee8cc1Swenshuai.xi     else
10010*53ee8cc1Swenshuai.xi     {
10011*53ee8cc1Swenshuai.xi         *pu32DVLevel = HAL_HVD_EX_GetDVSupportHighestLevel(u32DVProfile);
10012*53ee8cc1Swenshuai.xi         eRet = E_HVD_EX_OK;
10013*53ee8cc1Swenshuai.xi     }
10014*53ee8cc1Swenshuai.xi 
10015*53ee8cc1Swenshuai.xi     return eRet;
10016*53ee8cc1Swenshuai.xi }
10017*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_BBU_Proc(MS_U32 u32Id)10018*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_BBU_Proc(MS_U32 u32Id)
10019*53ee8cc1Swenshuai.xi {
10020*53ee8cc1Swenshuai.xi     HAL_HVD_EX_BBU_Proc(u32Id);
10021*53ee8cc1Swenshuai.xi }
MDrv_HVD_EX_BBU_StopProc(MS_U32 u32Id)10022*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_BBU_StopProc(MS_U32 u32Id)
10023*53ee8cc1Swenshuai.xi {
10024*53ee8cc1Swenshuai.xi     HAL_HVD_EX_BBU_StopProc(u32Id);
10025*53ee8cc1Swenshuai.xi }
MDrv_HVD_EX_SetCMAInformation(void * cmaInitParam)10026*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_SetCMAInformation(void* cmaInitParam)
10027*53ee8cc1Swenshuai.xi {
10028*53ee8cc1Swenshuai.xi     pHVDDrvContext->bCMAUsed = TRUE;
10029*53ee8cc1Swenshuai.xi     #if defined(MSOS_TYPE_LINUX) && defined(SUPPORT_CMA)
10030*53ee8cc1Swenshuai.xi     memcpy((void*)(pHVDDrvContext->cmaInitParam),cmaInitParam,sizeof(struct CMA_Pool_Init_Param)*2);
10031*53ee8cc1Swenshuai.xi     #endif
10032*53ee8cc1Swenshuai.xi }
10033*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_GetFrameBufferDefaultSize(HVD_EX_CodecType eCodecType)10034*53ee8cc1Swenshuai.xi MS_SIZE MDrv_HVD_EX_GetFrameBufferDefaultSize(HVD_EX_CodecType eCodecType)
10035*53ee8cc1Swenshuai.xi {
10036*53ee8cc1Swenshuai.xi     return HAL_VPU_EX_GetFrameBufferDefaultSize((VPU_EX_CodecType)eCodecType);
10037*53ee8cc1Swenshuai.xi }
10038*53ee8cc1Swenshuai.xi 
10039*53ee8cc1Swenshuai.xi #ifdef CMA_DRV_DIRECT_INIT
MDrv_HVD_EX_GetCMAMemSize(HVD_EX_CodecType eCodecType,HVD_EX_SrcMode eSrcMode,MS_U64 * offset,MS_SIZE * length,MS_U64 total_length,MS_SIZE unUseSize)10040*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_GetCMAMemSize(HVD_EX_CodecType eCodecType, HVD_EX_SrcMode eSrcMode,
10041*53ee8cc1Swenshuai.xi     MS_U64 *offset, MS_SIZE *length, MS_U64 total_length, MS_SIZE unUseSize)
10042*53ee8cc1Swenshuai.xi {
10043*53ee8cc1Swenshuai.xi     return HAL_VPU_EX_GetCMAMemSize((VPU_EX_CodecType)eCodecType, (VPU_EX_SrcMode)eSrcMode, offset, length, total_length, unUseSize);
10044*53ee8cc1Swenshuai.xi }
10045*53ee8cc1Swenshuai.xi #endif
10046*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_GetFbMemUsageSize(HVD_EX_FbMemUsage_Param * pInfo)10047*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetFbMemUsageSize(HVD_EX_FbMemUsage_Param *pInfo)
10048*53ee8cc1Swenshuai.xi {
10049*53ee8cc1Swenshuai.xi     HVD_EX_Result eRet = E_HVD_EX_FAIL;
10050*53ee8cc1Swenshuai.xi 
10051*53ee8cc1Swenshuai.xi #if SUPPORT_EVD
10052*53ee8cc1Swenshuai.xi     if (pInfo->eCodecType == E_HVD_EX_HEVC)
10053*53ee8cc1Swenshuai.xi     {
10054*53ee8cc1Swenshuai.xi         MS_U32 _u32MemUsageSize = 0;
10055*53ee8cc1Swenshuai.xi         eRet = _HVD_EX_DemuxTS_ParseHEVCSPS(pInfo->u32DataVAddr, pInfo->u16DataSize, &_u32MemUsageSize);
10056*53ee8cc1Swenshuai.xi         if (eRet == E_HVD_EX_OK)
10057*53ee8cc1Swenshuai.xi         {
10058*53ee8cc1Swenshuai.xi             pInfo->u32MemUsageSize = _u32MemUsageSize;
10059*53ee8cc1Swenshuai.xi         }
10060*53ee8cc1Swenshuai.xi     }
10061*53ee8cc1Swenshuai.xi #endif
10062*53ee8cc1Swenshuai.xi     return eRet;
10063*53ee8cc1Swenshuai.xi }
10064*53ee8cc1Swenshuai.xi 
10065*53ee8cc1Swenshuai.xi /******************************************************************************/
10066*53ee8cc1Swenshuai.xi ///Description
10067*53ee8cc1Swenshuai.xi ///@param in \b IN in parameter
10068*53ee8cc1Swenshuai.xi ///@param out \b OUT out parameter
10069*53ee8cc1Swenshuai.xi ///@return status
10070*53ee8cc1Swenshuai.xi /******************************************************************************/
MDrv_HVD_EX_IsDispQueueEmpty(MS_U32 u32Id)10071*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsDispQueueEmpty(MS_U32 u32Id)
10072*53ee8cc1Swenshuai.xi {
10073*53ee8cc1Swenshuai.xi     if(HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_Q_NUMB) == 0)
10074*53ee8cc1Swenshuai.xi         return TRUE;
10075*53ee8cc1Swenshuai.xi     else
10076*53ee8cc1Swenshuai.xi         return FALSE;
10077*53ee8cc1Swenshuai.xi }
10078*53ee8cc1Swenshuai.xi 
10079*53ee8cc1Swenshuai.xi #else
MDrv_HVD_EX_LoadCodeInSecure(MS_U32 addr)10080*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_LoadCodeInSecure(MS_U32 addr)
10081*53ee8cc1Swenshuai.xi {
10082*53ee8cc1Swenshuai.xi     return HAL_VPU_EX_LoadCodeInSecure(addr);
10083*53ee8cc1Swenshuai.xi }
10084*53ee8cc1Swenshuai.xi 
MDrv_HVD_EX_SetLockDownRegister(void * param,MS_U8 u8IsHVD)10085*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_SetLockDownRegister(void* param,MS_U8 u8IsHVD)
10086*53ee8cc1Swenshuai.xi {
10087*53ee8cc1Swenshuai.xi     if(param == NULL)
10088*53ee8cc1Swenshuai.xi     {
10089*53ee8cc1Swenshuai.xi         return FALSE;
10090*53ee8cc1Swenshuai.xi     }
10091*53ee8cc1Swenshuai.xi     return HAL_VPU_EX_SetLockDownRegister(param,u8IsHVD);
10092*53ee8cc1Swenshuai.xi }
10093*53ee8cc1Swenshuai.xi 
10094*53ee8cc1Swenshuai.xi #if (defined(MSOS_TYPE_OPTEE))
MDrv_HVD_EX_OPTEE_SetRegister(void * param)10095*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_OPTEE_SetRegister(void* param)
10096*53ee8cc1Swenshuai.xi {
10097*53ee8cc1Swenshuai.xi     if(param == NULL)
10098*53ee8cc1Swenshuai.xi     {
10099*53ee8cc1Swenshuai.xi         return FALSE;
10100*53ee8cc1Swenshuai.xi     }
10101*53ee8cc1Swenshuai.xi     return HAL_HVD_EX_SetLockDownOpteeRegister(param);
10102*53ee8cc1Swenshuai.xi }
10103*53ee8cc1Swenshuai.xi #endif
10104*53ee8cc1Swenshuai.xi 
10105*53ee8cc1Swenshuai.xi #endif
10106