xref: /utopia/UTPA2-700.0.x/modules/vdec_v3/hal/maldives/vpu_v3/halVPU_EX.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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