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(MSOS_TYPE_OPTEE)) || defined(SUPPORT_X_MODEL_FEATURE)
114 #include "ULog.h"
115 #define VPRINTF(format,args...) ULOGI("VDEC", format, ##args)
116
117 //-------------------------------------------------------------------------------------------------
118 // Local Defines
119 //-------------------------------------------------------------------------------------------------
120 #define RV_VLC_TABLE_SIZE 0x20000
121 /* Add for Mobile Platform by Ted Sun */
122 //#define HVD_DISPQ_PREFETCH_COUNT 2
123 #define HVD_FW_MEM_OFFSET 0x100000UL // 1M
124 #define VPU_QMEM_BASE 0x20000000UL
125
126 //max support pixel(by chip capacity)
127 #define HVD_HW_MAX_PIXEL (1920*1088*61000ULL) // FHD@60p
128 #define HEVC_HW_MAX_PIXEL (4096*2160*61000ULL) // 4kx2k@60p
129 #define VP9_HW_MAX_PIXEL (4096*2304*31000ULL) // 4kx2k@30p
130
131 #if 0
132 static HVD_AVC_VUI_DISP_INFO g_hvd_VUIINFO;
133 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} };
134 static MS_U32 u32RV_VLCTableAddr = 0; // offset from Frame buffer start address
135 static MS_U16 _u16DispQPtr = 0;
136 #endif
137
138 #define IS_TASK_ALIVE(id) ((id) != -1)
139 #ifndef UNUSED
140 #define UNUSED(x) (void)(x)
141 #endif
142
143
144 //---------------------------------- Mutex settings -----------------------------------------
145 #if HAL_HVD_ENABLE_MUTEX_PROTECT
146 #define _HAL_HVD_MutexCreate() \
147 do \
148 { \
149 if (s32HVDMutexID < 0) \
150 { \
151 s32HVDMutexID = OSAL_HVD_MutexCreate((MS_U8*)(_u8HVD_Mutex)); \
152 } \
153 } while (0)
154
155 #define _HAL_HVD_MutexDelete() \
156 do \
157 { \
158 if (s32HVDMutexID >= 0) \
159 { \
160 OSAL_HVD_MutexDelete(s32HVDMutexID); \
161 s32HVDMutexID = -1; \
162 } \
163 } while (0)
164
165 #define _HAL_HVD_Entry() \
166 do \
167 { \
168 if (s32HVDMutexID >= 0) \
169 { \
170 if (!OSAL_HVD_MutexObtain(s32HVDMutexID, OSAL_HVD_MUTEX_TIMEOUT)) \
171 { \
172 VPRINTF("[HAL HVD][%06d] Mutex taking timeout\n", __LINE__); \
173 } \
174 } \
175 } while (0)
176
177 #define _HAL_HVD_Return(_ret_) \
178 do \
179 { \
180 if (s32HVDMutexID >= 0) \
181 { \
182 OSAL_HVD_MutexRelease(s32HVDMutexID); \
183 } \
184 return _ret_; \
185 } while(0)
186
187 #define _HAL_HVD_Release() \
188 do \
189 { \
190 if (s32HVDMutexID >= 0) \
191 { \
192 OSAL_HVD_MutexRelease(s32HVDMutexID); \
193 } \
194 } while (0)
195 #else // HAL_HVD_ENABLE_MUTEX_PROTECT
196
197 #define _HAL_HVD_MutexCreate()
198 #define _HAL_HVD_MutexDelete()
199 #define _HAL_HVD_Entry()
200 #define _HAL_HVD_Return(_ret) {return _ret;}
201 #define _HAL_HVD_Release()
202
203 #endif // HAL_HVD_ENABLE_MUTEX_PROTECT
204
205 #define INC_VALUE(value, queue_sz) { (value) = ((++(value)) >= queue_sz) ? 0 : (value); }
206 #define IS_TASK_ALIVE(id) ((id) != -1)
207 #define NEXT_MULTIPLE(value, n) (((value) + (n) - 1) & ~((n)-1))
208
209 //------------------------------ MIU SETTINGS ----------------------------------
210 #define _MaskMiuReq_MVD_RW( m ) _HVD_WriteRegBit(MIU0_REG_RQ2_MASK, m, BIT(4))
211 #define _MaskMiuReq_MVD_BBU_R( m ) _HVD_WriteRegBit(MIU0_REG_RQ0_MASK+1, m, BIT(4))
212 #define _MaskMiuReq_HVD_RW( m ) _HVD_WriteRegBit(MIU0_REG_RQ2_MASK, m, BIT(2))
213 #define _MaskMiuReq_HVD_BBU_R( m ) _HVD_WriteRegBit(MIU0_REG_RQ2_MASK, m, BIT(1))
214
215 #define _MaskMiu1Req_MVD_RW( m ) _HVD_WriteRegBit(MIU1_REG_RQ2_MASK, m, BIT(4))
216 #define _MaskMiu1Req_MVD_BBU_R( m ) _HVD_WriteRegBit(MIU1_REG_RQ0_MASK+1, m, BIT(4))
217 #define _MaskMiu1Req_HVD_RW( m ) _HVD_WriteRegBit(MIU1_REG_RQ2_MASK, m, BIT(2))
218 #define _MaskMiu1Req_HVD_BBU_R( m ) _HVD_WriteRegBit(MIU1_REG_RQ2_MASK, m, BIT(1))
219
220 #define HVD_MVD_RW_ON_MIU0 ((_HVD_Read2Byte(MIU0_REG_SEL2) & BIT(4)) == 0)
221 #define HVD_MVD_BBU_R_ON_MIU0 ((_HVD_Read2Byte(MIU0_REG_SEL0) & BIT(12)) == 0)
222 #define HVD_HVD_RW_ON_MIU0 ((_HVD_Read2Byte(MIU0_REG_SEL2) & BIT(2)) == 0)
223 #define HVD_HVD_BBU_R_ON_MIU0 ((_HVD_Read2Byte(MIU0_REG_SEL2) & BIT(1)) == 0)
224
225 #define HVD_MVD_RW_ON_MIU1 ((_HVD_Read2Byte(MIU0_REG_SEL2) & BIT(4)) == BIT(4))
226 #define HVD_MVD_BBU_R_ON_MIU1 ((_HVD_Read2Byte(MIU0_REG_SEL0) & BIT(12)) == BIT(12))
227 #define HVD_HVD_RW_ON_MIU1 ((_HVD_Read2Byte(MIU0_REG_SEL2) & BIT(2)) == BIT(2))
228 #define HVD_HVD_BBU_R_ON_MIU1 ((_HVD_Read2Byte(MIU0_REG_SEL2) & BIT(1)) == BIT(1))
229
230 #if SUPPORT_EVD
231 #define _MaskMiuReq_EVD_RW( m ) _HVD_WriteRegBit(MIU0_REG_RQ2_MASK+1, m, BIT(2))
232 #define _MaskMiuReq_EVD_BBU_R( m ) _HVD_WriteRegBit(MIU0_REG_RQ2_MASK+1, m, BIT(2))
233 #define _MaskMiu1Req_EVD_RW( m ) _HVD_WriteRegBit(MIU1_REG_RQ2_MASK+1, m, BIT(2))
234 #define _MaskMiu1Req_EVD_BBU_R( m ) _HVD_WriteRegBit(MIU1_REG_RQ2_MASK+1, m, BIT(2))
235
236 #define HVD_EVD_RW_ON_MIU0 ((_HVD_Read2Byte(MIU0_REG_SEL2) & BIT(10)) == 0)
237 #define HVD_EVD_BBU_R_ON_MIU0 ((_HVD_Read2Byte(MIU0_REG_SEL2) & BIT(10)) == 0)
238 #define HVD_EVD_RW_ON_MIU1 ((_HVD_Read2Byte(MIU0_REG_SEL2) & BIT(10)) == BIT(10))
239 #define HVD_EVD_BBU_R_ON_MIU1 ((_HVD_Read2Byte(MIU0_REG_SEL2) & BIT(10)) == BIT(10))
240 #endif
241
242 #define _HVD_MIU_SetReqMask(miu_clients, mask) \
243 do \
244 { \
245 if (HVD_##miu_clients##_ON_MIU0 == 1) \
246 { \
247 _MaskMiuReq_##miu_clients(mask); \
248 } \
249 else \
250 { \
251 _MaskMiu1Req_##miu_clients(mask); \
252 } \
253 } while (0)
254
255 // check RM is supported or not
256 #define HVD_HW_RUBBER3 (HAL_HVD_EX_GetHWVersionID()& BIT(14))
257 #ifdef VDEC3
258 #define HAL_HVD_EX_MAX_SUPPORT_STREAM 4
259 #else
260 #define HAL_HVD_EX_MAX_SUPPORT_STREAM 3
261 #endif
262 //-------------------------------------------------------------------------------------------------
263 // Local Structures
264 //-------------------------------------------------------------------------------------------------
265
266 //-------------------------------------------------------------------------------------------------
267 // Local Functions Prototype
268 //-------------------------------------------------------------------------------------------------
269 static MS_U16 _HVD_EX_GetBBUReadptr(MS_U32 u32Id);
270 static void _HVD_EX_SetBBUWriteptr(MS_U32 u32Id, MS_U16 u16BBUNewWptr);
271 static MS_BOOL _HVD_EX_MBoxSend(MS_U32 u32Id, MS_U8 u8MBox, MS_U32 u32Msg);
272 static MS_BOOL _HVD_EX_MBoxReady(MS_U32 u32Id, MS_U8 u8MBox);
273 static MS_BOOL _HVD_EX_MBoxRead(MS_U32 u32Id, MS_U8 u8MBox, MS_U32 *u32Msg);
274 //static void _HVD_EX_MBoxClear(MS_U8 u8MBox);
275 static MS_U32 _HVD_EX_GetPC(void);
276 static MS_U32 _HVD_EX_GetESWritePtr(MS_U32 u32Id);
277 static MS_U32 _HVD_EX_GetESReadPtr(MS_U32 u32Id, MS_BOOL bDbug);
278 static MS_BOOL _HVD_EX_SetCMDArg(MS_U32 u32Id, MS_U32 u32Arg);
279 static MS_BOOL _HVD_EX_SetCMD(MS_U32 u32Id, MS_U32 u32Cmd);
280 static HVD_Return _HVD_EX_SendCmd(MS_U32 u32Id, MS_U32 u32Cmd, MS_U32 u32CmdArg);
281 static void _HVD_EX_SetMIUProtectMask(MS_BOOL bEnable);
282 static void _HVD_EX_SetBufferAddr(MS_U32 u32Id);
283 static MS_U32 _HVD_EX_GetESLevel(MS_U32 u32Id);
284 static MS_U32 _HVD_EX_GetESQuantity(MS_U32 u32Id);
285 static HVD_Return _HVD_EX_UpdatePTSTable(MS_U32 u32Id, HVD_BBU_Info *pInfo);
286 static HVD_Return _HVD_EX_UpdateESWptr(MS_U32 u32Id, MS_U32 u32NalOffset, MS_U32 u32NalLen);
287 static HVD_Return _HVD_EX_UpdateESWptr_VP8(MS_U32 u32Id, MS_U32 u32NalOffset, MS_U32 u32NalLen, MS_U32 u32NalOffset2, MS_U32 u32NalLen2);
288 static MS_VIRT _HVD_EX_GetVUIDispInfo(MS_U32 u32Id);
289 static MS_U32 _HVD_EX_GetBBUQNumb(MS_U32 u32Id);
290 static MS_U32 _HVD_EX_GetPTSQNumb(MS_U32 u32Id);
291 static HVD_EX_Drv_Ctrl *_HVD_EX_GetDrvCtrl(MS_U32 u32Id);
292 static HVD_Frm_Information *_HVD_EX_GetNextDispFrame(MS_U32 u32Id);
293 #if SUPPORT_EVD
294 static void HAL_EVD_EX_PowerCtrl(MS_BOOL bEnable);
295 static MS_BOOL HAL_EVD_EX_DeinitHW(void);
296 #endif
297 #if SUPPORT_G2VP9 && defined(VDEC3)
298 static void HAL_VP9_EX_PowerCtrl(MS_BOOL bEnable);
299 #endif
300 static MS_U64 _HAL_EX_GetHwMaxPixel(MS_U32 u32Id);
301 #if SUPPORT_G2VP9 && defined(VDEC3)
302 static MS_BOOL _HAL_HVD_EX_PostProc_Task(MS_U32 u32Id);
303 #endif
304 //-------------------------------------------------------------------------------------------------
305 // Global Variables
306 //-------------------------------------------------------------------------------------------------
307 #if defined (__aeon__)
308 static MS_VIRT u32HVDRegOSBase = 0xA0200000;
309 #else
310 static MS_VIRT u32HVDRegOSBase = 0xBF200000;
311 #endif
312 #if HAL_HVD_ENABLE_MUTEX_PROTECT
313 MS_S32 s32HVDMutexID = -1;
314 MS_U8 _u8HVD_Mutex[] = { "HVD_Mutex" };
315 #endif
316
317
318 #define HVD_EX_STACK_SIZE 4096
319 //-------------------------------------------------------------------------------------------------
320 // Local Variables
321 //-------------------------------------------------------------------------------------------------
322 typedef struct
323 {
324
325 HVD_AVC_VUI_DISP_INFO g_hvd_VUIINFO;
326 MS_U8 g_hvd_nal_fill_pair[2][8];
327 MS_VIRT u32RV_VLCTableAddr; // offset from Frame buffer start address
328 MS_U16 _u16DispQPtr;
329 MS_U16 _u16DispOutSideQPtr[HAL_HVD_EX_MAX_SUPPORT_STREAM];
330
331 //HVD_EX_Drv_Ctrl *_pHVDCtrls;
332 MS_U32 u32HVDCmdTimeout;//same as HVD_FW_CMD_TIMEOUT_DEFAULT
333 MS_U32 u32VPUClockType;
334 MS_U32 u32HVDClockType;//160
335 #if SUPPORT_EVD
336 MS_U32 u32EVDClockType;
337 #endif
338 #if SUPPORT_G2VP9 && defined(VDEC3)
339 MS_U32 u32VP9ClockType;
340 #endif
341 HVD_EX_Stream _stHVDStream[HAL_HVD_EX_MAX_SUPPORT_STREAM];
342
343 volatile HVD_Frm_Information *pHvdFrm;//_HVD_EX_GetNextDispFrame()
344 MS_BOOL g_RstFlag;
345 MS_U64 u64pts_real;
346 MS_PHY u32VP8BBUWptr;
347 MS_PHY u32EVDBBUWptr;
348 MS_BOOL bBBU_running[HAL_HVD_EX_MAX_SUPPORT_STREAM];
349 MS_U32 u32BBUReadEsPtr[HAL_HVD_EX_MAX_SUPPORT_STREAM];
350 MS_S32 _s32VDEC_BBU_TaskId[HAL_HVD_EX_MAX_SUPPORT_STREAM];
351 MS_U8 u8VdecExBBUStack[HAL_HVD_EX_MAX_SUPPORT_STREAM][HVD_EX_STACK_SIZE];
352 //pre_set
353 HVD_Pre_Ctrl *pHVDPreCtrl_Hal[HAL_HVD_EX_MAX_SUPPORT_STREAM];
354 } HVD_Hal_CTX;
355
356 HVD_Hal_CTX* pHVDHalContext = NULL;
357 HVD_Hal_CTX gHVDHalContext;
358 HVD_EX_Drv_Ctrl *_pHVDCtrls = NULL;
359
360 static HVD_EX_PreSet _stHVDPreSet[HAL_HVD_EX_MAX_SUPPORT_STREAM] =
361 {
362 {FALSE},
363 {FALSE},
364 {FALSE},
365 #ifdef VDEC3
366 {FALSE},
367 #endif
368 };
369
370 //-------------------------------------------------------------------------------------------------
371 // Debug Functions
372 //-------------------------------------------------------------------------------------------------
HVD_EX_SetRstFlag(MS_BOOL bRst)373 void HVD_EX_SetRstFlag(MS_BOOL bRst)
374 {
375 pHVDHalContext->g_RstFlag = bRst;
376 }
HVD_EX_GetRstFlag(void)377 MS_BOOL HVD_EX_GetRstFlag(void)
378 {
379 return pHVDHalContext->g_RstFlag;
380 }
381
382 //-------------------------------------------------------------------------------------------------
383 // Local Functions
384 //-------------------------------------------------------------------------------------------------
385
386 #ifdef VDEC3
387 // This function will get decoder type not only MVD,HVD,EVD but more codec types.
388 // However, sometimes we don't use so deterministic infomation.
HAL_HVD_EX_GetTaskInfo(MS_U32 u32Id,VPU_EX_TaskInfo * pstTaskInfo)389 static MS_BOOL HAL_HVD_EX_GetTaskInfo(MS_U32 u32Id, VPU_EX_TaskInfo* pstTaskInfo)
390 {
391
392 MS_U32 ret = TRUE;
393 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
394
395 if(pCtrl == NULL || pstTaskInfo == NULL)
396 return FALSE;
397
398 pstTaskInfo->u32Id = u32Id;
399
400 switch(pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)
401 {
402 case E_HVD_INIT_HW_RM:
403 pstTaskInfo->eDecType = E_VPU_EX_DECODER_RVD;
404 break;
405 case E_HVD_INIT_HW_VP8:
406 pstTaskInfo->eDecType = E_VPU_EX_DECODER_VP8;
407 break;
408 case E_HVD_INIT_HW_MVC:
409 pstTaskInfo->eDecType = E_VPU_EX_DECODER_HVD; //E_VPU_EX_DECODER_MVC;
410 break;
411 case E_HVD_INIT_HW_HEVC:
412 pstTaskInfo->eDecType = E_VPU_EX_DECODER_EVD;
413 break;
414 #if SUPPORT_MSVP9
415 case E_HVD_INIT_HW_VP9:
416 pstTaskInfo->eDecType = E_VPU_EX_DECODER_EVD;
417 break;
418 #endif
419 #if SUPPORT_G2VP9
420 case E_HVD_INIT_HW_VP9:
421 pstTaskInfo->eDecType = E_VPU_EX_DECODER_G2VP9;
422 break;
423 #endif
424 default:
425 pstTaskInfo->eDecType = E_VPU_EX_DECODER_HVD;
426 break;
427 }
428
429 pstTaskInfo->eVpuId = (HAL_VPU_StreamId) (0xFF & u32Id);
430
431 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV)
432 {
433 pstTaskInfo->eSrcType = E_VPU_EX_INPUT_FILE;
434 }
435 else
436 {
437 pstTaskInfo->eSrcType = E_VPU_EX_INPUT_TSP;
438 }
439
440 pstTaskInfo->u32HeapSize = HVD_DRAM_SIZE;
441
442 #ifdef SUPPORT_EVD
443 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_HEVC ||
444 (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP9 )
445 pstTaskInfo->u32HeapSize = EVD_DRAM_SIZE;
446 #endif
447 return ret;
448
449 }
HAL_HVD_EX_GetBBUId(MS_U32 u32Id)450 MS_U32 HAL_HVD_EX_GetBBUId(MS_U32 u32Id)
451 {
452 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
453 MS_U32 ret = HAL_HVD_INVALID_BBU_ID;
454 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
455 _HAL_HVD_Entry();
456
457 if(pCtrl == NULL)
458 _HAL_HVD_Return(ret);
459
460 VPU_EX_TaskInfo taskInfo;
461 memset(&taskInfo, 0, sizeof(VPU_EX_TaskInfo));
462
463 HAL_HVD_EX_GetTaskInfo(u32Id,&taskInfo);
464
465 taskInfo.u8HalId = u8Idx;
466 ret = HAL_VPU_EX_GetBBUId(u32Id,&taskInfo, pCtrl->bNStreamMode);
467
468 HVD_EX_MSG_DBG("u32Id=0x%x eDecType=0x%x eSrcType=0x%x ret=0x%x\n", (unsigned int)taskInfo.u32Id,
469 (unsigned int)taskInfo.eDecType, (unsigned int)taskInfo.eSrcType, (unsigned int)ret);
470
471 _HAL_HVD_Return(ret);
472 }
473
HAL_HVD_EX_FreeBBUId(MS_U32 u32Id,MS_U32 u32BBUId)474 MS_BOOL HAL_HVD_EX_FreeBBUId(MS_U32 u32Id, MS_U32 u32BBUId)
475 {
476 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
477 MS_BOOL ret = FALSE;
478 _HAL_HVD_Entry();
479
480 if(pCtrl == NULL)
481 _HAL_HVD_Return(ret);
482 VPU_EX_TaskInfo taskInfo;
483 memset(&taskInfo, 0, sizeof(VPU_EX_TaskInfo));
484
485 HAL_HVD_EX_GetTaskInfo(u32Id,&taskInfo);
486
487 ret = HAL_VPU_EX_FreeBBUId(u32Id,u32BBUId,&taskInfo);
488
489 HVD_EX_MSG_DBG("u32Id=0x%x eDecType=0x%x eSrcType=0x%x ret=0x%x\n", (unsigned int)taskInfo.u32Id,
490 (unsigned int)taskInfo.eDecType, (unsigned int)taskInfo.eSrcType, (unsigned int)ret);
491
492 _HAL_HVD_Return(ret);
493 }
494 #endif
495
_HVD_EX_PpTask_Delete(HVD_EX_Stream * pstHVDStream)496 static void _HVD_EX_PpTask_Delete(HVD_EX_Stream *pstHVDStream)
497 {
498 pstHVDStream->ePpTaskState = E_HAL_HVD_STATE_STOP;
499 MsOS_DeleteTask(pstHVDStream->s32HvdPpTaskId);
500 pstHVDStream->s32HvdPpTaskId = -1;
501 }
502
_HVD_EX_Context_Init_HAL(void)503 static void _HVD_EX_Context_Init_HAL(void)
504 {
505 pHVDHalContext->u32HVDCmdTimeout = 100;//same as HVD_FW_CMD_TIMEOUT_DEFAULT
506 pHVDHalContext->u32VPUClockType = 432;
507 pHVDHalContext->u32HVDClockType = 240;
508 #if SUPPORT_EVD
509 pHVDHalContext->u32EVDClockType = 576;
510 #endif
511 #if SUPPORT_G2VP9 && defined(VDEC3)
512 pHVDHalContext->u32VP9ClockType = 384;
513 #endif
514 #ifdef VDEC3
515 MS_U8 i;
516
517 for (i = 0; i < HAL_HVD_EX_MAX_SUPPORT_STREAM; i++)
518 {
519 pHVDHalContext->_stHVDStream[i].eStreamId = E_HAL_HVD_N_STREAM0 + i;
520 pHVDHalContext->_stHVDStream[i].ePpTaskState = E_HAL_HVD_STATE_STOP;
521 pHVDHalContext->_stHVDStream[i].s32HvdPpTaskId = -1;
522 }
523 #else
524 pHVDHalContext->_stHVDStream[0].eStreamId = E_HAL_HVD_MAIN_STREAM0;
525 pHVDHalContext->_stHVDStream[1].eStreamId = E_HAL_HVD_SUB_STREAM0;
526 pHVDHalContext->_stHVDStream[2].eStreamId = E_HAL_HVD_SUB_STREAM1;
527 #endif
528 }
529
_HVD_EX_GetBBUReadptr(MS_U32 u32Id)530 static MS_U16 _HVD_EX_GetBBUReadptr(MS_U32 u32Id)
531 {
532 MS_U16 u16Ret = 0;
533 #if (HVD_ENABLE_MVC || (!VDEC3))
534 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
535 #endif
536 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
537 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
538 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
539 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
540
541 #if HVD_ENABLE_MVC
542 if(HAL_HVD_EX_CheckMVCID(u32Id))
543 {
544 u8TaskId = (MS_U8) HAL_HVD_EX_GetView(u32Id);
545 }
546 #endif /// HVD_ENABLE_MVC
547
548 _HVD_WriteWordMask(HVD_REG_POLL_NAL_RPTR(u32RB), 0, HVD_REG_POLL_NAL_RPTR_BIT);
549 _HVD_WriteWordMask(HVD_REG_POLL_NAL_RPTR(u32RB), HVD_REG_POLL_NAL_RPTR_BIT, HVD_REG_POLL_NAL_RPTR_BIT);
550
551 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) // VP8
552 {
553 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_RPTR_HI_BS4);
554 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_RPTR_HI_BS3);
555 }
556 else
557 #ifdef VDEC3
558 if (0 == pCtrl->u32BBUId)
559 #else
560 if (0 == u8TaskId)
561 #endif
562 {
563 //if(pCtrl->InitParams.bColocateBBUMode)
564 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
565 u16Ret = pShm->u32ColocateBBUReadPtr;
566 else
567 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_RPTR_HI(u32RB));
568 }
569 else
570 {
571 //if(pCtrl->InitParams.bColocateBBUMode)
572 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
573 u16Ret = pShm->u32ColocateBBUReadPtr;
574 else
575 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_RPTR_HI_BS2(u32RB));
576 }
577
578 HVD_EX_MSG_DBG("Task0=%d, Task1=%d\n",
579 _HVD_Read2Byte(HVD_REG_NAL_RPTR_HI(u32RB)), _HVD_Read2Byte(HVD_REG_NAL_RPTR_HI_BS2(u32RB)));
580
581 return u16Ret;
582 }
583
_HVD_EX_GetBBUWritedptr(MS_U32 u32Id)584 static MS_U16 _HVD_EX_GetBBUWritedptr(MS_U32 u32Id)
585 {
586 MS_U16 u16Ret = 0;
587 #if (HVD_ENABLE_MVC || (!VDEC3))
588 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
589 #endif
590 HVD_EX_Drv_Ctrl *pDrvCtrl = _HVD_EX_GetDrvCtrl(u32Id);
591 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
592 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
593 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
594
595 #if HVD_ENABLE_MVC
596 if (HAL_HVD_EX_CheckMVCID(u32Id))
597 {
598 u8TaskId = (MS_U8) HAL_HVD_EX_GetView(u32Id);
599 }
600 #endif /// HVD_ENABLE_MVC
601 _HVD_WriteWordMask(HVD_REG_POLL_NAL_RPTR(u32RB), 0, HVD_REG_POLL_NAL_RPTR_BIT);
602 _HVD_WriteWordMask(HVD_REG_POLL_NAL_RPTR(u32RB), HVD_REG_POLL_NAL_RPTR_BIT, HVD_REG_POLL_NAL_RPTR_BIT);
603
604 if ((pDrvCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP8) // VP8
605 {
606 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_WPTR_HI_BS4);
607 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_WPTR_HI_BS3);
608 }
609 else
610 #ifdef VDEC3
611 if (0 == pDrvCtrl->u32BBUId)
612 #else
613 if (0 == u8TaskId)
614 #endif
615 {
616 //if(pDrvCtrl->InitParams.bColocateBBUMode)
617 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
618 u16Ret = pShm->u32ColocateBBUWritePtr;
619 else
620 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_WPTR_HI(u32RB));
621 }
622 else
623 {
624 //if(pDrvCtrl->InitParams.bColocateBBUMode)
625 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
626 u16Ret = pShm->u32ColocateBBUWritePtr;
627 else
628 u16Ret = _HVD_Read2Byte(HVD_REG_NAL_WPTR_HI_BS2(u32RB));
629 }
630
631 return u16Ret;
632 }
633
_HVD_EX_ResetMainSubBBUWptr(MS_U32 u32Id)634 static void _HVD_EX_ResetMainSubBBUWptr(MS_U32 u32Id)
635 {
636 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
637 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
638
639 _HVD_Write2Byte(HVD_REG_NAL_WPTR_HI(u32RB), 0);
640 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_NAL_WPTR_SYNC, HVD_REG_NAL_WPTR_SYNC); // set bit 3
641 _HVD_Write2Byte(HVD_REG_NAL_WPTR_HI_BS2(u32RB), 0);
642 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_NAL_WPTR_SYNC, HVD_REG_NAL_WPTR_SYNC); // set bit 3
643 _HVD_Write2Byte(HVD_REG_NAL_WPTR_HI_BS3, 0);
644 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_NAL_WPTR_SYNC, HVD_REG_NAL_WPTR_SYNC); // set bit 3
645 _HVD_Write2Byte(HVD_REG_NAL_RPTR_HI_BS4, 0);
646 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_NAL_WPTR_SYNC, HVD_REG_NAL_WPTR_SYNC); // set bit 3
647 }
648
_HVD_EX_SetBBUWriteptr(MS_U32 u32Id,MS_U16 u16BBUNewWptr)649 static void _HVD_EX_SetBBUWriteptr(MS_U32 u32Id, MS_U16 u16BBUNewWptr)
650 {
651 #if (HVD_ENABLE_MVC || (!VDEC3))
652 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
653 #endif
654 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
655 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
656 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
657 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
658
659 #if HVD_ENABLE_MVC
660 if (HAL_HVD_EX_CheckMVCID(u32Id))
661 {
662 u8TaskId = (MS_U8) HAL_HVD_EX_GetView(u32Id);
663 }
664 #endif /// HVD_ENABLE_MVC
665
666 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) // VP8
667 {
668 _HVD_Write2Byte(HVD_REG_NAL_WPTR_HI_BS3, u16BBUNewWptr);
669 _HVD_Write2Byte(HVD_REG_NAL_WPTR_HI_BS4, u16BBUNewWptr);
670 }
671 else
672 #ifdef VDEC3
673 if (0 == pCtrl->u32BBUId)
674 #else
675 if (0 == u8TaskId)
676 #endif
677 {
678 _HVD_Write2Byte(HVD_REG_NAL_WPTR_HI(u32RB), u16BBUNewWptr);
679 //if(pCtrl->InitParams.bColocateBBUMode)
680 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
681 pShm->u32ColocateBBUWritePtr = u16BBUNewWptr;
682 }
683 else
684 {
685 _HVD_Write2Byte(HVD_REG_NAL_WPTR_HI_BS2(u32RB), u16BBUNewWptr);
686 //if(pCtrl->InitParams.bColocateBBUMode)
687 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
688 pShm->u32ColocateBBUWritePtr = u16BBUNewWptr;
689 }
690
691 HVD_EX_MSG_DBG("Task0=%d, Task1=%d\n",
692 _HVD_Read2Byte(HVD_REG_NAL_WPTR_HI(u32RB)), _HVD_Read2Byte(HVD_REG_NAL_WPTR_HI_BS2(u32RB)));
693
694 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_NAL_WPTR_SYNC, HVD_REG_NAL_WPTR_SYNC); // set bit 3
695 }
696
_HVD_EX_MBoxSend(MS_U32 u32Id,MS_U8 u8MBox,MS_U32 u32Msg)697 static MS_BOOL _HVD_EX_MBoxSend(MS_U32 u32Id, MS_U8 u8MBox, MS_U32 u32Msg)
698 {
699 MS_BOOL bResult = TRUE;
700 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
701 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
702
703 switch (u8MBox)
704 {
705 case E_HVD_HI_0:
706 {
707 _HVD_Write4Byte(HVD_REG_HI_MBOX0_L(u32RB), u32Msg);
708 _HVD_WriteWordMask(HVD_REG_HI_MBOX_SET(u32RB), HVD_REG_HI_MBOX0_SET, HVD_REG_HI_MBOX0_SET);
709 break;
710 }
711 case E_HVD_HI_1:
712 {
713 _HVD_Write4Byte(HVD_REG_HI_MBOX1_L(u32RB), u32Msg);
714 _HVD_WriteWordMask(HVD_REG_HI_MBOX_SET(u32RB), HVD_REG_HI_MBOX1_SET, HVD_REG_HI_MBOX1_SET);
715 break;
716 }
717 case E_HVD_VPU_HI_0:
718 {
719 bResult = HAL_VPU_EX_MBoxSend(VPU_HI_MBOX0, u32Msg);
720 break;
721 }
722 case E_HVD_VPU_HI_1:
723 {
724 bResult = HAL_VPU_EX_MBoxSend(VPU_HI_MBOX1, u32Msg);
725 break;
726 }
727 default:
728 {
729 bResult = FALSE;
730 break;
731 }
732 }
733
734 return bResult;
735 }
736
_HVD_EX_MBoxReady(MS_U32 u32Id,MS_U8 u8MBox)737 static MS_BOOL _HVD_EX_MBoxReady(MS_U32 u32Id, MS_U8 u8MBox)
738 {
739 MS_BOOL bResult = TRUE;
740 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
741 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
742
743 switch (u8MBox)
744 {
745 case E_HVD_HI_0:
746 bResult = _HVD_ReadWordBit(HVD_REG_HI_MBOX_RDY(u32RB), HVD_REG_HI_MBOX0_RDY) ? FALSE : TRUE;
747 break;
748 case E_HVD_HI_1:
749 bResult = _HVD_ReadWordBit(HVD_REG_HI_MBOX_RDY(u32RB), HVD_REG_HI_MBOX1_RDY) ? FALSE : TRUE;
750 break;
751 case E_HVD_RISC_0:
752 bResult = _HVD_ReadWordBit(HVD_REG_RISC_MBOX_RDY(u32RB), HVD_REG_RISC_MBOX0_RDY) ? TRUE : FALSE;
753 break;
754 case E_HVD_RISC_1:
755 bResult = _HVD_ReadWordBit(HVD_REG_RISC_MBOX_RDY(u32RB), HVD_REG_RISC_MBOX1_RDY) ? TRUE : FALSE;
756 break;
757 case E_HVD_VPU_HI_0:
758 bResult = HAL_VPU_EX_MBoxRdy(VPU_HI_MBOX0);
759 break;
760 case E_HVD_VPU_HI_1:
761 bResult = HAL_VPU_EX_MBoxRdy(VPU_HI_MBOX1);
762 break;
763 case E_HVD_VPU_RISC_0:
764 bResult = HAL_VPU_EX_MBoxRdy(VPU_RISC_MBOX0);
765 break;
766 case E_HVD_VPU_RISC_1:
767 bResult = HAL_VPU_EX_MBoxRdy(VPU_RISC_MBOX1);
768 break;
769 default:
770 break;
771 }
772
773 return bResult;
774 }
775
_HVD_EX_MBoxRead(MS_U32 u32Id,MS_U8 u8MBox,MS_U32 * u32Msg)776 static MS_BOOL _HVD_EX_MBoxRead(MS_U32 u32Id, MS_U8 u8MBox, MS_U32 *u32Msg)
777 {
778 MS_BOOL bResult = TRUE;
779 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
780 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
781
782 switch (u8MBox)
783 {
784 case E_HVD_HI_0:
785 {
786 *u32Msg = _HVD_Read4Byte(HVD_REG_HI_MBOX0_L(u32RB));
787 break;
788 }
789 case E_HVD_HI_1:
790 {
791 *u32Msg = _HVD_Read4Byte(HVD_REG_HI_MBOX1_L(u32RB));
792 break;
793 }
794 case E_HVD_RISC_0:
795 {
796 *u32Msg = _HVD_Read4Byte(HVD_REG_RISC_MBOX0_L(u32RB));
797 break;
798 }
799 case E_HVD_RISC_1:
800 {
801 *u32Msg = _HVD_Read4Byte(HVD_REG_RISC_MBOX1_L(u32RB));
802 break;
803 }
804 case E_HVD_VPU_RISC_0:
805 {
806 bResult = HAL_VPU_EX_MBoxRead(VPU_RISC_MBOX0, u32Msg);
807 break;
808 }
809 case E_HVD_VPU_RISC_1:
810 {
811 bResult = HAL_VPU_EX_MBoxRead(VPU_RISC_MBOX1, u32Msg);
812 break;
813 }
814 default:
815 {
816 bResult = FALSE;
817 break;
818 }
819 }
820
821 return bResult;
822 }
823
824 #if 0
825 static void _HVD_EX_MBoxClear(MS_U8 u8MBox)
826 {
827 switch (u8MBox)
828 {
829 case E_HVD_RISC_0:
830 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR, HVD_REG_RISC_MBOX0_CLR, HVD_REG_RISC_MBOX0_CLR);
831 break;
832 case E_HVD_RISC_1:
833 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR, HVD_REG_RISC_MBOX1_CLR, HVD_REG_RISC_MBOX1_CLR);
834 break;
835 case E_HVD_VPU_RISC_0:
836 HAL_VPU_EX_MBoxClear(VPU_RISC_MBOX0);
837 break;
838 case E_HVD_VPU_RISC_1:
839 HAL_VPU_EX_MBoxClear(VPU_RISC_MBOX1);
840 break;
841 default:
842 break;
843 }
844 }
845 #endif
846
_HVD_EX_GetPC(void)847 static MS_U32 _HVD_EX_GetPC(void)
848 {
849 MS_U32 u32PC = 0;
850 u32PC = HAL_VPU_EX_GetProgCnt();
851 // HVD_MSG_DBG("<gdbg>pc0 =0x%lx\n",u32PC);
852 return u32PC;
853 }
854
_HVD_EX_GetESWritePtr(MS_U32 u32Id)855 static MS_U32 _HVD_EX_GetESWritePtr(MS_U32 u32Id)
856 {
857 MS_U32 u32Data = 0;
858 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
859 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
860
861 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV)
862 {
863 u32Data = pCtrl->LastNal.u32NalAddr + pCtrl->LastNal.u32NalSize;
864
865 if (u32Data > pCtrl->MemMap.u32BitstreamBufSize)
866 {
867 u32Data -= pCtrl->MemMap.u32BitstreamBufSize;
868
869 HVD_EX_MSG_ERR("app should not put this kind of packet\n");
870 }
871 }
872 else
873 {
874 #if HVD_ENABLE_MVC
875 MS_U8 u8ViewIdx = 0;
876 if(HAL_HVD_EX_CheckMVCID(u32Id))
877 {
878 u8ViewIdx = (MS_U8) HAL_HVD_EX_GetView(u32Id);
879 }
880 if(u8ViewIdx != 0) /// 2nd ES ptr.
881 {
882 u32Data = pShm->u32ES2WritePtr;
883 }
884 else
885 {
886 u32Data = pShm->u32ESWritePtr;
887 }
888 #else
889 u32Data = pShm->u32ESWritePtr;
890 #endif
891 }
892
893 return u32Data;
894 }
895
896 #define NAL_UNIT_LEN_BITS 21
897 #define NAL_UNIT_OFT_BITS 30
898 #define NAL_UNIT_OFT_LOW_BITS (32-NAL_UNIT_LEN_BITS)
899 #define NAL_UNIT_OFT_HIGH_BITS (NAL_UNIT_OFT_BITS-NAL_UNIT_OFT_LOW_BITS)
900 #define NAL_UNIT_OFT_LOW_MASK (((unsigned int)0xFFFFFFFF)>>(32-NAL_UNIT_OFT_LOW_BITS))
901
_HVD_EX_GetESReadPtr(MS_U32 u32Id,MS_BOOL bDbug)902 static MS_U32 _HVD_EX_GetESReadPtr(MS_U32 u32Id, MS_BOOL bDbug)
903 {
904 MS_U32 u32Data = 0;
905 MS_U8 u8TaskId = 0;
906 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
907 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
908 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
909 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
910 MS_PHY u32VP8_BBU_DRAM_ST_ADDR_BS3 = pShm->u32HVD_BBU_DRAM_ST_ADDR;
911
912 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
913 #if HVD_ENABLE_MVC
914 if(HAL_HVD_EX_CheckMVCID(u32Id))
915 {
916 u8TaskId = (MS_U8) HAL_HVD_EX_GetView(u32Id);
917 }
918 #endif /// HVD_ENABLE_MVC
919
920 if (((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV) || (TRUE == bDbug))
921 {
922 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP8)
923 {
924 // MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
925 MS_U16 u16ReadPtr = _HVD_EX_GetBBUReadptr(u32Id);
926 MS_U16 u16WritePtr = _HVD_EX_GetBBUWritedptr(u32Id);
927 MS_U32 *u32Adr;
928 MS_U32 u32Tmp;
929
930 if (u16ReadPtr == u16WritePtr)
931 {
932 u32Data = _HVD_EX_GetESWritePtr(u32Id);
933 }
934 else
935 {
936 if (u16ReadPtr)
937 u16ReadPtr--;
938 else
939 u16ReadPtr = VP8_BBU_DRAM_TBL_ENTRY - 1;
940
941 u32Adr = (MS_U32 *)(MsOS_PA2KSEG1(pCtrl->MemMap.u32CodeBufAddr + u32VP8_BBU_DRAM_ST_ADDR_BS3 + (u16ReadPtr << 3)));
942
943 u32Data = (*u32Adr) >> NAL_UNIT_LEN_BITS;
944 u32Tmp = (*(u32Adr+1)) & (0xffffffff>>(32-(NAL_UNIT_OFT_BITS-(32-NAL_UNIT_LEN_BITS))));
945 u32Tmp = u32Tmp << (32-NAL_UNIT_LEN_BITS);
946 u32Data = u32Data | u32Tmp;
947
948 //printf("[VP8] GetESRptr (%x,%x,%x,%x,%d,%d)\n", u32Adr, (*u32Adr), (*(u32Adr+1)) , u32Data, u16ReadPtr, u16WritePtr);
949 //while(1);
950 }
951 goto EXIT;
952 }
953 // set reg_poll_nal_rptr 0
954 _HVD_WriteWordMask(HVD_REG_ESB_RPTR(u32RB), 0, HVD_REG_ESB_RPTR_POLL);
955 // set reg_poll_nal_rptr 1
956 _HVD_WriteWordMask(HVD_REG_ESB_RPTR(u32RB), HVD_REG_ESB_RPTR_POLL, HVD_REG_ESB_RPTR_POLL);
957
958 // read reg_nal_rptr_hi
959 #ifdef VDEC3
960 if (0 == pCtrl->u32BBUId)
961 #else
962 if (0 == u8TaskId)
963 #endif
964 {
965 u32Data = _HVD_Read2Byte(HVD_REG_ESB_RPTR(u32RB)) & 0xFFC0;
966 u32Data >>= 6;
967 u32Data |= _HVD_Read2Byte(HVD_REG_ESB_RPTR_H(u32RB)) << 10;
968 }
969 else
970 {
971 u32Data = _HVD_Read2Byte(HVD_REG_ESB_RPTR_L_BS2(u32RB)) & 0xFFC0;
972 u32Data >>= 6;
973 u32Data |= _HVD_Read2Byte(HVD_REG_ESB_RPTR_H_BS2(u32RB)) << 10;
974 }
975
976 u32Data <<= 3; // unit
977
978 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV)
979 {
980 MS_U32 u32ESWptr = _HVD_EX_GetESWritePtr(u32Id);
981
982 if ((pCtrl->u32LastESRptr < u32ESWptr) && (u32Data > u32ESWptr))
983 {
984 //HVD_MSG_INFO("HVD Warn: ESRptr(%lx %lx) is running over ESWptr(%lx)\n" , u32Data , pCtrl->u32LastESRptr, u32ESWptr );
985 u32Data = u32ESWptr;
986 }
987 else if ((pCtrl->u32LastESRptr == u32ESWptr) && (u32Data > u32ESWptr))
988 {
989 //HVD_MSG_INFO("HVD Warn: ESRptr(%lx %lx) is running over ESWptr(%lx)\n" , u32Data , pCtrl->u32LastESRptr, u32ESWptr );
990 u32Data = u32ESWptr;
991 }
992 else if ((_HVD_EX_GetBBUQNumb(u32Id) == 0) && ((u32Data - u32ESWptr) < 32)
993 && ((pShm->u32FwState & E_HVD_FW_STATE_MASK) == E_HVD_FW_PLAY))
994 {
995 //HVD_MSG_INFO("HVD Warn: ESRptr(%lx %lx) is running over ESWptr(%lx)\n" , u32Data , pCtrl->u32LastESRptr, u32ESWptr );
996 u32Data = u32ESWptr;
997 }
998 else if (((u32Data > u32ESWptr) && (pCtrl->u32LastESRptr > u32Data))
999 && ((u32Data - u32ESWptr) < 32)
1000 && (pCtrl->u32FlushRstPtr == 1))
1001 {
1002 //HVD_MSG_INFO("444HVD Warn: ESRptr(%lx %lx) is running over ESWptr(%lx)\n" , u32Data , pCtrl->u32LastESRptr, u32ESWptr );
1003 u32Data = u32ESWptr;
1004 }
1005 }
1006
1007 // remove illegal pointer
1008 #if 1
1009 if ((pCtrl->MemMap.u32DrvProcessBufSize != 0) && (pCtrl->MemMap.u32DrvProcessBufAddr != 0))
1010 {
1011 MS_U32 u32PacketStaddr = u32Data + pCtrl->MemMap.u32BitstreamBufAddr;
1012
1013 if (((pCtrl->MemMap.u32DrvProcessBufAddr <= u32PacketStaddr) &&
1014 (u32PacketStaddr <
1015 (pCtrl->MemMap.u32DrvProcessBufAddr + pCtrl->MemMap.u32DrvProcessBufSize))))
1016 {
1017 //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 );
1018 u32Data = pCtrl->u32LastESRptr;
1019 }
1020 }
1021 #endif
1022 }
1023 else
1024 {
1025 #if HVD_ENABLE_MVC
1026 MS_U8 u8ViewIdx = 0;
1027 if(HAL_HVD_EX_CheckMVCID(u32Id))
1028 {
1029 u8ViewIdx = (MS_U8) HAL_HVD_EX_GetView(u32Id);
1030 }
1031 if(u8ViewIdx != 0) /// 2nd ES ptr.
1032 {
1033 u32Data = pShm->u32ES2ReadPtr;
1034 }
1035 else
1036 {
1037 u32Data = pShm->u32ESReadPtr;
1038 }
1039 #else
1040 u32Data = pShm->u32ESReadPtr;
1041 #endif
1042 }
1043
1044 EXIT:
1045
1046 pCtrl->u32LastESRptr = u32Data;
1047
1048 return u32Data;
1049 }
1050
_HVD_EX_SetCMDArg(MS_U32 u32Id,MS_U32 u32Arg)1051 static MS_BOOL _HVD_EX_SetCMDArg(MS_U32 u32Id, MS_U32 u32Arg)
1052 {
1053 MS_U16 u16TimeOut = 0xFFFF;
1054 MS_BOOL bResult = FALSE;
1055
1056 HVD_EX_MSG_DBG("Send ARG 0x%x to HVD\n", u32Arg);
1057
1058 while (--u16TimeOut)
1059 {
1060 if (_HVD_EX_MBoxReady(u32Id, HAL_HVD_CMD_MBOX) && _HVD_EX_MBoxReady(u32Id, HAL_HVD_CMD_ARG_MBOX))
1061 {
1062 bResult = _HVD_EX_MBoxSend(u32Id, HAL_HVD_CMD_ARG_MBOX, u32Arg);
1063 break;
1064 }
1065 }
1066
1067 return bResult;
1068 }
1069
_HVD_EX_SetCMD(MS_U32 u32Id,MS_U32 u32Cmd)1070 static MS_BOOL _HVD_EX_SetCMD(MS_U32 u32Id, MS_U32 u32Cmd)
1071 {
1072 MS_U16 u16TimeOut = 0xFFFF;
1073 MS_BOOL bResult = FALSE;
1074 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
1075
1076 HVD_EX_MSG_DBG("Send CMD 0x%x to HVD \n", u32Cmd);
1077
1078 #if HVD_ENABLE_MVC
1079 if(E_HAL_VPU_MVC_STREAM_BASE == u8TaskId)
1080 {
1081 u8TaskId = E_HAL_VPU_MAIN_STREAM_BASE;
1082 }
1083 #endif /// HVD_ENABLE_MVC
1084
1085 HVD_EX_MSG_DBG("Send CMD 0x%x to HVD u8TaskId = %X\n", u32Cmd,u8TaskId);
1086
1087 while (--u16TimeOut)
1088 {
1089 if (_HVD_EX_MBoxReady(u32Id, HAL_HVD_CMD_MBOX))
1090 {
1091 u32Cmd |= (u8TaskId << 24);
1092 bResult = _HVD_EX_MBoxSend(u32Id, HAL_HVD_CMD_MBOX, u32Cmd);
1093 break;
1094 }
1095 }
1096 return bResult;
1097 }
1098
_HVD_EX_SendCmd(MS_U32 u32Id,MS_U32 u32Cmd,MS_U32 u32CmdArg)1099 static HVD_Return _HVD_EX_SendCmd(MS_U32 u32Id, MS_U32 u32Cmd, MS_U32 u32CmdArg)
1100 {
1101 MS_U32 u32timeout = HVD_GetSysTime_ms() + pHVDHalContext->u32HVDCmdTimeout;
1102 #ifdef VDEC3
1103 HVD_DRAM_COMMAND_QUEUE_SEND_STATUS SentRet = E_HVD_COMMAND_QUEUE_SEND_FAIL;
1104 MS_BOOL IsSent = FALSE;
1105 MS_BOOL IsMailBox = FALSE;
1106 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
1107
1108 if (HAL_VPU_EX_IsDisplayQueueCMD(u32Cmd))
1109 {
1110 do {
1111 SentRet = HAL_VPU_EX_DRAMStreamDispCMDQueueSend(u32Id, &pShm->cmd_queue, E_HVD_CMDQ_ARG, u32CmdArg);
1112 if (!SentRet)
1113 HVD_EX_MSG_DBG("^^^Display command ARG return=0x%X cmd=0x%x arg=0x%x\n", SentRet,u32Cmd, u32CmdArg);
1114 if (SentRet == E_HVD_COMMAND_QUEUE_NOT_INITIALED)
1115 break;
1116 else if (SentRet == E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL) {
1117 IsSent = TRUE;
1118 break;
1119 }
1120 else if (HVD_GetSysTime_ms() > u32timeout)
1121 {
1122 HVD_EX_MSG_ERR("^^^Display command ARG timeout: cmd=0x%x arg=0x%x\n", u32Cmd, u32CmdArg);
1123 break;
1124 }
1125 }while (SentRet != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL);
1126 }
1127 else if (!HAL_VPU_EX_IsMailBoxCMD(u32Cmd))
1128 {
1129 do {
1130 SentRet = HAL_VPU_EX_DRAMStreamCMDQueueSend(u32Id, &pShm->cmd_queue, E_HVD_CMDQ_ARG, u32CmdArg);
1131 if (!SentRet)
1132 HVD_EX_MSG_DBG("^^^Dram command ARG return=0x%X cmd=0x%x arg=0x%x\n", SentRet,u32Cmd, u32CmdArg);
1133 if (SentRet == E_HVD_COMMAND_QUEUE_NOT_INITIALED)
1134 break;
1135 else if (SentRet == E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL) {
1136 IsSent = TRUE;
1137 break;
1138 }
1139 else if (HVD_GetSysTime_ms() > u32timeout)
1140 {
1141 HVD_EX_MSG_ERR("^^^Dram command ARG timeout: cmd=0x%x arg=0x%x\n", u32Cmd, u32CmdArg);
1142 break;
1143 }
1144 }while (SentRet != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL);
1145 }
1146 if (!IsSent) {
1147 IsMailBox = TRUE;
1148 u32timeout = HVD_GetSysTime_ms() + pHVDHalContext->u32HVDCmdTimeout;
1149 while (!_HVD_EX_SetCMDArg(u32Id, u32CmdArg))
1150 #else
1151 while (!_HVD_EX_SetCMDArg(u32Id, u32CmdArg))
1152 #endif
1153 {
1154 #ifndef VDEC3 // FIXME: workaround fw response time is slow sometimes in multiple stream case so far
1155 if (HVD_GetSysTime_ms() > u32timeout)
1156 {
1157 HVD_EX_MSG_ERR("Timeout: cmd=0x%x arg=0x%x\n", u32Cmd, u32CmdArg);
1158 return E_HVD_RETURN_TIMEOUT;
1159 }
1160 #endif
1161
1162 #if 0
1163 if (u32Cmd == E_HVD_CMD_STOP)
1164 {
1165 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
1166 #if HVD_ENABLE_MVC
1167 if(E_HAL_VPU_MVC_STREAM_BASE == u8TaskId)
1168 {
1169 u8TaskId = E_HAL_VPU_MAIN_STREAM_BASE;
1170 }
1171 #endif /// HVD_ENABLE_MVC
1172 MS_U32 u32Cmdtmp = (u8TaskId << 24) | E_HVD_CMD_STOP;
1173
1174 _HVD_EX_MBoxSend(u32Id, HAL_HVD_CMD_MBOX, u32Cmdtmp);
1175 _HVD_EX_MBoxSend(u32Id, HAL_HVD_CMD_ARG_MBOX, 0);
1176
1177 return E_HVD_RETURN_SUCCESS;
1178 }
1179 #endif
1180
1181 if(u32Cmd < E_DUAL_CMD_BASE)
1182 {
1183 //_HVD_EX_GetPC();
1184 HAL_HVD_EX_Dump_FW_Status(u32Id);
1185 HAL_HVD_EX_Dump_HW_Status(HVD_U32_MAX);
1186 }
1187 }
1188
1189 #ifdef VDEC3
1190 }
1191 IsSent = FALSE;
1192 u32timeout = HVD_GetSysTime_ms() + pHVDHalContext->u32HVDCmdTimeout;
1193 if (HAL_VPU_EX_IsDisplayQueueCMD(u32Cmd) && !IsMailBox)
1194 {
1195 do {
1196 SentRet = HAL_VPU_EX_DRAMStreamDispCMDQueueSend(u32Id, &pShm->cmd_queue, E_HVD_CMDQ_CMD,u32Cmd);
1197 if (!SentRet)
1198 HVD_EX_MSG_DBG("^^^Display command CMD return=0x%X cmd=0x%x arg=0x%x\n", SentRet,u32Cmd, u32CmdArg);
1199 if (SentRet == E_HVD_COMMAND_QUEUE_NOT_INITIALED)
1200 break;
1201 else if (SentRet == E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL){
1202 IsSent = TRUE;
1203 break;
1204 }
1205 else if (HVD_GetSysTime_ms() > u32timeout)
1206 {
1207 HVD_EX_MSG_ERR("^^^Display command CMD timeout: cmd=0x%x arg=0x%x\n", u32Cmd, u32CmdArg);
1208 break;
1209 }
1210 } while (SentRet != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL);
1211 }
1212 else if(!HAL_VPU_EX_IsMailBoxCMD(u32Cmd) && !IsMailBox)
1213 {
1214 do {
1215 SentRet = HAL_VPU_EX_DRAMStreamCMDQueueSend(u32Id, &pShm->cmd_queue, E_HVD_CMDQ_CMD,u32Cmd);
1216 if (SentRet != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL) {
1217 HVD_EX_MSG_ERR("^^^Dram command CMD return=0x%X cmd=0x%x arg=0x%x\n", SentRet,u32Cmd, u32CmdArg);
1218 }
1219 if (SentRet == E_HVD_COMMAND_QUEUE_NOT_INITIALED)
1220 break;
1221 else if (SentRet == E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL){
1222 IsSent = TRUE;
1223 break;
1224 }
1225 else if (HVD_GetSysTime_ms() > u32timeout)
1226 {
1227 HVD_EX_MSG_ERR("^^^Dram command CMD timeout: cmd=0x%x arg=0x%x\n", u32Cmd, u32CmdArg);
1228 break;
1229 }
1230 } while (SentRet != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL);
1231 }
1232 if (!IsSent)
1233 {
1234 u32timeout = HVD_GetSysTime_ms() + pHVDHalContext->u32HVDCmdTimeout;
1235 while (!_HVD_EX_SetCMD(u32Id, u32Cmd))
1236 #else
1237 u32timeout = HVD_GetSysTime_ms() + pHVDHalContext->u32HVDCmdTimeout;
1238
1239 while (!_HVD_EX_SetCMD(u32Id, u32Cmd))
1240 #endif
1241 {
1242 #ifndef VDEC3 // FIXME: workaround fw response time is slow sometimes in multiple stream case so far
1243 if (HVD_GetSysTime_ms() > u32timeout)
1244 {
1245 HVD_EX_MSG_ERR("cmd timeout: %x\n", u32Cmd);
1246 return E_HVD_RETURN_TIMEOUT;
1247 }
1248 #endif
1249 if(u32Cmd < E_DUAL_CMD_BASE)
1250 {
1251 //_HVD_EX_GetPC();
1252 HAL_HVD_EX_Dump_FW_Status(u32Id);
1253 HAL_HVD_EX_Dump_HW_Status(HVD_U32_MAX);
1254 }
1255 }
1256 #ifdef VDEC3
1257 }
1258 else
1259 {
1260 HAL_HVD_EX_FlushMemory();
1261 }
1262 #endif
1263 return E_HVD_RETURN_SUCCESS;
1264 }
1265
_HVD_EX_SetMIUProtectMask(MS_BOOL bEnable)1266 static void _HVD_EX_SetMIUProtectMask(MS_BOOL bEnable)
1267 {
1268 #if HAL_HVD_ENABLE_MIU_PROTECT
1269 _HVD_MIU_SetReqMask(MVD_RW, bEnable);
1270 _HVD_MIU_SetReqMask(MVD_BBU_R, bEnable);
1271 #if SUPPORT_EVD
1272 _HVD_MIU_SetReqMask(EVD_RW, bEnable);
1273 _HVD_MIU_SetReqMask(EVD_BBU_R, bEnable);
1274 #endif
1275 _HVD_MIU_SetReqMask(HVD_RW, bEnable);
1276 _HVD_MIU_SetReqMask(HVD_BBU_R, bEnable);
1277 HAL_VPU_EX_MIU_RW_Protect(bEnable);
1278 //HVD_Delay_ms(1);
1279 #endif
1280 return;
1281 }
1282
1283 #ifdef VDEC3
_HAL_EX_IS_EVD(MS_U32 u32ModeFlag)1284 static MS_BOOL _HAL_EX_IS_EVD(MS_U32 u32ModeFlag)
1285 {
1286 MS_U32 u32CodecType = u32ModeFlag & E_HVD_INIT_HW_MASK;
1287
1288 if (u32CodecType == E_HVD_INIT_HW_HEVC
1289 #if SUPPORT_MSVP9
1290 || u32CodecType == E_HVD_INIT_HW_VP9
1291 #endif
1292 )
1293 return TRUE;
1294
1295 return FALSE;
1296 }
1297
_HAL_EX_IS_HVD(MS_U32 u32ModeFlag)1298 static MS_BOOL _HAL_EX_IS_HVD(MS_U32 u32ModeFlag) // VP8 isn't included
1299 {
1300 MS_U32 u32CodecType = u32ModeFlag & E_HVD_INIT_HW_MASK;
1301
1302 if ((u32CodecType == E_HVD_INIT_HW_MVC) ||
1303 (u32CodecType == E_HVD_INIT_HW_AVC) ||
1304 (u32CodecType == E_HVD_INIT_HW_AVS) ||
1305 (u32CodecType == E_HVD_INIT_HW_RM))
1306 return TRUE;
1307
1308 return FALSE;
1309 }
1310
_HAL_EX_BBU_EVD_InUsed(void)1311 static MS_BOOL _HAL_EX_BBU_EVD_InUsed(void)
1312 {
1313 if (!pHVDHalContext)
1314 return FALSE;
1315
1316 MS_U32 i;
1317 MS_BOOL bRet = FALSE;
1318
1319 for (i = 0; i < HAL_HVD_EX_MAX_SUPPORT_STREAM; i++)
1320 {
1321 if (pHVDHalContext->_stHVDStream[i].bUsed &&
1322 ((pHVDHalContext->_stHVDStream[i].u32CodecType == E_HAL_HVD_HEVC)
1323 #if SUPPORT_MSVP9
1324 ||(pHVDHalContext->_stHVDStream[i].u32CodecType == E_HAL_HVD_VP9)
1325 #endif
1326 ))
1327 {
1328 bRet = TRUE;
1329 break;
1330 }
1331 }
1332
1333 return bRet;
1334 }
1335
_HAL_EX_BBU_HVD_InUsed(void)1336 static MS_BOOL _HAL_EX_BBU_HVD_InUsed(void) // VP8 isn't included
1337 {
1338 if (!pHVDHalContext)
1339 return FALSE;
1340
1341 MS_U32 i;
1342 MS_BOOL bRet = FALSE;
1343
1344 for (i = 0; i < HAL_HVD_EX_MAX_SUPPORT_STREAM; i++)
1345 {
1346 if (pHVDHalContext->_stHVDStream[i].bUsed &&
1347 ((pHVDHalContext->_stHVDStream[i].u32CodecType == E_HAL_HVD_AVC) ||
1348 (pHVDHalContext->_stHVDStream[i].u32CodecType == E_HAL_HVD_AVS) ||
1349 (pHVDHalContext->_stHVDStream[i].u32CodecType == E_HAL_HVD_RM)))
1350 {
1351 bRet = TRUE;
1352 break;
1353 }
1354 }
1355
1356 return bRet;
1357 }
1358
_HAL_EX_BBU_VP8_InUsed(void)1359 static MS_BOOL _HAL_EX_BBU_VP8_InUsed(void)
1360 {
1361 if (!pHVDHalContext)
1362 return FALSE;
1363
1364 MS_U32 i;
1365 MS_BOOL bRet = FALSE;
1366
1367 for (i = 0; i < HAL_HVD_EX_MAX_SUPPORT_STREAM; i++)
1368 {
1369 if (pHVDHalContext->_stHVDStream[i].bUsed && pHVDHalContext->_stHVDStream[i].u32CodecType == E_HAL_HVD_VP8)
1370 {
1371 bRet = TRUE;
1372 break;
1373 }
1374 }
1375
1376 return bRet;
1377 }
1378
1379 #endif
1380
_HVD_EX_SetBufferAddr(MS_U32 u32Id)1381 static void _HVD_EX_SetBufferAddr(MS_U32 u32Id)
1382 {
1383 MS_U16 u16Reg = 0;
1384 MS_VIRT u32StAddr = 0;
1385 #ifdef VDEC3
1386 MS_U32 u32Length = 0;
1387 #endif
1388 //MS_BOOL bBitMIU1 = FALSE;
1389 //MS_BOOL bCodeMIU1 = FALSE;
1390 MS_U8 u8BitMiuSel = 0;
1391 MS_U8 u8CodeMiuSel = 0;
1392 MS_U8 u8FBMiuSel = 0;
1393 MS_U32 u32BitStartOffset;
1394 MS_U32 u32CodeStartOffset;
1395 MS_U32 u32FBStartOffset;
1396
1397 MS_U8 u8TaskId = 0;
1398 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1399 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
1400 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
1401 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
1402
1403 // MS_U32 u32TmpStartOffset;
1404 MS_U8 u8TmpMiuSel;
1405
1406
1407
1408 if(pCtrl == NULL) return;
1409
1410 _phy_to_miu_offset(u8BitMiuSel, u32BitStartOffset, pCtrl->MemMap.u32BitstreamBufAddr);
1411 _phy_to_miu_offset(u8CodeMiuSel, u32CodeStartOffset, pCtrl->MemMap.u32CodeBufAddr);
1412 _phy_to_miu_offset(u8FBMiuSel, u32FBStartOffset, pCtrl->MemMap.u32FrameBufAddr);
1413
1414 HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_MIU_SEL,
1415 (u8BitMiuSel << VDEC_BS_MIUSEL) |
1416 (u8FBMiuSel << VDEC_LUMA8_MIUSEL) |
1417 (u8FBMiuSel << VDEC_LUMA2_MIUSEL) |
1418 (u8FBMiuSel << VDEC_CHROMA8_MIUSEL) |
1419 (u8FBMiuSel << VDEC_CHROMA2_MIUSEL) |
1420 (u8FBMiuSel << VDEC_HWBUF_MIUSEL) |
1421 (u8FBMiuSel << VDEC_BUF1_MIUSEL) |
1422 (u8FBMiuSel << VDEC_BUF2_MIUSEL) |
1423 (u8FBMiuSel << VDEC_PPIN_MIUSEL));
1424
1425 if (u8BitMiuSel != u8CodeMiuSel)
1426 {
1427 _phy_to_miu_offset(u8TmpMiuSel, u32StAddr, (pCtrl->MemMap.u32BitstreamBufAddr + pCtrl->u32BBUTblInBitstreamBufAddr));
1428 }
1429 else
1430 {
1431 _phy_to_miu_offset(u8TmpMiuSel, u32StAddr, (pCtrl->MemMap.u32CodeBufAddr + pShm->u32HVD_BBU_DRAM_ST_ADDR));
1432 }
1433
1434 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
1435 {
1436 #ifdef VDEC3
1437 if (!_HAL_EX_BBU_VP8_InUsed())
1438 #endif
1439 {
1440 _HVD_Write2Byte(HVD_REG_HK_VP8, HVD_REG_HK_PLAYER_FM);
1441
1442 _HVD_Write2Byte(HVD_REG_NAL_TAB_ST_L_BS3, (MS_U16)(u32StAddr >> 3));
1443 _HVD_Write2Byte(HVD_REG_NAL_TAB_ST_H_BS3, (MS_U16)(u32StAddr >> 19));
1444 _HVD_Write2Byte(HVD_REG_NAL_TAB_LEN_BS3, (MS_U16)(pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum - 1));
1445
1446 u32StAddr += VP8_BBU_TBL_SIZE;
1447
1448 _HVD_Write2Byte(HVD_REG_NAL_TAB_ST_L_BS4, (MS_U16)(u32StAddr >> 3));
1449 _HVD_Write2Byte(HVD_REG_NAL_TAB_ST_H_BS4, (MS_U16)(u32StAddr >> 19));
1450 _HVD_Write2Byte(HVD_REG_NAL_TAB_LEN_BS4, (MS_U16)(pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum - 1));
1451 }
1452
1453 // ES buffer
1454 #ifdef VDEC3
1455 if(pCtrl->bNStreamMode)
1456 u32StAddr = pCtrl->MemMap.u32TotalBitstreamBufAddr; // NStream will share the same ES buffer
1457 else
1458 #endif
1459 u32StAddr = u32BitStartOffset;
1460
1461 _phy_to_miu_offset(u8TmpMiuSel, u32StAddr, u32StAddr);
1462
1463 #ifdef VDEC3
1464 if (!_HAL_EX_BBU_VP8_InUsed())
1465 #endif
1466 {
1467 HVD_EX_MSG_ERR("ESB start addr=%lx\n", (unsigned long)u32StAddr);
1468
1469 _HVD_Write2Byte(HVD_REG_ESB_ST_ADR_L_BS34, HVD_LWORD(u32StAddr >> 3));
1470 _HVD_Write2Byte(HVD_REG_ESB_ST_ADR_H_BS34, HVD_HWORD(u32StAddr >> 3));
1471
1472 #ifdef VDEC3
1473 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L_BS34, HVD_LWORD(pCtrl->MemMap.u32TotalBitstreamBufSize >> 3));
1474 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H_BS34, HVD_HWORD(pCtrl->MemMap.u32TotalBitstreamBufSize >> 3));
1475 #else
1476 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L_BS34, HVD_LWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1477 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H_BS34, HVD_HWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1478 #endif
1479
1480 u16Reg = _HVD_Read2Byte(HVD_REG_MIF_BS34);
1481 u16Reg &= ~HVD_REG_BS34_TSP_INPUT;
1482 u16Reg &= ~HVD_REG_BS34_PASER_MASK;
1483 u16Reg |= HVD_REG_BS34_PASER_DISABLE;
1484 u16Reg |= HVD_REG_BS34_AUTO_NAL_TAB;
1485 _HVD_Write2Byte(HVD_REG_MIF_BS34, u16Reg);
1486 }
1487
1488 return;
1489 }
1490
1491 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
1492
1493 HVD_EX_MSG_DBG("NAL start addr=%lx\n", (unsigned long)u32StAddr);
1494
1495 #ifdef VDEC3
1496 if (!pCtrl->bNStreamMode || ((_HAL_EX_IS_EVD(pCtrl->InitParams.u32ModeFlag) && !_HAL_EX_BBU_EVD_InUsed()) ||
1497 (_HAL_EX_IS_HVD(pCtrl->InitParams.u32ModeFlag) && !_HAL_EX_BBU_HVD_InUsed()) ||
1498 (E_HVD_INIT_INPUT_TSP == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK))))
1499 {
1500 if (pCtrl->u32BBUId == 0)
1501 {
1502 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_L(u32RB), (MS_U16) (u32StAddr >> 3));
1503 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_H(u32RB), (MS_U16) (u32StAddr >> 19));
1504 // -1 is for NAL_TAB_LEN counts from zero.
1505 _HVD_Write2Byte(HVD_REG_NAL_TAB_LEN(u32RB), (MS_U16) (pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum - 1));
1506 }
1507 else
1508 {
1509 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_L_BS2(u32RB), (MS_U16) (u32StAddr >> 3));
1510 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_H_BS2(u32RB), (MS_U16) (u32StAddr >> 19));
1511 // -1 is for NAL_TAB_LEN counts from zero.
1512 _HVD_Write2Byte(HVD_REG_NAL_TAB_LEN_BS2(u32RB), (MS_U16) (pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum - 1));
1513 }
1514 }
1515 #else
1516 if (0 == u8TaskId)
1517 {
1518 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_L(u32RB), (MS_U16) (u32StAddr >> 3));
1519 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_H(u32RB), (MS_U16) (u32StAddr >> 19));
1520 // -1 is for NAL_TAB_LEN counts from zero.
1521 _HVD_Write2Byte(HVD_REG_NAL_TAB_LEN(u32RB), (MS_U16) (pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum - 1));
1522 }
1523 else
1524 {
1525 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_L_BS2(u32RB), (MS_U16) (u32StAddr >> 3));
1526 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_H_BS2(u32RB), (MS_U16) (u32StAddr >> 19));
1527 // -1 is for NAL_TAB_LEN counts from zero.
1528 _HVD_Write2Byte(HVD_REG_NAL_TAB_LEN_BS2(u32RB), (MS_U16) (pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum - 1));
1529 }
1530 #endif
1531
1532 // ES buffer
1533 #ifdef VDEC3
1534 if(!pCtrl->bNStreamMode || E_HVD_INIT_INPUT_TSP == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK))
1535 {
1536 u32StAddr = pCtrl->MemMap.u32BitstreamBufAddr;
1537 u32Length = pCtrl->MemMap.u32BitstreamBufSize >> 3;
1538 }
1539 else
1540 {
1541 u32StAddr = pCtrl->MemMap.u32TotalBitstreamBufAddr;
1542 u32Length = pCtrl->MemMap.u32TotalBitstreamBufSize >> 3;
1543 }
1544 #else
1545 u32StAddr = u32BitStartOffset;
1546 #endif
1547
1548 _phy_to_miu_offset(u8TmpMiuSel, u32StAddr, u32StAddr);
1549
1550 HVD_EX_MSG_DBG("ESB start addr=%lx, len=%x\n", (unsigned long)u32StAddr, pCtrl->MemMap.u32BitstreamBufSize);
1551
1552 #ifdef VDEC3
1553 if (!pCtrl->bNStreamMode || ((_HAL_EX_IS_EVD(pCtrl->InitParams.u32ModeFlag) && !_HAL_EX_BBU_EVD_InUsed()) ||
1554 (_HAL_EX_IS_HVD(pCtrl->InitParams.u32ModeFlag) && !_HAL_EX_BBU_HVD_InUsed()) ||
1555 (E_HVD_INIT_INPUT_TSP == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK))))
1556 {
1557 if (pCtrl->u32BBUId == 0)
1558 {
1559 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L(u32RB), HVD_LWORD(u32StAddr >> 3));
1560 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H(u32RB), HVD_HWORD(u32StAddr >> 3));
1561
1562 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L(u32RB), HVD_LWORD(u32Length));
1563 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H(u32RB), HVD_HWORD(u32Length));
1564 }
1565 else
1566 {
1567 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L_BS2(u32RB), HVD_LWORD(u32StAddr >> 3));
1568 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H_BS2(u32RB), HVD_HWORD(u32StAddr >> 3));
1569
1570 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L_BS2(u32RB), HVD_LWORD(u32Length));
1571 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H_BS2(u32RB), HVD_HWORD(u32Length));
1572 }
1573 }
1574 #else
1575 if (0 == u8TaskId)
1576 {
1577 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L(u32RB), HVD_LWORD(u32StAddr >> 3));
1578 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H(u32RB), HVD_HWORD(u32StAddr >> 3));
1579
1580 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L(u32RB), HVD_LWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1581 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H(u32RB), HVD_HWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1582 }
1583 else
1584 {
1585 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L_BS2(u32RB), HVD_LWORD(u32StAddr >> 3));
1586 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H_BS2(u32RB), HVD_HWORD(u32StAddr >> 3));
1587
1588 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L_BS2(u32RB), HVD_LWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1589 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H_BS2(u32RB), HVD_HWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1590 }
1591 #endif
1592
1593 // others
1594 #ifdef VDEC3
1595 if (!pCtrl->bNStreamMode || ((_HAL_EX_IS_EVD(pCtrl->InitParams.u32ModeFlag) && !_HAL_EX_BBU_EVD_InUsed()) ||
1596 (_HAL_EX_IS_HVD(pCtrl->InitParams.u32ModeFlag) && !_HAL_EX_BBU_HVD_InUsed()) ||
1597 (E_HVD_INIT_INPUT_TSP == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK))))
1598 {
1599 u16Reg = _HVD_Read2Byte(HVD_REG_MIF_BBU(u32RB));
1600
1601 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_TSP)
1602 {
1603 if (pCtrl->u32BBUId == 0)
1604 u16Reg |= HVD_REG_BBU_TSP_INPUT;
1605 else
1606 u16Reg |= HVD_REG_BBU_TSP_INPUT_BS2;
1607 }
1608 else
1609 {
1610 if (pCtrl->u32BBUId == 0)
1611 u16Reg &= ~HVD_REG_BBU_TSP_INPUT;
1612 else
1613 u16Reg &= ~HVD_REG_BBU_TSP_INPUT_BS2;
1614 }
1615
1616 if (pCtrl->u32BBUId == 0)
1617 u16Reg &= ~HVD_REG_BBU_PASER_MASK;
1618 else
1619 u16Reg &= ~HVD_REG_BBU_PASER_MASK_BS2;
1620
1621 if (E_HVD_INIT_HW_RM == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) // RM
1622 {
1623 if (pCtrl->u32BBUId == 0) // force BBU to remove nothing, RM only
1624 u16Reg |= HVD_REG_BBU_PASER_DISABLE;
1625 else
1626 u16Reg |= HVD_REG_BBU_PASER_DISABLE_BS2;
1627 }
1628 #if SUPPORT_MSVP9
1629 else if (E_HVD_INIT_HW_VP9 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
1630 {
1631 if (pCtrl->u32BBUId == 0)
1632 u16Reg &= ~HVD_REG_BBU_PASER_ENABLE_03;
1633 else
1634 u16Reg &= ~HVD_REG_BBU_PASER_ENABLE_03_BS2;
1635 }
1636 #endif
1637 else // AVS or AVC or HEVC
1638 {
1639 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_START_CODE_MASK) == E_HVD_INIT_START_CODE_REMOVED)
1640 {
1641 if (pCtrl->u32BBUId == 0)
1642 u16Reg |= HVD_REG_BBU_PASER_ENABLE_03;
1643 else
1644 u16Reg |= HVD_REG_BBU_PASER_ENABLE_03_BS2;
1645 }
1646 else // start code remained
1647 {
1648 if (pCtrl->u32BBUId == 0)
1649 u16Reg |= HVD_REG_BBU_PASER_ENABLE_ALL;
1650 else
1651 u16Reg |= HVD_REG_BBU_PASER_ENABLE_ALL_BS2;
1652 }
1653 }
1654
1655 if (pCtrl->u32BBUId == 0)
1656 {
1657 u16Reg |= HVD_REG_BBU_AUTO_NAL_TAB;
1658 _HVD_Write2Byte(HVD_REG_MIF_BBU(u32RB), u16Reg);
1659 }
1660 else
1661 {
1662 u16Reg |= HVD_REG_BBU_AUTO_NAL_TAB_BS2;
1663 _HVD_Write2Byte(HVD_REG_MIF_BBU_BS2(u32RB), u16Reg);
1664 }
1665 }
1666 #else
1667 if (0 == u8TaskId)
1668 {
1669 u16Reg = _HVD_Read2Byte(HVD_REG_MIF_BBU(u32RB));
1670
1671 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_TSP)
1672 {
1673 u16Reg |= HVD_REG_BBU_TSP_INPUT;
1674 }
1675 else
1676 {
1677 u16Reg &= ~HVD_REG_BBU_TSP_INPUT;
1678 }
1679
1680 u16Reg &= ~HVD_REG_BBU_PASER_MASK;
1681
1682 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_RM) // RM
1683 {
1684 u16Reg |= HVD_REG_BBU_PASER_DISABLE; // force BBU to remove nothing, RM only
1685 }
1686 else // AVS or AVC
1687 {
1688 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_START_CODE_MASK) == E_HVD_INIT_START_CODE_REMOVED)
1689 {
1690 u16Reg |= HVD_REG_BBU_PASER_ENABLE_03;
1691 }
1692 else // start code remained
1693 {
1694 u16Reg |= HVD_REG_BBU_PASER_ENABLE_ALL;
1695 }
1696 }
1697
1698 u16Reg |= HVD_REG_BBU_AUTO_NAL_TAB;
1699
1700 _HVD_Write2Byte(HVD_REG_MIF_BBU(u32RB), u16Reg);
1701 }
1702 else
1703 {
1704 u16Reg = _HVD_Read2Byte(HVD_REG_MIF_BBU_BS2(u32RB));
1705
1706 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_TSP)
1707 {
1708 u16Reg |= HVD_REG_BBU_TSP_INPUT_BS2;
1709 }
1710 else
1711 {
1712 u16Reg &= ~HVD_REG_BBU_TSP_INPUT_BS2;
1713 }
1714
1715 u16Reg &= ~HVD_REG_BBU_PASER_MASK_BS2;
1716
1717 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_RM) // RM
1718 {
1719 u16Reg |= HVD_REG_BBU_PASER_DISABLE_BS2; // force BBU to remove nothing, RM only
1720 }
1721 else // AVS or AVC
1722 {
1723 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_START_CODE_MASK) == E_HVD_INIT_START_CODE_REMOVED)
1724 {
1725 u16Reg |= HVD_REG_BBU_PASER_ENABLE_03_BS2;
1726 }
1727 else // start code remained
1728 {
1729 u16Reg |= HVD_REG_BBU_PASER_ENABLE_ALL_BS2;
1730 }
1731 }
1732
1733 u16Reg |= HVD_REG_BBU_AUTO_NAL_TAB_BS2;
1734
1735 _HVD_Write2Byte(HVD_REG_MIF_BBU_BS2(u32RB), u16Reg);
1736 }
1737 #endif
1738
1739 #if (HVD_ENABLE_MVC)
1740 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_MVC)
1741 {
1742 /// Used sub stream to record sub view data.
1743 HVD_EX_Drv_Ctrl *pDrvCtrl_Sub = _HVD_EX_GetDrvCtrl((u32Id+0x00011000));
1744 //printf("**************** Buffer setting for MVC dual-BBU *************\n");
1745
1746 if (u8BitMiuSel != u8CodeMiuSel)
1747 {
1748 _phy_to_miu_offset(u8TmpMiuSel, u32StAddr, (pDrvCtrl_Sub->MemMap.u32BitstreamBufAddr + pDrvCtrl_Sub->u32BBUTblInBitstreamBufAddr));
1749 }
1750 else
1751 {
1752 _phy_to_miu_offset(u8TmpMiuSel, u32StAddr, (pDrvCtrl_Sub->MemMap.u32CodeBufAddr + pShm->u32HVD_BBU2_DRAM_ST_ADDR));
1753 }
1754
1755
1756 HVD_EX_MSG_DBG("[MVC] _HAL_HVD_SetBuffer2Addr: nal StAddr:%lx \n", (unsigned long) u32StAddr);
1757 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_L_BS2(u32RB), (MS_U16)(u32StAddr >> 3));
1758 _HVD_Write2Byte(HVD_REG_NAL_TBL_ST_ADDR_H_BS2(u32RB), (MS_U16)(u32StAddr >> 19));
1759 // -1 is for NAL_TAB_LEN counts from zero.
1760 _HVD_Write2Byte(HVD_REG_NAL_TAB_LEN_BS2(u32RB), (MS_U16)(pHVDHalContext->_stHVDStream[u8Idx+1].u32BBUEntryNum - 1));
1761
1762 // ES buffer
1763 _phy_to_miu_offset(u8TmpMiuSel, u32StAddr, (pDrvCtrl_Sub->MemMap.u32BitstreamBufAddr));
1764
1765 HVD_EX_MSG_DBG("[MVC] 2nd ES _HAL_HVD_SetBuffer2Addr: ESb StAddr:%lx, len:%lx.\n", (unsigned long) u32StAddr, (unsigned long) pDrvCtrl_Sub->MemMap.u32BitstreamBufSize);
1766 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L_BS2(u32RB), HVD_LWORD(u32StAddr >> 3));
1767 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H_BS2(u32RB), HVD_HWORD(u32StAddr >> 3));
1768
1769 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L_BS2(u32RB), HVD_LWORD(pDrvCtrl_Sub->MemMap.u32BitstreamBufSize >> 3));
1770 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H_BS2(u32RB), HVD_HWORD(pDrvCtrl_Sub->MemMap.u32BitstreamBufSize >> 3));
1771
1772 u16Reg = _HVD_Read2Byte(HVD_REG_MIF_BBU_BS2(u32RB));
1773 if((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_TSP)
1774 {
1775 u16Reg |= HVD_REG_BBU_TSP_INPUT_BS2;
1776 HVD_EX_MSG_DBG("[MVC] 2nd ES, TSP mode.\n");
1777 }
1778 else
1779 {
1780 u16Reg &= ~HVD_REG_BBU_TSP_INPUT_BS2;
1781 HVD_EX_MSG_DBG("[MVC] 2nd ES, BBU mode.\n");
1782 }
1783 u16Reg &= ~HVD_REG_BBU_PASER_MASK_BS2;
1784 if((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_RM) // RM
1785 {
1786 u16Reg |= HVD_REG_BBU_PASER_DISABLE_BS2; // force BBU to remove nothing, RM only
1787 }
1788 else // AVS or AVC
1789 {
1790 if((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_START_CODE_MASK) == E_HVD_INIT_START_CODE_REMOVED)
1791 {
1792 u16Reg |= HVD_REG_BBU_PASER_ENABLE_03_BS2;
1793 }
1794 else // start code remained
1795 {
1796 u16Reg |= HVD_REG_BBU_PASER_ENABLE_ALL_BS2;
1797 ///HVD_MSG_DBG("[MVC] BBU Paser all.\n");
1798 }
1799 }
1800 u16Reg |= HVD_REG_BBU_AUTO_NAL_TAB_BS2;
1801 ///HVD_MSG_DBG("[MVC] 2nd MIF BBU 0x%lx.\n",(MS_U32)u16Reg);
1802 _HVD_Write2Byte(HVD_REG_MIF_BBU_BS2(u32RB), u16Reg);
1803 }
1804 #endif
1805
1806 // MIF offset
1807 #if 0
1808 {
1809 MS_U16 offaddr = 0;
1810 u32StAddr = pCtrl->MemMap.u32CodeBufAddr;
1811 if (u32StAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
1812 {
1813 u32StAddr -= pCtrl->MemMap.u32MIU1BaseAddr;
1814 }
1815 HVD_EX_MSG_DBG("MIF offset:%lx \n", u32StAddr);
1816 offaddr = (MS_U16) ((u32StAddr) >> 20);
1817 offaddr &= BMASK(HVD_REG_MIF_OFFSET_L_BITS:0);
1818 //0x1FF; // 9 bits(L + H)
1819 u16Reg = _HVD_Read2Byte(HVD_REG_MIF_BBU);
1820 u16Reg &= ~HVD_REG_MIF_OFFSET_H;
1821 u16Reg &= ~(BMASK(HVD_REG_MIF_OFFSET_L_BITS:0));
1822 if (offaddr & BIT(HVD_REG_MIF_OFFSET_L_BITS))
1823 {
1824 u16Reg |= HVD_REG_MIF_OFFSET_H;
1825 }
1826 _HVD_Write2Byte(HVD_REG_MIF_BBU, (u16Reg | (offaddr & BMASK(HVD_REG_MIF_OFFSET_L_BITS:0))));
1827 }
1828 #endif
1829 }
1830
1831 #if 0 //defined(SUPPORT_NEW_MEM_LAYOUT) || defined(SUPPORT_NEW_VDEC_FLOW)
1832 // Note: For VP8 only. MVC ES buffer address will be set when _HVD_EX_SetBufferAddr() is called
1833 static void _HVD_EX_SetESBufferAddr(MS_U32 u32Id)
1834 {
1835 MS_U16 u16Reg = 0;
1836 MS_U32 u32StAddr = 0;
1837 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1838 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
1839 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
1840
1841 if(pCtrl == NULL) return;
1842
1843 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
1844 {
1845 _HVD_Write2Byte(HVD_REG_HK_VP8, HVD_REG_HK_PLAYER_FM);
1846
1847 // ES buffer
1848 u32StAddr = pCtrl->MemMap.u32BitstreamBufAddr;
1849
1850 if (u32StAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
1851 {
1852 u32StAddr -= pCtrl->MemMap.u32MIU1BaseAddr;
1853 }
1854
1855 _HVD_Write2Byte(HVD_REG_ESB_ST_ADR_L_BS34, HVD_LWORD(u32StAddr >> 3));
1856 _HVD_Write2Byte(HVD_REG_ESB_ST_ADR_H_BS34, HVD_HWORD(u32StAddr >> 3));
1857
1858 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L_BS34, HVD_LWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1859 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H_BS34, HVD_HWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1860
1861 u16Reg = _HVD_Read2Byte(HVD_REG_MIF_BS34);
1862 u16Reg &= ~HVD_REG_BS34_TSP_INPUT;
1863 u16Reg &= ~HVD_REG_BS34_PASER_MASK;
1864 u16Reg |= HVD_REG_BS34_PASER_DISABLE;
1865 u16Reg |= HVD_REG_BS34_AUTO_NAL_TAB;
1866 _HVD_Write2Byte(HVD_REG_MIF_BS34, u16Reg);
1867
1868 return;
1869 }
1870
1871 // ES buffer
1872 u32StAddr = pCtrl->MemMap.u32BitstreamBufAddr;
1873
1874 if (u32StAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
1875 {
1876 u32StAddr -= pCtrl->MemMap.u32MIU1BaseAddr;
1877 }
1878
1879 HVD_EX_MSG_DBG("ESB start addr=%lx, len=%lx\n", u32StAddr, pCtrl->MemMap.u32BitstreamBufSize);
1880
1881 if (0 == HAL_VPU_EX_GetTaskId(u32Id))
1882 {
1883 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L(u32RB), HVD_LWORD(u32StAddr >> 3));
1884 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H(u32RB), HVD_HWORD(u32StAddr >> 3));
1885
1886 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L(u32RB), HVD_LWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1887 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H(u32RB), HVD_HWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1888 }
1889 else
1890 {
1891 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L_BS2(u32RB), HVD_LWORD(u32StAddr >> 3));
1892 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H_BS2(u32RB), HVD_HWORD(u32StAddr >> 3));
1893
1894 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_L_BS2(u32RB), HVD_LWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1895 _HVD_Write2Byte(HVD_REG_ESB_LENGTH_H_BS2(u32RB), HVD_HWORD(pCtrl->MemMap.u32BitstreamBufSize >> 3));
1896 }
1897 }
1898 #endif
1899
_HVD_EX_GetESLevel(MS_U32 u32Id)1900 static MS_U32 _HVD_EX_GetESLevel(MS_U32 u32Id)
1901 {
1902 MS_U32 u32Wptr = 0;
1903 MS_U32 u32Rptr = 0;
1904 MS_U32 u32CurMBX = 0;
1905 MS_U32 u32ESsize = 0;
1906 MS_U32 u32Ret = E_HVD_ESB_LEVEL_NORMAL;
1907 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1908
1909 u32Wptr = _HVD_EX_GetESWritePtr(u32Id);
1910 u32Rptr = _HVD_EX_GetESReadPtr(u32Id, FALSE);
1911 u32ESsize = pCtrl->MemMap.u32BitstreamBufSize;
1912
1913 if (u32Rptr >= u32Wptr)
1914 {
1915 u32CurMBX = u32Rptr - u32Wptr;
1916 }
1917 else
1918 {
1919 u32CurMBX = u32ESsize - (u32Wptr - u32Rptr);
1920 }
1921
1922 if (u32CurMBX == 0)
1923 {
1924 u32Ret = E_HVD_ESB_LEVEL_UNDER;
1925 }
1926 else if (u32CurMBX < HVD_FW_AVC_ES_OVER_THRESHOLD)
1927 {
1928 u32Ret = E_HVD_ESB_LEVEL_OVER;
1929 }
1930 else
1931 {
1932 u32CurMBX = u32ESsize - u32CurMBX;
1933 if (u32CurMBX < HVD_FW_AVC_ES_UNDER_THRESHOLD)
1934 {
1935 u32Ret = E_HVD_ESB_LEVEL_UNDER;
1936 }
1937 }
1938
1939 return u32Ret;
1940 }
1941
_HVD_EX_GetESQuantity(MS_U32 u32Id)1942 static MS_U32 _HVD_EX_GetESQuantity(MS_U32 u32Id)
1943 {
1944 MS_U32 u32Wptr = 0;
1945 MS_U32 u32Rptr = 0;
1946 MS_U32 u32ESsize = 0;
1947 MS_U32 u32Ret = 0;
1948 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
1949
1950 u32Wptr = _HVD_EX_GetESWritePtr(u32Id);
1951 u32Rptr = _HVD_EX_GetESReadPtr(u32Id, FALSE);
1952 u32ESsize = pCtrl->MemMap.u32BitstreamBufSize;
1953
1954
1955 if(u32Wptr >= u32Rptr)
1956 {
1957 u32Ret = u32Wptr - u32Rptr;
1958 }
1959 else
1960 {
1961 u32Ret = u32ESsize - u32Rptr + u32Wptr;
1962 }
1963 //printf("ES Quantity <0x%lx> W:0x%lx, R:0x%lx, Q:0x%lx.\n",u32Id,u32Wptr,u32Rptr,u32Ret);
1964 return u32Ret;
1965 }
1966
1967 #if (HVD_ENABLE_IQMEM)
HAL_HVD_EX_IQMem_Init(MS_U32 u32Id)1968 MS_BOOL HAL_HVD_EX_IQMem_Init(MS_U32 u32Id)
1969 {
1970
1971 MS_U32 u32Timeout = 20000;
1972
1973 if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_IQMEM_CTRL) == E_HVD_IQMEM_INIT_NONE)
1974 {
1975
1976 HAL_VPU_EX_IQMemSetDAMode(TRUE);
1977
1978 HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FW_IQMEM_CTRL, E_HVD_IQMEM_INIT_LOADING);
1979
1980
1981 while (u32Timeout)
1982 {
1983
1984 if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_IQMEM_CTRL) == E_HVD_IQMEM_INIT_LOADED)
1985 {
1986 break;
1987 }
1988 u32Timeout--;
1989 HVD_Delay_ms(1);
1990 }
1991
1992 HAL_VPU_EX_IQMemSetDAMode(FALSE);
1993
1994 HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FW_IQMEM_CTRL, E_HVD_IQMEM_INIT_FINISH);
1995
1996 if (u32Timeout==0)
1997 {
1998 HVD_EX_MSG_ERR("Wait E_HVD_IQMEM_INIT_LOADED timeout !!\n");
1999 return FALSE;
2000 }
2001
2002
2003 }
2004 return TRUE;
2005 }
2006
2007 #endif
2008
2009 #ifdef VDEC3
_HVD_EX_SetRegCPU(MS_U32 u32Id,MS_BOOL bFWdecideFB)2010 static MS_BOOL _HVD_EX_SetRegCPU(MS_U32 u32Id, MS_BOOL bFWdecideFB)
2011 #else
2012 static MS_BOOL _HVD_EX_SetRegCPU(MS_U32 u32Id)
2013 #endif
2014 {
2015 MS_U32 u32FirmVer = 0;
2016 MS_U32 u32Timeout = 20000;
2017 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
2018
2019 HVD_EX_MSG_DBG("HVD HW ver id: 0x%04x\n", HAL_HVD_EX_GetHWVersionID());
2020
2021 #if HVD_ENABLE_TIME_MEASURE
2022 HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase, __FUNCTION__, __LINE__);
2023 #endif
2024
2025 HAL_VPU_EX_SetFWReload(!pCtrl->bTurboFWMode);
2026
2027 VPU_EX_FWCodeCfg fwCfg;
2028 VPU_EX_TaskInfo taskInfo;
2029 VPU_EX_VLCTblCfg vlcCfg;
2030 #ifdef VDEC3
2031 VPU_EX_FBCfg fbCfg;
2032 #endif
2033 VPU_EX_NDecInitPara nDecInitPara;
2034
2035 memset(&fwCfg, 0, sizeof(VPU_EX_FWCodeCfg));
2036 memset(&taskInfo, 0, sizeof(VPU_EX_TaskInfo));
2037 memset(&vlcCfg, 0, sizeof(VPU_EX_VLCTblCfg));
2038 memset(&nDecInitPara, 0, sizeof(VPU_EX_NDecInitPara));
2039 #ifdef VDEC3_FB
2040 nDecInitPara.pVLCCfg = NULL;
2041 #else
2042 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_RM) //rm
2043 {
2044 vlcCfg.u32DstAddr = MsOS_PA2KSEG1(pCtrl->MemMap.u32FrameBufAddr + pHVDHalContext->u32RV_VLCTableAddr);
2045 vlcCfg.u32BinAddr = pCtrl->MemMap.u32VLCBinaryVAddr;
2046 vlcCfg.u32BinSize = pCtrl->MemMap.u32VLCBinarySize;
2047 vlcCfg.u32FrameBufAddr = pCtrl->MemMap.u32FrameBufVAddr;
2048 vlcCfg.u32VLCTableOffset = pHVDHalContext->u32RV_VLCTableAddr;
2049 nDecInitPara.pVLCCfg = &vlcCfg;
2050 }
2051 #endif
2052 nDecInitPara.pFWCodeCfg = &fwCfg;
2053 nDecInitPara.pTaskInfo = &taskInfo;
2054 #ifdef VDEC3
2055 fbCfg.u32FrameBufAddr = pCtrl->MemMap.u32FrameBufAddr;
2056 fbCfg.u32FrameBufSize = pCtrl->MemMap.u32FrameBufSize;
2057
2058 if (fbCfg.u32FrameBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
2059 {
2060 fbCfg.u32FrameBufAddr -= pCtrl->MemMap.u32MIU1BaseAddr;
2061 }
2062
2063 nDecInitPara.pFBCfg = &fbCfg;
2064 #endif
2065
2066 fwCfg.u8SrcType = pCtrl->MemMap.eFWSourceType;
2067 fwCfg.u32DstAddr = pCtrl->MemMap.u32CodeBufVAddr;
2068 fwCfg.u32DstSize = pCtrl->MemMap.u32CodeBufSize;
2069 fwCfg.u32BinAddr = pCtrl->MemMap.u32FWBinaryVAddr;
2070 fwCfg.u32BinSize = pCtrl->MemMap.u32FWBinarySize;
2071
2072 taskInfo.u32Id = u32Id;
2073
2074 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_MVC)
2075 {
2076 taskInfo.eDecType = E_VPU_EX_DECODER_HVD; //E_VPU_EX_DECODER_MVC;
2077 }
2078 #ifdef VDEC3
2079 else if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_HEVC)
2080 {
2081 taskInfo.eDecType = E_VPU_EX_DECODER_EVD;
2082 }
2083 #if SUPPORT_MSVP9
2084 else if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP9)
2085 {
2086 taskInfo.eDecType = E_VPU_EX_DECODER_EVD;
2087 }
2088 #endif
2089 #if SUPPORT_G2VP9
2090 else if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP9)
2091 {
2092 taskInfo.eDecType = E_VPU_EX_DECODER_G2VP9;
2093 }
2094 #endif
2095 #endif
2096 else
2097 {
2098 taskInfo.eDecType = E_VPU_EX_DECODER_HVD;
2099 }
2100
2101 taskInfo.eVpuId = (HAL_VPU_StreamId) (0xFF & u32Id);
2102
2103 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV)
2104 {
2105 taskInfo.eSrcType = E_VPU_EX_INPUT_FILE;
2106 }
2107 else
2108 {
2109 taskInfo.eSrcType = E_VPU_EX_INPUT_TSP;
2110 }
2111 taskInfo.u32HeapSize = HVD_DRAM_SIZE;
2112
2113 #ifdef SUPPORT_EVD
2114 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_HEVC ||
2115 (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP9 )
2116 taskInfo.u32HeapSize = EVD_DRAM_SIZE;
2117 #endif
2118
2119 if(TRUE == HVD_EX_GetRstFlag())
2120 {
2121 //Delete task for Rst
2122 if(!HAL_VPU_EX_TaskDelete(u32Id, &nDecInitPara))
2123 {
2124 HVD_EX_MSG_ERR("HAL_VPU_EX_TaskDelete fail\n");
2125 }
2126 HVD_EX_SetRstFlag(FALSE);
2127 }
2128
2129 #if (HVD_ENABLE_IQMEM)
2130 HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FW_IQMEM_ENABLE_IF_SUPPORT, (MS_U32)1);
2131 #endif
2132
2133 #ifdef VDEC3
2134 if (!HAL_VPU_EX_TaskCreate(u32Id, &nDecInitPara, bFWdecideFB, pCtrl->u32BBUId))
2135 #else
2136 if (!HAL_VPU_EX_TaskCreate(u32Id, &nDecInitPara))
2137 #endif
2138 {
2139 HVD_EX_MSG_ERR("Task create fail!\n");
2140
2141 return FALSE;
2142 }
2143
2144 while (u32Timeout)
2145 {
2146 u32FirmVer = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_INIT_DONE);
2147
2148 if (u32FirmVer != 0)
2149 {
2150 u32FirmVer = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_VERSION_ID);
2151 break;
2152 }
2153 u32Timeout--;
2154 HVD_Delay_ms(1);
2155 }
2156
2157 #ifdef VDEC3_FB
2158 #if HVD_ENABLE_RV_FEATURE
2159 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2160
2161 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_RM) //rm
2162 {
2163 if(pShm->u32RM_VLCTableAddr == 0) {
2164 HVD_EX_MSG_ERR("[VDEC3_FB] Error!!!RM_VLCTableAddr is not ready\n");
2165 }
2166 else
2167 {
2168 vlcCfg.u32DstAddr = MsOS_PA2KSEG1(MsOS_VA2PA(nDecInitPara.pFWCodeCfg->u32DstAddr + pShm->u32RM_VLCTableAddr));
2169 vlcCfg.u32BinAddr = pCtrl->MemMap.u32VLCBinaryVAddr;
2170 vlcCfg.u32BinSize = pCtrl->MemMap.u32VLCBinarySize;
2171 vlcCfg.u32FrameBufAddr = pCtrl->MemMap.u32FrameBufVAddr; //this is frame buffer address is decided by player. In VDEC3_FB path, this variable could be zero or the start address of overall Frame buffer.
2172 vlcCfg.u32VLCTableOffset = pShm->u32RM_VLCTableAddr; // offset from FW code start address
2173 nDecInitPara.pVLCCfg = &vlcCfg;
2174 }
2175 }
2176
2177 if (nDecInitPara.pVLCCfg)
2178 {
2179 HVD_EX_MSG_DBG("[VDEC3_FB] Ready to load VLC Table DstAddr=0x%x FrameBufAddr=0x%x VLCTableOffset=0x%x\n", (unsigned int)vlcCfg.u32DstAddr, (unsigned int)vlcCfg.u32FrameBufAddr, (unsigned int)vlcCfg.u32VLCTableOffset);
2180 if (!HAL_VPU_EX_LoadVLCTable(nDecInitPara.pVLCCfg, nDecInitPara.pFWCodeCfg->u8SrcType))
2181 {
2182 HVD_EX_MSG_ERR("[VDEC3_FB] Error!!!Load VLC Table fail!\n");
2183 return FALSE;
2184 }
2185 }
2186 #endif
2187 #endif
2188 if (u32Timeout > 0)
2189 {
2190 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
2191
2192 pHVDHalContext->_stHVDStream[u8Idx].bUsed = TRUE;
2193
2194 #ifdef VDEC3
2195 switch (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)
2196 {
2197 case E_HVD_INIT_HW_AVC:
2198 pHVDHalContext->_stHVDStream[u8Idx].u32CodecType = E_HAL_HVD_AVC;
2199 break;
2200 case E_HVD_INIT_HW_AVS:
2201 pHVDHalContext->_stHVDStream[u8Idx].u32CodecType = E_HAL_HVD_AVS;
2202 break;
2203 case E_HVD_INIT_HW_RM:
2204 pHVDHalContext->_stHVDStream[u8Idx].u32CodecType = E_HAL_HVD_RM;
2205 break;
2206 case E_HVD_INIT_HW_MVC:
2207 pHVDHalContext->_stHVDStream[u8Idx].u32CodecType = E_HAL_HVD_MVC;
2208 break;
2209 case E_HVD_INIT_HW_VP8:
2210 pHVDHalContext->_stHVDStream[u8Idx].u32CodecType = E_HAL_HVD_VP8;
2211 break;
2212 case E_HVD_INIT_HW_MJPEG:
2213 pHVDHalContext->_stHVDStream[u8Idx].u32CodecType = E_HAL_HVD_MJPEG;
2214 break;
2215 case E_HVD_INIT_HW_VP6:
2216 pHVDHalContext->_stHVDStream[u8Idx].u32CodecType = E_HAL_HVD_VP6;
2217 break;
2218 case E_HVD_INIT_HW_HEVC:
2219 pHVDHalContext->_stHVDStream[u8Idx].u32CodecType = E_HAL_HVD_HEVC;
2220 break;
2221 case E_HVD_INIT_HW_VP9:
2222 pHVDHalContext->_stHVDStream[u8Idx].u32CodecType = E_HAL_HVD_VP9;
2223 break;
2224 default:
2225 pHVDHalContext->_stHVDStream[u8Idx].u32CodecType = E_HAL_HVD_NONE;
2226 break;
2227 }
2228 #endif
2229
2230 HVD_EX_MSG_INF("FW version binary=0x%x, if=0x%x\n", u32FirmVer, (MS_U32) HVD_FW_VERSION);
2231 }
2232 else
2233 {
2234 HVD_EX_MSG_ERR("Cannot get FW version !!0x%x 0x%lx \n", (MS_S16) _HVD_Read2Byte(HVD_REG_RESET),
2235 (unsigned long)HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_VERSION_ID));
2236
2237 if (TRUE != HAL_VPU_EX_TaskDelete(u32Id, &nDecInitPara))
2238 {
2239 HVD_EX_MSG_ERR("Task delete fail!\n");
2240 }
2241
2242 return FALSE;
2243 }
2244
2245
2246
2247 #if (HVD_ENABLE_IQMEM)
2248
2249 if( HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_IS_IQMEM_SUPPORT))
2250 {
2251
2252 HAL_HVD_EX_IQMem_Init(u32Id);
2253 }
2254 else{
2255 HVD_EX_MSG_DBG("not support IQMEM\n");
2256 }
2257 #endif
2258
2259
2260
2261
2262
2263
2264 #if HVD_ENABLE_TIME_MEASURE
2265 HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase, __FUNCTION__, __LINE__);
2266 #endif
2267
2268 return TRUE;
2269 }
2270
_HVD_EX_GetPTSTableRptr(MS_U32 u32Id)2271 static MS_VIRT _HVD_EX_GetPTSTableRptr(MS_U32 u32Id)
2272 {
2273 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
2274 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2275 if (pShm->u32PTStableRptrAddr & VPU_QMEM_BASE)
2276 {
2277 return HAL_VPU_EX_MemRead(pShm->u32PTStableRptrAddr);
2278 }
2279 else
2280 {
2281 return *((MS_VIRT *) MsOS_PA2KSEG1((MS_PHY) pShm->u32PTStableRptrAddr + pCtrl->MemMap.u32CodeBufAddr));
2282 }
2283 }
2284
_HVD_EX_GetPTSTableWptr(MS_U32 u32Id)2285 static MS_VIRT _HVD_EX_GetPTSTableWptr(MS_U32 u32Id)
2286 {
2287 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
2288 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2289
2290 if (pShm->u32PTStableWptrAddr & VPU_QMEM_BASE)
2291 {
2292 return HAL_VPU_EX_MemRead(pShm->u32PTStableWptrAddr);
2293 }
2294 else
2295 {
2296 return *((MS_VIRT *) MsOS_PA2KSEG1((MS_PHY)pShm->u32PTStableWptrAddr + pCtrl->MemMap.u32CodeBufAddr));
2297 }
2298 }
2299
_HVD_EX_SetPTSTableWptr(MS_U32 u32Id,MS_U32 u32Value)2300 static void _HVD_EX_SetPTSTableWptr(MS_U32 u32Id, MS_U32 u32Value)
2301 {
2302 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
2303 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2304
2305 if (pShm->u32PTStableWptrAddr & VPU_QMEM_BASE)
2306 {
2307 if (!HAL_VPU_EX_MemWrite(pShm->u32PTStableWptrAddr, u32Value))
2308 {
2309 HVD_EX_MSG_ERR("PTS table SRAM write failed\n");
2310 }
2311 }
2312 else
2313 {
2314 *((MS_VIRT *) MsOS_PA2KSEG1((MS_PHY)pShm->u32PTStableWptrAddr + pCtrl->MemMap.u32CodeBufAddr)) = u32Value;
2315 }
2316 }
2317
_HVD_EX_UpdatePTSTable(MS_U32 u32Id,HVD_BBU_Info * pInfo)2318 static HVD_Return _HVD_EX_UpdatePTSTable(MS_U32 u32Id, HVD_BBU_Info *pInfo)
2319 {
2320 MS_VIRT u32PTSWptr = HVD_U32_MAX;
2321 MS_VIRT u32PTSRptr = HVD_U32_MAX;
2322 MS_VIRT u32DestAddr = 0;
2323 HVD_PTS_Entry PTSEntry;
2324 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
2325 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
2326 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2327
2328 // update R & W ptr
2329 u32PTSRptr = _HVD_EX_GetPTSTableRptr(u32Id);
2330
2331 HVD_EX_MSG_DBG("PTS table rptr:0x%lx, wptr=0x%lx\n", (unsigned long)u32PTSRptr, (unsigned long)_HVD_EX_GetPTSTableWptr(u32Id));
2332
2333 if (u32PTSRptr >= MAX_PTS_TABLE_SIZE)
2334 {
2335 HVD_EX_MSG_ERR("PTS table Read Ptr(%lx) > max table size(%x) \n", (unsigned long)u32PTSRptr,
2336 (MS_U32) MAX_PTS_TABLE_SIZE);
2337 return E_HVD_RETURN_FAIL;
2338 }
2339
2340 // check queue is full or not
2341 u32PTSWptr = pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr + 1;
2342 u32PTSWptr %= MAX_PTS_TABLE_SIZE;
2343
2344 if (u32PTSWptr == u32PTSRptr)
2345 {
2346 HVD_EX_MSG_ERR("PTS table full. Read Ptr(%lx) == new Write ptr(%lx) ,Pre Wptr(%lx) \n", (unsigned long)u32PTSRptr,
2347 (unsigned long)u32PTSWptr, (unsigned long)pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr);
2348 return E_HVD_RETURN_FAIL;
2349 }
2350
2351 // add one PTS entry
2352 PTSEntry.u32ByteCnt = pHVDHalContext->_stHVDStream[u8Idx].u32PTSByteCnt & HVD_BYTE_COUNT_MASK;
2353 PTSEntry.u32ID_L = pInfo->u32ID_L;
2354 PTSEntry.u32ID_H = pInfo->u32ID_H;
2355 PTSEntry.u32PTS = pInfo->u32TimeStamp;
2356
2357 u32DestAddr = MsOS_PA2KSEG1(pCtrl->MemMap.u32CodeBufAddr + (MS_PHY)pShm->u32HVD_PTS_TABLE_ST_OFFSET + (pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr * sizeof(HVD_PTS_Entry)));
2358
2359 HVD_EX_MSG_DBG("PTS entry dst addr=0x%lx\n", (unsigned long)MsOS_VA2PA(u32DestAddr));
2360
2361 HVD_memcpy((void *) u32DestAddr, &PTSEntry, sizeof(HVD_PTS_Entry));
2362
2363 HAL_HVD_EX_FlushMemory();
2364
2365 // update Write ptr
2366 _HVD_EX_SetPTSTableWptr(u32Id, u32PTSWptr);
2367
2368 pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr = u32PTSWptr;
2369
2370 return E_HVD_RETURN_SUCCESS;
2371 }
2372
_HVD_EX_UpdateESWptr(MS_U32 u32Id,MS_U32 u32NalOffset,MS_U32 u32NalLen)2373 static HVD_Return _HVD_EX_UpdateESWptr(MS_U32 u32Id, MS_U32 u32NalOffset, MS_U32 u32NalLen)
2374 {
2375 //---------------------------------------------------
2376 // item format in nal table:
2377 // reserved |borken| u32NalOffset | u32NalLen
2378 // 13 bits |1bit | 29 bits | 21 bits (total 8 bytes)
2379 //---------------------------------------------------
2380 MS_VIRT u32Adr = 0;
2381 MS_U32 u32BBUNewWptr = 0;
2382 MS_U8 item[8];
2383 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
2384 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
2385 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2386 MS_PHY u32BBU_DRAM_ST_ADDR = pShm->u32HVD_BBU_DRAM_ST_ADDR;
2387
2388 #if HVD_ENABLE_MVC
2389 if(HAL_HVD_EX_CheckMVCID(u32Id))
2390 {
2391 // 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
2392 u32BBU_DRAM_ST_ADDR = pShm->u32HVD_BBU_DRAM_ST_ADDR; //pShm->u32MVC_BBU_DRAM_ST_ADDR;
2393 if(E_VDEC_EX_SUB_VIEW == HAL_HVD_EX_GetView(u32Id))
2394 {
2395 u32BBU_DRAM_ST_ADDR = pShm->u32HVD_BBU2_DRAM_ST_ADDR; //pShm->u32MVC_BBU2_DRAM_ST_ADDR;
2396 }
2397 }
2398 #endif /// HVD_ENABLE_MVC
2399
2400 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
2401 {
2402 u32BBUNewWptr = pHVDHalContext->u32VP8BBUWptr;
2403 }
2404 else
2405 {
2406 u32BBUNewWptr = pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr;
2407 }
2408 u32BBUNewWptr++;
2409 u32BBUNewWptr %= pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum;
2410
2411 // prepare nal entry
2412
2413 if (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
2414 {
2415 // NAL len 22 bits , HEVC level5 constrain
2416 item[0] = u32NalLen & 0xff;
2417 item[1] = (u32NalLen >> 8) & 0xff;
2418 item[2] = ((u32NalLen >> 16) & 0x3f) | ((u32NalOffset << 6) & 0xc0);
2419 item[3] = (u32NalOffset >> 2) & 0xff;
2420 item[4] = (u32NalOffset >> 10) & 0xff;
2421 item[5] = (u32NalOffset >> 18) & 0xff;
2422 item[6] = (u32NalOffset >> 26) & 0x0f; //including broken bit
2423 item[7] = 0;
2424 }
2425 else
2426 {
2427 item[0] = u32NalLen & 0xff;
2428 item[1] = (u32NalLen >> 8) & 0xff;
2429 item[2] = ((u32NalLen >> 16) & 0x1f) | ((u32NalOffset << 5) & 0xe0);
2430 item[3] = (u32NalOffset >> 3) & 0xff;
2431 item[4] = (u32NalOffset >> 11) & 0xff;
2432 item[5] = (u32NalOffset >> 19) & 0xff;
2433 item[6] = (u32NalOffset >> 27) & 0x07; //including broken bit
2434 item[7] = 0;
2435 }
2436
2437 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
2438 {
2439 u32Adr = MsOS_PA2KSEG1(pCtrl->MemMap.u32CodeBufAddr + u32BBU_DRAM_ST_ADDR + (pHVDHalContext->u32VP8BBUWptr << 3));
2440 }
2441 else
2442 {
2443 // add nal entry
2444 u32Adr = MsOS_PA2KSEG1(pCtrl->MemMap.u32CodeBufAddr + u32BBU_DRAM_ST_ADDR + (pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr << 3));
2445 }
2446
2447 HVD_memcpy((void *) u32Adr, (void *) item, 8);
2448
2449 HAL_HVD_EX_FlushMemory();
2450
2451 HVD_EX_MSG_DBG("addr=0x%lx, bbu wptr=0x%x\n", (unsigned long)MsOS_VA2PA(u32Adr), pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr);
2452
2453 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
2454 {
2455 pHVDHalContext->u32VP8BBUWptr = u32BBUNewWptr;
2456 }
2457 else
2458 {
2459 pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr = u32BBUNewWptr;
2460 }
2461
2462 return E_HVD_RETURN_SUCCESS;
2463 }
2464
_HVD_EX_UpdateESWptr_VP8(MS_U32 u32Id,MS_U32 u32NalOffset,MS_U32 u32NalLen,MS_U32 u32NalOffset2,MS_U32 u32NalLen2)2465 static HVD_Return _HVD_EX_UpdateESWptr_VP8(MS_U32 u32Id, MS_U32 u32NalOffset, MS_U32 u32NalLen, MS_U32 u32NalOffset2, MS_U32 u32NalLen2)
2466 {
2467 MS_U8 item[8];
2468 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
2469 MS_VIRT u32Adr = 0;
2470 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
2471 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2472 MS_PHY u32VP8_BBU_DRAM_ST_ADDR_BS4 = pShm->u32HVD_BBU2_DRAM_ST_ADDR;
2473
2474 /*
2475 printf("nal2 offset=0x%x, len=0x%x\n",
2476 u32NalOffset2, u32NalLen2);
2477 */
2478
2479 item[0] = u32NalLen2 & 0xff;
2480 item[1] = (u32NalLen2 >> 8) & 0xff;
2481 item[2] = ((u32NalLen2 >> 16) & 0x1f) | ((u32NalOffset2 << 5) & 0xe0);
2482 item[3] = (u32NalOffset2 >> 3) & 0xff;
2483 item[4] = (u32NalOffset2 >> 11) & 0xff;
2484 item[5] = (u32NalOffset2 >> 19) & 0xff;
2485 item[6] = (u32NalOffset2 >> 27) & 0x07;
2486 item[7] = 0;
2487
2488 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
2489 {
2490 u32Adr = MsOS_PA2KSEG1(pCtrl->MemMap.u32CodeBufAddr + u32VP8_BBU_DRAM_ST_ADDR_BS4 + (pHVDHalContext->u32VP8BBUWptr << 3));
2491 }
2492 else
2493 {
2494 u32Adr = MsOS_PA2KSEG1(pCtrl->MemMap.u32CodeBufAddr + u32VP8_BBU_DRAM_ST_ADDR_BS4 + (pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr << 3));
2495 }
2496
2497 HVD_memcpy((void *) u32Adr, (void *) item, 8);
2498
2499 HAL_HVD_EX_FlushMemory();
2500
2501 return _HVD_EX_UpdateESWptr(u32Id, u32NalOffset, u32NalLen);
2502 }
2503
_HVD_EX_GetVUIDispInfo(MS_U32 u32Id)2504 static MS_VIRT _HVD_EX_GetVUIDispInfo(MS_U32 u32Id)
2505 {
2506 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
2507 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2508
2509 if( ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_AVC) ||
2510 ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_MVC) ||
2511 ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_HEVC) )
2512 {
2513 MS_U16 i;
2514 MS_PHY u32VUIAddr;
2515 MS_U32 *pData = (MS_U32 *) &(pHVDHalContext->g_hvd_VUIINFO);
2516
2517 HAL_HVD_EX_ReadMemory();
2518 u32VUIAddr = pShm->u32AVC_VUIDispInfo_Addr;
2519
2520 for (i = 0; i < sizeof(HVD_AVC_VUI_DISP_INFO); i += 4)
2521 {
2522 if (pShm->u32AVC_VUIDispInfo_Addr & VPU_QMEM_BASE)
2523 {
2524 *pData = HAL_VPU_EX_MemRead(u32VUIAddr + i);
2525 }
2526 else
2527 {
2528 *pData = *((MS_VIRT *) MsOS_PA2KSEG1(u32VUIAddr + i + pCtrl->MemMap.u32CodeBufAddr));
2529 }
2530 pData++;
2531 }
2532 }
2533 else
2534 {
2535 memset(&(pHVDHalContext->g_hvd_VUIINFO), 0, sizeof(HVD_AVC_VUI_DISP_INFO));
2536 }
2537
2538 return (MS_VIRT) &(pHVDHalContext->g_hvd_VUIINFO);
2539 }
2540
_HVD_EX_GetBBUQNumb(MS_U32 u32Id)2541 static MS_U32 _HVD_EX_GetBBUQNumb(MS_U32 u32Id)
2542 {
2543 MS_U32 u32ReadPtr = 0;
2544 MS_U32 eRet = 0;
2545 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
2546 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
2547
2548 u32ReadPtr = _HVD_EX_GetBBUReadptr(u32Id);
2549 MS_U32 u32WritePtr = 0;
2550
2551 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
2552 {
2553 u32WritePtr = pHVDHalContext->u32VP8BBUWptr;
2554 }
2555 else
2556 {
2557 u32WritePtr = pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr;
2558 }
2559
2560 HVD_EX_MSG_DBG("idx=%x, bbu rptr=%x, bbu wptr=%x\n", u8Idx, u32ReadPtr, u32WritePtr);
2561
2562 if (u32WritePtr >= u32ReadPtr)
2563 {
2564 eRet = u32WritePtr - u32ReadPtr;
2565 }
2566 else
2567 {
2568 eRet = pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum - (u32ReadPtr - u32WritePtr);
2569 }
2570
2571 #if 0
2572 if (pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr >= u32ReadPtr)
2573 {
2574 eRet = pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr - u32ReadPtr;
2575 }
2576 else
2577 {
2578 eRet = pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum - (u32ReadPtr - pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr);
2579 }
2580
2581 #endif
2582 return eRet;
2583 }
2584
_HVD_EX_GetPTSQNumb(MS_U32 u32Id)2585 static MS_U32 _HVD_EX_GetPTSQNumb(MS_U32 u32Id)
2586 {
2587 MS_U32 u32ReadPtr = 0;
2588 MS_U32 eRet = 0;
2589 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
2590
2591 u32ReadPtr = _HVD_EX_GetPTSTableRptr(u32Id);
2592
2593 if (u32ReadPtr >= MAX_PTS_TABLE_SIZE)
2594 {
2595 HVD_EX_MSG_ERR("PTS table Read Ptr(%x) > max table size(%x) \n", u32ReadPtr,
2596 (MS_U32) MAX_PTS_TABLE_SIZE);
2597 return 0;
2598 }
2599
2600 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
2601
2602 if (pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr >= u32ReadPtr)
2603 {
2604 eRet = pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr - u32ReadPtr;
2605 }
2606 else
2607 {
2608 eRet = MAX_PTS_TABLE_SIZE - (u32ReadPtr - pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr);
2609 }
2610
2611 return eRet;
2612 }
2613
_HVD_EX_IsHevcInterlaceField(MS_U32 u32Id)2614 static MS_BOOL _HVD_EX_IsHevcInterlaceField(MS_U32 u32Id)
2615 {
2616 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2617
2618 return pShm->u32CodecType == E_HVD_Codec_HEVC && pShm->DispInfo.u8Interlace == 1;
2619 }
2620
_HVD_EX_GetNextDispFrame(MS_U32 u32Id)2621 static HVD_Frm_Information *_HVD_EX_GetNextDispFrame(MS_U32 u32Id)
2622 {
2623 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2624 MS_U16 u16QNum = pShm->u16DispQNumb;
2625 MS_U16 u16QPtr = pShm->u16DispQPtr;
2626 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
2627
2628 #if (HVD_ENABLE_MVC)
2629 MS_BOOL bMVC = HAL_HVD_EX_CheckMVCID(u32Id);
2630
2631 if(bMVC)
2632 {
2633 if (pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide)
2634 {
2635 MS_U16 u16RealQPtr = pHVDHalContext->_stHVDStream[u8Idx].u32DispQIndex;
2636 MS_U16 u16UsedFrm = 0;
2637
2638 if (u16RealQPtr != u16QPtr)
2639 {
2640 if (u16RealQPtr > u16QPtr)
2641 {
2642 u16UsedFrm = u16RealQPtr - u16QPtr;
2643 }
2644 else
2645 {
2646 u16UsedFrm = pShm->u16DispQSize - (u16QPtr - u16RealQPtr);
2647 }
2648 }
2649
2650 if (u16QNum > u16UsedFrm)
2651 {
2652 volatile HVD_Frm_Information *pHvdFrm;
2653
2654 u16QNum -= u16UsedFrm;
2655 u16QPtr = u16RealQPtr;
2656 pHvdFrm = (volatile HVD_Frm_Information*)&pShm->DispQueue[u16QPtr];
2657
2658 if ((u16QPtr%2) == 0) //For MVC mode, we must check the pair of display entry is ready or not
2659 {
2660 volatile HVD_Frm_Information *pHvdFrmNext = (volatile HVD_Frm_Information*)&pShm->DispQueue[u16QPtr+1];
2661
2662 if (pHvdFrmNext->u32Status != E_HVD_DISPQ_STATUS_INIT)
2663 {
2664 return NULL;
2665 }
2666 }
2667
2668 if (pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT) // Must Be
2669 {
2670 pHVDHalContext->_u16DispOutSideQPtr[u8Idx] = u16QPtr;
2671 pHvdFrm->u32Status = E_HVD_DISPQ_STATUS_VIEW;
2672
2673 if ((u16QPtr%2) == 0)
2674 {
2675 //ALOGE("G1: %x", pHvdFrm->u32PrivateData);
2676 pHVDHalContext->_stHVDStream[u8Idx].u32PrivateData = pHvdFrm->u32PrivateData;
2677 }
2678 else
2679 {
2680 //ALOGE("G2: %x", (pHvdFrm->u32PrivateData << 16) | pHVDHalContext->_stHVDStream[u8Idx].u32PrivateData);
2681 //pShm->UpdateQueue[pShm->u16UpdateQWtPtr] = (pHvdFrm->u32PrivateData << 16) | pHVDHalContext->_stHVDStream[u8Idx].u32PrivateData;
2682 //pShm->u16UpdateQWtPtr = (pShm->u16UpdateQWtPtr + 1) % HVD_DISP_QUEUE_MAX_SIZE;
2683 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_UPDATE_DISPQ, (pHvdFrm->u32PrivateData << 16) | pHVDHalContext->_stHVDStream[u8Idx].u32PrivateData);
2684 }
2685
2686 u16QPtr++;
2687 if (u16QPtr == pShm->u16DispQSize) u16QPtr = 0;
2688 pHVDHalContext->_stHVDStream[u8Idx].u32DispQIndex = u16QPtr;
2689
2690 return (HVD_Frm_Information*)(MS_VIRT)pHvdFrm;
2691 }
2692 }
2693
2694 return NULL;
2695 }
2696
2697 //printf("OQ:%d,DQ:%d.\n",pShm->u16DispQNumb,pShm->u16DecQNumb);
2698 //search the next frame to display
2699 while (u16QNum > 0)
2700 {
2701 //printf("Pr:%d,%d.[%ld,%ld,%ld,%ld].\n",u16QPtr,u16QNum,pShm->DispQueue[u16QPtr].u32Status,pShm->DispQueue[u16QPtr+1].u32Status,
2702 // pShm->DispQueue[u16QPtr+2].u32Status,pShm->DispQueue[u16QPtr+3].u32Status);
2703 pHVDHalContext->pHvdFrm = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr];
2704
2705 //printf("Q2: %ld\n", pHVDShareMem->DispQueue[u16QPtr].u32Status);
2706 if (pHVDHalContext->pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
2707 {
2708 /// For MVC. Output views after the pair of (base and depend) views were decoded.
2709 /// Check the depned view was initial when Output the base view.
2710 if((u16QPtr%2) == 0)
2711 {
2712 volatile HVD_Frm_Information *pHvdFrm_sub = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr+1];
2713 //if(pHvdFrm_sub->u32Status != E_HVD_DISPQ_STATUS_INIT)
2714 if(pHvdFrm_sub->u32Status == E_HVD_DISPQ_STATUS_NONE)
2715 {
2716 ///printf("[MVC] %d is not E_HVD_DISPQ_STATUS_INIT (%ld).\n",u16QPtr+1,pHvdFrm_sub->u32Status);
2717 ///printf("Return NULL.\n");
2718 return NULL;
2719 }
2720 }
2721
2722 //printf("V:%d.\n",u16QPtr);
2723 pHVDHalContext->_u16DispQPtr = u16QPtr;
2724 pHVDHalContext->pHvdFrm->u32Status = E_HVD_DISPQ_STATUS_VIEW; /////Change its state!!
2725 HVD_EX_MSG_DBG("FrameDone: %d, pHvdFrm=0x%lx, timestamp=%d\n", u16QPtr,
2726 (unsigned long) pHVDHalContext->pHvdFrm, pShm->DispQueue[u16QPtr].u32TimeStamp);
2727 HVD_EX_MSG_INF("<<< halHVD pts,idH = %lu, %lu [%x]\n", (unsigned long) pHVDHalContext->pHvdFrm->u32TimeStamp, (unsigned long) pHVDHalContext->pHvdFrm->u32ID_H, u16QPtr); //STS output
2728 return (HVD_Frm_Information *)(MS_VIRT) pHVDHalContext->pHvdFrm;
2729 }
2730
2731 u16QNum--;
2732 //go to next frame in the dispQ
2733 u16QPtr++;
2734
2735 if (u16QPtr >= pShm->u16DispQSize)
2736 {
2737 u16QPtr -= pShm->u16DispQSize; //wrap to the begin
2738 }
2739 }
2740 }
2741 else
2742 #endif ///HVD_ENABLE_MVC
2743 // pShm->DispInfo.u8Interlace : 0 = progressive, 1 = interlace field, 2 = interlace frame
2744 if (_HVD_EX_IsHevcInterlaceField(u32Id))
2745 {
2746 MS_U32 first_field = pHVDHalContext->_stHVDStream[u8Idx].u32DispQIndex == 1 ? 0 : 1;
2747 volatile HVD_Frm_Information *pHvdFrm_first = NULL;
2748
2749 if ((first_field && u16QNum < 2) || (u16QNum == 0)) {
2750 return NULL;
2751 }
2752
2753 while (u16QNum != 0)
2754 {
2755 volatile HVD_Frm_Information *pHvdFrm = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr];
2756 if (pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT) // Must Be
2757 {
2758 if (!first_field) // second get frame, we will check at least one paired in disp queue.
2759 {
2760 pHvdFrm->u32Status = E_HVD_DISPQ_STATUS_VIEW;
2761 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_UPDATE_DISPQ, pHvdFrm->u32PrivateData);
2762 pHVDHalContext->_stHVDStream[u8Idx].u32DispQIndex = 0;
2763
2764 if(pHvdFrm->u8FieldType == 1 || pHvdFrm->u8FieldType == 9 || pHvdFrm->u8FieldType == 11)
2765 pHvdFrm->u8FieldType = 0;
2766 else
2767 pHvdFrm->u8FieldType = 1;
2768 return pHvdFrm;
2769 }
2770 else // first get frame, we will check at least one paired in disp queue.
2771 {
2772 if (pHvdFrm_first == NULL)
2773 {
2774 pHvdFrm_first = pHvdFrm;
2775 }
2776 else
2777 {
2778 pHvdFrm_first->u32Status = E_HVD_DISPQ_STATUS_VIEW;
2779 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_UPDATE_DISPQ, pHvdFrm_first->u32PrivateData);
2780
2781 //After flush, we cannot get the correct field type of first field from sei, so we use second field type to decide first field type.
2782 if (pHVDHalContext->_stHVDStream[u8Idx].u32DispQIndex == 0xff)
2783 {
2784 if (pHvdFrm->u8FieldType == 9)
2785 pHvdFrm_first->u8FieldType = 12;
2786 else if (pHvdFrm->u8FieldType == 10)
2787 pHvdFrm_first->u8FieldType = 11;
2788 else if (pHvdFrm->u8FieldType == 10)
2789 pHvdFrm_first->u8FieldType = 11;
2790 else if (pHvdFrm->u8FieldType == 1)
2791 pHvdFrm_first->u8FieldType = 2;
2792 else if (pHvdFrm->u8FieldType == 2)
2793 pHvdFrm_first->u8FieldType = 1;
2794 else
2795 {
2796 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_RELEASE_DISPQ, pHvdFrm_first->u32PrivateData);
2797 return NULL;
2798 }
2799 if ((pHvdFrm_first->u32ID_L >> 16) & 0x1)
2800 pHvdFrm_first->u32ID_L |= (1 << 16);
2801 else
2802 pHvdFrm_first->u32ID_L &= (~(1 << 16));
2803 }
2804 else if (pHvdFrm_first->u8FieldType == 9 || pHvdFrm_first->u8FieldType == 10)
2805 {
2806 if (pHvdFrm_first->u8FieldType == 9 && pHvdFrm->u8FieldType == 12)
2807 {
2808 pHvdFrm_first->u32ID_L |= (1 << 16);
2809 pHvdFrm->u32ID_L |= (1 << 16);
2810 }
2811 else if (pHvdFrm_first->u8FieldType == 10 && pHvdFrm->u8FieldType == 11)
2812 {
2813 pHvdFrm_first->u32ID_L &= (~(1 << 16));
2814 pHvdFrm->u32ID_L &= (~(1 << 16));
2815 }
2816 else
2817 {
2818 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_RELEASE_DISPQ, pHvdFrm_first->u32PrivateData);
2819 return NULL;
2820 }
2821 }
2822 pHVDHalContext->_stHVDStream[u8Idx].u32DispQIndex = 1;
2823 if (pHvdFrm_first->u8FieldType == 1 || pHvdFrm_first->u8FieldType == 9 || pHvdFrm_first->u8FieldType == 11)
2824 pHvdFrm_first->u8FieldType = 0;
2825 else
2826 pHvdFrm_first->u8FieldType = 1;
2827 return pHvdFrm_first;
2828 }
2829 }
2830 }
2831 u16QNum--;
2832 //go to next frame in the dispQ
2833 u16QPtr++;
2834
2835 if (u16QPtr == pShm->u16DispQSize)
2836 {
2837 u16QPtr = 0; //wrap to the begin
2838 }
2839
2840 }
2841 return NULL;
2842 }
2843 else
2844 {
2845 volatile HVD_Frm_Information *pHvdFrm = (volatile HVD_Frm_Information*)&pShm->DispQueue[u16QPtr];
2846
2847 if (pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide)
2848 {
2849
2850 while (u16QNum != 0)
2851 {
2852 pHvdFrm = (volatile HVD_Frm_Information*) &pShm->DispQueue[u16QPtr];
2853
2854 if (pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT) // Must Be
2855 {
2856 pHVDHalContext->_u16DispOutSideQPtr[u8Idx] = u16QPtr;
2857 pHvdFrm->u32Status = E_HVD_DISPQ_STATUS_VIEW;
2858 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_UPDATE_DISPQ, pHvdFrm->u32PrivateData);
2859 return (HVD_Frm_Information*)(MS_VIRT)pHvdFrm;
2860 }
2861 u16QNum--;
2862 //go to next frame in the dispQ
2863 u16QPtr++;
2864
2865 if (u16QPtr == pShm->u16DispQSize)
2866 {
2867 u16QPtr = 0; //wrap to the begin
2868 }
2869 }
2870
2871 return NULL;
2872 }
2873
2874 //printf("Q: %d %d\n", u16QNum, u16QPtr);
2875 //search the next frame to display
2876 while (u16QNum != 0)
2877 {
2878 pHVDHalContext->pHvdFrm = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr];
2879
2880 //printf("Q2: %ld\n", pHVDShareMem->DispQueue[u16QPtr].u32Status);
2881 if (pHVDHalContext->pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
2882 {
2883 pHVDHalContext->_u16DispQPtr = u16QPtr;
2884 pHVDHalContext->pHvdFrm->u32Status = E_HVD_DISPQ_STATUS_VIEW; /////Change its state!!
2885 HVD_EX_MSG_DBG("FrameDone: %d, pHvdFrm=0x%lx, timestamp=%d\n", u16QPtr,
2886 (unsigned long) pHVDHalContext->pHvdFrm, pShm->DispQueue[u16QPtr].u32TimeStamp);
2887 HVD_EX_MSG_INF("<<< halHVD pts,idH = %u, %u [%x]\n", pHVDHalContext->pHvdFrm->u32TimeStamp, pHVDHalContext->pHvdFrm->u32ID_H, u16QPtr); //STS output
2888 return (HVD_Frm_Information *)(MS_VIRT) pHVDHalContext->pHvdFrm;
2889 }
2890
2891 u16QNum--;
2892 //go to next frame in the dispQ
2893 u16QPtr++;
2894
2895 if (u16QPtr == pShm->u16DispQSize)
2896 {
2897 u16QPtr = 0; //wrap to the begin
2898 }
2899 }
2900 }
2901
2902 return NULL;
2903 }
2904
_HVD_EX_GetNextDispFrameExt(MS_U32 u32Id)2905 static HVD_Frm_Information_EXT_Entry *_HVD_EX_GetNextDispFrameExt(MS_U32 u32Id)
2906 {
2907 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
2908 HVD_Frm_Information_EXT_Entry *pFrmInfoExt = NULL;
2909 if (pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide)
2910 {
2911 HVD_Frm_Information_EXT *pVsyncBridgeExt = (HVD_Frm_Information_EXT *)HAL_HVD_EX_GetDispQExtShmAddr(u32Id);
2912 if(pVsyncBridgeExt != NULL)
2913 {
2914 pFrmInfoExt = &(pVsyncBridgeExt->stEntry[pHVDHalContext->_u16DispOutSideQPtr[u8Idx]]);
2915 }
2916 }
2917 return pFrmInfoExt;
2918 }
2919
_HAL_EX_GetHwMaxPixel(MS_U32 u32Id)2920 static MS_U64 _HAL_EX_GetHwMaxPixel(MS_U32 u32Id)
2921 {
2922 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
2923 MS_U64 u64Ret = 0;
2924 #if SUPPORT_EVD
2925 MS_BOOL isEVD = (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK));
2926 #if SUPPORT_MSVP9
2927 isEVD = isEVD || (E_HVD_INIT_HW_VP9 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK));
2928 #endif
2929 #endif
2930
2931 #if SUPPORT_EVD
2932 if (isEVD)
2933 {
2934 u64Ret = (MS_U64)HEVC_HW_MAX_PIXEL;
2935 }
2936 else
2937 #endif
2938 #if SUPPORT_G2VP9
2939 if (E_HVD_INIT_HW_VP9 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
2940 {
2941 u64Ret = (MS_U64)VP9_HW_MAX_PIXEL;
2942 }
2943 else
2944 #endif
2945 {
2946 u64Ret = (MS_U64)HVD_HW_MAX_PIXEL;
2947 }
2948
2949 return u64Ret;
2950 }
2951
2952 MS_BOOL
HAL_HVD_EX_DispFrameAllViewed(MS_U32 u32Id)2953 HAL_HVD_EX_DispFrameAllViewed(MS_U32 u32Id)
2954 {
2955 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
2956 MS_U16 u16QNum = pShm->u16DispQNumb;
2957 MS_U16 u16QPtr = pShm->u16DispQPtr;
2958 static volatile HVD_Frm_Information *pHvdFrm = NULL;
2959 MS_BOOL bMVC = FALSE;
2960 #if HVD_ENABLE_MVC
2961 bMVC = HAL_HVD_EX_CheckMVCID(u32Id);
2962 #endif
2963
2964 if (bMVC || _HVD_EX_IsHevcInterlaceField(u32Id))
2965 {
2966 if (u16QNum == 1) return TRUE;
2967 }
2968
2969 while (u16QNum != 0)
2970 {
2971 pHvdFrm = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr];
2972 if (pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
2973 {
2974 return FALSE;
2975 }
2976 u16QNum--;
2977 u16QPtr++;
2978 if (u16QPtr == pShm->u16DispQSize)
2979 {
2980 u16QPtr = 0; //wrap to the begin
2981 }
2982 }
2983
2984 return TRUE;
2985 }
_HVD_EX_GetDrvCtrl(MS_U32 u32Id)2986 static HVD_EX_Drv_Ctrl *_HVD_EX_GetDrvCtrl(MS_U32 u32Id)
2987 {
2988 MS_U8 u8DrvId = (0xFF & (u32Id >> 16));
2989
2990 return &(_pHVDCtrls[u8DrvId]);
2991 }
2992
_HVD_EX_GetStreamIdx(MS_U32 u32Id)2993 MS_U8 _HVD_EX_GetStreamIdx(MS_U32 u32Id)
2994 {
2995 MS_U8 u8OffsetIdx = 0;
2996 MS_U8 u8SidBaseMask = 0xF0;
2997 HAL_HVD_StreamId eSidBase = (HAL_HVD_StreamId) (u32Id >> 8 & u8SidBaseMask);
2998
2999 switch (eSidBase)
3000 {
3001 case E_HAL_HVD_MAIN_STREAM_BASE:
3002 {
3003 u8OffsetIdx = 0;
3004 break;
3005 }
3006 case E_HAL_VPU_SUB_STREAM_BASE:
3007 {
3008 u8OffsetIdx = 1;
3009 break;
3010 }
3011 case E_HAL_VPU_MVC_STREAM_BASE:
3012 {
3013 u8OffsetIdx = 0;
3014 break;
3015 }
3016 #ifdef VDEC3
3017 case E_HAL_VPU_N_STREAM_BASE:
3018 {
3019 u8OffsetIdx = (u32Id>>8) & 0xF;
3020 break;
3021 }
3022 #endif
3023 default:
3024 {
3025 u8OffsetIdx = 0;
3026 break;
3027 }
3028 }
3029
3030 return u8OffsetIdx;
3031 }
3032 /*
3033 static MS_BOOL _HAL_HVD_EX_HVDInUsed(void)
3034 {
3035 MS_U32 i = 0;
3036 for(i = 0; i < HAL_HVD_EX_MAX_SUPPORT_STREAM; i++)
3037 {
3038 if(TRUE == pHVDHalContext->_stHVDStream[i].bUsed)
3039 {
3040 return TRUE;
3041 }
3042 }
3043 return FALSE;
3044 }
3045 */
3046
HAL_HVD_EX_GetShmAddr(MS_U32 u32Id)3047 MS_VIRT HAL_HVD_EX_GetShmAddr(MS_U32 u32Id)
3048 {
3049 MS_PHY u32PhyAddr = 0x0;
3050 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
3051
3052 if (pCtrl->MemMap.u32CodeBufAddr == 0)
3053 {
3054 return 0;
3055 }
3056
3057 u32PhyAddr = HAL_VPU_EX_GetShareInfoAddr(u32Id);
3058
3059 if (u32PhyAddr == 0xFFFFFFFF) //boris
3060 {
3061 u32PhyAddr = pCtrl->MemMap.u32CodeBufAddr + (HAL_VPU_EX_GetTaskId(u32Id) * HVD_FW_MEM_OFFSET) + HVD_SHARE_MEM_ST_OFFSET;
3062 }
3063 else
3064 {
3065 // TEE, common + share_info
3066 u32PhyAddr += COMMON_AREA_SIZE;
3067 }
3068
3069 return MsOS_PA2KSEG1(u32PhyAddr);
3070 }
3071
HAL_HVD_EX_GetDispQExtShmAddr(MS_U32 u32Id)3072 MS_VIRT HAL_HVD_EX_GetDispQExtShmAddr(MS_U32 u32Id)
3073 {
3074 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
3075 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
3076
3077 if (pCtrl->MemMap.u32CodeBufAddr == 0 || pShm == NULL)
3078 {
3079 return 0;
3080 }
3081
3082 MS_PHY u32PhyAddr = 0x0;
3083 #if 0
3084 u32PhyAddr = HAL_VPU_EX_GetShareInfoAddr(u32Id);
3085
3086 if (u32PhyAddr == 0xFFFFFFFF)
3087 {
3088 u32PhyAddr = pCtrl->MemMap.u32CodeBufAddr + (HAL_VPU_EX_GetTaskId(u32Id) * HVD_FW_MEM_OFFSET);
3089 }
3090 #endif
3091 u32PhyAddr = pCtrl->MemMap.u32CodeBufAddr;
3092 u32PhyAddr += pShm->u32DISPQUEUE_EXT_ST_ADDR; //with HVD_FW_MEM_OFFSET
3093
3094 return MsOS_PA2KSEG1(u32PhyAddr);
3095 }
3096
HAL_HVD_MIF1_MiuClientSel(MS_U8 u8MiuSel)3097 void HAL_HVD_MIF1_MiuClientSel(MS_U8 u8MiuSel)
3098 {
3099
3100 if (u8MiuSel == E_CHIP_MIU_0)
3101 {
3102 _HVD_WriteWordMask(MIU0_CLIENT_SELECT_GP4, 0, MIU0_CLIENT_SELECT_GP4_HVD_MIF1);
3103 _HVD_WriteWordMask(MIU2_CLIENT_SELECT_GP4, 0, MIU2_CLIENT_SELECT_GP4_HVD_MIF1);
3104 }
3105 else if (u8MiuSel == E_CHIP_MIU_1)
3106 {
3107 _HVD_WriteWordMask(MIU0_CLIENT_SELECT_GP4, MIU0_CLIENT_SELECT_GP4_HVD_MIF1, MIU0_CLIENT_SELECT_GP4_HVD_MIF1);
3108 _HVD_WriteWordMask(MIU2_CLIENT_SELECT_GP4, 0, MIU2_CLIENT_SELECT_GP4_HVD_MIF1);
3109 }
3110 else // 2
3111 {
3112 _HVD_WriteWordMask(MIU0_CLIENT_SELECT_GP4, 0, MIU0_CLIENT_SELECT_GP4_HVD_MIF1);
3113 _HVD_WriteWordMask(MIU2_CLIENT_SELECT_GP4, MIU2_CLIENT_SELECT_GP4_HVD_MIF1, MIU2_CLIENT_SELECT_GP4_HVD_MIF1);
3114 }
3115
3116 }
3117
3118 #if SUPPORT_G2VP9 && defined(VDEC3)
3119 #ifdef __ARM_NEON__
3120 #include <arm_neon.h>
tile4x4_to_raster_8(MS_U8 * raster,MS_U8 * tile,MS_U32 stride,MS_U32 tile_w,MS_U32 tile_h)3121 static void tile4x4_to_raster_8(MS_U8* raster, MS_U8* tile, MS_U32 stride, MS_U32 tile_w, MS_U32 tile_h)
3122 {
3123 uint32x4x4_t data, data2;
3124 MS_U8* raster2 = raster + tile_w * 4;
3125
3126 data = vld4q_u32((const uint32_t *)tile);
3127 data2 = vld4q_u32((const uint32_t *)(tile + tile_w * tile_h * 4));
3128
3129 vst1q_u32((uint32_t *)raster, data.val[0]);
3130 raster += stride;
3131 vst1q_u32((uint32_t *)raster, data.val[1]);
3132 raster += stride;
3133 vst1q_u32((uint32_t *)raster, data.val[2]);
3134 raster += stride;
3135 vst1q_u32((uint32_t *)raster, data.val[3]);
3136
3137
3138 vst1q_u32((uint32_t *)raster2, data2.val[0]);
3139 raster2 += stride;
3140 vst1q_u32((uint32_t *)raster2, data2.val[1]);
3141 raster2 += stride;
3142 vst1q_u32((uint32_t *)raster2, data2.val[2]);
3143 raster2 += stride;
3144 vst1q_u32((uint32_t *)raster2, data2.val[3]);
3145 }
3146 #else
tile4x4_to_raster_4(MS_U8 * raster,MS_U8 * tile,MS_U32 stride)3147 static void tile4x4_to_raster_4(MS_U8* raster, MS_U8* tile, MS_U32 stride)
3148 {
3149 MS_U8* tile0 = tile;
3150 MS_U8* tile1 = tile+16;
3151 MS_U8* tile2 = tile+32;
3152 MS_U8* tile3 = tile+48;
3153 int i;
3154
3155 for (i=0; i<4; i++) {
3156 raster[i] = tile0[i];
3157 raster[4+i] = tile1[i];
3158 raster[8+i] = tile2[i];
3159 raster[12+i] = tile3[i];
3160 }
3161
3162 for (i=0; i<4; i++) {
3163 raster[stride+i] = tile0[4+i];
3164 raster[stride+4+i] = tile1[4+i];
3165 raster[stride+8+i] = tile2[4+i];
3166 raster[stride+12+i] = tile3[4+i];
3167 }
3168
3169 for (i=0; i<4; i++) {
3170 raster[2*stride+i] = tile0[8+i];
3171 raster[2*stride+4+i] = tile1[8+i];
3172 raster[2*stride+8+i] = tile2[8+i];
3173 raster[2*stride+12+i] = tile3[8+i];
3174 }
3175
3176 for (i=0; i<4; i++) {
3177 raster[3*stride+i] = tile0[12+i];
3178 raster[3*stride+4+i] = tile1[12+i];
3179 raster[3*stride+8+i] = tile2[12+i];
3180 raster[3*stride+12+i] = tile3[12+i];
3181 }
3182 }
3183 #endif // #ifdef __ARM_NEON__
3184
3185 #if SUPPORT_G2VP9 && defined(VDEC3)
3186
_HVD_EX_PpTask_Create(MS_U32 u32Id,HVD_EX_Stream * pstHVDStream)3187 static MS_BOOL _HVD_EX_PpTask_Create(MS_U32 u32Id, HVD_EX_Stream *pstHVDStream)
3188 {
3189 MS_S32 s32HvdPpTaskId = MsOS_CreateTask((TaskEntry)_HAL_HVD_EX_PostProc_Task,
3190 u32Id,
3191 E_TASK_PRI_MEDIUM,
3192 TRUE,
3193 NULL,
3194 32, // stack size..
3195 "HVD_PostProcess_task");
3196
3197 if (s32HvdPpTaskId < 0)
3198 {
3199 HVD_EX_MSG_ERR("Pp Task create failed\n");
3200
3201 return FALSE;
3202 }
3203
3204 HVD_EX_MSG_DBG("Pp Task create success\n");
3205 pstHVDStream->s32HvdPpTaskId = s32HvdPpTaskId;
3206
3207 return TRUE;
3208 }
3209 #endif
3210
tile_offset(MS_U32 x,MS_U32 y,MS_U32 w,MS_U32 h,MS_U32 stride)3211 static MS_U32 tile_offset(MS_U32 x, MS_U32 y, MS_U32 w, MS_U32 h, MS_U32 stride)
3212 {
3213 return y * stride * h + x * w * h;
3214 }
3215
raster_offset(MS_U32 x,MS_U32 y,MS_U32 w,MS_U32 h,MS_U32 stride)3216 static MS_U32 raster_offset(MS_U32 x, MS_U32 y, MS_U32 w, MS_U32 h, MS_U32 stride)
3217 {
3218 return y * stride * h + x * w;
3219 }
3220
tile4x4_to_raster(MS_U8 * raster,MS_U8 * tile,MS_U32 stride)3221 static void tile4x4_to_raster(MS_U8* raster, MS_U8* tile, MS_U32 stride)
3222 {
3223 raster[0] = tile[0];
3224 raster[1] = tile[1];
3225 raster[2] = tile[2];
3226 raster[3] = tile[3];
3227 raster[stride] = tile[4];
3228 raster[stride + 1] = tile[5];
3229 raster[stride + 2] = tile[6];
3230 raster[stride + 3] = tile[7];
3231 raster[2 * stride] = tile[8];
3232 raster[2 * stride + 1] = tile[9];
3233 raster[2 * stride + 2] = tile[10];
3234 raster[2 * stride + 3] = tile[11];
3235 raster[3 * stride] = tile[12];
3236 raster[3 * stride + 1] = tile[13];
3237 raster[3 * stride + 2] = tile[14];
3238 raster[3 * stride + 3] = tile[15];
3239 }
3240
tiled4x4pic_to_raster_new(MS_U8 * dst,MS_U8 * src,MS_U32 w,MS_U32 h,MS_U32 raster_stride)3241 static void tiled4x4pic_to_raster_new(MS_U8* dst, MS_U8* src, MS_U32 w, MS_U32 h, MS_U32 raster_stride)
3242 {
3243 const MS_U32 tile_w = 4;
3244 const MS_U32 tile_h = 4;
3245 MS_U32 tile_stride = w;
3246 MS_U32 x, y;
3247 MS_U8 *dst1, *dst2;
3248 MS_U8 *src1, *src2;
3249
3250 #ifdef __ARM_NEON__
3251 // To overlap load and store, handle two blocks at the same time.
3252 dst1 = dst;
3253 src1 = src;
3254 for (y = 0; y < h / tile_h; y++)
3255 {
3256 dst2 = dst1;
3257 src2 = src1;
3258 for (x = 0; x <= (w/tile_w - 8); x+=8)
3259 {
3260 tile4x4_to_raster_8(
3261 dst2,
3262 src2,
3263 raster_stride, tile_w, tile_h);
3264 dst2 += tile_w * 8;
3265 src2 += tile_w * tile_h * 8;
3266 }
3267 dst1 += raster_stride * tile_h;
3268 src1 += tile_stride * tile_h;
3269 for (; x < w / tile_w; x++)
3270 {
3271 tile4x4_to_raster(
3272 dst + raster_offset(x, y, tile_w, tile_h, raster_stride),
3273 src + tile_offset(x, y, tile_w, tile_h, tile_stride),
3274 raster_stride);
3275 }
3276 }
3277 #else
3278 dst1 = NULL;
3279 src1 = NULL;
3280 dst2 = NULL;
3281 src2 = NULL;
3282
3283 for (y = 0; y < h / tile_h; y++)
3284 {
3285 for (x = 0; x <= (w/tile_w - 4); x+=4)
3286 {
3287 tile4x4_to_raster_4(
3288 dst + raster_offset(x, y, tile_w, tile_h, raster_stride),
3289 src + tile_offset(x, y, tile_w, tile_h, tile_stride),
3290 raster_stride);
3291 }
3292 for (; x < w / tile_w; x++)
3293 {
3294 tile4x4_to_raster(
3295 dst + raster_offset(x, y, tile_w, tile_h, raster_stride),
3296 src + tile_offset(x, y, tile_w, tile_h, tile_stride),
3297 raster_stride);
3298 }
3299 }
3300 #endif
3301 }
3302
3303 #define FLUSH_CACHE_SIZE (256 * 1024)
3304
_HAL_HVD_EX_Inv_Cache(void * pVA,MS_U32 u32Size)3305 static void _HAL_HVD_EX_Inv_Cache(void *pVA, MS_U32 u32Size)
3306 {
3307 // To improve performance, just flush the first FLUSH_CACHE_SIZE bytes of data
3308 if (u32Size > FLUSH_CACHE_SIZE)
3309 u32Size = FLUSH_CACHE_SIZE;
3310
3311 MsOS_MPool_Dcache_Flush((MS_VIRT)pVA, u32Size);
3312 }
3313
_HAL_HVD_EX_Flush_Cache(void * pVA,MS_U32 u32Size)3314 static void _HAL_HVD_EX_Flush_Cache(void *pVA, MS_U32 u32Size)
3315 {
3316 MS_U32 u32SkipSize = 0;
3317
3318 // To improve performance, just flush the last FLUSH_CACHE_SIZE bytes of data
3319 if (u32Size > FLUSH_CACHE_SIZE)
3320 {
3321 u32SkipSize = u32Size - FLUSH_CACHE_SIZE;
3322 u32Size = FLUSH_CACHE_SIZE;
3323 }
3324
3325 MsOS_MPool_Dcache_Flush(((MS_VIRT)pVA) + u32SkipSize, u32Size);
3326 }
3327
_HAL_HVD_EX_PostProc_Task(MS_U32 u32Id)3328 static MS_BOOL _HAL_HVD_EX_PostProc_Task(MS_U32 u32Id)
3329 {
3330 HVD_EX_Stream *pstHVDStream = pHVDHalContext->_stHVDStream + _HVD_EX_GetStreamIdx(u32Id);
3331 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
3332 MS_U32 u32SrcMiuSel, u32DstMiuSel;
3333 MS_U16 u16Width = 0, u16Height = 0, u16TileWidth = 0;
3334
3335 HVD_EX_MSG_DBG("[%s-%d] Start\n", __FUNCTION__, __LINE__);
3336
3337 pstHVDStream->ePpTaskState = E_HAL_HVD_STATE_RUNNING;
3338
3339 while (pstHVDStream->ePpTaskState != E_HAL_HVD_STATE_STOP)
3340 {
3341 if (pstHVDStream->ePpTaskState == E_HAL_HVD_STATE_PAUSING)
3342 pstHVDStream->ePpTaskState = E_HAL_HVD_STATE_PAUSE_DONE;
3343
3344 HVD_Delay_ms(1); // FIXME
3345
3346 if (pstHVDStream->ePpTaskState != E_HAL_HVD_STATE_RUNNING)
3347 continue;
3348
3349 HAL_HVD_EX_ReadMemory();
3350
3351 while (pShm->u8PpQueueRPtr != pShm->u8PpQueueWPtr)
3352 {
3353 MS_U8 *pSrcVA, *pDstVA;
3354 MS_U32 u32SrcPA, u32DstPA;
3355 HVD_Frm_Information *pFrmInfo = (HVD_Frm_Information *)&pShm->DispQueue[pShm->u8PpQueueRPtr];
3356 //HVD_EX_MSG_DBG("[%s-%d] width: %d, height = %d, pitch = %d\n", __FUNCTION__, __LINE__, pFrmInfo->u16Width, pFrmInfo->u16Height, pFrmInfo->u16Pitch);
3357
3358 if ((u16Width != pFrmInfo->u16Width) || (u16Height != pFrmInfo->u16Height))
3359 {
3360 HVD_Display_Info *pDispInfo = (HVD_Display_Info *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_INFO_ADDR);
3361
3362 u16Width = pFrmInfo->u16Width;
3363 u16Height = pFrmInfo->u16Height;
3364 u16TileWidth = NEXT_MULTIPLE(pFrmInfo->u16Pitch - pDispInfo->u16CropRight, 8);
3365 }
3366
3367 // Luma
3368 u32SrcMiuSel = (pShm->u32VDEC_MIU_SEL >> VDEC_PPIN_MIUSEL) & VDEC_MIUSEL_MASK;
3369 u32DstMiuSel = (pShm->u32VDEC_MIU_SEL >> VDEC_LUMA8_MIUSEL) & VDEC_MIUSEL_MASK;
3370
3371 _miu_offset_to_phy(u32SrcMiuSel, pFrmInfo->u32PpInLumaAddr, u32SrcPA);
3372 _miu_offset_to_phy(u32DstMiuSel, pFrmInfo->u32LumaAddr, u32DstPA);
3373
3374 pSrcVA = (MS_U8*) MS_PA2KSEG0(u32SrcPA);
3375 pDstVA = (MS_U8*) MS_PA2KSEG0(u32DstPA);
3376
3377 _HAL_HVD_EX_Inv_Cache(pSrcVA, u16TileWidth * pFrmInfo->u16Height);
3378
3379 tiled4x4pic_to_raster_new(pDstVA, pSrcVA, u16TileWidth, pFrmInfo->u16Height, pFrmInfo->u16Pitch);
3380
3381 _HAL_HVD_EX_Flush_Cache(pDstVA, pFrmInfo->u16Pitch * pFrmInfo->u16Height);
3382
3383 // Chroma
3384 u32SrcMiuSel = (pShm->u32VDEC_MIU_SEL >> VDEC_PPIN_MIUSEL) & VDEC_MIUSEL_MASK;
3385 u32DstMiuSel = (pShm->u32VDEC_MIU_SEL >> VDEC_CHROMA8_MIUSEL) & VDEC_MIUSEL_MASK;
3386
3387 _miu_offset_to_phy(u32SrcMiuSel, pFrmInfo->u32PpInChromaAddr, u32SrcPA);
3388 _miu_offset_to_phy(u32DstMiuSel, pFrmInfo->u32ChromaAddr, u32DstPA);
3389
3390 pSrcVA = (MS_U8*) MS_PA2KSEG0(u32SrcPA);
3391 pDstVA = (MS_U8*) MS_PA2KSEG0(u32DstPA);
3392
3393 _HAL_HVD_EX_Inv_Cache(pSrcVA, u16TileWidth * pFrmInfo->u16Height / 2);
3394
3395 tiled4x4pic_to_raster_new(pDstVA, pSrcVA, u16TileWidth, pFrmInfo->u16Height/2, pFrmInfo->u16Pitch);
3396
3397 _HAL_HVD_EX_Flush_Cache(pDstVA, pFrmInfo->u16Pitch * pFrmInfo->u16Height / 2);
3398
3399 pShm->DispQueue[pShm->u8PpQueueRPtr].u32Status = E_HVD_DISPQ_STATUS_INIT;
3400 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_INC_DISPQ_NUM, 0);
3401 INC_VALUE(pShm->u8PpQueueRPtr, pShm->u8PpQueueSize);
3402
3403 HAL_HVD_EX_FlushMemory();
3404
3405 if (pstHVDStream->ePpTaskState == E_HAL_HVD_STATE_PAUSING)
3406 break;
3407
3408 HAL_HVD_EX_ReadMemory();
3409 }
3410 }
3411
3412 HVD_EX_MSG_DBG("[%s-%d] End\n", __FUNCTION__, __LINE__);
3413
3414 return TRUE;
3415 }
3416 #endif
3417
HAL_HVD_EX_InitHW(MS_U32 u32Id,VPU_EX_DecoderType DecoderType)3418 MS_BOOL HAL_HVD_EX_InitHW(MS_U32 u32Id,VPU_EX_DecoderType DecoderType)
3419 {
3420 #ifndef VDEC3
3421 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
3422 #endif
3423 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
3424 // MS_U8 u8MiuSel;
3425 // MS_U32 u32StartOffset;
3426
3427 #if SUPPORT_EVD
3428 MS_BOOL isEVD = (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK));
3429 #if SUPPORT_MSVP9
3430 isEVD = isEVD || (E_HVD_INIT_HW_VP9 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK));
3431 #endif
3432 #endif
3433
3434 // power on / reset HVD; set nal, es rw, bbu parser, release HVD engine
3435 // re-setup clock.
3436 #if SUPPORT_G2VP9 && defined(VDEC3)
3437 if (E_HVD_INIT_HW_VP9 != (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
3438 #endif
3439
3440
3441 if (!HAL_VPU_EX_HVDInUsed())
3442 {
3443 HVD_EX_MSG_INF("HVD power on\n");
3444 HAL_HVD_EX_PowerCtrl(TRUE);
3445 }
3446
3447 #if SUPPORT_EVD
3448 if (isEVD || (E_HVD_INIT_HW_AVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)))
3449 {
3450 #ifdef VDEC3
3451 if (!HAL_VPU_EX_EVDInUsed())
3452 #endif
3453 {
3454 HVD_EX_MSG_INF("EVD power on\n");
3455 HAL_EVD_EX_PowerCtrl(TRUE);
3456 }
3457 }
3458 #endif
3459
3460 #if SUPPORT_G2VP9 && defined(VDEC3)
3461 if (E_HVD_INIT_HW_VP9 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
3462 {
3463 if (!HAL_VPU_EX_G2VP9InUsed())
3464 {
3465 HVD_EX_MSG_INF("G2 VP9 power on\n");
3466 HAL_VP9_EX_PowerCtrl(TRUE);
3467 }
3468 }
3469 #endif
3470
3471 if ((!HAL_VPU_EX_HVDInUsed()) )
3472 {
3473 pHVDHalContext->_stHVDStream[0].u32BBUWptr = 0; //main
3474 pHVDHalContext->_stHVDStream[1].u32BBUWptr = 0; //sub
3475 pHVDHalContext->u32VP8BBUWptr = 0; //VP8
3476 _HVD_EX_ResetMainSubBBUWptr(u32Id);
3477
3478 _HVD_WriteWordMask(HVD_REG_RESET, HVD_REG_RESET_SWRST, HVD_REG_RESET_SWRST);
3479
3480 _HVD_WriteWordMask(HVD_REG_RESET, HVD_REG_RESET_MIU_128, HVD_REG_RESET_MIU_128);
3481
3482 #if 0
3483 if((pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.bEnable) &&
3484 ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_AVC))
3485 {
3486 _phy_to_miu_offset(u8MiuSel, u32StartOffset, pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.u32IapGnBufAddr);
3487
3488 _HAL_HVD_Entry();
3489 HAL_HVD_MIF1_MiuClientSel(u8MiuSel);
3490 _HAL_HVD_Release();
3491
3492 }
3493 #endif
3494 }
3495
3496 #if SUPPORT_EVD
3497 if (isEVD)
3498 {
3499 #ifdef VDEC3
3500 if (!HAL_VPU_EX_EVDInUsed())
3501 #endif
3502 _HVD_WriteWordMask(EVD_REG_RESET, EVD_REG_RESET_SWRST, EVD_REG_RESET_SWRST);
3503 }
3504 #endif
3505
3506 #if SUPPORT_G2VP9 && defined(VDEC3)
3507 if (E_HVD_INIT_HW_VP9 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
3508 {
3509 if (!HAL_VPU_EX_G2VP9InUsed())
3510 _HVD_WriteWordMask(VP9_REG_RESET, VP9_REG_RESET_SWRST, VP9_REG_RESET_SWRST);
3511 }
3512 #endif
3513
3514
3515 if(pCtrl == NULL)
3516 {
3517 HVD_EX_MSG_ERR("HAL_HVD_EX_InitHW Ctrl is NULL.\n");
3518 //return FALSE;
3519 goto RESET;
3520 }
3521
3522 #if SUPPORT_EVD
3523 if (isEVD && ((E_HVD_INIT_HW_AVC != (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) ))
3524 {
3525 #ifdef VDEC3
3526 if (!HAL_VPU_EX_EVDInUsed())
3527 #endif
3528 {
3529 if (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
3530 _HVD_WriteWordMask(EVD_REG_RESET, EVD_REG_RESET_HK_HEVC_MODE, EVD_REG_RESET_HK_HEVC_MODE);
3531 }
3532
3533 if ((E_HVD_INIT_MAIN_LIVE_STREAM == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_MAIN_MASK))
3534 ||(E_HVD_INIT_MAIN_FILE_TS == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_MAIN_MASK)))
3535 {
3536 #ifdef VDEC3
3537 if (0 == pCtrl->u32BBUId)
3538 #else
3539 if (0 == u8TaskId)
3540 #endif
3541 {
3542 _HVD_WriteWordMask(EVD_REG_RESET, EVD_REG_RESET_HK_TSP2EVD_EN, EVD_REG_RESET_HK_TSP2EVD_EN); //for main-DTV mode
3543 }
3544 else
3545 {
3546 _HVD_WriteWordMask(EVD_REG_RESET, EVD_REG_RESET_USE_HVD_MIU_EN, EVD_REG_RESET_USE_HVD_MIU_EN); //for sub-DTV mode
3547 }
3548 }
3549 goto RESET;
3550 }
3551 #endif
3552
3553 // HVD4, from JANUS and later chip
3554 switch ((pCtrl->InitParams.u32ModeFlag) & E_HVD_INIT_HW_MASK)
3555 {
3556 case E_HVD_INIT_HW_AVS:
3557 {
3558 #ifdef VDEC3
3559 if (0 == pCtrl->u32BBUId)
3560 #else
3561 if (0 == u8TaskId)
3562 #endif
3563 {
3564 _HVD_WriteWordMask(HVD_REG_RESET, 0,
3565 HVD_REG_RESET_HK_AVS_MODE | HVD_REG_RESET_HK_RM_MODE);
3566 }
3567 else
3568 {
3569 _HVD_WriteWordMask(HVD_REG_MODE_BS2, 0,
3570 HVD_REG_MODE_HK_AVS_MODE_BS2 | HVD_REG_MODE_HK_RM_MODE_BS2);
3571 }
3572
3573 break;
3574 }
3575 case E_HVD_INIT_HW_RM:
3576 {
3577 #ifdef VDEC3
3578 if (0 == pCtrl->u32BBUId)
3579 #else
3580 if (0 == u8TaskId)
3581 #endif
3582 {
3583 _HVD_WriteWordMask(HVD_REG_RESET, 0,
3584 HVD_REG_RESET_HK_AVS_MODE | HVD_REG_RESET_HK_RM_MODE);
3585
3586 if (pCtrl->InitParams.pRVFileInfo->RV_Version) // RV 9,10
3587 {
3588 _HVD_WriteWordMask(HVD_REG_RESET, 0, HVD_REG_RESET_HK_RV9_DEC_MODE);
3589 }
3590 else // RV 8
3591 {
3592 _HVD_WriteWordMask(HVD_REG_RESET, 0, HVD_REG_RESET_HK_RV9_DEC_MODE);
3593 }
3594 }
3595 else
3596 {
3597 _HVD_WriteWordMask(HVD_REG_MODE_BS2, 0,
3598 HVD_REG_MODE_HK_AVS_MODE_BS2 | HVD_REG_MODE_HK_RM_MODE_BS2);
3599
3600 if (pCtrl->InitParams.pRVFileInfo->RV_Version) // RV 9,10
3601 {
3602 _HVD_WriteWordMask(HVD_REG_MODE_BS2, 0, HVD_REG_MODE_HK_RV9_DEC_MODE_BS2);
3603 }
3604 else // RV 8
3605 {
3606 _HVD_WriteWordMask(HVD_REG_MODE_BS2, 0, HVD_REG_MODE_HK_RV9_DEC_MODE_BS2);
3607 }
3608
3609 }
3610
3611 break;
3612 }
3613 default:
3614 {
3615 #ifdef VDEC3
3616 if (0 == pCtrl->u32BBUId)
3617 #else
3618 if (0 == u8TaskId)
3619 #endif
3620 {
3621 _HVD_WriteWordMask(HVD_REG_RESET, 0, HVD_REG_RESET_HK_AVS_MODE | HVD_REG_RESET_HK_RM_MODE);
3622 }
3623 else
3624 {
3625 _HVD_WriteWordMask(HVD_REG_MODE_BS2, 0, HVD_REG_MODE_HK_AVS_MODE_BS2 | HVD_REG_MODE_HK_RM_MODE_BS2);
3626 }
3627 break;
3628 }
3629 }
3630
3631 RESET:
3632
3633 HVD_EX_MSG_DBG("(be)Miu128 bits Status = %x <<<<<<<\n", _HVD_Read2Byte(HVD_REG_RESET));
3634
3635 if (!HAL_VPU_EX_HVDInUsed())
3636 {
3637 _HVD_Write2Byte(HVD_REG_RESET, (_HVD_Read2Byte(HVD_REG_RESET) | HVD_REG_RESET_MIU_128));
3638 }
3639
3640 HVD_EX_MSG_DBG("(af)Miu128 bits Status = %x <<<<<<<\n", _HVD_Read2Byte(HVD_REG_RESET));
3641
3642 #if SUPPORT_EVD
3643 if (isEVD)
3644 {
3645 #ifdef VDEC3
3646 if (!HAL_VPU_EX_EVDInUsed())
3647 #endif
3648 {
3649 HVD_EX_MSG_INF("EVD miu 128 bits\n");
3650 _HVD_Write2Byte(EVD_REG_RESET, (_HVD_Read2Byte(EVD_REG_RESET) & ~EVD_REG_RESET_MIU0_256& ~EVD_REG_RESET_MIU1_256));
3651 _HVD_Write2Byte(EVD_REG_RESET, (_HVD_Read2Byte(EVD_REG_RESET) | EVD_REG_RESET_MIU0_128| EVD_REG_RESET_MIU1_128));
3652 }
3653 // This is for Mainz using 256 bits bbu.
3654 // If BBU has its own port, need to set bbu 128/256; otherwise, keep default value reg_bbu_miu_256 = 1
3655 HVD_EX_MSG_INF("EVD BBU 256 bits\n");
3656 _HVD_Write2Byte(EVD_REG_BBU_MIU_WIDTH, EVD_REG_BBU_MIU_256);
3657 }
3658
3659 #endif
3660 #if 0 //defined(SUPPORT_NEW_MEM_LAYOUT) || defined(SUPPORT_NEW_VDEC_FLOW)
3661 // Only ES buffer addrress needs to be set for VP8
3662 _HVD_EX_SetESBufferAddr(u32Id);
3663 #else
3664 if(DecoderType != E_VPU_EX_DECODER_MVD)
3665 {
3666 _HVD_EX_SetBufferAddr(u32Id);
3667 }
3668 #endif
3669 if (!HAL_VPU_EX_HVDInUsed())
3670 {
3671 _HVD_WriteWordMask(HVD_REG_RESET, 0, HVD_REG_RESET_SWRST);
3672 }
3673
3674 #if SUPPORT_EVD
3675 if (isEVD)
3676 {
3677 #ifdef VDEC3
3678 if (!HAL_VPU_EX_EVDInUsed())
3679 #endif
3680 _HVD_WriteWordMask(EVD_REG_RESET, 0, EVD_REG_RESET_SWRST);
3681 }
3682 #endif
3683
3684 #if SUPPORT_G2VP9 && defined(VDEC3)
3685 if (E_HVD_INIT_HW_VP9 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
3686 {
3687 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
3688
3689 if (!HAL_VPU_EX_G2VP9InUsed())
3690 _HVD_WriteWordMask(VP9_REG_RESET, 0, VP9_REG_RESET_SWRST);
3691
3692 if (pShm->u8FrmPostProcSupport & E_HVD_POST_PROC_DETILE)
3693 _HVD_EX_PpTask_Create(u32Id, &pHVDHalContext->_stHVDStream[_HVD_EX_GetStreamIdx(u32Id)]);
3694 }
3695 #endif
3696
3697 return TRUE;
3698 }
3699
HAL_HVD_EX_DeinitHW(void)3700 MS_BOOL HAL_HVD_EX_DeinitHW(void)
3701 {
3702 MS_U16 u16Timeout = 1000;
3703
3704 _HVD_EX_SetMIUProtectMask(TRUE);
3705
3706 #if SUPPORT_EVD //EVD using HVD DIU, it should be turn off EVD first
3707 HAL_EVD_EX_DeinitHW();
3708 #endif
3709
3710 _HVD_WriteWordMask(HVD_REG_RESET, HVD_REG_RESET_SWRST, HVD_REG_RESET_SWRST);
3711
3712 while (u16Timeout)
3713 {
3714 if ((_HVD_Read2Byte(HVD_REG_RESET) & (HVD_REG_RESET_SWRST_FIN)) == (HVD_REG_RESET_SWRST_FIN))
3715 {
3716 break;
3717 }
3718 u16Timeout--;
3719 }
3720
3721 HAL_HVD_EX_PowerCtrl(FALSE);
3722
3723 _HVD_EX_SetMIUProtectMask(FALSE);
3724
3725 return TRUE;
3726 }
3727
HAL_HVD_EX_FlushMemory(void)3728 void HAL_HVD_EX_FlushMemory(void)
3729 {
3730 MsOS_FlushMemory();
3731 }
3732
HAL_HVD_EX_ReadMemory(void)3733 void HAL_HVD_EX_ReadMemory(void)
3734 {
3735 MsOS_ReadMemory();
3736 }
3737
HAL_HVD_EX_SetDrvCtrlsBase(HVD_EX_Drv_Ctrl * pHVDCtrlsBase)3738 void HAL_HVD_EX_SetDrvCtrlsBase(HVD_EX_Drv_Ctrl *pHVDCtrlsBase)
3739 {
3740 _pHVDCtrls = pHVDCtrlsBase;
3741 }
3742
HAL_HVD_EX_CheckMIUSel(MS_BOOL bChange)3743 void HAL_HVD_EX_CheckMIUSel(MS_BOOL bChange)
3744 {
3745 return;
3746 }
3747
HAL_HVD_EX_GetHWVersionID(void)3748 MS_U32 HAL_HVD_EX_GetHWVersionID(void)
3749 {
3750 return _HVD_Read2Byte(HVD_REG_REV_ID);
3751 }
3752
3753
HAL_HVD_EX_Init_Share_Mem(void)3754 MS_BOOL HAL_HVD_EX_Init_Share_Mem(void)
3755 {
3756 #if (defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_ECOS) || defined(MSOS_TYPE_LINUX_KERNEL))
3757 #if !defined(SUPPORT_X_MODEL_FEATURE)
3758 MS_U32 u32ShmId;
3759 MS_VIRT u32Addr;
3760 MS_U32 u32BufSize;
3761
3762
3763 if (FALSE == MsOS_SHM_GetId( (MS_U8*)"Linux HVD HAL",
3764 sizeof(HVD_Hal_CTX),
3765 &u32ShmId,
3766 &u32Addr,
3767 &u32BufSize,
3768 MSOS_SHM_QUERY))
3769 {
3770 if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux HVD HAL",
3771 sizeof(HVD_Hal_CTX),
3772 &u32ShmId,
3773 &u32Addr,
3774 &u32BufSize,
3775 MSOS_SHM_CREATE))
3776 {
3777 HVD_EX_MSG_ERR("[%s]SHM allocation failed!!!use global structure instead!!!\n",__FUNCTION__);
3778 if(pHVDHalContext == NULL)
3779 {
3780 pHVDHalContext = &gHVDHalContext;
3781 memset(pHVDHalContext,0,sizeof(HVD_Hal_CTX));
3782 _HVD_EX_Context_Init_HAL();
3783 HVD_EX_MSG_INF("[%s]Global structure init Success!!!\n",__FUNCTION__);
3784 }
3785 else
3786 {
3787 HVD_EX_MSG_INF("[%s]Global structure exists!!!\n",__FUNCTION__);
3788 }
3789 //return FALSE;
3790 }
3791 else
3792 {
3793 memset((MS_U8*)u32Addr,0,sizeof(HVD_Hal_CTX));
3794 pHVDHalContext = (HVD_Hal_CTX*)u32Addr; // for one process
3795 _HVD_EX_Context_Init_HAL();
3796 }
3797 }
3798 else
3799 {
3800 pHVDHalContext = (HVD_Hal_CTX*)u32Addr; // for another process
3801 }
3802 #else
3803 if(pHVDHalContext == NULL)
3804 {
3805 pHVDHalContext = &gHVDHalContext;
3806 memset(pHVDHalContext,0,sizeof(HVD_Hal_CTX));
3807 _HVD_EX_Context_Init_HAL();
3808 }
3809 #endif
3810 _HAL_HVD_MutexCreate();
3811 #else
3812 if(pHVDHalContext == NULL)
3813 {
3814 pHVDHalContext = &gHVDHalContext;
3815 memset(pHVDHalContext,0,sizeof(HVD_Hal_CTX));
3816 _HVD_EX_Context_Init_HAL();
3817 }
3818 #endif
3819
3820 return TRUE;
3821 }
3822
3823
HAL_HVD_EX_GetFreeStream(HAL_HVD_StreamType eStreamType)3824 HAL_HVD_StreamId HAL_HVD_EX_GetFreeStream(HAL_HVD_StreamType eStreamType)
3825 {
3826 MS_U32 i = 0;
3827
3828 if (eStreamType == E_HAL_HVD_MVC_STREAM)
3829 {
3830 if ((FALSE == pHVDHalContext->_stHVDStream[0].bUsed) && (FALSE == pHVDHalContext->_stHVDStream[1].bUsed))
3831 return pHVDHalContext->_stHVDStream[0].eStreamId;
3832 }
3833 else if (eStreamType == E_HAL_HVD_MAIN_STREAM)
3834 {
3835 for (i = 0;
3836 i <
3837 ((E_HAL_HVD_MAIN_STREAM_MAX - E_HAL_HVD_MAIN_STREAM_BASE) +
3838 (E_HAL_HVD_SUB_STREAM_MAX - E_HAL_HVD_SUB_STREAM_BASE)); i++)
3839 {
3840 if ((E_HAL_HVD_MAIN_STREAM_BASE & pHVDHalContext->_stHVDStream[i].eStreamId) && (FALSE == pHVDHalContext->_stHVDStream[i].bUsed))
3841 {
3842 return pHVDHalContext->_stHVDStream[i].eStreamId;
3843 }
3844 }
3845 }
3846 else if (eStreamType == E_HAL_HVD_SUB_STREAM)
3847 {
3848 for (i = 0;
3849 i <
3850 ((E_HAL_HVD_MAIN_STREAM_MAX - E_HAL_HVD_MAIN_STREAM_BASE) +
3851 (E_HAL_HVD_SUB_STREAM_MAX - E_HAL_HVD_SUB_STREAM_BASE)); i++)
3852 {
3853 if ((E_HAL_HVD_SUB_STREAM_BASE & pHVDHalContext->_stHVDStream[i].eStreamId) && (FALSE == pHVDHalContext->_stHVDStream[i].bUsed))
3854 {
3855 return pHVDHalContext->_stHVDStream[i].eStreamId;
3856 }
3857 }
3858 }
3859 #ifdef VDEC3
3860 else if ((eStreamType >= E_HAL_HVD_N_STREAM) && (eStreamType < E_HAL_HVD_N_STREAM + HAL_HVD_EX_MAX_SUPPORT_STREAM))
3861 {
3862 i = eStreamType - E_HAL_HVD_N_STREAM;
3863 if (!pHVDHalContext->_stHVDStream[i].bUsed)
3864 return pHVDHalContext->_stHVDStream[i].eStreamId;
3865 }
3866 #endif
3867
3868 return E_HAL_HVD_STREAM_NONE;
3869 }
3870
HAL_HVD_EX_PowerCtrl(MS_BOOL bEnable)3871 void HAL_HVD_EX_PowerCtrl(MS_BOOL bEnable)
3872 {
3873 if (bEnable)
3874 {
3875 _HVD_WriteWordMask(REG_TOP_HVD, ~TOP_CKG_HVD_DIS, TOP_CKG_HVD_DIS);
3876 _HVD_WriteWordMask(REG_TOP_VP8, ~TOP_CKG_VP8_DIS, TOP_CKG_VP8_DIS);
3877 _HVD_WriteWordMask(REG_TOP_HVD_AEC, ~TOP_CKG_HVD_AEC_DIS, TOP_CKG_HVD_AEC_DIS);
3878 //_HVD_WriteWordMask(REG_TOP_HVD_IDB, ~TOP_CKG_HVD_IDB_DIS, TOP_CKG_HVD_IDB_DIS);
3879 }
3880 else
3881 {
3882 _HVD_WriteWordMask(REG_TOP_HVD, TOP_CKG_HVD_DIS, TOP_CKG_HVD_DIS);
3883 _HVD_WriteWordMask(REG_TOP_VP8, TOP_CKG_VP8_DIS, TOP_CKG_VP8_DIS);
3884 _HVD_WriteWordMask(REG_TOP_HVD_AEC, TOP_CKG_HVD_AEC_DIS, TOP_CKG_HVD_AEC_DIS);
3885 //_HVD_WriteWordMask(REG_TOP_HVD_IDB, TOP_CKG_HVD_IDB_DIS, TOP_CKG_HVD_IDB_DIS);
3886 }
3887
3888 // fix to not inverse
3889 _HVD_WriteWordMask(REG_TOP_HVD, ~TOP_CKG_HVD_INV, TOP_CKG_HVD_INV);
3890
3891 switch (pHVDHalContext->u32HVDClockType)
3892 {
3893 #if 0
3894 case 432:
3895 {
3896 _HVD_WriteWordMask(REG_TOP_HVD, TOP_CKG_HVD_432MHZ, TOP_CKG_HVD_CLK_MASK);
3897 _HVD_WriteWordMask(REG_TOP_HVD_IDB, TOP_CKG_HVD_IDB_480MHZ, TOP_CKG_HVD_IDB_CLK_MASK);
3898 _HVD_WriteWordMask(REG_TOP_HVD_AEC, TOP_CKG_HVD_AEC_320MHZ, TOP_CKG_HVD_AEC_CLK_MASK);
3899 _HVD_WriteWordMask(REG_TOP_VP8, TOP_CKG_VP8_320MHZ, TOP_CKG_VP8_CLK_MASK);
3900 break;
3901 }
3902 #endif
3903 case 384:
3904 {
3905 _HVD_WriteWordMask(REG_TOP_HVD, TOP_CKG_HVD_384MHZ, TOP_CKG_HVD_CLK_MASK);
3906 _HVD_WriteWordMask(REG_TOP_HVD_IDB, TOP_CKG_HVD_IDB_432MHZ, TOP_CKG_HVD_IDB_CLK_MASK);
3907 _HVD_WriteWordMask(REG_TOP_HVD_AEC, TOP_CKG_HVD_AEC_288MHZ, TOP_CKG_HVD_AEC_CLK_MASK);
3908 _HVD_WriteWordMask(REG_TOP_VP8, TOP_CKG_VP8_288MHZ, TOP_CKG_VP8_CLK_MASK);
3909 break;
3910 }
3911 case 345:
3912 {
3913 _HVD_WriteWordMask(REG_TOP_HVD, TOP_CKG_HVD_345MHZ, TOP_CKG_HVD_CLK_MASK);
3914 _HVD_WriteWordMask(REG_TOP_HVD_IDB, TOP_CKG_HVD_IDB_384MHZ, TOP_CKG_HVD_IDB_CLK_MASK);
3915 _HVD_WriteWordMask(REG_TOP_HVD_AEC, TOP_CKG_HVD_AEC_288MHZ, TOP_CKG_HVD_AEC_CLK_MASK);
3916 _HVD_WriteWordMask(REG_TOP_VP8, TOP_CKG_VP8_288MHZ, TOP_CKG_VP8_CLK_MASK);
3917 break;
3918 }
3919 case 320:
3920 {
3921 _HVD_WriteWordMask(REG_TOP_HVD, TOP_CKG_HVD_320MHZ, TOP_CKG_HVD_CLK_MASK);
3922 _HVD_WriteWordMask(REG_TOP_HVD_IDB, TOP_CKG_HVD_IDB_345MHZ, TOP_CKG_HVD_IDB_CLK_MASK);
3923 _HVD_WriteWordMask(REG_TOP_HVD_AEC, TOP_CKG_HVD_AEC_288MHZ, TOP_CKG_HVD_AEC_CLK_MASK);
3924 _HVD_WriteWordMask(REG_TOP_VP8, TOP_CKG_VP8_288MHZ, TOP_CKG_VP8_CLK_MASK);
3925 break;
3926 }
3927 case 288:
3928 {
3929 _HVD_WriteWordMask(REG_TOP_HVD, TOP_CKG_HVD_288MHZ, TOP_CKG_HVD_CLK_MASK);
3930 _HVD_WriteWordMask(REG_TOP_HVD_IDB, TOP_CKG_HVD_IDB_320MHZ, TOP_CKG_HVD_IDB_CLK_MASK);
3931 _HVD_WriteWordMask(REG_TOP_HVD_AEC, TOP_CKG_HVD_AEC_288MHZ, TOP_CKG_HVD_AEC_CLK_MASK);
3932 _HVD_WriteWordMask(REG_TOP_VP8, TOP_CKG_VP8_288MHZ, TOP_CKG_VP8_CLK_MASK);
3933 break;
3934 }
3935 case 240: // Mainz HVD5P, default use this
3936 {
3937 _HVD_WriteWordMask(REG_TOP_HVD, TOP_CKG_HVD_240MHZ, TOP_CKG_HVD_CLK_MASK);
3938 _HVD_WriteWordMask(REG_TOP_HVD_IDB, TOP_CKG_HVD_IDB_320MHZ, TOP_CKG_HVD_IDB_CLK_MASK);
3939 _HVD_WriteWordMask(REG_TOP_HVD_AEC, TOP_CKG_HVD_AEC_288MHZ, TOP_CKG_HVD_AEC_CLK_MASK);
3940 _HVD_WriteWordMask(REG_TOP_VP8, TOP_CKG_VP8_288MHZ, TOP_CKG_VP8_CLK_MASK);
3941 break;
3942 }
3943 case 216:
3944 {
3945 _HVD_WriteWordMask(REG_TOP_HVD, TOP_CKG_HVD_216MHZ, TOP_CKG_HVD_CLK_MASK);
3946 _HVD_WriteWordMask(REG_TOP_HVD_IDB, TOP_CKG_HVD_IDB_320MHZ, TOP_CKG_HVD_IDB_CLK_MASK);
3947 _HVD_WriteWordMask(REG_TOP_HVD_AEC, TOP_CKG_HVD_AEC_240MHZ, TOP_CKG_HVD_AEC_CLK_MASK);
3948 _HVD_WriteWordMask(REG_TOP_VP8, TOP_CKG_VP8_240MHZ, TOP_CKG_VP8_CLK_MASK);
3949 break;
3950 }
3951 case 172:
3952 {
3953 _HVD_WriteWordMask(REG_TOP_HVD, TOP_CKG_HVD_172MHZ, TOP_CKG_HVD_CLK_MASK);
3954 _HVD_WriteWordMask(REG_TOP_HVD_IDB, TOP_CKG_HVD_IDB_320MHZ, TOP_CKG_HVD_IDB_CLK_MASK);
3955 _HVD_WriteWordMask(REG_TOP_HVD_AEC, TOP_CKG_HVD_AEC_216MHZ, TOP_CKG_HVD_AEC_CLK_MASK);
3956 _HVD_WriteWordMask(REG_TOP_VP8, TOP_CKG_VP8_216MHZ, TOP_CKG_VP8_CLK_MASK);
3957 break;
3958 }
3959
3960 default:
3961 {
3962 _HVD_WriteWordMask(REG_TOP_HVD, TOP_CKG_HVD_240MHZ, TOP_CKG_HVD_CLK_MASK);
3963 _HVD_WriteWordMask(REG_TOP_HVD_IDB, TOP_CKG_HVD_IDB_320MHZ, TOP_CKG_HVD_IDB_CLK_MASK);
3964 _HVD_WriteWordMask(REG_TOP_HVD_AEC, TOP_CKG_HVD_AEC_288MHZ, TOP_CKG_HVD_AEC_CLK_MASK);
3965 _HVD_WriteWordMask(REG_TOP_VP8, TOP_CKG_VP8_288MHZ, TOP_CKG_VP8_CLK_MASK);
3966 break;
3967 }
3968 }
3969
3970 return;
3971 }
3972
HAL_HVD_EX_InitRegBase(MS_VIRT u32RegBase)3973 void HAL_HVD_EX_InitRegBase(MS_VIRT u32RegBase)
3974 {
3975 u32HVDRegOSBase = u32RegBase;
3976 HAL_VPU_EX_InitRegBase(u32RegBase);
3977 }
3978
HAL_HVD_EX_SetPreCtrlVariables(MS_U32 u32Id,MS_VIRT drvprectrl)3979 void HAL_HVD_EX_SetPreCtrlVariables(MS_U32 u32Id,MS_VIRT drvprectrl)
3980 {
3981 HVD_Pre_Ctrl *pHVDPreCtrl_in = (HVD_Pre_Ctrl*)drvprectrl;
3982 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
3983 pHVDHalContext->pHVDPreCtrl_Hal[u8Idx] = pHVDPreCtrl_in;
3984 }
3985
HAL_HVD_EX_InitVariables(MS_U32 u32Id)3986 HVD_Return HAL_HVD_EX_InitVariables(MS_U32 u32Id)
3987 {
3988 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
3989 HVD_ShareMem *pShm = NULL;
3990 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
3991 #if HVD_ENABLE_MVC
3992 MS_BOOL bMVC = HAL_HVD_EX_CheckMVCID(u32Id);
3993 #endif ///HVD_ENABLE_MVC
3994
3995 pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr = 0;
3996 pHVDHalContext->_stHVDStream[u8Idx].u32PTSByteCnt = 0;
3997 pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum = 0;
3998 pHVDHalContext->_stHVDStream[u8Idx].u32DispQIndex = 0;
3999 pHVDHalContext->_stHVDStream[u8Idx].u32FreeData = 0xFFFF;
4000 int i;
4001 for(i = 0; i<HAL_HVD_EX_MAX_SUPPORT_STREAM;i++)
4002 pHVDHalContext->_s32VDEC_BBU_TaskId[i] = -1;
4003 #if HVD_ENABLE_MVC
4004 if(bMVC)
4005 {
4006 pHVDHalContext->_stHVDStream[u8Idx+1].u32PTSPreWptr = 0;
4007 pHVDHalContext->_stHVDStream[u8Idx+1].u32PTSByteCnt = 0;
4008 pHVDHalContext->_stHVDStream[u8Idx+1].u32BBUWptr = 0;
4009 pHVDHalContext->_stHVDStream[u8Idx+1].u32BBUEntryNum = 0;
4010 }
4011 #endif ///HVD_ENABLE_MVC
4012
4013 // set a local copy of FW code address; assuming there is only one copy of FW,
4014 // no matter how many task will be created.
4015
4016 pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4017
4018 memset((void *) (pHVDHalContext->g_hvd_nal_fill_pair), 0, 16);
4019
4020 // global variables
4021 pHVDHalContext->u32HVDCmdTimeout = pCtrl->u32CmdTimeout;
4022
4023
4024 // pHVDHalContext->u32VPUClockType = (MS_U32) pCtrl->InitParams.u16DecoderClock;
4025 // pHVDHalContext->u32HVDClockType = (MS_U32) pCtrl->InitParams.u16DecoderClock;
4026 // Create mutex
4027 //_HAL_HVD_MutexCreate();
4028
4029 // fill HVD init variables
4030 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
4031 {
4032 pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum = VP8_BBU_DRAM_TBL_ENTRY;
4033 pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNumTH = VP8_BBU_DRAM_TBL_ENTRY_TH;
4034 }
4035 else
4036 #if HVD_ENABLE_RV_FEATURE
4037 if (((pCtrl->InitParams.u32ModeFlag) & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_RM)
4038 {
4039 pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum = RVD_BBU_DRAM_TBL_ENTRY;
4040 pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNumTH = RVD_BBU_DRAM_TBL_ENTRY_TH;
4041 #ifdef VDEC3_FB
4042 pHVDHalContext->u32RV_VLCTableAddr = 0;
4043 #else
4044 if (pCtrl->MemMap.u32FrameBufSize > RV_VLC_TABLE_SIZE)
4045 {
4046 pHVDHalContext->u32RV_VLCTableAddr = pCtrl->MemMap.u32FrameBufSize - RV_VLC_TABLE_SIZE;
4047 pCtrl->MemMap.u32FrameBufSize -= RV_VLC_TABLE_SIZE;
4048 }
4049 else
4050 {
4051 HVD_EX_MSG_ERR("HAL_HVD_EX_InitVariables failed: frame buffer size too small. FB:%x min:%x\n",
4052 (MS_U32) pCtrl->MemMap.u32FrameBufSize, (MS_U32) RV_VLC_TABLE_SIZE);
4053 return E_HVD_RETURN_INVALID_PARAMETER;
4054 }
4055 #endif
4056 }
4057 else
4058 #endif
4059 {
4060 pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum = HVD_BBU_DRAM_TBL_ENTRY;
4061 pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNumTH = HVD_BBU_DRAM_TBL_ENTRY_TH;
4062 #if HVD_ENABLE_MVC
4063 if(bMVC)
4064 {
4065 pHVDHalContext->_stHVDStream[u8Idx+1].u32BBUEntryNum = MVC_BBU_DRAM_TBL_ENTRY;
4066 pHVDHalContext->_stHVDStream[u8Idx+1].u32BBUEntryNumTH = MVC_BBU_DRAM_TBL_ENTRY_TH;
4067 }
4068 #endif /// HVD_ENABLE_MVC
4069 pHVDHalContext->u32RV_VLCTableAddr = 0;
4070 }
4071
4072 if ((HAL_VPU_EX_GetShareInfoAddr(u32Id) != 0xFFFFFFFF)
4073 || ((MS_VIRT) (pCtrl->MemMap.u32CodeBufVAddr <= (MS_VIRT) pShm) && ((MS_VIRT) pShm <= (pCtrl->MemMap.u32CodeBufVAddr + pCtrl->MemMap.u32CodeBufSize)))
4074 || ((MS_VIRT) (pCtrl->MemMap.u32BitstreamBufVAddr <= (MS_VIRT) pShm) && ((MS_VIRT) pShm <= (pCtrl->MemMap.u32BitstreamBufVAddr + pCtrl->MemMap.u32BitstreamBufSize)))
4075 || ((MS_VIRT) (pCtrl->MemMap.u32FrameBufVAddr <= (MS_VIRT) pShm) && ((MS_VIRT) pShm <= (pCtrl->MemMap.u32FrameBufVAddr + pCtrl->MemMap.u32FrameBufSize))))
4076 {
4077 HVD_EX_MSG_DBG("input memory: Code addr=0x%lx, Bits addr=0x%lx, FB addr=0x%lx, Miu1base=0x%lx, Miu2base=0x%lx\n",
4078 (unsigned long)pCtrl->MemMap.u32CodeBufAddr,
4079 (unsigned long)pCtrl->MemMap.u32FrameBufAddr,
4080 (unsigned long)pCtrl->MemMap.u32BitstreamBufAddr,
4081 (unsigned long)pCtrl->MemMap.u32MIU1BaseAddr,
4082 (unsigned long)pCtrl->MemMap.u32MIU2BaseAddr);
4083 #if HVD_ENABLE_MVC
4084 if(bMVC)
4085 {
4086 HVD_EX_Drv_Ctrl *pHVDCtrl_in_sub = _HVD_EX_GetDrvCtrl(u32Id+0x00011000);
4087 if (( (pHVDCtrl_in_sub->MemMap.u32BitstreamBufVAddr) <= (MS_VIRT)pShm)&& ( (MS_VIRT)pShm <= ((pHVDCtrl_in_sub->MemMap.u32BitstreamBufVAddr )+ pHVDCtrl_in_sub->MemMap.u32BitstreamBufSize)))
4088 {
4089 HVD_EX_MSG_DBG("[MVC] Bitstream2: 0x%lx.\n", (unsigned long) pCtrl->MemMap.u32BitstreamBufAddr);
4090 }
4091 }
4092 #endif /// HVD_ENABLE_MVC
4093
4094 return E_HVD_RETURN_SUCCESS;
4095 }
4096 else
4097 {
4098 HVD_EX_MSG_ERR("failed: Shm addr=0x%lx, Code addr=0x%lx, Bits addr=0x%lx, FB addr=0x%lx, Miu1base=0x%lx, Miu2base=0x%lx\n",
4099 (unsigned long)MS_PA2KSEG1((MS_VIRT) pShm),
4100 (unsigned long)pCtrl->MemMap.u32CodeBufAddr,
4101 (unsigned long)pCtrl->MemMap.u32FrameBufAddr,
4102 (unsigned long)pCtrl->MemMap.u32BitstreamBufAddr,
4103 (unsigned long)pCtrl->MemMap.u32MIU1BaseAddr,
4104 (unsigned long)pCtrl->MemMap.u32MIU2BaseAddr);
4105 return E_HVD_RETURN_INVALID_PARAMETER;
4106 }
4107 }
4108
4109 #ifdef VDEC3
HAL_HVD_EX_InitShareMem(MS_U32 u32Id,MS_BOOL bFWdecideFB,MS_BOOL bCMAUsed)4110 HVD_Return HAL_HVD_EX_InitShareMem(MS_U32 u32Id, MS_BOOL bFWdecideFB, MS_BOOL bCMAUsed)
4111 #else
4112 HVD_Return HAL_HVD_EX_InitShareMem(MS_U32 u32Id)
4113 #endif
4114 {
4115 MS_U32 u32Addr = 0;
4116 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
4117 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
4118 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4119
4120 MS_U32 u32TmpStartOffset;
4121 MS_U8 u8TmpMiuSel;
4122
4123
4124 memset(pShm, 0, sizeof(HVD_ShareMem));
4125
4126 _phy_to_miu_offset(u8TmpMiuSel, u32Addr, pCtrl->MemMap.u32FrameBufAddr);
4127
4128 pShm->u32FrameRate = pCtrl->InitParams.u32FrameRate;
4129 pShm->u32FrameRateBase = pCtrl->InitParams.u32FrameRateBase;
4130 #ifdef VDEC3
4131 if (bFWdecideFB || bCMAUsed)
4132 {
4133 pShm->u32FrameBufAddr = 0;
4134 pShm->u32FrameBufSize = 0;
4135 }
4136 else
4137 #endif
4138 {
4139 pShm->u32FrameBufAddr = u32Addr;
4140 pShm->u32FrameBufSize = pCtrl->MemMap.u32FrameBufSize;
4141 }
4142
4143 pShm->DispInfo.u16DispWidth = 1;
4144 pShm->DispInfo.u16DispHeight = 1;
4145 pShm->u32CodecType = pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK;
4146 pShm->u32CPUClock = pHVDHalContext->u32VPUClockType;
4147 pShm->u32UserCCIdxWrtPtr = 0xFFFFFFFF;
4148 pShm->DispFrmInfo.u32TimeStamp = 0xFFFFFFFF;
4149 //Chip info
4150 pShm->u16ChipID = E_MSTAR_CHIP_MAINZ;
4151 pShm->u16ChipECONum = pCtrl->InitParams.u16ChipECONum;
4152 // PreSetControl
4153 if (pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->bOnePendingBuffer)
4154 {
4155 pShm->u32PreSetControl |= PRESET_ONE_PENDING_BUFFER;
4156 }
4157 pShm->bUseTSPInBBUMode = FALSE;
4158
4159
4160 if ((pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.bEnable) &&
4161 ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_AVC))
4162 {
4163 pShm->u32PreSetControl |= PRESET_IAP_GN_SHARE_BW_MODE;
4164
4165 _phy_to_miu_offset(u8TmpMiuSel, u32Addr, pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.u32IapGnBufAddr);
4166
4167 pShm->u32IapGnBufAddr = u32Addr;
4168 pShm->u32IapGnBufSize = pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.u32IapGnBufSize;
4169
4170 }
4171
4172 pShm->u8CodecFeature &= ~E_VDEC_MFCODEC_MASK;
4173 switch(pHVDHalContext->pHVDPreCtrl_Hal[u8Idx]->eMFCodecMode)
4174 {
4175 case E_HVD_DEF_MFCODEC_DEFAULT:
4176 pShm->u8CodecFeature |= E_VDEC_MFCODEC_DEFAULT;
4177 break;
4178 case E_HVD_DEF_MFCODEC_FORCE_ENABLE:
4179 pShm->u8CodecFeature |= E_VDEC_MFCODEC_FORCE_ENABLE;
4180 break;
4181 case E_HVD_DEF_MFCODEC_FORCE_DISABLE:
4182 pShm->u8CodecFeature |= E_VDEC_MFCODEC_FORCE_DISABLE;
4183 break;
4184 default:
4185 pShm->u8CodecFeature |= E_VDEC_MFCODEC_DEFAULT;
4186 }
4187 pShm->u8CodecFeature &= ~E_VDEC_FORCE_8BITS_MASK;
4188 if (pHVDHalContext->pHVDPreCtrl_Hal[u8Idx]->bForce8BitMode)
4189 pShm->u8CodecFeature |= E_VDEC_FORCE_8BITS_MODE;
4190 pShm->u8CodecFeature &= ~E_VDEC_FORCE_MAIN_PROFILE_MASK;
4191 if (pHVDHalContext->pHVDPreCtrl_Hal[u8Idx]->eVdecFeature & 1)
4192 pShm->u8CodecFeature |= E_VDEC_FORCE_MAIN_PROFILE;
4193
4194 //pShm->bColocateBBUMode = pCtrl->InitParams.bColocateBBUMode;//johnny.ko
4195 //pShm->bColocateBBUMode = _stHVDPreSet[u8Idx].bColocateBBUMode;//johnny.ko
4196 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
4197 pShm->u8BBUMode = E_HVD_FW_AUTO_BBU_MODE;
4198 else
4199 pShm->u8BBUMode = E_HVD_DRV_AUTO_BBU_MODE;
4200 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_MAIN_MASK) == E_HVD_INIT_MAIN_FILE_RAW)
4201 {
4202 if((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_DUAL_ES_MASK) == E_HVD_INIT_DUAL_ES_ENABLE)
4203 {
4204 pShm->u8SrcMode = E_HVD_SRC_MODE_FILE_DUAL_ES;
4205 }
4206 else
4207 {
4208 pShm->u8SrcMode = E_HVD_SRC_MODE_FILE;
4209 }
4210 }
4211 else if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_MAIN_MASK) == E_HVD_INIT_MAIN_FILE_TS)
4212 {
4213 if((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_DUAL_ES_MASK) == E_HVD_INIT_DUAL_ES_ENABLE)
4214 {
4215 pShm->u8SrcMode = E_HVD_SRC_MODE_TS_FILE_DUAL_ES;
4216 }
4217 else
4218 {
4219 pShm->u8SrcMode = E_HVD_SRC_MODE_TS_FILE;
4220 }
4221 }
4222 else
4223 {
4224 pShm->u8SrcMode = E_HVD_SRC_MODE_DTV;
4225 }
4226 /* Mainz AVC does not support 4k2k; do not use IMI
4227 if (E_HVD_INIT_HW_AVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
4228 {
4229 pShm->bHVDIMIEnable = TRUE;
4230 }*/
4231
4232 if (pHVDHalContext->pHVDPreCtrl_Hal[u8Idx]->bEnableDynamicCMA)
4233 {
4234 pShm->u8CodecFeature |= E_VDEC_DYNAMIC_CMA_MODE;
4235 }
4236
4237
4238 if((E_HVD_INIT_HW_VP9 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) ||
4239 (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) ||
4240 (E_HVD_INIT_HW_AVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) ||
4241 (E_HVD_INIT_HW_AVS == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) ||
4242 (E_HVD_INIT_HW_RM == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) ||
4243 (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) ||
4244 (E_HVD_INIT_HW_MJPEG== (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) ||
4245 (E_HVD_INIT_HW_MVC== (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)))
4246 {
4247 pShm->bUseWbMvop = 1;
4248 }
4249
4250 if (E_HVD_INIT_HW_HEVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK) ||
4251 E_HVD_INIT_HW_AVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
4252 {
4253 pShm->u8CodecFeature |= E_VDEC_TEMPORAL_SCALABILITY_MODE;
4254 }
4255
4256 #if 1//From T4 and the later chips, QDMA can support the address more than MIU1 base.
4257
4258 #if (VPU_FORCE_MIU_MODE)
4259 _phy_to_miu_offset(u8TmpMiuSel, u32TmpStartOffset, pCtrl->MemMap.u32CodeBufAddr);
4260
4261 pShm->u32FWBaseAddr = u32TmpStartOffset;
4262
4263 #else
4264 ///TODO:
4265 /*
4266 _phy_to_miu_offset(u8TmpMiuSel, u32TmpStartOffset, pCtrl->MemMap.u32CodeBufAddr);
4267
4268 if(u8TmpMiuSel == E_CHIP_MIU_0)
4269 {
4270 pShm->u32FWBaseAddr = pCtrl->MemMap.u32CodeBufAddr;
4271 }
4272 else if(u8TmpMiuSel == E_CHIP_MIU_1)
4273 {
4274 pShm->u32FWBaseAddr = u32TmpStartOffset | 0x40000000; ///TODO:
4275 }
4276 else if(u8TmpMiuSel == E_CHIP_MIU_2)
4277 {
4278 pShm->u32FWBaseAddr = u32TmpStartOffset | 0x80000000; ///TODO:
4279 }
4280 */
4281 #endif
4282 //printf("<DBG>QDMA Addr = %lx <<<<<<<<<<<<<<<<<<<<<<<<\n",pShm->u32FWBaseAddr);
4283 #else
4284 u32Addr = pCtrl->MemMap.u32CodeBufAddr;
4285 if (u32Addr >= pCtrl->MemMap.u32MIU1BaseAddr)
4286 {
4287 u32Addr -= pCtrl->MemMap.u32MIU1BaseAddr;
4288 }
4289 pShm->u32FWBaseAddr = u32Addr;
4290 #endif
4291
4292 // RM only
4293 #if HVD_ENABLE_RV_FEATURE
4294 if ((((pCtrl->InitParams.u32ModeFlag) & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_RM)
4295 && (pCtrl->InitParams.pRVFileInfo != NULL))
4296 {
4297 MS_U32 i = 0;
4298
4299 for (i = 0; i < HVD_RM_INIT_PICTURE_SIZE_NUMBER; i++)
4300 {
4301 pShm->pRM_PictureSize[i].u16Width = pCtrl->InitParams.pRVFileInfo->ulPicSizes_w[i];
4302 pShm->pRM_PictureSize[i].u16Height = pCtrl->InitParams.pRVFileInfo->ulPicSizes_h[i];
4303 }
4304
4305 pShm->u8RM_Version = (MS_U8) pCtrl->InitParams.pRVFileInfo->RV_Version;
4306 pShm->u8RM_NumSizes = (MS_U8) pCtrl->InitParams.pRVFileInfo->ulNumSizes;
4307 #ifdef VDEC3_FB
4308 pShm->u32RM_VLCTableAddr = 0;
4309 // HVD_EX_MSG_DBG("===== Set pShm->u32RM_VLCTableAddr = 0 in InitShareMem\n");
4310 #else
4311 u32Addr = pCtrl->MemMap.u32FrameBufAddr + pHVDHalContext->u32RV_VLCTableAddr;
4312
4313 _phy_to_miu_offset(u8TmpMiuSel, u32TmpStartOffset, u32Addr);
4314 u32Addr = u32TmpStartOffset;
4315
4316 pShm->u32RM_VLCTableAddr = u32Addr;
4317 #endif
4318 }
4319 #endif
4320
4321 if ((E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
4322 && (pCtrl->InitParams.pRVFileInfo != NULL))
4323 {
4324 pShm->pRM_PictureSize[0].u16Width = pCtrl->InitParams.pRVFileInfo->ulPicSizes_w[0];
4325 pShm->pRM_PictureSize[0].u16Height = pCtrl->InitParams.pRVFileInfo->ulPicSizes_h[0];
4326 }
4327
4328 //if(pCtrl->InitParams.bColocateBBUMode)
4329 if(_stHVDPreSet[u8Idx].bColocateBBUMode)
4330 {
4331 pShm->u32ColocateBBUWritePtr = pShm->u32ColocateBBUReadPtr = pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr;
4332 }
4333
4334 #if SUPPORT_G2VP9
4335 // Enable SW detile support for G2 VP9
4336 if (E_HVD_INIT_HW_VP9 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
4337 {
4338 pShm->u8FrmPostProcSupport |= E_HVD_POST_PROC_DETILE;
4339 }
4340 #endif
4341
4342 HAL_HVD_EX_FlushMemory();
4343
4344 return E_HVD_RETURN_SUCCESS;
4345 }
4346 #ifdef VDEC3
HAL_HVD_EX_InitRegCPU(MS_U32 u32Id,MS_BOOL bFWdecideFB)4347 HVD_Return HAL_HVD_EX_InitRegCPU(MS_U32 u32Id, MS_BOOL bFWdecideFB)
4348 #else
4349 HVD_Return HAL_HVD_EX_InitRegCPU(MS_U32 u32Id)
4350 #endif
4351 {
4352 MS_BOOL bInitRet = FALSE;
4353
4354 #if 0
4355 // check MVD power on
4356 if (_HVD_Read2Byte(REG_TOP_MVD) & (TOP_CKG_MHVD_DIS))
4357 {
4358 HVD_EX_MSG_INF("HVD warning: MVD is not power on before HVD init.\n");
4359 _HVD_WriteWordMask(REG_TOP_MVD, 0, TOP_CKG_MHVD_DIS);
4360 HVD_Delay_ms(1);
4361 }
4362 // Check VPU power on
4363 if (_HVD_Read2Byte(REG_TOP_VPU) & (TOP_CKG_VPU_DIS))
4364 {
4365 HVD_EX_MSG_INF("HVD warning: VPU is not power on before HVD init.\n");
4366 _HVD_WriteWordMask(REG_TOP_VPU, 0, TOP_CKG_VPU_DIS);
4367 HVD_Delay_ms(1);
4368 }
4369 // check HVD power on
4370 if (_HVD_Read2Byte(REG_TOP_HVD) & (TOP_CKG_HVD_DIS))
4371 {
4372 HVD_EX_MSG_INF("HVD warning: HVD is not power on before HVD init.\n");
4373 HAL_HVD_EX_PowerCtrl(TRUE);
4374 HVD_Delay_ms(1);
4375 }
4376 #endif
4377 #ifdef VDEC3
4378 bInitRet = _HVD_EX_SetRegCPU(u32Id, bFWdecideFB);
4379 #else
4380 bInitRet = _HVD_EX_SetRegCPU(u32Id);
4381 #endif
4382 if (!bInitRet)
4383 {
4384 return E_HVD_RETURN_FAIL;
4385 }
4386
4387 bInitRet = HAL_HVD_EX_RstPTSCtrlVariable(u32Id);
4388
4389 if (!bInitRet)
4390 {
4391 return E_HVD_RETURN_FAIL;
4392 }
4393
4394 return E_HVD_RETURN_SUCCESS;
4395 }
4396
HAL_HVD_EX_SetHVDColBBUMode(MS_U32 u32Id,MS_BOOL bEnable)4397 HVD_Return HAL_HVD_EX_SetHVDColBBUMode(MS_U32 u32Id, MS_BOOL bEnable)
4398 {
4399 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
4400
4401 _stHVDPreSet[u8Idx].bColocateBBUMode = bEnable;
4402
4403 return E_HVD_RETURN_SUCCESS;
4404 }
4405
HAL_HVD_EX_SetData(MS_U32 u32Id,HVD_SetData u32type,MS_VIRT u32Data)4406 HVD_Return HAL_HVD_EX_SetData(MS_U32 u32Id, HVD_SetData u32type, MS_VIRT u32Data)
4407 {
4408 HVD_Return eRet = E_HVD_RETURN_SUCCESS;
4409 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4410 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
4411 MS_BOOL bMVC = FALSE;
4412 #if HVD_ENABLE_MVC
4413 bMVC = HAL_HVD_EX_CheckMVCID(u32Id);
4414 #endif
4415
4416 switch (u32type)
4417 {
4418 // share memory
4419 // switch
4420 case E_HVD_SDATA_FRAMEBUF_ADDR:
4421 {
4422 pShm->u32FrameBufAddr = u32Data;
4423 break;
4424 }
4425 case E_HVD_SDATA_FRAMEBUF_SIZE:
4426 {
4427 pShm->u32FrameBufSize = u32Data;
4428 break;
4429 }
4430 case E_HVD_SDATA_FRAMEBUF2_ADDR:
4431 {
4432 pShm->u32FrameBuf2Addr = u32Data;
4433 break;
4434 }
4435 case E_HVD_SDATA_MAX_CMA_SIZE:
4436 {
4437 pShm->u32MaxCMAFrameBufSize = u32Data;
4438 break;
4439 }
4440 case E_HVD_SDATA_MAX_CMA_SIZE2:
4441 {
4442 pShm->u32MaxCMAFrameBuf2Size = u32Data;
4443 break;
4444 }
4445 case E_HVD_SDATA_FRAMEBUF2_SIZE:
4446 {
4447 pShm->u32FrameBuf2Size = u32Data;
4448 break;
4449 }
4450 case E_HVD_SDATA_CMA_USED:
4451 {
4452 pShm->bCMA_Use = u32Data;
4453 break;
4454 }
4455 case E_HVD_SDATA_CMA_ALLOC_DONE:
4456 {
4457 pShm->bCMA_AllocDone = u32Data;
4458 break;
4459 }
4460 case E_HVD_SDATA_CMA_TWO_MIU:
4461 {
4462 pShm->bCMA_TwoMIU = u32Data;
4463 break;
4464 }
4465 case E_HVD_SDATA_RM_PICTURE_SIZES:
4466 {
4467 HVD_memcpy((volatile void *) pShm->pRM_PictureSize, (void *) ((HVD_PictureSize *) u32Data),
4468 HVD_RM_INIT_PICTURE_SIZE_NUMBER * sizeof(HVD_PictureSize));
4469 break;
4470 }
4471 case E_HVD_SDATA_ERROR_CODE:
4472 {
4473 pShm->u16ErrCode = (MS_U16) u32Data;
4474 break;
4475 }
4476 case E_HVD_SDATA_DISP_INFO_TH:
4477 {
4478 HVD_memcpy((volatile void *) &(pShm->DispThreshold), (void *) ((HVD_DISP_THRESHOLD *) u32Data),
4479 sizeof(HVD_DISP_THRESHOLD));
4480 break;
4481 }
4482 case E_HVD_SDATA_FW_FLUSH_STATUS:
4483 {
4484 pShm->u8FlushStatus = (MS_U8)u32Data;
4485 break;
4486 }
4487 case E_HVD_SDATA_DMX_FRAMERATE:
4488 {
4489 pShm->u32DmxFrameRate = u32Data;
4490 break;
4491 }
4492 case E_HVD_SDATA_DMX_FRAMERATEBASE:
4493 {
4494 pShm->u32DmxFrameRateBase = u32Data;
4495 break;
4496 }
4497 case E_HVD_SDATA_MIU_SEL:
4498 {
4499 pShm->u32VDEC_MIU_SEL = u32Data;
4500 break;
4501 }
4502 case E_HVD_SDATA_DV_XC_SHM_SIZE:
4503 {
4504 pShm->u32DolbyVisionXCShmSize = u32Data;
4505 break;
4506 }
4507 // SRAM
4508
4509 // Mailbox
4510 case E_HVD_SDATA_TRIGGER_DISP: // HVD HI mbox 0
4511 {
4512 if (u32Data != 0)
4513 {
4514 pShm->bEnableDispCtrl = TRUE;
4515 pShm->bIsTrigDisp = TRUE;
4516 }
4517 else
4518 {
4519 pShm->bEnableDispCtrl = FALSE;
4520 }
4521
4522 break;
4523 }
4524 case E_HVD_SDATA_GET_DISP_INFO_START:
4525 {
4526 pShm->bSpsChange = FALSE;
4527 break;
4528 }
4529 case E_HVD_SDATA_VIRTUAL_BOX_WIDTH:
4530 {
4531 pShm->u32VirtualBoxWidth = u32Data;
4532 break;
4533 }
4534 case E_HVD_SDATA_VIRTUAL_BOX_HEIGHT:
4535 {
4536 pShm->u32VirtualBoxHeight = u32Data;
4537 break;
4538 }
4539 case E_HVD_SDATA_DISPQ_STATUS_VIEW:
4540 {
4541 if (pShm->DispQueue[u32Data].u32Status == E_HVD_DISPQ_STATUS_INIT)
4542 {
4543 //printf("DispFrame DqPtr: %d\n", u32Data);
4544 pShm->DispQueue[u32Data].u32Status = E_HVD_DISPQ_STATUS_VIEW;
4545 }
4546 break;
4547 }
4548 case E_HVD_SDATA_DISPQ_STATUS_DISP:
4549 {
4550 if(!(pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide))
4551 {
4552 if (pShm->DispQueue[u32Data].u32Status == E_HVD_DISPQ_STATUS_VIEW)
4553 {
4554 //printf("DispFrame DqPtr: %ld\n", u32Data);
4555 pShm->DispQueue[u32Data].u32Status = E_HVD_DISPQ_STATUS_DISP;
4556 }
4557 }
4558 break;
4559 }
4560 case E_HVD_SDATA_DISPQ_STATUS_FREE:
4561 {
4562 if(pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide)
4563 {
4564 if (bMVC)
4565 {
4566 if (pHVDHalContext->_stHVDStream[u8Idx].u32FreeData == 0xFFFF)
4567 {
4568 //ALOGE("R1: %x", u32Data);
4569 pHVDHalContext->_stHVDStream[u8Idx].u32FreeData = u32Data;
4570 }
4571 else
4572 {
4573 //ALOGE("R2: %x", (u32Data << 16) | pHVDHalContext->_stHVDStream[u8Idx].u32FreeData);
4574 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_RELEASE_DISPQ, (u32Data << 16) | pHVDHalContext->_stHVDStream[u8Idx].u32FreeData);
4575 //pShm->FreeQueue[pShm->u16FreeQWtPtr] = (u32Data << 16) | pHVDHalContext->_stHVDStream[u8Idx].u32FreeData;
4576 //pShm->u16FreeQWtPtr = (pShm->u16FreeQWtPtr + 1) % HVD_DISP_QUEUE_MAX_SIZE;
4577 pHVDHalContext->_stHVDStream[u8Idx].u32FreeData = 0xFFFF;
4578 }
4579 }
4580 else
4581 {
4582 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_RELEASE_DISPQ, u32Data);
4583 }
4584 }
4585 else
4586 {
4587 if (pShm->DispQueue[u32Data].u32Status == E_HVD_DISPQ_STATUS_VIEW)
4588 {
4589 pShm->DispQueue[u32Data].u32Status = E_HVD_DISPQ_STATUS_FREE;
4590 }
4591 }
4592 break;
4593 }
4594 #if (HVD_ENABLE_IQMEM)
4595 case E_HVD_SDATA_FW_IQMEM_CTRL:
4596 {
4597 pShm->u8IQmemCtrl= (MS_U8)u32Data;
4598 break;
4599
4600 }
4601 case E_HVD_SDATA_FW_IQMEM_ENABLE_IF_SUPPORT:
4602 {
4603 if (u32Data != 0)
4604 {
4605 pShm->bIQmemEnableIfSupport= TRUE;
4606 }
4607 else
4608 {
4609 pShm->bIQmemEnableIfSupport= FALSE;
4610 }
4611
4612
4613 break;
4614
4615 }
4616 #endif
4617
4618 default:
4619 break;
4620 }
4621
4622 HAL_HVD_EX_FlushMemory();
4623
4624 return eRet;
4625 }
4626
HAL_HVD_EX_GetData_EX(MS_U32 u32Id,HVD_GetData eType)4627 MS_S64 HAL_HVD_EX_GetData_EX(MS_U32 u32Id, HVD_GetData eType)
4628 {
4629 MS_S64 s64Ret = 0;
4630 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4631
4632 HAL_HVD_EX_ReadMemory();
4633
4634 switch (eType)
4635 {
4636 case E_HVD_GDATA_PTS_STC_DIFF:
4637 s64Ret = pShm->s64PtsStcDiff;
4638 break;
4639 default:
4640 break;
4641 }
4642
4643 return s64Ret;
4644 }
4645
HAL_HVD_EX_GetData(MS_U32 u32Id,HVD_GetData eType)4646 MS_VIRT HAL_HVD_EX_GetData(MS_U32 u32Id, HVD_GetData eType)
4647 {
4648 MS_VIRT u32Ret = 0;
4649 //static MS_U64 u64pts_real = 0;
4650 MS_U64 u64pts_low = 0;
4651 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
4652 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4653
4654 HAL_HVD_EX_ReadMemory();
4655
4656 if(pShm == NULL)
4657 {
4658 HVD_EX_MSG_ERR("########## VDEC patch for Debug ###########\n");
4659 return 0x0;
4660 }
4661
4662 switch (eType)
4663 {
4664 // share memory
4665 // switch
4666 case E_HVD_GDATA_DISP_INFO_ADDR:
4667 {
4668 u32Ret = (MS_VIRT) (&pShm->DispInfo);
4669 break;
4670 }
4671 case E_HVD_GDATA_MIU_SEL:
4672 u32Ret = pShm->u32VDEC_MIU_SEL;
4673 break;
4674 case E_HVD_GDATA_FRAMEBUF_ADDR:
4675 u32Ret = pShm->u32FrameBufAddr;
4676 break;
4677 case E_HVD_GDATA_FRAMEBUF_SIZE:
4678 u32Ret = pShm->u32FrameBufSize;
4679 break;
4680 case E_HVD_GDATA_FRAMEBUF2_ADDR:
4681 u32Ret = pShm->u32FrameBuf2Addr;
4682 break;
4683 case E_HVD_GDATA_FRAMEBUF2_SIZE:
4684 u32Ret = pShm->u32FrameBuf2Size;
4685 break;
4686 case E_HVD_GDATA_CMA_ALLOC_DONE:
4687 u32Ret = pShm->bCMA_AllocDone;
4688 break;
4689 case E_HVD_GDATA_CMA_USED:
4690 u32Ret = pShm->bCMA_Use;
4691 break;
4692 // report
4693 case E_HVD_GDATA_PTS:
4694 {
4695 u32Ret = pShm->DispFrmInfo.u32TimeStamp;
4696 break;
4697 }
4698 case E_HVD_GDATA_U64PTS:
4699 {
4700 u64pts_low = (MS_U64)(pShm->DispFrmInfo.u32TimeStamp);
4701 pHVDHalContext->u64pts_real = (MS_U64)(pShm->DispFrmInfo.u32ID_H);
4702 pHVDHalContext->u64pts_real = (pHVDHalContext->u64pts_real<<32)|u64pts_low;
4703 u32Ret = (MS_VIRT)(&(pHVDHalContext->u64pts_real));
4704 break;
4705 }
4706 case E_HVD_GDATA_U64PTS_PRE_PARSE:
4707 {
4708 u64pts_low = (MS_U64)(pShm->u32WRPTR_PTS_LOW);
4709 pHVDHalContext->u64pts_real = (MS_U64)(pShm->u32WRPTR_PTS_HIGH);
4710 pHVDHalContext->u64pts_real = (pHVDHalContext->u64pts_real<<32)|u64pts_low;
4711 u32Ret = (MS_VIRT)(&(pHVDHalContext->u64pts_real));
4712 break;
4713 }
4714 case E_HVD_GDATA_DECODE_CNT:
4715 {
4716 u32Ret = pShm->u32DecodeCnt;
4717 break;
4718 }
4719 case E_HVD_GDATA_DATA_ERROR_CNT:
4720 {
4721 u32Ret = pShm->u32DataErrCnt;
4722 break;
4723 }
4724 case E_HVD_GDATA_DEC_ERROR_CNT:
4725 {
4726 u32Ret = pShm->u32DecErrCnt;
4727 break;
4728 }
4729 case E_HVD_GDATA_ERROR_CODE:
4730 {
4731 u32Ret = (MS_U32) (pShm->u16ErrCode);
4732 break;
4733 }
4734 case E_HVD_GDATA_VPU_IDLE_CNT:
4735 {
4736 u32Ret = pShm->u32VPUIdleCnt;
4737 break;
4738 }
4739 case E_HVD_GDATA_DISP_FRM_INFO:
4740 {
4741 u32Ret = (MS_VIRT) (&pShm->DispFrmInfo);
4742 break;
4743 }
4744 case E_HVD_GDATA_DEC_FRM_INFO:
4745 {
4746 u32Ret = (MS_VIRT) (&pShm->DecoFrmInfo);
4747 break;
4748 }
4749 case E_HVD_GDATA_ES_LEVEL:
4750 {
4751 u32Ret = (MS_U32) (_HVD_EX_GetESLevel(u32Id));
4752 break;
4753 }
4754 #if HVD_ENABLE_MVC
4755 case E_HVD_GDATA_DISP_FRM_INFO_SUB:
4756 {
4757 u32Ret= (MS_VIRT) (&(pShm->DispFrmInfo_Sub));
4758 break;
4759 }
4760 case E_HVD_GDATA_DEC_FRM_INFO_SUB:
4761 {
4762 u32Ret= (MS_VIRT) (&(pShm->DecoFrmInfo_Sub));
4763 break;
4764 }
4765 #endif
4766
4767 // user data
4768 case E_HVD_GDATA_USERDATA_WPTR:
4769 {
4770 u32Ret = (MS_U32) (pShm->u32UserCCIdxWrtPtr);
4771 break;
4772 }
4773 case E_HVD_GDATA_USERDATA_IDX_TBL_ADDR:
4774 {
4775 u32Ret = (MS_VIRT) (pShm->u8UserCCIdx);
4776 break;
4777 }
4778 case E_HVD_GDATA_USERDATA_PACKET_TBL_ADDR:
4779 {
4780 u32Ret = (MS_VIRT) (pShm->u32UserCCBase);
4781 break;
4782 }
4783 case E_HVD_GDATA_USERDATA_PACKET_SIZE:
4784 {
4785 u32Ret = (MS_U32) (sizeof(DTV_BUF_type));
4786 break;
4787 }
4788 case E_HVD_GDATA_USERDATA_IDX_TBL_SIZE:
4789 {
4790 u32Ret = (MS_U32) (USER_CC_IDX_SIZE);
4791 break;
4792 }
4793 case E_HVD_GDATA_USERDATA_PACKET_TBL_SIZE:
4794 {
4795 u32Ret = (MS_U32) (USER_CC_DATA_SIZE);
4796 break;
4797 }
4798 // report - modes
4799 case E_HVD_GDATA_IS_SHOW_ERR_FRM:
4800 {
4801 u32Ret = pShm->ModeStatus.bIsShowErrFrm;
4802 break;
4803 }
4804 case E_HVD_GDATA_IS_REPEAT_LAST_FIELD:
4805 {
4806 u32Ret = pShm->ModeStatus.bIsRepeatLastField;
4807 break;
4808 }
4809 case E_HVD_GDATA_IS_ERR_CONCEAL:
4810 {
4811 u32Ret = pShm->ModeStatus.bIsErrConceal;
4812 break;
4813 }
4814 case E_HVD_GDATA_IS_SYNC_ON:
4815 {
4816 u32Ret = pShm->ModeStatus.bIsSyncOn;
4817 break;
4818 }
4819 case E_HVD_GDATA_IS_PLAYBACK_FINISH:
4820 {
4821 u32Ret = pShm->ModeStatus.bIsPlaybackFinish;
4822 break;
4823 }
4824 case E_HVD_GDATA_SYNC_MODE:
4825 {
4826 u32Ret = pShm->ModeStatus.u8SyncType;
4827 break;
4828 }
4829 case E_HVD_GDATA_SKIP_MODE:
4830 {
4831 u32Ret = pShm->ModeStatus.u8SkipMode;
4832 break;
4833 }
4834 case E_HVD_GDATA_DROP_MODE:
4835 {
4836 u32Ret = pShm->ModeStatus.u8DropMode;
4837 break;
4838 }
4839 case E_HVD_GDATA_DISPLAY_DURATION:
4840 {
4841 u32Ret = pShm->ModeStatus.s8DisplaySpeed;
4842 break;
4843 }
4844 case E_HVD_GDATA_FRC_MODE:
4845 {
4846 u32Ret = pShm->ModeStatus.u8FrcMode;
4847 break;
4848 }
4849 case E_HVD_GDATA_NEXT_PTS:
4850 {
4851 u32Ret = pShm->u32NextPTS;
4852 break;
4853 }
4854 case E_HVD_GDATA_DISP_Q_SIZE:
4855 {
4856 u32Ret = pShm->u16DispQSize;
4857 break;
4858 }
4859 case E_HVD_GDATA_DISP_Q_PTR:
4860 {
4861 u32Ret = (MS_U32) pHVDHalContext->_u16DispQPtr;
4862 break;
4863 }
4864 case E_HVD_GDATA_NEXT_DISP_FRM_INFO:
4865 {
4866 u32Ret = (MS_VIRT) _HVD_EX_GetNextDispFrame(u32Id);
4867 break;
4868 }
4869 case E_HVD_GDATA_NEXT_DISP_FRM_INFO_EXT:
4870 {
4871 u32Ret = (MS_VIRT) _HVD_EX_GetNextDispFrameExt(u32Id);
4872 break;
4873 }
4874 case E_HVD_GDATA_REAL_FRAMERATE:
4875 {
4876 // return VPS/VUI timing info framerate, and 0 if timing info not exist
4877 u32Ret = pShm->u32RealFrameRate;
4878 break;
4879 }
4880 case E_HVD_GDATA_IS_ORI_INTERLACE_MODE:
4881 u32Ret=(MS_U32)pShm->DispInfo.u8IsOriginInterlace;
4882 break;
4883 case E_HVD_GDATA_FRM_PACKING_SEI_DATA:
4884 u32Ret=((MS_VIRT)(pShm->u32Frm_packing_arr_data_addr));
4885 break;
4886 case E_HVD_GDATA_DISPLAY_COLOUR_VOLUME_SEI_DATA:
4887 u32Ret=((MS_U32)(pShm->u32DisplayColourVolume_addr));
4888 break;
4889 case E_HVD_GDATA_CONTENT_LIGHT_LEVEL_INFO:
4890 u32Ret=((MS_U32)(pShm->u32ContentLightLevel_addr));
4891 break;
4892 case E_HVD_GDATA_TYPE_FRAME_MBS_ONLY_FLAG:
4893 u32Ret=((MS_U32)(pShm->u8FrameMbsOnlyFlag));
4894 break;
4895 case E_HVD_GDATA_FW_STATUS_FLAG:
4896 u32Ret=((MS_U32)(pShm->u32FWStatusFlag));
4897 break;
4898
4899 // internal control
4900 case E_HVD_GDATA_IS_1ST_FRM_RDY:
4901 {
4902 u32Ret = pShm->bIs1stFrameRdy;
4903 break;
4904 }
4905 case E_HVD_GDATA_IS_I_FRM_FOUND:
4906 {
4907 u32Ret = pShm->bIsIFrmFound;
4908 break;
4909 }
4910 case E_HVD_GDATA_IS_SYNC_START:
4911 {
4912 u32Ret = pShm->bIsSyncStart;
4913 break;
4914 }
4915 case E_HVD_GDATA_IS_SYNC_REACH:
4916 {
4917 u32Ret = pShm->bIsSyncReach;
4918 break;
4919 }
4920 case E_HVD_GDATA_FW_VERSION_ID:
4921 {
4922 u32Ret = pShm->u32FWVersionID;
4923 break;
4924 }
4925 case E_HVD_GDATA_FW_IF_VERSION_ID:
4926 {
4927 u32Ret = pShm->u32FWIfVersionID;
4928 break;
4929 }
4930 case E_HVD_GDATA_BBU_Q_NUMB:
4931 {
4932 u32Ret = _HVD_EX_GetBBUQNumb(u32Id);
4933 break;
4934 }
4935 case E_HVD_GDATA_DEC_Q_NUMB:
4936 {
4937 u32Ret = pShm->u16DecQNumb;
4938 break;
4939 }
4940 case E_HVD_GDATA_DISP_Q_NUMB:
4941 {
4942 u32Ret = pShm->u16DispQNumb;
4943 break;
4944 }
4945 case E_HVD_GDATA_PTS_Q_NUMB:
4946 {
4947 u32Ret = _HVD_EX_GetPTSQNumb(u32Id);
4948 break;
4949 }
4950 case E_HVD_GDATA_FW_INIT_DONE:
4951 {
4952 u32Ret = pShm->bInitDone;
4953 break;
4954 }
4955 // debug
4956 case E_HVD_GDATA_SKIP_CNT:
4957 {
4958 u32Ret = pShm->u32SkipCnt;
4959 break;
4960 }
4961 case E_HVD_GDATA_GOP_CNT:
4962 {
4963 u32Ret = pShm->u32DropCnt;
4964 break;
4965 }
4966 case E_HVD_GDATA_DISP_CNT:
4967 {
4968 u32Ret = pShm->u32DispCnt;
4969 break;
4970 }
4971 case E_HVD_GDATA_DROP_CNT:
4972 {
4973 u32Ret = pShm->u32DropCnt;
4974 break;
4975 }
4976 case E_HVD_GDATA_DISP_STC:
4977 {
4978 u32Ret = pShm->u32DispSTC;
4979 break;
4980 }
4981 case E_HVD_GDATA_VSYNC_CNT:
4982 {
4983 u32Ret = pShm->u32VsyncCnt;
4984 break;
4985 }
4986 case E_HVD_GDATA_MAIN_LOOP_CNT:
4987 {
4988 u32Ret = pShm->u32MainLoopCnt;
4989 break;
4990 }
4991
4992 // AVC
4993 case E_HVD_GDATA_AVC_LEVEL_IDC:
4994 {
4995 u32Ret = pShm->u16AVC_SPS_LevelIDC;
4996 break;
4997 }
4998 case E_HVD_GDATA_AVC_LOW_DELAY:
4999 {
5000 u32Ret = pShm->u8AVC_SPS_LowDelayHrdFlag;
5001 break;
5002 }
5003 case E_HVD_GDATA_AVC_VUI_DISP_INFO:
5004 {
5005 u32Ret = _HVD_EX_GetVUIDispInfo(u32Id);
5006 break;
5007 }
5008 case E_HVD_GDATA_FW_FLUSH_STATUS:
5009 {
5010 u32Ret = (MS_U32) (pShm->u8FlushStatus);
5011 break;
5012 }
5013 case E_HVD_GDATA_FW_CODEC_TYPE:
5014 {
5015 u32Ret = pShm->u32CodecType;
5016 break;
5017 }
5018 case E_HVD_GDATA_FW_ES_BUF_STATUS:
5019 {
5020 u32Ret = (MS_U32)pShm->u8ESBufStatus;
5021 break;
5022 }
5023 case E_HVD_GDATA_VIDEO_FULL_RANGE_FLAG:
5024 {
5025 if(pShm->u32CodecMiscInfo & E_VIDEO_FULL_RANGE)
5026 {
5027 u32Ret = 1;
5028 }
5029 else
5030 {
5031 u32Ret = 0;
5032 }
5033 break;
5034 }
5035
5036 // SRAM
5037
5038 // Mailbox
5039 case E_HVD_GDATA_FW_STATE: // HVD RISC MBOX 0 (esp. FW init done)
5040 {
5041 u32Ret = pShm->u32FwState;
5042 break;
5043 }
5044 case E_HVD_GDATA_IS_DISP_INFO_UNCOPYED:
5045 {
5046 u32Ret = pShm->bSpsChange;
5047 break;
5048 }
5049 case E_HVD_GDATA_IS_DISP_INFO_CHANGE: // HVD RISC MBOX 1 (rdy only)
5050 {
5051 u32Ret = pShm->bSpsChange;
5052
5053 if (pShm->bSpsChange &&
5054 !(pShm->u8FrmPostProcSupport & E_HVD_POST_PROC_DETILE) &&
5055 IS_TASK_ALIVE(pHVDHalContext->_stHVDStream[_HVD_EX_GetStreamIdx(u32Id)].s32HvdPpTaskId))
5056 {
5057 _HVD_EX_PpTask_Delete(&pHVDHalContext->_stHVDStream[_HVD_EX_GetStreamIdx(u32Id)]);
5058 }
5059
5060 break;
5061 }
5062 case E_HVD_GDATA_HVD_ISR_STATUS: // HVD RISC MBOX 1 (value only)
5063 {
5064 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
5065
5066 if ((pCtrl->HVDISRCtrl.u32IntCount != pShm->u32IntCount) && pShm->u32FwInfo) // fetch ISR status
5067 {
5068 u32Ret = pShm->u32FwInfo;
5069 pCtrl->HVDISRCtrl.u32IntCount = pShm->u32IntCount;
5070 }
5071 break;
5072 }
5073 case E_HVD_GDATA_IS_FRAME_SHOWED: // HVD HI mbox 0 ( showed: rdy cleared ; not show: rdy enable )
5074 {
5075 if (pShm->bIsTrigDisp) // not clear yet
5076 {
5077 u32Ret = FALSE;
5078 }
5079 else
5080 {
5081 u32Ret = TRUE;
5082 }
5083 break;
5084 }
5085 case E_HVD_GDATA_ES_READ_PTR:
5086 {
5087 u32Ret = _HVD_EX_GetESReadPtr(u32Id, FALSE);
5088 break;
5089 }
5090 case E_HVD_GDATA_ES_WRITE_PTR:
5091 {
5092 u32Ret = _HVD_EX_GetESWritePtr(u32Id);
5093 break;
5094 }
5095 case E_HVD_GDATA_BBU_READ_PTR:
5096 {
5097 u32Ret = _HVD_EX_GetBBUReadptr(u32Id);
5098 break;
5099 }
5100 case E_HVD_GDATA_BBU_WRITE_PTR:
5101 {
5102 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
5103 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
5104 {
5105 u32Ret = pHVDHalContext->u32VP8BBUWptr;
5106 }
5107 else
5108 {
5109 u32Ret = pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr;
5110 }
5111 break;
5112 }
5113 case E_HVD_GDATA_BBU_WRITE_PTR_FIRED:
5114 {
5115 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
5116
5117 u32Ret = pCtrl->u32BBUWptr_Fired;
5118
5119 break;
5120 }
5121 case E_HVD_GDATA_VPU_PC_CNT:
5122 {
5123 u32Ret = _HVD_EX_GetPC();
5124 break;
5125 }
5126 case E_HVD_GDATA_ES_QUANTITY:
5127 {
5128 u32Ret=_HVD_EX_GetESQuantity(u32Id);
5129 break;
5130 }
5131
5132
5133 // FW def
5134 case E_HVD_GDATA_FW_MAX_DUMMY_FIFO: // AVC: 256Bytes AVS: 2kB RM:???
5135 u32Ret = HVD_MAX3(HVD_FW_AVC_DUMMY_FIFO, HVD_FW_AVS_DUMMY_FIFO, HVD_FW_RM_DUMMY_FIFO);
5136 break;
5137
5138 case E_HVD_GDATA_FW_AVC_MAX_VIDEO_DELAY:
5139 u32Ret = HVD_FW_AVC_MAX_VIDEO_DELAY;
5140 break;
5141 case E_HVD_GDATA_FW_BBU_TOTAL_TBL_ENTRY:
5142 u32Ret = pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNumTH;
5143 break;
5144 case E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB:
5145 u32Ret = pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum;
5146 break;
5147 case E_HVD_GDATA_FW_PTS_TOTAL_ENTRY_NUMB:
5148 u32Ret = MAX_PTS_TABLE_SIZE;
5149 break;
5150 case E_HVD_GDATA_FW_DUMMY_WRITE_ADDR:
5151 u32Ret = (MS_VIRT) pShm->u32HVD_DUMMY_WRITE_ADDR;
5152 break;
5153 case E_HVD_GDATA_FW_DS_BUF_ADDR:
5154 u32Ret = (MS_VIRT) pShm->u32HVD_DYNAMIC_SCALING_ADDR;
5155 break;
5156 case E_HVD_GDATA_FW_DS_BUF_SIZE:
5157 u32Ret = pShm->u32DSBuffSize; //3k or 6k
5158 break;
5159 case E_HVD_GDATA_FW_DS_VECTOR_DEPTH:
5160 u32Ret = pShm->u8DSBufferDepth; //16 or 24 or 32
5161 break;
5162 case E_HVD_GDATA_FW_DS_INFO_ADDR:
5163 u32Ret = (MS_VIRT) pShm->u32HVD_SCALER_INFO_ADDR;
5164 break;
5165 case E_HVD_GDATA_FW_DS_IS_ENABLED:
5166 {
5167 if (pShm->bDSIsRunning)
5168 {
5169 u32Ret = TRUE;
5170 }
5171 else
5172 {
5173 u32Ret = FALSE;
5174 }
5175 break;
5176 }
5177 #if (HVD_ENABLE_IQMEM)
5178 case E_HVD_GDATA_FW_IQMEM_CTRL:
5179 {
5180
5181 u32Ret = (MS_U32)pShm->u8IQmemCtrl;
5182
5183 break;
5184 }
5185 case E_HVD_GDATA_FW_IS_IQMEM_SUPPORT:
5186 {
5187 if(pShm->bIsIQMEMSupport){
5188 u32Ret = TRUE;
5189 }
5190 else{
5191
5192 u32Ret = FALSE;
5193 }
5194
5195 break;
5196 }
5197 #endif
5198 case E_HVD_GDATA_TYPE_IS_LEAST_DISPQ_SIZE:
5199 u32Ret = ((MS_U32)(pShm->bIsLeastDispQSize));
5200 break;
5201 case E_HVD_GDATA_FIELD_PIC_FLAG:
5202 u32Ret = ((MS_U32)(pShm->u8FieldPicFlag));
5203 break;
5204 case E_HVD_GDATA_TS_SEAMLESS_STATUS:
5205 u32Ret = pShm->u32SeamlessTSStatus;
5206 break;
5207 case E_HVD_GDATA_HVD_HW_MAX_PIXEL:
5208 u32Ret = (MS_U32)(_HAL_EX_GetHwMaxPixel(u32Id)/1000);
5209 break;
5210 #ifdef VDEC3
5211 case E_HVD_GDATA_FW_VBBU_ADDR:
5212 u32Ret = (MS_VIRT) pShm->u32HVD_VBBU_DRAM_ST_ADDR;
5213 break;
5214 #endif
5215 default:
5216 break;
5217 }
5218 return u32Ret;
5219 }
5220
HAL_HVD_EX_SetCmd(MS_U32 u32Id,HVD_User_Cmd eUsrCmd,MS_U32 u32CmdArg)5221 HVD_Return HAL_HVD_EX_SetCmd(MS_U32 u32Id, HVD_User_Cmd eUsrCmd, MS_U32 u32CmdArg)
5222 {
5223 HVD_Return eRet = E_HVD_RETURN_SUCCESS;
5224 MS_U32 u32Cmd = (MS_U32) eUsrCmd;
5225 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
5226
5227 _HAL_HVD_Entry();
5228
5229 // check if old SVD cmds
5230 if (u32Cmd < E_HVD_CMD_SVD_BASE)
5231 {
5232 HVD_EX_MSG_ERR("Old SVD FW cmd(%x %x) used in HVD.\n", u32Cmd, u32CmdArg);
5233
5234 _HAL_HVD_Return(E_HVD_RETURN_INVALID_PARAMETER);
5235 }
5236
5237 if(u32Cmd == E_HVD_CMD_ENABLE_DISP_OUTSIDE)
5238 {
5239 pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide = (MS_BOOL)u32CmdArg;
5240 }
5241
5242 if (pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide)
5243 {
5244 if (u32Cmd == E_HVD_CMD_FLUSH)
5245 pHVDHalContext->_stHVDStream[u8Idx].u32DispQIndex = 0;
5246 }
5247
5248 if (u32Cmd == E_HVD_CMD_FLUSH &&
5249 IS_TASK_ALIVE(pHVDHalContext->_stHVDStream[u8Idx].s32HvdPpTaskId) &&
5250 pHVDHalContext->_stHVDStream[u8Idx].ePpTaskState == E_HAL_HVD_STATE_RUNNING)
5251 {
5252 pHVDHalContext->_stHVDStream[u8Idx].ePpTaskState = E_HAL_HVD_STATE_PAUSING;
5253 while (pHVDHalContext->_stHVDStream[u8Idx].ePpTaskState != E_HAL_HVD_STATE_PAUSE_DONE)
5254 {
5255 _HAL_HVD_Release();
5256 HVD_Delay_ms(1);
5257 _HAL_HVD_Entry();
5258 }
5259 }
5260
5261 HVD_EX_MSG_DBG("cmd=0x%x, arg=0x%x\n", u32Cmd, u32CmdArg);
5262
5263 eRet = _HVD_EX_SendCmd(u32Id, u32Cmd, u32CmdArg);
5264
5265 _HAL_HVD_Return(eRet);
5266 }
5267
HAL_HVD_EX_DeInit(MS_U32 u32Id)5268 HVD_Return HAL_HVD_EX_DeInit(MS_U32 u32Id)
5269 {
5270 HVD_Return eRet = E_HVD_RETURN_FAIL;
5271 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
5272 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
5273 MS_U32 u32Timeout = HVD_GetSysTime_ms() + 3000;
5274 MS_U8 u8MiuSel;
5275 MS_U32 u32StartOffset;
5276 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
5277
5278 #if HVD_ENABLE_TIME_MEASURE
5279 MS_U32 ExitTimeCnt = 0;
5280 ExitTimeCnt = HVD_GetSysTime_ms();
5281 #endif
5282
5283 pCtrl->MemMap.u32CodeBufVAddr = MS_PA2KSEG1((MS_PHY)pCtrl->MemMap.u32CodeBufAddr);
5284
5285 eRet = HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PAUSE, 0);
5286
5287 if (E_HVD_RETURN_SUCCESS != eRet)
5288 {
5289 HVD_EX_MSG_ERR("HVD fail to PAUSE %d\n", eRet);
5290 }
5291
5292 eRet = HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_STOP, 0);
5293
5294 if (E_HVD_RETURN_SUCCESS != eRet)
5295 {
5296 HVD_EX_MSG_ERR("HVD fail to STOP %d\n", eRet);
5297 }
5298
5299 // check FW state to make sure it's STOP DONE
5300 while (E_HVD_FW_STOP_DONE != (HVD_FW_State) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_STATE))
5301 {
5302 if (HVD_GetSysTime_ms() > u32Timeout)
5303 {
5304 HVD_EX_MSG_ERR("FW stop timeout, pc = 0x%x\n", HAL_VPU_EX_GetProgCnt());
5305
5306 //return E_HVD_RETURN_TIMEOUT;
5307 eRet = E_HVD_RETURN_TIMEOUT;
5308 break;
5309 }
5310 }
5311
5312 if (pShm->u32VdecPlusDecCnt+pShm->u32VdecPlusDropCnt)
5313 {
5314 HVD_EX_MSG_INF("VDEC PLUS: DropRatio %d, Drop:0.%d (%d), Dec:0.%d (%d), Disp:0.%d\n",
5315 pShm->u8VdecPlusDropRatio,
5316 100*pShm->u32VdecPlusDropCnt/(pShm->u32VdecPlusDecCnt+pShm->u32VdecPlusDropCnt),
5317 pShm->u32VdecPlusDropCnt,
5318 100*pShm->u32VdecPlusDecCnt/(pShm->u32VdecPlusDecCnt+pShm->u32VdecPlusDropCnt),
5319 pShm->u32VdecPlusDecCnt,
5320 100*pShm->u32VdecPlusDispPicCnt/(pShm->u32VdecPlusDecCnt+pShm->u32VdecPlusDropCnt));
5321 }
5322 else
5323 {
5324 HVD_EX_MSG_INF("VDEC PLUS DISABLE: DropRatio %d, Drop: %d, Dec: %d, Disp: %d\n",
5325 pShm->u8VdecPlusDropRatio,
5326 pShm->u32VdecPlusDropCnt,
5327 pShm->u32VdecPlusDecCnt,
5328 pShm->u32VdecPlusDispPicCnt);
5329 }
5330
5331 VPU_EX_FWCodeCfg fwCfg;
5332 VPU_EX_TaskInfo taskInfo;
5333 VPU_EX_NDecInitPara nDecInitPara;
5334
5335 nDecInitPara.pFWCodeCfg = &fwCfg;
5336 nDecInitPara.pTaskInfo = &taskInfo;
5337
5338 fwCfg.u32DstAddr = pCtrl->MemMap.u32CodeBufVAddr;
5339 fwCfg.u8SrcType = E_HVD_FW_INPUT_SOURCE_NONE;
5340
5341 taskInfo.u32Id = u32Id;
5342 taskInfo.eDecType = E_VPU_EX_DECODER_HVD;
5343 taskInfo.eVpuId = (HAL_VPU_StreamId) (0xFF & u32Id);
5344
5345 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV)
5346 {
5347 taskInfo.eSrcType = E_VPU_EX_INPUT_FILE;
5348 }
5349 else
5350 {
5351 taskInfo.eSrcType = E_VPU_EX_INPUT_TSP;
5352 }
5353
5354 if(HAL_VPU_EX_TaskDelete(u32Id, &nDecInitPara) != TRUE)
5355 {
5356 HVD_EX_MSG_ERR("HAL_VPU_EX_TaskDelete fail\n");
5357 }
5358
5359 /* clear es buffer */
5360 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_TSP)
5361 {
5362 //printf("Clear ES buffer\n");
5363
5364 memset((void *) pCtrl->MemMap.u32BitstreamBufVAddr, 0, MIN(128, pCtrl->MemMap.u32BitstreamBufSize));
5365 }
5366
5367 //_HAL_HVD_MutexDelete();
5368
5369 #if HVD_ENABLE_TIME_MEASURE
5370 HVD_EX_MSG_DBG("HVD Stop Time(Wait FW):%d\n", HVD_GetSysTime_ms() - ExitTimeCnt);
5371 #endif
5372
5373 pHVDHalContext->_stHVDStream[u8Idx].bUsed = FALSE;
5374 #ifndef VDEC3
5375 // reset bbu wptr
5376 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV)
5377 {
5378 if(TRUE == HAL_VPU_EX_HVDInUsed())
5379 {
5380 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))//apple
5381 {
5382 _HVD_EX_SetBBUWriteptr(u32Id, _HVD_EX_GetBBUReadptr(u32Id));
5383 pHVDHalContext->u32VP8BBUWptr = _HVD_EX_GetBBUReadptr(u32Id);
5384 }
5385 else
5386 {
5387 if(!_stHVDPreSet[u8Idx].bColocateBBUMode)
5388 {
5389 _HVD_EX_SetBBUWriteptr(u32Id, _HVD_EX_GetBBUReadptr(u32Id));
5390 }
5391 pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr = _HVD_EX_GetBBUReadptr(u32Id);
5392 }
5393 }
5394 else
5395 {
5396 pHVDHalContext->_stHVDStream[0].u32BBUWptr = 0; //main
5397 pHVDHalContext->_stHVDStream[1].u32BBUWptr = 0; //sub
5398 pHVDHalContext->u32VP8BBUWptr = 0; //VP8
5399 if (E_HVD_INIT_HW_AVC == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
5400 {
5401 if(!_stHVDPreSet[u8Idx].bColocateBBUMode)
5402 {
5403 _HVD_EX_ResetMainSubBBUWptr(u32Id);
5404 }
5405 }
5406 else
5407 {
5408 _HVD_EX_ResetMainSubBBUWptr(u32Id);
5409 }
5410 }
5411 }
5412 #endif
5413 _stHVDPreSet[u8Idx].bColocateBBUMode = FALSE;
5414
5415 if (IS_TASK_ALIVE(pHVDHalContext->_stHVDStream[u8Idx].s32HvdPpTaskId))
5416 {
5417 _HVD_EX_PpTask_Delete(&pHVDHalContext->_stHVDStream[u8Idx]);
5418 }
5419
5420 if(pHVDHalContext->pHVDPreCtrl_Hal[_HVD_EX_GetStreamIdx(u32Id)]->stIapGnShBWMode.bEnable)
5421 {
5422
5423 _phy_to_miu_offset(u8MiuSel, u32StartOffset, pCtrl->MemMap.u32FrameBufAddr);
5424
5425 _HAL_HVD_Entry();
5426 HAL_HVD_MIF1_MiuClientSel(u8MiuSel);
5427 _HAL_HVD_Release();
5428
5429 }
5430
5431 pHVDHalContext->_stHVDStream[u8Idx].u32RegBase = 0;
5432 HVD_EX_MSG_DBG("success\n");
5433
5434 return eRet;
5435 }
5436
HAL_HVD_EX_PushPacket(MS_U32 u32Id,HVD_BBU_Info * pInfo)5437 HVD_Return HAL_HVD_EX_PushPacket(MS_U32 u32Id, HVD_BBU_Info *pInfo)
5438 {
5439 HVD_Return eRet = E_HVD_RETURN_UNSUPPORTED;
5440 MS_U32 u32Addr = 0;
5441 HVD_EX_Drv_Ctrl *pCtrl = NULL;
5442 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
5443
5444 pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
5445
5446 //if (E_HVD_INIT_HW_VP8 != (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) // VP8 PTS table is not ready yet
5447 {
5448 eRet = _HVD_EX_UpdatePTSTable(u32Id, pInfo);
5449
5450 if (E_HVD_RETURN_SUCCESS != eRet)
5451 {
5452 return eRet;
5453 }
5454 }
5455
5456 //printf(">>> halHVD pts,idH = %lu, %lu\n", pInfo->u32TimeStamp, pInfo->u32ID_H); //STS input
5457
5458 //T9: for 128 bit memory. BBU need to get 2 entry at a time.
5459 if (E_HVD_INIT_HW_VP8 != (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
5460 {
5461 eRet = _HVD_EX_UpdateESWptr(u32Id, 0, 0);
5462
5463 if (E_HVD_RETURN_SUCCESS != eRet)
5464 {
5465 return eRet;
5466 }
5467 }
5468
5469 u32Addr = pInfo->u32Staddr;
5470
5471 if (pInfo->bRVBrokenPacket)
5472 {
5473 u32Addr = pInfo->u32Staddr | BIT(HVD_RV_BROKENBYUS_BIT);
5474 }
5475
5476 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK)) // VP8
5477 {
5478 eRet = _HVD_EX_UpdateESWptr_VP8(u32Id, pInfo->u32Staddr, pInfo->u32Length, pInfo->u32Staddr2, pInfo->u32Length2);
5479 }
5480 else
5481 {
5482 eRet = _HVD_EX_UpdateESWptr(u32Id, u32Addr, pInfo->u32Length);
5483 }
5484
5485 if (E_HVD_RETURN_SUCCESS != eRet)
5486 {
5487 return eRet;
5488 }
5489
5490 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
5491 {
5492 //eRet = _HVD_EX_UpdateESWptr_VP8(u32Id, 0, 0, 0, 0);
5493 eRet = _HVD_EX_UpdateESWptr_VP8(u32Id, pInfo->u32Staddr, 0, pInfo->u32Staddr2, 0);
5494
5495 if (E_HVD_RETURN_SUCCESS != eRet)
5496 {
5497 return eRet;
5498 }
5499 }
5500
5501 pHVDHalContext->_stHVDStream[u8Idx].u32PTSByteCnt += pInfo->u32Length;
5502
5503 // do not add local pointer
5504 if ((pCtrl->MemMap.u32DrvProcessBufSize != 0) && (pCtrl->MemMap.u32DrvProcessBufAddr != 0))
5505 {
5506 MS_U32 u32PacketStAddr = pInfo->u32Staddr + pCtrl->MemMap.u32BitstreamBufAddr;
5507
5508 if (!((pCtrl->MemMap.u32DrvProcessBufAddr <= u32PacketStAddr) &&
5509 (u32PacketStAddr <
5510 (pCtrl->MemMap.u32DrvProcessBufAddr + pCtrl->MemMap.u32DrvProcessBufSize))))
5511 {
5512 pCtrl->LastNal.u32NalAddr = pInfo->u32Staddr;
5513 pCtrl->LastNal.u32NalSize = pInfo->u32AllocLength;
5514 }
5515 else
5516 {
5517 //null packet
5518 pCtrl->LastNal.u32NalAddr = pInfo->u32OriPktAddr;
5519 pCtrl->LastNal.u32NalSize = 0;
5520 }
5521 }
5522 else
5523 {
5524 pCtrl->LastNal.u32NalAddr = pInfo->u32Staddr;
5525 pCtrl->LastNal.u32NalSize = pInfo->u32AllocLength;
5526 }
5527
5528 pCtrl->LastNal.bRVBrokenPacket = pInfo->bRVBrokenPacket;
5529 pCtrl->u32BBUPacketCnt++;
5530
5531 return eRet;
5532 }
5533
HAL_HVD_EX_EnableISR(MS_U32 u32Id,MS_BOOL bEnable)5534 void HAL_HVD_EX_EnableISR(MS_U32 u32Id, MS_BOOL bEnable)
5535 {
5536 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
5537 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
5538 MS_BOOL bCurrentStatus = HAL_HVD_EX_IsEnableISR(u32Id);
5539 if(bCurrentStatus == bEnable)
5540 return;
5541
5542 if (bEnable)
5543 {
5544 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), 0, HVD_REG_RISC_ISR_MSK);
5545 }
5546 else
5547 {
5548 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_RISC_ISR_MSK, HVD_REG_RISC_ISR_MSK);
5549 }
5550 }
5551
HAL_HVD_EX_SetForceISR(MS_U32 u32Id,MS_BOOL bEnable)5552 void HAL_HVD_EX_SetForceISR(MS_U32 u32Id, MS_BOOL bEnable)
5553 {
5554 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
5555 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
5556
5557 if (bEnable)
5558 {
5559 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_RISC_ISR_FORCE, HVD_REG_RISC_ISR_FORCE);
5560 }
5561 else
5562 {
5563 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), 0, HVD_REG_RISC_ISR_FORCE);
5564 }
5565 }
5566
HAL_HVD_EX_SetClearISR(HWDEC_ISR_TYPE eISRType)5567 void HAL_HVD_EX_SetClearISR(HWDEC_ISR_TYPE eISRType)
5568 {
5569 MS_U32 u32RB = 0;
5570 switch(eISRType)
5571 {
5572 case E_HWDEC_ISR_HVD:
5573 u32RB = REG_HVD_BASE;
5574 break;
5575 #if SUPPORT_EVD
5576 case E_HWDEC_ISR_EVD:
5577 u32RB = REG_EVD_BASE;
5578 break;
5579 #endif
5580 #if SUPPORT_G2VP9
5581 case E_HWDEC_ISR_G2VP9:
5582 break;
5583 #endif
5584 default:
5585 break;
5586 }
5587 if(u32RB)
5588 {
5589 _HVD_WriteWordMask(HVD_REG_RISC_MBOX_CLR(u32RB), HVD_REG_RISC_ISR_CLR, HVD_REG_RISC_ISR_CLR);
5590 }
5591 }
5592
HAL_HVD_EX_IsISROccured(MS_U32 u32Id)5593 MS_BOOL HAL_HVD_EX_IsISROccured(MS_U32 u32Id)
5594 {
5595 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
5596 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
5597
5598 return (MS_BOOL) (_HVD_Read2Byte(HVD_REG_RISC_MBOX_RDY(u32RB)) & HVD_REG_RISC_ISR_VALID);
5599 }
5600
HAL_HVD_EX_IsEnableISR(MS_U32 u32Id)5601 MS_BOOL HAL_HVD_EX_IsEnableISR(MS_U32 u32Id)
5602 {
5603 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
5604 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
5605
5606 if (_HVD_Read2Byte(HVD_REG_RISC_MBOX_CLR(u32RB)) & HVD_REG_RISC_ISR_MSK)
5607 {
5608 return FALSE;
5609 }
5610 else
5611 {
5612 return TRUE;
5613 }
5614 }
5615
HAL_HVD_EX_IsAlive(MS_U32 u32Id)5616 MS_BOOL HAL_HVD_EX_IsAlive(MS_U32 u32Id)
5617 {
5618 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
5619
5620 if (pCtrl)
5621 {
5622 if ((pCtrl->LivingStatus.u32DecCnt == HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DECODE_CNT)) &&
5623 (pCtrl->LivingStatus.u32SkipCnt == HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_SKIP_CNT)) &&
5624 (pCtrl->LivingStatus.u32IdleCnt == HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT)) &&
5625 (pCtrl->LivingStatus.u32MainLoopCnt == HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_MAIN_LOOP_CNT)))
5626 {
5627 return FALSE;
5628 }
5629 else
5630 {
5631 return TRUE;
5632 }
5633 }
5634 else
5635 {
5636 return FALSE;
5637 }
5638 }
5639
HAL_HVD_EX_RstPTSCtrlVariable(MS_U32 u32Id)5640 MS_BOOL HAL_HVD_EX_RstPTSCtrlVariable(MS_U32 u32Id)
5641 {
5642 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
5643 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
5644 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
5645
5646 if ((pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) == E_HVD_INIT_INPUT_DRV)
5647 {
5648 HAL_HVD_EX_ReadMemory();
5649
5650 pHVDHalContext->_stHVDStream[u8Idx].u32PTSByteCnt = pShm->u32PTStableByteCnt;
5651 pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr = _HVD_EX_GetPTSTableWptr(u32Id);
5652
5653 HVD_EX_MSG_DBG("PTS table: WptrAddr:%x RptrAddr:%x ByteCnt:%x PreWptr:%lx\n",
5654 pShm->u32PTStableWptrAddr, pShm->u32PTStableRptrAddr, pHVDHalContext->_stHVDStream[u8Idx].u32PTSByteCnt, (unsigned long)pHVDHalContext->_stHVDStream[u8Idx].u32PTSPreWptr);
5655 }
5656
5657 return TRUE;
5658 }
5659
HAL_HVD_EX_FlushRstShareMem(MS_U32 u32Id)5660 MS_BOOL HAL_HVD_EX_FlushRstShareMem(MS_U32 u32Id)
5661 {
5662 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
5663 HVD_EX_Drv_Ctrl *pCtrl = NULL;
5664 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
5665 MS_U32 u32Data;
5666 pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
5667
5668 memset(&pShm->DecoFrmInfo, 0, sizeof(HVD_Frm_Information));
5669
5670 HAL_HVD_EX_FlushMemory();
5671 if (pHVDHalContext->_stHVDStream[u8Idx].bDispOutSide)
5672 {
5673 u32Data = _HVD_EX_GetESReadPtr(u32Id, FALSE);
5674 pCtrl->LastNal.u32NalAddr = u32Data;
5675 pCtrl->LastNal.u32NalSize = 0;
5676 }
5677
5678 if (IS_TASK_ALIVE(pHVDHalContext->_stHVDStream[u8Idx].s32HvdPpTaskId))
5679 pHVDHalContext->_stHVDStream[u8Idx].ePpTaskState = E_HAL_HVD_STATE_RUNNING;
5680
5681 return TRUE;
5682 }
5683
HAL_HVD_EX_UartSwitch2FW(MS_BOOL bEnable)5684 void HAL_HVD_EX_UartSwitch2FW(MS_BOOL bEnable)
5685 {
5686 if (bEnable)
5687 {
5688 if (HAL_VPU_EX_IsEVDR2())
5689 _HVD_WriteWordMask(REG_TOP_UART_SEL0, REG_TOP_UART_SEL_MHEG5, REG_TOP_UART_SEL_0_MASK);
5690 else
5691 _HVD_WriteWordMask(REG_TOP_UART_SEL0, REG_TOP_UART_SEL_VD_MHEG5, REG_TOP_UART_SEL_0_MASK);
5692 }
5693 else
5694 {
5695 #if defined (__aeon__)
5696 _HVD_WriteWordMask(REG_TOP_UART_SEL0, REG_TOP_UART_SEL_MHEG5, REG_TOP_UART_SEL_0_MASK);
5697 #else // defined (__mips__)
5698 _HVD_WriteWordMask(REG_TOP_UART_SEL0, REG_TOP_UART_SEL_PIU_0, REG_TOP_UART_SEL_0_MASK);
5699 #endif
5700 }
5701 }
5702
HAL_HVD_EX_GetData_Dbg(MS_U32 u32Addr)5703 MS_U32 HAL_HVD_EX_GetData_Dbg(MS_U32 u32Addr)
5704 {
5705 return 0;
5706 }
5707
HAL_HVD_EX_SetData_Dbg(MS_U32 u32Addr,MS_U32 u32Data)5708 void HAL_HVD_EX_SetData_Dbg(MS_U32 u32Addr, MS_U32 u32Data)
5709 {
5710 return;
5711 }
5712
HAL_HVD_EX_GetCorretClock(MS_U16 u16Clock)5713 MS_U16 HAL_HVD_EX_GetCorretClock(MS_U16 u16Clock)
5714 {
5715 //if( u16Clock == 0 )
5716 return 216; //140;
5717 //if( )
5718 }
5719
HAL_HVD_EX_UpdateESWptr_Fire(MS_U32 u32Id)5720 void HAL_HVD_EX_UpdateESWptr_Fire(MS_U32 u32Id)
5721 {
5722 //MS_BOOL bBitMIU1 = FALSE;
5723 //MS_BOOL bCodeMIU1 = FALSE;
5724 MS_U8 u8BitMiuSel = 0;
5725 MS_U8 u8CodeMiuSel = 0;
5726 MS_U32 u32BitStartOffset;
5727 MS_U32 u32CodeStartOffset;
5728 //MS_U8 u8MiuSel;
5729 //MS_U32 u32StartOffset;
5730 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
5731 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
5732 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
5733 MS_VIRT u32BBU_DRAM_ST_ADDR = (MS_VIRT) pShm->u32HVD_BBU_DRAM_ST_ADDR;
5734
5735 #if HVD_ENABLE_MVC
5736 if(HAL_HVD_EX_CheckMVCID(u32Id))
5737 {
5738 // 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
5739 u32BBU_DRAM_ST_ADDR = (MS_VIRT) pShm->u32HVD_BBU_DRAM_ST_ADDR; //pShm->u32MVC_BBU_DRAM_ST_ADDR;
5740 if(E_VDEC_EX_SUB_VIEW == HAL_HVD_EX_GetView(u32Id))
5741 {
5742 u32BBU_DRAM_ST_ADDR = (MS_VIRT) pShm->u32HVD_BBU2_DRAM_ST_ADDR; //pShm->u32MVC_BBU2_DRAM_ST_ADDR;
5743 }
5744 }
5745 #endif /// HVD_ENABLE_MVC
5746
5747 _phy_to_miu_offset(u8BitMiuSel, u32BitStartOffset, pCtrl->MemMap.u32BitstreamBufAddr);
5748 _phy_to_miu_offset(u8CodeMiuSel, u32CodeStartOffset, pCtrl->MemMap.u32CodeBufAddr);
5749
5750
5751
5752
5753 if (u8BitMiuSel != u8CodeMiuSel)
5754 {
5755 #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
5756 BDMA_Result bdmaRlt;
5757 MS_VIRT u32DstAdd = 0, u32SrcAdd = 0, u32tabsize = 0;
5758
5759 u32DstAdd = pCtrl->MemMap.u32BitstreamBufAddr + pCtrl->u32BBUTblInBitstreamBufAddr;
5760 u32SrcAdd = pCtrl->MemMap.u32CodeBufAddr + u32BBU_DRAM_ST_ADDR;
5761 u32tabsize = pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum << 3;
5762
5763 bdmaRlt = HVD_dmacpy(u32DstAdd, u32SrcAdd, u32tabsize);
5764
5765 if (E_BDMA_OK != bdmaRlt)
5766 {
5767 HVD_EX_MSG_ERR("MDrv_BDMA_MemCopy fail ret=%x!\n", bdmaRlt);
5768 }
5769 #else
5770 MS_VIRT u32DstAdd = 0, u32SrcAdd = 0, u32tabsize = 0;
5771
5772 u32DstAdd = pCtrl->MemMap.u32BitstreamBufVAddr + pCtrl->u32BBUTblInBitstreamBufAddr;
5773 u32SrcAdd = MsOS_PA2KSEG1(pCtrl->MemMap.u32CodeBufAddr + u32BBU_DRAM_ST_ADDR);
5774 u32tabsize = pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum << 3;
5775
5776 HVD_memcpy(u32DstAdd, u32SrcAdd, u32tabsize);
5777 #endif
5778 }
5779
5780 //HVD_EX_MSG_DBG("%lu st:%lx size:%lx BBU: %lu\n", pCtrl->u32BBUPacketCnt, pCtrl->LastNal.u32NalAddr, pCtrl->LastNal.u32NalSize, _stHVDStream[u8Idx].u32BBUWptr);
5781
5782 HAL_HVD_EX_FlushMemory();
5783
5784 if (E_HVD_INIT_HW_VP8 == (pCtrl->InitParams.u32ModeFlag & E_HVD_INIT_HW_MASK))
5785 {
5786 _HVD_EX_SetBBUWriteptr(u32Id, HVD_LWORD(pHVDHalContext->u32VP8BBUWptr));
5787 pCtrl->u32BBUWptr_Fired = pHVDHalContext->u32VP8BBUWptr;
5788 }
5789 else
5790 {
5791 _HVD_EX_SetBBUWriteptr(u32Id, HVD_LWORD(pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr));
5792
5793 pCtrl->u32BBUWptr_Fired = pHVDHalContext->_stHVDStream[u8Idx].u32BBUWptr;
5794 }
5795 }
5796
HAL_HVD_EX_MVD_PowerCtrl(MS_BOOL bEnable)5797 void HAL_HVD_EX_MVD_PowerCtrl(MS_BOOL bEnable)
5798 {
5799 if (bEnable)
5800 {
5801 _HVD_WriteWordMask(REG_TOP_MVD, 0, TOP_CKG_MHVD_DIS);
5802 _HVD_WriteWordMask(REG_TOP_MVD2, 0, TOP_CKG_MHVD2_DIS);
5803 }
5804 else
5805 {
5806 _HVD_WriteWordMask(REG_TOP_MVD, TOP_CKG_MHVD_DIS, TOP_CKG_MHVD_DIS);
5807 _HVD_WriteWordMask(REG_TOP_MVD2, TOP_CKG_MHVD2_DIS, TOP_CKG_MHVD2_DIS);
5808 }
5809 }
5810
HAL_HVD_EX_Dump_FW_Status(MS_U32 u32Id)5811 void HAL_HVD_EX_Dump_FW_Status(MS_U32 u32Id)
5812 {
5813 MS_U32 tmp1 = 0;
5814 MS_U32 tmp2 = 0;
5815 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
5816
5817 HAL_HVD_EX_ReadMemory();
5818
5819 _HVD_EX_MBoxRead(u32Id, HAL_HVD_CMD_MBOX, &tmp1);
5820 _HVD_EX_MBoxRead(u32Id, HAL_HVD_CMD_ARG_MBOX, &tmp2);
5821
5822 if (u32UartCtrl & E_HVD_UART_CTRL_DBG)
5823 {
5824 MS_U32 u32Tmp = u32UartCtrl;
5825
5826 HVD_EX_MSG_DBG("\n");
5827 u32UartCtrl = 0; // turn off debug message to prevent other function prints
5828 HVD_EX_MSG_INF("\tSystime=%u, FWVersionID=0x%x, FwState=0x%x, ErrCode=0x%x, ProgCnt=0x%x\n",
5829 HVD_GetSysTime_ms(), pShm->u32FWVersionID, pShm->u32FwState, (MS_U32) pShm->u16ErrCode, HAL_VPU_EX_GetProgCnt());
5830
5831 HVD_EX_MSG_INF("\tTime: DispSTC=%u, DispT=%u, DecT=%u, CurrentPts=%u, Last Cmd=0x%x, Arg=0x%x, Rdy1=0x%x, Rdy2=0x%x\n",
5832 pShm->u32DispSTC, pShm->DispFrmInfo.u32TimeStamp,
5833 pShm->DecoFrmInfo.u32TimeStamp, pShm->u32CurrentPts, tmp1, tmp2,
5834 (MS_U32) _HVD_EX_MBoxReady(u32Id, HAL_HVD_CMD_MBOX), (MS_U32) _HVD_EX_MBoxReady(u32Id, HAL_HVD_CMD_ARG_MBOX));
5835
5836 HVD_EX_MSG_INF("\tFlag: InitDone=%d, SpsChange=%d, IsIFrmFound=%d, 1stFrmRdy=%d, SyncStart=%d, SyncReach=%d\n",
5837 pShm->bInitDone, pShm->bSpsChange, pShm->bIsIFrmFound,
5838 pShm->bIs1stFrameRdy, pShm->bIsSyncStart, pShm->bIsSyncReach);
5839
5840 HVD_EX_MSG_INF("\tQueue: BBUQNumb=%u, DecQNumb=%d, DispQNumb=%d, ESR=%u, ESRfromFW=%u, ESW=%u, ESLevel=%u\n",
5841 _HVD_EX_GetBBUQNumb(u32Id), pShm->u16DecQNumb, pShm->u16DispQNumb,
5842 _HVD_EX_GetESReadPtr(u32Id, TRUE), pShm->u32ESReadPtr, _HVD_EX_GetESWritePtr(u32Id),
5843 _HVD_EX_GetESLevel(u32Id));
5844
5845 HVD_EX_MSG_INF("\tCounter: DecodeCnt=%u, DispCnt=%u, DataErrCnt=%u, DecErrCnt=%u, SkipCnt=%u, DropCnt=%u, idle=%u, MainLoopCnt=%u, VsyncCnt=%u\n",
5846 pShm->u32DecodeCnt, pShm->u32DispCnt, pShm->u32DataErrCnt,
5847 pShm->u32DecErrCnt, pShm->u32SkipCnt, pShm->u32DropCnt,
5848 pShm->u32VPUIdleCnt, pShm->u32MainLoopCnt, pShm->u32VsyncCnt);
5849 HVD_EX_MSG_INF
5850 ("\tMode: ShowErr=%d, RepLastField=%d, SyncOn=%d, FileEnd=%d, Skip=%d, Drop=%d, DispSpeed=%d, FRC=%d, BlueScreen=%d, FreezeImg=%d, 1Field=%d\n",
5851 pShm->ModeStatus.bIsShowErrFrm, pShm->ModeStatus.bIsRepeatLastField,
5852 pShm->ModeStatus.bIsSyncOn, pShm->ModeStatus.bIsPlaybackFinish,
5853 pShm->ModeStatus.u8SkipMode, pShm->ModeStatus.u8DropMode,
5854 pShm->ModeStatus.s8DisplaySpeed, pShm->ModeStatus.u8FrcMode,
5855 pShm->ModeStatus.bIsBlueScreen, pShm->ModeStatus.bIsFreezeImg,
5856 pShm->ModeStatus.bShowOneField);
5857
5858 u32UartCtrl = u32Tmp; // recover debug level
5859 }
5860 }
5861
HAL_HVD_EX_GetBBUEntry(MS_U32 u32Id,HVD_EX_Drv_Ctrl * pDrvCtrl,MS_U32 u32Idx,MS_U32 * u32NalOffset,MS_U32 * u32NalSize)5862 void HAL_HVD_EX_GetBBUEntry(MS_U32 u32Id, HVD_EX_Drv_Ctrl *pDrvCtrl, MS_U32 u32Idx, MS_U32 *u32NalOffset, MS_U32 *u32NalSize)
5863 {
5864 MS_U8 *u32Addr = NULL;
5865 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
5866 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
5867
5868 if (u32Idx >= pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum)
5869 {
5870 return;
5871 }
5872
5873 u32Addr = (MS_U8 *)(MsOS_PA2KSEG1(pDrvCtrl->MemMap.u32CodeBufAddr + (MS_PHY)pShm->u32HVD_BBU_DRAM_ST_ADDR + (u32Idx << 3)));
5874
5875 *u32NalSize = *(u32Addr + 2) & 0x1f;
5876 *u32NalSize <<= 8;
5877 *u32NalSize |= *(u32Addr + 1) & 0xff;
5878 *u32NalSize <<= 8;
5879 *u32NalSize |= *(u32Addr) & 0xff;
5880
5881 *u32NalOffset = ((MS_U32) (*(u32Addr + 2) & 0xe0)) >> 5;
5882 *u32NalOffset |= ((MS_U32) (*(u32Addr + 3) & 0xff)) << 3;
5883 *u32NalOffset |= ((MS_U32) (*(u32Addr + 4) & 0xff)) << 11;
5884 *u32NalOffset |= ((MS_U32) (*(u32Addr + 5) & 0xff)) << 19;
5885 }
5886
HAL_HVD_EX_Dump_BBUs(MS_U32 u32Id,HVD_EX_Drv_Ctrl * pDrvCtrl,MS_U32 u32StartIdx,MS_U32 u32EndIdx,MS_BOOL bShowEmptyEntry)5887 void HAL_HVD_EX_Dump_BBUs(MS_U32 u32Id, HVD_EX_Drv_Ctrl *pDrvCtrl, MS_U32 u32StartIdx, MS_U32 u32EndIdx, MS_BOOL bShowEmptyEntry)
5888 {
5889 MS_U32 u32CurIdx = 0;
5890 MS_BOOL bFinished = FALSE;
5891 MS_U32 u32NalOffset = 0;
5892 MS_U32 u32NalSize = 0;
5893 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
5894
5895 if ((u32StartIdx >= pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum) || (u32EndIdx >= pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum))
5896 {
5897 return;
5898 }
5899
5900 u32CurIdx = u32StartIdx;
5901
5902 do
5903 {
5904 if (u32CurIdx == u32EndIdx)
5905 {
5906 bFinished = TRUE;
5907 }
5908
5909 HAL_HVD_EX_GetBBUEntry(u32Id, pDrvCtrl, u32CurIdx, &u32NalOffset, &u32NalSize);
5910
5911 if ((bShowEmptyEntry == FALSE) || (bShowEmptyEntry && (u32NalOffset == 0) && (u32NalSize == 0)))
5912 {
5913 HVD_EX_MSG_DBG("HVD BBU Entry: Idx:%u Offset:%x Size:%x\n", u32CurIdx, u32NalOffset, u32NalSize);
5914 }
5915
5916 u32CurIdx++;
5917
5918 if (u32CurIdx >= pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum)
5919 {
5920 u32CurIdx %= pHVDHalContext->_stHVDStream[u8Idx].u32BBUEntryNum;
5921 }
5922 } while (bFinished == TRUE);
5923 }
5924
HAL_HVD_EX_Dump_HW_Status(MS_U32 u32Num)5925 void HAL_HVD_EX_Dump_HW_Status(MS_U32 u32Num)
5926 {
5927 MS_U32 i = 0;
5928 MS_U32 value = 0;
5929
5930 if (u32UartCtrl & E_HVD_UART_CTRL_DBG)
5931 {
5932 HVD_EX_MSG_DBG("\n");
5933
5934 for (i = 0; i <= u32Num; i++)
5935 {
5936 _HVD_Write2Byte(HVD_REG_DEBUG_SEL, i);
5937 value = _HVD_Read2Byte(HVD_REG_DEBUG_DAT_L);
5938 value |= ((MS_U32) _HVD_Read2Byte(HVD_REG_DEBUG_DAT_H)) << 16;
5939
5940 if (value == 0)
5941 {
5942 break;
5943 }
5944
5945 HVD_EX_MSG_DBG(" %08x", value);
5946
5947 if (((i % 8) + 1) == 8)
5948 {
5949 HVD_EX_MSG_DBG(" |%u\n", i + 1);
5950 }
5951 }
5952
5953 HVD_EX_MSG_DBG("\nHVD Dump HW status End: total number:%u\n", i);
5954 }
5955 }
5956
HAL_HVD_EX_SetMiuBurstLevel(HVD_EX_Drv_Ctrl * pDrvCtrl,HVD_MIU_Burst_Cnt_Ctrl eMiuBurstCntCtrl)5957 void HAL_HVD_EX_SetMiuBurstLevel(HVD_EX_Drv_Ctrl *pDrvCtrl, HVD_MIU_Burst_Cnt_Ctrl eMiuBurstCntCtrl)
5958 {
5959 if (pDrvCtrl)
5960 {
5961 pDrvCtrl->Settings.u32MiuBurstLevel = (MS_U32) eMiuBurstCntCtrl;
5962 }
5963 }
5964
5965 #if HVD_ENABLE_MVC
HAL_HVD_EX_CheckMVCID(MS_U32 u32Id)5966 MS_BOOL HAL_HVD_EX_CheckMVCID(MS_U32 u32Id)
5967 {
5968 return ( E_HAL_VPU_MVC_STREAM_BASE == (0xFF & u32Id) );
5969 }
5970
HAL_HVD_EX_GetView(MS_U32 u32Id)5971 VDEC_EX_View HAL_HVD_EX_GetView(MS_U32 u32Id)
5972 {
5973 if( (0xFF & (u32Id >> 8)) == 0x10)
5974 return E_VDEC_EX_MAIN_VIEW;
5975 else
5976 return E_VDEC_EX_SUB_VIEW;
5977 }
5978 #endif ///HVD_ENABLE_MVC
5979
HAL_HVD_EX_SpareBandwidth(MS_U32 u32Id)5980 void HAL_HVD_EX_SpareBandwidth(MS_U32 u32Id) //// For MVC
5981 {
5982 //HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIS_QUART_PIXEL, TRUE);
5983 //HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIS_DBF, TRUE);
5984 return;
5985 }
5986
HAL_HVD_EX_PowerSaving(MS_U32 u32Id)5987 void HAL_HVD_EX_PowerSaving(MS_U32 u32Id)
5988 {
5989 HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_POWER_SAVING, TRUE);
5990 return;
5991 }
5992
HAL_HVD_EX_GetFrmRateIsSupported(MS_U32 u32Id,MS_U16 u16HSize,MS_U16 u16VSize,MS_U32 u32FrmRate)5993 MS_BOOL HAL_HVD_EX_GetFrmRateIsSupported(MS_U32 u32Id, MS_U16 u16HSize, MS_U16 u16VSize, MS_U32 u32FrmRate)
5994 {
5995 MS_U64 _hw_max_pixel = 0;
5996 _hw_max_pixel = _HAL_EX_GetHwMaxPixel(u32Id);
5997
5998 HVD_EX_MSG_DBG("%s w:%d, h:%d, fr:%d, MAX:%ld\n", __FUNCTION__,
5999 u16HSize, u16VSize, u32FrmRate, (unsigned long)_hw_max_pixel);
6000 return (((MS_U64)u16HSize*(MS_U64)u16VSize*(MS_U64)u32FrmRate) <= _hw_max_pixel);
6001 }
6002
6003
HAL_HVD_EX_GetDispFrmNum(MS_U32 u32Id)6004 MS_U32 HAL_HVD_EX_GetDispFrmNum(MS_U32 u32Id)
6005 {
6006 #if 1
6007 HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
6008 MS_U16 u16QNum = pShm->u16DispQNumb;
6009 MS_U16 u16QPtr = pShm->u16DispQPtr;
6010 // MS_U16 u16QSize = pShm->u16DispQSize;
6011 //static volatile HVD_Frm_Information *pHvdFrm = NULL;
6012 MS_U32 u32DispQNum = 0;
6013 #if HVD_ENABLE_MVC
6014 MS_BOOL bMVC = HAL_HVD_EX_CheckMVCID(u32Id);
6015
6016 if(bMVC)
6017 {
6018 #if 0
6019 if (u16QNum > HVD_DISPQ_PREFETCH_COUNT*3)
6020 {
6021 u16QNum = HVD_DISPQ_PREFETCH_COUNT*3;
6022 }
6023 #endif
6024
6025 //printf("OQ:%d,DQ:%d.\n",pShm->u16DispQNumb,pShm->u16DecQNumb);
6026 //search the next frame to display
6027 while (u16QNum > 0)
6028 {
6029 //printf("Pr:%d,%d.[%ld,%ld,%ld,%ld].\n",u16QPtr,u16QNum,pShm->DispQueue[u16QPtr].u32Status,pShm->DispQueue[u16QPtr+1].u32Status,
6030 // pShm->DispQueue[u16QPtr+2].u32Status,pShm->DispQueue[u16QPtr+3].u32Status);
6031 pHVDHalContext->pHvdFrm = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr];
6032
6033 //printf("Q2: %ld\n", pHVDShareMem->DispQueue[u16QPtr].u32Status);
6034 if (pHVDHalContext->pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
6035 {
6036 /// For MVC. Output views after the pair of (base and depend) views were decoded.
6037 /// Check the depned view was initial when Output the base view.
6038 if((u16QPtr%2) == 0)
6039 {
6040 volatile HVD_Frm_Information *pHvdFrm_sub = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr+1];
6041 //if(pHvdFrm_sub->u32Status != E_HVD_DISPQ_STATUS_INIT)
6042 if(pHvdFrm_sub->u32Status == E_HVD_DISPQ_STATUS_NONE)
6043 {
6044 ///printf("[MVC] %d is not E_HVD_DISPQ_STATUS_INIT (%ld).\n",u16QPtr+1,pHvdFrm_sub->u32Status);
6045 ///printf("Return NULL.\n");
6046 continue;
6047 }
6048 }
6049 u32DispQNum++;
6050 }
6051
6052 u16QNum--;
6053 //go to next frame in the dispQ
6054 u16QPtr++;
6055
6056 if (u16QPtr >= pShm->u16DispQSize)
6057 {
6058 u16QPtr -= pShm->u16DispQSize; //wrap to the begin
6059 }
6060 }
6061 }
6062 else
6063 #endif ///HVD_ENABLE_MVC
6064 {
6065 #if 0
6066 if (u16QNum > HVD_DISPQ_PREFETCH_COUNT)
6067 {
6068 u16QNum = HVD_DISPQ_PREFETCH_COUNT;
6069 }
6070 #endif
6071 // printf("Q: %d %d %d\n", u16QNum, u16QPtr, u16QSize);
6072 //search the next frame to display
6073 while (u16QNum != 0)
6074 {
6075 pHVDHalContext->pHvdFrm = (volatile HVD_Frm_Information *) &pShm->DispQueue[u16QPtr];
6076
6077 // printf("Q2[%d]: %ld\n", u16QPtr, pShm->DispQueue[u16QPtr].u32Status);
6078 if (pHVDHalContext->pHvdFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
6079 {
6080 u32DispQNum++;
6081 }
6082
6083 u16QNum--;
6084 //go to next frame in the dispQ
6085 u16QPtr++;
6086
6087 if (u16QPtr == pShm->u16DispQSize)
6088 {
6089 u16QPtr = 0; //wrap to the begin
6090 }
6091 }
6092 }
6093
6094 //printf("dispQnum = %ld, pShm->u16DispQNumb = %d\n", u32DispQNum, pShm->u16DispQNumb);
6095 return u32DispQNum;
6096 #else
6097 HVD_ShareMem *pShm = (HVD_ShareMem *) _HVD_EX_GetShmAddr(u32Id);
6098 return pShm->u16DispQNumb;
6099 #endif
6100 }
6101
HAL_HVD_EX_SetHwRegBase(MS_U32 u32Id,MS_U32 u32ModeFlag)6102 void HAL_HVD_EX_SetHwRegBase(MS_U32 u32Id, MS_U32 u32ModeFlag)
6103 {
6104 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
6105 if ((u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_HEVC)
6106 pHVDHalContext->_stHVDStream[u8Idx].u32RegBase = REG_EVD_BASE;
6107 else if ((u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP9)
6108 #if SUPPORT_G2VP9 && defined(VDEC3)
6109 pHVDHalContext->_stHVDStream[u8Idx].u32RegBase = REG_G2VP9_BASE;
6110 #else // Not using G2 VP9 implies using Mstar EVD VP9
6111 pHVDHalContext->_stHVDStream[u8Idx].u32RegBase = REG_EVD_BASE;
6112 #endif
6113 else
6114 pHVDHalContext->_stHVDStream[u8Idx].u32RegBase = REG_HVD_BASE;
6115 }
6116
6117 #if SUPPORT_EVD
HAL_EVD_EX_PowerCtrl(MS_BOOL bEnable)6118 void HAL_EVD_EX_PowerCtrl(MS_BOOL bEnable)
6119 {
6120 if (bEnable)
6121 {
6122 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, ~TOP_CKG_EVD_PPU_DIS, TOP_CKG_EVD_PPU_DIS);
6123 _HVD_WriteWordMask(REG_TOP_CKG_EVD, ~TOP_CKG_EVD_DIS, TOP_CKG_EVD_DIS);
6124 _HVD_WriteWordMask(REG_EVDPLL_PD, ~REG_EVDPLL_PD_DIS, REG_EVDPLL_PD_DIS);
6125 }
6126 else
6127 {
6128 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_DIS, TOP_CKG_EVD_PPU_DIS);
6129 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_DIS, TOP_CKG_EVD_DIS);
6130 _HVD_WriteWordMask(REG_EVDPLL_PD, REG_EVDPLL_PD_DIS, REG_EVDPLL_PD_DIS);
6131 }
6132
6133 switch (pHVDHalContext->u32EVDClockType)
6134 {
6135 case 576:
6136 {
6137 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_PLL_BUF, TOP_CKG_EVD_PPU_MASK);
6138 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_480MHZ, TOP_CKG_EVD_MASK);
6139 break;
6140 }
6141 case 532:
6142 {
6143 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_MIU128PLL, TOP_CKG_EVD_PPU_MASK);
6144 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_MIU128PLL, TOP_CKG_EVD_MASK);
6145 break;
6146 }
6147 case 466:
6148 {
6149 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_MIU256PLL, TOP_CKG_EVD_PPU_MASK);
6150 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_MIU256PLL, TOP_CKG_EVD_MASK);
6151 break;
6152 }
6153 case 480:
6154 {
6155 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_PLL_BUF, TOP_CKG_EVD_PPU_MASK);
6156 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_480MHZ, TOP_CKG_EVD_MASK);
6157 break;
6158 }
6159 case 384:
6160 {
6161 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_384MHZ, TOP_CKG_EVD_PPU_MASK);
6162 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_384MHZ, TOP_CKG_EVD_MASK);
6163 break;
6164 }
6165 case 320:
6166 {
6167 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_320MHZ, TOP_CKG_EVD_PPU_MASK);
6168 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_320MHZ, TOP_CKG_EVD_MASK);
6169 break;
6170 }
6171 case 240:
6172 {
6173 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_240MHZ, TOP_CKG_EVD_PPU_MASK);
6174 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_240MHZ, TOP_CKG_EVD_MASK);
6175 break;
6176 }
6177 case 192:
6178 {
6179 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_192MHZ, TOP_CKG_EVD_PPU_MASK);
6180 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_192MHZ, TOP_CKG_EVD_MASK);
6181 break;
6182 }
6183 default:
6184 {
6185 _HVD_WriteWordMask(REG_TOP_CKG_EVD_PPU, TOP_CKG_EVD_PPU_PLL_BUF, TOP_CKG_EVD_PPU_MASK);
6186 _HVD_WriteWordMask(REG_TOP_CKG_EVD, TOP_CKG_EVD_PLL_BUF, TOP_CKG_EVD_MASK);
6187 break;
6188 }
6189 }
6190
6191 return;
6192 }
6193
HAL_EVD_EX_ClearTSPInput(MS_U32 u32Id)6194 void HAL_EVD_EX_ClearTSPInput(MS_U32 u32Id)
6195 {
6196 #ifndef VDEC3
6197 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
6198 #endif
6199 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
6200 MS_U8 u8Idx = _HVD_EX_GetStreamIdx(u32Id);
6201 MS_U32 u32RB = pHVDHalContext->_stHVDStream[u8Idx].u32RegBase;
6202
6203 #ifdef VDEC3
6204 if (0 == pCtrl->u32BBUId)
6205 #else
6206 if (0 == u8TaskId)
6207 #endif
6208 {
6209 _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 for main-DTV mode
6210 // disable TSP mode in EVD since EVD maybe effected by MVD parser's write pointer used by previous decoder
6211 _HVD_Write2Byte(HVD_REG_MIF_BBU(u32RB), _HVD_Read2Byte(HVD_REG_MIF_BBU(u32RB)) & (~HVD_REG_BBU_TSP_INPUT));
6212 HVD_EX_MSG_INF("id %d disable TSP mode, val 0x%x\n", pCtrl->u32BBUId, _HVD_Read2Byte(HVD_REG_MIF_BBU(u32RB)));
6213 }
6214 else
6215 {
6216 _HVD_Write2Byte(EVD_REG_RESET, (_HVD_Read2Byte(EVD_REG_RESET) & ~EVD_REG_RESET_USE_HVD_MIU_EN)); //0: tsp2hvd, coz EVD & HVD use the same MVD parser for sub-DTV mode
6217 // disable TSP mode in EVD since EVD maybe effected by MVD parser's write pointer used by previous decoder
6218 _HVD_Write2Byte(HVD_REG_MIF_BBU_BS2(u32RB), _HVD_Read2Byte(HVD_REG_MIF_BBU_BS2(u32RB)) & (~HVD_REG_BBU_TSP_INPUT_BS2));
6219 HVD_EX_MSG_INF("id %d disable TSP mode, val 0x%x\n", pCtrl->u32BBUId, _HVD_Read2Byte(HVD_REG_MIF_BBU_BS2(u32RB)));
6220 }
6221
6222 return;
6223 }
6224
HAL_EVD_EX_DeinitHW(void)6225 static MS_BOOL HAL_EVD_EX_DeinitHW(void)
6226 {
6227 MS_U16 u16Timeout = 1000;
6228
6229 _HVD_WriteWordMask(EVD_REG_RESET, EVD_REG_RESET_SWRST, EVD_REG_RESET_SWRST);
6230
6231 while (u16Timeout)
6232 {
6233 if ((_HVD_Read2Byte(EVD_REG_RESET) & (EVD_REG_RESET_SWRST_FIN)) == (EVD_REG_RESET_SWRST_FIN))
6234 {
6235 break;
6236 }
6237 u16Timeout--;
6238 }
6239
6240 HAL_EVD_EX_PowerCtrl(FALSE);
6241
6242 return TRUE;
6243 }
6244 #endif
6245
6246 #if SUPPORT_G2VP9 && defined(VDEC3)
HAL_VP9_EX_PowerCtrl(MS_BOOL bEnable)6247 static void HAL_VP9_EX_PowerCtrl(MS_BOOL bEnable)
6248 {
6249 if (bEnable)
6250 {
6251 _HVD_WriteWordMask(REG_TOP_VP9, ~TOP_CKG_VP9_DIS, TOP_CKG_VP9_DIS);
6252 }
6253 else
6254 {
6255 _HVD_WriteWordMask(REG_TOP_VP9, TOP_CKG_VP9_DIS, TOP_CKG_VP9_DIS);
6256 }
6257
6258 switch (pHVDHalContext->u32VP9ClockType)
6259 {
6260 case 432:
6261 {
6262 _HVD_WriteWordMask(REG_TOP_VP9, TOP_CKG_VP9_432MHZ, TOP_CKG_VP9_CLK_MASK);
6263 break;
6264 }
6265 case 384:
6266 {
6267 _HVD_WriteWordMask(REG_TOP_VP9, TOP_CKG_VP9_384MHZ, TOP_CKG_VP9_CLK_MASK);
6268 break;
6269 }
6270 case 345:
6271 {
6272 _HVD_WriteWordMask(REG_TOP_VP9, TOP_CKG_VP9_345MHZ, TOP_CKG_VP9_CLK_MASK);
6273 break;
6274 }
6275 case 320:
6276 {
6277 _HVD_WriteWordMask(REG_TOP_VP9, TOP_CKG_VP9_320MHZ, TOP_CKG_VP9_CLK_MASK);
6278 break;
6279 }
6280 case 288:
6281 {
6282 _HVD_WriteWordMask(REG_TOP_VP9, TOP_CKG_VP9_288MHZ, TOP_CKG_VP9_CLK_MASK);
6283 break;
6284 }
6285 case 240:
6286 {
6287 _HVD_WriteWordMask(REG_TOP_VP9, TOP_CKG_VP9_240MHZ, TOP_CKG_VP9_CLK_MASK);
6288 break;
6289 }
6290 case 216:
6291 {
6292 _HVD_WriteWordMask(REG_TOP_VP9, TOP_CKG_VP9_216MHZ, TOP_CKG_VP9_CLK_MASK);
6293 break;
6294 }
6295 case 172:
6296 {
6297 _HVD_WriteWordMask(REG_TOP_VP9, TOP_CKG_VP9_172MHZ, TOP_CKG_VP9_CLK_MASK);
6298 break;
6299 }
6300 default:
6301 {
6302 _HVD_WriteWordMask(REG_TOP_VP9, TOP_CKG_VP9_432MHZ, TOP_CKG_VP9_CLK_MASK);
6303 break;
6304 }
6305 }
6306
6307 return;
6308 }
6309
HAL_VP9_EX_DeinitHW(void)6310 MS_BOOL HAL_VP9_EX_DeinitHW(void)
6311 {
6312 MS_U16 u16Timeout = 1000;
6313
6314 _HVD_WriteWordMask(VP9_REG_RESET, VP9_REG_RESET_SWRST, VP9_REG_RESET_SWRST);
6315
6316 while (u16Timeout)
6317 {
6318 if ((_HVD_Read2Byte(VP9_REG_RESET) & (VP9_REG_RESET_SWRST_FIN)) == (VP9_REG_RESET_SWRST_FIN))
6319 {
6320 break;
6321 }
6322 u16Timeout--;
6323 }
6324
6325 HAL_VP9_EX_PowerCtrl(FALSE);
6326
6327 return TRUE;
6328 }
6329 #endif
6330
HAL_HVD_EX_GetSupport2ndMVOPInterface(void)6331 MS_BOOL HAL_HVD_EX_GetSupport2ndMVOPInterface(void)
6332 {
6333 return TRUE;
6334 }
HAL_HVD_EX_SetBufferAddr(MS_U32 u32Id)6335 void HAL_HVD_EX_SetBufferAddr(MS_U32 u32Id)
6336 {
6337 _HVD_EX_SetBufferAddr(u32Id);
6338 }
6339
6340
HAL_HVD_EX_Is_RM_Supported(MS_U32 u32Id)6341 MS_BOOL HAL_HVD_EX_Is_RM_Supported(MS_U32 u32Id)
6342 {
6343 HVD_EX_Drv_Ctrl *pCtrl = _HVD_EX_GetDrvCtrl(u32Id);
6344
6345 if(pCtrl->InitParams.u16ChipECONum == 0)
6346 return FALSE;
6347 else
6348 return TRUE;
6349
6350 }
6351
6352
HAL_HVD_EX_BBU_Proc(MS_U32 u32streamIdx)6353 void HAL_HVD_EX_BBU_Proc(MS_U32 u32streamIdx)
6354 {
6355
6356 }
6357
HAL_HVD_EX_BBU_StopProc(MS_U32 u32streamIdx)6358 void HAL_HVD_EX_BBU_StopProc(MS_U32 u32streamIdx)
6359 {
6360
6361 }
6362 #endif
6363