1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 // Software and any modification/derivatives thereof.
18 // No right, ownership, or interest to MStar Software and any
19 // modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 // supplied together with third party`s software and the use of MStar
23 // Software may require additional licenses from third parties.
24 // Therefore, you hereby agree it is your sole responsibility to separately
25 // obtain any and all third party right and license necessary for your use of
26 // such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 // MStar`s confidential information and you agree to keep MStar`s
30 // confidential information in strictest confidence and not disclose to any
31 // third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 // kind. Any warranties are hereby expressly disclaimed by MStar, including
35 // without limitation, any warranties of merchantability, non-infringement of
36 // intellectual property rights, fitness for a particular purpose, error free
37 // and in conformity with any international standard. You agree to waive any
38 // claim against MStar for any loss, damage, cost or expense that you may
39 // incur related to your use of MStar Software.
40 // In no event shall MStar be liable for any direct, indirect, incidental or
41 // consequential damages, including without limitation, lost of profit or
42 // revenues, lost or damage of data, and unauthorized system use.
43 // You agree that this Section 4 shall still apply without being affected
44 // even if MStar Software has been modified by MStar in accordance with your
45 // request or instruction for your use, except otherwise agreed by both
46 // parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 // services in relation with MStar Software to you for your use of
50 // MStar Software in conjunction with your or your customer`s product
51 // ("Services").
52 // You understand and agree that, except otherwise agreed by both parties in
53 // writing, Services are provided on an "AS IS" basis and the warranty
54 // disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 // or otherwise:
58 // (a) conferring any license or right to use MStar name, trademark, service
59 // mark, symbol or any other identification;
60 // (b) obligating MStar or any of its affiliates to furnish any person,
61 // including without limitation, you and your customers, any assistance
62 // of any kind whatsoever, or any information; or
63 // (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 // of Taiwan, R.O.C., excluding its conflict of law rules.
67 // Any and all dispute arising out hereof or related hereto shall be finally
68 // settled by arbitration referred to the Chinese Arbitration Association,
69 // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 // Rules of the Association by three (3) arbitrators appointed in accordance
71 // with the said Rules.
72 // The place of arbitration shall be in Taipei, Taiwan and the language shall
73 // be English.
74 // The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94
95
96 //-------------------------------------------------------------------------------------------------
97 // Include Files
98 //-------------------------------------------------------------------------------------------------
99 // Common Definition
100 #include <string.h>
101 #include "drvHVD_Common.h"
102
103 // Internal Definition
104 #include "drvHVD_def.h"
105 #include "fwHVD_if.h"
106 #include "halVPU_EX.h"
107 #include "halHVD_EX.h"
108 #include "regHVD_EX.h"
109
110 //-------------------------------------------------------------------------------------------------
111 // Driver Compiler Options
112 //-------------------------------------------------------------------------------------------------
113 #if !defined(MSOS_TYPE_NUTTX) || defined(SUPPORT_X_MODEL_FEATURE)
114
115 //-------------------------------------------------------------------------------------------------
116 // Local Defines
117 //-------------------------------------------------------------------------------------------------
118 #define RV_VLC_TABLE_SIZE 0x20000
119 /* Add for Mobile Platform by Ted Sun */
120 //#define HVD_DISPQ_PREFETCH_COUNT 2
121 #define HVD_FW_MEM_OFFSET 0x100000UL // 1M
122 #define VPU_QMEM_BASE 0x20000000UL
123 #define HVD_HW_MAX_PIXEL (3840*2160*31000ULL) // 4kx2k@30p
124
125 #if 0
126 static HVD_AVC_VUI_DISP_INFO g_hvd_VUIINFO;
127 static MS_U8 g_hvd_nal_fill_pair[2][8] = { {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0} };
128 static MS_U32 u32RV_VLCTableAddr = 0; // offset from Frame buffer start address
129 static MS_U16 _u16DispQPtr = 0;
130 #endif
131
132 //---------------------------------- Mutex settings -----------------------------------------
133 #if HAL_HVD_ENABLE_MUTEX_PROTECT
134 #define _HAL_HVD_MutexCreate() \
135 do \
136 { \
137 if (s32HVDMutexID < 0) \
138 { \
139 s32HVDMutexID = OSAL_HVD_MutexCreate((MS_U8*)(_u8HVD_Mutex)); \
140 } \
141 } while (0)
142
143 #define _HAL_HVD_MutexDelete() \
144 do \
145 { \
146 if (s32HVDMutexID >= 0) \
147 { \
148 OSAL_HVD_MutexDelete(s32HVDMutexID); \
149 s32HVDMutexID = -1; \
150 } \
151 } while (0)
152
153 #define _HAL_HVD_Entry() \
154 do \
155 { \
156 if (s32HVDMutexID >= 0) \
157 { \
158 if (!OSAL_HVD_MutexObtain(s32HVDMutexID, OSAL_HVD_MUTEX_TIMEOUT)) \
159 { \
160 printf("[HAL HVD][%06d] Mutex taking timeout\n", __LINE__); \
161 } \
162 } \
163 } while (0)
164
165 #define _HAL_HVD_Return(_ret_) \
166 do \
167 { \
168 if (s32HVDMutexID >= 0) \
169 { \
170 OSAL_HVD_MutexRelease(s32HVDMutexID); \
171 } \
172 return _ret_; \
173 } while(0)
174
175 #define _HAL_HVD_Release() \
176 do \
177 { \
178 if (s32HVDMutexID >= 0) \
179 { \
180 OSAL_HVD_MutexRelease(s32HVDMutexID); \
181 } \
182 } while (0)
183
184
185 #else // HAL_HVD_ENABLE_MUTEX_PROTECT
186
187 #define _HAL_HVD_MutexCreate()
188 #define _HAL_HVD_MutexDelete()
189 #define _HAL_HVD_Entry()
190 #define _HAL_HVD_Return(_ret) {return _ret;}
191 #define _HAL_HVD_Release()
192
193 #endif // HAL_HVD_ENABLE_MUTEX_PROTECT
194
195 //------------------------------ MIU SETTINGS ----------------------------------
196 #define _MaskMiuReq_MVD_RW( m ) _HVD_WriteRegBit(MIU0_REG_RQ3_MASK, m, BIT(4))
197 #define _MaskMiuReq_MVD_BBU_R( m ) _HVD_WriteRegBit(MIU0_REG_RQ0_MASK+1, m, BIT(4))
198 #define _MaskMiuReq_HVD_RW( m ) _HVD_WriteRegBit(MIU0_REG_RQ3_MASK, m, BIT(2))
199 #define _MaskMiuReq_HVD_BBU_R( m ) _HVD_WriteRegBit(MIU0_REG_RQ3_MASK, m, BIT(1))
200
201 #define _MaskMiu1Req_MVD_RW( m ) _HVD_WriteRegBit(MIU1_REG_RQ3_MASK, m, BIT(4))
202 #define _MaskMiu1Req_MVD_BBU_R( m ) _HVD_WriteRegBit(MIU1_REG_RQ0_MASK+1, m, BIT(4))
203 #define _MaskMiu1Req_HVD_RW( m ) _HVD_WriteRegBit(MIU1_REG_RQ3_MASK, m, BIT(2))
204 #define _MaskMiu1Req_HVD_BBU_R( m ) _HVD_WriteRegBit(MIU1_REG_RQ3_MASK, m, BIT(1))
205
206 #define HVD_MVD_RW_ON_MIU1 ((_HVD_Read2Byte(MIU0_REG_SEL3) & BIT(4)) == BIT(4))
207 #define HVD_MVD_BBU_R_ON_MIU1 ((_HVD_Read2Byte(MIU0_REG_SEL0) & BIT(12)) == BIT(12))
208 #define HVD_HVD_RW_ON_MIU1 ((_HVD_Read2Byte(MIU0_REG_SEL3) & BIT(2)) == BIT(2))
209 #define HVD_HVD_BBU_R_ON_MIU1 ((_HVD_Read2Byte(MIU0_REG_SEL3) & BIT(1)) == BIT(1))
210
211 #if SUPPORT_EVD
212 #define _MaskMiuReq_EVD_RW( m ) _HVD_WriteRegBit(MIU0_REG_RQ2_MASK, m, BIT(2))
213 #define _MaskMiuReq_EVD_BBU_R( m ) _HVD_WriteRegBit(MIU0_REG_RQ2_MASK, m, BIT(3))
214 #define _MaskMiu1Req_EVD_RW( m ) _HVD_WriteRegBit(MIU1_REG_RQ2_MASK, m, BIT(2))
215 #define _MaskMiu1Req_EVD_BBU_R( m ) _HVD_WriteRegBit(MIU1_REG_RQ2_MASK, m, BIT(3))
216 #define HVD_EVD_RW_ON_MIU1 ((_HVD_Read2Byte(MIU0_REG_SEL2) & BIT(2)) == BIT(2))
217 #define HVD_EVD_BBU_R_ON_MIU1 ((_HVD_Read2Byte(MIU0_REG_SEL2) & BIT(3)) == BIT(3))
218 #endif
219
220 #define _HVD_MIU_SetReqMask(miu_clients, mask) \
221 do \
222 { \
223 if (HVD_##miu_clients##_ON_MIU1 == 0) \
224 { \
225 _MaskMiuReq_##miu_clients(mask); \
226 } \
227 else \
228 { \
229 _MaskMiu1Req_##miu_clients(mask); \
230 } \
231 } while (0)
232
233 // check RM is supported or not
234 #define HVD_HW_RUBBER3 (HAL_HVD_EX_GetHWVersionID()& BIT(14))
235 #define HAL_HVD_EX_MAX_SUPPORT_STREAM 3
236 //-------------------------------------------------------------------------------------------------
237 // Local Structures
238 //-------------------------------------------------------------------------------------------------
239
240 //-------------------------------------------------------------------------------------------------
241 // Local Functions Prototype
242 //-------------------------------------------------------------------------------------------------
243 static MS_U16 _HVD_EX_GetBBUReadptr(MS_U32 u32Id);
244 static void _HVD_EX_SetBBUWriteptr(MS_U32 u32Id, MS_U16 u16BBUNewWptr);
245 static MS_BOOL _HVD_EX_MBoxSend(MS_U32 u32Id, MS_U8 u8MBox, MS_U32 u32Msg);
246 static MS_BOOL _HVD_EX_MBoxReady(MS_U32 u32Id, MS_U8 u8MBox);
247 static MS_BOOL _HVD_EX_MBoxRead(MS_U32 u32Id, MS_U8 u8MBox, MS_U32 *u32Msg);
248 //static void _HVD_EX_MBoxClear(MS_U8 u8MBox);
249 static MS_U32 _HVD_EX_GetPC(void);
250 static MS_U32 _HVD_EX_GetESWritePtr(MS_U32 u32Id);
251 static MS_U32 _HVD_EX_GetESReadPtr(MS_U32 u32Id, MS_BOOL bDbug);
252 static MS_BOOL _HVD_EX_SetCMDArg(MS_U32 u32Id, MS_U32 u32Arg);
253 static MS_BOOL _HVD_EX_SetCMD(MS_U32 u32Id, MS_U32 u32Cmd);
254 static HVD_Return _HVD_EX_SendCmd(MS_U32 u32Id, MS_U32 u32Cmd, MS_U32 u32CmdArg);
255 static void _HVD_EX_SetMIUProtectMask(MS_BOOL bEnable);
256 static void _HVD_EX_SetBufferAddr(MS_U32 u32Id);
257 static MS_U32 _HVD_EX_GetESLevel(MS_U32 u32Id);
258 static MS_U32 _HVD_EX_GetESQuantity(MS_U32 u32Id);
259 static HVD_Return _HVD_EX_UpdatePTSTable(MS_U32 u32Id, HVD_BBU_Info *pInfo);
260 static HVD_Return _HVD_EX_UpdateESWptr(MS_U32 u32Id, MS_U32 u32NalOffset, MS_U32 u32NalLen);
261 static HVD_Return _HVD_EX_UpdateESWptr_VP8(MS_U32 u32Id, MS_U32 u32NalOffset, MS_U32 u32NalLen, MS_U32 u32NalOffset2, MS_U32 u32NalLen2);
262 static MS_U32 _HVD_EX_GetVUIDispInfo(MS_U32 u32Id);
263 static MS_U32 _HVD_EX_GetBBUQNumb(MS_U32 u32Id);
264 static MS_U32 _HVD_EX_GetPTSQNumb(MS_U32 u32Id);
265 static HVD_EX_Drv_Ctrl *_HVD_EX_GetDrvCtrl(MS_U32 u32Id);
266 static MS_U8 _HVD_EX_GetStreamIdx(MS_U32 u32Id);
267 static HVD_Frm_Information *_HVD_EX_GetNextDispFrame(MS_U32 u32Id);
268 #if SUPPORT_EVD
269 static void HAL_EVD_EX_PowerCtrl(MS_BOOL bEnable);
270 static MS_BOOL HAL_EVD_EX_DeinitHW(void);
271 #endif
272 //-------------------------------------------------------------------------------------------------
273 // Global Variables
274 //-------------------------------------------------------------------------------------------------
275 #if defined (__aeon__)
276 static MS_U32 u32HVDRegOSBase = 0xA0200000;
277 #else
278 static MS_U32 u32HVDRegOSBase = 0xBF200000;
279 #endif
280 #if HAL_HVD_ENABLE_MUTEX_PROTECT
281 MS_S32 s32HVDMutexID = -1;
282 MS_U8 _u8HVD_Mutex[] = { "HVD_Mutex" };
283 #endif
284
285
286 //-------------------------------------------------------------------------------------------------
287 // Local Variables
288 //-------------------------------------------------------------------------------------------------
289 typedef struct
290 {
291
292 HVD_AVC_VUI_DISP_INFO g_hvd_VUIINFO;
293 MS_U8 g_hvd_nal_fill_pair[2][8];
294 MS_U32 u32RV_VLCTableAddr; // offset from Frame buffer start address
295 MS_U16 _u16DispQPtr;
296
297 //HVD_EX_Drv_Ctrl *_pHVDCtrls;
298 MS_U32 u32HVDCmdTimeout;//same as HVD_FW_CMD_TIMEOUT_DEFAULT
299 MS_U32 u32VPUClockType;
300 MS_U32 u32HVDClockType;//160
301 #if SUPPORT_EVD
302 MS_U32 u32EVDClockType;
303 #endif
304 HVD_EX_Stream _stHVDStream[3];
305
306 volatile HVD_Frm_Information *pHvdFrm;//_HVD_EX_GetNextDispFrame()
307 MS_BOOL g_RstFlag;
308 MS_U64 u64pts_real;
309 MS_U32 u32VP8BBUWptr;
310 //pre_set
311 HVD_Pre_Ctrl *pHVDPreCtrl_Hal[2];
312
313 } HVD_Hal_CTX;
314
315 HVD_Hal_CTX* pHVDHalContext = NULL;
316 HVD_Hal_CTX gHVDHalContext;
317 HVD_EX_Drv_Ctrl *_pHVDCtrls = NULL;
318
319 static HVD_EX_PreSet _stHVDPreSet[HAL_HVD_EX_MAX_SUPPORT_STREAM] =
320 {
321 {FALSE},
322 {FALSE},
323 {FALSE},
324 };
325
326 //-------------------------------------------------------------------------------------------------
327 // Debug Functions
328 //-------------------------------------------------------------------------------------------------
HVD_EX_SetRstFlag(MS_BOOL bRst)329 void HVD_EX_SetRstFlag(MS_BOOL bRst)
330 {
331 pHVDHalContext->g_RstFlag = bRst;
332 }
HVD_EX_GetRstFlag(void)333 MS_BOOL HVD_EX_GetRstFlag(void)
334 {
335 return pHVDHalContext->g_RstFlag;
336 }
337
338 //-------------------------------------------------------------------------------------------------
339 // Local Functions
340 //-------------------------------------------------------------------------------------------------
341
_HVD_EX_Context_Init_HAL(void)342 static void _HVD_EX_Context_Init_HAL(void)
343 {
344 pHVDHalContext->u32HVDCmdTimeout = 100;//same as HVD_FW_CMD_TIMEOUT_DEFAULT
345 pHVDHalContext->u32VPUClockType = 240; //it should same as:_VPU_EX_InitAll() eClkSpeed
346 pHVDHalContext->u32HVDClockType = 240;//160;
347 #if SUPPORT_EVD
348 pHVDHalContext->u32EVDClockType = 384;
349 #endif
350 pHVDHalContext->_stHVDStream[0].eStreamId = E_HAL_HVD_MAIN_STREAM0;
351 pHVDHalContext->_stHVDStream[1].eStreamId = E_HAL_HVD_SUB_STREAM0;
352 pHVDHalContext->_stHVDStream[2].eStreamId = E_HAL_HVD_SUB_STREAM1;
353 }
354
_HVD_EX_GetBBUReadptr(MS_U32 u32Id)355 static MS_U16 _HVD_EX_GetBBUReadptr(MS_U32 u32Id)
356 {
357 MS_U16 u16Ret = 0;
358 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
359 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
360 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
361 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
362 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
363
364 #if HVD_ENABLE_MVC
365 if(HAL_HVD_EX_CheckMVCID(u32Id))
366 {
367 u8TaskId = (MS_U8) HAL_HVD_EX_GetView(u32Id);
368 }
369 #endif /// HVD_ENABLE_MVC
370
371 _HVD_WriteWordMask(HVD_REG_POLL_NAL_RPTR(u32RB), 0, HVD_REG_POLL_NAL_RPTR_BIT);
372 _HVD_WriteWordMask(HVD_REG_POLL_NAL_RPTR(u32RB), HVD_REG_POLL_NAL_RPTR_BIT, HVD_REG_POLL_NAL_RPTR_BIT);
373
374 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) // VP8
375 {
376 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_RPTR_HI_BS4);
377 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_RPTR_HI_BS3);
378 }
379 else
380 #ifdef SUPPORT_EVD
381 if ((0 == u8TaskId) || (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)))
382 #else
383 if (0 == u8TaskId)
384 #endif
385 {
386 //if(pCtrl->InitParams.bColocateBBUMode)
387 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
388 u16Ret = pShm->u32ColocateBBUReadPtr;
389 else
390 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_RPTR_HI(u32RB));
391 }
392 else
393 {
394 //if(pCtrl->InitParams.bColocateBBUMode)
395 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
396 u16Ret = pShm->u32ColocateBBUReadPtr;
397 else
398 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_RPTR_HI_BS2);
399 }
400
401 HVD_EX_MSG_DBG("Task0=%d, Task1=%d\n",
402 _HVD_Read2Byte(HVD_REG_NAL_RPTR_HI(u32RB)), _HVD_Read2Byte(HVD_REG_NAL_RPTR_HI_BS2));
403
404 return u16Ret;
405 }
406
_HVD_EX_GetBBUWritedptr(MS_U32 u32Id)407 static MS_U16 _HVD_EX_GetBBUWritedptr(MS_U32 u32Id)
408 {
409 MS_U16 u16Ret = 0;
410 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
411 HVD_EX_Drv_Ctrl *pDrvCtrl = _HVD_EX_GetDrvCtrl(u32Id);
412 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
413 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
414 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
415
416 #if HVD_ENABLE_MVC
417 if (HAL_HVD_EX_CheckMVCID(u32Id))
418 {
419 u8TaskId = (MS_U8) HAL_HVD_EX_GetView(u32Id);
420 }
421 #endif /// HVD_ENABLE_MVC
422 _HVD_WriteWordMask(HVD_REG_POLL_NAL_RPTR(u32RB), 0, HVD_REG_POLL_NAL_RPTR_BIT);
423 _HVD_WriteWordMask(HVD_REG_POLL_NAL_RPTR(u32RB), HVD_REG_POLL_NAL_RPTR_BIT, HVD_REG_POLL_NAL_RPTR_BIT);
424
425 if ((pDrvCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP8) // VP8
426 {
427 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_WPTR_HI_BS4);
428 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_WPTR_HI_BS3);
429 }
430 else
431 #ifdef SUPPORT_EVD
432 if ((0 == u8TaskId) || (E_HVD_INIT_HW_HEVC == (pDrvCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)))
433 #else
434 if (0 == u8TaskId)
435 #endif
436 {
437 //if(pDrvCtrl->InitParams.bColocateBBUMode)
438 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
439 u16Ret = pShm->u32ColocateBBUWritePtr;
440 else
441 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_WPTR_HI(u32RB));
442 }
443 else
444 {
445 //if(pDrvCtrl->InitParams.bColocateBBUMode)
446 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
447 u16Ret = pShm->u32ColocateBBUWritePtr;
448 else
449 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_WPTR_HI_BS2);
450 }
451
452 return u16Ret;
453 }
454
_HVD_EX_ResetMainSubBBUWptr(MS_U32 u32Id)455 static void _HVD_EX_ResetMainSubBBUWptr(MS_U32 u32Id)
456 {
457 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
458 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
459
460 _HVD_Write2Byte(HVD_REG_NAL_WPTR_HI(u32RB), 0);
461 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_NAL_WPTR_SYNC, HVD_REG_NAL_WPTR_SYNC); // set bit 3
462 _HVD_Write2Byte(HVD_REG_NAL_WPTR_HI_BS2, 0);
463 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_NAL_WPTR_SYNC, HVD_REG_NAL_WPTR_SYNC); // set bit 3
464 _HVD_Write2Byte(HVD_REG_NAL_WPTR_HI_BS3, 0);
465 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_NAL_WPTR_SYNC, HVD_REG_NAL_WPTR_SYNC); // set bit 3
466 _HVD_Write2Byte(HVD_REG_NAL_RPTR_HI_BS4, 0);
467 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_NAL_WPTR_SYNC, HVD_REG_NAL_WPTR_SYNC); // set bit 3
468 }
469
_HVD_EX_SetBBUWriteptr(MS_U32 u32Id,MS_U16 u16BBUNewWptr)470 static void _HVD_EX_SetBBUWriteptr(MS_U32 u32Id, MS_U16 u16BBUNewWptr)
471 {
472 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
473 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
474 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
475 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
476 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
477
478 #if HVD_ENABLE_MVC
479 if (HAL_HVD_EX_CheckMVCID(u32Id))
480 {
481 u8TaskId = (MS_U8) HAL_HVD_EX_GetView(u32Id);
482 }
483 #endif /// HVD_ENABLE_MVC
484
485 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) // VP8
486 {
487 _HVD_Write2Byte(HVD_REG_NAL_WPTR_HI_BS3, u16BBUNewWptr);
488 _HVD_Write2Byte(HVD_REG_NAL_WPTR_HI_BS4, u16BBUNewWptr);
489 }
490 else
491 #ifdef SUPPORT_EVD
492 if ((0 == u8TaskId) || (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)))
493 #else
494 if (0 == u8TaskId)
495 #endif
496 {
497 _HVD_Write2Byte(HVD_REG_NAL_WPTR_HI(u32RB), u16BBUNewWptr);
498 //if(pCtrl->InitParams.bColocateBBUMode)
499 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
500 pShm->u32ColocateBBUWritePtr = u16BBUNewWptr;
501 }
502 else
503 {
504 _HVD_Write2Byte(HVD_REG_NAL_WPTR_HI_BS2, u16BBUNewWptr);
505 //if(pCtrl->InitParams.bColocateBBUMode)
506 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
507 pShm->u32ColocateBBUWritePtr = u16BBUNewWptr;
508 }
509
510 HVD_EX_MSG_DBG("Task0=%d, Task1=%d\n",
511 _HVD_Read2Byte(HVD_REG_NAL_WPTR_HI(u32RB)), _HVD_Read2Byte(HVD_REG_NAL_WPTR_HI_BS2));
512
513 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_NAL_WPTR_SYNC, HVD_REG_NAL_WPTR_SYNC); // set bit 3
514 }
515
_HVD_EX_MBoxSend(MS_U32 u32Id,MS_U8 u8MBox,MS_U32 u32Msg)516 static MS_BOOL _HVD_EX_MBoxSend(MS_U32 u32Id, MS_U8 u8MBox, MS_U32 u32Msg)
517 {
518 MS_BOOL bResult = TRUE;
519 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
520 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
521
522 switch (u8MBox)
523 {
524 case E_HVD_HI_0:
525 {
526 _HVD_Write4Byte(HVD_REG_HI_MBOX0_L(u32RB), u32Msg);
527 _HVD_WriteWordMask(HVD_REG_HI_MBOX_SET(u32RB), HVD_REG_HI_MBOX0_SET, HVD_REG_HI_MBOX0_SET);
528 break;
529 }
530 case E_HVD_HI_1:
531 {
532 _HVD_Write4Byte(HVD_REG_HI_MBOX1_L(u32RB), u32Msg);
533 _HVD_WriteWordMask(HVD_REG_HI_MBOX_SET(u32RB), HVD_REG_HI_MBOX1_SET, HVD_REG_HI_MBOX1_SET);
534 break;
535 }
536 case E_HVD_VPU_HI_0:
537 {
538 bResult = HAL_VPU_EX_MBoxSend(VPU_HI_MBOX0, u32Msg);
539 break;
540 }
541 case E_HVD_VPU_HI_1:
542 {
543 bResult = HAL_VPU_EX_MBoxSend(VPU_HI_MBOX1, u32Msg);
544 break;
545 }
546 default:
547 {
548 bResult = FALSE;
549 break;
550 }
551 }
552
553 return bResult;
554 }
555
_HVD_EX_MBoxReady(MS_U32 u32Id,MS_U8 u8MBox)556 static MS_BOOL _HVD_EX_MBoxReady(MS_U32 u32Id, MS_U8 u8MBox)
557 {
558 MS_BOOL bResult = TRUE;
559 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
560 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
561
562 switch (u8MBox)
563 {
564 case E_HVD_HI_0:
565 bResult = _HVD_ReadWordBit(HVD_REG_HI_MBOX_RDY(u32RB), HVD_REG_HI_MBOX0_RDY) ? FALSE : TRUE;
566 break;
567 case E_HVD_HI_1:
568 bResult = _HVD_ReadWordBit(HVD_REG_HI_MBOX_RDY(u32RB), HVD_REG_HI_MBOX1_RDY) ? FALSE : TRUE;
569 break;
570 case E_HVD_RISC_0:
571 bResult = _HVD_ReadWordBit(HVD_REG_RISC_MBOX_RDY(u32RB), HVD_REG_RISC_MBOX0_RDY) ? TRUE : FALSE;
572 break;
573 case E_HVD_RISC_1:
574 bResult = _HVD_ReadWordBit(HVD_REG_RISC_MBOX_RDY(u32RB), HVD_REG_RISC_MBOX1_RDY) ? TRUE : FALSE;
575 break;
576 case E_HVD_VPU_HI_0:
577 bResult = HAL_VPU_EX_MBoxRdy(VPU_HI_MBOX0);
578 break;
579 case E_HVD_VPU_HI_1:
580 bResult = HAL_VPU_EX_MBoxRdy(VPU_HI_MBOX1);
581 break;
582 case E_HVD_VPU_RISC_0:
583 bResult = HAL_VPU_EX_MBoxRdy(VPU_RISC_MBOX0);
584 break;
585 case E_HVD_VPU_RISC_1:
586 bResult = HAL_VPU_EX_MBoxRdy(VPU_RISC_MBOX1);
587 break;
588 default:
589 break;
590 }
591
592 return bResult;
593 }
594
_HVD_EX_MBoxRead(MS_U32 u32Id,MS_U8 u8MBox,MS_U32 * u32Msg)595 static MS_BOOL _HVD_EX_MBoxRead(MS_U32 u32Id, MS_U8 u8MBox, MS_U32 *u32Msg)
596 {
597 MS_BOOL bResult = TRUE;
598 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
599 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
600
601 switch (u8MBox)
602 {
603 case E_HVD_HI_0:
604 {
605 *u32Msg = _HVD_Read4Byte(HVD_REG_HI_MBOX0_L(u32RB));
606 break;
607 }
608 case E_HVD_HI_1:
609 {
610 *u32Msg = _HVD_Read4Byte(HVD_REG_HI_MBOX1_L(u32RB));
611 break;
612 }
613 case E_HVD_RISC_0:
614 {
615 *u32Msg = _HVD_Read4Byte(HVD_REG_RISC_MBOX0_L(u32RB));
616 break;
617 }
618 case E_HVD_RISC_1:
619 {
620 *u32Msg = _HVD_Read4Byte(HVD_REG_RISC_MBOX1_L(u32RB));
621 break;
622 }
623 case E_HVD_VPU_RISC_0:
624 {
625 bResult = HAL_VPU_EX_MBoxRead(VPU_RISC_MBOX0, u32Msg);
626 break;
627 }
628 case E_HVD_VPU_RISC_1:
629 {
630 bResult = HAL_VPU_EX_MBoxRead(VPU_RISC_MBOX1, u32Msg);
631 break;
632 }
633 default:
634 {
635 bResult = FALSE;
636 break;
637 }
638 }
639
640 return bResult;
641 }
642
643 #if 0
644 static void _HVD_EX_MBoxClear(MS_U8 u8MBox)
645 {
646 switch (u8MBox)
647 {
648 case E_HVD_RISC_0:
649 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR, HVD_REG_RISC_MBOX0_CLR, HVD_REG_RISC_MBOX0_CLR);
650 break;
651 case E_HVD_RISC_1:
652 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR, HVD_REG_RISC_MBOX1_CLR, HVD_REG_RISC_MBOX1_CLR);
653 break;
654 case E_HVD_VPU_RISC_0:
655 HAL_VPU_EX_MBoxClear(VPU_RISC_MBOX0);
656 break;
657 case E_HVD_VPU_RISC_1:
658 HAL_VPU_EX_MBoxClear(VPU_RISC_MBOX1);
659 break;
660 default:
661 break;
662 }
663 }
664 #endif
665
_HVD_EX_GetPC(void)666 static MS_U32 _HVD_EX_GetPC(void)
667 {
668 MS_U32 u32PC = 0;
669 u32PC = HAL_VPU_EX_GetProgCnt();
670 // HVD_MSG_DBG("<gdbg>pc0 =0x%lx\n",u32PC);
671 return u32PC;
672 }
673
_HVD_EX_GetESWritePtr(MS_U32 u32Id)674 static MS_U32 _HVD_EX_GetESWritePtr(MS_U32 u32Id)
675 {
676 MS_U32 u32Data = 0;
677 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
678 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
679
680 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV)
681 {
682 u32Data = pCtrl->LastNal.u32NalAddr + pCtrl->LastNal.u32NalSize;
683
684 if (u32Data > pCtrl->MemMap.u32BitstreamBufSize)
685 {
686 u32Data -= pCtrl->MemMap.u32BitstreamBufSize;
687
688 HVD_EX_MSG_ERR("app should not put this kind of packet\n");
689 }
690 }
691 else
692 {
693 #if HVD_ENABLE_MVC
694 MS_U8 u8ViewIdx = 0;
695 if(HAL_HVD_EX_CheckMVCID(u32Id))
696 {
697 u8ViewIdx = (MS_U8) HAL_HVD_EX_GetView(u32Id);
698 }
699 if(u8ViewIdx != 0) /// 2nd ES ptr.
700 {
701 u32Data = pShm->u32ES2WritePtr;
702 }
703 else
704 {
705 u32Data = pShm->u32ESWritePtr;
706 }
707 #else
708 u32Data = pShm->u32ESWritePtr;
709 #endif
710 }
711
712 return u32Data;
713 }
714
715 #define NAL_UNIT_LEN_BITS 21
716 #define NAL_UNIT_OFT_BITS 30
717 #define NAL_UNIT_OFT_LOW_BITS (32-NAL_UNIT_LEN_BITS)
718 #define NAL_UNIT_OFT_HIGH_BITS (NAL_UNIT_OFT_BITS-NAL_UNIT_OFT_LOW_BITS)
719 #define NAL_UNIT_OFT_LOW_MASK (((unsigned int)0xFFFFFFFF)>>(32-NAL_UNIT_OFT_LOW_BITS))
720
_HVD_EX_GetESReadPtr(MS_U32 u32Id,MS_BOOL bDbug)721 static MS_U32 _HVD_EX_GetESReadPtr(MS_U32 u32Id, MS_BOOL bDbug)
722 {
723 MS_U32 u32Data = 0;
724 MS_U8 u8TaskId = 0;
725 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
726 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
727 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
728 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
729 MS_U32 u32VP8_BBU_DRAM_ST_ADDR_BS3 = pShm->u32HVD_BBU_DRAM_ST_ADDR;
730
731 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
732 #if HVD_ENABLE_MVC
733 if(HAL_HVD_EX_CheckMVCID(u32Id))
734 {
735 u8TaskId = (MS_U8) HAL_HVD_EX_GetView(u32Id);
736 }
737 #endif /// HVD_ENABLE_MVC
738
739 if (((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV) || (TRUE == bDbug))
740 {
741 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP8)
742 {
743 // MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
744 MS_U16 u16ReadPtr = _HVD_EX_GetBBUReadptr(u32Id);
745 MS_U16 u16WritePtr = _HVD_EX_GetBBUWritedptr(u32Id);
746 MS_U32 *u32Adr;
747 MS_U32 u32Tmp;
748
749 if (u16ReadPtr == u16WritePtr)
750 {
751 u32Data = _HVD_EX_GetESWritePtr(u32Id);
752 }
753 else
754 {
755 if (u16ReadPtr)
756 u16ReadPtr--;
757 else
758 u16ReadPtr = VP8_BBU_DRAM_TBL_ENTRY - 1;
759
760 u32Adr = (MS_U32 *)(MsOS_PA2KSEG1(pCtrl->MemMap.u32CodeBufAddr + u32VP8_BBU_DRAM_ST_ADDR_BS3 + (u16ReadPtr << 3)));
761
762 u32Data = (*u32Adr) >> NAL_UNIT_LEN_BITS;
763 u32Tmp = (*(u32Adr+1)) & (0xffffffff>>(32-(NAL_UNIT_OFT_BITS-(32-NAL_UNIT_LEN_BITS))));
764 u32Tmp = u32Tmp << (32-NAL_UNIT_LEN_BITS);
765 u32Data = u32Data | u32Tmp;
766
767 //printf("[VP8] GetESRptr (%x,%x,%x,%x,%d,%d)\n", u32Adr, (*u32Adr), (*(u32Adr+1)) , u32Data, u16ReadPtr, u16WritePtr);
768 //while(1);
769 }
770 goto EXIT;
771 }
772 // set reg_poll_nal_rptr 0
773 _HVD_WriteWordMask(HVD_REG_ESB_RPTR(u32RB), 0, HVD_REG_ESB_RPTR_POLL);
774 // set reg_poll_nal_rptr 1
775 _HVD_WriteWordMask(HVD_REG_ESB_RPTR(u32RB), HVD_REG_ESB_RPTR_POLL, HVD_REG_ESB_RPTR_POLL);
776
777 // read reg_nal_rptr_hi
778 #ifdef SUPPORT_EVD
779 if ((0 == u8TaskId) || (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)))
780 #else
781 if (0 == u8TaskId)
782 #endif
783 {
784 u32Data = _HVD_Read2Byte(HVD_REG_ESB_RPTR(u32RB)) & 0xFFC0;
785 u32Data >>= 6;
786 u32Data |= _HVD_Read2Byte(HVD_REG_ESB_RPTR_H(u32RB)) << 10;
787 }
788 else
789 {
790 u32Data = _HVD_Read2Byte(HVD_REG_ESB_RPTR_L_BS2) & 0xFFC0;
791 u32Data >>= 6;
792 u32Data |= _HVD_Read2Byte(HVD_REG_ESB_RPTR_H_BS2) << 10;
793 }
794
795 u32Data <<= 3; // unit
796
797 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV)
798 {
799 MS_U32 u32ESWptr = _HVD_EX_GetESWritePtr(u32Id);
800
801 if ((pCtrl->u32LastESRptr < u32ESWptr) && (u32Data > u32ESWptr))
802 {
803 //HVD_MSG_INFO("HVD Warn: ESRptr(%lx %lx) is running over ESWptr(%lx)\n" , u32Data , pCtrl->u32LastESRptr, u32ESWptr );
804 u32Data = u32ESWptr;
805 }
806 else if ((pCtrl->u32LastESRptr == u32ESWptr) && (u32Data > u32ESWptr))
807 {
808 //HVD_MSG_INFO("HVD Warn: ESRptr(%lx %lx) is running over ESWptr(%lx)\n" , u32Data , pCtrl->u32LastESRptr, u32ESWptr );
809 u32Data = u32ESWptr;
810 }
811 else if ((_HVD_EX_GetBBUQNumb(u32Id) == 0) && ((u32Data - u32ESWptr) < 32)
812 && ((pShm->u32FwState & E_HVD_FW_STATE_MASK) == E_HVD_FW_PLAY))
813 {
814 //HVD_MSG_INFO("HVD Warn: ESRptr(%lx %lx) is running over ESWptr(%lx)\n" , u32Data , pCtrl->u32LastESRptr, u32ESWptr );
815 u32Data = u32ESWptr;
816 }
817 else if (((u32Data > u32ESWptr) && (pCtrl->u32LastESRptr > u32Data))
818 && ((u32Data - u32ESWptr) < 32)
819 && (pCtrl->u32FlushRstPtr == 1))
820 {
821 //HVD_MSG_INFO("444HVD Warn: ESRptr(%lx %lx) is running over ESWptr(%lx)\n" , u32Data , pCtrl->u32LastESRptr, u32ESWptr );
822 u32Data = u32ESWptr;
823 }
824 }
825
826 // remove illegal pointer
827 #if 1
828 if ((pCtrl->MemMap.u32DrvProcessBufSize != 0) && (pCtrl->MemMap.u32DrvProcessBufAddr != 0))
829 {
830 MS_U32 u32PacketStaddr = u32Data + pCtrl->MemMap.u32BitstreamBufAddr;
831
832 if (((pCtrl->MemMap.u32DrvProcessBufAddr <= u32PacketStaddr) &&
833 (u32PacketStaddr <
834 (pCtrl->MemMap.u32DrvProcessBufAddr + pCtrl->MemMap.u32DrvProcessBufSize))))
835 {
836 //HVD_MSG_INFO("HVD Warn: ESRptr(%lx %lx) is located in drv process buffer(%lx %lx)\n" , u32Data , pCtrl->u32LastESRptr, pCtrl->MemMap.u32DrvProcessBufAddr , pCtrl->MemMap.u32DrvProcessBufSize );
837 u32Data = pCtrl->u32LastESRptr;
838 }
839 }
840 #endif
841 }
842 else
843 {
844 #if HVD_ENABLE_MVC
845 MS_U8 u8ViewIdx = 0;
846 if(HAL_HVD_EX_CheckMVCID(u32Id))
847 {
848 u8ViewIdx = (MS_U8) HAL_HVD_EX_GetView(u32Id);
849 }
850 if(u8ViewIdx != 0) /// 2nd ES ptr.
851 {
852 u32Data = pShm->u32ES2ReadPtr;
853 }
854 else
855 {
856 u32Data = pShm->u32ESReadPtr;
857 }
858 #else
859 u32Data = pShm->u32ESReadPtr;
860 #endif
861 }
862
863 EXIT:
864
865 pCtrl->u32LastESRptr = u32Data;
866
867 return u32Data;
868 }
869
_HVD_EX_SetCMDArg(MS_U32 u32Id,MS_U32 u32Arg)870 static MS_BOOL _HVD_EX_SetCMDArg(MS_U32 u32Id, MS_U32 u32Arg)
871 {
872 MS_U16 u16TimeOut = 0xFFFF;
873 MS_BOOL bResult = FALSE;
874
875 HVD_EX_MSG_DBG("Send ARG 0x%lx to HVD\n", u32Arg);
876
877 while (--u16TimeOut)
878 {
879 if (_HVD_EX_MBoxReady(u32Id, HAL_HVD_CMD_MBOX) && _HVD_EX_MBoxReady(u32Id, HAL_HVD_CMD_ARG_MBOX))
880 {
881 bResult = _HVD_EX_MBoxSend(u32Id, HAL_HVD_CMD_ARG_MBOX, u32Arg);
882 break;
883 }
884 }
885
886 return bResult;
887 }
888
_HVD_EX_SetCMD(MS_U32 u32Id,MS_U32 u32Cmd)889 static MS_BOOL _HVD_EX_SetCMD(MS_U32 u32Id, MS_U32 u32Cmd)
890 {
891 MS_U16 u16TimeOut = 0xFFFF;
892 MS_BOOL bResult = FALSE;
893 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
894
895 HVD_EX_MSG_DBG("Send CMD 0x%lx to HVD \n", u32Cmd);
896
897 #if HVD_ENABLE_MVC
898 if(E_HAL_VPU_MVC_STREAM_BASE == u8TaskId)
899 {
900 u8TaskId = E_HAL_VPU_MAIN_STREAM_BASE;
901 }
902 #endif /// HVD_ENABLE_MVC
903
904 while (--u16TimeOut)
905 {
906 if (_HVD_EX_MBoxReady(u32Id, HAL_HVD_CMD_MBOX))
907 {
908 u32Cmd |= (u8TaskId << 24);
909 bResult = _HVD_EX_MBoxSend(u32Id, HAL_HVD_CMD_MBOX, u32Cmd);
910 break;
911 }
912 }
913 return bResult;
914 }
915
_HVD_EX_SendCmd(MS_U32 u32Id,MS_U32 u32Cmd,MS_U32 u32CmdArg)916 static HVD_Return _HVD_EX_SendCmd(MS_U32 u32Id, MS_U32 u32Cmd, MS_U32 u32CmdArg)
917 {
918 MS_U32 u32timeout = HVD_GetSysTime_ms() + pHVDHalContext->u32HVDCmdTimeout;
919
920 while (!_HVD_EX_SetCMDArg(u32Id, u32CmdArg))
921 {
922 if (HVD_GetSysTime_ms() > u32timeout)
923 {
924 HVD_EX_MSG_ERR("Timeout: cmd=0x%lx arg=0x%lx\n", u32Cmd, u32CmdArg);
925 return E_HVD_RETURN_TIMEOUT;
926 }
927
928 #if 0
929 if (u32Cmd == E_HVD_CMD_STOP)
930 {
931 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
932 #if HVD_ENABLE_MVC
933 if(E_HAL_VPU_MVC_STREAM_BASE == u8TaskId)
934 {
935 u8TaskId = E_HAL_VPU_MAIN_STREAM_BASE;
936 }
937 #endif /// HVD_ENABLE_MVC
938 MS_U32 u32Cmdtmp = (u8TaskId << 24) | E_HVD_CMD_STOP;
939
940 _HVD_EX_MBoxSend(u32Id, HAL_HVD_CMD_MBOX, u32Cmdtmp);
941 _HVD_EX_MBoxSend(u32Id, HAL_HVD_CMD_ARG_MBOX, 0);
942
943 return E_HVD_RETURN_SUCCESS;
944 }
945 #endif
946
947 if(u32Cmd < E_DUAL_CMD_BASE)
948 {
949 //_HVD_EX_GetPC();
950 HAL_HVD_EX_Dump_FW_Status(u32Id);
951 HAL_HVD_EX_Dump_HW_Status(HVD_U32_MAX);
952 }
953 }
954
955 u32timeout = HVD_GetSysTime_ms() + pHVDHalContext->u32HVDCmdTimeout;
956
957 while (!_HVD_EX_SetCMD(u32Id, u32Cmd))
958 {
959 if (HVD_GetSysTime_ms() > u32timeout)
960 {
961 HVD_EX_MSG_ERR("cmd timeout: %lx\n", u32Cmd);
962 return E_HVD_RETURN_TIMEOUT;
963 }
964
965 if(u32Cmd < E_DUAL_CMD_BASE)
966 {
967 //_HVD_EX_GetPC();
968 HAL_HVD_EX_Dump_FW_Status(u32Id);
969 HAL_HVD_EX_Dump_HW_Status(HVD_U32_MAX);
970 }
971 }
972
973 return E_HVD_RETURN_SUCCESS;
974 }
975
_HVD_EX_SetMIUProtectMask(MS_BOOL bEnable)976 static void _HVD_EX_SetMIUProtectMask(MS_BOOL bEnable)
977 {
978 #if HAL_HVD_ENABLE_MIU_PROTECT
979 _HVD_MIU_SetReqMask(MVD_RW, bEnable);
980 _HVD_MIU_SetReqMask(MVD_BBU_R, bEnable);
981 #if SUPPORT_EVD
982 _HVD_MIU_SetReqMask(EVD_RW, bEnable);
983 _HVD_MIU_SetReqMask(EVD_BBU_R, bEnable);
984 #endif
985 _HVD_MIU_SetReqMask(HVD_RW, bEnable);
986 _HVD_MIU_SetReqMask(HVD_BBU_R, bEnable);
987 HAL_VPU_EX_MIU_RW_Protect(bEnable);
988 //HVD_Delay_ms(1);
989 #endif
990 return;
991 }
992
_HVD_EX_SetBufferAddr(MS_U32 u32Id)993 static void _HVD_EX_SetBufferAddr(MS_U32 u32Id)
994 {
995 MS_U16 u16Reg = 0;
996 MS_U32 u32StAddr = 0;
997 MS_BOOL bBitMIU1 = FALSE;
998 MS_BOOL bCodeMIU1 = FALSE;
999 MS_U8 u8TaskId = 0;
1000 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1001 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
1002 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
1003 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
1004
1005 if(pCtrl == NULL) return;
1006
1007 // nal table settngs
1008 if (pCtrl->MemMap.u32CodeBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
1009 {
1010 bCodeMIU1 = TRUE;
1011 }
1012
1013 if (pCtrl->MemMap.u32BitstreamBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
1014 {
1015 bBitMIU1 = TRUE;
1016 }
1017
1018 if (bBitMIU1 != bCodeMIU1)
1019 {
1020 u32StAddr = pCtrl->MemMap.u32BitstreamBufAddr + pCtrl->u32BBUTblInBitstreamBufAddr;
1021
1022 if (u32StAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
1023 {
1024 u32StAddr -= pCtrl->MemMap.u32MIU1BaseAddr;
1025 }
1026 }
1027 else
1028 {
1029 u32StAddr = pCtrl->MemMap.u32CodeBufAddr + pShm->u32HVD_BBU_DRAM_ST_ADDR;
1030
1031 if (u32StAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
1032 {
1033 u32StAddr -= pCtrl->MemMap.u32MIU1BaseAddr;
1034 }
1035 }
1036
1037 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
1038 {
1039 _HVD_Write2Byte(HVD_REG_HK_VP8, HVD_REG_HK_PLAYER_FM);
1040
1041 _HVD_Write2Byte(HVD_REG_NAL_TAB_ST_L_BS3, (MS_U16)(u32StAddr >> 3));
1042 _HVD_Write2Byte(HVD_REG_NAL_TAB_ST_H_BS3, (MS_U16)(u32StAddr >> 19));
1043 _HVD_Write2Byte(HVD_REG_NAL_TAB_LEN_BS3, (MS_U16)(pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum - 1));
1044
1045 u32StAddr += 0x2000;
1046
1047 _HVD_Write2Byte(HVD_REG_NAL_TAB_ST_L_BS4, (MS_U16)(u32StAddr >> 3));
1048 _HVD_Write2Byte(HVD_REG_NAL_TAB_ST_H_BS4, (MS_U16)(u32StAddr >> 19));
1049 _HVD_Write2Byte(HVD_REG_NAL_TAB_LEN_BS4, (MS_U16)(pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum - 1));
1050
1051 // ES buffer
1052 u32StAddr = pCtrl->MemMap.u32BitstreamBufAddr;
1053
1054 if (u32StAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
1055 {
1056 u32StAddr -= pCtrl->MemMap.u32MIU1BaseAddr;
1057 }
1058
1059 HVD_EX_MSG_DBG("ESB start addr=%lx\n", u32StAddr);
1060
1061 _HVD_Write2Byte(HVD_REG_ESB_ST_ADR_L_BS34, HVD_LWORD(u32StAddr >> 3));
1062 _HVD_Write2Byte(HVD_REG_ESB_ST_ADR_H_BS34, HVD_HWORD(u32StAddr >> 3));
1063
1064 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L_BS34, HVD_LWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1065 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H_BS34, HVD_HWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1066
1067 u16Reg = _HVD_Read2Byte(HVD_REG_MIF_BS34);
1068 u16Reg &= ~HVD_REG_BS34_TSP_INPUT;
1069 u16Reg &= ~HVD_REG_BS34_PASER_MASK;
1070 u16Reg |= HVD_REG_BS34_PASER_DISABLE;
1071 u16Reg |= HVD_REG_BS34_AUTO_NAL_TAB;
1072 _HVD_Write2Byte(HVD_REG_MIF_BS34, u16Reg);
1073
1074 return;
1075 }
1076
1077 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
1078
1079 HVD_EX_MSG_DBG("NAL start addr=%lx\n", u32StAddr);
1080
1081 #ifdef SUPPORT_EVD
1082 if ((0 == u8TaskId) || (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)))
1083 #else
1084 if (0 == u8TaskId)
1085 #endif
1086 {
1087 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_L(u32RB), (MS_U16) (u32StAddr >> 3));
1088 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_H(u32RB), (MS_U16) (u32StAddr >> 19));
1089 // -1 is for NAL_TAB_LEN counts from zero.
1090 _HVD_Write2Byte(HVD_REG_NAL_TAB_LEN(u32RB), (MS_U16) (pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum - 1));
1091 }
1092 else
1093 {
1094 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_L_BS2, (MS_U16) (u32StAddr >> 3));
1095 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_H_BS2, (MS_U16) (u32StAddr >> 19));
1096 // -1 is for NAL_TAB_LEN counts from zero.
1097 _HVD_Write2Byte(HVD_REG_NAL_TAB_LEN_BS2, (MS_U16) (pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum - 1));
1098 }
1099
1100 // ES buffer
1101 u32StAddr = pCtrl->MemMap.u32BitstreamBufAddr;
1102
1103 if (u32StAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
1104 {
1105 u32StAddr -= pCtrl->MemMap.u32MIU1BaseAddr;
1106 }
1107
1108 HVD_EX_MSG_DBG("ESB start addr=%lx, len=%lx\n", u32StAddr, pCtrl->MemMap.u32BitstreamBufSize);
1109
1110 #ifdef SUPPORT_EVD
1111 if ((0 == u8TaskId) || (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)))
1112 #else
1113 if (0 == u8TaskId)
1114 #endif
1115 {
1116 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L(u32RB), HVD_LWORD(u32StAddr >> 3));
1117 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H(u32RB), HVD_HWORD(u32StAddr >> 3));
1118
1119 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L(u32RB), HVD_LWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1120 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H(u32RB), HVD_HWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1121 }
1122 else
1123 {
1124 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L_BS2, HVD_LWORD(u32StAddr >> 3));
1125 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H_BS2, HVD_HWORD(u32StAddr >> 3));
1126
1127 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L_BS2, HVD_LWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1128 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H_BS2, HVD_HWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1129 }
1130
1131 // others
1132 #ifdef SUPPORT_EVD
1133 if ((0 == u8TaskId) || (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)))
1134 #else
1135 if (0 == u8TaskId)
1136 #endif
1137 {
1138 u16Reg = _HVD_Read2Byte(HVD_REG_MIF_BBU(u32RB));
1139
1140 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_TSP)
1141 {
1142 u16Reg |= HVD_REG_BBU_TSP_INPUT;
1143 }
1144 else
1145 {
1146 u16Reg &= ~HVD_REG_BBU_TSP_INPUT;
1147 }
1148
1149 u16Reg &= ~HVD_REG_BBU_PASER_MASK;
1150
1151 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_RM) // RM
1152 {
1153 u16Reg |= HVD_REG_BBU_PASER_DISABLE; // force BBU to remove nothing, RM only
1154 }
1155 else // AVS or AVC
1156 {
1157 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_START_CODE_MASK) == E_HVD_INIT_START_CODE_REMOVED)
1158 {
1159 u16Reg |= HVD_REG_BBU_PASER_ENABLE_03;
1160 }
1161 else // start code remained
1162 {
1163 u16Reg |= HVD_REG_BBU_PASER_ENABLE_ALL;
1164 }
1165 }
1166
1167 u16Reg |= HVD_REG_BBU_AUTO_NAL_TAB;
1168
1169 _HVD_Write2Byte(HVD_REG_MIF_BBU(u32RB), u16Reg);
1170 }
1171 else
1172 {
1173 u16Reg = _HVD_Read2Byte(HVD_REG_MIF_BBU_BS2);
1174
1175 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_TSP)
1176 {
1177 u16Reg |= HVD_REG_BBU_TSP_INPUT_BS2;
1178 }
1179 else
1180 {
1181 u16Reg &= ~HVD_REG_BBU_TSP_INPUT_BS2;
1182 }
1183
1184 u16Reg &= ~HVD_REG_BBU_PASER_MASK_BS2;
1185
1186 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_RM) // RM
1187 {
1188 u16Reg |= HVD_REG_BBU_PASER_DISABLE_BS2; // force BBU to remove nothing, RM only
1189 }
1190 else // AVS or AVC
1191 {
1192 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_START_CODE_MASK) == E_HVD_INIT_START_CODE_REMOVED)
1193 {
1194 u16Reg |= HVD_REG_BBU_PASER_ENABLE_03_BS2;
1195 }
1196 else // start code remained
1197 {
1198 u16Reg |= HVD_REG_BBU_PASER_ENABLE_ALL_BS2;
1199 }
1200 }
1201
1202 u16Reg |= HVD_REG_BBU_AUTO_NAL_TAB_BS2;
1203
1204 _HVD_Write2Byte(HVD_REG_MIF_BBU_BS2, u16Reg);
1205 }
1206
1207 #if (HVD_ENABLE_MVC)
1208 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_MVC)
1209 {
1210 /// Used sub stream to record sub view data.
1211 HVD_EX_Drv_Ctrl *pDrvCtrl_Sub = _HVD_EX_GetDrvCtrl((u32Id+0x00011000));
1212 //printf("**************** Buffer setting for MVC dual-BBU *************\n");
1213
1214 if (bBitMIU1 != bCodeMIU1)
1215 {
1216 u32StAddr = pDrvCtrl_Sub->MemMap.u32BitstreamBufAddr + pDrvCtrl_Sub->u32BBUTblInBitstreamBufAddr;
1217
1218 if (u32StAddr >= pDrvCtrl_Sub->MemMap.u32MIU1BaseAddr)
1219 {
1220 u32StAddr -= pDrvCtrl_Sub->MemMap.u32MIU1BaseAddr;
1221 }
1222 }
1223 else
1224 {
1225 u32StAddr = pDrvCtrl_Sub->MemMap.u32CodeBufAddr + pShm->u32HVD_BBU2_DRAM_ST_ADDR;
1226
1227 if (u32StAddr >= pDrvCtrl_Sub->MemMap.u32MIU1BaseAddr)
1228 {
1229 u32StAddr -= pDrvCtrl_Sub->MemMap.u32MIU1BaseAddr;
1230 }
1231 }
1232
1233
1234 HVD_EX_MSG_DBG("[MVC] _HAL_HVD_SetBuffer2Addr: nal StAddr:%lx \n", u32StAddr);
1235 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_L_BS2, (MS_U16)(u32StAddr >> 3));
1236 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_H_BS2, (MS_U16)(u32StAddr >> 19));
1237 // -1 is for NAL_TAB_LEN counts from zero.
1238 _HVD_Write2Byte(HVD_REG_NAL_TAB_LEN_BS2, (MS_U16)(pHVDHalContext->_stHVDStream[u8Idx+1].u32BBUEntryNum - 1));
1239
1240 // ES buffer
1241 u32StAddr = pDrvCtrl_Sub->MemMap.u32BitstreamBufAddr;
1242 if(u32StAddr >= pDrvCtrl_Sub->MemMap.u32MIU1BaseAddr)
1243 {
1244 u32StAddr -= pDrvCtrl_Sub->MemMap.u32MIU1BaseAddr;
1245 }
1246
1247 HVD_EX_MSG_DBG("[MVC] 2nd ES _HAL_HVD_SetBuffer2Addr: ESb StAddr:%lx, len:%lx.\n", u32StAddr, pDrvCtrl_Sub->MemMap.u32BitstreamBufSize);
1248 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L_BS2, HVD_LWORD(u32StAddr >> 3));
1249 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H_BS2, HVD_HWORD(u32StAddr >> 3));
1250
1251 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L_BS2, HVD_LWORD(pDrvCtrl_Sub->MemMap.u32BitstreamBufSize >> 3));
1252 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H_BS2, HVD_HWORD(pDrvCtrl_Sub->MemMap.u32BitstreamBufSize >> 3));
1253
1254 u16Reg = _HVD_Read2Byte(HVD_REG_MIF_BBU_BS2);
1255 if((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_TSP)
1256 {
1257 u16Reg |= HVD_REG_BBU_TSP_INPUT_BS2;
1258 HVD_EX_MSG_DBG("[MVC] 2nd ES, TSP mode.\n");
1259 }
1260 else
1261 {
1262 u16Reg &= ~HVD_REG_BBU_TSP_INPUT_BS2;
1263 HVD_EX_MSG_DBG("[MVC] 2nd ES, BBU mode.\n");
1264 }
1265 u16Reg &= ~HVD_REG_BBU_PASER_MASK_BS2;
1266 if((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_RM) // RM
1267 {
1268 u16Reg |= HVD_REG_BBU_PASER_DISABLE_BS2; // force BBU to remove nothing, RM only
1269 }
1270 else // AVS or AVC
1271 {
1272 if((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_START_CODE_MASK) == E_HVD_INIT_START_CODE_REMOVED)
1273 {
1274 u16Reg |= HVD_REG_BBU_PASER_ENABLE_03_BS2;
1275 }
1276 else // start code remained
1277 {
1278 u16Reg |= HVD_REG_BBU_PASER_ENABLE_ALL_BS2;
1279 ///HVD_MSG_DBG("[MVC] BBU Paser all.\n");
1280 }
1281 }
1282 u16Reg |= HVD_REG_BBU_AUTO_NAL_TAB_BS2;
1283 ///HVD_MSG_DBG("[MVC] 2nd MIF BBU 0x%lx.\n",(MS_U32)u16Reg);
1284 _HVD_Write2Byte(HVD_REG_MIF_BBU_BS2, u16Reg);
1285 }
1286 #endif
1287
1288
1289 // MIF offset
1290 #if 0
1291 {
1292 MS_U16 offaddr = 0;
1293 u32StAddr = pCtrl->MemMap.u32CodeBufAddr;
1294 if (u32StAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
1295 {
1296 u32StAddr -= pCtrl->MemMap.u32MIU1BaseAddr;
1297 }
1298 HVD_EX_MSG_DBG("MIF offset:%lx \n", u32StAddr);
1299 offaddr = (MS_U16) ((u32StAddr) >> 20);
1300 offaddr &= BMASK(HVD_REG_MIF_OFFSET_L_BITS:0);
1301 //0x1FF; // 9 bits(L + H)
1302 u16Reg = _HVD_Read2Byte(HVD_REG_MIF_BBU);
1303 u16Reg &= ~HVD_REG_MIF_OFFSET_H;
1304 u16Reg &= ~(BMASK(HVD_REG_MIF_OFFSET_L_BITS:0));
1305 if (offaddr & BIT(HVD_REG_MIF_OFFSET_L_BITS))
1306 {
1307 u16Reg |= HVD_REG_MIF_OFFSET_H;
1308 }
1309 _HVD_Write2Byte(HVD_REG_MIF_BBU, (u16Reg | (offaddr & BMASK(HVD_REG_MIF_OFFSET_L_BITS:0))));
1310 }
1311 #endif
1312 }
1313
1314 #if 0 //defined(SUPPORT_NEW_MEM_LAYOUT) || defined(SUPPORT_NEW_VDEC_FLOW)
1315 // Note: For VP8 only. MVC ES buffer address will be set when _HVD_EX_SetBufferAddr() is called
1316 static void _HVD_EX_SetESBufferAddr(MS_U32 u32Id)
1317 {
1318 MS_U16 u16Reg = 0;
1319 MS_U32 u32StAddr = 0;
1320 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1321 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
1322 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
1323
1324 if(pCtrl == NULL) return;
1325
1326 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
1327 {
1328 _HVD_Write2Byte(HVD_REG_HK_VP8, HVD_REG_HK_PLAYER_FM);
1329
1330 // ES buffer
1331 u32StAddr = pCtrl->MemMap.u32BitstreamBufAddr;
1332
1333 if (u32StAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
1334 {
1335 u32StAddr -= pCtrl->MemMap.u32MIU1BaseAddr;
1336 }
1337
1338 _HVD_Write2Byte(HVD_REG_ESB_ST_ADR_L_BS34, HVD_LWORD(u32StAddr >> 3));
1339 _HVD_Write2Byte(HVD_REG_ESB_ST_ADR_H_BS34, HVD_HWORD(u32StAddr >> 3));
1340
1341 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L_BS34, HVD_LWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1342 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H_BS34, HVD_HWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1343
1344 u16Reg = _HVD_Read2Byte(HVD_REG_MIF_BS34);
1345 u16Reg &= ~HVD_REG_BS34_TSP_INPUT;
1346 u16Reg &= ~HVD_REG_BS34_PASER_MASK;
1347 u16Reg |= HVD_REG_BS34_PASER_DISABLE;
1348 u16Reg |= HVD_REG_BS34_AUTO_NAL_TAB;
1349 _HVD_Write2Byte(HVD_REG_MIF_BS34, u16Reg);
1350
1351 return;
1352 }
1353
1354 // ES buffer
1355 u32StAddr = pCtrl->MemMap.u32BitstreamBufAddr;
1356
1357 if (u32StAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
1358 {
1359 u32StAddr -= pCtrl->MemMap.u32MIU1BaseAddr;
1360 }
1361
1362 HVD_EX_MSG_DBG("ESB start addr=%lx, len=%lx\n", u32StAddr, pCtrl->MemMap.u32BitstreamBufSize);
1363
1364 if (0 == HAL_VPU_EX_GetTaskId(u32Id))
1365 {
1366 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L(u32RB), HVD_LWORD(u32StAddr >> 3));
1367 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H(u32RB), HVD_HWORD(u32StAddr >> 3));
1368
1369 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L(u32RB), HVD_LWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1370 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H(u32RB), HVD_HWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1371 }
1372 else
1373 {
1374 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L_BS2, HVD_LWORD(u32StAddr >> 3));
1375 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H_BS2, HVD_HWORD(u32StAddr >> 3));
1376
1377 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L_BS2, HVD_LWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1378 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H_BS2, HVD_HWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1379 }
1380 }
1381 #endif
1382
_HVD_EX_GetESLevel(MS_U32 u32Id)1383 static MS_U32 _HVD_EX_GetESLevel(MS_U32 u32Id)
1384 {
1385 MS_U32 u32Wptr = 0;
1386 MS_U32 u32Rptr = 0;
1387 MS_U32 u32CurMBX = 0;
1388 MS_U32 u32ESsize = 0;
1389 MS_U32 u32Ret = E_HVD_ESB_LEVEL_NORMAL;
1390 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1391
1392 u32Wptr = _HVD_EX_GetESWritePtr(u32Id);
1393 u32Rptr = _HVD_EX_GetESReadPtr(u32Id, FALSE);
1394 u32ESsize = pCtrl->MemMap.u32BitstreamBufSize;
1395
1396 if (u32Rptr >= u32Wptr)
1397 {
1398 u32CurMBX = u32Rptr - u32Wptr;
1399 }
1400 else
1401 {
1402 u32CurMBX = u32ESsize - (u32Wptr - u32Rptr);
1403 }
1404
1405 if (u32CurMBX == 0)
1406 {
1407 u32Ret = E_HVD_ESB_LEVEL_UNDER;
1408 }
1409 else if (u32CurMBX < HVD_FW_AVC_ES_OVER_THRESHOLD)
1410 {
1411 u32Ret = E_HVD_ESB_LEVEL_OVER;
1412 }
1413 else
1414 {
1415 u32CurMBX = u32ESsize - u32CurMBX;
1416 if (u32CurMBX < HVD_FW_AVC_ES_UNDER_THRESHOLD)
1417 {
1418 u32Ret = E_HVD_ESB_LEVEL_UNDER;
1419 }
1420 }
1421
1422 return u32Ret;
1423 }
1424
_HVD_EX_GetESQuantity(MS_U32 u32Id)1425 static MS_U32 _HVD_EX_GetESQuantity(MS_U32 u32Id)
1426 {
1427 MS_U32 u32Wptr = 0;
1428 MS_U32 u32Rptr = 0;
1429 MS_U32 u32ESsize = 0;
1430 MS_U32 u32Ret = 0;
1431 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1432
1433 u32Wptr = _HVD_EX_GetESWritePtr(u32Id);
1434 u32Rptr = _HVD_EX_GetESReadPtr(u32Id, FALSE);
1435 u32ESsize = pCtrl->MemMap.u32BitstreamBufSize;
1436
1437
1438 if(u32Wptr >= u32Rptr)
1439 {
1440 u32Ret = u32Wptr - u32Rptr;
1441 }
1442 else
1443 {
1444 u32Ret = u32ESsize - u32Rptr + u32Wptr;
1445 }
1446 //printf("ES Quantity <0x%lx> W:0x%lx, R:0x%lx, Q:0x%lx.\n",u32Id,u32Wptr,u32Rptr,u32Ret);
1447 return u32Ret;
1448 }
1449
_HVD_EX_SetRegCPU(MS_U32 u32Id)1450 static MS_BOOL _HVD_EX_SetRegCPU(MS_U32 u32Id)
1451 {
1452 MS_U32 u32FirmVer = 0;
1453 MS_U32 u32Timeout = 20000;
1454 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1455
1456 HVD_EX_MSG_DBG("HVD HW ver id: 0x%04lx\n", HAL_HVD_EX_GetHWVersionID());
1457
1458 #if HVD_ENABLE_TIME_MEASURE
1459 HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase, __FUNCTION__, __LINE__);
1460 #endif
1461
1462 HAL_VPU_EX_SetFWReload(!pCtrl->bTurboFWMode);
1463
1464 VPU_EX_FWCodeCfg fwCfg;
1465 VPU_EX_TaskInfo taskInfo;
1466 VPU_EX_VLCTblCfg vlcCfg;
1467 VPU_EX_NDecInitPara nDecInitPara;
1468
1469 memset(&fwCfg, 0, sizeof(VPU_EX_FWCodeCfg));
1470 memset(&taskInfo, 0, sizeof(VPU_EX_TaskInfo));
1471 memset(&vlcCfg, 0, sizeof(VPU_EX_VLCTblCfg));
1472 memset(&nDecInitPara, 0, sizeof(VPU_EX_NDecInitPara));
1473
1474 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_RM) //rm
1475 {
1476 vlcCfg.u32DstAddr = MsOS_PA2KSEG1(pCtrl->MemMap.u32FrameBufAddr + pHVDHalContext->u32RV_VLCTableAddr);
1477 vlcCfg.u32BinAddr = pCtrl->MemMap.u32VLCBinaryVAddr;
1478 vlcCfg.u32BinSize = pCtrl->MemMap.u32VLCBinarySize;
1479 vlcCfg.u32FrameBufAddr = pCtrl->MemMap.u32FrameBufVAddr;
1480 vlcCfg.u32VLCTableOffset = pHVDHalContext->u32RV_VLCTableAddr;
1481 nDecInitPara.pVLCCfg = &vlcCfg;
1482 }
1483
1484 nDecInitPara.pFWCodeCfg = &fwCfg;
1485 nDecInitPara.pTaskInfo = &taskInfo;
1486
1487 fwCfg.u8SrcType = pCtrl->MemMap.eFWSourceType;
1488 fwCfg.u32DstAddr = pCtrl->MemMap.u32CodeBufVAddr;
1489 fwCfg.u32DstSize = pCtrl->MemMap.u32CodeBufSize;
1490 fwCfg.u32BinAddr = pCtrl->MemMap.u32FWBinaryVAddr;
1491 fwCfg.u32BinSize = pCtrl->MemMap.u32FWBinarySize;
1492
1493 taskInfo.u32Id = u32Id;
1494
1495 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_MVC)
1496 {
1497 taskInfo.eDecType = E_VPU_EX_DECODER_HVD; //E_VPU_EX_DECODER_MVC;
1498 }
1499 else
1500 {
1501 taskInfo.eDecType = E_VPU_EX_DECODER_HVD;
1502 }
1503
1504 taskInfo.eVpuId = (HAL_VPU_StreamId) (0xFF & u32Id);
1505
1506 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV)
1507 {
1508 taskInfo.eSrcType = E_VPU_EX_INPUT_FILE;
1509 }
1510 else
1511 {
1512 taskInfo.eSrcType = E_VPU_EX_INPUT_TSP;
1513 }
1514 taskInfo.u32HeapSize = HVD_DRAM_SIZE;
1515
1516 #ifdef SUPPORT_EVD
1517 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_HEVC)
1518 taskInfo.u32HeapSize = EVD_DRAM_SIZE;
1519 #endif
1520
1521 if(TRUE == HVD_EX_GetRstFlag())
1522 {
1523 //Delete task for Rst
1524 if(!HAL_VPU_EX_TaskDelete(u32Id, &nDecInitPara))
1525 {
1526 HVD_EX_MSG_ERR("HAL_VPU_EX_TaskDelete fail\n");
1527 }
1528 HVD_EX_SetRstFlag(FALSE);
1529 }
1530
1531 if (!HAL_VPU_EX_TaskCreate(u32Id, &nDecInitPara))
1532 {
1533 HVD_EX_MSG_ERR("Task create fail!\n");
1534
1535 return FALSE;
1536 }
1537
1538 while (u32Timeout)
1539 {
1540 u32FirmVer = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_INIT_DONE);
1541
1542 if (u32FirmVer != 0)
1543 {
1544 u32FirmVer = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_VERSION_ID);
1545 break;
1546 }
1547 u32Timeout--;
1548 HVD_Delay_ms(1);
1549 }
1550
1551 if (u32Timeout > 0)
1552 {
1553 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
1554
1555 pHVDHalContext->_stHVDStream[u8Idx].bUsed = TRUE;
1556
1557 HVD_EX_MSG_INF("FW version binary=0x%lx, if=0x%lx\n", u32FirmVer, (MS_U32) HVD_FW_VERSION);
1558 }
1559 else
1560 {
1561 HVD_EX_MSG_ERR("Cannot get FW version !!0x%x 0x%lx \n", (MS_S16) _HVD_Read2Byte(HVD_REG_RESET),
1562 HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_VERSION_ID));
1563
1564 if (TRUE != HAL_VPU_EX_TaskDelete(u32Id, &nDecInitPara))
1565 {
1566 HVD_EX_MSG_ERR("Task delete fail!\n");
1567 }
1568
1569 return FALSE;
1570 }
1571
1572 #if HVD_ENABLE_TIME_MEASURE
1573 HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase, __FUNCTION__, __LINE__);
1574 #endif
1575
1576 return TRUE;
1577 }
1578
_HVD_EX_GetPTSTableRptr(MS_U32 u32Id)1579 static MS_U32 _HVD_EX_GetPTSTableRptr(MS_U32 u32Id)
1580 {
1581 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1582 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
1583 if (pShm->u32PTStableRptrAddr & VPU_QMEM_BASE)
1584 {
1585 return HAL_VPU_EX_MemRead(pShm->u32PTStableRptrAddr);
1586 }
1587 else
1588 {
1589 return *((MS_U32 *) MsOS_PA2KSEG1(pShm->u32PTStableRptrAddr + pCtrl->MemMap.u32CodeBufAddr));
1590 }
1591 }
1592
_HVD_EX_GetPTSTableWptr(MS_U32 u32Id)1593 static MS_U32 _HVD_EX_GetPTSTableWptr(MS_U32 u32Id)
1594 {
1595 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1596 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
1597
1598 if (pShm->u32PTStableWptrAddr & VPU_QMEM_BASE)
1599 {
1600 return HAL_VPU_EX_MemRead(pShm->u32PTStableWptrAddr);
1601 }
1602 else
1603 {
1604 return *((MS_U32 *) MsOS_PA2KSEG1(pShm->u32PTStableWptrAddr + pCtrl->MemMap.u32CodeBufAddr));
1605 }
1606 }
1607
_HVD_EX_SetPTSTableWptr(MS_U32 u32Id,MS_U32 u32Value)1608 static void _HVD_EX_SetPTSTableWptr(MS_U32 u32Id, MS_U32 u32Value)
1609 {
1610 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1611 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
1612
1613 if (pShm->u32PTStableWptrAddr & VPU_QMEM_BASE)
1614 {
1615 if (!HAL_VPU_EX_MemWrite(pShm->u32PTStableWptrAddr, u32Value))
1616 {
1617 HVD_EX_MSG_ERR("PTS table SRAM write failed\n");
1618 }
1619 }
1620 else
1621 {
1622 *((MS_U32 *) MsOS_PA2KSEG1(pShm->u32PTStableWptrAddr + pCtrl->MemMap.u32CodeBufAddr)) = u32Value;
1623 }
1624 }
1625
_HVD_EX_UpdatePTSTable(MS_U32 u32Id,HVD_BBU_Info * pInfo)1626 static HVD_Return _HVD_EX_UpdatePTSTable(MS_U32 u32Id, HVD_BBU_Info *pInfo)
1627 {
1628 MS_U32 u32PTSWptr = HVD_U32_MAX;
1629 MS_U32 u32PTSRptr = HVD_U32_MAX;
1630 MS_U32 u32DestAddr = 0;
1631 HVD_PTS_Entry PTSEntry;
1632 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
1633 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1634 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
1635
1636 // update R & W ptr
1637 u32PTSRptr = _HVD_EX_GetPTSTableRptr(u32Id);
1638
1639 HVD_EX_MSG_DBG("PTS table rptr:0x%lx, wptr=0x%lx\n", u32PTSRptr, _HVD_EX_GetPTSTableWptr(u32Id));
1640
1641 if (u32PTSRptr >= MAX_PTS_TABLE_SIZE)
1642 {
1643 HVD_EX_MSG_ERR("PTS table Read Ptr(%lx) > max table size(%lx) \n", u32PTSRptr,
1644 (MS_U32) MAX_PTS_TABLE_SIZE);
1645 return E_HVD_RETURN_FAIL;
1646 }
1647
1648 // check queue is full or not
1649 u32PTSWptr = pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr + 1;
1650 u32PTSWptr %= MAX_PTS_TABLE_SIZE;
1651
1652 if (u32PTSWptr == u32PTSRptr)
1653 {
1654 HVD_EX_MSG_ERR("PTS table full. Read Ptr(%lx) == new Write ptr(%lx) ,Pre Wptr(%lx) \n", u32PTSRptr,
1655 u32PTSWptr, pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr);
1656 return E_HVD_RETURN_FAIL;
1657 }
1658
1659 // add one PTS entry
1660 PTSEntry.u32ByteCnt = pHVDHalContext->_stHVDStream[u8Idx].u32PTSByteCnt & HVD_BYTE_COUNT_MASK;
1661 PTSEntry.u32ID_L = pInfo->u32ID_L;
1662 PTSEntry.u32ID_H = pInfo->u32ID_H;
1663 PTSEntry.u32PTS = pInfo->u32TimeStamp;
1664
1665 u32DestAddr = MsOS_PA2KSEG1(pCtrl->MemMap.u32CodeBufAddr + pShm->u32HVD_PTS_TABLE_ST_OFFSET + (pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr * sizeof(HVD_PTS_Entry)));
1666
1667 HVD_EX_MSG_DBG("PTS entry dst addr=0x%lx\n", MsOS_VA2PA(u32DestAddr));
1668
1669 HVD_memcpy((void *) u32DestAddr, &PTSEntry, sizeof(HVD_PTS_Entry));
1670
1671 HAL_HVD_EX_FlushMemory();
1672
1673 // update Write ptr
1674 _HVD_EX_SetPTSTableWptr(u32Id, u32PTSWptr);
1675
1676 pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr = u32PTSWptr;
1677
1678 return E_HVD_RETURN_SUCCESS;
1679 }
1680
_HVD_EX_UpdateESWptr(MS_U32 u32Id,MS_U32 u32NalOffset,MS_U32 u32NalLen)1681 static HVD_Return _HVD_EX_UpdateESWptr(MS_U32 u32Id, MS_U32 u32NalOffset, MS_U32 u32NalLen)
1682 {
1683 //---------------------------------------------------
1684 // item format in nal table:
1685 // reserved |borken| u32NalOffset | u32NalLen
1686 // 13 bits |1bit | 29 bits | 21 bits (total 8 bytes)
1687 //---------------------------------------------------
1688 MS_U32 u32Adr = 0;
1689 MS_U32 u32BBUNewWptr = 0;
1690 MS_U8 item[8];
1691 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
1692 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1693 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
1694 MS_U32 u32BBU_DRAM_ST_ADDR = pShm->u32HVD_BBU_DRAM_ST_ADDR;
1695
1696 #if HVD_ENABLE_MVC
1697 if(HAL_HVD_EX_CheckMVCID(u32Id))
1698 {
1699 // if MVC_BBU_ADDR and HVD_BBU_ADDR are different, we need to add MVC_BBU_DRAM_ST_ADDR and MVC_BBU2_DRAM_ST_ADDR in share memory
1700 u32BBU_DRAM_ST_ADDR = pShm->u32HVD_BBU_DRAM_ST_ADDR; //pShm->u32MVC_BBU_DRAM_ST_ADDR;
1701 if(E_VDEC_EX_SUB_VIEW == HAL_HVD_EX_GetView(u32Id))
1702 {
1703 u32BBU_DRAM_ST_ADDR = pShm->u32HVD_BBU2_DRAM_ST_ADDR; //pShm->u32MVC_BBU2_DRAM_ST_ADDR;
1704 }
1705 }
1706 #endif /// HVD_ENABLE_MVC
1707
1708 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
1709 {
1710 u32BBUNewWptr = pHVDHalContext->u32VP8BBUWptr;
1711 }
1712 else
1713 {
1714 u32BBUNewWptr = pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr;
1715 }
1716 u32BBUNewWptr++;
1717 u32BBUNewWptr %= pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum;
1718
1719 // prepare nal entry
1720
1721 if (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
1722 {
1723 // NAL len 22 bits , HEVC level5 constrain
1724 item[0] = u32NalLen & 0xff;
1725 item[1] = (u32NalLen >> 8) & 0xff;
1726 item[2] = ((u32NalLen >> 16) & 0x3f) | ((u32NalOffset << 6) & 0xc0);
1727 item[3] = (u32NalOffset >> 2) & 0xff;
1728 item[4] = (u32NalOffset >> 10) & 0xff;
1729 item[5] = (u32NalOffset >> 18) & 0xff;
1730 item[6] = (u32NalOffset >> 26) & 0x0f; //including broken bit
1731 item[7] = 0;
1732 }
1733 else
1734 {
1735 item[0] = u32NalLen & 0xff;
1736 item[1] = (u32NalLen >> 8) & 0xff;
1737 item[2] = ((u32NalLen >> 16) & 0x1f) | ((u32NalOffset << 5) & 0xe0);
1738 item[3] = (u32NalOffset >> 3) & 0xff;
1739 item[4] = (u32NalOffset >> 11) & 0xff;
1740 item[5] = (u32NalOffset >> 19) & 0xff;
1741 item[6] = (u32NalOffset >> 27) & 0x07; //including broken bit
1742 item[7] = 0;
1743 }
1744
1745 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
1746 {
1747 u32Adr = MsOS_PA2KSEG1(pCtrl->MemMap.u32CodeBufAddr + u32BBU_DRAM_ST_ADDR + (pHVDHalContext->u32VP8BBUWptr << 3));
1748 }
1749 else
1750 {
1751 // add nal entry
1752 u32Adr = MsOS_PA2KSEG1(pCtrl->MemMap.u32CodeBufAddr + u32BBU_DRAM_ST_ADDR + (pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr << 3));
1753 }
1754
1755 HVD_memcpy((void *) u32Adr, (void *) item, 8);
1756
1757 HAL_HVD_EX_FlushMemory();
1758
1759 HVD_EX_MSG_DBG("addr=0x%lx, bbu wptr=0x%lx\n", MsOS_VA2PA(u32Adr), pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr);
1760
1761 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
1762 {
1763 pHVDHalContext->u32VP8BBUWptr = u32BBUNewWptr;
1764 }
1765 else
1766 {
1767 pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr = u32BBUNewWptr;
1768 }
1769
1770 return E_HVD_RETURN_SUCCESS;
1771 }
1772
_HVD_EX_UpdateESWptr_VP8(MS_U32 u32Id,MS_U32 u32NalOffset,MS_U32 u32NalLen,MS_U32 u32NalOffset2,MS_U32 u32NalLen2)1773 static HVD_Return _HVD_EX_UpdateESWptr_VP8(MS_U32 u32Id, MS_U32 u32NalOffset, MS_U32 u32NalLen, MS_U32 u32NalOffset2, MS_U32 u32NalLen2)
1774 {
1775 MS_U8 item[8];
1776 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
1777 MS_U32 u32Adr = 0;
1778 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1779 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
1780 MS_U32 u32VP8_BBU_DRAM_ST_ADDR_BS4 = pShm->u32HVD_BBU2_DRAM_ST_ADDR;
1781
1782 /*
1783 printf("nal2 offset=0x%x, len=0x%x\n",
1784 u32NalOffset2, u32NalLen2);
1785 */
1786
1787 item[0] = u32NalLen2 & 0xff;
1788 item[1] = (u32NalLen2 >> 8) & 0xff;
1789 item[2] = ((u32NalLen2 >> 16) & 0x1f) | ((u32NalOffset2 << 5) & 0xe0);
1790 item[3] = (u32NalOffset2 >> 3) & 0xff;
1791 item[4] = (u32NalOffset2 >> 11) & 0xff;
1792 item[5] = (u32NalOffset2 >> 19) & 0xff;
1793 item[6] = (u32NalOffset2 >> 27) & 0x07;
1794 item[7] = 0;
1795
1796 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
1797 {
1798 u32Adr = MsOS_PA2KSEG1(pCtrl->MemMap.u32CodeBufAddr + u32VP8_BBU_DRAM_ST_ADDR_BS4 + (pHVDHalContext->u32VP8BBUWptr << 3));
1799 }
1800 else
1801 {
1802 u32Adr = MsOS_PA2KSEG1(pCtrl->MemMap.u32CodeBufAddr + u32VP8_BBU_DRAM_ST_ADDR_BS4 + (pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr << 3));
1803 }
1804
1805 HVD_memcpy((void *) u32Adr, (void *) item, 8);
1806
1807 HAL_HVD_EX_FlushMemory();
1808
1809 return _HVD_EX_UpdateESWptr(u32Id, u32NalOffset, u32NalLen);
1810 }
1811
_HVD_EX_GetVUIDispInfo(MS_U32 u32Id)1812 static MS_U32 _HVD_EX_GetVUIDispInfo(MS_U32 u32Id)
1813 {
1814 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1815 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
1816
1817 if( ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_AVC) ||
1818 ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_MVC) )
1819 {
1820 MS_U16 i;
1821 MS_U32 u32VUIAddr;
1822 MS_U32 *pData = (MS_U32 *) &(pHVDHalContext->g_hvd_VUIINFO);
1823
1824 HAL_HVD_EX_ReadMemory();
1825 u32VUIAddr = pShm->u32AVC_VUIDispInfo_Addr;
1826
1827 for (i = 0; i < sizeof(HVD_AVC_VUI_DISP_INFO); i += 4)
1828 {
1829 if (pShm->u32AVC_VUIDispInfo_Addr & VPU_QMEM_BASE)
1830 {
1831 *pData = HAL_VPU_EX_MemRead(u32VUIAddr + i);
1832 }
1833 else
1834 {
1835 *pData = *((MS_U32 *) MsOS_PA2KSEG1(u32VUIAddr + i + pCtrl->MemMap.u32CodeBufAddr));
1836 }
1837 pData++;
1838 }
1839 }
1840 else
1841 {
1842 memset(&(pHVDHalContext->g_hvd_VUIINFO), 0, sizeof(HVD_AVC_VUI_DISP_INFO));
1843 }
1844
1845 return (MS_U32) &(pHVDHalContext->g_hvd_VUIINFO);
1846 }
1847
_HVD_EX_GetBBUQNumb(MS_U32 u32Id)1848 static MS_U32 _HVD_EX_GetBBUQNumb(MS_U32 u32Id)
1849 {
1850 MS_U32 u32ReadPtr = 0;
1851 MS_U32 eRet = 0;
1852 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
1853 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1854
1855 u32ReadPtr = _HVD_EX_GetBBUReadptr(u32Id);
1856 MS_U32 u32WritePtr = 0;
1857
1858 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
1859 {
1860 u32WritePtr = pHVDHalContext->u32VP8BBUWptr;
1861 }
1862 else
1863 {
1864 u32WritePtr = pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr;
1865 }
1866
1867 HVD_EX_MSG_DBG("idx=%x, bbu rptr=%lx, bbu wptr=%lx\n", u8Idx, u32ReadPtr, u32WritePtr);
1868
1869 if (u32WritePtr >= u32ReadPtr)
1870 {
1871 eRet = u32WritePtr - u32ReadPtr;
1872 }
1873 else
1874 {
1875 eRet = pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum - (u32ReadPtr - u32WritePtr);
1876 }
1877
1878 #if 0
1879 if (pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr >= u32ReadPtr)
1880 {
1881 eRet = pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr - u32ReadPtr;
1882 }
1883 else
1884 {
1885 eRet = pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum - (u32ReadPtr - pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr);
1886 }
1887
1888 #endif
1889 return eRet;
1890 }
1891
_HVD_EX_GetPTSQNumb(MS_U32 u32Id)1892 static MS_U32 _HVD_EX_GetPTSQNumb(MS_U32 u32Id)
1893 {
1894 MS_U32 u32ReadPtr = 0;
1895 MS_U32 eRet = 0;
1896 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
1897
1898 u32ReadPtr = _HVD_EX_GetPTSTableRptr(u32Id);
1899
1900 if (u32ReadPtr >= MAX_PTS_TABLE_SIZE)
1901 {
1902 HVD_EX_MSG_ERR("PTS table Read Ptr(%lx) > max table size(%lx) \n", u32ReadPtr,
1903 (MS_U32) MAX_PTS_TABLE_SIZE);
1904 return 0;
1905 }
1906
1907 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
1908
1909 if (pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr >= u32ReadPtr)
1910 {
1911 eRet = pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr - u32ReadPtr;
1912 }
1913 else
1914 {
1915 eRet = MAX_PTS_TABLE_SIZE - (u32ReadPtr - pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr);
1916 }
1917
1918 return eRet;
1919 }
1920
_HVD_EX_GetNextDispFrame(MS_U32 u32Id)1921 static HVD_Frm_Information *_HVD_EX_GetNextDispFrame(MS_U32 u32Id)
1922 {
1923 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
1924 MS_U16 u16QNum = pShm->u16DispQNumb;
1925 MS_U16 u16QPtr = pShm->u16DispQPtr;
1926 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
1927
1928 //static volatile HVD_Frm_Information *pHvdFrm = NULL;
1929 #if (HVD_ENABLE_MVC)
1930 MS_BOOL bMVC = HAL_HVD_EX_CheckMVCID(u32Id);
1931
1932 if(bMVC)
1933 {
1934 if (pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide)
1935 {
1936 MS_U16 u16RealQPtr = pHVDHalContext->_stHVDStream[u8Idx].u32DispQIndex;
1937 MS_U16 u16UsedFrm = 0;
1938
1939 if (u16RealQPtr != u16QPtr)
1940 {
1941 if (u16RealQPtr > u16QPtr)
1942 {
1943 u16UsedFrm = u16RealQPtr - u16QPtr;
1944 }
1945 else
1946 {
1947 u16UsedFrm = pShm->u16DispQSize - (u16QPtr - u16RealQPtr);
1948 }
1949 }
1950
1951 if (u16QNum > u16UsedFrm)
1952 {
1953 volatile HVD_Frm_Information *pHvdFrm;
1954
1955 u16QNum -= u16UsedFrm;
1956 u16QPtr = u16RealQPtr;
1957 pHvdFrm = (volatile HVD_Frm_Information*)&pShm->DispQueue[u16QPtr];
1958
1959 if ((u16QPtr%2) == 0) //For MVC mode, we must check the pair of display entry is ready or not
1960 {
1961 volatile HVD_Frm_Information *pHvdFrmNext = (volatile HVD_Frm_Information*)&pShm->DispQueue[u16QPtr+1];
1962
1963 if (pHvdFrmNext->u32Status != E_HVD_DISPQ_STATUS_INIT)
1964 {
1965 return NULL;
1966 }
1967 }
1968
1969 if (pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT) // Must Be
1970 {
1971 pHvdFrm->u32Status = E_HVD_DISPQ_STATUS_VIEW;
1972
1973 if ((u16QPtr%2) == 0)
1974 {
1975 //ALOGE("G1: %x", pHvdFrm->u32PrivateData);
1976 pHVDHalContext->_stHVDStream[u8Idx].u32PrivateData = pHvdFrm->u32PrivateData;
1977 }
1978 else
1979 {
1980 //ALOGE("G2: %x", (pHvdFrm->u32PrivateData << 16) | pHVDHalContext->_stHVDStream[u8Idx].u32PrivateData);
1981 //pShm->UpdateQueue[pShm->u16UpdateQWtPtr] = (pHvdFrm->u32PrivateData << 16) | pHVDHalContext->_stHVDStream[u8Idx].u32PrivateData;
1982 //pShm->u16UpdateQWtPtr = (pShm->u16UpdateQWtPtr + 1) % HVD_DISP_QUEUE_MAX_SIZE;
1983 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_UPDATE_DISPQ, (pHvdFrm->u32PrivateData << 16) | pHVDHalContext->_stHVDStream[u8Idx].u32PrivateData);
1984 }
1985
1986 u16QPtr++;
1987 if (u16QPtr == pShm->u16DispQSize) u16QPtr = 0;
1988 pHVDHalContext->_stHVDStream[u8Idx].u32DispQIndex = u16QPtr;
1989
1990 return (HVD_Frm_Information*)(MS_U32)pHvdFrm;
1991 }
1992 }
1993
1994 return NULL;
1995 }
1996
1997 /* Add for Mobile Platform by Ted Sun */
1998 #if 0
1999 if (u16QNum > HVD_DISPQ_PREFETCH_COUNT*3)
2000 {
2001 u16QNum = HVD_DISPQ_PREFETCH_COUNT*3;
2002 }
2003 #endif
2004
2005 //printf("OQ:%d,DQ:%d.\n",pShm->u16DispQNumb,pShm->u16DecQNumb);
2006 //search the next frame to display
2007 while (u16QNum > 0)
2008 {
2009 //printf("Pr:%d,%d.[%ld,%ld,%ld,%ld].\n",u16QPtr,u16QNum,pShm->DispQueue[u16QPtr].u32Status,pShm->DispQueue[u16QPtr+1].u32Status,
2010 // pShm->DispQueue[u16QPtr+2].u32Status,pShm->DispQueue[u16QPtr+3].u32Status);
2011 pHVDHalContext->pHvdFrm = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr];
2012
2013 //printf("Q2: %ld\n", pHVDShareMem->DispQueue[u16QPtr].u32Status);
2014 if (pHVDHalContext->pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
2015 {
2016 /// For MVC. Output views after the pair of (base and depend) views were decoded.
2017 /// Check the depned view was initial when Output the base view.
2018 if((u16QPtr%2) == 0)
2019 {
2020 volatile HVD_Frm_Information *pHvdFrm_sub = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr+1];
2021 //if(pHvdFrm_sub->u32Status != E_HVD_DISPQ_STATUS_INIT)
2022 if(pHvdFrm_sub->u32Status == E_HVD_DISPQ_STATUS_NONE)
2023 {
2024 ///printf("[MVC] %d is not E_HVD_DISPQ_STATUS_INIT (%ld).\n",u16QPtr+1,pHvdFrm_sub->u32Status);
2025 ///printf("Return NULL.\n");
2026 return NULL;
2027 }
2028 }
2029
2030 //printf("V:%d.\n",u16QPtr);
2031 pHVDHalContext->_u16DispQPtr = u16QPtr;
2032 pHVDHalContext->pHvdFrm->u32Status = E_HVD_DISPQ_STATUS_VIEW; /////Change its state!!
2033 HVD_EX_MSG_DBG("FrameDone: %d, pHvdFrm=0x%lx, timestamp=%ld\n", u16QPtr,
2034 (MS_U32) pHVDHalContext->pHvdFrm, pShm->DispQueue[u16QPtr].u32TimeStamp);
2035 HVD_EX_MSG_INF("<<< halHVD pts,idH = %lu, %lu [%x]\n", pHVDHalContext->pHvdFrm->u32TimeStamp, pHVDHalContext->pHvdFrm->u32ID_H, u16QPtr); //STS output
2036 return (HVD_Frm_Information *)(MS_U32) pHVDHalContext->pHvdFrm;
2037 }
2038
2039 u16QNum--;
2040 //go to next frame in the dispQ
2041 u16QPtr++;
2042
2043 if (u16QPtr >= pShm->u16DispQSize)
2044 {
2045 u16QPtr -= pShm->u16DispQSize; //wrap to the begin
2046 }
2047 }
2048 }
2049 else
2050 #endif ///HVD_ENABLE_MVC
2051 {
2052 volatile HVD_Frm_Information *pHvdFrm = (volatile HVD_Frm_Information*)&pShm->DispQueue[u16QPtr];
2053
2054 if (pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide)
2055 {
2056
2057 while (u16QNum != 0)
2058 {
2059 pHvdFrm = (volatile HVD_Frm_Information*)&pShm->DispQueue[u16QPtr];
2060
2061 if (pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT) // Must Be
2062 {
2063 pHvdFrm->u32Status = E_HVD_DISPQ_STATUS_VIEW;
2064 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_UPDATE_DISPQ, pHvdFrm->u32PrivateData);
2065
2066 return (HVD_Frm_Information*)(MS_U32)pHvdFrm;
2067
2068 }
2069 u16QNum--;
2070 //go to next frame in the dispQ
2071 u16QPtr++;
2072
2073 if (u16QPtr == pShm->u16DispQSize)
2074 {
2075 u16QPtr = 0; //wrap to the begin
2076 }
2077
2078 }
2079
2080
2081
2082 return NULL;
2083 }
2084 /* Add for Mobile Platform by Ted Sun */
2085 #if 0
2086 if (u16QNum > HVD_DISPQ_PREFETCH_COUNT)
2087 {
2088 u16QNum = HVD_DISPQ_PREFETCH_COUNT;
2089 }
2090 #endif
2091 //printf("Q: %d %d\n", u16QNum, u16QPtr);
2092 //search the next frame to display
2093 while (u16QNum != 0)
2094 {
2095 pHVDHalContext->pHvdFrm = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr];
2096
2097 //printf("Q2: %ld\n", pHVDShareMem->DispQueue[u16QPtr].u32Status);
2098 if (pHVDHalContext->pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
2099 {
2100 pHVDHalContext->_u16DispQPtr = u16QPtr;
2101 pHVDHalContext->pHvdFrm->u32Status = E_HVD_DISPQ_STATUS_VIEW; /////Change its state!!
2102 HVD_EX_MSG_DBG("FrameDone: %d, pHvdFrm=0x%lx, timestamp=%ld\n", u16QPtr,
2103 (MS_U32) pHVDHalContext->pHvdFrm, pShm->DispQueue[u16QPtr].u32TimeStamp);
2104 HVD_EX_MSG_INF("<<< halHVD pts,idH = %lu, %lu [%x]\n", pHVDHalContext->pHvdFrm->u32TimeStamp, pHVDHalContext->pHvdFrm->u32ID_H, u16QPtr); //STS output
2105 return (HVD_Frm_Information *)(MS_U32) pHVDHalContext->pHvdFrm;
2106 }
2107
2108 u16QNum--;
2109 //go to next frame in the dispQ
2110 u16QPtr++;
2111
2112 if (u16QPtr == pShm->u16DispQSize)
2113 {
2114 u16QPtr = 0; //wrap to the begin
2115 }
2116 }
2117 }
2118
2119 return NULL;
2120 }
2121 MS_BOOL
HAL_HVD_EX_DispFrameAllViewed(MS_U32 u32Id)2122 HAL_HVD_EX_DispFrameAllViewed(MS_U32 u32Id)
2123 {
2124 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2125 MS_U16 u16QNum = pShm->u16DispQNumb;
2126 MS_U16 u16QPtr = pShm->u16DispQPtr;
2127 static volatile HVD_Frm_Information *pHvdFrm = NULL;
2128
2129 #if (HVD_ENABLE_MVC)
2130 if (HAL_HVD_EX_CheckMVCID(u32Id))
2131 {
2132 if (u16QNum == 1) return TRUE;
2133 }
2134 #endif
2135
2136 while (u16QNum != 0)
2137 {
2138 pHvdFrm = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr];
2139 if (pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
2140 {
2141 return FALSE;
2142 }
2143 u16QNum--;
2144 u16QPtr++;
2145 if (u16QPtr == pShm->u16DispQSize)
2146 {
2147 u16QPtr = 0; //wrap to the begin
2148 }
2149 }
2150
2151 return TRUE;
2152 }
_HVD_EX_GetDrvCtrl(MS_U32 u32Id)2153 static HVD_EX_Drv_Ctrl *_HVD_EX_GetDrvCtrl(MS_U32 u32Id)
2154 {
2155 MS_U8 u8DrvId = (0xFF & (u32Id >> 16));
2156
2157 return &(_pHVDCtrls[u8DrvId]);
2158 }
2159
_HVD_EX_GetStreamIdx(MS_U32 u32Id)2160 static MS_U8 _HVD_EX_GetStreamIdx(MS_U32 u32Id)
2161 {
2162 MS_U8 u8OffsetIdx = 0;
2163 MS_U8 u8SidBaseMask = 0xF0;
2164 HAL_HVD_StreamId eSidBase = (HAL_HVD_StreamId) (u32Id >> 8 & u8SidBaseMask);
2165
2166 switch (eSidBase)
2167 {
2168 case E_HAL_HVD_MAIN_STREAM_BASE:
2169 {
2170 u8OffsetIdx = 0;
2171 break;
2172 }
2173 case E_HAL_VPU_SUB_STREAM_BASE:
2174 {
2175 u8OffsetIdx = 1;
2176 break;
2177 }
2178 case E_HAL_VPU_MVC_STREAM_BASE:
2179 {
2180 u8OffsetIdx = 0;
2181 break;
2182 }
2183 default:
2184 {
2185 u8OffsetIdx = 0;
2186 break;
2187 }
2188 }
2189
2190 return u8OffsetIdx;
2191 }
2192 /*
2193 static MS_BOOL _HAL_HVD_EX_HVDInUsed(void)
2194 {
2195 MS_U32 i = 0;
2196 for(i = 0; i < HAL_HVD_EX_MAX_SUPPORT_STREAM; i++)
2197 {
2198 if(TRUE == pHVDHalContext->_stHVDStream[i].bUsed)
2199 {
2200 return TRUE;
2201 }
2202 }
2203 return FALSE;
2204 }
2205 */
2206
HAL_HVD_EX_GetShmAddr(MS_U32 u32Id)2207 MS_U32 HAL_HVD_EX_GetShmAddr(MS_U32 u32Id)
2208 {
2209 MS_U32 u32PhyAddr = 0x0;
2210 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
2211
2212 if (pCtrl->MemMap.u32CodeBufAddr == 0)
2213 {
2214 return 0;
2215 }
2216
2217 u32PhyAddr = HAL_VPU_EX_GetShareInfoAddr(u32Id);
2218
2219 if (u32PhyAddr == 0xFFFFFFFF)
2220 {
2221 u32PhyAddr = pCtrl->MemMap.u32CodeBufAddr + (HAL_VPU_EX_GetTaskId(u32Id) * HVD_FW_MEM_OFFSET) + HVD_SHARE_MEM_ST_OFFSET;
2222 }
2223 else
2224 {
2225 #if defined(SUPPORT_NEW_MEM_LAYOUT) || defined(SUPPORT_NEW_VDEC_FLOW)
2226 //u32PhyAddr += 0; // if define HVD_OLD_LAYOUT_SHARE_MEM_BIAS under SUPPORT_NEW_MEM_LAYOUT, then we could refine the codes here
2227 #else
2228 u32PhyAddr += HVD_OLD_LAYOUT_SHARE_MEM_BIAS;
2229 #endif
2230 }
2231
2232 return MsOS_PA2KSEG1(u32PhyAddr);
2233 }
2234
2235
HAL_HVD_MVDMiuClientSel(MS_U8 u8MiuSel)2236 void HAL_HVD_MVDMiuClientSel(MS_U8 u8MiuSel)
2237 {
2238
2239 if (u8MiuSel == 0)
2240 {
2241 _HVD_WriteWordMask(MIU_CLIENT_SELECT_GP2, 0, MIU_CLIENT_SELECT_GP2_MVD);
2242 }
2243 else
2244 {
2245 _HVD_WriteWordMask(MIU_CLIENT_SELECT_GP2, MIU_CLIENT_SELECT_GP2_MVD, MIU_CLIENT_SELECT_GP2_MVD);
2246 }
2247
2248 }
2249
2250
2251
2252
HAL_HVD_EX_InitHW(MS_U32 u32Id,VPU_EX_DecoderType DecoderType)2253 MS_BOOL HAL_HVD_EX_InitHW(MS_U32 u32Id,VPU_EX_DecoderType DecoderType)
2254 {
2255 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
2256 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
2257
2258 // power on / reset HVD; set nal, es rw, bbu parser, release HVD engine
2259 // re-setup clock.
2260
2261 if (!HAL_VPU_EX_HVDInUsed())
2262 {
2263 printf("HVD power on\n");
2264 HAL_HVD_EX_PowerCtrl(TRUE);
2265 }
2266
2267 #if SUPPORT_EVD
2268 if (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
2269 {
2270 printf("EVD power on\n");
2271 HAL_EVD_EX_PowerCtrl(TRUE);
2272 }
2273 #endif
2274
2275 if ((!HAL_VPU_EX_HVDInUsed()) && (DecoderType != E_VPU_EX_DECODER_MVD))
2276 {
2277 pHVDHalContext->_stHVDStream[0].u32BBUWptr = 0; //main
2278 pHVDHalContext->_stHVDStream[1].u32BBUWptr = 0; //sub
2279 pHVDHalContext->u32VP8BBUWptr = 0; //VP8
2280 _HVD_EX_ResetMainSubBBUWptr(u32Id);
2281
2282 _HVD_WriteWordMask(HVD_REG_RESET, HVD_REG_RESET_SWRST, HVD_REG_RESET_SWRST);
2283
2284 _HVD_WriteWordMask(HVD_REG_RESET, HVD_REG_MC_MIU_256 , HVD_REG_MC_MIU_256);
2285
2286
2287 if((pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.bEnable) &&
2288 ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_AVC))
2289 {
2290 if(pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.u32IapGnBufAddr >= HAL_MIU1_BASE)
2291 {
2292 _HAL_HVD_Entry();
2293 HAL_HVD_MVDMiuClientSel(1);
2294 _HAL_HVD_Release();
2295 }
2296 else
2297 {
2298 _HAL_HVD_Entry();
2299 HAL_HVD_MVDMiuClientSel(0);
2300 _HAL_HVD_Release();
2301 }
2302 }
2303 }
2304
2305 #if SUPPORT_EVD
2306 if (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
2307 {
2308 _HVD_WriteWordMask(EVD_REG_RESET, EVD_REG_RESET_SWRST, EVD_REG_RESET_SWRST);
2309 }
2310 #endif
2311
2312 if(pCtrl == NULL)
2313 {
2314 HVD_EX_MSG_ERR("HAL_HVD_EX_InitHW Ctrl is NULL.\n");
2315 //return FALSE;
2316 goto RESET;
2317 }
2318
2319 #if SUPPORT_EVD
2320 if (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
2321 {
2322 _HVD_WriteWordMask(EVD_REG_RESET, EVD_REG_RESET_HK_HEVC_MODE, EVD_REG_RESET_HK_HEVC_MODE);
2323
2324 if ((E_HVD_INIT_MAIN_LIVE_STREAM == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_MAIN_MASK))
2325 ||(E_HVD_INIT_MAIN_FILE_TS == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_MAIN_MASK)))
2326 {
2327 _HVD_WriteWordMask(EVD_REG_RESET, EVD_REG_RESET_HK_TSP2EVD_EN, EVD_REG_RESET_HK_TSP2EVD_EN);
2328 }
2329 goto RESET;
2330 }
2331 #endif
2332
2333 // HVD4, from JANUS and later chip
2334 switch ((pCtrl->InitParams.u32ModeFlag) & E_HVD_INIT_HW_MASK)
2335 {
2336 case E_HVD_INIT_HW_AVS:
2337 {
2338 if (0 == u8TaskId)
2339 {
2340 _HVD_WriteWordMask(HVD_REG_RESET, 0,
2341 HVD_REG_RESET_HK_AVS_MODE | HVD_REG_RESET_HK_RM_MODE);
2342 }
2343 else
2344 {
2345 _HVD_WriteWordMask(HVD_REG_MODE_BS2, 0,
2346 HVD_REG_MODE_HK_AVS_MODE_BS2 | HVD_REG_MODE_HK_RM_MODE_BS2);
2347 }
2348
2349 break;
2350 }
2351 case E_HVD_INIT_HW_RM:
2352 {
2353 if (0 == u8TaskId)
2354 {
2355 _HVD_WriteWordMask(HVD_REG_RESET, 0,
2356 HVD_REG_RESET_HK_AVS_MODE | HVD_REG_RESET_HK_RM_MODE);
2357
2358 if (pCtrl->InitParams.pRVFileInfo->RV_Version) // RV 9,10
2359 {
2360 _HVD_WriteWordMask(HVD_REG_RESET, 0, HVD_REG_RESET_HK_RV9_DEC_MODE);
2361 }
2362 else // RV 8
2363 {
2364 _HVD_WriteWordMask(HVD_REG_RESET, 0, HVD_REG_RESET_HK_RV9_DEC_MODE);
2365 }
2366 }
2367 else
2368 {
2369 _HVD_WriteWordMask(HVD_REG_MODE_BS2, 0,
2370 HVD_REG_MODE_HK_AVS_MODE_BS2 | HVD_REG_MODE_HK_RM_MODE_BS2);
2371
2372 if (pCtrl->InitParams.pRVFileInfo->RV_Version) // RV 9,10
2373 {
2374 _HVD_WriteWordMask(HVD_REG_MODE_BS2, 0, HVD_REG_MODE_HK_RV9_DEC_MODE_BS2);
2375 }
2376 else // RV 8
2377 {
2378 _HVD_WriteWordMask(HVD_REG_MODE_BS2, 0, HVD_REG_MODE_HK_RV9_DEC_MODE_BS2);
2379 }
2380
2381 }
2382
2383 break;
2384 }
2385 default:
2386 {
2387 if (0 == u8TaskId)
2388 {
2389 _HVD_WriteWordMask(HVD_REG_RESET, 0, HVD_REG_RESET_HK_AVS_MODE | HVD_REG_RESET_HK_RM_MODE);
2390 }
2391 else
2392 {
2393 _HVD_WriteWordMask(HVD_REG_MODE_BS2, 0, HVD_REG_MODE_HK_AVS_MODE_BS2 | HVD_REG_MODE_HK_RM_MODE_BS2);
2394 }
2395 break;
2396 }
2397 }
2398
2399 RESET:
2400 //T9: use miu128bit
2401 HVD_EX_MSG_DBG("(be)Miu128 bits Status = %x <<<<<<<\n", _HVD_Read2Byte(HVD_REG_RESET));
2402
2403 if (!HAL_VPU_EX_HVDInUsed())
2404 {
2405 _HVD_Write2Byte(HVD_REG_RESET, (_HVD_Read2Byte(HVD_REG_RESET) | HVD_REG_RESET_MIU_128));
2406 }
2407
2408 HVD_EX_MSG_DBG("(af)Miu128 bits Status = %x <<<<<<<\n", _HVD_Read2Byte(HVD_REG_RESET));
2409
2410 #if SUPPORT_EVD
2411 if (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
2412 {
2413 printf("EVD miu 256 bits\n");
2414 _HVD_Write2Byte(EVD_REG_RESET, (_HVD_Read2Byte(EVD_REG_RESET) | EVD_REG_RESET_MIU_256));
2415 }
2416 #endif
2417 #if 0 //defined(SUPPORT_NEW_MEM_LAYOUT) || defined(SUPPORT_NEW_VDEC_FLOW)
2418 // Only ES buffer addrress needs to be set for VP8
2419 _HVD_EX_SetESBufferAddr(u32Id);
2420 #else
2421 if(DecoderType != E_VPU_EX_DECODER_MVD)
2422 {
2423 _HVD_EX_SetBufferAddr(u32Id);
2424 }
2425 #endif
2426 if (!HAL_VPU_EX_HVDInUsed())
2427 {
2428 _HVD_WriteWordMask(HVD_REG_RESET, 0, HVD_REG_RESET_SWRST);
2429 }
2430
2431 #if SUPPORT_EVD
2432 if (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
2433 {
2434 _HVD_WriteWordMask(EVD_REG_RESET, 0, EVD_REG_RESET_SWRST);
2435 }
2436 #endif
2437
2438 return TRUE;
2439 }
2440
HAL_HVD_EX_DeinitHW(void)2441 MS_BOOL HAL_HVD_EX_DeinitHW(void)
2442 {
2443 MS_U16 u16Timeout = 1000;
2444
2445 _HVD_EX_SetMIUProtectMask(TRUE);
2446
2447 #if SUPPORT_EVD //EVD using HVD DIU, it should be turn off EVD first
2448 //We assume HEVC belong to HVD, so we can disable EVD_REG_RESET_HK_TSP2EVD_EN in DeinitHW.
2449 _HVD_Write2Byte(EVD_REG_RESET, (_HVD_Read2Byte(EVD_REG_RESET) & ~EVD_REG_RESET_HK_TSP2EVD_EN)); //0: tsp2hvd, coz EVD & HVD use the same MVD parser
2450 HAL_EVD_EX_DeinitHW();
2451 #endif
2452
2453 _HVD_WriteWordMask(HVD_REG_RESET, HVD_REG_RESET_SWRST, HVD_REG_RESET_SWRST);
2454
2455 while (u16Timeout)
2456 {
2457 if ((_HVD_Read2Byte(HVD_REG_RESET) & (HVD_REG_RESET_SWRST_FIN)) == (HVD_REG_RESET_SWRST_FIN))
2458 {
2459 break;
2460 }
2461 u16Timeout--;
2462 }
2463
2464 HAL_HVD_EX_PowerCtrl(FALSE);
2465
2466 _HVD_EX_SetMIUProtectMask(FALSE);
2467
2468 return TRUE;
2469 }
2470
HAL_HVD_EX_FlushMemory(void)2471 void HAL_HVD_EX_FlushMemory(void)
2472 {
2473 MsOS_FlushMemory();
2474 }
2475
HAL_HVD_EX_ReadMemory(void)2476 void HAL_HVD_EX_ReadMemory(void)
2477 {
2478 MsOS_ReadMemory();
2479 }
2480
HAL_HVD_EX_SetDrvCtrlsBase(HVD_EX_Drv_Ctrl * pHVDCtrlsBase)2481 void HAL_HVD_EX_SetDrvCtrlsBase(HVD_EX_Drv_Ctrl *pHVDCtrlsBase)
2482 {
2483 _pHVDCtrls = pHVDCtrlsBase;
2484 }
2485
HAL_HVD_EX_CheckMIUSel(MS_BOOL bChange)2486 void HAL_HVD_EX_CheckMIUSel(MS_BOOL bChange)
2487 {
2488 return;
2489 }
2490
HAL_HVD_EX_GetHWVersionID(void)2491 MS_U32 HAL_HVD_EX_GetHWVersionID(void)
2492 {
2493 return _HVD_Read2Byte(HVD_REG_REV_ID);
2494 }
2495
2496
HAL_HVD_EX_Init_Share_Mem(void)2497 MS_BOOL HAL_HVD_EX_Init_Share_Mem(void)
2498 {
2499 #if (defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_ECOS))
2500 #if !defined(SUPPORT_X_MODEL_FEATURE)
2501 MS_U32 u32ShmId;
2502 MS_U32 u32Addr;
2503 MS_U32 u32BufSize;
2504
2505
2506 if (FALSE == MsOS_SHM_GetId( (MS_U8*)"Linux HVD HAL",
2507 sizeof(HVD_Hal_CTX),
2508 &u32ShmId,
2509 &u32Addr,
2510 &u32BufSize,
2511 MSOS_SHM_QUERY))
2512 {
2513 if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux HVD HAL",
2514 sizeof(HVD_Hal_CTX),
2515 &u32ShmId,
2516 &u32Addr,
2517 &u32BufSize,
2518 MSOS_SHM_CREATE))
2519 {
2520 HVD_EX_MSG_ERR("[%s]SHM allocation failed!!!use global structure instead!!!\n",__FUNCTION__);
2521 if(pHVDHalContext == NULL)
2522 {
2523 pHVDHalContext = &gHVDHalContext;
2524 memset(pHVDHalContext,0,sizeof(HVD_Hal_CTX));
2525 _HVD_EX_Context_Init_HAL();
2526 HVD_PRINT("[%s]Global structure init Success!!!\n",__FUNCTION__);
2527 }
2528 else
2529 {
2530 HVD_PRINT("[%s]Global structure exists!!!\n",__FUNCTION__);
2531 }
2532 //return FALSE;
2533 }
2534 else
2535 {
2536 memset((MS_U8*)u32Addr,0,sizeof(HVD_Hal_CTX));
2537 pHVDHalContext = (HVD_Hal_CTX*)u32Addr; // for one process
2538 _HVD_EX_Context_Init_HAL();
2539 }
2540 }
2541 else
2542 {
2543 pHVDHalContext = (HVD_Hal_CTX*)u32Addr; // for another process
2544 }
2545 #else
2546 if(pHVDHalContext == NULL)
2547 {
2548 pHVDHalContext = &gHVDHalContext;
2549 memset(pHVDHalContext,0,sizeof(HVD_Hal_CTX));
2550 _HVD_EX_Context_Init_HAL();
2551 }
2552 #endif
2553 _HAL_HVD_MutexCreate();
2554 #else
2555 if(pHVDHalContext == NULL)
2556 {
2557 pHVDHalContext = &gHVDHalContext;
2558 memset(pHVDHalContext,0,sizeof(HVD_Hal_CTX));
2559 _HVD_EX_Context_Init_HAL();
2560 }
2561 #endif
2562
2563 return TRUE;
2564 }
2565
2566
HAL_HVD_EX_GetFreeStream(HAL_HVD_StreamType eStreamType)2567 HAL_HVD_StreamId HAL_HVD_EX_GetFreeStream(HAL_HVD_StreamType eStreamType)
2568 {
2569 MS_U32 i = 0;
2570
2571 if (eStreamType == E_HAL_HVD_MVC_STREAM)
2572 {
2573 if ((FALSE == pHVDHalContext->_stHVDStream[0].bUsed) && (FALSE == pHVDHalContext->_stHVDStream[1].bUsed))
2574 return pHVDHalContext->_stHVDStream[0].eStreamId;
2575 }
2576 else if (eStreamType == E_HAL_HVD_MAIN_STREAM)
2577 {
2578 for (i = 0;
2579 i <
2580 ((E_HAL_HVD_MAIN_STREAM_MAX - E_HAL_HVD_MAIN_STREAM_BASE) +
2581 (E_HAL_HVD_SUB_STREAM_MAX - E_HAL_HVD_SUB_STREAM_BASE)); i++)
2582 {
2583 if ((E_HAL_HVD_MAIN_STREAM_BASE & pHVDHalContext->_stHVDStream[i].eStreamId) && (FALSE == pHVDHalContext->_stHVDStream[i].bUsed))
2584 {
2585 return pHVDHalContext->_stHVDStream[i].eStreamId;
2586 }
2587 }
2588 }
2589 else if (eStreamType == E_HAL_HVD_SUB_STREAM)
2590 {
2591 for (i = 0;
2592 i <
2593 ((E_HAL_HVD_MAIN_STREAM_MAX - E_HAL_HVD_MAIN_STREAM_BASE) +
2594 (E_HAL_HVD_SUB_STREAM_MAX - E_HAL_HVD_SUB_STREAM_BASE)); i++)
2595 {
2596 if ((E_HAL_HVD_SUB_STREAM_BASE & pHVDHalContext->_stHVDStream[i].eStreamId) && (FALSE == pHVDHalContext->_stHVDStream[i].bUsed))
2597 {
2598 return pHVDHalContext->_stHVDStream[i].eStreamId;
2599 }
2600 }
2601 }
2602
2603 return E_HAL_HVD_STREAM_NONE;
2604 }
2605
HAL_HVD_EX_PowerCtrl(MS_BOOL bEnable)2606 void HAL_HVD_EX_PowerCtrl(MS_BOOL bEnable)
2607 {
2608 if (bEnable)
2609 {
2610 _HVD_WriteByteMask(REG_TOP_HVD, ~TOP_CKG_HVD_DIS, TOP_CKG_HVD_DIS);
2611 }
2612 else
2613 {
2614 _HVD_WriteByteMask(REG_TOP_HVD, TOP_CKG_HVD_DIS, TOP_CKG_HVD_DIS);
2615 }
2616
2617 // fix to not inverse
2618 _HVD_WriteByteMask(REG_TOP_HVD, ~TOP_CKG_HVD_INV, TOP_CKG_HVD_INV);
2619
2620 switch (pHVDHalContext->u32HVDClockType)
2621 {
2622 case 240:
2623 {
2624 _HVD_WriteByteMask(REG_TOP_HVD, TOP_CKG_HVD_240MHZ, TOP_CKG_HVD_CLK_MASK);
2625
2626 break;
2627 }
2628 case 216:
2629 {
2630 _HVD_WriteByteMask(REG_TOP_HVD, TOP_CKG_HVD_216MHZ, TOP_CKG_HVD_CLK_MASK);
2631
2632 break;
2633 }
2634 case 172:
2635 {
2636 _HVD_WriteByteMask(REG_TOP_HVD, TOP_CKG_HVD_172MHZ, TOP_CKG_HVD_CLK_MASK);
2637
2638 break;
2639 }
2640 case 160:
2641 {
2642 _HVD_WriteByteMask(REG_TOP_HVD, TOP_CKG_HVD_160MHZ, TOP_CKG_HVD_CLK_MASK);
2643
2644 break;
2645 }
2646 default:
2647 {
2648 _HVD_WriteByteMask(REG_TOP_HVD, TOP_CKG_HVD_240MHZ, TOP_CKG_HVD_CLK_MASK); // TODO://if(hvd_clk > miu_clk) set to TOP_CKG_HVD_IDB_CLK_HVD_MIU = 0
2649 // TODO://else set to TOP_CKG_HVD_IDB_CLK_HVD_MIU = 1
2650 break;
2651 }
2652 }
2653
2654 return;
2655 }
2656
HAL_HVD_EX_InitRegBase(MS_U32 u32RegBase)2657 void HAL_HVD_EX_InitRegBase(MS_U32 u32RegBase)
2658 {
2659 u32HVDRegOSBase = u32RegBase;
2660 HAL_VPU_EX_InitRegBase(u32RegBase);
2661 }
2662
HAL_HVD_EX_SetPreCtrlVariables(MS_U32 u32Id,MS_U32 drvprectrl)2663 void HAL_HVD_EX_SetPreCtrlVariables(MS_U32 u32Id,MS_U32 drvprectrl)
2664 {
2665 HVD_Pre_Ctrl *pHVDPreCtrl_in = (HVD_Pre_Ctrl*)drvprectrl;
2666 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
2667 pHVDHalContext->pHVDPreCtrl_Hal[u8Idx] = pHVDPreCtrl_in;
2668 }
2669
HAL_HVD_EX_InitVariables(MS_U32 u32Id)2670 HVD_Return HAL_HVD_EX_InitVariables(MS_U32 u32Id)
2671 {
2672 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
2673 HVD_ShareMem *pShm = NULL;
2674 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
2675 #if HVD_ENABLE_MVC
2676 MS_BOOL bMVC = HAL_HVD_EX_CheckMVCID(u32Id);
2677 #endif ///HVD_ENABLE_MVC
2678
2679 pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr = 0;
2680 pHVDHalContext->_stHVDStream[u8Idx].u32PTSByteCnt = 0;
2681 pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum = 0;
2682 pHVDHalContext->_stHVDStream[u8Idx].u32DispQIndex = 0;
2683 pHVDHalContext->_stHVDStream[u8Idx].u32FreeData = 0xFFFF;
2684 #if HVD_ENABLE_MVC
2685 if(bMVC)
2686 {
2687 pHVDHalContext->_stHVDStream[u8Idx+1].u32PTSPreWptr = 0;
2688 pHVDHalContext->_stHVDStream[u8Idx+1].u32PTSByteCnt = 0;
2689 pHVDHalContext->_stHVDStream[u8Idx+1].u32BBUWptr = 0;
2690 pHVDHalContext->_stHVDStream[u8Idx+1].u32BBUEntryNum = 0;
2691 }
2692 #endif ///HVD_ENABLE_MVC
2693
2694 // set a local copy of FW code address; assuming there is only one copy of FW,
2695 // no matter how many task will be created.
2696
2697 pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2698
2699 memset((void *) (pHVDHalContext->g_hvd_nal_fill_pair), 0, 16);
2700
2701 // global variables
2702 pHVDHalContext->u32HVDCmdTimeout = pCtrl->u32CmdTimeout;
2703
2704
2705 // pHVDHalContext->u32VPUClockType = (MS_U32) pCtrl->InitParams.u16DecoderClock;
2706 // pHVDHalContext->u32HVDClockType = (MS_U32) pCtrl->InitParams.u16DecoderClock;
2707 // Create mutex
2708 //_HAL_HVD_MutexCreate();
2709
2710 // fill HVD init variables
2711 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
2712 {
2713 pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum = VP8_BBU_DRAM_TBL_ENTRY;
2714 pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNumTH = VP8_BBU_DRAM_TBL_ENTRY_TH;
2715 }
2716 else
2717 #if HVD_ENABLE_RV_FEATURE
2718 if (((pCtrl->InitParams.u32ModeFlag) & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_RM)
2719 {
2720 pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum = RVD_BBU_DRAM_TBL_ENTRY;
2721 pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNumTH = RVD_BBU_DRAM_TBL_ENTRY_TH;
2722
2723 if (pCtrl->MemMap.u32FrameBufSize > RV_VLC_TABLE_SIZE)
2724 {
2725 pHVDHalContext->u32RV_VLCTableAddr = pCtrl->MemMap.u32FrameBufSize - RV_VLC_TABLE_SIZE;
2726 pCtrl->MemMap.u32FrameBufSize -= RV_VLC_TABLE_SIZE;
2727 }
2728 else
2729 {
2730 HVD_EX_MSG_ERR("HAL_HVD_EX_InitVariables failed: frame buffer size too small. FB:%lx min:%lx\n",
2731 (MS_U32) pCtrl->MemMap.u32FrameBufSize, (MS_U32) RV_VLC_TABLE_SIZE);
2732 return E_HVD_RETURN_INVALID_PARAMETER;
2733 }
2734 }
2735 else
2736 #endif
2737 {
2738 pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum = HVD_BBU_DRAM_TBL_ENTRY;
2739 pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNumTH = HVD_BBU_DRAM_TBL_ENTRY_TH;
2740 #if HVD_ENABLE_MVC
2741 if(bMVC)
2742 {
2743 pHVDHalContext->_stHVDStream[u8Idx+1].u32BBUEntryNum = MVC_BBU_DRAM_TBL_ENTRY;
2744 pHVDHalContext->_stHVDStream[u8Idx+1].u32BBUEntryNumTH = MVC_BBU_DRAM_TBL_ENTRY_TH;
2745 }
2746 #endif /// HVD_ENABLE_MVC
2747 pHVDHalContext->u32RV_VLCTableAddr = 0;
2748 }
2749
2750 if ((HAL_VPU_EX_GetShareInfoAddr(u32Id) != 0xFFFFFFFF)
2751 || ((pCtrl->MemMap.u32CodeBufVAddr <= (MS_U32) pShm) && ((MS_U32) pShm <= (pCtrl->MemMap.u32CodeBufVAddr + pCtrl->MemMap.u32CodeBufSize)))
2752 || ((pCtrl->MemMap.u32BitstreamBufVAddr <= (MS_U32) pShm) && ((MS_U32) pShm <= (pCtrl->MemMap.u32BitstreamBufVAddr + pCtrl->MemMap.u32BitstreamBufSize)))
2753 || ((pCtrl->MemMap.u32FrameBufVAddr <= (MS_U32) pShm) && ((MS_U32) pShm <= (pCtrl->MemMap.u32FrameBufVAddr + pCtrl->MemMap.u32FrameBufSize))))
2754 {
2755 HVD_EX_MSG_DBG("input memory: Code addr=0x%lx, Bits addr=0x%lx, FB addr=0x%lx, Miubase=0x%lx\n",
2756 pCtrl->MemMap.u32CodeBufAddr,
2757 pCtrl->MemMap.u32FrameBufAddr,
2758 pCtrl->MemMap.u32BitstreamBufAddr,
2759 pCtrl->MemMap.u32MIU1BaseAddr);
2760 #if HVD_ENABLE_MVC
2761 if(bMVC)
2762 {
2763 HVD_EX_Drv_Ctrl *pHVDCtrl_in_sub = _HVD_EX_GetDrvCtrl(u32Id+0x00011000);
2764 if (( (pHVDCtrl_in_sub->MemMap.u32BitstreamBufVAddr)<= (MS_U32)pShm)&& ( (MS_U32)pShm <= ((pHVDCtrl_in_sub->MemMap.u32BitstreamBufVAddr )+ pHVDCtrl_in_sub->MemMap.u32BitstreamBufSize)))
2765 {
2766 HVD_EX_MSG_DBG("[MVC] Bitstream2: 0x%lx.\n", pCtrl->MemMap.u32BitstreamBufAddr);
2767 }
2768 }
2769 #endif /// HVD_ENABLE_MVC
2770
2771 return E_HVD_RETURN_SUCCESS;
2772 }
2773 else
2774 {
2775 HVD_EX_MSG_ERR("failed: Shm addr=0x%lx, Code addr=0x%lx, Bits addr=0x%lx, FB addr=0x%lx, Miubase=0x%lx\n",
2776 MS_PA2KSEG1((MS_U32) pShm),
2777 pCtrl->MemMap.u32CodeBufAddr,
2778 pCtrl->MemMap.u32FrameBufAddr,
2779 pCtrl->MemMap.u32BitstreamBufAddr,
2780 pCtrl->MemMap.u32MIU1BaseAddr);
2781 return E_HVD_RETURN_INVALID_PARAMETER;
2782 }
2783 }
2784
HAL_HVD_EX_InitShareMem(MS_U32 u32Id)2785 HVD_Return HAL_HVD_EX_InitShareMem(MS_U32 u32Id)
2786 {
2787 MS_U32 u32Addr = 0;
2788 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
2789 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
2790 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2791
2792 memset(pShm, 0, sizeof(HVD_ShareMem));
2793
2794 u32Addr = pCtrl->MemMap.u32FrameBufAddr;
2795
2796 if (u32Addr >= pCtrl->MemMap.u32MIU1BaseAddr)
2797 {
2798 u32Addr -= pCtrl->MemMap.u32MIU1BaseAddr;
2799 }
2800
2801 pShm->u32FrameRate = pCtrl->InitParams.u32FrameRate;
2802 pShm->u32FrameRateBase = pCtrl->InitParams.u32FrameRateBase;
2803 pShm->u32FrameBufAddr = u32Addr;
2804 pShm->u32FrameBufSize = pCtrl->MemMap.u32FrameBufSize;
2805 pShm->DispInfo.u16DispWidth = 1;
2806 pShm->DispInfo.u16DispHeight = 1;
2807 pShm->u32CodecType = pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK;
2808 pShm->u32CPUClock = pHVDHalContext->u32VPUClockType;
2809 pShm->u32UserCCIdxWrtPtr = 0xFFFFFFFF;
2810 pShm->DispFrmInfo.u32TimeStamp = 0xFFFFFFFF;
2811 //Chip info
2812 pShm->u16ChipID = E_MSTAR_CHIP_MUSTANG;
2813 pShm->u16ChipECONum = pCtrl->InitParams.u16ChipECONum;
2814 // PreSetControl
2815 if (pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->bOnePendingBuffer)
2816 {
2817 pShm->u32PreSetControl |= PRESET_ONE_PENDING_BUFFER;
2818 }
2819
2820
2821 if ((pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.bEnable) &&
2822 ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_AVC))
2823 {
2824 pShm->u32PreSetControl |= PRESET_IAP_GN_SHARE_BW_MODE;
2825
2826 if(pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.u32IapGnBufAddr >= HAL_MIU1_BASE)
2827 {
2828 pShm->u32IapGnBufAddr = pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.u32IapGnBufAddr - HAL_MIU1_BASE;
2829 pShm->u32IapGnBufSize = pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.u32IapGnBufSize;
2830 }
2831 else
2832 {
2833 pShm->u32IapGnBufAddr = pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.u32IapGnBufAddr;
2834 pShm->u32IapGnBufSize = pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.u32IapGnBufSize;
2835 }
2836 }
2837
2838
2839 //pShm->bColocateBBUMode = pCtrl->InitParams.bColocateBBUMode;//johnny.ko
2840 //pShm->bColocateBBUMode = _stHVDPreSet[u8Idx].bColocateBBUMode;//johnny.ko
2841 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
2842 pShm->u8BBUMode = E_HVD_FW_AUTO_BBU_MODE;
2843 else
2844 pShm->u8BBUMode = E_HVD_DRV_AUTO_BBU_MODE;
2845 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_MAIN_MASK) == E_HVD_INIT_MAIN_FILE_RAW)
2846 {
2847 if((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_DUAL_ES_MASK) == E_HVD_INIT_DUAL_ES_ENABLE)
2848 {
2849 pShm->u8SrcMode = E_HVD_SRC_MODE_FILE_DUAL_ES;
2850 }
2851 else
2852 {
2853 pShm->u8SrcMode = E_HVD_SRC_MODE_FILE;
2854 }
2855 }
2856 else if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_MAIN_MASK) == E_HVD_INIT_MAIN_FILE_TS)
2857 {
2858 if((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_DUAL_ES_MASK) == E_HVD_INIT_DUAL_ES_ENABLE)
2859 {
2860 pShm->u8SrcMode = E_HVD_SRC_MODE_TS_FILE_DUAL_ES;
2861 }
2862 else
2863 {
2864 pShm->u8SrcMode = E_HVD_SRC_MODE_TS_FILE;
2865 }
2866 }
2867 else
2868 {
2869 pShm->u8SrcMode = E_HVD_SRC_MODE_DTV;
2870 }
2871
2872 #if 1//From T4 and the later chips, QDMA can support the address more than MIU1 base.
2873 if(pCtrl->MemMap.u32CodeBufAddr >= HAL_MIU1_BASE)
2874 {
2875 pShm->u32FWBaseAddr = (pCtrl->MemMap.u32CodeBufAddr-HAL_MIU1_BASE) | 0x40000000; //Bit30 sel miu0/1
2876 }
2877 else
2878 {
2879 pShm->u32FWBaseAddr = pCtrl->MemMap.u32CodeBufAddr;
2880 }
2881 //printf("<DBG>QDMA Addr = %lx <<<<<<<<<<<<<<<<<<<<<<<<\n",pShm->u32FWBaseAddr);
2882 #else
2883 u32Addr = pCtrl->MemMap.u32CodeBufAddr;
2884 if (u32Addr >= pCtrl->MemMap.u32MIU1BaseAddr)
2885 {
2886 u32Addr -= pCtrl->MemMap.u32MIU1BaseAddr;
2887 }
2888 pShm->u32FWBaseAddr = u32Addr;
2889 #endif
2890
2891 // RM only
2892 #if HVD_ENABLE_RV_FEATURE
2893 if ((((pCtrl->InitParams.u32ModeFlag) & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_RM)
2894 && (pCtrl->InitParams.pRVFileInfo != NULL))
2895 {
2896 MS_U32 i = 0;
2897
2898 for (i = 0; i < HVD_RM_INIT_PICTURE_SIZE_NUMBER; i++)
2899 {
2900 pShm->pRM_PictureSize[i].u16Width = pCtrl->InitParams.pRVFileInfo->ulPicSizes_w[i];
2901 pShm->pRM_PictureSize[i].u16Height = pCtrl->InitParams.pRVFileInfo->ulPicSizes_h[i];
2902 }
2903
2904 pShm->u8RM_Version = (MS_U8) pCtrl->InitParams.pRVFileInfo->RV_Version;
2905 pShm->u8RM_NumSizes = (MS_U8) pCtrl->InitParams.pRVFileInfo->ulNumSizes;
2906 u32Addr = pCtrl->MemMap.u32FrameBufAddr + pHVDHalContext->u32RV_VLCTableAddr;
2907
2908 if (u32Addr >= pCtrl->MemMap.u32MIU1BaseAddr)
2909 {
2910 u32Addr -= pCtrl->MemMap.u32MIU1BaseAddr;
2911 }
2912
2913 pShm->u32RM_VLCTableAddr = u32Addr;
2914 }
2915 #endif
2916
2917 if ((E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
2918 && (pCtrl->InitParams.pRVFileInfo != NULL))
2919 {
2920 pShm->pRM_PictureSize[0].u16Width = pCtrl->InitParams.pRVFileInfo->ulPicSizes_w[0];
2921 pShm->pRM_PictureSize[0].u16Height = pCtrl->InitParams.pRVFileInfo->ulPicSizes_h[0];
2922 }
2923
2924 //if(pCtrl->InitParams.bColocateBBUMode)
2925 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
2926 {
2927 pShm->u32ColocateBBUWritePtr = pShm->u32ColocateBBUReadPtr = pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr;
2928 }
2929
2930 HAL_HVD_EX_FlushMemory();
2931
2932 return E_HVD_RETURN_SUCCESS;
2933 }
2934
HAL_HVD_EX_InitRegCPU(MS_U32 u32Id)2935 HVD_Return HAL_HVD_EX_InitRegCPU(MS_U32 u32Id)
2936 {
2937 MS_BOOL bInitRet = FALSE;
2938
2939 #if 0
2940 // check MVD power on
2941 if (_HVD_Read2Byte(REG_TOP_MVD) & (TOP_CKG_MHVD_DIS))
2942 {
2943 HVD_EX_MSG_INF("HVD warning: MVD is not power on before HVD init.\n");
2944 _HVD_WriteWordMask(REG_TOP_MVD, 0, TOP_CKG_MHVD_DIS);
2945 HVD_Delay_ms(1);
2946 }
2947 // Check VPU power on
2948 if (_HVD_Read2Byte(REG_TOP_VPU) & (TOP_CKG_VPU_DIS))
2949 {
2950 HVD_EX_MSG_INF("HVD warning: VPU is not power on before HVD init.\n");
2951 _HVD_WriteWordMask(REG_TOP_VPU, 0, TOP_CKG_VPU_DIS);
2952 HVD_Delay_ms(1);
2953 }
2954 // check HVD power on
2955 if (_HVD_Read2Byte(REG_TOP_HVD) & (TOP_CKG_HVD_DIS))
2956 {
2957 HVD_EX_MSG_INF("HVD warning: HVD is not power on before HVD init.\n");
2958 HAL_HVD_EX_PowerCtrl(TRUE);
2959 HVD_Delay_ms(1);
2960 }
2961 #endif
2962
2963 bInitRet = _HVD_EX_SetRegCPU(u32Id);
2964
2965 if (!bInitRet)
2966 {
2967 return E_HVD_RETURN_FAIL;
2968 }
2969
2970 bInitRet = HAL_HVD_EX_RstPTSCtrlVariable(u32Id);
2971
2972 if (!bInitRet)
2973 {
2974 return E_HVD_RETURN_FAIL;
2975 }
2976
2977 return E_HVD_RETURN_SUCCESS;
2978 }
2979
HAL_HVD_EX_SetHVDColBBUMode(MS_U32 u32Id,MS_BOOL bEnable)2980 HVD_Return HAL_HVD_EX_SetHVDColBBUMode(MS_U32 u32Id, MS_BOOL bEnable)
2981 {
2982 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
2983
2984 _stHVDPreSet[u8Idx].bColocateBBUMode = bEnable;
2985
2986 return E_HVD_RETURN_SUCCESS;
2987 }
2988
HAL_HVD_EX_SetData(MS_U32 u32Id,HVD_SetData u32type,MS_U32 u32Data)2989 HVD_Return HAL_HVD_EX_SetData(MS_U32 u32Id, HVD_SetData u32type, MS_U32 u32Data)
2990 {
2991 HVD_Return eRet = E_HVD_RETURN_SUCCESS;
2992 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2993 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
2994 MS_BOOL bMVC = FALSE;
2995 #if HVD_ENABLE_MVC
2996 bMVC = HAL_HVD_EX_CheckMVCID(u32Id);
2997 #endif
2998
2999 switch (u32type)
3000 {
3001 // share memory
3002 // switch
3003 case E_HVD_SDATA_FRAMEBUF_ADDR:
3004 {
3005 pShm->u32FrameBufAddr = u32Data;
3006 break;
3007 }
3008 case E_HVD_SDATA_FRAMEBUF_SIZE:
3009 {
3010 pShm->u32FrameBufSize = u32Data;
3011 break;
3012 }
3013 case E_HVD_SDATA_RM_PICTURE_SIZES:
3014 {
3015 HVD_memcpy((volatile void *) pShm->pRM_PictureSize, (void *) ((HVD_PictureSize *) u32Data),
3016 HVD_RM_INIT_PICTURE_SIZE_NUMBER * sizeof(HVD_PictureSize));
3017 break;
3018 }
3019 case E_HVD_SDATA_ERROR_CODE:
3020 {
3021 pShm->u16ErrCode = (MS_U16) u32Data;
3022 break;
3023 }
3024 case E_HVD_SDATA_DISP_INFO_TH:
3025 {
3026 HVD_memcpy((volatile void *) &(pShm->DispThreshold), (void *) ((HVD_DISP_THRESHOLD *) u32Data),
3027 sizeof(HVD_DISP_THRESHOLD));
3028 break;
3029 }
3030 case E_HVD_SDATA_FW_FLUSH_STATUS:
3031 {
3032 pShm->u8FlushStatus = (MS_U8)u32Data;
3033 break;
3034 }
3035 case E_HVD_SDATA_DMX_FRAMERATE:
3036 {
3037 pShm->u32DmxFrameRate = u32Data;
3038 break;
3039 }
3040 case E_HVD_SDATA_DMX_FRAMERATEBASE:
3041 {
3042 pShm->u32DmxFrameRateBase = u32Data;
3043 break;
3044 }
3045 // SRAM
3046
3047 // Mailbox
3048 case E_HVD_SDATA_TRIGGER_DISP: // HVD HI mbox 0
3049 {
3050 if (u32Data != 0)
3051 {
3052 pShm->bEnableDispCtrl = TRUE;
3053 pShm->bIsTrigDisp = TRUE;
3054 }
3055 else
3056 {
3057 pShm->bEnableDispCtrl = FALSE;
3058 }
3059
3060 break;
3061 }
3062 case E_HVD_SDATA_GET_DISP_INFO_START:
3063 {
3064 pShm->bSpsChange = FALSE;
3065 break;
3066 }
3067 case E_HVD_SDATA_VIRTUAL_BOX_WIDTH:
3068 {
3069 pShm->u32VirtualBoxWidth = u32Data;
3070 break;
3071 }
3072 case E_HVD_SDATA_VIRTUAL_BOX_HEIGHT:
3073 {
3074 pShm->u32VirtualBoxHeight = u32Data;
3075 break;
3076 }
3077 case E_HVD_SDATA_DISPQ_STATUS_VIEW:
3078 {
3079 if (pShm->DispQueue[u32Data].u32Status == E_HVD_DISPQ_STATUS_INIT)
3080 {
3081 //printf("DispFrame DqPtr: %d\n", u32Data);
3082 pShm->DispQueue[u32Data].u32Status = E_HVD_DISPQ_STATUS_VIEW;
3083 }
3084 break;
3085 }
3086 case E_HVD_SDATA_DISPQ_STATUS_DISP:
3087 {
3088 if(!(pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide))
3089 {
3090 if (pShm->DispQueue[u32Data].u32Status == E_HVD_DISPQ_STATUS_VIEW)
3091 {
3092 //printf("DispFrame DqPtr: %ld\n", u32Data);
3093 pShm->DispQueue[u32Data].u32Status = E_HVD_DISPQ_STATUS_DISP;
3094 }
3095 }
3096 break;
3097 }
3098 case E_HVD_SDATA_DISPQ_STATUS_FREE:
3099 {
3100 if(pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide)
3101 {
3102 if (bMVC)
3103 {
3104 if (pHVDHalContext->_stHVDStream[u8Idx].u32FreeData == 0xFFFF)
3105 {
3106 //ALOGE("R1: %x", u32Data);
3107 pHVDHalContext->_stHVDStream[u8Idx].u32FreeData = u32Data;
3108 }
3109 else
3110 {
3111 //ALOGE("R2: %x", (u32Data << 16) | pHVDHalContext->_stHVDStream[u8Idx].u32FreeData);
3112 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_RELEASE_DISPQ, (u32Data << 16) | pHVDHalContext->_stHVDStream[u8Idx].u32FreeData);
3113 //pShm->FreeQueue[pShm->u16FreeQWtPtr] = (u32Data << 16) | pHVDHalContext->_stHVDStream[u8Idx].u32FreeData;
3114 //pShm->u16FreeQWtPtr = (pShm->u16FreeQWtPtr + 1) % HVD_DISP_QUEUE_MAX_SIZE;
3115 pHVDHalContext->_stHVDStream[u8Idx].u32FreeData = 0xFFFF;
3116 }
3117 }
3118 else
3119 {
3120 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_RELEASE_DISPQ, u32Data);
3121 }
3122 }
3123 else
3124 {
3125 if (pShm->DispQueue[u32Data].u32Status == E_HVD_DISPQ_STATUS_VIEW)
3126 {
3127 pShm->DispQueue[u32Data].u32Status = E_HVD_DISPQ_STATUS_FREE;
3128 }
3129 }
3130 break;
3131 }
3132 default:
3133 break;
3134 }
3135
3136 HAL_HVD_EX_FlushMemory();
3137
3138 return eRet;
3139 }
3140
HAL_HVD_EX_GetData_EX(MS_U32 u32Id,HVD_GetData eType)3141 MS_S64 HAL_HVD_EX_GetData_EX(MS_U32 u32Id, HVD_GetData eType)
3142 {
3143 MS_S64 s64Ret = 0;
3144 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
3145
3146 HAL_HVD_EX_ReadMemory();
3147
3148 switch (eType)
3149 {
3150 case E_HVD_GDATA_PTS_STC_DIFF:
3151 s64Ret = pShm->s64PtsStcDiff;
3152 break;
3153 default:
3154 break;
3155 }
3156
3157 return s64Ret;
3158 }
3159
HAL_HVD_EX_GetData(MS_U32 u32Id,HVD_GetData eType)3160 MS_U32 HAL_HVD_EX_GetData(MS_U32 u32Id, HVD_GetData eType)
3161 {
3162 MS_U32 u32Ret = 0;
3163 //static MS_U64 u64pts_real = 0;
3164 MS_U64 u64pts_low = 0;
3165 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
3166 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
3167
3168 HAL_HVD_EX_ReadMemory();
3169
3170 if(pShm == NULL)
3171 {
3172 printf("########## VDEC patch for Debug ###########\n");
3173 return 0x0;
3174 }
3175
3176 switch (eType)
3177 {
3178 // share memory
3179 // switch
3180 case E_HVD_GDATA_DISP_INFO_ADDR:
3181 {
3182 u32Ret = (MS_U32) (&pShm->DispInfo);
3183 break;
3184 }
3185 // report
3186 case E_HVD_GDATA_PTS:
3187 {
3188 u32Ret = pShm->DispFrmInfo.u32TimeStamp;
3189 break;
3190 }
3191 case E_HVD_GDATA_U64PTS:
3192 {
3193 u64pts_low = (MS_U64)(pShm->DispFrmInfo.u32TimeStamp);
3194 pHVDHalContext->u64pts_real = (MS_U64)(pShm->DispFrmInfo.u32ID_H);
3195 pHVDHalContext->u64pts_real = (pHVDHalContext->u64pts_real<<32)|u64pts_low;
3196 u32Ret = (MS_U32)(&(pHVDHalContext->u64pts_real));
3197 break;
3198 }
3199 case E_HVD_GDATA_DECODE_CNT:
3200 {
3201 u32Ret = pShm->u32DecodeCnt;
3202 break;
3203 }
3204 case E_HVD_GDATA_DATA_ERROR_CNT:
3205 {
3206 u32Ret = pShm->u32DataErrCnt;
3207 break;
3208 }
3209 case E_HVD_GDATA_DEC_ERROR_CNT:
3210 {
3211 u32Ret = pShm->u32DecErrCnt;
3212 break;
3213 }
3214 case E_HVD_GDATA_ERROR_CODE:
3215 {
3216 u32Ret = (MS_U32) (pShm->u16ErrCode);
3217 break;
3218 }
3219 case E_HVD_GDATA_VPU_IDLE_CNT:
3220 {
3221 u32Ret = pShm->u32VPUIdleCnt;
3222 break;
3223 }
3224 case E_HVD_GDATA_DISP_FRM_INFO:
3225 {
3226 u32Ret = (MS_U32) (&pShm->DispFrmInfo);
3227 break;
3228 }
3229 case E_HVD_GDATA_DEC_FRM_INFO:
3230 {
3231 u32Ret = (MS_U32) (&pShm->DecoFrmInfo);
3232 break;
3233 }
3234 case E_HVD_GDATA_ES_LEVEL:
3235 {
3236 u32Ret = (MS_U32) (_HVD_EX_GetESLevel(u32Id));
3237 break;
3238 }
3239 #if HVD_ENABLE_MVC
3240 case E_HVD_GDATA_DISP_FRM_INFO_SUB:
3241 {
3242 u32Ret= (MS_U32) (&(pShm->DispFrmInfo_Sub));
3243 break;
3244 }
3245 case E_HVD_GDATA_DEC_FRM_INFO_SUB:
3246 {
3247 u32Ret= (MS_U32) (&(pShm->DecoFrmInfo_Sub));
3248 break;
3249 }
3250 #endif
3251
3252 // user data
3253 case E_HVD_GDATA_USERDATA_WPTR:
3254 {
3255 u32Ret = (MS_U32) (pShm->u32UserCCIdxWrtPtr);
3256 break;
3257 }
3258 case E_HVD_GDATA_USERDATA_IDX_TBL_ADDR:
3259 {
3260 u32Ret = (MS_U32) (pShm->u8UserCCIdx);
3261 break;
3262 }
3263 case E_HVD_GDATA_USERDATA_PACKET_TBL_ADDR:
3264 {
3265 u32Ret = (MS_U32) (pShm->u32UserCCBase);
3266 break;
3267 }
3268 case E_HVD_GDATA_USERDATA_PACKET_SIZE:
3269 {
3270 u32Ret = (MS_U32) (sizeof(DTV_BUF_type));
3271 break;
3272 }
3273 case E_HVD_GDATA_USERDATA_IDX_TBL_SIZE:
3274 {
3275 u32Ret = (MS_U32) (USER_CC_IDX_SIZE);
3276 break;
3277 }
3278 case E_HVD_GDATA_USERDATA_PACKET_TBL_SIZE:
3279 {
3280 u32Ret = (MS_U32) (USER_CC_DATA_SIZE);
3281 break;
3282 }
3283 // report - modes
3284 case E_HVD_GDATA_IS_SHOW_ERR_FRM:
3285 {
3286 u32Ret = pShm->ModeStatus.bIsShowErrFrm;
3287 break;
3288 }
3289 case E_HVD_GDATA_IS_REPEAT_LAST_FIELD:
3290 {
3291 u32Ret = pShm->ModeStatus.bIsRepeatLastField;
3292 break;
3293 }
3294 case E_HVD_GDATA_IS_ERR_CONCEAL:
3295 {
3296 u32Ret = pShm->ModeStatus.bIsErrConceal;
3297 break;
3298 }
3299 case E_HVD_GDATA_IS_SYNC_ON:
3300 {
3301 u32Ret = pShm->ModeStatus.bIsSyncOn;
3302 break;
3303 }
3304 case E_HVD_GDATA_IS_PLAYBACK_FINISH:
3305 {
3306 u32Ret = pShm->ModeStatus.bIsPlaybackFinish;
3307 break;
3308 }
3309 case E_HVD_GDATA_SYNC_MODE:
3310 {
3311 u32Ret = pShm->ModeStatus.u8SyncType;
3312 break;
3313 }
3314 case E_HVD_GDATA_SKIP_MODE:
3315 {
3316 u32Ret = pShm->ModeStatus.u8SkipMode;
3317 break;
3318 }
3319 case E_HVD_GDATA_DROP_MODE:
3320 {
3321 u32Ret = pShm->ModeStatus.u8DropMode;
3322 break;
3323 }
3324 case E_HVD_GDATA_DISPLAY_DURATION:
3325 {
3326 u32Ret = pShm->ModeStatus.s8DisplaySpeed;
3327 break;
3328 }
3329 case E_HVD_GDATA_FRC_MODE:
3330 {
3331 u32Ret = pShm->ModeStatus.u8FrcMode;
3332 break;
3333 }
3334 case E_HVD_GDATA_NEXT_PTS:
3335 {
3336 u32Ret = pShm->u32NextPTS;
3337 break;
3338 }
3339 case E_HVD_GDATA_DISP_Q_SIZE:
3340 {
3341 u32Ret = pShm->u16DispQSize;
3342 break;
3343 }
3344 case E_HVD_GDATA_DISP_Q_PTR:
3345 {
3346 u32Ret = (MS_U32) pHVDHalContext->_u16DispQPtr;
3347 break;
3348 }
3349 case E_HVD_GDATA_NEXT_DISP_FRM_INFO:
3350 {
3351 u32Ret = (MS_U32) _HVD_EX_GetNextDispFrame(u32Id);
3352 break;
3353 }
3354 case E_HVD_GDATA_REAL_FRAMERATE:
3355 {
3356 // return VPS/VUI timing info framerate, and 0 if timing info not exist
3357 u32Ret = pShm->u32RealFrameRate;
3358 break;
3359 }
3360 case E_HVD_GDATA_IS_ORI_INTERLACE_MODE:
3361 u32Ret=(MS_U32)pShm->DispInfo.u8IsOriginInterlace;
3362 break;
3363 case E_HVD_GDATA_FRM_PACKING_SEI_DATA:
3364 u32Ret=((MS_U32)(pShm->u32Frm_packing_arr_data_addr));
3365 break;
3366 case E_HVD_GDATA_TYPE_FRAME_MBS_ONLY_FLAG:
3367 u32Ret=((MS_U32)(pShm->u8FrameMbsOnlyFlag));
3368 break;
3369
3370 // internal control
3371 case E_HVD_GDATA_IS_1ST_FRM_RDY:
3372 {
3373 u32Ret = pShm->bIs1stFrameRdy;
3374 break;
3375 }
3376 case E_HVD_GDATA_IS_I_FRM_FOUND:
3377 {
3378 u32Ret = pShm->bIsIFrmFound;
3379 break;
3380 }
3381 case E_HVD_GDATA_IS_SYNC_START:
3382 {
3383 u32Ret = pShm->bIsSyncStart;
3384 break;
3385 }
3386 case E_HVD_GDATA_IS_SYNC_REACH:
3387 {
3388 u32Ret = pShm->bIsSyncReach;
3389 break;
3390 }
3391 case E_HVD_GDATA_FW_VERSION_ID:
3392 {
3393 u32Ret = pShm->u32FWVersionID;
3394 break;
3395 }
3396 case E_HVD_GDATA_FW_IF_VERSION_ID:
3397 {
3398 u32Ret = pShm->u32FWIfVersionID;
3399 break;
3400 }
3401 case E_HVD_GDATA_BBU_Q_NUMB:
3402 {
3403 u32Ret = _HVD_EX_GetBBUQNumb(u32Id);
3404 break;
3405 }
3406 case E_HVD_GDATA_DEC_Q_NUMB:
3407 {
3408 u32Ret = pShm->u16DecQNumb;
3409 break;
3410 }
3411 case E_HVD_GDATA_DISP_Q_NUMB:
3412 {
3413 u32Ret = pShm->u16DispQNumb;
3414 break;
3415 }
3416 case E_HVD_GDATA_PTS_Q_NUMB:
3417 {
3418 u32Ret = _HVD_EX_GetPTSQNumb(u32Id);
3419 break;
3420 }
3421 case E_HVD_GDATA_FW_INIT_DONE:
3422 {
3423 u32Ret = pShm->bInitDone;
3424 break;
3425 }
3426 // debug
3427 case E_HVD_GDATA_SKIP_CNT:
3428 {
3429 u32Ret = pShm->u32SkipCnt;
3430 break;
3431 }
3432 case E_HVD_GDATA_GOP_CNT:
3433 {
3434 u32Ret = pShm->u32DropCnt;
3435 break;
3436 }
3437 case E_HVD_GDATA_DISP_CNT:
3438 {
3439 u32Ret = pShm->u32DispCnt;
3440 break;
3441 }
3442 case E_HVD_GDATA_DROP_CNT:
3443 {
3444 u32Ret = pShm->u32DropCnt;
3445 break;
3446 }
3447 case E_HVD_GDATA_DISP_STC:
3448 {
3449 u32Ret = pShm->u32DispSTC;
3450 break;
3451 }
3452 case E_HVD_GDATA_VSYNC_CNT:
3453 {
3454 u32Ret = pShm->u32VsyncCnt;
3455 break;
3456 }
3457 case E_HVD_GDATA_MAIN_LOOP_CNT:
3458 {
3459 u32Ret = pShm->u32MainLoopCnt;
3460 break;
3461 }
3462
3463 // AVC
3464 case E_HVD_GDATA_AVC_LEVEL_IDC:
3465 {
3466 u32Ret = pShm->u16AVC_SPS_LevelIDC;
3467 break;
3468 }
3469 case E_HVD_GDATA_AVC_LOW_DELAY:
3470 {
3471 u32Ret = pShm->u8AVC_SPS_LowDelayHrdFlag;
3472 break;
3473 }
3474 case E_HVD_GDATA_AVC_VUI_DISP_INFO:
3475 {
3476 u32Ret = _HVD_EX_GetVUIDispInfo(u32Id);
3477 break;
3478 }
3479 case E_HVD_GDATA_FW_FLUSH_STATUS:
3480 {
3481 u32Ret = (MS_U32) (pShm->u8FlushStatus);
3482 break;
3483 }
3484 case E_HVD_GDATA_FW_CODEC_TYPE:
3485 {
3486 u32Ret = pShm->u32CodecType;
3487 break;
3488 }
3489 case E_HVD_GDATA_FW_ES_BUF_STATUS:
3490 {
3491
3492 u32Ret = (MS_U32)pShm->u8ESBufStatus;
3493 break;
3494 }
3495
3496 // SRAM
3497
3498 // Mailbox
3499 case E_HVD_GDATA_FW_STATE: // HVD RISC MBOX 0 (esp. FW init done)
3500 {
3501 u32Ret = pShm->u32FwState;
3502 break;
3503 }
3504 case E_HVD_GDATA_IS_DISP_INFO_UNCOPYED:
3505 {
3506 u32Ret = pShm->bSpsChange;
3507 break;
3508 }
3509 case E_HVD_GDATA_IS_DISP_INFO_CHANGE: // HVD RISC MBOX 1 (rdy only)
3510 {
3511 u32Ret = pShm->bSpsChange;
3512 break;
3513 }
3514 case E_HVD_GDATA_HVD_ISR_STATUS: // HVD RISC MBOX 1 (value only)
3515 {
3516 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
3517
3518 if ((pCtrl->HVDISRCtrl.u32IntCount != pShm->u32IntCount) && pShm->u32FwInfo) // fetch ISR status
3519 {
3520 u32Ret = pShm->u32FwInfo;
3521 pCtrl->HVDISRCtrl.u32IntCount = pShm->u32IntCount;
3522 }
3523 break;
3524 }
3525 case E_HVD_GDATA_IS_FRAME_SHOWED: // HVD HI mbox 0 ( showed: rdy cleared ; not show: rdy enable )
3526 {
3527 if (pShm->bIsTrigDisp) // not clear yet
3528 {
3529 u32Ret = FALSE;
3530 }
3531 else
3532 {
3533 u32Ret = TRUE;
3534 }
3535 break;
3536 }
3537 case E_HVD_GDATA_ES_READ_PTR:
3538 {
3539 u32Ret = _HVD_EX_GetESReadPtr(u32Id, FALSE);
3540 break;
3541 }
3542 case E_HVD_GDATA_ES_WRITE_PTR:
3543 {
3544 u32Ret = _HVD_EX_GetESWritePtr(u32Id);
3545 break;
3546 }
3547 case E_HVD_GDATA_BBU_READ_PTR:
3548 {
3549 u32Ret = _HVD_EX_GetBBUReadptr(u32Id);
3550 break;
3551 }
3552 case E_HVD_GDATA_BBU_WRITE_PTR:
3553 {
3554 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
3555 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
3556 {
3557 u32Ret = pHVDHalContext->u32VP8BBUWptr;
3558 }
3559 else
3560 {
3561 u32Ret = pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr;
3562 }
3563 break;
3564 }
3565 case E_HVD_GDATA_BBU_WRITE_PTR_FIRED:
3566 {
3567 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
3568
3569 u32Ret = pCtrl->u32BBUWptr_Fired;
3570
3571 break;
3572 }
3573 case E_HVD_GDATA_VPU_PC_CNT:
3574 {
3575 u32Ret = _HVD_EX_GetPC();
3576 break;
3577 }
3578 case E_HVD_GDATA_ES_QUANTITY:
3579 {
3580 u32Ret=_HVD_EX_GetESQuantity(u32Id);
3581 break;
3582 }
3583
3584
3585 // FW def
3586 case E_HVD_GDATA_FW_MAX_DUMMY_FIFO: // AVC: 256Bytes AVS: 2kB RM:???
3587 u32Ret = HVD_MAX3(HVD_FW_AVC_DUMMY_FIFO, HVD_FW_AVS_DUMMY_FIFO, HVD_FW_RM_DUMMY_FIFO);
3588 break;
3589
3590 case E_HVD_GDATA_FW_AVC_MAX_VIDEO_DELAY:
3591 u32Ret = HVD_FW_AVC_MAX_VIDEO_DELAY;
3592 break;
3593 case E_HVD_GDATA_FW_BBU_TOTAL_TBL_ENTRY:
3594 u32Ret = pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNumTH;
3595 break;
3596 case E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB:
3597 u32Ret = pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum;
3598 break;
3599 case E_HVD_GDATA_FW_PTS_TOTAL_ENTRY_NUMB:
3600 u32Ret = MAX_PTS_TABLE_SIZE;
3601 break;
3602 case E_HVD_GDATA_FW_DUMMY_WRITE_ADDR:
3603 u32Ret = pShm->u32HVD_DUMMY_WRITE_ADDR;
3604 break;
3605 case E_HVD_GDATA_FW_DS_BUF_ADDR:
3606 u32Ret = pShm->u32HVD_DYNAMIC_SCALING_ADDR;
3607 break;
3608 case E_HVD_GDATA_FW_DS_BUF_SIZE:
3609 //u32Ret = HVD_DYNAMIC_SCALING_SIZE;
3610 // ----------------------- yi-chun.pan: for Dynamic Scaling 3k/6k issue ----------20111213---
3611 // ----------------------- modify DRV and AP(SN/MM) first, and then update fw --------------
3612 u32Ret = (1024 * 3);
3613 break;
3614 case E_HVD_GDATA_FW_DS_VECTOR_DEPTH:
3615 u32Ret = HVD_DYNAMIC_SCALING_DEPTH;
3616 break;
3617 case E_HVD_GDATA_FW_DS_INFO_ADDR:
3618 u32Ret = pShm->u32HVD_SCALER_INFO_ADDR;
3619 break;
3620 case E_HVD_GDATA_FW_DS_IS_ENABLED:
3621 {
3622 if (pShm->bDSIsRunning)
3623 {
3624 u32Ret = TRUE;
3625 }
3626 else
3627 {
3628 u32Ret = FALSE;
3629 }
3630 break;
3631 }
3632 case E_HVD_GDATA_TYPE_IS_LEAST_DISPQ_SIZE:
3633 u32Ret = ((MS_U32)(pShm->bIsLeastDispQSize));
3634 break;
3635 case E_HVD_GDATA_FIELD_PIC_FLAG:
3636 u32Ret = ((MS_U32)(pShm->u8FieldPicFlag));
3637 break;
3638 case E_HVD_GDATA_FW_VSYNC_BRIDGE_ADDR:
3639 u32Ret = pShm->u32VSYNC_BRIGE_SHM_ADDR;
3640 break;
3641 case E_HVD_GDATA_TS_SEAMLESS_STATUS:
3642 u32Ret = pShm->u32SeamlessTSStatus;
3643 break;
3644 case E_HVD_GDATA_HVD_HW_MAX_PIXEL:
3645 u32Ret = (MS_U32)(((MS_U64)HVD_HW_MAX_PIXEL)/1000);
3646 break;
3647 default:
3648 break;
3649 }
3650 return u32Ret;
3651 }
3652
HAL_HVD_EX_SetCmd(MS_U32 u32Id,HVD_User_Cmd eUsrCmd,MS_U32 u32CmdArg)3653 HVD_Return HAL_HVD_EX_SetCmd(MS_U32 u32Id, HVD_User_Cmd eUsrCmd, MS_U32 u32CmdArg)
3654 {
3655 HVD_Return eRet = E_HVD_RETURN_SUCCESS;
3656 MS_U32 u32Cmd = (MS_U32) eUsrCmd;
3657 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
3658
3659 _HAL_HVD_Entry();
3660
3661 // check if old SVD cmds
3662 if (u32Cmd < E_HVD_CMD_SVD_BASE)
3663 {
3664 HVD_EX_MSG_ERR("Old SVD FW cmd(%lx %lx) used in HVD.\n", u32Cmd, u32CmdArg);
3665
3666 _HAL_HVD_Return(E_HVD_RETURN_INVALID_PARAMETER);
3667 }
3668
3669 if(u32Cmd == E_HVD_CMD_ENABLE_DISP_OUTSIDE)
3670 {
3671 pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide = (MS_BOOL)u32CmdArg;
3672 }
3673
3674 #if HVD_ENABLE_MVC
3675 if (pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide)
3676 {
3677 if (HAL_HVD_EX_CheckMVCID(u32Id) && u32Cmd == E_HVD_CMD_FLUSH)
3678 {
3679 pHVDHalContext->_stHVDStream[u8Idx].u32DispQIndex = 0;
3680 }
3681 }
3682 #endif
3683
3684 HVD_EX_MSG_DBG("cmd=0x%lx, arg=0x%lx\n", u32Cmd, u32CmdArg);
3685
3686 eRet = _HVD_EX_SendCmd(u32Id, u32Cmd, u32CmdArg);
3687
3688 _HAL_HVD_Return(eRet);
3689 }
3690
HAL_HVD_EX_DeInit(MS_U32 u32Id)3691 HVD_Return HAL_HVD_EX_DeInit(MS_U32 u32Id)
3692 {
3693 HVD_Return eRet = E_HVD_RETURN_FAIL;
3694 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
3695 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
3696 MS_U32 u32Timeout = HVD_GetSysTime_ms() + 3000;
3697
3698 #if HVD_ENABLE_TIME_MEASURE
3699 MS_U32 ExitTimeCnt = 0;
3700 ExitTimeCnt = HVD_GetSysTime_ms();
3701 #endif
3702
3703 pCtrl->MemMap.u32CodeBufVAddr = MS_PA2KSEG1((MS_U32)pCtrl->MemMap.u32CodeBufAddr);
3704
3705 eRet = HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PAUSE, 0);
3706
3707 if (E_HVD_RETURN_SUCCESS != eRet)
3708 {
3709 HVD_EX_MSG_ERR("HVD fail to PAUSE %d\n", eRet);
3710 }
3711
3712 eRet = HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_STOP, 0);
3713
3714 if (E_HVD_RETURN_SUCCESS != eRet)
3715 {
3716 HVD_EX_MSG_ERR("HVD fail to STOP %d\n", eRet);
3717 }
3718
3719 // check FW state to make sure it's STOP DONE
3720 while (E_HVD_FW_STOP_DONE != (HVD_FW_State) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_STATE))
3721 {
3722 if (HVD_GetSysTime_ms() > u32Timeout)
3723 {
3724 HVD_EX_MSG_ERR("FW stop timeout, pc = 0x%lx\n", HAL_VPU_EX_GetProgCnt());
3725
3726 //return E_HVD_RETURN_TIMEOUT;
3727 eRet = E_HVD_RETURN_TIMEOUT;
3728 break;
3729 }
3730 }
3731
3732 VPU_EX_FWCodeCfg fwCfg;
3733 VPU_EX_TaskInfo taskInfo;
3734 VPU_EX_NDecInitPara nDecInitPara;
3735
3736 nDecInitPara.pFWCodeCfg = &fwCfg;
3737 nDecInitPara.pTaskInfo = &taskInfo;
3738
3739 fwCfg.u32DstAddr = pCtrl->MemMap.u32CodeBufVAddr;
3740 fwCfg.u8SrcType = E_HVD_FW_INPUT_SOURCE_NONE;
3741
3742 taskInfo.u32Id = u32Id;
3743 taskInfo.eDecType = E_VPU_EX_DECODER_HVD;
3744 taskInfo.eVpuId = (HAL_VPU_StreamId) (0xFF & u32Id);
3745
3746 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV)
3747 {
3748 taskInfo.eSrcType = E_VPU_EX_INPUT_FILE;
3749 }
3750 else
3751 {
3752 taskInfo.eSrcType = E_VPU_EX_INPUT_TSP;
3753 }
3754
3755 if(HAL_VPU_EX_TaskDelete(u32Id, &nDecInitPara) != TRUE)
3756 {
3757 HVD_EX_MSG_ERR("HAL_VPU_EX_TaskDelete fail\n");
3758 }
3759
3760 /* clear es buffer */
3761 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_TSP)
3762 {
3763 //printf("Clear ES buffer\n");
3764
3765 memset((void *) pCtrl->MemMap.u32BitstreamBufVAddr, 0, MIN(128, pCtrl->MemMap.u32BitstreamBufSize));
3766 }
3767
3768 //_HAL_HVD_MutexDelete();
3769
3770 #if HVD_ENABLE_TIME_MEASURE
3771 HVD_EX_MSG_DBG("HVD Stop Time(Wait FW):%d\n", HVD_GetSysTime_ms() - ExitTimeCnt);
3772 #endif
3773
3774 pHVDHalContext->_stHVDStream[u8Idx].bUsed = FALSE;
3775
3776 // reset bbu wptr
3777 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV)
3778 {
3779 if(TRUE == HAL_VPU_EX_HVDInUsed())
3780 {
3781 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))//apple
3782 {
3783 _HVD_EX_SetBBUWriteptr(u32Id, _HVD_EX_GetBBUReadptr(u32Id));
3784 pHVDHalContext->u32VP8BBUWptr = _HVD_EX_GetBBUReadptr(u32Id);
3785 }
3786 else
3787 {
3788 if(!_stHVDPreSet[u8Idx].bColocateBBUMode)
3789 {
3790 _HVD_EX_SetBBUWriteptr(u32Id, _HVD_EX_GetBBUReadptr(u32Id));
3791 }
3792 pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr = _HVD_EX_GetBBUReadptr(u32Id);
3793 }
3794 }
3795 else
3796 {
3797 pHVDHalContext->_stHVDStream[0].u32BBUWptr = 0; //main
3798 pHVDHalContext->_stHVDStream[1].u32BBUWptr = 0; //sub
3799 pHVDHalContext->u32VP8BBUWptr = 0; //VP8
3800 if (E_HVD_INIT_HW_AVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
3801 {
3802 if(!_stHVDPreSet[u8Idx].bColocateBBUMode)
3803 {
3804 _HVD_EX_ResetMainSubBBUWptr(u32Id);
3805 }
3806 }
3807 else
3808 {
3809 _HVD_EX_ResetMainSubBBUWptr(u32Id);
3810 }
3811 }
3812 }
3813
3814 _stHVDPreSet[u8Idx].bColocateBBUMode = FALSE;
3815
3816 if(pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.bEnable)
3817 {
3818 if(pCtrl->MemMap.u32FrameBufAddr >= HAL_MIU1_BASE)
3819 {
3820 _HAL_HVD_Entry();
3821 HAL_HVD_MVDMiuClientSel(1);
3822 _HAL_HVD_Release();
3823 }
3824 else
3825 {
3826 _HAL_HVD_Entry();
3827 HAL_HVD_MVDMiuClientSel(0);
3828 _HAL_HVD_Release();
3829 }
3830 }
3831
3832 HVD_EX_MSG_DBG("success\n");
3833
3834 return eRet;
3835 }
3836
HAL_HVD_EX_PushPacket(MS_U32 u32Id,HVD_BBU_Info * pInfo)3837 HVD_Return HAL_HVD_EX_PushPacket(MS_U32 u32Id, HVD_BBU_Info *pInfo)
3838 {
3839 HVD_Return eRet = E_HVD_RETURN_UNSUPPORTED;
3840 MS_U32 u32Addr = 0;
3841 HVD_EX_Drv_Ctrl *pCtrl = NULL;
3842 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
3843
3844 pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
3845
3846 //if (E_HVD_INIT_HW_VP8 != (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) // VP8 PTS table is not ready yet
3847 {
3848 eRet = _HVD_EX_UpdatePTSTable(u32Id, pInfo);
3849
3850 if (E_HVD_RETURN_SUCCESS != eRet)
3851 {
3852 return eRet;
3853 }
3854 }
3855
3856 //printf(">>> halHVD pts,idH = %lu, %lu\n", pInfo->u32TimeStamp, pInfo->u32ID_H); //STS input
3857
3858 //T9: for 128 bit memory. BBU need to get 2 entry at a time.
3859 if (E_HVD_INIT_HW_VP8 != (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
3860 {
3861 eRet = _HVD_EX_UpdateESWptr(u32Id, 0, 0);
3862
3863 if (E_HVD_RETURN_SUCCESS != eRet)
3864 {
3865 return eRet;
3866 }
3867 }
3868
3869 u32Addr = pInfo->u32Staddr;
3870
3871 if (pInfo->bRVBrokenPacket)
3872 {
3873 u32Addr = pInfo->u32Staddr | BIT(HVD_RV_BROKENBYUS_BIT);
3874 }
3875
3876 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) // VP8
3877 {
3878 eRet = _HVD_EX_UpdateESWptr_VP8(u32Id, pInfo->u32Staddr, pInfo->u32Length, pInfo->u32Staddr2, pInfo->u32Length2);
3879 }
3880 else
3881 {
3882 eRet = _HVD_EX_UpdateESWptr(u32Id, u32Addr, pInfo->u32Length);
3883 }
3884
3885 if (E_HVD_RETURN_SUCCESS != eRet)
3886 {
3887 return eRet;
3888 }
3889
3890 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
3891 {
3892 //eRet = _HVD_EX_UpdateESWptr_VP8(u32Id, 0, 0, 0, 0);
3893 eRet = _HVD_EX_UpdateESWptr_VP8(u32Id, pInfo->u32Staddr, 0, pInfo->u32Staddr2, 0);
3894
3895 if (E_HVD_RETURN_SUCCESS != eRet)
3896 {
3897 return eRet;
3898 }
3899 }
3900
3901 pHVDHalContext->_stHVDStream[u8Idx].u32PTSByteCnt += pInfo->u32Length;
3902
3903 // do not add local pointer
3904 if ((pCtrl->MemMap.u32DrvProcessBufSize != 0) && (pCtrl->MemMap.u32DrvProcessBufAddr != 0))
3905 {
3906 MS_U32 u32PacketStAddr = pInfo->u32Staddr + pCtrl->MemMap.u32BitstreamBufAddr;
3907
3908 if (!((pCtrl->MemMap.u32DrvProcessBufAddr <= u32PacketStAddr) &&
3909 (u32PacketStAddr <
3910 (pCtrl->MemMap.u32DrvProcessBufAddr + pCtrl->MemMap.u32DrvProcessBufSize))))
3911 {
3912 pCtrl->LastNal.u32NalAddr = pInfo->u32Staddr;
3913 pCtrl->LastNal.u32NalSize = pInfo->u32AllocLength;
3914 }
3915 else
3916 {
3917 //null packet
3918 pCtrl->LastNal.u32NalAddr = pInfo->u32OriPktAddr;
3919 pCtrl->LastNal.u32NalSize = 0;
3920 }
3921 }
3922 else
3923 {
3924 pCtrl->LastNal.u32NalAddr = pInfo->u32Staddr;
3925 pCtrl->LastNal.u32NalSize = pInfo->u32AllocLength;
3926 }
3927
3928 pCtrl->LastNal.bRVBrokenPacket = pInfo->bRVBrokenPacket;
3929 pCtrl->u32BBUPacketCnt++;
3930
3931 return eRet;
3932 }
3933
HAL_HVD_EX_EnableISR(MS_U32 u32Id,MS_BOOL bEnable)3934 void HAL_HVD_EX_EnableISR(MS_U32 u32Id, MS_BOOL bEnable)
3935 {
3936 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
3937 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
3938
3939 if (bEnable)
3940 {
3941 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), 0, HVD_REG_RISC_ISR_MSK);
3942 }
3943 else
3944 {
3945 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_RISC_ISR_MSK, HVD_REG_RISC_ISR_MSK);
3946 }
3947 }
3948
HAL_HVD_EX_SetForceISR(MS_U32 u32Id,MS_BOOL bEnable)3949 void HAL_HVD_EX_SetForceISR(MS_U32 u32Id, MS_BOOL bEnable)
3950 {
3951 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
3952 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
3953
3954 if (bEnable)
3955 {
3956 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_RISC_ISR_FORCE, HVD_REG_RISC_ISR_FORCE);
3957 }
3958 else
3959 {
3960 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), 0, HVD_REG_RISC_ISR_FORCE);
3961 }
3962 }
3963
HAL_HVD_EX_SetClearISR(MS_U32 u32Id)3964 void HAL_HVD_EX_SetClearISR(MS_U32 u32Id)
3965 {
3966 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
3967 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
3968
3969 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_RISC_ISR_CLR, HVD_REG_RISC_ISR_CLR);
3970 }
3971
HAL_HVD_EX_IsISROccured(MS_U32 u32Id)3972 MS_BOOL HAL_HVD_EX_IsISROccured(MS_U32 u32Id)
3973 {
3974 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
3975 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
3976
3977 return (MS_BOOL) (_HVD_Read2Byte(HVD_REG_RISC_MBOX_RDY(u32RB)) & HVD_REG_RISC_ISR_VALID);
3978 }
3979
HAL_HVD_EX_IsEnableISR(MS_U32 u32Id)3980 MS_BOOL HAL_HVD_EX_IsEnableISR(MS_U32 u32Id)
3981 {
3982 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
3983 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
3984
3985 if (_HVD_Read2Byte(HVD_REG_RISC_MBOX_CLR(u32RB)) & HVD_REG_RISC_ISR_MSK)
3986 {
3987 return FALSE;
3988 }
3989 else
3990 {
3991 return TRUE;
3992 }
3993 }
3994
HAL_HVD_EX_IsAlive(MS_U32 u32Id)3995 MS_BOOL HAL_HVD_EX_IsAlive(MS_U32 u32Id)
3996 {
3997 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
3998
3999 if (pCtrl)
4000 {
4001 if ((pCtrl->LivingStatus.u32DecCnt == HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DECODE_CNT)) &&
4002 (pCtrl->LivingStatus.u32SkipCnt == HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_SKIP_CNT)) &&
4003 (pCtrl->LivingStatus.u32IdleCnt == HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT)) &&
4004 (pCtrl->LivingStatus.u32MainLoopCnt == HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_MAIN_LOOP_CNT)))
4005 {
4006 return FALSE;
4007 }
4008 else
4009 {
4010 return TRUE;
4011 }
4012 }
4013 else
4014 {
4015 return FALSE;
4016 }
4017 }
4018
HAL_HVD_EX_RstPTSCtrlVariable(MS_U32 u32Id)4019 MS_BOOL HAL_HVD_EX_RstPTSCtrlVariable(MS_U32 u32Id)
4020 {
4021 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
4022 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4023 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
4024
4025 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV)
4026 {
4027 HAL_HVD_EX_ReadMemory();
4028
4029 pHVDHalContext->_stHVDStream[u8Idx].u32PTSByteCnt = pShm->u32PTStableByteCnt;
4030 pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr = _HVD_EX_GetPTSTableWptr(u32Id);
4031
4032 HVD_EX_MSG_DBG("PTS table: WptrAddr:%lx RptrAddr:%lx ByteCnt:%lx PreWptr:%lx\n",
4033 pShm->u32PTStableWptrAddr, pShm->u32PTStableRptrAddr, pHVDHalContext->_stHVDStream[u8Idx].u32PTSByteCnt, pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr);
4034 }
4035
4036 return TRUE;
4037 }
4038
HAL_HVD_EX_FlushRstShareMem(MS_U32 u32Id)4039 MS_BOOL HAL_HVD_EX_FlushRstShareMem(MS_U32 u32Id)
4040 {
4041 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4042 HVD_EX_Drv_Ctrl *pCtrl = NULL;
4043 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
4044 MS_U32 u32Data;
4045 pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
4046
4047 memset(&pShm->DecoFrmInfo, 0, sizeof(HVD_Frm_Information));
4048
4049 HAL_HVD_EX_FlushMemory();
4050 if (pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide)
4051 {
4052 u32Data = _HVD_EX_GetESReadPtr(u32Id, FALSE);
4053 pCtrl->LastNal.u32NalAddr = u32Data;
4054 pCtrl->LastNal.u32NalSize = 0;
4055 }
4056 return TRUE;
4057 }
4058
HAL_HVD_EX_UartSwitch2FW(MS_BOOL bEnable)4059 void HAL_HVD_EX_UartSwitch2FW(MS_BOOL bEnable)
4060 {
4061 if (bEnable)
4062 {
4063 _HVD_WriteWordMask(REG_TOP_UART_SEL0, REG_TOP_UART_SEL_VD_MHEG5, REG_TOP_UART_SEL_0_MASK);
4064 }
4065 else
4066 {
4067 #if defined (__aeon__)
4068 _HVD_WriteWordMask(REG_TOP_UART_SEL0, REG_TOP_UART_SEL_MHEG5, REG_TOP_UART_SEL_0_MASK);
4069 #else // defined (__mips__)
4070 _HVD_WriteWordMask(REG_TOP_UART_SEL0, REG_TOP_UART_SEL_PIU_0, REG_TOP_UART_SEL_0_MASK);
4071 #endif
4072 }
4073 }
4074
HAL_HVD_EX_GetData_Dbg(MS_U32 u32Addr)4075 MS_U32 HAL_HVD_EX_GetData_Dbg(MS_U32 u32Addr)
4076 {
4077 return 0;
4078 }
4079
HAL_HVD_EX_SetData_Dbg(MS_U32 u32Addr,MS_U32 u32Data)4080 void HAL_HVD_EX_SetData_Dbg(MS_U32 u32Addr, MS_U32 u32Data)
4081 {
4082 return;
4083 }
4084
HAL_HVD_EX_GetCorretClock(MS_U16 u16Clock)4085 MS_U16 HAL_HVD_EX_GetCorretClock(MS_U16 u16Clock)
4086 {
4087 //if( u16Clock == 0 )
4088 return pHVDHalContext->u32HVDClockType; //140;
4089 //if( )
4090 }
4091
HAL_HVD_EX_UpdateESWptr_Fire(MS_U32 u32Id)4092 void HAL_HVD_EX_UpdateESWptr_Fire(MS_U32 u32Id)
4093 {
4094 MS_BOOL bBitMIU1 = FALSE;
4095 MS_BOOL bCodeMIU1 = FALSE;
4096 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
4097 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
4098 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4099 MS_U32 u32BBU_DRAM_ST_ADDR = pShm->u32HVD_BBU_DRAM_ST_ADDR;
4100
4101 #if HVD_ENABLE_MVC
4102 if(HAL_HVD_EX_CheckMVCID(u32Id))
4103 {
4104 // if MVC_BBU_ADDR and HVD_BBU_ADDR are different, we need to add MVC_BBU_DRAM_ST_ADDR and MVC_BBU2_DRAM_ST_ADDR in share memory
4105 u32BBU_DRAM_ST_ADDR = pShm->u32HVD_BBU_DRAM_ST_ADDR; //pShm->u32MVC_BBU_DRAM_ST_ADDR;
4106 if(E_VDEC_EX_SUB_VIEW == HAL_HVD_EX_GetView(u32Id))
4107 {
4108 u32BBU_DRAM_ST_ADDR = pShm->u32HVD_BBU2_DRAM_ST_ADDR; //pShm->u32MVC_BBU2_DRAM_ST_ADDR;
4109 }
4110 }
4111 #endif /// HVD_ENABLE_MVC
4112
4113
4114 if (pCtrl->MemMap.u32CodeBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
4115 {
4116 bCodeMIU1 = TRUE;
4117 }
4118
4119 if (pCtrl->MemMap.u32BitstreamBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
4120 {
4121 bBitMIU1 = TRUE;
4122 }
4123
4124 if (bBitMIU1 != bCodeMIU1)
4125 {
4126 #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
4127 BDMA_Result bdmaRlt;
4128 MS_U32 u32DstAdd = 0, u32SrcAdd = 0, u32tabsize = 0;
4129
4130 u32DstAdd = pCtrl->MemMap.u32BitstreamBufAddr + pCtrl->u32BBUTblInBitstreamBufAddr;
4131 u32SrcAdd = pCtrl->MemMap.u32CodeBufAddr + u32BBU_DRAM_ST_ADDR;
4132 u32tabsize = pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum << 3;
4133
4134 bdmaRlt = HVD_dmacpy(u32DstAdd, u32SrcAdd, u32tabsize);
4135
4136 if (E_BDMA_OK != bdmaRlt)
4137 {
4138 HVD_EX_MSG_ERR("MDrv_BDMA_MemCopy fail ret=%x!\n", bdmaRlt);
4139 }
4140 #else
4141 MS_U32 u32DstAdd = 0, u32SrcAdd = 0, u32tabsize = 0;
4142
4143 u32DstAdd = pCtrl->MemMap.u32BitstreamBufVAddr + pCtrl->u32BBUTblInBitstreamBufAddr;
4144 u32SrcAdd = MsOS_PA2KSEG1(pCtrl->MemMap.u32CodeBufAddr + u32BBU_DRAM_ST_ADDR);
4145 u32tabsize = pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum << 3;
4146
4147 HVD_memcpy(u32DstAdd, u32SrcAdd, u32tabsize);
4148 #endif
4149 }
4150
4151 //HVD_EX_MSG_DBG("%lu st:%lx size:%lx BBU: %lu\n", pCtrl->u32BBUPacketCnt, pCtrl->LastNal.u32NalAddr, pCtrl->LastNal.u32NalSize, _stHVDStream[u8Idx].u32BBUWptr);
4152
4153 HAL_HVD_EX_FlushMemory();
4154
4155 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
4156 {
4157 _HVD_EX_SetBBUWriteptr(u32Id, HVD_LWORD(pHVDHalContext->u32VP8BBUWptr));
4158 pCtrl->u32BBUWptr_Fired = pHVDHalContext->u32VP8BBUWptr;
4159 }
4160 else
4161 {
4162 _HVD_EX_SetBBUWriteptr(u32Id, HVD_LWORD(pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr));
4163
4164 pCtrl->u32BBUWptr_Fired = pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr;
4165 }
4166 }
4167
HAL_HVD_EX_MVD_PowerCtrl(MS_BOOL bEnable)4168 void HAL_HVD_EX_MVD_PowerCtrl(MS_BOOL bEnable)
4169 {
4170 if (bEnable)
4171 {
4172 _HVD_WriteWordMask(REG_TOP_MVD, 0, TOP_CKG_MHVD_DIS);
4173 _HVD_WriteWordMask(REG_TOP_MVD2, 0, TOP_CKG_MHVD2_DIS);
4174 }
4175 else
4176 {
4177 _HVD_WriteWordMask(REG_TOP_MVD, TOP_CKG_MHVD_DIS, TOP_CKG_MHVD_DIS);
4178 _HVD_WriteWordMask(REG_TOP_MVD2, TOP_CKG_MHVD2_DIS, TOP_CKG_MHVD2_DIS);
4179 }
4180 }
4181
HAL_HVD_EX_Dump_FW_Status(MS_U32 u32Id)4182 void HAL_HVD_EX_Dump_FW_Status(MS_U32 u32Id)
4183 {
4184 MS_U32 tmp1 = 0;
4185 MS_U32 tmp2 = 0;
4186 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4187
4188 HAL_HVD_EX_ReadMemory();
4189
4190 _HVD_EX_MBoxRead(u32Id, HAL_HVD_CMD_MBOX, &tmp1);
4191 _HVD_EX_MBoxRead(u32Id, HAL_HVD_CMD_ARG_MBOX, &tmp2);
4192
4193 if (u32UartCtrl & E_HVD_UART_CTRL_DBG)
4194 {
4195 MS_U32 u32Tmp = u32UartCtrl;
4196
4197 HVD_EX_MSG_DBG("\n");
4198 u32UartCtrl = 0; // turn off debug message to prevent other function prints
4199 printf("\tSystime=%lu, FWVersionID=0x%lx, FwState=0x%lx, ErrCode=0x%lx, ProgCnt=0x%lx\n",
4200 HVD_GetSysTime_ms(), pShm->u32FWVersionID, pShm->u32FwState, (MS_U32) pShm->u16ErrCode, HAL_VPU_EX_GetProgCnt());
4201
4202 printf("\tTime: DispSTC=%lu, DispT=%lu, DecT=%lu, CurrentPts=%lu, Last Cmd=0x%lx, Arg=0x%lx, Rdy1=0x%lx, Rdy2=0x%lx\n",
4203 pShm->u32DispSTC, pShm->DispFrmInfo.u32TimeStamp,
4204 pShm->DecoFrmInfo.u32TimeStamp, pShm->u32CurrentPts, tmp1, tmp2,
4205 (MS_U32) _HVD_EX_MBoxReady(u32Id, HAL_HVD_CMD_MBOX), (MS_U32) _HVD_EX_MBoxReady(u32Id, HAL_HVD_CMD_ARG_MBOX));
4206
4207 printf("\tFlag: InitDone=%d, SpsChange=%d, IsIFrmFound=%d, 1stFrmRdy=%d, SyncStart=%d, SyncReach=%d\n",
4208 pShm->bInitDone, pShm->bSpsChange, pShm->bIsIFrmFound,
4209 pShm->bIs1stFrameRdy, pShm->bIsSyncStart, pShm->bIsSyncReach);
4210
4211 printf("\tQueue: BBUQNumb=%lu, DecQNumb=%d, DispQNumb=%d, ESR=%lu, ESRfromFW=%lu, ESW=%lu, ESLevel=%lu\n",
4212 _HVD_EX_GetBBUQNumb(u32Id), pShm->u16DecQNumb, pShm->u16DispQNumb,
4213 _HVD_EX_GetESReadPtr(u32Id, TRUE), pShm->u32ESReadPtr, _HVD_EX_GetESWritePtr(u32Id),
4214 _HVD_EX_GetESLevel(u32Id));
4215
4216 printf("\tCounter: DecodeCnt=%lu, DispCnt=%lu, DataErrCnt=%lu, DecErrCnt=%lu, SkipCnt=%lu, DropCnt=%lu, idle=%lu, MainLoopCnt=%lu, VsyncCnt=%lu\n",
4217 pShm->u32DecodeCnt, pShm->u32DispCnt, pShm->u32DataErrCnt,
4218 pShm->u32DecErrCnt, pShm->u32SkipCnt, pShm->u32DropCnt,
4219 pShm->u32VPUIdleCnt, pShm->u32MainLoopCnt, pShm->u32VsyncCnt);
4220 printf
4221 ("\tMode: ShowErr=%d, RepLastField=%d, SyncOn=%d, FileEnd=%d, Skip=%d, Drop=%d, DispSpeed=%d, FRC=%d, BlueScreen=%d, FreezeImg=%d, 1Field=%d\n",
4222 pShm->ModeStatus.bIsShowErrFrm, pShm->ModeStatus.bIsRepeatLastField,
4223 pShm->ModeStatus.bIsSyncOn, pShm->ModeStatus.bIsPlaybackFinish,
4224 pShm->ModeStatus.u8SkipMode, pShm->ModeStatus.u8DropMode,
4225 pShm->ModeStatus.s8DisplaySpeed, pShm->ModeStatus.u8FrcMode,
4226 pShm->ModeStatus.bIsBlueScreen, pShm->ModeStatus.bIsFreezeImg,
4227 pShm->ModeStatus.bShowOneField);
4228
4229 u32UartCtrl = u32Tmp; // recover debug level
4230 }
4231 }
4232
HAL_HVD_EX_GetBBUEntry(MS_U32 u32Id,HVD_EX_Drv_Ctrl * pDrvCtrl,MS_U32 u32Idx,MS_U32 * u32NalOffset,MS_U32 * u32NalSize)4233 void HAL_HVD_EX_GetBBUEntry(MS_U32 u32Id, HVD_EX_Drv_Ctrl *pDrvCtrl, MS_U32 u32Idx, MS_U32 *u32NalOffset, MS_U32 *u32NalSize)
4234 {
4235 MS_U8 *u32Addr = NULL;
4236 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
4237 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4238
4239 if (u32Idx >= pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum)
4240 {
4241 return;
4242 }
4243
4244 u32Addr = (MS_U8 *)(MsOS_PA2KSEG1(pDrvCtrl->MemMap.u32CodeBufAddr + pShm->u32HVD_BBU_DRAM_ST_ADDR + (u32Idx << 3)));
4245
4246 *u32NalSize = *(u32Addr + 2) & 0x1f;
4247 *u32NalSize <<= 8;
4248 *u32NalSize |= *(u32Addr + 1) & 0xff;
4249 *u32NalSize <<= 8;
4250 *u32NalSize |= *(u32Addr) & 0xff;
4251
4252 *u32NalOffset = ((MS_U32) (*(u32Addr + 2) & 0xe0)) >> 5;
4253 *u32NalOffset |= ((MS_U32) (*(u32Addr + 3) & 0xff)) << 3;
4254 *u32NalOffset |= ((MS_U32) (*(u32Addr + 4) & 0xff)) << 11;
4255 *u32NalOffset |= ((MS_U32) (*(u32Addr + 5) & 0xff)) << 19;
4256 }
4257
HAL_HVD_EX_Dump_BBUs(MS_U32 u32Id,HVD_EX_Drv_Ctrl * pDrvCtrl,MS_U32 u32StartIdx,MS_U32 u32EndIdx,MS_BOOL bShowEmptyEntry)4258 void HAL_HVD_EX_Dump_BBUs(MS_U32 u32Id, HVD_EX_Drv_Ctrl *pDrvCtrl, MS_U32 u32StartIdx, MS_U32 u32EndIdx, MS_BOOL bShowEmptyEntry)
4259 {
4260 MS_U32 u32CurIdx = 0;
4261 MS_BOOL bFinished = FALSE;
4262 MS_U32 u32NalOffset = 0;
4263 MS_U32 u32NalSize = 0;
4264 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
4265
4266 if ((u32StartIdx >= pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum) || (u32EndIdx >= pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum))
4267 {
4268 return;
4269 }
4270
4271 u32CurIdx = u32StartIdx;
4272
4273 do
4274 {
4275 if (u32CurIdx == u32EndIdx)
4276 {
4277 bFinished = TRUE;
4278 }
4279
4280 HAL_HVD_EX_GetBBUEntry(u32Id, pDrvCtrl, u32CurIdx, &u32NalOffset, &u32NalSize);
4281
4282 if ((bShowEmptyEntry == FALSE) || (bShowEmptyEntry && (u32NalOffset == 0) && (u32NalSize == 0)))
4283 {
4284 HVD_EX_MSG_DBG("HVD BBU Entry: Idx:%lu Offset:%lx Size:%lx\n", u32CurIdx, u32NalOffset, u32NalSize);
4285 }
4286
4287 u32CurIdx++;
4288
4289 if (u32CurIdx >= pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum)
4290 {
4291 u32CurIdx %= pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum;
4292 }
4293 } while (bFinished == TRUE);
4294 }
4295
HAL_HVD_EX_Dump_HW_Status(MS_U32 u32Num)4296 void HAL_HVD_EX_Dump_HW_Status(MS_U32 u32Num)
4297 {
4298 MS_U32 i = 0;
4299 MS_U32 value = 0;
4300
4301 if (u32UartCtrl & E_HVD_UART_CTRL_DBG)
4302 {
4303 HVD_EX_MSG_DBG("\n");
4304
4305 for (i = 0; i <= u32Num; i++)
4306 {
4307 _HVD_Write2Byte(HVD_REG_DEBUG_SEL, i);
4308 value = _HVD_Read2Byte(HVD_REG_DEBUG_DAT_L);
4309 value |= ((MS_U32) _HVD_Read2Byte(HVD_REG_DEBUG_DAT_H)) << 16;
4310
4311 if (value == 0)
4312 {
4313 break;
4314 }
4315
4316 printf(" %08lx", value);
4317
4318 if (((i % 8) + 1) == 8)
4319 {
4320 printf(" |%lu\n", i + 1);
4321 }
4322 }
4323
4324 printf("\nHVD Dump HW status End: total number:%lu\n", i);
4325 }
4326 }
4327
HAL_HVD_EX_SetMiuBurstLevel(HVD_EX_Drv_Ctrl * pDrvCtrl,HVD_MIU_Burst_Cnt_Ctrl eMiuBurstCntCtrl)4328 void HAL_HVD_EX_SetMiuBurstLevel(HVD_EX_Drv_Ctrl *pDrvCtrl, HVD_MIU_Burst_Cnt_Ctrl eMiuBurstCntCtrl)
4329 {
4330 if (pDrvCtrl)
4331 {
4332 pDrvCtrl->Settings.u32MiuBurstLevel = (MS_U32) eMiuBurstCntCtrl;
4333 }
4334 }
4335
4336 #if HVD_ENABLE_MVC
HAL_HVD_EX_CheckMVCID(MS_U32 u32Id)4337 MS_BOOL HAL_HVD_EX_CheckMVCID(MS_U32 u32Id)
4338 {
4339 return ( E_HAL_VPU_MVC_STREAM_BASE == (0xFF & u32Id) );
4340 }
4341
HAL_HVD_EX_GetView(MS_U32 u32Id)4342 VDEC_EX_View HAL_HVD_EX_GetView(MS_U32 u32Id)
4343 {
4344 if( (0xFF & (u32Id >> 8)) == 0x10)
4345 return E_VDEC_EX_MAIN_VIEW;
4346 else
4347 return E_VDEC_EX_SUB_VIEW;
4348 }
4349 #endif ///HVD_ENABLE_MVC
4350
HAL_HVD_EX_SpareBandwidth(MS_U32 u32Id)4351 void HAL_HVD_EX_SpareBandwidth(MS_U32 u32Id) //// For MVC
4352 {
4353 //HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIS_QUART_PIXEL, TRUE);
4354 //HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIS_DBF, TRUE);
4355 return;
4356 }
4357
4358
HAL_HVD_EX_GetFrmRateIsSupported(MS_U32 u32Id,MS_U16 u16HSize,MS_U16 u16VSize,MS_U32 u32FrmRate)4359 MS_BOOL HAL_HVD_EX_GetFrmRateIsSupported(MS_U32 u32Id, MS_U16 u16HSize, MS_U16 u16VSize, MS_U32 u32FrmRate)
4360 {
4361 HVD_EX_MSG_DBG("%s w:%d, h:%d, fr:%ld, MAX:%lld\n", __FUNCTION__,
4362 u16HSize, u16VSize, u32FrmRate, HVD_HW_MAX_PIXEL);
4363 return (((MS_U64)u16HSize*(MS_U64)u16VSize*(MS_U64)u32FrmRate) <= HVD_HW_MAX_PIXEL);
4364 }
4365
HAL_HVD_EX_GetDispFrmNum(MS_U32 u32Id)4366 MS_U32 HAL_HVD_EX_GetDispFrmNum(MS_U32 u32Id)
4367 {
4368 #if 1
4369 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4370 MS_U16 u16QNum = pShm->u16DispQNumb;
4371 MS_U16 u16QPtr = pShm->u16DispQPtr;
4372 // MS_U16 u16QSize = pShm->u16DispQSize;
4373 //static volatile HVD_Frm_Information *pHvdFrm = NULL;
4374 MS_U32 u32DispQNum = 0;
4375 #if HVD_ENABLE_MVC
4376 MS_BOOL bMVC = HAL_HVD_EX_CheckMVCID(u32Id);
4377
4378 if(bMVC)
4379 {
4380 #if 0
4381 if (u16QNum > HVD_DISPQ_PREFETCH_COUNT*3)
4382 {
4383 u16QNum = HVD_DISPQ_PREFETCH_COUNT*3;
4384 }
4385 #endif
4386
4387 //printf("OQ:%d,DQ:%d.\n",pShm->u16DispQNumb,pShm->u16DecQNumb);
4388 //search the next frame to display
4389 while (u16QNum > 0)
4390 {
4391 //printf("Pr:%d,%d.[%ld,%ld,%ld,%ld].\n",u16QPtr,u16QNum,pShm->DispQueue[u16QPtr].u32Status,pShm->DispQueue[u16QPtr+1].u32Status,
4392 // pShm->DispQueue[u16QPtr+2].u32Status,pShm->DispQueue[u16QPtr+3].u32Status);
4393 pHVDHalContext->pHvdFrm = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr];
4394
4395 //printf("Q2: %ld\n", pHVDShareMem->DispQueue[u16QPtr].u32Status);
4396 if (pHVDHalContext->pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
4397 {
4398 /// For MVC. Output views after the pair of (base and depend) views were decoded.
4399 /// Check the depned view was initial when Output the base view.
4400 if((u16QPtr%2) == 0)
4401 {
4402 volatile HVD_Frm_Information *pHvdFrm_sub = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr+1];
4403 //if(pHvdFrm_sub->u32Status != E_HVD_DISPQ_STATUS_INIT)
4404 if(pHvdFrm_sub->u32Status == E_HVD_DISPQ_STATUS_NONE)
4405 {
4406 ///printf("[MVC] %d is not E_HVD_DISPQ_STATUS_INIT (%ld).\n",u16QPtr+1,pHvdFrm_sub->u32Status);
4407 ///printf("Return NULL.\n");
4408 break;
4409 }
4410 }
4411 u32DispQNum++;
4412 }
4413
4414 u16QNum--;
4415 //go to next frame in the dispQ
4416 u16QPtr++;
4417
4418 if (u16QPtr >= pShm->u16DispQSize)
4419 {
4420 u16QPtr -= pShm->u16DispQSize; //wrap to the begin
4421 }
4422 }
4423 }
4424 else
4425 #endif ///HVD_ENABLE_MVC
4426 {
4427 #if 0
4428 if (u16QNum > HVD_DISPQ_PREFETCH_COUNT)
4429 {
4430 u16QNum = HVD_DISPQ_PREFETCH_COUNT;
4431 }
4432 #endif
4433 // printf("Q: %d %d %d\n", u16QNum, u16QPtr, u16QSize);
4434 //search the next frame to display
4435 while (u16QNum != 0)
4436 {
4437 pHVDHalContext->pHvdFrm = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr];
4438
4439 // printf("Q2[%d]: %ld\n", u16QPtr, pShm->DispQueue[u16QPtr].u32Status);
4440 if (pHVDHalContext->pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
4441 {
4442 u32DispQNum++;
4443 }
4444
4445 u16QNum--;
4446 //go to next frame in the dispQ
4447 u16QPtr++;
4448
4449 if (u16QPtr == pShm->u16DispQSize)
4450 {
4451 u16QPtr = 0; //wrap to the begin
4452 }
4453 }
4454 }
4455
4456 //printf("dispQnum = %ld, pShm->u16DispQNumb = %d\n", u32DispQNum, pShm->u16DispQNumb);
4457 return u32DispQNum;
4458 #else
4459 HVD_ShareMem *pShm = (HVD_ShareMem *) _HVD_EX_GetShmAddr(u32Id);
4460 return pShm->u16DispQNumb;
4461 #endif
4462 }
4463
HAL_HVD_EX_SetHwRegBase(MS_U32 u32Id,MS_U32 u32ModeFlag)4464 void HAL_HVD_EX_SetHwRegBase(MS_U32 u32Id, MS_U32 u32ModeFlag)
4465 {
4466 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
4467 pHVDHalContext->_stHVDStream[u8Idx].u32RegBase =
4468 ((u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_HEVC) ? REG_EVD_BASE : REG_HVD_BASE;
4469 }
4470
4471 #if SUPPORT_EVD
HAL_EVD_EX_PowerCtrl(MS_BOOL bEnable)4472 void HAL_EVD_EX_PowerCtrl(MS_BOOL bEnable)
4473 {
4474 if (bEnable)
4475 {
4476 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, ~TOP_CKG_EVD_PPU_DIS, TOP_CKG_EVD_PPU_DIS);
4477 _HVD_WriteWordMask(REG_TOP_CKG_EVD, ~TOP_CKG_EVD_DIS, TOP_CKG_EVD_DIS);
4478 }
4479 else
4480 {
4481 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_DIS, TOP_CKG_EVD_PPU_DIS);
4482 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_DIS, TOP_CKG_EVD_DIS);
4483 }
4484
4485 switch (pHVDHalContext->u32EVDClockType)
4486 {
4487 case 384:
4488 {
4489 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_480MHZ, TOP_CKG_EVD_PPU_MASK);
4490 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_384MHZ, TOP_CKG_EVD_MASK);
4491 break;
4492 }
4493 case 320:
4494 {
4495 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_384MHZ, TOP_CKG_EVD_PPU_MASK);
4496 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_320MHZ, TOP_CKG_EVD_MASK);
4497 break;
4498 }
4499 case 288:
4500 {
4501 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_288MHZ, TOP_CKG_EVD_PPU_MASK);
4502 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_288MHZ, TOP_CKG_EVD_MASK);
4503 break;
4504 }
4505 case 240:
4506 {
4507 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_240MHZ, TOP_CKG_EVD_PPU_MASK);
4508 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_240MHZ, TOP_CKG_EVD_MASK);
4509 break;
4510 }
4511 case 218:
4512 {
4513 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_218MHZ, TOP_CKG_EVD_PPU_MASK);
4514 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_218MHZ, TOP_CKG_EVD_MASK);
4515 break;
4516 }
4517 case 192:
4518 {
4519 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_192MHZ, TOP_CKG_EVD_PPU_MASK);
4520 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_192MHZ, TOP_CKG_EVD_MASK);
4521 break;
4522 }
4523 case 160:
4524 {
4525 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_160MHZ, TOP_CKG_EVD_PPU_MASK);
4526 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_160MHZ, TOP_CKG_EVD_MASK);
4527 break;
4528 }
4529 default:
4530 {
4531 _HVD_WriteByteMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_480MHZ, TOP_CKG_EVD_PPU_MASK);
4532 _HVD_WriteByteMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_384MHZ, TOP_CKG_EVD_MASK);
4533 break;
4534 }
4535 }
4536
4537 return;
4538 }
4539
HAL_EVD_EX_DeinitHW(void)4540 static MS_BOOL HAL_EVD_EX_DeinitHW(void)
4541 {
4542 MS_U16 u16Timeout = 1000;
4543
4544 _HVD_WriteWordMask(EVD_REG_RESET, EVD_REG_RESET_SWRST, EVD_REG_RESET_SWRST);
4545
4546 while (u16Timeout)
4547 {
4548 if ((_HVD_Read2Byte(EVD_REG_RESET) & (EVD_REG_RESET_SWRST_FIN)) == (EVD_REG_RESET_SWRST_FIN))
4549 {
4550 break;
4551 }
4552 u16Timeout--;
4553 }
4554
4555 HAL_EVD_EX_PowerCtrl(FALSE);
4556
4557 return TRUE;
4558 }
4559 #endif
HAL_HVD_EX_GetSupport2ndMVOPInterface(void)4560 MS_BOOL HAL_HVD_EX_GetSupport2ndMVOPInterface(void)
4561 {
4562 return TRUE;
4563 }
HAL_HVD_EX_SetBufferAddr(MS_U32 u32Id)4564 void HAL_HVD_EX_SetBufferAddr(MS_U32 u32Id)
4565 {
4566 _HVD_EX_SetBufferAddr(u32Id);
4567 }
4568
4569
HAL_HVD_EX_Is_RM_Supported(MS_U32 u32Id)4570 MS_BOOL HAL_HVD_EX_Is_RM_Supported(MS_U32 u32Id)
4571 {
4572 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
4573
4574 if(pCtrl->InitParams.u16ChipECONum == 0)
4575 return FALSE;
4576 else
4577 return TRUE;
4578
4579 }
4580
HAL_HVD_EX_BBU_Proc(MS_U32 u32Id)4581 void HAL_HVD_EX_BBU_Proc(MS_U32 u32Id)
4582 {
4583
4584 }
4585
4586
HAL_HVD_EX_BBU_StopProc(MS_U32 u32Id)4587 void HAL_HVD_EX_BBU_StopProc(MS_U32 u32Id)
4588 {
4589
4590 }
4591
4592 #endif
4593
4594
4595