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
102 #if defined(REDLION_LINUX_KERNEL_ENVI)
103 #include "drvHVD_Common.h"
104 #else
105 #include "MsCommon.h"
106 #endif
107
108 #include "MsOS.h"
109 #include "asmCPU.h"
110
111
112 #if !defined(MSOS_TYPE_NUTTX) || defined(SUPPORT_X_MODEL_FEATURE)
113
114 // Internal Definition
115 #include "regVPU_EX.h"
116 #include "halVPU_EX.h"
117 #include "halCHIP.h"
118 #if defined(VDEC3)
119 #include "../../../drv/hvd_v3/drvHVD_def.h"
120 #include "../hvd_v3/fwHVD_if.h"
121 #include "../mvd_v3/mvd4_interface.h"
122 #include "halHVD_EX.h"
123 #else
124 #include "../../../drv/hvd_v3/drvHVD_def.h"
125 #include "../hvd_v3/fwHVD_if.h"
126 #include "../mvd_v3/mvd4_interface.h"
127 #endif
128 #include "controller.h"
129
130 #if (ENABLE_DECOMPRESS_FUNCTION == TRUE)
131 #include "ms_decompress.h"
132 #include "ms_decompress_priv.h"
133 #endif
134 #include "../../drv/mbx/apiMBX_St.h"
135 #include "../../drv/mbx/apiMBX.h"
136
137 #if VPU_ENABLE_BDMA_FW_FLASH_2_SDRAM
138 #include "drvSERFLASH.h"
139 #define HVD_FLASHcpy(DESTADDR, SRCADDR, LEN, Flag) MDrv_SERFLASH_CopyHnd((MS_PHYADDR)(SRCADDR), (MS_PHYADDR)(DESTADDR), (LEN), (Flag), SPIDMA_OPCFG_DEF)
140 #endif
141
142
143
144 #ifndef ANDROID
145 #define VPRINTF printf
146 #else
147 #include <sys/mman.h>
148 #include <cutils/ashmem.h>
149 #include <cutils/log.h>
150 #define VPRINTF ALOGD
151 #endif
152
153
154 //-------------------------------------------------------------------------------------------------
155 // Driver Compiler Options
156 //-------------------------------------------------------------------------------------------------
157
158
159 //-------------------------------------------------------------------------------------------------
160 // Local Defines
161 //-------------------------------------------------------------------------------------------------
162 #define VPU_CTL_INTERFACE_VER 0x00000001 //the interface version of VPU driver
163
164 #define VPU_MIU1BASE_ADDR 0x40000000UL //Notice: this define must be comfirm with designer
165 #ifdef VDEC3
166 #define MAX_EVD_BBU_COUNT 1 // This definition is chip-dependent.
167 #define MAX_HVD_BBU_COUNT 2 // The Chip after Monaco(included) have two EVD BBU, must check this definition when bring up
168 #define MAX_MVD_SLQ_COUNT 2
169 #define MAX_SUPPORT_DECODER_NUM 16
170 #else
171 #define MAX_SUPPORT_DECODER_NUM 2
172 #endif
173 typedef enum
174 {
175 E_VDEC_EX_REE_TO_TEE_MBX_MSG_NULL,
176 E_VDEC_EX_REE_TO_TEE_MBX_MSG_FW_LoadCode,
177 E_VDEC_EX_REE_TO_TEE_MBX_MSG_GETSHMBASEADDR,
178 } VDEC_REE_TO_TEE_MBX_MSG_TYPE;
179
180
181 typedef enum
182 {
183 E_VDEC_EX_TEE_TO_REE_MBX_MSG_NULL,
184 E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_INVALID,
185 E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_NO_TEE,
186 E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS,
187 E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL
188 } VDEC_TEE_TO_REE_MBX_ACK_TYPE;
189
190 typedef enum
191 {
192 E_VPU_UART_CTRL_DISABLE = BIT(4),
193 E_VPU_UART_CTRL_ERR = BIT(0),
194 E_VPU_UART_CTRL_INFO = BIT(1),
195 E_VPU_UART_CTRL_DBG = BIT(2),
196 E_VPU_UART_CTRL_FW = BIT(3),
197 E_VPU_UART_CTRL_MUST = BIT(4),
198 E_VPU_UART_CTRL_TRACE = BIT(5),
199 } VPU_EX_UartCtrl;
200
201 typedef struct
202 {
203 HAL_VPU_StreamId eStreamId;
204 VPU_EX_DecoderType eDecodertype;
205 } VPU_EX_Stream;
206
207
208 #define VPU_MSG_ERR(format, args...) \
209 do \
210 { \
211 if (u32VpuUartCtrl & E_VPU_UART_CTRL_ERR) \
212 { \
213 printf("[VPU][ERR]%s:", __FUNCTION__); \
214 printf(format, ##args); \
215 } \
216 } while (0)
217
218 #define VPU_MSG_DBG(format, args...) \
219 do \
220 { \
221 if (u32VpuUartCtrl & E_VPU_UART_CTRL_DBG) \
222 { \
223 printf("[VPU][DBG]%s:", __FUNCTION__); \
224 printf(format, ##args); \
225 } \
226 } while (0)
227
228 #define VPU_MSG_INFO(format, args...) \
229 do \
230 { \
231 if (u32VpuUartCtrl & E_VPU_UART_CTRL_INFO) \
232 { \
233 printf("[VPU][INF]%s:", __FUNCTION__); \
234 printf(format, ##args); \
235 } \
236 } while (0)
237
238 //------------------------------ MIU SETTINGS ----------------------------------
239 #define _MaskMiuReq_VPU_D_RW(m) _VPU_WriteRegBit(MIU0_REG_RQ0_MASK, m, BIT(6))
240 #define _MaskMiuReq_VPU_Q_RW(m) _VPU_WriteRegBit(MIU0_REG_RQ0_MASK, m, BIT(6))
241 #define _MaskMiuReq_VPU_I_R(m) _VPU_WriteRegBit(MIU0_REG_RQ0_MASK+1, m, BIT(0))
242
243 #define _MaskMiu1Req_VPU_D_RW(m) _VPU_WriteRegBit(MIU1_REG_RQ0_MASK, m, BIT(6))
244 #define _MaskMiu1Req_VPU_Q_RW(m) _VPU_WriteRegBit(MIU1_REG_RQ0_MASK, m, BIT(6))
245 #define _MaskMiu1Req_VPU_I_R(m) _VPU_WriteRegBit(MIU1_REG_RQ0_MASK+1, m, BIT(0))
246
247 #define VPU_D_RW_ON_MIU1 ((_VPU_ReadByte(MIU0_REG_SEL0) & BIT(6)) == BIT(6))
248 #define VPU_Q_RW_ON_MIU1 ((_VPU_ReadByte(MIU0_REG_SEL0) & BIT(6)) == BIT(6))
249 #define VPU_I_R_ON_MIU1 ((_VPU_ReadByte(MIU0_REG_SEL0+1) & BIT(0)) == BIT(0)) //g08
250
251 #define _VPU_MIU_SetReqMask(miu_clients, mask) \
252 do { \
253 if (miu_clients##_ON_MIU1 == 0) \
254 _MaskMiuReq_##miu_clients(mask); \
255 else \
256 _MaskMiu1Req_##miu_clients(mask); \
257 } while(0)
258
259 #if ENABLE_VPU_MUTEX_PROTECTION
260 static MS_S32 s32VPUMutexID = -1;
261 MS_U8 _u8VPU_Mutex[] = { "VPU_Mutex" };
262
263 #define _HAL_VPU_MutexCreate() \
264 if (s32VPUMutexID < 0) \
265 { \
266 s32VPUMutexID = MsOS_CreateMutex(E_MSOS_FIFO,(char*)_u8VPU_Mutex, MSOS_PROCESS_SHARED); \
267 }
268
269 #define _HAL_VPU_MutexDelete() \
270 if (s32VPUMutexID >= 0) \
271 { \
272 MsOS_DeleteMutex(s32VPUMutexID); \
273 s32VPUMutexID = -1; \
274 }
275
276 #define _HAL_VPU_Entry() \
277 if (s32VPUMutexID >= 0) \
278 { \
279 if (!MsOS_ObtainMutex(s32VPUMutexID, VPU_DEFAULT_MUTEX_TIMEOUT)) \
280 { \
281 printf("[HAL VPU][%06d] Mutex taking timeout\n", __LINE__); \
282 } \
283 }
284
285 #define _HAL_VPU_Return(_ret) \
286 { \
287 if (s32VPUMutexID >= 0) \
288 { \
289 MsOS_ReleaseMutex(s32VPUMutexID); \
290 } \
291 return _ret; \
292 }
293
294 #define _HAL_VPU_Release() \
295 { \
296 if (s32VPUMutexID >= 0) \
297 { \
298 MsOS_ReleaseMutex(s32VPUMutexID); \
299 } \
300 }
301 #else
302 #define _HAL_VPU_MutexCreate()
303 #define _HAL_VPU_MutexDelete()
304 #define _HAL_VPU_Entry()
305 #define _HAL_VPU_Return(_ret) {return _ret;}
306 #define _HAL_VPU_Release()
307 #endif
308
309 #define VPU_FW_MEM_OFFSET 0x100000UL // 1M
310 #define VPU_CMD_TIMEOUT 1000 // 1 sec
311
312 //-------------------------------------------------------------------------------------------------
313 // Local Structures
314 //-------------------------------------------------------------------------------------------------
315 typedef struct _VPU_HWInitFunc
316 {
317 MS_BOOL (*pfMVDHW_Init)(void);
318 MS_BOOL (*pfMVDHW_Deinit)(void);
319 MS_BOOL (*pfHVDHW_Init)(MS_U32 u32Arg);
320 MS_BOOL (*pfHVDHW_Deinit)(void);
321 } VPU_HWInitFunc;
322
323 typedef struct
324 {
325 MS_U32 u32ApiHW_Version; //<Version of current structure>
326 MS_U16 u16ApiHW_Length; //<Length of this structure>
327
328 MS_U8 u8Cap_Support_Decoder_Num;
329
330 MS_BOOL bCap_Support_MPEG2;
331 MS_BOOL bCap_Support_H263;
332 MS_BOOL bCap_Support_MPEG4;
333 MS_BOOL bCap_Support_DIVX311;
334 MS_BOOL bCap_Support_DIVX412;
335 MS_BOOL bCap_Support_FLV;
336 MS_BOOL bCap_Support_VC1ADV;
337 MS_BOOL bCap_Support_VC1MAIN;
338
339 MS_BOOL bCap_Support_RV8;
340 MS_BOOL bCap_Support_RV9;
341 MS_BOOL bCap_Support_H264;
342 MS_BOOL bCap_Support_AVS;
343 MS_BOOL bCap_Support_AVS_PLUS;
344 MS_BOOL bCap_Support_MJPEG;
345 MS_BOOL bCap_Support_MVC;
346 MS_BOOL bCap_Support_VP8;
347 MS_BOOL bCap_Support_VP9;
348 MS_BOOL bCap_Support_HEVC;
349
350 /*New HW Cap and Feature add in struct at the end*/
351 }VDEC_HwCap;
352
353 //-------------------------------------------------------------------------------------------------
354 // Local Functions Prototype
355 //-------------------------------------------------------------------------------------------------
356 static MS_BOOL _VPU_EX_LoadVLCTable(VPU_EX_VLCTblCfg *pVlcCfg, MS_U8 u8FwSrcType);
357 static MS_U8 _VPU_EX_GetOffsetIdx(MS_U32 u32Id);
358 static HVD_User_Cmd _VPU_EX_MapCtrlCmd(VPU_EX_TaskInfo *pTaskInfo);
359
360 //-------------------------------------------------------------------------------------------------
361 // Global Variables
362 //-------------------------------------------------------------------------------------------------
363 extern HVD_Return HAL_HVD_EX_SetCmd(MS_U32 u32Id, HVD_User_Cmd eUsrCmd, MS_U32 u32CmdArg);
364 extern MS_BOOL HAL_MVD_InitHW(void);
365 extern MS_BOOL HAL_MVD_DeinitHW(void);
366 extern MS_BOOL HAL_HVD_EX_InitHW(MS_U32 u32Id,VPU_EX_DecoderType DecoderType);
367 extern MS_BOOL HAL_HVD_EX_DeinitHW(void);
368 extern void HAL_HVD_EX_SetBufferAddr(MS_U32 u32Id);
369 extern MS_U32 HAL_HVD_EX_GetShmAddr(MS_U32 u32Id);
370 #if SUPPORT_G2VP9 && defined(VDEC3)
371 extern MS_BOOL HAL_VP9_EX_DeinitHW(void);
372 #endif
373 #if defined (__aeon__)
374 static MS_U32 u32VPURegOSBase = 0xA0000000;
375 #else
376 static MS_U32 u32VPURegOSBase = 0xBF200000;
377 #endif
378
379 //-------------------------------------------------------------------------------------------------
380 // Local Variables
381 //-------------------------------------------------------------------------------------------------
382 #if 0
383
384 static MS_BOOL _bVPUPowered = FALSE;
385 static MS_BOOL _bVPURsted = FALSE;
386 static MS_BOOL _bVPUSingleMode = FALSE;
387 static VPU_EX_DecModCfg _stVPUDecMode;
388
389 static MS_U8 u8TaskCnt = 0;
390
391 static MS_U32 u32VpuUartCtrl = (E_VPU_UART_CTRL_ERR | E_VPU_UART_CTRL_MUST);
392
393 //Notice: this function must be consistent with _VPU_EX_GetOffsetIdx()
394 static VPU_EX_Stream _stVPUStream[] =
395 {
396 {E_HAL_VPU_MAIN_STREAM0, E_VPU_EX_DECODER_NONE},
397 {E_HAL_VPU_SUB_STREAM0, E_VPU_EX_DECODER_NONE},
398 };
399 static VPU_HWInitFunc stHWInitFunc =
400 {
401 &HAL_MVD_InitHW,
402 &HAL_MVD_DeinitHW,
403 &HAL_HVD_EX_InitHW,
404 &HAL_HVD_EX_DeinitHW,
405 };
406
407 #endif
408
409 #if VPU_ENABLE_EMBEDDED_FW_BINARY
410 static const MS_U8 u8HVD_FW_Binary[] = {
411 #include "fwVPU.dat"
412 };
413
414 #if HVD_ENABLE_RV_FEATURE
415 static const MS_U8 u8HVD_VLC_Binary[] = {
416 #include "fwVPU_VLC.dat"
417 };
418 #endif
419 #endif
420
421
422 #ifdef VDEC3
423 typedef struct
424 {
425 MS_BOOL bTSP;
426 MS_U32 u32Used;
427 } BBU_STATE;
428
429 typedef struct
430 {
431 MS_BOOL bTSP;
432 MS_BOOL bUsedbyMVD;
433 MS_U32 u32Used;
434 } SLQ_STATE;
435 #endif
436
437 typedef struct
438 {
439 MS_BOOL _bVPUPowered;
440 MS_BOOL _bVPURsted;
441 MS_BOOL _bVPUSingleMode;
442 VPU_EX_DecModCfg _stVPUDecMode;
443 MS_U8 u8TaskCnt;
444 //Notice: this function must be consistent with _VPU_EX_GetOffsetIdx()
445 #ifdef VDEC3
446 VPU_EX_Stream _stVPUStream[MAX_SUPPORT_DECODER_NUM];
447 #else
448 VPU_EX_Stream _stVPUStream[2];
449 #endif
450
451 VPU_HWInitFunc stHWInitFunc;
452
453 MS_BOOL bVpuExReloadFW;
454 MS_BOOL bVpuExLoadFWRlt;
455 MS_U32 u32VPUSHMAddr; //PA
456 MS_BOOL bEnableVPUSecureMode;
457
458 MS_U32 u32FWShareInfoAddr[MAX_SUPPORT_DECODER_NUM];
459 #ifdef VDEC3
460 MS_U32 u32FWCodeAddr;
461 MS_U32 u32BitstreamAddress;
462
463 BBU_STATE stHVD_BBU_STATE[MAX_HVD_BBU_COUNT];
464 BBU_STATE stEVD_BBU_STATE[MAX_EVD_BBU_COUNT];
465 SLQ_STATE stMVD_SLQ_STATE[MAX_MVD_SLQ_COUNT];
466
467 MS_U8 u8HALId[MAX_SUPPORT_DECODER_NUM];
468 #endif
469 } VPU_Hal_CTX;
470
471 //global variables
472 VPU_Hal_CTX* pVPUHalContext = NULL;
473 VPU_Hal_CTX gVPUHalContext;
474 MS_U32 u32VpuUartCtrl = (E_VPU_UART_CTRL_ERR | E_VPU_UART_CTRL_MUST);
475 MS_BOOL bVPUMbxInitFlag = 0;
476 MS_U8 u8VPUMbxMsgClass = 0;
477 MBX_Msg VPUReeToTeeMbxMsg;
478 MBX_Msg VPUTeeToReeMbxMsg;
479
480 //-------------------------------------------------------------------------------------------------
481 // Debug Functions
482 //-------------------------------------------------------------------------------------------------
483 #if 0
484 static MBX_ROLE_ID _VPU_EX_CpuIdMapRoleId(MBX_CPU_ID id)
485 {
486 MBX_ROLE_ID res = E_MBX_ROLE_MAX;
487 switch(id)
488 {
489 case E_MBX_CPU_PM :res = E_MBX_ROLE_HK;break;
490 case E_MBX_CPU_AEON :res = E_MBX_ROLE_CP;break;
491 //case E_MBX_CPU_MIPS :
492 //case E_MBX_CPU_R2M :
493 case E_MBX_CPU_MIPS_VPE0 :res = E_MBX_ROLE_PM;break;
494 case E_MBX_CPU_MIPS_VPE1 :res = E_MBX_ROLE_MAX;break;
495 default:break;
496 }
497 return res;
498 }
499 #endif
500
501 //-------------------------------------------------------------------------------------------------
502 // Local Functions
503 //-------------------------------------------------------------------------------------------------
504
_VPU_EX_LoadVLCTable(VPU_EX_VLCTblCfg * pVlcCfg,MS_U8 u8FwSrcType)505 static MS_BOOL _VPU_EX_LoadVLCTable(VPU_EX_VLCTblCfg *pVlcCfg, MS_U8 u8FwSrcType)
506 {
507 #if HVD_ENABLE_RV_FEATURE
508 if (E_HVD_FW_INPUT_SOURCE_FLASH == u8FwSrcType)
509 {
510 #if VPU_ENABLE_BDMA_FW_FLASH_2_SDRAM
511 VPU_MSG_DBG("Load VLC outF2D: dest:0x%lx source:%lx size:%lx\n",
512 pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
513
514 if (pVlcCfg->u32BinSize)
515 {
516 SPIDMA_Dev cpyflag = E_SPIDMA_DEV_MIU1;
517
518 MS_U32 u32Start;
519 MS_U32 u32StartOffset;
520 MS_U8 u8MiuSel;
521
522 // Get MIU selection and offset from physical address = 0x30000000
523 _phy_to_miu_offset(u8MiuSel, u32StartOffset, pVlcCfg->u32FrameBufAddr);
524
525
526 if(u8MiuSel == E_CHIP_MIU_0)
527 cpyflag = E_SPIDMA_DEV_MIU0;
528 else if(u8MiuSel == E_CHIP_MIU_1)
529 cpyflag = E_SPIDMA_DEV_MIU1;
530 else if(u8MiuSel == E_CHIP_MIU_2)
531 cpyflag = E_SPIDMA_DEV_MIU2;
532
533 if (!HVD_FLASHcpy(MsOS_VA2PA(pVlcCfg->u32DstAddr), MsOS_VA2PA(pVlcCfg->u32BinAddr), pVlcCfg->u32BinSize, cpyflag))
534 {
535 VPU_MSG_ERR("HVD_BDMAcpy VLC table Flash 2 DRAM failed: dest:0x%lx src:0x%lx size:0x%lx flag:%lu\n",
536 pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize, (MS_U32) cpyflag);
537
538 return FALSE;
539 }
540 }
541 else
542 {
543 VPU_MSG_ERR("During copy VLC from Flash to Dram, the source size of FW is zero\n");
544 return FALSE;
545 }
546 #else
547 VPU_MSG_ERR("driver not enable to use BDMA copy VLC from flash 2 sdram.\n");
548 return FALSE;
549 #endif
550 }
551 else
552 {
553 if (E_HVD_FW_INPUT_SOURCE_DRAM == u8FwSrcType)
554 {
555 if ((pVlcCfg->u32BinAddr != 0) && (pVlcCfg->u32BinSize != 0))
556 {
557 VPU_MSG_INFO("Load VLC outD2D: dest:0x%lx source:%lx size:%lx\n",
558 pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
559
560 #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
561 BDMA_Result bdmaRlt;
562 MS_U32 u32DstAdd = 0, u32SrcAdd = 0, u32tabsize = 0;
563
564 u32DstAdd = pVlcCfg->u32FrameBufAddr + pVlcCfg->u32VLCTableOffset;
565 u32SrcAdd = pVlcCfg->u32BinAddr;
566 u32tabsize = pVlcCfg->u32BinSize;
567 //bdmaRlt = MDrv_BDMA_MemCopy(u32SrcAdd, u32DstAdd, SLQ_TBL_SIZE);
568 MsOS_FlushMemory();
569 bdmaRlt = HVD_dmacpy(u32DstAdd, u32SrcAdd, u32tabsize);
570
571 if (E_BDMA_OK != bdmaRlt)
572 {
573 VPU_MSG_ERR("MDrv_BDMA_MemCopy fail in %s(), ret=%x!\n", __FUNCTION__, bdmaRlt);
574 }
575 #else
576 HVD_memcpy(pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
577 #endif
578 }
579 else
580 {
581 VPU_MSG_ERR
582 ("During copy VLC from out Dram to Dram, the source size or virtual address of VLC is zero\n");
583 return FALSE;
584 }
585 }
586 else
587 {
588 #if VPU_ENABLE_EMBEDDED_FW_BINARY
589 #ifdef HVD_CACHE_TO_UNCACHE_CONVERT
590 MS_U8 *pu8HVD_VLC_Binary;
591
592 pu8HVD_VLC_Binary = (MS_U8 *) ((MS_U32) u8HVD_VLC_Binary | 0xA0000000);
593
594 VPU_MSG_DBG("Load VLC inD2D: dest:0x%lx source:%lx size:%lx\n",
595 pVlcCfg->u32FrameBufAddr + pVlcCfg->u32VLCTableOffset, ((MS_U32) pu8HVD_VLC_Binary),
596 (MS_U32) sizeof(u8HVD_VLC_Binary));
597
598 HVD_memcpy((void *) (pVlcCfg->u32FrameBufAddr + pVlcCfg->u32VLCTableOffset),
599 (void *) ((MS_U32) pu8HVD_VLC_Binary), sizeof(u8HVD_VLC_Binary));
600 #else
601 VPU_MSG_INFO("Load VLC inD2D: dest:0x%lx source:%lx size:%lx\n",
602 MsOS_VA2PA(pVlcCfg->u32DstAddr), (MS_U32) u8HVD_VLC_Binary,
603 (MS_U32) sizeof(u8HVD_VLC_Binary));
604
605 HVD_memcpy(pVlcCfg->u32DstAddr, ((MS_U32) u8HVD_VLC_Binary), sizeof(u8HVD_VLC_Binary));
606 #endif
607 #else
608 VPU_MSG_ERR("driver not enable to use embedded VLC binary.\n");
609 return FALSE;
610 #endif
611 }
612 }
613 #endif
614
615 return TRUE;
616 }
617
618 //Notice: this function must be consistent with _stVPUStream[]
_VPU_EX_GetOffsetIdx(MS_U32 u32Id)619 static MS_U8 _VPU_EX_GetOffsetIdx(MS_U32 u32Id)
620 {
621 MS_U8 u8OffsetIdx = 0;
622 MS_U8 u8VSidBaseMask = 0xF0;
623 HAL_VPU_StreamId eVSidBase = (HAL_VPU_StreamId)(u32Id & u8VSidBaseMask);
624
625 switch (eVSidBase)
626 {
627 case E_HAL_VPU_MAIN_STREAM_BASE:
628 {
629 u8OffsetIdx = 0;
630 break;
631 }
632 case E_HAL_VPU_SUB_STREAM_BASE:
633 {
634 u8OffsetIdx = 1;
635 break;
636 }
637 case E_HAL_VPU_MVC_STREAM_BASE:
638 {
639 u8OffsetIdx = 0;
640 break;
641 }
642 #ifdef VDEC3
643 case E_HAL_VPU_N_STREAM_BASE:
644 {
645 u8OffsetIdx = u32Id & 0x0F;
646 break;
647 }
648 #endif
649 default:
650 {
651 u8OffsetIdx = 0;
652 break;
653 }
654 }
655
656 /*
657 VPU_MSG_DBG("u32Id=0x%lx, eVSidBase=0x%x, u8OffsetIdx=0x%x\n",
658 u32Id, eVSidBase, u8OffsetIdx);
659 */
660 return u8OffsetIdx;
661 }
662
_VPU_EX_Context_Init(void)663 static void _VPU_EX_Context_Init(void)
664 {
665 #ifdef VDEC3
666 MS_U8 i;
667
668 for (i = 0; i < MAX_SUPPORT_DECODER_NUM; i++)
669 {
670 pVPUHalContext->_stVPUStream[i].eStreamId = E_HAL_VPU_N_STREAM0 + i;
671 pVPUHalContext->u32FWShareInfoAddr[i] = 0xFFFFFFFFUL;
672 }
673
674 for (i = 0; i < MAX_HVD_BBU_COUNT; i++)
675 {
676 pVPUHalContext->stHVD_BBU_STATE[i].bTSP = FALSE;
677 pVPUHalContext->stHVD_BBU_STATE[i].u32Used = 0;
678 }
679
680 for (i = 0; i < MAX_EVD_BBU_COUNT; i++)
681 {
682 pVPUHalContext->stEVD_BBU_STATE[i].bTSP = FALSE;
683 pVPUHalContext->stEVD_BBU_STATE[i].u32Used = 0;
684 }
685
686 for (i = 0; i < MAX_MVD_SLQ_COUNT; i++)
687 {
688 pVPUHalContext->stMVD_SLQ_STATE[i].bTSP = FALSE;
689 pVPUHalContext->stMVD_SLQ_STATE[i].bUsedbyMVD= FALSE;
690 pVPUHalContext->stMVD_SLQ_STATE[i].u32Used = 0;
691 }
692 #else
693 pVPUHalContext->_stVPUStream[0].eStreamId = E_HAL_VPU_MAIN_STREAM0;
694 pVPUHalContext->_stVPUStream[1].eStreamId = E_HAL_VPU_SUB_STREAM0;
695 #endif
696 pVPUHalContext->bVpuExReloadFW = TRUE;
697 }
698
_VPU_EX_MapCtrlCmd(VPU_EX_TaskInfo * pTaskInfo)699 static HVD_User_Cmd _VPU_EX_MapCtrlCmd(VPU_EX_TaskInfo *pTaskInfo)
700 {
701 HVD_User_Cmd eCmd = E_HVD_CMD_INVALID_CMD;
702 MS_U8 u8OffsetIdx = 0;
703
704 if (NULL == pTaskInfo)
705 {
706 return eCmd;
707 }
708
709 u8OffsetIdx = _VPU_EX_GetOffsetIdx(pTaskInfo->u32Id);
710
711 VPU_MSG_INFO("input TaskInfo u32Id=0x%08lx eVpuId=0x%x src=0x%x dec=0x%x\n",
712 pTaskInfo->u32Id, pTaskInfo->eVpuId, pTaskInfo->eSrcType, pTaskInfo->eDecType);
713
714 #ifdef VDEC3
715 if (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
716 {
717 if (E_VPU_EX_INPUT_TSP == pTaskInfo->eSrcType)
718 {
719 eCmd = E_NST_CMD_TASK_MVD_TSP;
720 }
721 else if (E_VPU_EX_INPUT_FILE == pTaskInfo->eSrcType)
722 {
723 eCmd = E_NST_CMD_TASK_MVD_SLQ;
724 }
725 }
726 #else
727 if (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
728 {
729 if (E_VPU_EX_INPUT_TSP == pTaskInfo->eSrcType)
730 {
731 eCmd = (u8OffsetIdx == 0) ? E_DUAL_CMD_TASK0_MVD_TSP : E_DUAL_CMD_TASK1_MVD_TSP;
732 }
733 else if (E_VPU_EX_INPUT_FILE == pTaskInfo->eSrcType)
734 {
735 eCmd = (u8OffsetIdx == 0) ? E_DUAL_CMD_TASK0_MVD_SLQ : E_DUAL_CMD_TASK1_MVD_SLQ;
736 }
737 }
738 #endif
739 #ifdef VDEC3
740 #if SUPPORT_G2VP9
741 else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_G2VP9 == pTaskInfo->eDecType)
742 #else
743 else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType)
744 #endif
745 {
746 if (E_VPU_EX_INPUT_TSP == pTaskInfo->eSrcType)
747 {
748 eCmd = E_NST_CMD_TASK_HVD_TSP;
749 }
750 else if (E_VPU_EX_INPUT_FILE == pTaskInfo->eSrcType)
751 {
752 eCmd = E_NST_CMD_TASK_HVD_BBU;
753 }
754 }
755 #else
756 else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
757 {
758 if (E_VPU_EX_INPUT_TSP == pTaskInfo->eSrcType)
759 {
760 eCmd = (u8OffsetIdx == 0) ? E_DUAL_CMD_TASK0_HVD_TSP : E_DUAL_CMD_TASK1_HVD_TSP;
761 }
762 else if (E_VPU_EX_INPUT_FILE == pTaskInfo->eSrcType)
763 {
764 eCmd = (u8OffsetIdx == 0) ? E_DUAL_CMD_TASK0_HVD_BBU : E_DUAL_CMD_TASK1_HVD_BBU;
765 }
766 }
767 #endif
768
769 VPU_MSG_INFO("output: eCmd=0x%x offsetIdx=0x%x\n", eCmd, u8OffsetIdx);
770 return eCmd;
771 }
772
_VPU_EX_InitHW(VPU_EX_TaskInfo * pTaskInfo)773 static MS_BOOL _VPU_EX_InitHW(VPU_EX_TaskInfo *pTaskInfo)
774 {
775 if (!pTaskInfo)
776 {
777 VPU_MSG_ERR("null input\n");
778 return FALSE;
779 }
780
781 //Check if we need to init MVD HW
782 if ((E_VPU_EX_INPUT_TSP == pTaskInfo->eSrcType) ||
783 (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType))
784 {
785 //Init HW
786 if (FALSE == HAL_VPU_EX_MVDInUsed())
787 {
788 if (TRUE != HAL_MVD_InitHW())
789 {
790 VPU_MSG_ERR("(%d):HAL_MVD_InitHW failed\n", __LINE__);
791 return FALSE;
792 }
793 }
794 else
795 {
796 VPU_MSG_ERR("(%d): do nothing\n", __LINE__);
797 }
798 }
799
800 //MVD use sub mvop
801 if((E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType) &&
802 #ifdef VDEC3
803 (pTaskInfo->u8HalId == 1) )
804 #else
805 (E_HAL_VPU_SUB_STREAM0 == pTaskInfo->eVpuId))
806 #endif
807 {
808 VPU_MSG_ERR("Force turn on HVD\n");
809 if(!HAL_VPU_EX_HVDInUsed())
810 {
811 if(E_VPU_DEC_MODE_DUAL_INDIE == pVPUHalContext->_stVPUDecMode.u8DecMod)
812 {
813 if (!HAL_HVD_EX_InitHW(pTaskInfo->u32Id,pTaskInfo->eDecType))
814 {
815 VPU_MSG_ERR("(%d):HAL_HVD_EX_InitHW failed\n", __LINE__);
816 return FALSE;
817 }
818 }
819 else
820 {
821 VPU_MSG_INFO("%s MVD 3DTV sub\n",__FUNCTION__);
822 HAL_HVD_EX_PowerCtrl(TRUE);
823 }
824 }
825 else
826 {
827 VPU_MSG_ERR("(%d): do nothing, HVD already init\n", __LINE__);
828 }
829 }
830
831 //Check if we need to init HVD HW
832 #ifdef VDEC3
833 if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType)
834 #else
835 if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
836 #endif
837 {
838 if (!HAL_VPU_EX_MVDInUsed())
839 {
840 if (!HAL_MVD_InitHW())
841 {
842 VPU_MSG_ERR("(%d):HAL_MVD_InitHW failed\n", __LINE__);
843 return FALSE;
844 }
845 }
846
847 if (!HAL_HVD_EX_InitHW(pTaskInfo->u32Id,pTaskInfo->eDecType))
848 {
849 VPU_MSG_ERR("(%d):HAL_HVD_EX_InitHW failed\n", __LINE__);
850 return FALSE;
851 }
852 }
853
854 #if SUPPORT_G2VP9 && defined(VDEC3)
855 if (E_VPU_EX_DECODER_G2VP9 == pTaskInfo->eDecType)
856 {
857 if (!HAL_VPU_EX_MVDInUsed())
858 {
859 if (!HAL_MVD_InitHW())
860 {
861 VPU_MSG_ERR("(%d):HAL_MVD_InitHW failed\n", __LINE__);
862 return FALSE;
863 }
864 }
865 if (!HAL_HVD_EX_InitHW(pTaskInfo->u32Id,pTaskInfo->eDecType))
866 {
867 VPU_MSG_ERR("(%d):HAL_HVD_EX_InitHW failed for VP9\n", __LINE__);
868 return FALSE;
869 }
870 }
871 #endif
872
873 return TRUE;
874 }
875
_VPU_EX_InClock(MS_U32 u32type)876 static MS_U32 _VPU_EX_InClock(MS_U32 u32type)
877 {
878 switch (u32type)
879 {
880 case VPU_CLOCK_240MHZ:
881 return 240000000UL;
882 case VPU_CLOCK_216MHZ:
883 return 216000000UL;
884 case VPU_CLOCK_192MHZ:
885 return 192000000UL;
886 case VPU_CLOCK_320MHZ:
887 return 320000000UL;
888 case VPU_CLOCK_288MHZ:
889 return 288000000UL;
890 default:
891 return 240000000UL;
892 }
893 }
894
895
896
897 #if defined(MSOS_TYPE_LINUX)
898 //For REE
HAL_VPU_EX_REE_RegisterMBX(void)899 MS_BOOL HAL_VPU_EX_REE_RegisterMBX(void)
900 {
901 MS_U8 ClassNum = 0;
902 MBX_Result result;
903
904 if (bVPUMbxInitFlag == TRUE)
905 {
906 return TRUE;
907 }
908
909 if (E_MBX_SUCCESS != MApi_MBX_Init(E_MBX_CPU_MIPS,E_MBX_ROLE_HK,1000))
910 {
911 VPU_MSG_ERR("VDEC_TEE MApi_MBX_Init fail\n");
912 return FALSE;
913 }
914 else
915 {
916 MApi_MBX_Enable(TRUE);
917 }
918
919 result = MApi_MBX_QueryDynamicClass(E_MBX_CPU_MIPS_VPE1, "VDEC_TEE", (MS_U8 *)&ClassNum);
920
921 if (E_MBX_SUCCESS != result)
922 {
923 VPU_MSG_ERR("VDEC_TEE MApi_MBX_QueryDynamicClass fail,result %d\n",(unsigned int)result);
924 return FALSE;
925 }
926
927 result = MApi_MBX_RegisterMSG(ClassNum, 10);
928
929 if (( E_MBX_SUCCESS != result) && ( E_MBX_ERR_SLOT_AREADY_OPENNED != result ))
930 {
931 VPU_MSG_ERR("%s fail\n",__FUNCTION__);
932 return FALSE;
933 }
934 else
935 {
936 bVPUMbxInitFlag = TRUE;
937 u8VPUMbxMsgClass = ClassNum;
938 return TRUE;
939 }
940 }
_VPU_EX_REE_SendMBXMsg(VDEC_REE_TO_TEE_MBX_MSG_TYPE msg_type)941 VDEC_TEE_TO_REE_MBX_ACK_TYPE _VPU_EX_REE_SendMBXMsg(VDEC_REE_TO_TEE_MBX_MSG_TYPE msg_type)
942 {
943 MBX_Result result;
944 VDEC_TEE_TO_REE_MBX_ACK_TYPE u8Index;
945
946 if (pVPUHalContext->bEnableVPUSecureMode == FALSE)
947 {
948 return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_NO_TEE;
949 }
950
951 if (bVPUMbxInitFlag == FALSE)
952 {
953 return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_INVALID;
954 }
955
956 VPUReeToTeeMbxMsg.eRoleID = E_MBX_CPU_MIPS_VPE1;
957 VPUReeToTeeMbxMsg.u8Ctrl = 0;
958 VPUReeToTeeMbxMsg.eMsgType = E_MBX_MSG_TYPE_INSTANT;
959 VPUReeToTeeMbxMsg.u8MsgClass = u8VPUMbxMsgClass;
960 VPUReeToTeeMbxMsg.u8Index = msg_type;
961
962 result = MApi_MBX_SendMsg(&VPUReeToTeeMbxMsg);
963 if (E_MBX_SUCCESS != result)
964 {
965 printf("VDEC_TEE Send MBX fail,result %d\n",(unsigned int)result);
966 return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL;
967 }
968
969 // Receive Reply ACK from TEE side.
970 memset(&VPUTeeToReeMbxMsg, 0, sizeof(MBX_Msg));
971
972 VPUTeeToReeMbxMsg.u8MsgClass = u8VPUMbxMsgClass;
973
974 #if 0 // marked temperarily, wait kernel team to fix MApi_MBX_RecvMsg.
975 if(E_MBX_SUCCESS != MApi_MBX_RecvMsg(TEE_MBX_MSG_CLASS, &(TEE_TO_REE_MBX_MSG), 20, MBX_CHECK_INSTANT_MSG))
976 {
977 VPU_MSG_ERR("VDEC get Secure world ACK fail\n");
978 return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL;
979 }
980 else
981 #else
982 do
983 {
984 result = MApi_MBX_RecvMsg(u8VPUMbxMsgClass, &VPUTeeToReeMbxMsg, 2000, MBX_CHECK_INSTANT_MSG);
985 } while(E_MBX_SUCCESS != result);
986 #endif
987 {
988 u8Index = VPUTeeToReeMbxMsg.u8Index;
989 VPU_MSG_DBG("VDEC get ACK cmd:%x\n", u8Index);
990
991 if (E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL == u8Index)
992 {
993 return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL;
994 }
995 }
996
997 return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS;
998 }
999
HAL_VPU_EX_REE_SetSHMBaseAddr(void)1000 MS_BOOL HAL_VPU_EX_REE_SetSHMBaseAddr(void)
1001 {
1002 if(_VPU_EX_REE_SendMBXMsg(E_VDEC_EX_REE_TO_TEE_MBX_MSG_GETSHMBASEADDR) != E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS)
1003 {
1004 VPU_MSG_ERR("[Error] VDEC load code in Secure world fail!\n");
1005 return FALSE;
1006 }
1007 else
1008 {
1009 MS_U32 u32VPUSHMoffset = (VPUTeeToReeMbxMsg.u8Parameters[0]&0xff) |
1010 ((VPUTeeToReeMbxMsg.u8Parameters[1]<<8)&0xff00)|
1011 ((VPUTeeToReeMbxMsg.u8Parameters[2]<<16)&0xff0000)|
1012 ((VPUTeeToReeMbxMsg.u8Parameters[3]<<24)&0xff000000);
1013 MS_U32 u32VPUSHMsize = (VPUTeeToReeMbxMsg.u8Parameters[4]&0xff) |
1014 ((VPUTeeToReeMbxMsg.u8Parameters[5]<<8)&0xff00)|
1015 ((VPUTeeToReeMbxMsg.u8Parameters[6]<<16)&0xff0000)|
1016 ((VPUTeeToReeMbxMsg.u8Parameters[7]<<24)&0xff000000);
1017
1018 VPU_MSG_INFO("u32VPUSHMoffset %x,u32VPUSHMsize %x,miu %d\n",(unsigned int)u32VPUSHMoffset,(unsigned int)u32VPUSHMsize,VPUTeeToReeMbxMsg.u8Parameters[8]);
1019 if(VPUTeeToReeMbxMsg.u8Parameters[8] == 1)
1020 {
1021 pVPUHalContext->u32VPUSHMAddr = u32VPUSHMoffset+HAL_MIU1_BASE;
1022 }
1023 else
1024 {
1025 pVPUHalContext->u32VPUSHMAddr = u32VPUSHMoffset;
1026 }
1027 }
1028 return TRUE;
1029
1030 }
1031 #endif
1032
HAL_VPU_EX_GetFWReload(void)1033 MS_BOOL HAL_VPU_EX_GetFWReload(void)
1034 {
1035 return pVPUHalContext->bVpuExReloadFW;
1036 }
1037
_VPU_EX_IsNeedDecompress(MS_U32 u32SrcAddr)1038 static MS_BOOL _VPU_EX_IsNeedDecompress(MS_U32 u32SrcAddr)
1039 {
1040 if(*((MS_U8*)(u32SrcAddr))=='V' && *((MS_U8*)(u32SrcAddr+1))=='D'
1041 && *((MS_U8*)(u32SrcAddr+2))=='E' && *((MS_U8*)(u32SrcAddr+3))=='C'
1042 && *((MS_U8*)(u32SrcAddr+4))=='3' && *((MS_U8*)(u32SrcAddr+5))=='1'
1043 && *((MS_U8*)(u32SrcAddr+0xe8))=='V' && *((MS_U8*)(u32SrcAddr+0xe9))=='D'
1044 && *((MS_U8*)(u32SrcAddr+0xea))=='E' && *((MS_U8*)(u32SrcAddr+0xeb))=='C'
1045 && *((MS_U8*)(u32SrcAddr+0xec))=='3' && *((MS_U8*)(u32SrcAddr+0xed))=='0'
1046 )
1047 {
1048 return FALSE;
1049 }
1050 else
1051 {
1052 return TRUE;
1053 }
1054 }
1055
_VPU_EX_InitAll(VPU_EX_NDecInitPara * pInitPara)1056 static MS_BOOL _VPU_EX_InitAll(VPU_EX_NDecInitPara *pInitPara)
1057 {
1058 MS_U32 u32fwPA = NULL; //physical address
1059 VPU_EX_ClockSpeed eClkSpeed = E_VPU_EX_CLOCK_320MHZ;
1060
1061 if (TRUE == HAL_VPU_EX_IsPowered())
1062 {
1063 VPU_MSG_DBG("IsPowered\n");
1064 return TRUE;
1065 }
1066 else
1067 {
1068 //VPU hold
1069 HAL_VPU_EX_SwRst(FALSE);
1070
1071 //VPU clock on
1072 VPU_EX_InitParam VPUInitParams = {eClkSpeed, FALSE, -1, VPU_DEFAULT_MUTEX_TIMEOUT, TRUE};
1073
1074 if (VPU_I_R_ON_MIU1)
1075 VPUInitParams.u8MiuSel = 1;
1076 else
1077 VPUInitParams.u8MiuSel = 0;
1078 //else if (VPU_I_R_ON_MIU2)
1079 // VPUInitParams.u8MiuSel = 2;
1080
1081 HAL_VPU_EX_Init(&VPUInitParams);
1082 }
1083
1084 VPU_EX_FWCodeCfg *pFWCodeCfg = NULL;
1085 VPU_EX_TaskInfo *pTaskInfo = NULL;
1086 VPU_EX_VLCTblCfg *pVlcCfg = NULL;
1087
1088 if (pInitPara)
1089 {
1090 pFWCodeCfg = pInitPara->pFWCodeCfg;
1091 pTaskInfo = pInitPara->pTaskInfo;
1092 pVlcCfg = pInitPara->pVLCCfg;
1093 }
1094 else
1095 {
1096 VPU_MSG_DBG("(%d) NULL para\n", __LINE__);
1097 return FALSE;
1098 }
1099
1100 u32fwPA = MsOS_VA2PA(pFWCodeCfg->u32DstAddr);
1101 #if defined(MSOS_TYPE_LINUX)
1102 if(pVPUHalContext->bEnableVPUSecureMode == TRUE)
1103 {
1104 VPU_MSG_INFO("Load VDEC f/w code in Secure World\n");
1105
1106 if (FALSE == HAL_VPU_EX_GetFWReload())
1107 {
1108 if (FALSE == pVPUHalContext->bVpuExLoadFWRlt)
1109 {
1110 VPU_MSG_INFO("Never load fw successfully, load it anyway!\n");
1111 if(_VPU_EX_REE_SendMBXMsg(E_VDEC_EX_REE_TO_TEE_MBX_MSG_FW_LoadCode) != E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS)
1112 {
1113 VPU_MSG_ERR("[Error] VDEC load code in Secure world fail!\n");
1114 return FALSE;
1115 }
1116 pVPUHalContext->bVpuExLoadFWRlt = TRUE;
1117 }
1118 else
1119 {
1120 //Check f/w prefix "VDEC30"
1121 if (_VPU_EX_IsNeedDecompress(pFWCodeCfg->u32DstAddr) != FALSE)
1122 {
1123 VPU_MSG_ERR("Wrong prefix: reload fw!\n");
1124 if(_VPU_EX_REE_SendMBXMsg(E_VDEC_EX_REE_TO_TEE_MBX_MSG_FW_LoadCode) != E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS)
1125 {
1126 VPU_MSG_ERR("[Error] VDEC load code in Secure world fail!\n");
1127 pVPUHalContext->bVpuExLoadFWRlt = FALSE;
1128 return FALSE;
1129 }
1130 }
1131 else
1132 {
1133 VPU_MSG_INFO("Skip loading fw this time!!!\n");
1134 }
1135 }
1136 }
1137 else
1138 {
1139 if(_VPU_EX_REE_SendMBXMsg(E_VDEC_EX_REE_TO_TEE_MBX_MSG_FW_LoadCode) != E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS)
1140 {
1141 VPU_MSG_ERR("[Error] VDEC load code in Secure world fail!\n");
1142 pVPUHalContext->bVpuExLoadFWRlt = FALSE;
1143 return FALSE;
1144 }
1145 pVPUHalContext->bVpuExLoadFWRlt = TRUE;
1146 }
1147 }
1148 else
1149 #endif
1150 {
1151 VPU_MSG_INFO("Load VDEC f/w code in Normal World\n");
1152
1153 if (!HAL_VPU_EX_LoadCode(pFWCodeCfg))
1154 {
1155 VPU_MSG_ERR("HAL_VPU_EX_LoadCode fail!\n");
1156 return FALSE;
1157 }
1158 }
1159
1160 if (pVlcCfg)
1161 {
1162 if (!_VPU_EX_LoadVLCTable(pVlcCfg, pFWCodeCfg->u8SrcType))
1163 {
1164 VPU_MSG_ERR("HAL_VPU_LoadVLCTable fail!\n");
1165 return FALSE;
1166 }
1167 }
1168
1169 if (!HAL_VPU_EX_CPUSetting(u32fwPA))
1170 {
1171 VPU_MSG_ERR("HAL_VPU_EX_CPUSetting fail!\n");
1172 return FALSE;
1173 }
1174
1175 //Init HW
1176 if (FALSE == _VPU_EX_InitHW(pTaskInfo))
1177 {
1178 VPU_MSG_ERR("(%d): InitHW failed\n", __LINE__);
1179 //_MVD_INIT_FAIL_RET();
1180 return FALSE;
1181 }
1182 else
1183 {
1184 VPU_MSG_DBG("(%d): InitHW success\n", __LINE__);
1185 }
1186
1187 //set vpu clock to FW
1188 struct _ctl_info *ctl_ptr = (struct _ctl_info *)
1189 MsOS_PA2KSEG1(MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr) + CTL_INFO_ADDR);
1190
1191 ctl_ptr->statue = CTL_STU_NONE;
1192 //notify controller the interface version of VPU driver.
1193 ctl_ptr->ctl_interface = VPU_CTL_INTERFACE_VER;
1194 ctl_ptr->vpu_clk = _VPU_EX_InClock(eClkSpeed);
1195 MsOS_FlushMemory();
1196 VPU_MSG_DBG("clock speed=0x%x\n", ctl_ptr->vpu_clk);
1197
1198 //Release VPU: For dual decoder, we only release VPU if it is not released yet.
1199 if (TRUE == HAL_VPU_EX_IsRsted())
1200 {
1201 VPU_MSG_DBG("VPU_IsRsted\n");
1202 return TRUE;
1203 }
1204 else
1205 {
1206 HAL_VPU_EX_SwRstRelse();
1207 }
1208
1209 return TRUE;
1210 }
1211
_VPU_EX_DeinitHW(void)1212 static MS_BOOL _VPU_EX_DeinitHW(void)
1213 {
1214 MS_BOOL bRet = FALSE;
1215
1216 if (FALSE == HAL_VPU_EX_MVDInUsed())
1217 {
1218 bRet = HAL_MVD_DeinitHW();
1219 }
1220
1221 if (FALSE == HAL_VPU_EX_HVDInUsed())
1222 {
1223 bRet = HAL_HVD_EX_DeinitHW();
1224 }
1225 #if SUPPORT_G2VP9 && defined(VDEC3)
1226 if (FALSE == HAL_VPU_EX_G2VP9InUsed())
1227 {
1228 bRet = HAL_VP9_EX_DeinitHW();
1229 }
1230 #endif
1231 return bRet;
1232 }
1233
_VPU_EX_DeinitAll(void)1234 static MS_BOOL _VPU_EX_DeinitAll(void)
1235 {
1236 HAL_VPU_EX_SwRst(TRUE);
1237 _VPU_EX_DeinitHW();
1238 HAL_VPU_EX_DeInit();
1239
1240 return TRUE;
1241 }
1242
_VPU_EX_GetActiveCodecCnt(void)1243 static MS_U8 _VPU_EX_GetActiveCodecCnt(void)
1244 {
1245 MS_U32 i;
1246 MS_U8 u8ActiveCnt = 0;
1247 for (i = 0; i < sizeof(pVPUHalContext->_stVPUStream) / sizeof(pVPUHalContext->_stVPUStream[0]); i++)
1248 {
1249 if (E_VPU_EX_DECODER_NONE != pVPUHalContext->_stVPUStream[i].eDecodertype)
1250 {
1251 u8ActiveCnt++;
1252 }
1253 }
1254 if (pVPUHalContext->u8TaskCnt != u8ActiveCnt)
1255 {
1256 VPU_MSG_ERR("Err u8TaskCnt(%d) != u8ActiveCnt(%d)\n", pVPUHalContext->u8TaskCnt, u8ActiveCnt);
1257 }
1258 VPU_MSG_DBG(" = %d\n", u8ActiveCnt);
1259 return u8ActiveCnt;
1260 }
_VPU_EX_ClockInv(MS_BOOL bEnable)1261 static void _VPU_EX_ClockInv(MS_BOOL bEnable)
1262 {
1263 if (TRUE)
1264 {
1265 _VPU_WriteWordMask(REG_TOP_VPU, 0, TOP_CKG_VPU_INV);
1266 }
1267 else
1268 {
1269 _VPU_WriteWordMask(REG_TOP_VPU, TOP_CKG_VPU_INV, TOP_CKG_VPU_INV);
1270 }
1271 }
1272
_VPU_EX_ClockSpeed(MS_U32 u32type)1273 static void _VPU_EX_ClockSpeed(MS_U32 u32type)
1274 {
1275 switch (u32type)
1276 {
1277 case VPU_CLOCK_240MHZ:
1278 case VPU_CLOCK_216MHZ:
1279 case VPU_CLOCK_192MHZ:
1280 case VPU_CLOCK_320MHZ:
1281 case VPU_CLOCK_288MHZ:
1282 _VPU_WriteWordMask(REG_TOP_VPU, u32type, TOP_CKG_VPU_CLK_MASK);
1283 break;
1284 default:
1285 _VPU_WriteWordMask(REG_TOP_VPU, VPU_CLOCK_240MHZ, TOP_CKG_VPU_CLK_MASK);
1286 break;
1287 }
1288 }
1289
_VPU_EX_MAU_IDLE(void)1290 static MS_BOOL _VPU_EX_MAU_IDLE(void)
1291 {
1292 if (((_VPU_Read2Byte(MAU1_ARB0_DBG0) & MAU1_FSM_CS_MASK) == MAU1_FSM_CS_IDLE)
1293 && ((_VPU_Read2Byte(MAU1_ARB1_DBG0) & MAU1_FSM_CS_MASK) == MAU1_FSM_CS_IDLE))
1294 {
1295 return TRUE;
1296 }
1297 return FALSE;
1298 }
1299
1300
1301 #if (ENABLE_DECOMPRESS_FUNCTION==TRUE)
_VPU_EX_DecompressBin(MS_U32 u32SrcAddr,MS_U32 u32SrcSize,MS_U32 u32DestAddr,MS_U32 u32SlidingAddr)1302 static MS_BOOL _VPU_EX_DecompressBin(MS_U32 u32SrcAddr, MS_U32 u32SrcSize, MS_U32 u32DestAddr, MS_U32 u32SlidingAddr)
1303 {
1304 if(_VPU_EX_IsNeedDecompress(u32SrcAddr))
1305 {
1306 ms_VDECDecompressInit((MS_U8*)u32SlidingAddr, (MS_U8*)u32DestAddr);
1307 ms_VDECDecompress((MS_U8*)u32SrcAddr, u32SrcSize);
1308 ms_VDECDecompressDeInit();
1309 return TRUE;
1310 }
1311 else
1312 {
1313 return FALSE;
1314 }
1315 }
1316 #endif
1317
HAL_VPU_EX_SetSingleDecodeMode(MS_BOOL bEnable)1318 MS_BOOL HAL_VPU_EX_SetSingleDecodeMode(MS_BOOL bEnable)
1319 {
1320 MS_BOOL bRet = TRUE;
1321 pVPUHalContext->_bVPUSingleMode = bEnable;
1322 return bRet;
1323 }
1324
HAL_VPU_EX_SetDecodeMode(VPU_EX_DecModCfg * pstCfg)1325 MS_BOOL HAL_VPU_EX_SetDecodeMode(VPU_EX_DecModCfg *pstCfg)
1326 {
1327 MS_BOOL bRet = TRUE;
1328 MS_U8 i=0;
1329 if (pstCfg != NULL)
1330 {
1331 pVPUHalContext->_stVPUDecMode.u8DecMod = pstCfg->u8DecMod;
1332 pVPUHalContext->_stVPUDecMode.u8CodecCnt = pstCfg->u8CodecCnt;
1333 for (i=0; ((i<pstCfg->u8CodecCnt)&&(i<VPU_MAX_DEC_NUM)); i++)
1334 {
1335 pVPUHalContext->_stVPUDecMode.u8CodecType[i] = pstCfg->u8CodecType[i];
1336 }
1337 pVPUHalContext->_stVPUDecMode.u8ArgSize = pstCfg->u8ArgSize;
1338 pVPUHalContext->_stVPUDecMode.u32Arg = pstCfg->u32Arg;
1339 }
1340 else
1341 {
1342 bRet = FALSE;
1343 }
1344 return bRet;
1345 }
1346
1347 //static MS_BOOL bVpuExReloadFW = TRUE;
1348 //static MS_BOOL bVpuExLoadFWRlt = FALSE;
HAL_VPU_EX_SetFWReload(MS_BOOL bReload)1349 MS_BOOL HAL_VPU_EX_SetFWReload(MS_BOOL bReload)
1350 {
1351 pVPUHalContext->bVpuExReloadFW = bReload;
1352 //printf("%s bVpuExReloadFW = %x\n", __FUNCTION__, bVpuExReloadFW);
1353 return TRUE;
1354 }
1355
1356
1357 //-------------------------------------------------------------------------------------------------
1358 // Global Functions
1359 //-------------------------------------------------------------------------------------------------
1360 #ifdef VDEC3_FB
HAL_VPU_EX_LoadVLCTable(VPU_EX_VLCTblCfg * pVlcCfg,MS_U8 u8FwSrcType)1361 MS_BOOL HAL_VPU_EX_LoadVLCTable(VPU_EX_VLCTblCfg *pVlcCfg, MS_U8 u8FwSrcType)
1362 {
1363 #if HVD_ENABLE_RV_FEATURE
1364 if (E_HVD_FW_INPUT_SOURCE_FLASH == u8FwSrcType)
1365 {
1366 #if VPU_ENABLE_BDMA_FW_FLASH_2_SDRAM
1367 VPU_MSG_DBG("Load VLC outF2D: dest:0x%lx source:%lx size:%lx\n",
1368 pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
1369
1370 if (pVlcCfg->u32BinSize)
1371 {
1372 SPIDMA_Dev cpyflag = E_SPIDMA_DEV_MIU1;
1373
1374 if (HAL_MIU1_BASE <= MsOS_VA2PA(pVlcCfg->u32DstAddr))
1375 {
1376 cpyflag = E_SPIDMA_DEV_MIU1;
1377 }
1378 else
1379 {
1380 cpyflag = E_SPIDMA_DEV_MIU0;
1381 }
1382
1383 if (!HVD_FLASHcpy(MsOS_VA2PA(pVlcCfg->u32DstAddr), MsOS_VA2PA(pVlcCfg->u32BinAddr), pVlcCfg->u32BinSize, cpyflag))
1384 {
1385 VPU_MSG_ERR("HVD_BDMAcpy VLC table Flash 2 DRAM failed: dest:0x%lx src:0x%lx size:0x%lx flag:%lu\n",
1386 pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize, (MS_U32) cpyflag);
1387
1388 return FALSE;
1389 }
1390 }
1391 else
1392 {
1393 VPU_MSG_ERR("During copy VLC from Flash to Dram, the source size of FW is zero\n");
1394 return FALSE;
1395 }
1396 #else
1397 VPU_MSG_ERR("driver not enable to use BDMA copy VLC from flash 2 sdram.\n");
1398 return FALSE;
1399 #endif
1400 }
1401 else
1402 {
1403 if (E_HVD_FW_INPUT_SOURCE_DRAM == u8FwSrcType)
1404 {
1405 if ((pVlcCfg->u32BinAddr != 0) && (pVlcCfg->u32BinSize != 0))
1406 {
1407 VPU_MSG_INFO("Load VLC outD2D: dest:0x%lx source:%lx size:%lx\n",
1408 pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
1409
1410 #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
1411 BDMA_Result bdmaRlt;
1412
1413 MsOS_FlushMemory();
1414 bdmaRlt = HVD_dmacpy(pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
1415
1416 if (E_BDMA_OK != bdmaRlt)
1417 {
1418 VPU_MSG_ERR("MDrv_BDMA_MemCopy fail in %s(), ret=%x!\n", __FUNCTION__, bdmaRlt);
1419 }
1420 #else
1421 HVD_memcpy(pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
1422 #endif
1423 }
1424 else
1425 {
1426 VPU_MSG_ERR
1427 ("During copy VLC from out Dram to Dram, the source size or virtual address of VLC is zero\n");
1428 return FALSE;
1429 }
1430 }
1431 else
1432 {
1433 #if VPU_ENABLE_EMBEDDED_FW_BINARY
1434 #ifdef HVD_CACHE_TO_UNCACHE_CONVERT
1435 MS_U8 *pu8HVD_VLC_Binary;
1436
1437 pu8HVD_VLC_Binary = (MS_U8 *) ((MS_U32) u8HVD_VLC_Binary | 0xA0000000);
1438
1439 VPU_MSG_DBG("Load VLC inD2D: dest:0x%lx source:%lx size:%lx\n",
1440 pVlcCfg->u32DstAddr, ((MS_U32) pu8HVD_VLC_Binary),
1441 (MS_U32) sizeof(u8HVD_VLC_Binary));
1442
1443 HVD_memcpy((void *) (pVlcCfg->u32DstAddr),
1444 (void *) ((MS_U32) pu8HVD_VLC_Binary), sizeof(u8HVD_VLC_Binary));
1445 #else
1446 VPU_MSG_INFO("Load VLC inD2D: dest:0x%lx source:%lx size:%lx\n",
1447 MsOS_VA2PA(pVlcCfg->u32DstAddr), (MS_U32) u8HVD_VLC_Binary,
1448 (MS_U32) sizeof(u8HVD_VLC_Binary));
1449
1450 HVD_memcpy(pVlcCfg->u32DstAddr, ((MS_U32) u8HVD_VLC_Binary), sizeof(u8HVD_VLC_Binary));
1451 #endif
1452 #else
1453 VPU_MSG_ERR("driver not enable to use embedded VLC binary.\n");
1454 return FALSE;
1455 #endif
1456 }
1457 }
1458 #endif
1459
1460 return TRUE;
1461 }
1462 #endif
1463 #ifdef VDEC3
HAL_VPU_EX_TaskCreate(MS_U32 u32Id,VPU_EX_NDecInitPara * pInitPara,MS_BOOL bFWdecideFB,MS_U32 u32BBUId)1464 MS_BOOL HAL_VPU_EX_TaskCreate(MS_U32 u32Id, VPU_EX_NDecInitPara *pInitPara, MS_BOOL bFWdecideFB, MS_U32 u32BBUId)
1465 #else
1466 MS_BOOL HAL_VPU_EX_TaskCreate(MS_U32 u32Id, VPU_EX_NDecInitPara *pInitPara)
1467 #endif
1468 {
1469 VPU_EX_TaskInfo *pTaskInfo = pInitPara->pTaskInfo;
1470 MS_U8 u8Offset = _VPU_EX_GetOffsetIdx(u32Id);
1471 HVD_User_Cmd eCmd = E_HVD_CMD_INVALID_CMD;
1472 VPU_EX_DecoderType eDecType = E_VPU_EX_DECODER_NONE;
1473 MS_U32 u32Arg = 0xFFFFFFFF;
1474 MS_U32 u32Timeout = 0;
1475 HVD_Return eCtrlRet = E_HVD_RETURN_FAIL;
1476 MS_U32 u32CmdArg = 0;
1477 struct _ctl_info *ctl_ptr = (struct _ctl_info *)
1478 MsOS_PA2KSEG1(MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr) + CTL_INFO_ADDR);
1479
1480 _HAL_VPU_Entry();
1481
1482 //Check FW buffer size
1483 if (1 == u8Offset)
1484 {
1485 MS_U32 u32MinFWBuffSize = (u8Offset + 1) * VPU_FW_MEM_OFFSET;
1486 MS_U32 u32CurFWBuffSize = pInitPara->pFWCodeCfg->u32DstSize;
1487
1488 if (u32CurFWBuffSize < u32MinFWBuffSize)
1489 {
1490 VPU_MSG_ERR("FW BuffSize(0x%lx < 0x%lx) is too small!\n", u32CurFWBuffSize, u32MinFWBuffSize);
1491 _HAL_VPU_Release();
1492 return FALSE;
1493 }
1494 }
1495
1496 if(( E_HAL_VPU_MVC_STREAM_BASE == (0xFF & u32Id))
1497 &&(E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[0].eDecodertype)
1498 &&(E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[1].eDecodertype))
1499 {
1500 pVPUHalContext->_stVPUStream[0].eStreamId = E_HAL_VPU_MVC_MAIN_VIEW;
1501 }
1502 #ifdef VDEC3
1503 pVPUHalContext->u32FWCodeAddr = MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr);
1504 #endif
1505
1506 if (0 == pVPUHalContext->u8TaskCnt)
1507 {
1508 //No task is created, need to load f/w, etc.
1509 VPU_MSG_DBG("u8TaskCnt=%d\n", pVPUHalContext->u8TaskCnt);
1510
1511 if (!_VPU_EX_InitAll(pInitPara))
1512 {
1513 VPU_MSG_DBG("(%d) fail to InitAll\n", __LINE__);
1514 _HAL_VPU_Release();
1515 return FALSE;
1516 }
1517
1518 //Check if controller finish initialization: clear mailbox, etc.
1519 //Need to check it before sending any controller commands!
1520 u32Timeout = HVD_GetSysTime_ms() + VPU_CMD_TIMEOUT;
1521 while (CTL_STU_NONE == ctl_ptr->statue)
1522 {
1523 if (HVD_GetSysTime_ms() > u32Timeout)
1524 {
1525 VPU_MSG_ERR("Ctl init timeout, st=%x\n", ctl_ptr->statue);
1526 VPU_MSG_ERR("version=0x%x, statue=0x%x, last_ctl_cmd=0x%x, last_ctl_arg=0x%x, t0=%d, t1=%d\n",
1527 ctl_ptr->verion, ctl_ptr->statue, ctl_ptr->last_ctl_cmd, ctl_ptr->last_ctl_arg, ctl_ptr->task_statue[0], ctl_ptr->task_statue[1]);
1528 MS_U32 t=0;
1529 for (t=0; t<30; t++)
1530 {
1531 VPU_MSG_DBG("_pc=0x%lx\n", HAL_VPU_EX_GetProgCnt());
1532 }
1533 _HAL_VPU_Release();
1534 return FALSE;
1535 }
1536
1537 MsOS_ReadMemory();
1538 }
1539
1540 VPU_MSG_INFO("ctl_init_done: version=0x%x, statue=0x%x, last_ctl_cmd=0x%x, last_ctl_arg=0x%x, t0=%d, t1=%d\n",
1541 ctl_ptr->verion, ctl_ptr->statue, ctl_ptr->last_ctl_cmd, ctl_ptr->last_ctl_arg, ctl_ptr->task_statue[0], ctl_ptr->task_statue[1]);
1542
1543 }
1544 else
1545 {
1546 if (pVPUHalContext->_bVPUSingleMode)
1547 {
1548 //Show error message
1549 printf("This task will use dram instead of sram!!!\n");
1550 VPU_MSG_INFO("VDEC warn: this task will use dram instead of sram!!!\n");
1551 }
1552
1553 if (!_VPU_EX_InitHW(pInitPara->pTaskInfo))
1554 {
1555 VPU_MSG_DBG("(%d) fail to InitHW\n", __LINE__);
1556 _HAL_VPU_Release();
1557 return FALSE;
1558 }
1559 if (pInitPara->pVLCCfg)
1560 {
1561 if (!_VPU_EX_LoadVLCTable(pInitPara->pVLCCfg, pInitPara->pFWCodeCfg->u8SrcType))
1562 {
1563 VPU_MSG_ERR("HAL_VPU_LoadVLCTable fail!\n");
1564 _HAL_VPU_Release();
1565 return FALSE;
1566 }
1567 }
1568 }
1569
1570
1571 #ifdef VDEC3
1572 if (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
1573 {
1574 MS_U64 max_addr_check = (sizeof(MS_PHY) == 4)?0xffffffff:0xffffffffffffffff;
1575 MS_PHY phy_dst_addr = MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr);
1576 MS_PHY phy_multidecode_offset = u8Offset*VPU_FW_MEM_OFFSET;
1577
1578 if(max_addr_check - phy_dst_addr > phy_multidecode_offset)
1579 {
1580 if(max_addr_check - phy_dst_addr - phy_multidecode_offset > VBBU_TABLE_START)
1581 {
1582 MS_PHY phy_addr = phy_dst_addr + VBBU_TABLE_START + phy_multidecode_offset;
1583 VDEC_VBBU *pTemp4 = (VDEC_VBBU *)MsOS_PA2KSEG1(phy_addr);
1584 memset(pTemp4,0,sizeof(VDEC_VBBU));
1585 *((unsigned int*)(pTemp4->u8Reserved)) = phy_dst_addr-HAL_MIU1_BASE;
1586 }
1587
1588 if(max_addr_check - phy_dst_addr - phy_multidecode_offset > DISP_QUEUE_START)
1589 {
1590 MS_PHY phy_addr = phy_dst_addr + DISP_QUEUE_START + phy_multidecode_offset;
1591 DISPQ_IN_DRAM *pTemp = (DISPQ_IN_DRAM *)MsOS_PA2KSEG1(phy_addr);
1592 memset(pTemp,0,sizeof(DISPQ_IN_DRAM));
1593 }
1594
1595 if(max_addr_check - phy_dst_addr - phy_multidecode_offset > VCOMMANDQ_INFO_START)
1596 {
1597 MS_PHY phy_addr = phy_dst_addr + VCOMMANDQ_INFO_START + phy_multidecode_offset;
1598 CMD_QUEUE *pTemp2 = (CMD_QUEUE *)MsOS_PA2KSEG1(phy_addr);
1599 memset(pTemp2,0,sizeof(CMD_QUEUE));
1600 pTemp2->u32HVD_DISPCMDQ_DRAM_ST_ADDR = VDISP_COMMANDQ_START + phy_multidecode_offset;
1601 pTemp2->u32HVD_CMDQ_DRAM_ST_ADDR = VNORMAL_COMMANDQ_START + phy_multidecode_offset;
1602 }
1603
1604 if(max_addr_check - phy_dst_addr - phy_multidecode_offset > VDISP_COMMANDQ_START)
1605 {
1606 MS_PHY phy_addr = phy_dst_addr + VDISP_COMMANDQ_START + phy_multidecode_offset;
1607 unsigned char* pTemp3 = (unsigned char*)MsOS_PA2KSEG1(phy_addr);
1608 memset(pTemp3,0,0x2000);
1609 }
1610
1611 if(max_addr_check - phy_dst_addr - phy_multidecode_offset > OFFSET_BASE)
1612 {
1613 MS_PHY phy_addr = phy_dst_addr + OFFSET_BASE + phy_multidecode_offset;
1614 unsigned int* pVersion = (unsigned int*)MsOS_PA2KSEG1(phy_addr);
1615 memset((void*)pVersion,0,0x8);
1616 }
1617 }
1618 }
1619
1620 #endif
1621
1622 #if 1 // For TEE
1623 #ifdef VDEC3
1624 #if SUPPORT_G2VP9
1625 if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType ||
1626 E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_G2VP9 == pTaskInfo->eDecType)
1627 #else
1628 if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType)
1629 #endif
1630 #else
1631 if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
1632 #endif
1633 {
1634 MS_U32 u32FWPhyAddr = MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr);
1635
1636 if (pVPUHalContext->u32FWShareInfoAddr[u8Offset] == 0xFFFFFFFF)
1637 {
1638 ctl_ptr->u32TaskShareInfoAddr[u8Offset] = 0xFFFFFFFF;
1639 }
1640 else
1641 {
1642 ctl_ptr->u32TaskShareInfoAddr[u8Offset] = pVPUHalContext->u32FWShareInfoAddr[u8Offset] - u32FWPhyAddr;
1643 }
1644
1645 MsOS_FlushMemory();
1646 VPU_MSG_DBG("task share info offset = 0x%x\n", ctl_ptr->u32TaskShareInfoAddr[u8Offset]);
1647
1648 ///printf("DRV side, share info offset = 0x%lx\n", pVPUHalContext->u32FWShareInfoAddr[u8Offset]);
1649 ///printf("FW side, task share info offset = 0x%x\n", ctl_ptr->u32TaskShareInfoAddr[u8Offset]);
1650 }
1651 #endif
1652
1653 if ((TRUE==pVPUHalContext->_bVPUSingleMode) || (E_VPU_DEC_MODE_SINGLE==pVPUHalContext->_stVPUDecMode.u8DecMod))
1654 {
1655 //Issue E_DUAL_CMD_SINGLE_TASK to FW controller
1656 //arg=1 to get better performance for single task
1657 u32CmdArg = (pVPUHalContext->_bVPUSingleMode) ? 1 : 0;
1658 VPU_MSG_DBG("Issue E_DUAL_CMD_SINGLE_TASK to FW controller arg=%lx\n", u32CmdArg);
1659 eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_CMD_SINGLE_TASK, u32CmdArg);
1660 if (E_HVD_RETURN_SUCCESS != eCtrlRet)
1661 {
1662 VPU_MSG_ERR("E_DUAL_CMD_SINGLE_TASK NG eCtrlRet=%x\n", eCtrlRet);
1663 }
1664 }
1665 else if (E_VPU_DEC_MODE_DUAL_3D==pVPUHalContext->_stVPUDecMode.u8DecMod)
1666 {
1667 if(pVPUHalContext->_stVPUDecMode.u8CodecType[0] != pVPUHalContext->_stVPUDecMode.u8CodecType[1])
1668 {
1669 switch (pVPUHalContext->_stVPUDecMode.u32Arg)
1670 {
1671 case E_VPU_CMD_MODE_KR3D_INTERLACE:
1672 u32CmdArg = CTL_MODE_3DTV;
1673 break;
1674 case E_VPU_CMD_MODE_KR3D_FORCE_P:
1675 u32CmdArg = CTL_MODE_3DTV_PROG;
1676 break;
1677 case E_VPU_CMD_MODE_KR3D_INTERLACE_TWO_PITCH:
1678 u32CmdArg = CTL_MODE_3DTV_TWO_PITCH;
1679 break;
1680 case E_VPU_CMD_MODE_KR3D_FORCE_P_TWO_PITCH:
1681 u32CmdArg = CTL_MODE_3DTV_PROG_TWO_PITCH;
1682 break;
1683 default:
1684 u32CmdArg = CTL_MODE_3DTV;
1685 VPU_MSG_INFO("%lx not defined, use CTL_MODE_3DTV for KR3D\n", pVPUHalContext->_stVPUDecMode.u32Arg);
1686 break;
1687 }
1688 }
1689 else
1690 {
1691 u32CmdArg = CTL_MODE_3DWMV;
1692 }
1693 VPU_MSG_DBG("Issue E_DUAL_CMD_MODE to FW controller arg=%lx\n", u32CmdArg);
1694 eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_CMD_MODE, u32CmdArg);
1695 if (E_HVD_RETURN_SUCCESS != eCtrlRet)
1696 {
1697 VPU_MSG_ERR("E_DUAL_CMD_MODE NG eCtrlRet=%x\n", eCtrlRet);
1698 }
1699 }
1700 else if(E_VPU_DEC_MODE_DUAL_INDIE == pVPUHalContext->_stVPUDecMode.u8DecMod)
1701 {
1702 if(E_VPU_CMD_MODE_PIP_SYNC_MAIN_STC == pVPUHalContext->_stVPUDecMode.u32Arg)
1703 {
1704 u32CmdArg = CTL_MODE_ONE_STC;
1705 }
1706 else
1707 {
1708 u32CmdArg = (pVPUHalContext->_stVPUDecMode.u32Arg==E_VPU_CMD_MODE_PIP_SYNC_SWITCH) ? CTL_MODE_SWITCH_STC : CTL_MODE_NORMAL;
1709 }
1710 VPU_MSG_DBG("Issue E_DUAL_CMD_MODE to FW controller arg=%lx\n", u32CmdArg);
1711 eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_CMD_MODE, u32CmdArg);
1712 if (E_HVD_RETURN_SUCCESS != eCtrlRet)
1713 {
1714 VPU_MSG_ERR("E_DUAL_CMD_MODE NG eCtrlRet=%x\n", eCtrlRet);
1715 }
1716 }
1717
1718 eCmd = _VPU_EX_MapCtrlCmd(pTaskInfo);
1719 #if defined(SUPPORT_NEW_MEM_LAYOUT)
1720 if (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
1721 #ifdef VDEC3
1722 {
1723 u32Arg = (u32BBUId << VDEC_BBU_ID_SHIFT) + u8Offset * VPU_FW_MEM_OFFSET + OFFSET_BASE;
1724 }
1725 #else
1726 u32Arg = u8Offset * VPU_FW_MEM_OFFSET + OFFSET_BASE;
1727 #endif
1728
1729 #ifdef VDEC3
1730 #if SUPPORT_G2VP9
1731 else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_G2VP9 == pTaskInfo->eDecType)
1732 #else
1733 else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType)
1734 #endif
1735 {
1736 u32Arg = (u32BBUId << VDEC_BBU_ID_SHIFT) + (u8Offset * VPU_FW_MEM_OFFSET) + HVD_SHARE_MEM_ST_OFFSET;
1737 }
1738 #else
1739 else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
1740 u32Arg = u8Offset * VPU_FW_MEM_OFFSET + HVD_SHARE_MEM_ST_OFFSET;
1741 #endif
1742 else
1743 {
1744 VPU_MSG_ERR("Can't find eDecType! %d\n", pTaskInfo->eDecType);
1745 _HAL_VPU_Release();
1746 return FALSE;
1747 }
1748 #else
1749 u32Arg = u8Offset * VPU_FW_MEM_OFFSET;
1750 #endif
1751
1752 VPRINTF("[%s][%d] create task : id 0x%lx, cmd 0x%x, arg 0x%lx, bbuID %ld, offset %d \n", __FUNCTION__, __LINE__, u32Id, eCmd, u32Arg, u32BBUId, u8Offset);
1753 HAL_HVD_EX_SetCmd(u32Id, eCmd, u32Arg);
1754
1755 MsOS_ReadMemory();
1756 VPU_MSG_INFO("before: version=0x%x, statue=0x%x, last_ctl_cmd=0x%x, last_ctl_arg=0x%x, t0=%d, t1=%d\n",
1757 ctl_ptr->verion, ctl_ptr->statue, ctl_ptr->last_ctl_cmd, ctl_ptr->last_ctl_arg, ctl_ptr->task_statue[0], ctl_ptr->task_statue[1]);
1758
1759 u32Timeout = HVD_GetSysTime_ms() + VPU_CMD_TIMEOUT;
1760 while (CTL_TASK_CMDRDY != ctl_ptr->task_statue[u8Offset])
1761 {
1762 if (HVD_GetSysTime_ms() > u32Timeout)
1763 {
1764 VPU_MSG_ERR("Task %d creation timeout\n", u8Offset);
1765 MS_U32 t=0;
1766 for (t=0; t<30; t++)
1767 {
1768 VPU_MSG_DBG("_pc=0x%lx\n", HAL_VPU_EX_GetProgCnt());
1769 }
1770 //#ifndef VDEC3 // FIXME: workaround fw response time is slow sometimes in multiple stream case so far
1771 pVPUHalContext->bVpuExLoadFWRlt = FALSE; ///error handling
1772 VPU_MSG_ERR("set bVpuExLoadFWRlt as FALSE\n\n");
1773 _HAL_VPU_Release();
1774 return FALSE;
1775 //#endif
1776 }
1777
1778 MsOS_ReadMemory();
1779 }
1780
1781 VPU_MSG_INFO("after: version=0x%x, statue=0x%x, last_ctl_cmd=0x%x, last_ctl_arg=0x%x, t0=%d, t1=%d\n",
1782 ctl_ptr->verion, ctl_ptr->statue, ctl_ptr->last_ctl_cmd, ctl_ptr->last_ctl_arg, ctl_ptr->task_statue[0], ctl_ptr->task_statue[1]);
1783
1784 #ifdef VDEC3
1785 if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType)
1786 #else
1787 if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
1788 #endif
1789 {
1790 HAL_HVD_EX_SetBufferAddr(u32Id);
1791 }
1792
1793 if (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
1794 {
1795 eDecType = E_VPU_EX_DECODER_MVD;
1796 }
1797 else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
1798 {
1799 eDecType = E_VPU_EX_DECODER_HVD;
1800 }
1801 #ifdef VDEC3
1802 else if (E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType)
1803 {
1804 eDecType = E_VPU_EX_DECODER_EVD;
1805 }
1806 #if SUPPORT_G2VP9
1807 else if (E_VPU_EX_DECODER_G2VP9 == pTaskInfo->eDecType)
1808 {
1809 eDecType = E_VPU_EX_DECODER_G2VP9;
1810 }
1811 #endif
1812 #endif
1813 else
1814 {
1815 VPU_MSG_ERR("Can't find eDecType! %d\n", pTaskInfo->eDecType);
1816 _HAL_VPU_Release();
1817 return FALSE;
1818 }
1819
1820 #ifdef VDEC3
1821 if ((bFWdecideFB == TRUE) && (pVPUHalContext->u8TaskCnt == 0))
1822 {
1823 HAL_HVD_EX_SetCmd(u32Id, E_DUAL_R2_CMD_FBADDR, pInitPara->pFBCfg->u32FrameBufAddr);
1824 HAL_HVD_EX_SetCmd(u32Id, E_DUAL_R2_CMD_FBSIZE, pInitPara->pFBCfg->u32FrameBufSize);
1825 }
1826 #endif
1827
1828 if (pTaskInfo->eDecType != eDecType)
1829 {
1830 VPU_MSG_ERR("warning pTaskInfo->eDecType=%x not %x\n",
1831 pTaskInfo->eDecType, eDecType);
1832 }
1833 goto _SAVE_DEC_TYPE;
1834
1835 _SAVE_DEC_TYPE:
1836 if (pVPUHalContext->_stVPUStream[u8Offset].eStreamId == (u32Id & 0xFF))
1837 {
1838 pVPUHalContext->_stVPUStream[u8Offset].eDecodertype = eDecType;
1839 }
1840 else
1841 {
1842 VPU_MSG_ERR("Cannot save eDecType!!\n");
1843 }
1844
1845 (pVPUHalContext->u8TaskCnt)++;
1846 _HAL_VPU_Release();
1847 return TRUE;
1848 }
1849
HAL_VPU_EX_TaskDelete(MS_U32 u32Id,VPU_EX_NDecInitPara * pInitPara)1850 MS_BOOL HAL_VPU_EX_TaskDelete(MS_U32 u32Id, VPU_EX_NDecInitPara *pInitPara)
1851 {
1852 HVD_Return eRet;
1853 #ifdef VDEC3
1854 HVD_User_Cmd eCmd = E_NST_CMD_DEL_TASK;
1855 #else
1856 HVD_User_Cmd eCmd = E_DUAL_CMD_DEL_TASK;
1857 #endif
1858 MS_U8 u8OffsetIdx = _VPU_EX_GetOffsetIdx(u32Id);
1859 MS_U32 u32Timeout = HVD_GetSysTime_ms() + 3000;
1860
1861 _HAL_VPU_Entry();
1862 VPU_MSG_DBG("DecType=%d\n", pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype);
1863
1864 eRet = HAL_HVD_EX_SetCmd(u32Id, eCmd, u8OffsetIdx);
1865 if(eRet != E_HVD_RETURN_SUCCESS)
1866 {
1867 VPU_MSG_ERR("VPU fail to DEL Task %d\n", eRet);
1868 }
1869
1870 {
1871 struct _ctl_info *ctl_ptr = (struct _ctl_info *)
1872 MsOS_PA2KSEG1(MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr) + CTL_INFO_ADDR);
1873 u32Timeout = HVD_GetSysTime_ms() + VPU_CMD_TIMEOUT;
1874
1875 MsOS_ReadMemory();
1876
1877 VPU_MSG_DBG("before: version=0x%x, statue=0x%x, last_ctl_cmd=0x%x, last_ctl_arg=0x%x, t0=%d, t1=%d\n",
1878 ctl_ptr->verion, ctl_ptr->statue, ctl_ptr->last_ctl_cmd, ctl_ptr->last_ctl_arg, ctl_ptr->task_statue[0], ctl_ptr->task_statue[1]);
1879
1880 while (CTL_TASK_NONE != ctl_ptr->task_statue[u8OffsetIdx])
1881 {
1882 if (HVD_GetSysTime_ms() > u32Timeout)
1883 {
1884 VPU_MSG_ERR("Task %u deletion timeout\n", u8OffsetIdx);
1885 pVPUHalContext->bVpuExLoadFWRlt = FALSE; ///error handling
1886 VPU_MSG_ERR("Set bVpuExLoadFWRlt as FALSE\n");
1887
1888 if(pVPUHalContext->u8TaskCnt == 1)
1889 {
1890 VPU_MSG_ERR("Due to one task remain, driver can force delete task\n");
1891 break;
1892 }
1893 else if(pVPUHalContext->u8TaskCnt == 2)
1894 {
1895 VPU_MSG_ERR("Due to two tasks remain, driver can't force delete task\n");
1896 _HAL_VPU_Release();
1897 return FALSE;
1898 }
1899 else
1900 {
1901 VPU_MSG_ERR("Task number is not correct\n");
1902 _HAL_VPU_Release();
1903 return FALSE;
1904 }
1905 }
1906
1907 MsOS_ReadMemory();
1908 }
1909
1910 VPU_MSG_DBG("after: version=0x%x, statue=0x%x, last_ctl_cmd=0x%x, last_ctl_arg=0x%x, t0=%d, t1=%d\n",
1911 ctl_ptr->verion, ctl_ptr->statue, ctl_ptr->last_ctl_cmd, ctl_ptr->last_ctl_arg, ctl_ptr->task_statue[0], ctl_ptr->task_statue[1]);
1912 }
1913
1914 #if SUPPORT_EVD
1915 if (pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype == E_VPU_EX_DECODER_EVD)
1916 {
1917 HAL_EVD_EX_ClearTSPInput(u32Id);
1918 }
1919 #endif
1920
1921 pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype = E_VPU_EX_DECODER_NONE;
1922 if( (u8OffsetIdx == 0) && (pVPUHalContext->_stVPUStream[u8OffsetIdx].eStreamId == E_HAL_VPU_MVC_MAIN_VIEW))
1923 {
1924 pVPUHalContext->_stVPUStream[u8OffsetIdx].eStreamId = E_HAL_VPU_N_STREAM0;
1925 }
1926
1927 if (pVPUHalContext->u8TaskCnt)
1928 {
1929 (pVPUHalContext->u8TaskCnt)--;
1930 }
1931 else
1932 {
1933 VPU_MSG_DBG("Warning: u8TaskCnt=0\n");
1934 }
1935
1936 if (0 == pVPUHalContext->u8TaskCnt)
1937 {
1938 int i;
1939 VPU_MSG_DBG("u8TaskCnt=%d time to terminate\n", pVPUHalContext->u8TaskCnt);
1940 _VPU_EX_DeinitAll();
1941 HAL_VPU_EX_SetSingleDecodeMode(FALSE);
1942 pVPUHalContext->u32VPUSHMAddr = 0;
1943
1944 for (i = 0; i < MAX_SUPPORT_DECODER_NUM; i++)
1945 {
1946 pVPUHalContext->u32FWShareInfoAddr[i] = 0xFFFFFFFFUL;
1947 }
1948 }
1949 else
1950 {
1951 pVPUHalContext->u32FWShareInfoAddr[u8OffsetIdx] = 0xFFFFFFFF;
1952 _VPU_EX_DeinitHW();
1953 }
1954
1955 _HAL_VPU_Release();
1956 return TRUE;
1957 }
1958
HAL_VPU_EX_LoadCode(VPU_EX_FWCodeCfg * pFWCodeCfg)1959 MS_BOOL HAL_VPU_EX_LoadCode(VPU_EX_FWCodeCfg *pFWCodeCfg)
1960 {
1961 MS_U32 u32DestAddr = pFWCodeCfg->u32DstAddr;
1962 MS_U32 u32BinAddr = pFWCodeCfg->u32BinAddr;
1963 MS_U32 u32Size = pFWCodeCfg->u32BinSize;
1964 #if (ENABLE_DECOMPRESS_FUNCTION==TRUE)
1965 MS_U32 u32DestSize = pFWCodeCfg->u32DstSize;
1966 #endif
1967
1968 if (FALSE == HAL_VPU_EX_GetFWReload())
1969 {
1970 //printf("%s bFWReload FALSE!!!\n", __FUNCTION__);
1971 if (FALSE == pVPUHalContext->bVpuExLoadFWRlt)
1972 {
1973 VPU_MSG_INFO("Never load fw successfully, load it anyway!\n");
1974 }
1975 else
1976 {
1977 //Check f/w prefix "VDEC30"
1978 if (_VPU_EX_IsNeedDecompress(u32DestAddr)!=FALSE)
1979 {
1980 VPU_MSG_ERR("Wrong prefix: reload fw!\n");
1981 }
1982 else
1983 {
1984 VPU_MSG_INFO("Skip loading fw this time!!!\n");
1985 return TRUE;
1986 }
1987 }
1988 }
1989
1990 if (E_HVD_FW_INPUT_SOURCE_FLASH == pFWCodeCfg->u8SrcType)
1991 {
1992 #if VPU_ENABLE_BDMA_FW_FLASH_2_SDRAM
1993 if (u32Size != 0)
1994 {
1995 SPIDMA_Dev cpyflag = E_SPIDMA_DEV_MIU1;
1996
1997 if (HAL_MIU1_BASE <= MsOS_VA2PA(u32DestAddr))
1998 {
1999 cpyflag = E_SPIDMA_DEV_MIU1;
2000 }
2001 else
2002 {
2003 cpyflag = E_SPIDMA_DEV_MIU0;
2004 }
2005
2006 if (!HVD_FLASHcpy(MsOS_VA2PA(u32DestAddr), MsOS_VA2PA(u32BinAddr), u32Size, cpyflag))
2007 {
2008 goto _load_code_fail;
2009 }
2010 }
2011 else
2012 {
2013 goto _load_code_fail;
2014 }
2015 #else
2016 goto _load_code_fail;
2017 #endif
2018 }
2019 else if (E_HVD_FW_INPUT_SOURCE_DRAM == pFWCodeCfg->u8SrcType)
2020 {
2021 if (u32BinAddr != 0 && u32Size != 0)
2022 {
2023 #if (ENABLE_DECOMPRESS_FUNCTION==TRUE)
2024 if(_VPU_EX_DecompressBin(u32BinAddr, u32Size, u32DestAddr, u32DestAddr+u32DestSize-WINDOW_SIZE)==TRUE)
2025 {
2026 if(_VPU_EX_IsNeedDecompress(u32DestAddr)==FALSE)
2027 {
2028 VPU_MSG_INFO("Decompress ok!!!\n");
2029 }
2030 else
2031 {
2032 VPU_MSG_INFO("Decompress fail!!!\n");
2033 }
2034 }
2035 else
2036 #endif
2037 {
2038 HVD_memcpy(u32DestAddr, u32BinAddr, u32Size);
2039 }
2040 }
2041 else
2042 {
2043 goto _load_code_fail;
2044 }
2045 }
2046 else
2047 {
2048 #if VPU_ENABLE_EMBEDDED_FW_BINARY
2049 VPU_MSG_INFO("Load FW inD2D: dest=0x%lx, source=0x%lx, size=%ld\n",
2050 u32DestAddr, ((MS_U32) u8HVD_FW_Binary),
2051 (MS_U32) sizeof(u8HVD_FW_Binary));
2052
2053 #if (ENABLE_DECOMPRESS_FUNCTION==TRUE)
2054 if(_VPU_EX_DecompressBin((MS_U32)u8HVD_FW_Binary, (MS_U32)sizeof(u8HVD_FW_Binary), u32DestAddr, u32DestAddr+u32DestSize-WINDOW_SIZE)==TRUE)
2055 {
2056 if(_VPU_EX_IsNeedDecompress(u32DestAddr)==FALSE)
2057 {
2058 VPU_MSG_INFO("Decompress ok!!!\n");
2059 }
2060 else
2061 {
2062 VPU_MSG_INFO("Decompress fail!!!\n");
2063 }
2064 }
2065 else
2066 #endif
2067 {
2068 HVD_memcpy(u32DestAddr, (MS_U32)u8HVD_FW_Binary, sizeof(u8HVD_FW_Binary));
2069 }
2070 #else
2071 goto _load_code_fail;
2072 #endif
2073 }
2074
2075 MAsm_CPU_Sync();
2076 MsOS_FlushMemory();
2077
2078 if (FALSE == (*((MS_U8*)(u32DestAddr+6))=='R' && *((MS_U8*)(u32DestAddr+7))=='2'))
2079 {
2080 VPU_MSG_ERR("FW is not R2 version! _%x_ _%x_\n", *(MS_U8*)(u32DestAddr+6), *(MS_U8*)(u32DestAddr+7));
2081 goto _load_code_fail;
2082 }
2083
2084 pVPUHalContext->bVpuExLoadFWRlt = TRUE;
2085 return TRUE;
2086
2087 _load_code_fail:
2088 pVPUHalContext->bVpuExLoadFWRlt = FALSE;
2089 return FALSE;
2090 }
2091
HAL_VPU_EX_InitRegBase(MS_U32 u32RegBase)2092 void HAL_VPU_EX_InitRegBase(MS_U32 u32RegBase)
2093 {
2094 u32VPURegOSBase = u32RegBase;
2095 }
2096
HAL_VPU_EX_Init_Share_Mem(void)2097 MS_BOOL HAL_VPU_EX_Init_Share_Mem(void)
2098 {
2099 #if ((defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_ECOS)) && (!defined(SUPPORT_X_MODEL_FEATURE)))
2100
2101 MS_U32 u32ShmId;
2102 MS_U32 u32Addr;
2103 MS_U32 u32BufSize;
2104
2105
2106 if (FALSE == MsOS_SHM_GetId( (MS_U8*)"Linux HAL VPU",
2107 sizeof(VPU_Hal_CTX),
2108 &u32ShmId,
2109 &u32Addr,
2110 &u32BufSize,
2111 MSOS_SHM_QUERY))
2112 {
2113 if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux HAL VPU",
2114 sizeof(VPU_Hal_CTX),
2115 &u32ShmId,
2116 &u32Addr,
2117 &u32BufSize,
2118 MSOS_SHM_CREATE))
2119 {
2120 VPU_MSG_ERR("[%s]SHM allocation failed!!!use global structure instead!!!\n",__FUNCTION__);
2121 if(pVPUHalContext == NULL)
2122 {
2123 pVPUHalContext = &gVPUHalContext;
2124 memset(pVPUHalContext,0,sizeof(VPU_Hal_CTX));
2125 _VPU_EX_Context_Init();
2126 printf("[%s]Global structure init Success!!!\n",__FUNCTION__);
2127 }
2128 else
2129 {
2130 printf("[%s]Global structure exists!!!\n",__FUNCTION__);
2131 }
2132 //return FALSE;
2133 }
2134 else
2135 {
2136 memset((MS_U8*)u32Addr,0,sizeof(VPU_Hal_CTX));
2137 pVPUHalContext = (VPU_Hal_CTX*)u32Addr; // for one process
2138 _VPU_EX_Context_Init();
2139 }
2140 }
2141 else
2142 {
2143 pVPUHalContext = (VPU_Hal_CTX*)u32Addr; // for another process
2144 }
2145 #else
2146 if(pVPUHalContext == NULL)
2147 {
2148 pVPUHalContext = &gVPUHalContext;
2149 memset(pVPUHalContext,0,sizeof(VPU_Hal_CTX));
2150 _VPU_EX_Context_Init();
2151 }
2152 #endif
2153
2154 return TRUE;
2155
2156 }
2157
HAL_VPU_EX_GetFreeStream(HAL_VPU_StreamType eStreamType)2158 HAL_VPU_StreamId HAL_VPU_EX_GetFreeStream(HAL_VPU_StreamType eStreamType)
2159 {
2160 MS_U32 i = 0;
2161
2162 _HAL_VPU_MutexCreate();
2163
2164 if (E_HAL_VPU_MVC_STREAM == eStreamType)
2165 {
2166 if((E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[0].eDecodertype) && (E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[1].eDecodertype))
2167 {
2168 pVPUHalContext->_stVPUStream[0].eStreamId = E_HAL_VPU_MVC_MAIN_VIEW;
2169 return pVPUHalContext->_stVPUStream[0].eStreamId; /// Need to check
2170 }
2171 }
2172 else if (E_HAL_VPU_MAIN_STREAM == eStreamType)
2173 {
2174 for (i = 0;i < MAX_SUPPORT_DECODER_NUM; i++)
2175 {
2176 if ((E_HAL_VPU_MAIN_STREAM_BASE & pVPUHalContext->_stVPUStream[i].eStreamId)
2177 && (E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[i].eDecodertype))
2178 {
2179 return pVPUHalContext->_stVPUStream[i].eStreamId;
2180 }
2181 }
2182 }
2183 else if (E_HAL_VPU_SUB_STREAM == eStreamType)
2184 {
2185 for (i = 0;i < MAX_SUPPORT_DECODER_NUM; i++)
2186 {
2187 if ((E_HAL_VPU_SUB_STREAM_BASE & pVPUHalContext->_stVPUStream[i].eStreamId)
2188 && (E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[i].eDecodertype))
2189 {
2190 return pVPUHalContext->_stVPUStream[i].eStreamId;
2191 }
2192 }
2193 }
2194 #ifdef VDEC3
2195 else if (eStreamType >= E_HAL_VPU_N_STREAM && eStreamType < (E_HAL_VPU_N_STREAM + VPU_MAX_DEC_NUM))
2196 {
2197 #if 1 // bound FW task to main/sub stream
2198 i = eStreamType - E_HAL_VPU_N_STREAM;
2199 if (pVPUHalContext->_stVPUStream[i].eDecodertype == E_VPU_EX_DECODER_NONE)
2200 return pVPUHalContext->_stVPUStream[i].eStreamId;
2201 #else // dynamic select FW task id
2202 for (i = 0;i < MAX_SUPPORT_DECODER_NUM; i++)
2203 {
2204 if ((E_HAL_VPU_N_STREAM_BASE & pVPUHalContext->_stVPUStream[i].eStreamId)
2205 && (E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[i].eDecodertype))
2206 {
2207 return pVPUHalContext->_stVPUStream[i].eStreamId;
2208 }
2209 }
2210 #endif
2211 }
2212 #endif
2213
2214 return E_HAL_VPU_STREAM_NONE;
2215 }
2216
HAL_VPU_EX_CheckFreeStream(void)2217 MS_U8 HAL_VPU_EX_CheckFreeStream(void)
2218 {
2219 MS_U8 u8Idx = 0;
2220
2221 for (u8Idx = 0; u8Idx < MAX_SUPPORT_DECODER_NUM; u8Idx++)
2222 {
2223 if (pVPUHalContext->_stVPUStream[u8Idx].eDecodertype == E_VPU_EX_DECODER_NONE)
2224 break;
2225 }
2226
2227 if (u8Idx >= MAX_SUPPORT_DECODER_NUM)
2228 {
2229 VPU_MSG_ERR("all vpu free streams are occupied \n");
2230 return -1;
2231 }
2232
2233 VPU_MSG_DBG("available vpu free stream %d \n", u8Idx);
2234 return u8Idx;
2235 }
2236
HAL_VPU_EX_Init(VPU_EX_InitParam * InitParams)2237 MS_BOOL HAL_VPU_EX_Init(VPU_EX_InitParam *InitParams)
2238 {
2239 VPU_MSG_DBG("Inv=%d, clk=%d\n", InitParams->bClockInv, InitParams->eClockSpeed);
2240
2241 // enable module
2242 _VPU_EX_ClockInv(InitParams->bClockInv);
2243 _VPU_EX_ClockSpeed(InitParams->eClockSpeed);
2244 HAL_VPU_EX_PowerCtrl(TRUE);
2245
2246 #if 1 //Create VPU's own mutex
2247 //_HAL_VPU_MutexCreate();
2248 #else
2249 pVPUHalContext->s32VPUMutexID = InitParams->s32VPUMutexID;
2250 pVPUHalContext->u32VPUMutexTimeOut = InitParams->u32VPUMutexTimeout;
2251 #endif
2252
2253 return TRUE;
2254 }
2255
HAL_VPU_EX_DeInit(void)2256 MS_BOOL HAL_VPU_EX_DeInit(void)
2257 {
2258 if (0 != _VPU_EX_GetActiveCodecCnt())
2259 {
2260 VPU_MSG_DBG("do nothing since codec is active.\n");
2261 return TRUE;
2262 }
2263
2264 memset(&(pVPUHalContext->_stVPUDecMode),0,sizeof(VPU_EX_DecModCfg));
2265
2266 HAL_VPU_EX_PowerCtrl(FALSE);
2267 HAL_VPU_EX_SwRelseMAU();
2268 //_HAL_VPU_MutexDelete();
2269
2270 return TRUE;
2271 }
2272
HAL_VPU_EX_PowerCtrl(MS_BOOL bEnable)2273 void HAL_VPU_EX_PowerCtrl(MS_BOOL bEnable)
2274 {
2275 if (bEnable)
2276 {
2277 _VPU_WriteWordMask(REG_TOP_VPU, 0, TOP_CKG_VPU_DIS);
2278 pVPUHalContext->_bVPUPowered = TRUE;
2279 }
2280 else
2281 {
2282 _VPU_WriteWordMask(REG_TOP_VPU, TOP_CKG_VPU_DIS, TOP_CKG_VPU_DIS);
2283 pVPUHalContext->_bVPUPowered = FALSE;
2284 }
2285 }
2286
HAL_VPU_EX_MIU_RW_Protect(MS_BOOL bEnable)2287 void HAL_VPU_EX_MIU_RW_Protect(MS_BOOL bEnable)
2288 {
2289 _VPU_MIU_SetReqMask(VPU_D_RW, bEnable);
2290 _VPU_MIU_SetReqMask(VPU_Q_RW, bEnable);
2291 _VPU_MIU_SetReqMask(VPU_I_R, bEnable);
2292 VPU_EX_TimerDelayMS(1);
2293 }
2294
2295 ///-----------------------------------------------------------------------------
2296 /// config AVCH264 CPU
2297 /// @param u32StAddr \b IN: CPU binary code base address in DRAM.
2298 /// @param u8dlend_en \b IN: endian
2299 /// - 1, little endian
2300 /// - 0, big endian
2301 ///-----------------------------------------------------------------------------
HAL_VPU_EX_CPUSetting(MS_U32 u32StAddr)2302 MS_BOOL HAL_VPU_EX_CPUSetting(MS_U32 u32StAddr)
2303 {
2304 MS_BOOL bRet = TRUE;
2305 MS_U32 u32Offset = 0;
2306 MS_U16 tempreg = 0;
2307
2308 u32Offset = (u32StAddr >= HAL_MIU1_BASE) ? (u32StAddr-HAL_MIU1_BASE) : u32StAddr ;
2309 _VPU_Write2Byte(VPU_REG_SPI_BASE, 0xC000);
2310 _VPU_WriteWordMask( VPU_REG_CPU_SETTING , 0 , VPU_REG_CPU_SPI_BOOT );
2311 _VPU_WriteWordMask( VPU_REG_CPU_SETTING , 0 , VPU_REG_CPU_SDRAM_BOOT );
2312 _VPU_Write2Byte(VPU_REG_DQMEM_MASK_L, 0xc000);
2313 _VPU_Write2Byte(VPU_REG_DQMEM_MASK_H, 0xffff);
2314 _VPU_Write2Byte(VPU_REG_IO2_BASE, 0x8000);
2315 _VPU_Write2Byte(VPU_REG_DQMEM_BASE_L, 0x0000);
2316 _VPU_Write2Byte(VPU_REG_DQMEM_BASE_H, 0x2000);
2317
2318
2319 #ifdef ENABLE_EXTERNAL_DS_BUFFER
2320 //// Do not force MIU
2321 if(u32StAddr >= HAL_MIU1_BASE)
2322 {
2323 // Data sram base Unit: byte address
2324 _VPU_Write2Byte(VPU_REG_DCU_SDR_BASE_L, (MS_U16)((u32Offset | VPU_MIU1BASE_ADDR) & 0x0000ffff)) ;
2325 _VPU_Write2Byte(VPU_REG_DCU_SDR_BASE_H, (MS_U16)(((u32Offset | VPU_MIU1BASE_ADDR)>>16) & 0xffff));
2326 // Instruction sram base Unit: byte address
2327 _VPU_Write2Byte(VPU_REG_ICU_SDR_BASE_L, (MS_U16)(u32Offset & 0x0000ffff)) ;
2328 _VPU_Write2Byte(VPU_REG_ICU_SDR_BASE_H, (MS_U16)((u32Offset >>16) & 0xffff));
2329 }
2330 else
2331 {
2332 // Data sram base Unit: byte address
2333 _VPU_Write2Byte(VPU_REG_DCU_SDR_BASE_L, (MS_U16)(u32Offset & 0x0000ffff)) ;
2334 _VPU_Write2Byte(VPU_REG_DCU_SDR_BASE_H, (MS_U16)((u32Offset>>16) & 0xffff));
2335 // Instruction sram base Unit: byte address
2336 _VPU_Write2Byte(VPU_REG_ICU_SDR_BASE_L, (MS_U16)(u32Offset & 0x0000ffff)) ;
2337 _VPU_Write2Byte(VPU_REG_ICU_SDR_BASE_H, (MS_U16)((u32Offset>>16) & 0xffff));
2338 }
2339 #else
2340 if(u32StAddr >= HAL_MIU1_BASE)
2341 {
2342 // Data sram base Unit: byte address
2343 _VPU_Write2Byte(VPU_REG_DCU_SDR_BASE_L, (MS_U16)(u32Offset & 0x0000ffff)) ;
2344 _VPU_Write2Byte(VPU_REG_DCU_SDR_BASE_H, (MS_U16)((u32Offset >>16) & 0xffff));
2345 // Instruction sram base Unit: byte address
2346 _VPU_Write2Byte(VPU_REG_ICU_SDR_BASE_L, (MS_U16)(u32Offset & 0x0000ffff)) ;
2347 _VPU_Write2Byte(VPU_REG_ICU_SDR_BASE_H, (MS_U16)((u32Offset >>16) & 0xffff));
2348
2349 _VPU_Write2Byte(MAU1_MIU_SEL, 0x8b00);
2350 }
2351 else
2352 {
2353 // Data sram base Unit: byte address
2354 _VPU_Write2Byte(VPU_REG_DCU_SDR_BASE_L, (MS_U16)(u32Offset & 0x0000ffff)) ;
2355 _VPU_Write2Byte(VPU_REG_DCU_SDR_BASE_H, (MS_U16)((u32Offset>>16) & 0xffff));
2356 // Instruction sram base Unit: byte address
2357 _VPU_Write2Byte(VPU_REG_ICU_SDR_BASE_L, (MS_U16)(u32Offset & 0x0000ffff)) ;
2358 _VPU_Write2Byte(VPU_REG_ICU_SDR_BASE_H, (MS_U16)((u32Offset>>16) & 0xffff));
2359
2360 _VPU_Write2Byte(MAU1_MIU_SEL, 0x8900);
2361 }
2362 #endif
2363
2364 tempreg = _VPU_Read2Byte(VPU_REG_CONTROL_SET);
2365 tempreg |= VPU_REG_IO2_EN;
2366 tempreg |= VPU_REG_QMEM_SPACE_EN;
2367 _VPU_Write2Byte(VPU_REG_CONTROL_SET, tempreg);
2368
2369 return bRet;
2370 }
2371
2372 ///-----------------------------------------------------------------------------
2373 /// Set IQMem data access mode or instruction fetch mode
2374 /// @param u8dlend_en \b IN: endian
2375 /// - 1, switch to data access mode
2376 /// - 0, switch to instruction fetch mode
2377 ///-----------------------------------------------------------------------------
HAL_VPU_EX_IQMemSetDAMode(MS_BOOL bEnable)2378 void HAL_VPU_EX_IQMemSetDAMode(MS_BOOL bEnable)
2379 {
2380
2381 if(bEnable){
2382
2383 _VPU_Write2Byte(VPU_REG_IQMEM_SETTING, _VPU_Read2Byte(VPU_REG_IQMEM_SETTING)|0x10);
2384 _VPU_Write2Byte(VPU_REG_QMEM_OWNER, _VPU_Read2Byte(VPU_REG_QMEM_OWNER)&0xFFDE);
2385
2386 }
2387 else{
2388
2389 _VPU_Write2Byte(VPU_REG_IQMEM_SETTING, _VPU_Read2Byte(VPU_REG_IQMEM_SETTING)& 0xFFEF);
2390
2391 }
2392 }
2393
2394 ///-----------------------------------------------------------------------------
2395 /// H.264 SW reset
2396 /// @return TRUE or FALSE
2397 /// - TRUE, Success
2398 /// - FALSE, Failed
2399 ///-----------------------------------------------------------------------------
HAL_VPU_EX_SwRst(MS_BOOL bCheckMauIdle)2400 MS_BOOL HAL_VPU_EX_SwRst(MS_BOOL bCheckMauIdle)
2401 {
2402 MS_U16 tempreg = 0, tempreg1 = 0;
2403
2404 //From T4, need to check MAU idle before reset VPU
2405 if (bCheckMauIdle)
2406 {
2407 MS_U32 mau_idle_cnt = 100;// ms
2408 while (mau_idle_cnt)
2409 {
2410 if (TRUE == _VPU_EX_MAU_IDLE())
2411 {
2412 break;
2413 }
2414 mau_idle_cnt--;
2415 MsOS_DelayTask(1);
2416 }
2417
2418 if (mau_idle_cnt == 0)
2419 {
2420 printf("MAU idle time out~~~~~\n");
2421 }
2422 }
2423
2424
2425 HAL_VPU_EX_MIU_RW_Protect(TRUE);
2426
2427 tempreg1 = _VPU_Read2Byte(MAU1_CPU_RST);
2428 tempreg1 |= MAU1_REG_SW_RESET;
2429 _VPU_Write2Byte(MAU1_CPU_RST, tempreg1);
2430
2431 #if defined(UDMA_FPGA_ENVI)
2432 tempreg = _VPU_Read2Byte(VPU_REG_RESET);
2433 _VPU_Write2Byte(VPU_REG_RESET, (tempreg& 0xfffd));
2434 #endif
2435
2436 tempreg = _VPU_Read2Byte(VPU_REG_CPU_SETTING);
2437 tempreg &= ~VPU_REG_CPU_R2_EN;
2438 tempreg &= ~VPU_REG_CPU_SW_RSTZ;
2439 tempreg &= ~VPU_REG_CPU_MIU_SW_RSTZ;
2440 _VPU_Write2Byte(VPU_REG_CPU_SETTING, tempreg);
2441
2442 VPU_EX_TimerDelayMS(1);
2443 HAL_VPU_EX_MIU_RW_Protect(FALSE);
2444
2445 pVPUHalContext->_bVPURsted = FALSE;
2446 return TRUE;
2447 }
2448
2449 ///-----------------------------------------------------------------------------
2450 /// CPU reset release
2451 ///-----------------------------------------------------------------------------
HAL_VPU_EX_SwRstRelse(void)2452 void HAL_VPU_EX_SwRstRelse(void)
2453 {
2454 MS_U16 tempreg = 0, tempreg1 = 0;
2455
2456 tempreg = _VPU_Read2Byte(VPU_REG_CPU_SETTING);
2457 tempreg |= VPU_REG_CPU_R2_EN;
2458 tempreg |= VPU_REG_CPU_SW_RSTZ;
2459 tempreg |= VPU_REG_CPU_MIU_SW_RSTZ;
2460 _VPU_Write2Byte(VPU_REG_CPU_SETTING, tempreg);
2461
2462 tempreg1 = _VPU_Read2Byte(MAU1_CPU_RST);
2463 tempreg1 &= ~MAU1_REG_SW_RESET;
2464 _VPU_Write2Byte(MAU1_CPU_RST, tempreg1);
2465
2466 pVPUHalContext->_bVPURsted = TRUE;
2467 }
2468
HAL_VPU_EX_SwRelseMAU(void)2469 void HAL_VPU_EX_SwRelseMAU(void)
2470 {
2471 MS_U16 tempreg = 0;
2472
2473 tempreg = _VPU_Read2Byte(MAU1_CPU_RST);
2474 tempreg &= ~MAU1_REG_SW_RESET;
2475 _VPU_Write2Byte(MAU1_CPU_RST, tempreg);
2476 }
2477
HAL_VPU_EX_MemRead(MS_U32 u32Addr)2478 MS_U32 HAL_VPU_EX_MemRead(MS_U32 u32Addr)
2479 {
2480 MS_U32 u32value = 0;
2481
2482 return u32value;
2483 }
2484
HAL_VPU_EX_MemWrite(MS_U32 u32Addr,MS_U32 u32value)2485 MS_BOOL HAL_VPU_EX_MemWrite(MS_U32 u32Addr, MS_U32 u32value)
2486 {
2487 MS_BOOL bRet = TRUE;
2488
2489 return bRet;
2490 }
2491
2492 ///-----------------------------------------------------------------------------
2493 /// Check AVCH264 Ready or not
2494 /// @return TRUE or FALSE
2495 /// - TRUE, MailBox is free
2496 /// - FALSE, MailBox is busy
2497 /// @param u8MBox \b IN: MailBox to check
2498 /// - AVCH264_HI_MBOX0,
2499 /// - AVCH264_HI_MBOX1,
2500 /// - AVCH264_RISC_MBOX0,
2501 /// - AVCH264_RISC_MBOX1,
2502 ///-----------------------------------------------------------------------------
HAL_VPU_EX_MBoxRdy(MS_U32 u32type)2503 MS_BOOL HAL_VPU_EX_MBoxRdy(MS_U32 u32type)
2504 {
2505 MS_BOOL bResult = FALSE;
2506
2507 switch (u32type)
2508 {
2509 case VPU_HI_MBOX0:
2510 bResult = (_VPU_Read2Byte(VPU_REG_HI_MBOX_RDY) & VPU_REG_HI_MBOX0_RDY) ? FALSE : TRUE;
2511 break;
2512 case VPU_HI_MBOX1:
2513 bResult = (_VPU_Read2Byte(VPU_REG_HI_MBOX_RDY) & VPU_REG_HI_MBOX1_RDY) ? FALSE : TRUE;
2514 break;
2515 case VPU_RISC_MBOX0:
2516 bResult = (_VPU_Read2Byte(VPU_REG_RISC_MBOX_RDY) & VPU_REG_RISC_MBOX0_RDY) ? TRUE : FALSE;
2517 break;
2518 case VPU_RISC_MBOX1:
2519 bResult = (_VPU_Read2Byte(VPU_REG_RISC_MBOX_RDY) & VPU_REG_RISC_MBOX1_RDY) ? TRUE : FALSE;
2520 break;
2521 default:
2522 break;
2523 }
2524 return bResult;
2525 }
2526
2527
2528 ///-----------------------------------------------------------------------------
2529 /// Read message from AVCH264
2530 /// @return TRUE or FALSE
2531 /// - TRUE, success
2532 /// - FALSE, failed
2533 /// @param u8MBox \b IN: MailBox to read
2534 /// - AVCH264_RISC_MBOX0
2535 /// - AVCH264_RISC_MBOX1
2536 /// @param u32Msg \b OUT: message read
2537 ///-----------------------------------------------------------------------------
HAL_VPU_EX_MBoxRead(MS_U32 u32type,MS_U32 * u32Msg)2538 MS_BOOL HAL_VPU_EX_MBoxRead(MS_U32 u32type, MS_U32 * u32Msg)
2539 {
2540 MS_BOOL bResult = TRUE;
2541
2542 switch (u32type)
2543 {
2544 case VPU_HI_MBOX0:
2545 *u32Msg = ((MS_U32) (_VPU_Read2Byte(VPU_REG_HI_MBOX0_H)) << 16) |
2546 ((MS_U32) (_VPU_Read2Byte(VPU_REG_HI_MBOX0_L)));
2547 break;
2548 case VPU_HI_MBOX1:
2549 *u32Msg = ((MS_U32) (_VPU_Read2Byte(VPU_REG_HI_MBOX1_H)) << 16) |
2550 ((MS_U32) (_VPU_Read2Byte(VPU_REG_HI_MBOX1_L)));
2551 break;
2552 case VPU_RISC_MBOX0:
2553 *u32Msg = ((MS_U32) (_VPU_Read2Byte(VPU_REG_RISC_MBOX0_H)) << 16) |
2554 ((MS_U32) (_VPU_Read2Byte(VPU_REG_RISC_MBOX0_L)));
2555 break;
2556 case VPU_RISC_MBOX1:
2557 *u32Msg = ((MS_U32) (_VPU_Read2Byte(VPU_REG_RISC_MBOX1_H)) << 16) |
2558 ((MS_U32) (_VPU_Read2Byte(VPU_REG_RISC_MBOX1_L)));
2559 break;
2560 default:
2561 *u32Msg = 0;
2562 bResult = FALSE;
2563 break;
2564 }
2565 return bResult;
2566 }
2567
2568 ///-----------------------------------------------------------------------------
2569 /// Mailbox from AVCH264 clear bit resest
2570 ///-----------------------------------------------------------------------------
HAL_VPU_EX_MBoxClear(MS_U32 u32type)2571 void HAL_VPU_EX_MBoxClear(MS_U32 u32type)
2572 {
2573 switch (u32type)
2574 {
2575 case VPU_RISC_MBOX0:
2576 _VPU_WriteWordMask(VPU_REG_RISC_MBOX_CLR, VPU_REG_RISC_MBOX0_CLR, VPU_REG_RISC_MBOX0_CLR);
2577 break;
2578 case VPU_RISC_MBOX1:
2579 _VPU_WriteWordMask(VPU_REG_RISC_MBOX_CLR, VPU_REG_RISC_MBOX1_CLR, VPU_REG_RISC_MBOX1_CLR);
2580 break;
2581 default:
2582 break;
2583 }
2584 }
2585
2586 ///-----------------------------------------------------------------------------
2587 /// Send message to AVCH264
2588 /// @return TRUE or FALSE
2589 /// - TRUE, Success
2590 /// - FALSE, Failed
2591 /// @param u8MBox \b IN: MailBox
2592 /// - AVCH264_HI_MBOX0,
2593 /// - AVCH264_HI_MBOX1,
2594 ///-----------------------------------------------------------------------------
HAL_VPU_EX_MBoxSend(MS_U32 u32type,MS_U32 u32Msg)2595 MS_BOOL HAL_VPU_EX_MBoxSend(MS_U32 u32type, MS_U32 u32Msg)
2596 {
2597 MS_BOOL bResult = TRUE;
2598
2599 VPU_MSG_DBG("type=%lu, msg=0x%lx\n", u32type, u32Msg);
2600
2601 switch (u32type)
2602 {
2603 case VPU_HI_MBOX0:
2604 {
2605 _VPU_Write4Byte(VPU_REG_HI_MBOX0_L, u32Msg);
2606 _VPU_WriteWordMask(VPU_REG_HI_MBOX_SET, VPU_REG_HI_MBOX0_SET, VPU_REG_HI_MBOX0_SET);
2607 break;
2608 }
2609 case VPU_HI_MBOX1:
2610 {
2611 _VPU_Write4Byte(VPU_REG_HI_MBOX1_L, u32Msg);
2612 _VPU_WriteWordMask(VPU_REG_HI_MBOX_SET, VPU_REG_HI_MBOX1_SET, VPU_REG_HI_MBOX1_SET);
2613 break;
2614 }
2615 default:
2616 {
2617 bResult = FALSE;
2618 break;
2619 }
2620 }
2621
2622 return bResult;
2623 }
2624
HAL_VPU_EX_GetProgCnt(void)2625 MS_U32 HAL_VPU_EX_GetProgCnt(void)
2626 {
2627
2628 MS_U16 expc_l=0;
2629 MS_U16 expc_h=0;
2630 expc_l = _VPU_Read2Byte(VPU_REG_EXPC_L) & 0xFFFF;
2631 expc_h = _VPU_Read2Byte(VPU_REG_EXPC_H) & 0xFFFF;
2632 return (((MS_U32)expc_h) << 16) | (MS_U32)expc_l;
2633 }
2634
HAL_VPU_EX_GetTaskId(MS_U32 u32Id)2635 MS_U8 HAL_VPU_EX_GetTaskId(MS_U32 u32Id)
2636 {
2637 return _VPU_EX_GetOffsetIdx(u32Id);
2638 }
2639
HAL_VPU_EX_SetShareInfoAddr(MS_U32 u32Id,MS_U32 u32ShmAddr)2640 void HAL_VPU_EX_SetShareInfoAddr(MS_U32 u32Id, MS_U32 u32ShmAddr)
2641 {
2642 MS_U8 u8Offset = _VPU_EX_GetOffsetIdx(u32Id);
2643
2644 if (u32ShmAddr == 0)
2645 {
2646 pVPUHalContext->u32FWShareInfoAddr[u8Offset] = 0xFFFFFFFF;
2647 }
2648 else
2649 {
2650 if (u8Offset == 0)
2651 {
2652 pVPUHalContext->u32FWShareInfoAddr[u8Offset] = u32ShmAddr;
2653 }
2654 else if (u8Offset == 1)
2655 {
2656 pVPUHalContext->u32FWShareInfoAddr[u8Offset] = u32ShmAddr + TEE_ONE_TASK_SHM_SIZE;
2657 }
2658 }
2659
2660 VPU_MSG_DBG("set PA ShareInfoAddr[%d] = 0x%lx \n", u8Offset, pVPUHalContext->u32FWShareInfoAddr[u8Offset]);
2661 return;
2662 }
2663
HAL_VPU_EX_GetShareInfoAddr(MS_U32 u32Id)2664 MS_U32 HAL_VPU_EX_GetShareInfoAddr(MS_U32 u32Id)
2665 {
2666 MS_U8 u8Offset = _VPU_EX_GetOffsetIdx(u32Id);
2667
2668 return pVPUHalContext->u32FWShareInfoAddr[u8Offset];
2669 }
2670
2671 #if defined(VDEC_FW31)
HAL_VPU_EX_GetVsyncAddrOffset(MS_U32 u32Id)2672 MS_U32 HAL_VPU_EX_GetVsyncAddrOffset(MS_U32 u32Id)
2673 {
2674 MS_U8 u8Offset = _VPU_EX_GetOffsetIdx(u32Id);
2675 MS_U32 VPUSHMAddr = HAL_VPU_EX_GetSHMAddr();
2676 MS_U32 VsyncBridgeOffset = 0;
2677
2678 if (VPUSHMAddr != 0) // TEE project
2679 {
2680 if ((u8Offset == 0) || (u8Offset == 1))
2681 {
2682 VsyncBridgeOffset = VSYNC_BRIDGE_OFFSET;
2683 }
2684 else
2685 {
2686 VsyncBridgeOffset = VSYNC_BRIDGE_NWAY_OFFSET + (u8Offset - 2) * VSYNC_BRIDGE_INFO_SIZE;
2687 }
2688 }
2689 else // normal project
2690 {
2691 if ((u8Offset == 0) || (u8Offset == 1))
2692 {
2693 VsyncBridgeOffset = COMMON_AREA_START + VSYNC_BRIDGE_OFFSET;
2694 }
2695 else
2696 {
2697 VsyncBridgeOffset = COMMON_AREA_START + VSYNC_BRIDGE_NWAY_OFFSET + (u8Offset - 2) * VSYNC_BRIDGE_INFO_SIZE;
2698 }
2699 }
2700
2701 return VsyncBridgeOffset;
2702 }
2703
HAL_VPU_EX_GetVsyncExtAddrOffset(MS_U32 u32Id)2704 MS_U32 HAL_VPU_EX_GetVsyncExtAddrOffset(MS_U32 u32Id)
2705 {
2706 MS_U8 u8Offset = _VPU_EX_GetOffsetIdx(u32Id);
2707 MS_U32 VPUSHMAddr = HAL_VPU_EX_GetSHMAddr();
2708 MS_U32 VsyncBridgeExtOffset = 0;
2709
2710 if (VPUSHMAddr != 0) // TEE project
2711 {
2712 if ((u8Offset == 0) || (u8Offset == 1))
2713 {
2714 VsyncBridgeExtOffset = VSYNC_BRIDGE_EXT_OFFSET;
2715 }
2716 else
2717 {
2718 VsyncBridgeExtOffset = VSYNC_BRIDGE_EXT_NWAY_OFFSET + (u8Offset - 2) * VSYNC_BRIDGE_INFO_SIZE;
2719 }
2720 }
2721 else // normal project
2722 {
2723 if ((u8Offset == 0) || (u8Offset == 1))
2724 {
2725 VsyncBridgeExtOffset = COMMON_AREA_START + VSYNC_BRIDGE_EXT_OFFSET;
2726 }
2727 else
2728 {
2729 VsyncBridgeExtOffset = COMMON_AREA_START + VSYNC_BRIDGE_EXT_NWAY_OFFSET + (u8Offset - 2) * VSYNC_BRIDGE_INFO_SIZE;
2730 }
2731 }
2732
2733 return VsyncBridgeExtOffset;
2734 }
2735 #endif
2736
HAL_VPU_EX_IsPowered(void)2737 MS_BOOL HAL_VPU_EX_IsPowered(void)
2738 {
2739 return pVPUHalContext->_bVPUPowered;
2740 }
2741
HAL_VPU_EX_IsRsted(void)2742 MS_BOOL HAL_VPU_EX_IsRsted(void)
2743 {
2744 return pVPUHalContext->_bVPURsted;
2745 }
2746
HAL_VPU_EX_IsEVDR2(void)2747 MS_BOOL HAL_VPU_EX_IsEVDR2(void)
2748 {
2749 #ifdef EVDR2
2750 return TRUE;
2751 #else
2752 return FALSE;
2753 #endif
2754 }
2755
HAL_VPU_EX_MVDInUsed(void)2756 MS_BOOL HAL_VPU_EX_MVDInUsed(void)
2757 {
2758 //MVD is in used for MVD or HVD_TSP mode.
2759 MS_U8 i;
2760 MS_U8 u8UseCnt = 0;
2761
2762 for (i = 0; i < sizeof(pVPUHalContext->_stVPUStream) / sizeof(pVPUHalContext->_stVPUStream[0]); i++)
2763 {
2764 if ((pVPUHalContext->_stVPUStream[i].eDecodertype == E_VPU_EX_DECODER_MVD) ||
2765 #ifdef VDEC3
2766 (pVPUHalContext->_stVPUStream[i].eDecodertype == E_VPU_EX_DECODER_EVD) ||
2767 #endif
2768 (pVPUHalContext->_stVPUStream[i].eDecodertype == E_VPU_EX_DECODER_HVD) )
2769 {
2770 u8UseCnt++;
2771 }
2772 }
2773
2774 VPU_MSG_DBG("MVD u8UseCnt=%d\n", u8UseCnt);
2775
2776 if (u8UseCnt != 0)
2777 {
2778 return TRUE;
2779 }
2780 else
2781 {
2782 return FALSE;
2783 }
2784 }
2785
HAL_VPU_EX_HVDInUsed(void)2786 MS_BOOL HAL_VPU_EX_HVDInUsed(void)
2787 {
2788 //HVD is in used for HVD or MVD in sub stream.
2789 MS_U8 i;
2790 MS_U8 u8UseCnt = 0;
2791 MS_BOOL bMVDTriggerHVD = FALSE;
2792 for (i = 0; i < sizeof(pVPUHalContext->_stVPUStream) / sizeof(pVPUHalContext->_stVPUStream[0]); i++)
2793 {
2794 #ifdef VDEC3
2795 bMVDTriggerHVD = (E_VPU_EX_DECODER_MVD == pVPUHalContext->_stVPUStream[i].eDecodertype) &&
2796 (pVPUHalContext->u8HALId[i] == 1) &&
2797 (E_VPU_DEC_MODE_DUAL_INDIE == pVPUHalContext->_stVPUDecMode.u8DecMod);
2798 #else
2799 bMVDTriggerHVD = (E_VPU_EX_DECODER_MVD == pVPUHalContext->_stVPUStream[i].eDecodertype) &&
2800 (E_HAL_VPU_SUB_STREAM0 == pVPUHalContext->_stVPUStream[i].eStreamId) &&
2801 (E_VPU_DEC_MODE_DUAL_INDIE == pVPUHalContext->_stVPUDecMode.u8DecMod);
2802 #endif
2803
2804 if(bMVDTriggerHVD)
2805 {
2806 VPU_MSG_DBG("%s i:%d eDecodertype:%d u8DecMod:%d\n",__FUNCTION__,i,pVPUHalContext->_stVPUStream[i].eDecodertype,pVPUHalContext->_stVPUDecMode.u8DecMod);
2807 }
2808
2809 if ((E_VPU_EX_DECODER_HVD == pVPUHalContext->_stVPUStream[i].eDecodertype)
2810 #ifdef VDEC3
2811 ||(E_VPU_EX_DECODER_EVD == pVPUHalContext->_stVPUStream[i].eDecodertype)
2812 #endif
2813 ||(TRUE == bMVDTriggerHVD)
2814 )
2815 {
2816 u8UseCnt++;
2817 }
2818 }
2819
2820 VPU_MSG_DBG("HVD u8UseCnt=%d\n", u8UseCnt);
2821
2822 if (u8UseCnt != 0)
2823 {
2824 return TRUE;
2825 }
2826 else
2827 {
2828 return FALSE;
2829 }
2830 }
2831
2832 #ifdef VDEC3
HAL_VPU_EX_EVDInUsed(void)2833 MS_BOOL HAL_VPU_EX_EVDInUsed(void)
2834 {
2835 MS_U8 i;
2836 MS_U8 u8UseCnt = 0;
2837
2838 for (i = 0; i < sizeof(pVPUHalContext->_stVPUStream) / sizeof(pVPUHalContext->_stVPUStream[0]); i++)
2839 {
2840 if (E_VPU_EX_DECODER_EVD == pVPUHalContext->_stVPUStream[i].eDecodertype)
2841 {
2842 u8UseCnt++;
2843 }
2844 }
2845
2846 VPU_MSG_DBG("EVD u8UseCnt=%d\n", u8UseCnt);
2847
2848 if (u8UseCnt != 0)
2849 {
2850 return TRUE;
2851 }
2852 else
2853 {
2854 return FALSE;
2855 }
2856 }
2857
2858 #if SUPPORT_G2VP9 && defined(VDEC3)
HAL_VPU_EX_G2VP9InUsed(void)2859 MS_BOOL HAL_VPU_EX_G2VP9InUsed(void)
2860 {
2861 MS_U8 i;
2862 MS_U8 u8UseCnt = 0;
2863
2864 for (i = 0; i < sizeof(pVPUHalContext->_stVPUStream) / sizeof(pVPUHalContext->_stVPUStream[0]); i++)
2865 {
2866 if (E_VPU_EX_DECODER_G2VP9 == pVPUHalContext->_stVPUStream[i].eDecodertype)
2867 {
2868 u8UseCnt++;
2869 }
2870 }
2871
2872 VPU_MSG_DBG("G2 VP9 u8UseCnt=%d\n", u8UseCnt);
2873
2874 if (u8UseCnt != 0)
2875 {
2876 return TRUE;
2877 }
2878 else
2879 {
2880 return FALSE;
2881 }
2882 }
2883 #endif
2884 #endif
2885
2886 //-----------------------------------------------------------------------------
2887 /// @brief \b Function \b Name: MDrv_HVD_EX_SetDbgLevel()
2888 /// @brief \b Function \b Description: Set debug level
2889 /// @param -elevel \b IN : debug level
2890 //-----------------------------------------------------------------------------
HAL_VPU_EX_SetDbgLevel(VPU_EX_UartLevel eLevel)2891 void HAL_VPU_EX_SetDbgLevel(VPU_EX_UartLevel eLevel)
2892 {
2893 printf("%s eLevel=0x%x\n", __FUNCTION__, eLevel);
2894
2895 switch (eLevel)
2896 {
2897 case E_VPU_EX_UART_LEVEL_ERR:
2898 {
2899 u32VpuUartCtrl = E_VPU_UART_CTRL_ERR;
2900 break;
2901 }
2902 case E_VPU_EX_UART_LEVEL_INFO:
2903 {
2904 u32VpuUartCtrl = E_VPU_UART_CTRL_INFO | E_VPU_UART_CTRL_ERR;
2905 break;
2906 }
2907 case E_VPU_EX_UART_LEVEL_DBG:
2908 {
2909 u32VpuUartCtrl = E_VPU_UART_CTRL_DBG | E_VPU_UART_CTRL_ERR | E_VPU_UART_CTRL_INFO;
2910 break;
2911 }
2912 case E_VPU_EX_UART_LEVEL_TRACE:
2913 {
2914 u32VpuUartCtrl = E_VPU_UART_CTRL_TRACE | E_VPU_UART_CTRL_ERR | E_VPU_UART_CTRL_INFO | E_VPU_UART_CTRL_DBG;
2915 break;
2916 }
2917 case E_VPU_EX_UART_LEVEL_FW:
2918 {
2919 u32VpuUartCtrl = E_VPU_UART_CTRL_DISABLE;
2920 break;
2921 }
2922 default:
2923 {
2924 u32VpuUartCtrl = E_VPU_UART_CTRL_DISABLE;
2925 break;
2926 }
2927 }
2928 }
2929
HAL_VPU_EX_GetFWVer(MS_U32 u32Id,VPU_EX_FWVerType eVerType)2930 MS_U32 HAL_VPU_EX_GetFWVer(MS_U32 u32Id, VPU_EX_FWVerType eVerType)
2931 {
2932 HVD_Return eCtrlRet = E_HVD_RETURN_FAIL;
2933 MS_U32 u32CmdArg = (MS_U32)eVerType;
2934 MS_U32 u32Version = 0xFFFFFFFF;
2935 eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_VERSION, u32CmdArg);
2936 if (E_HVD_RETURN_SUCCESS != eCtrlRet)
2937 {
2938 VPU_MSG_ERR("E_DUAL_VERSION NG eCtrlRet=%x\n", eCtrlRet);
2939 return u32Version;
2940 }
2941
2942 MS_BOOL bRet = false;
2943 MS_U32 u32TimeOut = 0xFFFFFFFF;
2944
2945 while(--u32TimeOut)
2946 {
2947 if(HAL_VPU_EX_MBoxRdy(VPU_RISC_MBOX0))
2948 {
2949 bRet = HAL_VPU_EX_MBoxRead(VPU_RISC_MBOX0, &u32Version);
2950 if (false == bRet)
2951 {
2952 VPU_MSG_ERR("E_DUAL_VERSION NG bRet=%x\n", bRet);
2953 return u32Version;
2954 }
2955
2956 _VPU_WriteWordMask( VPU_REG_RISC_MBOX_CLR , VPU_REG_RISC_MBOX0_CLR , VPU_REG_RISC_MBOX0_CLR);
2957 VPU_MSG_DBG("E_DUAL_VERSION arg=%lx u32Version = 0x%lx\n", u32CmdArg, u32Version);
2958 return u32Version;
2959 }
2960 }
2961
2962 VPU_MSG_ERR("get E_DUAL_VERSION=%x timeout", eVerType);
2963
2964 return u32Version;
2965 }
2966
HAL_VPU_EX_NotSupportDS(void)2967 MS_BOOL HAL_VPU_EX_NotSupportDS(void)
2968 {
2969 return FALSE;
2970 }
2971
2972 //-----------------------------------------------------------------------------
2973 /// @brief \b Function \b Name: HAL_VPU_EX_MIU1BASE()
2974 /// @brief \b Function \b Description: Get VPU MIU base address
2975 /// @return - vpu MIU1 base
2976 //-----------------------------------------------------------------------------
HAL_VPU_EX_MIU1BASE(void)2977 MS_U32 HAL_VPU_EX_MIU1BASE(void)
2978 {
2979 return VPU_MIU1BASE_ADDR;
2980 }
2981
2982
HAL_VPU_EX_GetSHMAddr(void)2983 MS_U32 HAL_VPU_EX_GetSHMAddr(void)
2984 {
2985 if(pVPUHalContext->bEnableVPUSecureMode == FALSE)
2986 {
2987 return 0;
2988 }
2989 return pVPUHalContext->u32VPUSHMAddr;
2990 }
HAL_VPU_EX_EnableSecurityMode(MS_BOOL enable)2991 MS_BOOL HAL_VPU_EX_EnableSecurityMode(MS_BOOL enable)
2992 {
2993 pVPUHalContext->bEnableVPUSecureMode = enable;
2994 return TRUE;
2995 }
2996
HAL_VPU_EX_CHIP_Capability(void * pHWCap)2997 MS_BOOL HAL_VPU_EX_CHIP_Capability(void* pHWCap)
2998 {
2999 ((VDEC_HwCap*)pHWCap)->u8Cap_Support_Decoder_Num = 2;
3000
3001 ((VDEC_HwCap*)pHWCap)->bCap_Support_MPEG2 = TRUE;
3002 ((VDEC_HwCap*)pHWCap)->bCap_Support_H263 = TRUE;
3003 ((VDEC_HwCap*)pHWCap)->bCap_Support_MPEG4 = TRUE;
3004 ((VDEC_HwCap*)pHWCap)->bCap_Support_DIVX311 = TRUE;
3005 ((VDEC_HwCap*)pHWCap)->bCap_Support_DIVX412 = TRUE;
3006 ((VDEC_HwCap*)pHWCap)->bCap_Support_FLV = TRUE;
3007 ((VDEC_HwCap*)pHWCap)->bCap_Support_VC1ADV = TRUE;
3008 ((VDEC_HwCap*)pHWCap)->bCap_Support_VC1MAIN = TRUE;
3009
3010 ((VDEC_HwCap*)pHWCap)->bCap_Support_RV8 = TRUE;
3011 ((VDEC_HwCap*)pHWCap)->bCap_Support_RV9 = TRUE;
3012 ((VDEC_HwCap*)pHWCap)->bCap_Support_H264 = TRUE;
3013 ((VDEC_HwCap*)pHWCap)->bCap_Support_AVS = TRUE;
3014 ((VDEC_HwCap*)pHWCap)->bCap_Support_MJPEG = TRUE;
3015 ((VDEC_HwCap*)pHWCap)->bCap_Support_MVC = TRUE;
3016 ((VDEC_HwCap*)pHWCap)->bCap_Support_VP8 = TRUE;
3017 ((VDEC_HwCap*)pHWCap)->bCap_Support_HEVC = TRUE;
3018 ((VDEC_HwCap*)pHWCap)->bCap_Support_VP9 = FALSE;
3019 ((VDEC_HwCap*)pHWCap)->bCap_Support_AVS_PLUS = TRUE;
3020
3021 return TRUE;
3022 }
3023
3024 //-----------------------------------------------------------------------------
3025 /// @brief \b Function \b Name: HAL_VPU_EX_GetCodecCapInfo()
3026 /// @brief \b Function \b Description: Get chip codec capability (for vudu)
3027 /// @return - success/fail
3028 //-----------------------------------------------------------------------------
HAL_VPU_EX_GetCodecCapInfo(int eCodecType,VDEC_EX_CODEC_CAP_INFO * pCodecCapInfo)3029 MS_BOOL HAL_VPU_EX_GetCodecCapInfo( int eCodecType, VDEC_EX_CODEC_CAP_INFO *pCodecCapInfo)
3030 {
3031 #define MAX_CAPABILITY_INFO_NUM 8
3032 #define MAX_CODEC_TYPE_NUM 18
3033
3034 unsigned int capability[MAX_CODEC_TYPE_NUM][MAX_CAPABILITY_INFO_NUM] =
3035 {
3036 //width, height , frmrate, profile, level, version bit rate reserved2
3037 { 0, 0, 0, E_VDEC_EX_CODEC_PROFILE_NONE, E_VDEC_EX_CODEC_LEVEL_NONE, E_VDEC_EX_CODEC_VERSION_NONE, 0, 0},//E_HVD_EX_CODEC_TYPE_NONE
3038 { 1920, 1080, 60, E_VDEC_EX_CODEC_PROFILE_MP2_MAIN, E_VDEC_EX_CODEC_LEVEL_MP2_HIGH, E_VDEC_EX_CODEC_VERSION_NONE, 40, 0},//E_HVD_EX_CODEC_TYPE_MPEG2
3039 { 1920, 1080, 60, E_VDEC_EX_CODEC_PROFILE_H263_BASELINE, E_VDEC_EX_CODEC_LEVEL_NONE, E_VDEC_EX_CODEC_VERSION_H263_1, 40, 0},//E_HVD_EX_CODEC_TYPE_H263
3040 { 1920, 1080, 60, E_VDEC_EX_CODEC_PROFILE_MP4_ASP, E_VDEC_EX_CODEC_LEVEL_MP4_L5, E_VDEC_EX_CODEC_VERSION_NONE, 40, 0},//E_HVD_EX_CODEC_TYPE_MPEG4
3041 { 1920, 1080, 60, E_VDEC_EX_CODEC_PROFILE_NONE, E_VDEC_EX_CODEC_LEVEL_NONE, E_VDEC_EX_CODEC_VERSION_DIVX_311, 40, 0},//E_HVD_EX_CODEC_TYPE_DIVX311
3042 { 1920, 1080, 60, E_VDEC_EX_CODEC_PROFILE_NONE, E_VDEC_EX_CODEC_LEVEL_NONE, E_VDEC_EX_CODEC_VERSION_DIVX_6, 40, 0},//E_HVD_EX_CODEC_TYPE_DIVX412
3043 { 1920, 1080, 60, E_VDEC_EX_CODEC_PROFILE_NONE, E_VDEC_EX_CODEC_LEVEL_NONE, E_VDEC_EX_CODEC_VERSION_FLV_1, 40, 0},//E_HVD_EX_CODEC_TYPE_FLV
3044 { 1920, 1080, 60, E_VDEC_EX_CODEC_PROFILE_VC1_AP, E_VDEC_EX_CODEC_LEVEL_VC1_L3, E_VDEC_EX_CODEC_VERSION_NONE, 40, 0},//E_HVD_EX_CODEC_TYPE_VC1_ADV
3045 { 1920, 1080, 60, E_VDEC_EX_CODEC_PROFILE_RCV_MAIN, E_VDEC_EX_CODEC_LEVEL_RCV_HIGH, E_VDEC_EX_CODEC_VERSION_NONE, 40, 0},//E_HVD_EX_CODEC_TYPE_VC1_MAIN (RCV)
3046 { 1920, 1080, 60, E_VDEC_EX_CODEC_PROFILE_NONE, E_VDEC_EX_CODEC_LEVEL_NONE, E_VDEC_EX_CODEC_VERSION_NONE, 40, 0},//E_HVD_EX_CODEC_TYPE_RV8
3047 { 1920, 1080, 60, E_VDEC_EX_CODEC_PROFILE_NONE, E_VDEC_EX_CODEC_LEVEL_NONE, E_VDEC_EX_CODEC_VERSION_NONE, 40, 0},//E_HVD_EX_CODEC_TYPE_RV9
3048 { 1920, 1080, 60, E_VDEC_EX_CODEC_PROFILE_H264_HIP, E_VDEC_EX_CODEC_LEVEL_H264_4_2, E_VDEC_EX_CODEC_VERSION_NONE, 80, 0},//E_HVD_EX_CODEC_TYPE_H264
3049 { 1920, 1080, 60, E_VDEC_EX_CODEC_PROFILE_AVS_BROADCASTING, E_VDEC_EX_CODEC_LEVEL_AVS_6010860, E_VDEC_EX_CODEC_VERSION_NONE, 50, 0},//E_HVD_EX_CODEC_TYPE_AVS
3050 { 640, 480, 30, E_VDEC_EX_CODEC_PROFILE_NONE, E_VDEC_EX_CODEC_LEVEL_NONE, E_VDEC_EX_CODEC_VERSION_NONE, 10, 0},//E_HVD_EX_CODEC_TYPE_MJPEG
3051 { 1920, 1080, 30, E_VDEC_EX_CODEC_PROFILE_H264_HIP, E_VDEC_EX_CODEC_LEVEL_H264_4_2, E_VDEC_EX_CODEC_VERSION_NONE, 80, 0},//E_HVD_EX_CODEC_TYPE_MVC
3052 { 1920, 1080, 30, E_VDEC_EX_CODEC_PROFILE_NONE, E_VDEC_EX_CODEC_LEVEL_NONE, E_VDEC_EX_CODEC_VERSION_NONE, 20, 0},//E_HVD_EX_CODEC_TYPE_VP8
3053 { 1920, 1080, 60, E_VDEC_EX_CODEC_PROFILE_H265_MAIN_10, E_VDEC_EX_CODEC_LEVEL_H265_4_1_HT, E_VDEC_EX_CODEC_VERSION_NONE, 50, 0},//E_HVD_EX_CODEC_TYPE_HEVC
3054 { 2048, 1088, 60, E_VDEC_EX_CODEC_PROFILE_VP9_2, E_VDEC_EX_CODEC_LEVEL_NONE, E_VDEC_EX_CODEC_VERSION_NONE, 30, 0},//E_HVD_EX_CODEC_TYPE_VP9
3055 };
3056
3057 if(eCodecType < MAX_CODEC_TYPE_NUM)
3058 {
3059 pCodecCapInfo->u16CodecCapWidth = capability[eCodecType][0];
3060 pCodecCapInfo->u16CodecCapHeight = capability[eCodecType][1];
3061 pCodecCapInfo->u8CodecCapFrameRate = capability[eCodecType][2];
3062 pCodecCapInfo->u8CodecCapProfile = capability[eCodecType][3];
3063 pCodecCapInfo->u8CodecCapLevel = capability[eCodecType][4];
3064 pCodecCapInfo->u8CodecCapVersion = capability[eCodecType][5];
3065 pCodecCapInfo->u32BitRate = capability[eCodecType][6];
3066 return TRUE;
3067 }
3068 else
3069 {
3070 return FALSE;
3071 }
3072 }
3073
3074
3075 #ifdef VDEC3
HAL_VPU_EX_GetBBUId(MS_U32 u32Id,VPU_EX_TaskInfo * pTaskInfo,MS_BOOL bIsNstreamMode)3076 MS_U32 HAL_VPU_EX_GetBBUId(MS_U32 u32Id, VPU_EX_TaskInfo *pTaskInfo, MS_BOOL bIsNstreamMode)
3077 {
3078 MS_U32 i, max_bbu_cnt;
3079 MS_U32 retBBUId = HAL_VPU_INVALID_BBU_ID;
3080
3081 if(pTaskInfo == NULL)
3082 return retBBUId;
3083
3084 BBU_STATE *bbu_state;
3085 SLQ_STATE *slq_state = &pVPUHalContext->stMVD_SLQ_STATE[0];
3086 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
3087
3088 MS_BOOL bTSP = (pTaskInfo->eSrcType == E_VPU_EX_INPUT_TSP);
3089
3090 pVPUHalContext->u8HALId[u8TaskId] = pTaskInfo->u8HalId;
3091
3092 /* HVD_EX_MSG_ERR("[%d] DecType=0x%x \n", u32Id & 0xFF, pTaskInfo->eDecType);
3093 for(i = 0; i < MAX_MVD_SLQ_COUNT; i++)
3094 HVD_EX_MSG_ERR("slq_state[%d] u32Used=0x%x bTSP=%x bUsedbyMVD=%x\n",i,slq_state[i].u32Used,slq_state[i].bTSP,slq_state[i].bUsedbyMVD);
3095
3096 for(i = 0; i < MAX_EVD_BBU_COUNT; i++)
3097 HVD_EX_MSG_ERR("EVD_BBU_state[%d] u32Used=0x%x bTSP=%x\n",i,pVPUHalContext->stEVD_BBU_STATE[i].u32Used,pVPUHalContext->stEVD_BBU_STATE[i].bTSP);
3098
3099 for(i = 0; i < MAX_HVD_BBU_COUNT; i++)
3100 HVD_EX_MSG_ERR("HVD_BBU_state[%d] u32Used=0x%x bTSP=%x\n",i,pVPUHalContext->stHVD_BBU_STATE[i].u32Used,pVPUHalContext->stHVD_BBU_STATE[i].bTSP);
3101 */
3102 #if 1
3103 if(pTaskInfo->eDecType == E_VPU_EX_DECODER_MVD) // MVD case
3104 {
3105 max_bbu_cnt = MAX_MVD_SLQ_COUNT;
3106 if (bTSP)
3107 {
3108 if ((u8TaskId < MAX_MVD_SLQ_COUNT) && (slq_state[u8TaskId].u32Used == 0))
3109 {
3110 slq_state[u8TaskId].u32Used |= (1 << u8TaskId); // Record the HVD use the TSP parser
3111 slq_state[u8TaskId].bTSP = TRUE;
3112 slq_state[u8TaskId].bUsedbyMVD = TRUE;
3113 return u8TaskId;
3114 }
3115 }
3116 else
3117 {
3118 MS_U32 shared_bbu_idx = HAL_VPU_INVALID_BBU_ID;
3119 MS_U32 avaliable_bbu_idx = HAL_VPU_INVALID_BBU_ID;
3120 for (i = 0; i < MAX_MVD_SLQ_COUNT; i++)
3121 {
3122 if (slq_state[i].u32Used != 0)
3123 {
3124 if (shared_bbu_idx == HAL_VPU_INVALID_BBU_ID && slq_state[i].bTSP == FALSE)
3125 {
3126 shared_bbu_idx = i; // recored the first used MM bbu for sharing
3127 }
3128 }
3129 else if (avaliable_bbu_idx == HAL_VPU_INVALID_BBU_ID)
3130 {
3131 avaliable_bbu_idx = i; // recored the first empty bbu
3132 }
3133 }
3134
3135 if (bIsNstreamMode && shared_bbu_idx != HAL_VPU_INVALID_BBU_ID) { // In Nstream mode, first priority is sharing bbu
3136 slq_state[shared_bbu_idx].u32Used |= (1 << u8TaskId);
3137 slq_state[shared_bbu_idx].bTSP = FALSE;
3138 slq_state[shared_bbu_idx].bUsedbyMVD = TRUE;
3139 return shared_bbu_idx;
3140 }
3141 else if (slq_state[u8TaskId].u32Used == FALSE && u8TaskId < max_bbu_cnt) { // 2nd priority is task id
3142 slq_state[u8TaskId].u32Used |= (1 << u8TaskId);
3143 slq_state[u8TaskId].bTSP = FALSE;
3144 slq_state[u8TaskId].bUsedbyMVD = TRUE;
3145 return u8TaskId;
3146 }
3147 else if (avaliable_bbu_idx != HAL_VPU_INVALID_BBU_ID) { // 3rd priority is avaliable bbu id
3148 slq_state[avaliable_bbu_idx].u32Used |= (1 << u8TaskId);
3149 slq_state[avaliable_bbu_idx].bTSP = FALSE;
3150 slq_state[avaliable_bbu_idx].bUsedbyMVD = TRUE;
3151 return avaliable_bbu_idx;
3152 }
3153 else {
3154 VPU_MSG_ERR("ERROR!!! can't get avaliable BBU ID taskId=%d at %s\n", u8TaskId, __FUNCTION__);
3155 }
3156 }
3157 }
3158 #if SUPPORT_G2VP9
3159 else if(pTaskInfo->eDecType == E_VPU_EX_DECODER_G2VP9) // G2_VP9 case
3160 {
3161 // G2_VP9 don't have the concept of BBU, so we don't need to record the hardware BBU usage situation
3162 // Don't care the return value, G2_VP9 will not use it.
3163 return 0;
3164 }
3165 #endif
3166 else if(pTaskInfo->eDecType == E_VPU_EX_DECODER_VP8) // VP8 case
3167 {
3168 // G2_VP8 always use the same BBU, so we don't need to record the hardware BBU usage situation
3169 // Don't care the return value, VP8 will not use it.
3170 return 0;
3171 }
3172 else
3173 {
3174 switch (pTaskInfo->eDecType)
3175 {
3176 case E_VPU_EX_DECODER_EVD:
3177 max_bbu_cnt = MAX_EVD_BBU_COUNT;
3178 bbu_state = &pVPUHalContext->stEVD_BBU_STATE[0];
3179 break;
3180 case E_VPU_EX_DECODER_HVD:
3181 case E_VPU_EX_DECODER_RVD:
3182 case E_VPU_EX_DECODER_MVC:
3183 default:
3184 max_bbu_cnt = MAX_HVD_BBU_COUNT;
3185 bbu_state = &pVPUHalContext->stHVD_BBU_STATE[0];
3186 break;
3187 }
3188
3189 // FIXME: TSP assume bbu id = u8TaskId, so it does not support N decode. Use the same logic with MM to support it
3190 if (bTSP)
3191 {
3192 if ((u8TaskId < max_bbu_cnt) && (bbu_state[u8TaskId].u32Used == 0) && (slq_state[u8TaskId].u32Used == 0))
3193 {
3194 bbu_state[u8TaskId].u32Used |= (1 << u8TaskId);
3195 bbu_state[u8TaskId].bTSP = TRUE;
3196 slq_state[u8TaskId].u32Used |= (1 << u8TaskId); // Record the HVD use the TSP parser
3197 slq_state[u8TaskId].bTSP = TRUE;
3198 slq_state[u8TaskId].bUsedbyMVD = FALSE;
3199 return u8TaskId;
3200 }
3201 }
3202 else
3203 {
3204 MS_U32 shared_bbu_idx = HAL_VPU_INVALID_BBU_ID;
3205 MS_U32 avaliable_bbu_idx = HAL_VPU_INVALID_BBU_ID;
3206 for (i = 0; i < max_bbu_cnt; i++)
3207 {
3208 if (shared_bbu_idx == HAL_VPU_INVALID_BBU_ID && bbu_state[i].u32Used != 0)
3209 {
3210 if (bbu_state[i].bTSP == FALSE)
3211 {
3212 shared_bbu_idx = i;
3213 }
3214 }
3215 else if (avaliable_bbu_idx == HAL_VPU_INVALID_BBU_ID)
3216 {
3217 avaliable_bbu_idx = i;
3218 }
3219 }
3220 if (bIsNstreamMode && shared_bbu_idx != HAL_VPU_INVALID_BBU_ID) { // // In Nstream mode, first priority is sharing bbu
3221 bbu_state[shared_bbu_idx].u32Used |= (1 << u8TaskId);
3222 return shared_bbu_idx;
3223 }
3224 else if (bbu_state[u8TaskId].u32Used == FALSE && u8TaskId < max_bbu_cnt) { // 2nd priority is task id
3225 bbu_state[u8TaskId].u32Used |= (1 << u8TaskId);
3226 return u8TaskId;
3227 }
3228 else if (avaliable_bbu_idx != HAL_VPU_INVALID_BBU_ID) { // 3rd priority is avaliable bbu id
3229 bbu_state[avaliable_bbu_idx].u32Used |= (1 << u8TaskId);
3230 return avaliable_bbu_idx;
3231 }
3232 else {
3233 VPU_MSG_ERR("ERROR!!! can't get avaliable BBU ID taskId=%d at %s\n", u8TaskId, __FUNCTION__);
3234 }
3235 }
3236 }
3237 #else // The following source code is wiser selecting BBU id. Howerver, it need HW to support and we mark it temporarily.
3238 MS_U32 j;
3239 MS_BOOL Got = FALSE;
3240 if(pTaskInfo->eDecType == E_VPU_EX_DECODER_MVD) // MVD case
3241 {
3242 for (i = 0; i < MAX_MVD_SLQ_COUNT; i++)
3243 {
3244 if(slq_state[i].u32Used != 0)
3245 {
3246 if(!bTSP && slq_state[i].bTSP == FALSE) // MVD non-first MM case
3247 {
3248 retBBUId = i;
3249 slq_state[retBBUId].u32Used |= (1 << u8TaskId);
3250 slq_state[retBBUId].bTSP = bTSP;
3251 slq_state[retBBUId].bUsedbyMVD = TRUE;
3252 return retBBUId;
3253 }
3254 }
3255 else if(!Got && slq_state[i].u32Used == 0) // MVD first MM or TS case
3256 {
3257 if(i < MAX_EVD_BBU_COUNT) // Trend to select used EVD BBU id
3258 {
3259 if(pVPUHalContext->stEVD_BBU_STATE[i].u32Used != 0 && pVPUHalContext->stEVD_BBU_STATE[i].bTSP == FALSE)
3260 {
3261 Got = TRUE;
3262 retBBUId = i;
3263 }
3264 }
3265
3266 if(!Got && i < MAX_HVD_BBU_COUNT) // Trend to select used HVD BBU id
3267 {
3268 if(pVPUHalContext->stHVD_BBU_STATE[i].u32Used != 0 && pVPUHalContext->stHVD_BBU_STATE[i].bTSP == FALSE)
3269 {
3270 Got = TRUE;
3271 retBBUId = i;
3272 }
3273 }
3274
3275 if(!Got && retBBUId == HAL_VPU_INVALID_BBU_ID) // if no used EVD BBU id, select the first BBU_ID
3276 retBBUId = i;
3277 }
3278 }
3279 if(retBBUId != HAL_VPU_INVALID_BBU_ID)
3280 {
3281 slq_state[retBBUId].u32Used |= (1 << u8TaskId);
3282 slq_state[retBBUId].bTSP = bTSP;
3283 slq_state[retBBUId].bUsedbyMVD = TRUE;
3284 }
3285 }
3286 #if SUPPORT_G2VP9
3287 else if(pTaskInfo->eDecType == E_VPU_EX_DECODER_G2VP9) // G2_VP9 case
3288 {
3289 // G2_VP9 don't have the concept of BBU, so we don't need to record the hardware BBU usage situation
3290 // Don't care the return value, G2_VP9 will not use it.
3291 return 0;
3292 }
3293 #endif
3294 else if(pTaskInfo->eDecType == E_VPU_EX_DECODER_VP8) // VP8 case
3295 {
3296 // G2_VP8 always use the same BBU, so we don't need to record the hardware BBU usage situation
3297 // Don't care the return value, VP8 will not use it.
3298 return 0;
3299 }
3300 else // HVD/EVD case
3301 {
3302 switch (pTaskInfo->eDecType)
3303 {
3304 case E_VPU_EX_DECODER_EVD:
3305 case E_VPU_EX_DECODER_G2VP9:
3306 max_bbu_cnt = MAX_EVD_BBU_COUNT;
3307 bbu_state = &pVPUHalContext->stEVD_BBU_STATE[0];
3308 break;
3309 case E_VPU_EX_DECODER_HVD:
3310 case E_VPU_EX_DECODER_RVD:
3311 case E_VPU_EX_DECODER_MVC:
3312 default:
3313 max_bbu_cnt = MAX_HVD_BBU_COUNT;
3314 bbu_state = &pVPUHalContext->stHVD_BBU_STATE[0];
3315 break;
3316 }
3317
3318 for (i = 0; i < max_bbu_cnt; i++)
3319 {
3320 if(bbu_state[i].u32Used != 0)
3321 {
3322 if(!bTSP && bbu_state[i].bTSP == FALSE) // HVD/EVD non-first MM case
3323 {
3324 retBBUId = i;
3325 bbu_state[retBBUId].u32Used |= (1 << u8TaskId);
3326 bbu_state[retBBUId].bTSP = bTSP;
3327 return retBBUId;
3328 }
3329 }
3330 else if(bbu_state[i].u32Used == 0) // HVD/EVD first MM or TS case
3331 {
3332 if(i < MAX_MVD_SLQ_COUNT)
3333 {
3334 if(!bTSP) //HVD/EVD first MM case
3335 {
3336 if( slq_state[i].u32Used != 0 && slq_state[i].bUsedbyMVD== TRUE) // HVD/EVD MM will trend to select used MVD SLQ id
3337 {
3338 retBBUId = i;
3339 bbu_state[retBBUId].u32Used |= (1 << u8TaskId);
3340 bbu_state[retBBUId].bTSP = bTSP;
3341 return retBBUId;
3342 }
3343
3344 if(retBBUId == HAL_VPU_INVALID_BBU_ID) // if no used MVD SLQ id, select the first BBU_ID
3345 retBBUId = i;
3346 }
3347 else if(slq_state[i].u32Used == 0) //HVD/EVD TSP case, just find a empty slq id
3348 {
3349 retBBUId = i;
3350 bbu_state[retBBUId].u32Used |= (1 << u8TaskId);
3351 bbu_state[retBBUId].bTSP = bTSP;
3352 slq_state[retBBUId].bUsedbyMVD = FALSE;
3353 slq_state[retBBUId].u32Used |= (1 << u8TaskId);
3354 slq_state[retBBUId].bTSP = bTSP;
3355 return retBBUId;
3356 }
3357 }
3358 }
3359 }
3360 if(retBBUId != HAL_VPU_INVALID_BBU_ID)
3361 {
3362 bbu_state[retBBUId].u32Used |= (1 << u8TaskId);
3363 bbu_state[retBBUId].bTSP = bTSP;
3364 if(bTSP)
3365 {
3366 slq_state[retBBUId].bUsedbyMVD = FALSE;
3367 slq_state[retBBUId].u32Used |= (1 << u8TaskId);
3368 slq_state[retBBUId].bTSP = bTSP;
3369 }
3370 }
3371 }
3372 #endif
3373 return retBBUId;
3374 }
3375
HAL_VPU_EX_FreeBBUId(MS_U32 u32Id,MS_U32 u32BBUId,VPU_EX_TaskInfo * pTaskInfo)3376 MS_BOOL HAL_VPU_EX_FreeBBUId(MS_U32 u32Id, MS_U32 u32BBUId, VPU_EX_TaskInfo *pTaskInfo)
3377 {
3378 MS_U32 max_bbu_cnt;
3379 BBU_STATE *bbu_state;
3380 SLQ_STATE *slq_state = &pVPUHalContext->stMVD_SLQ_STATE[0];
3381
3382 if(pTaskInfo == NULL)
3383 return FALSE;
3384 MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
3385 MS_BOOL bTSP = (pTaskInfo->eSrcType == E_VPU_EX_INPUT_TSP);
3386
3387 HVD_EX_MSG_ERR("[%d] DecType=0x%x \n", (int)(u32Id & 0xFF), pTaskInfo->eDecType);
3388 /* MS_U32 i;
3389 for(i = 0; i < MAX_MVD_SLQ_COUNT; i++)
3390 HVD_EX_MSG_ERR("slq_state[%d] u32Used=0x%x bTSP=%x bUsedbyMVD=%x\n",i,slq_state[i].u32Used,slq_state[i].bTSP,slq_state[i].bUsedbyMVD);
3391
3392 for(i = 0; i < MAX_EVD_BBU_COUNT; i++)
3393 HVD_EX_MSG_ERR("EVD_BBU_state[%d] u32Used=0x%x bTSP=%x\n",i,pVPUHalContext->stEVD_BBU_STATE[i].u32Used,pVPUHalContext->stEVD_BBU_STATE[i].bTSP);
3394
3395 for(i = 0; i < MAX_HVD_BBU_COUNT; i++)
3396 HVD_EX_MSG_ERR("HVD_BBU_state[%d] u32Used=0x%x bTSP=%x\n",i,pVPUHalContext->stHVD_BBU_STATE[i].u32Used,pVPUHalContext->stHVD_BBU_STATE[i].bTSP);
3397 */
3398 if(pTaskInfo->eDecType == E_VPU_EX_DECODER_MVD) // MVD case
3399 {
3400 // TO DO
3401 if(u32BBUId < MAX_MVD_SLQ_COUNT)
3402 {
3403 slq_state[u32BBUId].u32Used &= ~(1 << u8TaskId); // Record the HVD use the TSP parser
3404 slq_state[u32BBUId].bTSP = FALSE;
3405 slq_state[u32BBUId].bUsedbyMVD = FALSE;
3406 return TRUE;
3407 }
3408 }
3409 #if SUPPORT_G2VP9
3410 else if(pTaskInfo->eDecType == E_VPU_EX_DECODER_G2VP9) // G2_VP9 case
3411 {
3412 // G2_VP9 don't have the concept of BBU, so we don't need to record the hardware BBU usage situation
3413 return TRUE;
3414 }
3415 #endif
3416 else if(pTaskInfo->eDecType == E_VPU_EX_DECODER_VP8) // VP8 case
3417 {
3418 // G2_VP8 always use the same BBU, so we don't need to record the hardware BBU usage situation
3419 return TRUE;
3420 }
3421 else
3422 {
3423 switch (pTaskInfo->eDecType)
3424 {
3425 case E_VPU_EX_DECODER_EVD:
3426 max_bbu_cnt = MAX_EVD_BBU_COUNT;
3427 bbu_state = &pVPUHalContext->stEVD_BBU_STATE[0];
3428 break;
3429 case E_VPU_EX_DECODER_HVD:
3430 case E_VPU_EX_DECODER_RVD:
3431 case E_VPU_EX_DECODER_MVC:
3432 default:
3433 max_bbu_cnt = MAX_HVD_BBU_COUNT;
3434 bbu_state = &pVPUHalContext->stHVD_BBU_STATE[0];
3435 break;
3436 }
3437
3438 if (u32BBUId < max_bbu_cnt)
3439 {
3440 bbu_state[u32BBUId].u32Used &= ~(1 << u8TaskId);
3441 bbu_state[u32BBUId].bTSP = FALSE;
3442 if (bTSP)
3443 {
3444 slq_state[u32BBUId].u32Used &= ~(1 << u8TaskId); // Record the HVD use the TSP parser
3445 slq_state[u32BBUId].bTSP = FALSE;
3446 slq_state[u32BBUId].bUsedbyMVD = FALSE;
3447 }
3448 return TRUE;
3449 }
3450 }
3451 return FALSE;
3452 }
HAL_VPU_EX_GetVBBUVacancy(MS_U32 u32VBBUAddr)3453 MS_U32 HAL_VPU_EX_GetVBBUVacancy(MS_U32 u32VBBUAddr)
3454 {
3455 VDEC_VBBU *pstVBBU = (VDEC_VBBU *)MsOS_PA2KSEG1(pVPUHalContext->u32FWCodeAddr + u32VBBUAddr);
3456
3457 if (CHECK_NULL_PTR(pstVBBU))
3458 return 0;
3459 MS_U32 u32WrPtr = pstVBBU->u32WrPtr;
3460 MS_U32 u32RdPtr = pstVBBU->u32RdPtr;
3461 MS_U32 u32Vacancy = 0;
3462
3463 if (u32WrPtr == u32RdPtr)
3464 {
3465 u32Vacancy = MAX_VDEC_VBBU_ENTRY_COUNT;
3466 }
3467 else if (u32WrPtr > u32RdPtr)
3468 {
3469 u32Vacancy = MAX_VDEC_VBBU_ENTRY_COUNT - (u32WrPtr - u32RdPtr);
3470 }
3471 else
3472 {
3473 u32Vacancy = u32RdPtr - u32WrPtr - 1;
3474 }
3475
3476 return u32Vacancy;
3477 }
3478
HAL_VPU_EX_GetInputQueueNum(MS_U32 u32Id)3479 MS_U32 HAL_VPU_EX_GetInputQueueNum(MS_U32 u32Id)
3480 {
3481 return MAX_VDEC_VBBU_ENTRY_COUNT;
3482 }
3483
HAL_VPU_EX_GetESReadPtr(MS_U32 u32Id,MS_U32 u32VBBUAddr)3484 MS_U32 HAL_VPU_EX_GetESReadPtr(MS_U32 u32Id, MS_U32 u32VBBUAddr)
3485 {
3486 VDEC_VBBU *pstVBBU = (VDEC_VBBU *)MsOS_PA2KSEG1(pVPUHalContext->u32FWCodeAddr + u32VBBUAddr);
3487 MS_U8 u8OffsetIdx = _VPU_EX_GetOffsetIdx(u32Id);
3488
3489 if (CHECK_NULL_PTR(pstVBBU))
3490 return FALSE;
3491 MsOS_ReadMemory();
3492 VDEC_VBBU_Entry *stEntry = (VDEC_VBBU_Entry *) &pstVBBU->stEntry[pstVBBU->u32RdPtr];
3493
3494 // ALOGE("JJJ1: %d %d %d", pstVBBU->u32RdPtr, pstVBBU->u32WrPtr, stEntry->u32Offset);
3495
3496 if (pstVBBU->u32RdPtr == pstVBBU->u32WrPtr)
3497 {
3498 return HAL_VPU_EX_GetESWritePtr(u32Id, u32VBBUAddr);
3499 }
3500 else
3501 {
3502 #if SUPPORT_G2VP9
3503 if (E_VPU_EX_DECODER_G2VP9 == pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype)
3504 {
3505 if (stEntry->u32Offset == 0)
3506 return 0;
3507 else
3508 return stEntry->u32Offset - MsOS_VA2PA(pVPUHalContext->u32BitstreamVAddress);
3509 }
3510 else if(E_VPU_EX_DECODER_MVD == pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype)
3511 {
3512 if(stEntry->u32Offset < 0x80000)
3513 {
3514 return pstVBBU->stEntry[((pstVBBU->u32RdPtr+MAX_VDEC_VBBU_ENTRY_COUNT)%(MAX_VDEC_VBBU_ENTRY_COUNT+1))].u32Offset;
3515 }
3516 else
3517 {
3518 return stEntry->u32Offset;
3519 }
3520 }
3521 else
3522 #else
3523 if(E_VPU_EX_DECODER_MVD == pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype)
3524 {
3525 if(stEntry->u32Offset < 0xA000)
3526 {
3527 return pstVBBU->stEntry[((pstVBBU->u32RdPtr+MAX_VDEC_VBBU_ENTRY_COUNT)%(MAX_VDEC_VBBU_ENTRY_COUNT+1))].u32Offset;
3528 }
3529 else
3530 {
3531 return stEntry->u32Offset;
3532 }
3533 }
3534 else
3535 #endif
3536 {
3537 return stEntry->u32Offset;
3538 }
3539 }
3540 }
3541
HAL_VPU_EX_GetESWritePtr(MS_U32 u32Id,MS_U32 u32VBBUAddr)3542 MS_U32 HAL_VPU_EX_GetESWritePtr(MS_U32 u32Id, MS_U32 u32VBBUAddr)
3543 {
3544 VDEC_VBBU *pstVBBU = (VDEC_VBBU *)MsOS_PA2KSEG1(pVPUHalContext->u32FWCodeAddr + u32VBBUAddr);
3545 VDEC_VBBU_Entry *stEntry;
3546
3547 MsOS_ReadMemory();
3548 if (CHECK_NULL_PTR(pstVBBU))
3549 return 0;
3550 MS_U32 u32WrPtr = pstVBBU->u32WrPtr;
3551
3552 if (u32WrPtr == 0)
3553 u32WrPtr = MAX_VDEC_VBBU_ENTRY_COUNT;
3554 else
3555 u32WrPtr--;
3556
3557 stEntry = (VDEC_VBBU_Entry*) &pstVBBU->stEntry[u32WrPtr];
3558
3559 //ALOGE("JJJ2: %d %d %d %d", pstVBBU->u32RdPtr, u32WrPtr, stEntry->u32Offset, stEntry->u32Length);
3560 #if SUPPORT_G2VP9
3561 MS_U8 u8OffsetIdx = _VPU_EX_GetOffsetIdx(u32Id);
3562 if (E_VPU_EX_DECODER_G2VP9 == pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype)
3563 {
3564 if (stEntry->u32Offset == 0)
3565 return 0;
3566 else
3567 return stEntry->u32Offset + stEntry->u32Length - MsOS_VA2PA(pVPUHalContext->u32BitstreamVAddress);
3568 }
3569 else
3570 #endif
3571 {
3572 return stEntry->u32Offset + stEntry->u32Length;
3573 }
3574 }
3575
HAL_VPU_EX_Push2VBBU(MS_U32 u32Id,HAL_VPU_EX_PacketInfo * stVpuPkt,MS_U32 u32VBBUAddr)3576 MS_BOOL HAL_VPU_EX_Push2VBBU(MS_U32 u32Id, HAL_VPU_EX_PacketInfo *stVpuPkt, MS_U32 u32VBBUAddr)
3577 {
3578 VDEC_VBBU *pstVBBU = (VDEC_VBBU *)MsOS_PA2KSEG1(pVPUHalContext->u32FWCodeAddr + u32VBBUAddr);
3579
3580 if (CHECK_NULL_PTR(pstVBBU) || CHECK_NULL_PTR(stVpuPkt))
3581 return FALSE;
3582 MsOS_ReadMemory();
3583 VDEC_VBBU_Entry *stEntry = (VDEC_VBBU_Entry*) &pstVBBU->stEntry[pstVBBU->u32WrPtr];
3584 MS_U32 u32NewWrPtr;
3585
3586 u32NewWrPtr = pstVBBU->u32WrPtr + 1;
3587 if (u32NewWrPtr == (MAX_VDEC_VBBU_ENTRY_COUNT + 1))
3588 {
3589 u32NewWrPtr = 0;
3590 }
3591
3592 if (u32NewWrPtr == pstVBBU->u32RdPtr) return FALSE;
3593
3594 stEntry->u32Offset = stVpuPkt->u32Offset;
3595 #if SUPPORT_G2VP9
3596 MS_U8 u8OffsetIdx = _VPU_EX_GetOffsetIdx(u32Id);
3597 if (E_VPU_EX_DECODER_G2VP9 == pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype)
3598 {
3599 stEntry->u32Offset += pVPUHalContext->u32BitstreamAddress;
3600 }
3601 #endif
3602 stEntry->u32Length = stVpuPkt->u32Length;
3603 stEntry->u64TimeStamp = stVpuPkt->u64TimeStamp;
3604 stEntry->u32ID_H = stVpuPkt->u32ID_H;
3605 stEntry->u32ID_L = stVpuPkt->u32ID_L;
3606
3607 MsOS_FlushMemory();
3608 pstVBBU->u32WrPtr = u32NewWrPtr;
3609
3610 //ALOGE("JJJ3: %d", pstVBBU->u32WrPtr);
3611
3612 MsOS_FlushMemory();
3613
3614 return TRUE;
3615 }
3616
HAL_VPU_EX_IsVBBUEmpty(MS_U32 u32VBBUAddr)3617 MS_BOOL HAL_VPU_EX_IsVBBUEmpty(MS_U32 u32VBBUAddr)
3618 {
3619 VDEC_VBBU *pstVBBU = (VDEC_VBBU *)MsOS_PA2KSEG1(pVPUHalContext->u32FWCodeAddr + u32VBBUAddr);
3620
3621 if (CHECK_NULL_PTR(pstVBBU))
3622 return FALSE;
3623 return pstVBBU->u32RdPtr == pstVBBU->u32WrPtr;
3624 }
3625
3626 ///-----------------------------------------------------------------------------
3627 /// specify the command send to Mail box or DRAM
3628 /// @return TRUE or FALSE
3629 /// - TRUE, Mail box
3630 /// - FALSE, Dram
3631 /// @param u32Cmd \b IN: Command is going to be sned
3632 ///-----------------------------------------------------------------------------
HAL_VPU_EX_IsMailBoxCMD(MS_U32 u32Cmd)3633 MS_BOOL HAL_VPU_EX_IsMailBoxCMD(MS_U32 u32Cmd)
3634 {
3635 MS_BOOL bResult = TRUE;
3636
3637 switch (u32Cmd)
3638 {
3639 // *********** Runtime action Command
3640 /* case E_HVD_CMD_RELEASE_DISPQ:
3641 case E_HVD_CMD_UPDATE_DISPQ:
3642 case E_HVD_CMD_FLUSH_DEC_Q:
3643 case E_HVD_CMD_FLUSH:
3644 case E_HVD_CMD_PLAY:
3645 case E_HVD_CMD_PAUSE:
3646 case E_HVD_CMD_STOP:
3647 case E_HVD_CMD_STEP_DECODE:
3648 case E_HVD_CMD_SKIP_DEC:
3649 case E_HVD_CMD_DISP_I_DIRECT:*/
3650 // *********** Dual-Stream Create Task Command
3651 case E_DUAL_CMD_TASK0_HVD_BBU:
3652 case E_DUAL_CMD_TASK0_HVD_TSP:
3653 case E_DUAL_CMD_TASK0_MVD_SLQ:
3654 case E_DUAL_CMD_TASK0_MVD_TSP:
3655 case E_DUAL_CMD_TASK1_HVD_BBU:
3656 case E_DUAL_CMD_TASK1_HVD_TSP:
3657 case E_DUAL_CMD_MODE:
3658 #ifndef _WIN32
3659 case E_DUAL_CMD_TASK1_MVD_SLQ:
3660 case E_DUAL_CMD_TASK1_MVD_TSP:
3661 #endif
3662 case E_DUAL_CMD_DEL_TASK:
3663 case E_DUAL_CMD_SINGLE_TASK:
3664 case E_DUAL_VERSION:
3665 case E_DUAL_R2_CMD_EXIT:
3666 #ifdef VDEC3
3667 case E_DUAL_R2_CMD_FBADDR:
3668 case E_DUAL_R2_CMD_FBSIZE:
3669 // *********** N-Streams
3670 case E_NST_CMD_TASK_HVD_TSP:
3671 case E_NST_CMD_TASK_HVD_BBU:
3672 case E_NST_CMD_TASK_MVD_TSP:
3673 case E_NST_CMD_TASK_MVD_SLQ:
3674 case E_NST_CMD_DEL_TASK:
3675 #endif
3676 {
3677 bResult = TRUE;
3678 }
3679 break;
3680 default:
3681 {
3682 bResult = FALSE;
3683 }
3684 break;
3685 }
3686
3687 return bResult;
3688 }
3689
3690 ///-----------------------------------------------------------------------------
3691 /// specify the command send to Mail box or DRAM
3692 /// @return TRUE or FALSE
3693 /// - TRUE, Mail box
3694 /// - FALSE, Dram
3695 /// @param u32Cmd \b IN: Command is going to be sned
3696 ///-----------------------------------------------------------------------------
HAL_VPU_EX_IsDisplayQueueCMD(MS_U32 u32Cmd)3697 MS_BOOL HAL_VPU_EX_IsDisplayQueueCMD(MS_U32 u32Cmd)
3698 {
3699 MS_BOOL bResult = TRUE;
3700
3701 switch (u32Cmd)
3702 {
3703 // *********** Runtime action Command
3704 case E_HVD_CMD_RELEASE_DISPQ:
3705 case E_HVD_CMD_UPDATE_DISPQ:
3706 case E_HVD_CMD_FLUSH_DEC_Q:
3707 case E_HVD_CMD_PAUSE:
3708 case E_HVD_CMD_FLUSH:
3709 case E_HVD_CMD_PLAY:
3710 case E_HVD_CMD_STOP:
3711 case E_HVD_CMD_SKIP_DEC:
3712 case E_HVD_CMD_DISP_I_DIRECT:
3713 case E_HVD_CMD_STEP_DECODE:
3714 case E_HVD_CMD_DYNAMIC_CONNECT_DISP_PATH:
3715 {
3716 bResult = TRUE;
3717 }
3718 break;
3719 default:
3720 {
3721 bResult = FALSE;
3722 }
3723 break;
3724 }
3725
3726 return bResult;
3727 }
3728
3729 ///-----------------------------------------------------------------------------
3730 /// Send message to HVD stream command queue
3731 /// @return TRUE or FALSE
3732 /// - TRUE, Success
3733 /// - FALSE, Failed
3734 /// @param u32DramAddr \b IN: address to be writen
3735 /// @param u32Msg \b IN: data to be writen
3736 ///-----------------------------------------------------------------------------
HAL_VPU_EX_DRAMCMDQueueSend(MS_U32 u32DramAddr,MS_U32 u32Msg)3737 MS_BOOL HAL_VPU_EX_DRAMCMDQueueSend(MS_U32 u32DramAddr, MS_U32 u32Msg)
3738 {
3739 MS_BOOL bResult = TRUE;
3740
3741 VPU_MSG_DBG("Send to Command Queue Address=0x%lx, msg=0x%lx\n", u32DramAddr, u32Msg);
3742
3743 WRITE_LONG(u32DramAddr,u32Msg);
3744
3745 return bResult;
3746 }
3747
3748 ///-----------------------------------------------------------------------------
3749 /// Read task share memory to specify that task command queue is empty or not
3750 /// @return TRUE or FALSE
3751 /// - TRUE, Empty
3752 /// - FALSE, Non empty
3753 /// @param u32Id \b IN: Task information
3754 ///-----------------------------------------------------------------------------
HAL_VPU_EX_DRAMCMDQueueIsEmpty(void * cmd_queue)3755 MS_BOOL HAL_VPU_EX_DRAMCMDQueueIsEmpty(void *cmd_queue)
3756 {
3757 // HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
3758 CMD_QUEUE *cmd_q = (CMD_QUEUE *)cmd_queue;
3759 if (!cmd_q)
3760 {
3761 VPU_MSG_ERR("Invalid parameter with share memory address=0x%x %s:%d \n", (unsigned int)cmd_q, __FUNCTION__, __LINE__);
3762 return FALSE;
3763 }
3764
3765 return cmd_q->u32HVD_STREAM_CMDQ_WD == cmd_q->u32HVD_STREAM_CMDQ_RD;
3766 }
3767
3768 ///-----------------------------------------------------------------------------
3769 /// Read task share memory to specify that task command queue is full or not
3770 /// @return TRUE or FALSE
3771 /// - TRUE, Full
3772 /// - FALSE, Non full
3773 /// @param u32Id \b IN: Task information
3774 ///-----------------------------------------------------------------------------
HAL_VPU_EX_DRAMCMDQueueIsFull(void * cmd_queue)3775 MS_BOOL HAL_VPU_EX_DRAMCMDQueueIsFull(void *cmd_queue)
3776 {
3777 // HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
3778 CMD_QUEUE *cmd_q = (CMD_QUEUE *)cmd_queue;
3779 if (!cmd_q)
3780 {
3781 VPU_MSG_ERR("Invalid parameter with share memory address=0x%x %s:%d \n", (unsigned int)cmd_q, __FUNCTION__, __LINE__);
3782 return TRUE;
3783 }
3784 MS_U32 NewWD = cmd_q->u32HVD_STREAM_CMDQ_WD + (HVD_DRAM_CMDQ_CMD_SIZE + HVD_DRAM_CMDQ_ARG_SIZE); //preserve one slot
3785
3786 if(NewWD >= HVD_CMDQ_DRAM_ST_SIZE)
3787 NewWD -= HVD_CMDQ_DRAM_ST_SIZE;
3788
3789 return NewWD == cmd_q->u32HVD_STREAM_CMDQ_RD;
3790 }
3791
HAL_VPU_EX_DRAMStreamCMDQueueSend(MS_U32 u32Id,void * cmd_queue,HVD_COMMAND_QUEUE_TYPE u8CmdType,MS_U32 u32Msg)3792 HVD_DRAM_COMMAND_QUEUE_SEND_STATUS HAL_VPU_EX_DRAMStreamCMDQueueSend(MS_U32 u32Id, void *cmd_queue, HVD_COMMAND_QUEUE_TYPE u8CmdType, MS_U32 u32Msg)
3793 {
3794 HVD_DRAM_COMMAND_QUEUE_SEND_STATUS bResult = E_HVD_COMMAND_QUEUE_SEND_FAIL;
3795 CMD_QUEUE *cmd_q = (CMD_QUEUE *)cmd_queue;
3796 MS_U8 u8TaskID = HAL_VPU_EX_GetTaskId(u32Id);
3797
3798 #if HVD_ENABLE_MVC
3799 if (E_HAL_VPU_MVC_STREAM_BASE == u8TaskID)
3800 {
3801 u8TaskID = E_HAL_VPU_MAIN_STREAM_BASE;
3802 }
3803 #endif
3804
3805 if (CHECK_NULL_PTR(cmd_q))
3806 {
3807 VPU_MSG_ERR("Invalid parameter with share memory address=0x%x %s:%d \n", (unsigned int)cmd_q, __FUNCTION__, __LINE__);
3808 return bResult;
3809 }
3810 MS_U32 u32CmdQWdPtr;
3811
3812 if (CHECK_NULL_PTR(cmd_q->u32HVD_CMDQ_DRAM_ST_ADDR))
3813 return E_HVD_COMMAND_QUEUE_NOT_INITIALED;
3814
3815 if (HAL_VPU_EX_DRAMCMDQueueIsFull(cmd_q))
3816 return E_HVD_COMMAND_QUEUE_FULL;
3817 else
3818 {
3819 u32CmdQWdPtr = MsOS_PA2KSEG1(pVPUHalContext->u32FWCodeAddr + cmd_q->u32HVD_CMDQ_DRAM_ST_ADDR + cmd_q->u32HVD_STREAM_CMDQ_WD);
3820 }
3821
3822 switch (u8CmdType)
3823 {
3824 case E_HVD_CMDQ_CMD:
3825 {
3826 u32Msg |= (u8TaskID << 24);
3827 MS_BOOL bRes = HAL_VPU_EX_DRAMCMDQueueSend(u32CmdQWdPtr, u32Msg);
3828 MsOS_FlushMemory();
3829
3830 if (bRes)
3831 {
3832 if(cmd_q->u32HVD_STREAM_CMDQ_WD + (HVD_DRAM_CMDQ_CMD_SIZE + HVD_DRAM_CMDQ_ARG_SIZE) >= HVD_CMDQ_DRAM_ST_SIZE )
3833 cmd_q->u32HVD_STREAM_CMDQ_WD = 0;
3834 else
3835 cmd_q->u32HVD_STREAM_CMDQ_WD += (HVD_DRAM_CMDQ_CMD_SIZE + HVD_DRAM_CMDQ_ARG_SIZE);
3836
3837 bResult = E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL;
3838 }
3839 break;
3840 }
3841 case E_HVD_CMDQ_ARG:
3842 {
3843 MS_BOOL bRes = HAL_VPU_EX_DRAMCMDQueueSend(u32CmdQWdPtr + HVD_DRAM_CMDQ_CMD_SIZE, u32Msg);
3844 if (bRes)
3845 bResult = E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL;
3846 break;
3847 }
3848 default:
3849 {
3850 bResult = E_HVD_COMMAND_QUEUE_SEND_FAIL;
3851 break;
3852 }
3853 }
3854
3855 MsOS_FlushMemory();
3856
3857 return bResult;
3858 }
3859
3860 ///-----------------------------------------------------------------------------
3861 /// Read task share memory to specify that task display command queue is empty or not
3862 /// @return TRUE or FALSE
3863 /// - TRUE, Empty
3864 /// - FALSE, Non empty
3865 /// @param u32Id \b IN: Task information
3866 ///-----------------------------------------------------------------------------
HAL_VPU_EX_DRAMDispCMDQueueIsEmpty(void * cmd_queue)3867 MS_BOOL HAL_VPU_EX_DRAMDispCMDQueueIsEmpty(void *cmd_queue)
3868 {
3869 // HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
3870 CMD_QUEUE *cmd_q = (CMD_QUEUE *) cmd_queue;
3871 if (!cmd_q)
3872 {
3873 VPU_MSG_ERR("Invalid parameter with share memory address=0x%x %s:%d \n", (unsigned int)cmd_q, __FUNCTION__, __LINE__);
3874 return FALSE;
3875 }
3876
3877 return cmd_q->u32HVD_STREAM_DISPCMDQ_WD == cmd_q->u32HVD_STREAM_DISPCMDQ_RD;
3878 }
3879
HAL_VPU_EX_DRAMDispCMDQueueIsFull(void * cmd_queue)3880 MS_BOOL HAL_VPU_EX_DRAMDispCMDQueueIsFull(void *cmd_queue)
3881 {
3882 // HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
3883 CMD_QUEUE *cmd_q = (CMD_QUEUE *) cmd_queue;
3884 if (!cmd_q)
3885 {
3886 VPU_MSG_ERR("Invalid parameter with share memory address=0x%x %s:%d \n", (unsigned int)cmd_q, __FUNCTION__, __LINE__);
3887 return TRUE;
3888 }
3889
3890 MS_U32 NewWD = cmd_q->u32HVD_STREAM_DISPCMDQ_WD + (HVD_DRAM_CMDQ_CMD_SIZE + HVD_DRAM_CMDQ_ARG_SIZE); //preserve one slot
3891
3892 if(NewWD >= HVD_DISPCMDQ_DRAM_ST_SIZE)
3893 NewWD -= HVD_DISPCMDQ_DRAM_ST_SIZE;
3894
3895 return NewWD == cmd_q->u32HVD_STREAM_DISPCMDQ_RD;
3896 }
3897
HAL_VPU_EX_DRAMStreamDispCMDQueueSend(MS_U32 u32Id,void * cmd_queue,HVD_COMMAND_QUEUE_TYPE u8CmdType,MS_U32 u32Msg)3898 HVD_DRAM_COMMAND_QUEUE_SEND_STATUS HAL_VPU_EX_DRAMStreamDispCMDQueueSend(MS_U32 u32Id, void *cmd_queue, HVD_COMMAND_QUEUE_TYPE u8CmdType, MS_U32 u32Msg)
3899 {
3900 HVD_DRAM_COMMAND_QUEUE_SEND_STATUS bResult = E_HVD_COMMAND_QUEUE_SEND_FAIL;
3901 CMD_QUEUE *cmd_q = (CMD_QUEUE *)cmd_queue;
3902 MS_U8 u8TaskID = HAL_VPU_EX_GetTaskId(u32Id);
3903
3904 #if HVD_ENABLE_MVC
3905 if (E_HAL_VPU_MVC_STREAM_BASE == u8TaskID)
3906 {
3907 u8TaskID = E_HAL_VPU_MAIN_STREAM_BASE;
3908 }
3909 #endif
3910
3911 // HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
3912 //HVD_EX_MSG_DBG("DP shmAddr=%X u8TaskID = %X u8CmdType = %X u32Msg = %X\n", pShm, u8TaskID, u8CmdType, u32Msg);
3913
3914 if (CHECK_NULL_PTR(cmd_q))
3915 {
3916 VPU_MSG_ERR("Invalid parameter with share memory address=0x%x %s:%d \n", (unsigned int)cmd_q, __FUNCTION__, __LINE__);
3917 return bResult;
3918 }
3919
3920 MS_U32 u32DISPCMDQWdPtr;
3921
3922 if (CHECK_NULL_PTR(cmd_q->u32HVD_DISPCMDQ_DRAM_ST_ADDR))
3923 {
3924 return E_HVD_COMMAND_QUEUE_NOT_INITIALED;
3925 }
3926
3927 if (HAL_VPU_EX_DRAMDispCMDQueueIsFull(cmd_q))
3928 {
3929 return E_HVD_COMMAND_QUEUE_FULL;
3930 }
3931 else
3932 {
3933 u32DISPCMDQWdPtr = MsOS_PA2KSEG1(pVPUHalContext->u32FWCodeAddr + cmd_q->u32HVD_DISPCMDQ_DRAM_ST_ADDR + cmd_q->u32HVD_STREAM_DISPCMDQ_WD);
3934 }
3935
3936 // HVD_EX_MSG_DBG("VDispCmdQ_BASE_ADDR=%X PDispCmsQ_BASE_ADDR=%X u32DISPCMDQWdPtr=%X DISPCMDQ_TOTAL_SIZE = %X\n", cmd_q->u32HVD_DISPCMDQ_DRAM_ST_ADDR, pVPUHalContext->u32FWCodeVAddr + cmd_q->u32HVD_DISPCMDQ_DRAM_ST_ADDR, u32DISPCMDQWdPtr,HVD_DISPCMDQ_DRAM_ST_SIZE);
3937
3938 switch (u8CmdType)
3939 {
3940 case E_HVD_CMDQ_CMD:
3941 {
3942 u32Msg |= (u8TaskID << 24);
3943 MS_BOOL res = HAL_VPU_EX_DRAMCMDQueueSend(u32DISPCMDQWdPtr, u32Msg);
3944
3945 MsOS_FlushMemory();
3946
3947 if (res)
3948 {
3949 cmd_q->u32HVD_STREAM_DISPCMDQ_WD += (HVD_DRAM_CMDQ_CMD_SIZE + HVD_DRAM_CMDQ_ARG_SIZE);
3950
3951 if (cmd_q->u32HVD_STREAM_DISPCMDQ_WD == HVD_DISPCMDQ_DRAM_ST_SIZE)
3952 cmd_q->u32HVD_STREAM_DISPCMDQ_WD = 0;
3953
3954 bResult = E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL;
3955 }
3956 break;
3957 }
3958 case E_HVD_CMDQ_ARG:
3959 {
3960 MS_BOOL res = HAL_VPU_EX_DRAMCMDQueueSend(u32DISPCMDQWdPtr + HVD_DRAM_CMDQ_CMD_SIZE, u32Msg);
3961 if (res)
3962 bResult = E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL;
3963 break;
3964 }
3965 default:
3966 {
3967 bResult = E_HVD_COMMAND_QUEUE_SEND_FAIL;
3968 break;
3969 }
3970 }
3971
3972 MsOS_FlushMemory();
3973
3974 return bResult;
3975 }
3976
HAL_VPU_EX_SetBitstreamBufAddress(MS_U32 u32BsAddr)3977 MS_BOOL HAL_VPU_EX_SetBitstreamBufAddress(MS_U32 u32BsAddr)
3978 {
3979 pVPUHalContext->u32BitstreamAddress = u32BsAddr;
3980 return TRUE;
3981 }
3982 #endif
3983
3984 #if !defined(MSOS_TYPE_NUTTX)
_VPU_EX_GetFrameBufferDefaultSize(VPU_EX_CodecType eCodecType)3985 MS_SIZE _VPU_EX_GetFrameBufferDefaultSize(VPU_EX_CodecType eCodecType)
3986 {
3987 MS_SIZE FrameBufferSize = 0;
3988
3989 switch(eCodecType)
3990 {
3991 case E_VPU_EX_CODEC_TYPE_MPEG2:
3992 case E_VPU_EX_CODEC_TYPE_H263:
3993 case E_VPU_EX_CODEC_TYPE_MPEG4:
3994 case E_VPU_EX_CODEC_TYPE_DIVX311:
3995 case E_VPU_EX_CODEC_TYPE_DIVX412:
3996 case E_VPU_EX_CODEC_TYPE_FLV:
3997 FrameBufferSize = 0x1E00000;
3998 break;
3999 case E_VPU_EX_CODEC_TYPE_VC1_ADV:
4000 case E_VPU_EX_CODEC_TYPE_VC1_MAIN:
4001 FrameBufferSize = 0x6C00000;
4002 break;
4003 case E_VPU_EX_CODEC_TYPE_RV8:
4004 case E_VPU_EX_CODEC_TYPE_RV9:
4005 FrameBufferSize = 0x1B00000;
4006 break;
4007 case E_VPU_EX_CODEC_TYPE_VP8:
4008 FrameBufferSize = 0x1500000;
4009 break;
4010 case E_VPU_EX_CODEC_TYPE_H264:
4011 FrameBufferSize = 0x8200000;
4012 //FrameBufferSize = 0x7A00000; //UHD 122MB ,5 ref frame
4013 //FrameBufferSize = 0x7A80000; //UHD 4K2K 16:19 126.5MB
4014 //FrameBufferSize = 0x8E00000; //UHD 4K2K 16:19 142MB
4015 break;
4016 case E_VPU_EX_CODEC_TYPE_AVS:
4017 FrameBufferSize = 0x1B00000;
4018 break;
4019 case E_VPU_EX_CODEC_TYPE_MJPEG:
4020 FrameBufferSize = 0x2800000;
4021 break;
4022 case E_VPU_EX_CODEC_TYPE_MVC:
4023 FrameBufferSize = 0x4200000;
4024 break;
4025 case E_VPU_EX_CODEC_TYPE_HEVC:
4026 #if SUPPORT_MSVP9
4027 case E_VPU_EX_CODEC_TYPE_VP9:
4028 #endif
4029 FrameBufferSize = 0xA000000;
4030 break;
4031 #if !SUPPORT_MSVP9
4032 case E_VPU_EX_CODEC_TYPE_VP9:
4033 FrameBufferSize = 0x7800000;
4034 break;
4035 #endif
4036 default:
4037 FrameBufferSize = 0;
4038 break;
4039 }
4040
4041 return FrameBufferSize;
4042 }
4043
HAL_VPU_EX_GetFrameBufferDefaultSize(VPU_EX_CodecType eCodecType)4044 MS_SIZE HAL_VPU_EX_GetFrameBufferDefaultSize(VPU_EX_CodecType eCodecType)
4045 {
4046 return _VPU_EX_GetFrameBufferDefaultSize(eCodecType);
4047 }
4048 #endif
4049
4050 #ifdef CMA_DRV_DIRECT_INIT
4051 // To-do: Taking the source type into consideration
HAL_VPU_EX_GetCMAMemSize(VPU_EX_CodecType eCodecType,VPU_EX_SrcMode eSrcMode,MS_U64 * offset,MS_SIZE * length,MS_U64 total_length,MS_SIZE unUseSize)4052 MS_BOOL HAL_VPU_EX_GetCMAMemSize(VPU_EX_CodecType eCodecType, VPU_EX_SrcMode eSrcMode,
4053 MS_U64 *offset, MS_SIZE *length, MS_U64 total_length, MS_SIZE unUseSize)
4054 {
4055 MS_SIZE FrameBufferSize = 0;
4056
4057 if (!offset || !length)
4058 return FALSE;
4059
4060 total_length -= unUseSize;
4061 VPRINTF("[HAL][%s]:[%d] total_length:%llu, cType:%d, sType:%d\n", __FUNCTION__, __LINE__,
4062 (unsigned long long)total_length, (int)eCodecType, (int)eSrcMode);
4063
4064 FrameBufferSize = _VPU_EX_GetFrameBufferDefaultSize(eCodecType);
4065
4066 if(FrameBufferSize == 0)
4067 {
4068 return FALSE;
4069 }
4070 VPRINTF("[HAL][%s]:[%d] FrameSize:%llu, offset:%llu, length:%llu ", __FUNCTION__, __LINE__,
4071 (unsigned long long)FrameBufferSize, (unsigned long long)*offset, (unsigned long long)*length);
4072 if (total_length < FrameBufferSize)
4073 {
4074 *offset = unUseSize;
4075 *length = total_length;
4076 }
4077 else // todo, dual decode case
4078 {
4079 *offset = unUseSize;
4080 *length = FrameBufferSize;
4081 }
4082 return TRUE;
4083 }
4084 #endif
4085
4086
4087 #else
4088 #include "halVPU_EX.h"
4089 #include "drvMMIO.h"
4090 #include "../hvd_ex/regHVD_EX.h"
4091 #include "halCHIP.h"
4092
4093 extern int lib_lowprintf(const char *fmt, ...);
4094 #define PRINTF lib_lowprintf
4095 #define HVD_LWORD(x) (MS_U16)((x)&0xffff)
4096 #define HVD_HWORD(x) (MS_U16)(((x)>>16)&0xffff)
4097
4098 MS_U8 u8FW_Binary[] = {
4099 #include "fwVPU.dat"
4100 };
4101
4102 MS_U32 u32HVDRegOSBase;
4103
HAL_VPU_EX_LoadCodeInSecure(MS_U32 addr)4104 MS_BOOL HAL_VPU_EX_LoadCodeInSecure(MS_U32 addr)
4105 {
4106 //PRINTF("do load code,u32DestAddr %x\n",addr);
4107 memcpy((void*)addr, (void*)u8FW_Binary, sizeof(u8FW_Binary));
4108 MAsm_CPU_Sync();
4109 MsOS_FlushMemory();
4110
4111 if (FALSE == (*((MS_U8*)(addr+6))=='R' && *((MS_U8*)(addr+7))=='2'))
4112 {
4113 PRINTF("FW is not R2 version! _%x_ _%x_\n", *(MS_U8*)(addr+6), *(MS_U8*)(addr+7));
4114 return FALSE;
4115 }
4116 return TRUE;
4117 }
4118
HAL_VPU_EX_SetLockDownRegister(void * param)4119 MS_BOOL HAL_VPU_EX_SetLockDownRegister(void* param)
4120 {
4121 #if 1
4122 MS_U32 u32StAddr_main;
4123 MS_U32 u32StAddr_sub;
4124 MS_U32 u32NonPMBankSize = 0;
4125 VPU_EX_LOCK_DOWN_REGISTER* register_lockdown;
4126
4127 if(param == NULL)
4128 {
4129 return FALSE;
4130 }
4131
4132 register_lockdown = (VPU_EX_LOCK_DOWN_REGISTER*)param;
4133
4134 MDrv_MMIO_GetBASE(&u32HVDRegOSBase, &u32NonPMBankSize, MS_MODULE_HW);
4135
4136 // ES buffer
4137 u32StAddr_main = register_lockdown->Bitstream_Addr_Main;
4138 u32StAddr_sub = register_lockdown->Bitstream_Addr_Sub;
4139
4140 if (u32StAddr_main >= register_lockdown->MIU1_BaseAddr)
4141 {
4142 u32StAddr_main -= register_lockdown->MIU1_BaseAddr;
4143 }
4144
4145 if (u32StAddr_sub >= register_lockdown->MIU1_BaseAddr)
4146 {
4147 u32StAddr_sub -= register_lockdown->MIU1_BaseAddr;
4148 }
4149
4150 //Lock down register
4151 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L(REG_HVD_BASE), HVD_LWORD(u32StAddr_main >> 3));
4152 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H(REG_HVD_BASE), HVD_HWORD(u32StAddr_main >> 3));
4153
4154 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L_BS2, HVD_LWORD(u32StAddr_sub >> 3));
4155 _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H_BS2, HVD_HWORD(u32StAddr_sub >> 3));
4156 //~
4157
4158 // Lock Down
4159 //_HVD_Write2Byte(HVD_REG_HI_DUMMY_0, (_HVD_Read2Byte(HVD_REG_HI_DUMMY_0) | (HVD_REG_LOCK_REG_ESB_ST_ADR_L_H|HVD_REG_LOCK_REG_ESB_ST_ADR_L_H_BS2)));
4160 //~
4161 #endif
4162 return TRUE;
4163 }
4164
4165
4166 #endif
4167
4168