xref: /utopia/UTPA2-700.0.x/modules/vdec_v2/hal/maxim/vpu_ex/halVPU_EX.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi 
96*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
97*53ee8cc1Swenshuai.xi //  Include Files
98*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
99*53ee8cc1Swenshuai.xi // Common Definition
100*53ee8cc1Swenshuai.xi #include <string.h>
101*53ee8cc1Swenshuai.xi 
102*53ee8cc1Swenshuai.xi #if defined(REDLION_LINUX_KERNEL_ENVI)
103*53ee8cc1Swenshuai.xi #include "drvHVD_Common.h"
104*53ee8cc1Swenshuai.xi #else
105*53ee8cc1Swenshuai.xi #include "MsCommon.h"
106*53ee8cc1Swenshuai.xi #endif
107*53ee8cc1Swenshuai.xi 
108*53ee8cc1Swenshuai.xi #include "MsOS.h"
109*53ee8cc1Swenshuai.xi #include "asmCPU.h"
110*53ee8cc1Swenshuai.xi 
111*53ee8cc1Swenshuai.xi 
112*53ee8cc1Swenshuai.xi #if !defined(MSOS_TYPE_NUTTX) || defined(SUPPORT_X_MODEL_FEATURE)
113*53ee8cc1Swenshuai.xi 
114*53ee8cc1Swenshuai.xi // Internal Definition
115*53ee8cc1Swenshuai.xi #include "regVPU_EX.h"
116*53ee8cc1Swenshuai.xi #include "halVPU_EX.h"
117*53ee8cc1Swenshuai.xi #include "halCHIP.h"
118*53ee8cc1Swenshuai.xi #include "../../../drv/hvd_ex/drvHVD_def.h"
119*53ee8cc1Swenshuai.xi #include "controller.h"
120*53ee8cc1Swenshuai.xi 
121*53ee8cc1Swenshuai.xi #include "../hvd_ex/fwHVD_if.h"
122*53ee8cc1Swenshuai.xi #include "../mvd_ex/mvd4_interface.h"
123*53ee8cc1Swenshuai.xi #if (ENABLE_DECOMPRESS_FUNCTION == TRUE)
124*53ee8cc1Swenshuai.xi #include "ms_decompress.h"
125*53ee8cc1Swenshuai.xi #include "ms_decompress_priv.h"
126*53ee8cc1Swenshuai.xi #endif
127*53ee8cc1Swenshuai.xi #include "../../drv/mbx/apiMBX_St.h"
128*53ee8cc1Swenshuai.xi #include "../../drv/mbx/apiMBX.h"
129*53ee8cc1Swenshuai.xi 
130*53ee8cc1Swenshuai.xi #if VPU_ENABLE_BDMA_FW_FLASH_2_SDRAM
131*53ee8cc1Swenshuai.xi #include "drvSERFLASH.h"
132*53ee8cc1Swenshuai.xi #define HVD_FLASHcpy(DESTADDR, SRCADDR, LEN, Flag)  MDrv_SERFLASH_CopyHnd((MS_PHYADDR)(SRCADDR), (MS_PHYADDR)(DESTADDR), (LEN), (Flag), SPIDMA_OPCFG_DEF)
133*53ee8cc1Swenshuai.xi #endif
134*53ee8cc1Swenshuai.xi 
135*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
136*53ee8cc1Swenshuai.xi //  Driver Compiler Options
137*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
138*53ee8cc1Swenshuai.xi 
139*53ee8cc1Swenshuai.xi 
140*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
141*53ee8cc1Swenshuai.xi //  Local Defines
142*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
143*53ee8cc1Swenshuai.xi #define ENABLE_TEE 0
144*53ee8cc1Swenshuai.xi #define VPU_CTL_INTERFACE_VER   0x00000001  //the interface version of VPU driver
145*53ee8cc1Swenshuai.xi 
146*53ee8cc1Swenshuai.xi #define VPU_MIU1BASE_ADDR    0x40000000   //Notice: this define must be comfirm with designer
147*53ee8cc1Swenshuai.xi #define MAX_SUPPORT_DECODER_NUM 2
148*53ee8cc1Swenshuai.xi typedef enum
149*53ee8cc1Swenshuai.xi {
150*53ee8cc1Swenshuai.xi     E_VDEC_EX_REE_TO_TEE_MBX_MSG_NULL,
151*53ee8cc1Swenshuai.xi     E_VDEC_EX_REE_TO_TEE_MBX_MSG_FW_LoadCode,
152*53ee8cc1Swenshuai.xi     E_VDEC_EX_REE_TO_TEE_MBX_MSG_GETSHMBASEADDR,
153*53ee8cc1Swenshuai.xi } VDEC_REE_TO_TEE_MBX_MSG_TYPE;
154*53ee8cc1Swenshuai.xi 
155*53ee8cc1Swenshuai.xi 
156*53ee8cc1Swenshuai.xi typedef enum
157*53ee8cc1Swenshuai.xi {
158*53ee8cc1Swenshuai.xi     E_VDEC_EX_TEE_TO_REE_MBX_MSG_NULL,
159*53ee8cc1Swenshuai.xi     E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_INVALID,
160*53ee8cc1Swenshuai.xi     E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_NO_TEE,
161*53ee8cc1Swenshuai.xi     E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS,
162*53ee8cc1Swenshuai.xi     E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL
163*53ee8cc1Swenshuai.xi } VDEC_TEE_TO_REE_MBX_ACK_TYPE;
164*53ee8cc1Swenshuai.xi 
165*53ee8cc1Swenshuai.xi typedef enum
166*53ee8cc1Swenshuai.xi {
167*53ee8cc1Swenshuai.xi     E_VPU_UART_CTRL_DISABLE = BIT(4),
168*53ee8cc1Swenshuai.xi     E_VPU_UART_CTRL_ERR     = BIT(0),
169*53ee8cc1Swenshuai.xi     E_VPU_UART_CTRL_INFO    = BIT(1),
170*53ee8cc1Swenshuai.xi     E_VPU_UART_CTRL_DBG     = BIT(2),
171*53ee8cc1Swenshuai.xi     E_VPU_UART_CTRL_FW      = BIT(3),
172*53ee8cc1Swenshuai.xi     E_VPU_UART_CTRL_MUST    = BIT(4),
173*53ee8cc1Swenshuai.xi     E_VPU_UART_CTRL_TRACE   = BIT(5),
174*53ee8cc1Swenshuai.xi } VPU_EX_UartCtrl;
175*53ee8cc1Swenshuai.xi 
176*53ee8cc1Swenshuai.xi typedef struct
177*53ee8cc1Swenshuai.xi {
178*53ee8cc1Swenshuai.xi     HAL_VPU_StreamId eStreamId;
179*53ee8cc1Swenshuai.xi     VPU_EX_DecoderType eDecodertype;
180*53ee8cc1Swenshuai.xi } VPU_EX_Stream;
181*53ee8cc1Swenshuai.xi 
182*53ee8cc1Swenshuai.xi 
183*53ee8cc1Swenshuai.xi #define VPU_MSG_ERR(format, args...)                \
184*53ee8cc1Swenshuai.xi     do                                              \
185*53ee8cc1Swenshuai.xi     {                                               \
186*53ee8cc1Swenshuai.xi         if (u32VpuUartCtrl & E_VPU_UART_CTRL_ERR)  \
187*53ee8cc1Swenshuai.xi         {                                           \
188*53ee8cc1Swenshuai.xi             printf("[VPU][ERR]%s:", __FUNCTION__);  \
189*53ee8cc1Swenshuai.xi             printf(format, ##args);                 \
190*53ee8cc1Swenshuai.xi         }                                           \
191*53ee8cc1Swenshuai.xi     } while (0)
192*53ee8cc1Swenshuai.xi 
193*53ee8cc1Swenshuai.xi #define VPU_MSG_DBG(format, args...)                \
194*53ee8cc1Swenshuai.xi     do                                              \
195*53ee8cc1Swenshuai.xi     {                                               \
196*53ee8cc1Swenshuai.xi         if (u32VpuUartCtrl & E_VPU_UART_CTRL_DBG)  \
197*53ee8cc1Swenshuai.xi         {                                           \
198*53ee8cc1Swenshuai.xi             printf("[VPU][DBG]%s:", __FUNCTION__);  \
199*53ee8cc1Swenshuai.xi             printf(format, ##args);                 \
200*53ee8cc1Swenshuai.xi         }                                           \
201*53ee8cc1Swenshuai.xi     } while (0)
202*53ee8cc1Swenshuai.xi 
203*53ee8cc1Swenshuai.xi #define VPU_MSG_INFO(format, args...)               \
204*53ee8cc1Swenshuai.xi     do                                              \
205*53ee8cc1Swenshuai.xi     {                                               \
206*53ee8cc1Swenshuai.xi         if (u32VpuUartCtrl & E_VPU_UART_CTRL_INFO) \
207*53ee8cc1Swenshuai.xi         {                                           \
208*53ee8cc1Swenshuai.xi             printf("[VPU][INF]%s:", __FUNCTION__);  \
209*53ee8cc1Swenshuai.xi             printf(format, ##args);                 \
210*53ee8cc1Swenshuai.xi         }                                           \
211*53ee8cc1Swenshuai.xi     } while (0)
212*53ee8cc1Swenshuai.xi 
213*53ee8cc1Swenshuai.xi //------------------------------ MIU SETTINGS ----------------------------------
214*53ee8cc1Swenshuai.xi #define _MaskMiuReq_VPU_D_RW(m)     _VPU_WriteRegBit(MIU0_REG_RQ0_MASK, m, BIT(6))
215*53ee8cc1Swenshuai.xi #define _MaskMiuReq_VPU_Q_RW(m)     _VPU_WriteRegBit(MIU0_REG_RQ0_MASK, m, BIT(6))
216*53ee8cc1Swenshuai.xi #define _MaskMiuReq_VPU_I_R(m)      _VPU_WriteRegBit(MIU0_REG_RQ0_MASK+1, m, BIT(0))
217*53ee8cc1Swenshuai.xi 
218*53ee8cc1Swenshuai.xi #define _MaskMiu1Req_VPU_D_RW(m)    _VPU_WriteRegBit(MIU1_REG_RQ0_MASK, m, BIT(6))
219*53ee8cc1Swenshuai.xi #define _MaskMiu1Req_VPU_Q_RW(m)    _VPU_WriteRegBit(MIU1_REG_RQ0_MASK, m, BIT(6))
220*53ee8cc1Swenshuai.xi #define _MaskMiu1Req_VPU_I_R(m)     _VPU_WriteRegBit(MIU1_REG_RQ0_MASK+1, m, BIT(0))
221*53ee8cc1Swenshuai.xi 
222*53ee8cc1Swenshuai.xi #define VPU_D_RW_ON_MIU1            ((_VPU_ReadByte(MIU0_REG_SEL0) & BIT(6)) == BIT(6))
223*53ee8cc1Swenshuai.xi #define VPU_Q_RW_ON_MIU1            ((_VPU_ReadByte(MIU0_REG_SEL0) & BIT(6)) == BIT(6))
224*53ee8cc1Swenshuai.xi #define VPU_I_R_ON_MIU1             ((_VPU_ReadByte(MIU0_REG_SEL0+1) & BIT(0)) == BIT(0)) //g08
225*53ee8cc1Swenshuai.xi 
226*53ee8cc1Swenshuai.xi #define _VPU_MIU_SetReqMask(miu_clients, mask)  \
227*53ee8cc1Swenshuai.xi    do {                                         \
228*53ee8cc1Swenshuai.xi        if (miu_clients##_ON_MIU1 == 0)          \
229*53ee8cc1Swenshuai.xi            _MaskMiuReq_##miu_clients(mask);     \
230*53ee8cc1Swenshuai.xi        else                                     \
231*53ee8cc1Swenshuai.xi            _MaskMiu1Req_##miu_clients(mask);    \
232*53ee8cc1Swenshuai.xi    } while(0)
233*53ee8cc1Swenshuai.xi 
234*53ee8cc1Swenshuai.xi #if ENABLE_VPU_MUTEX_PROTECTION
235*53ee8cc1Swenshuai.xi static MS_S32 s32VPUMutexID = -1;
236*53ee8cc1Swenshuai.xi MS_U8 _u8VPU_Mutex[] = { "VPU_Mutex" };
237*53ee8cc1Swenshuai.xi 
238*53ee8cc1Swenshuai.xi #define _HAL_VPU_MutexCreate()  \
239*53ee8cc1Swenshuai.xi     if (s32VPUMutexID < 0)      \
240*53ee8cc1Swenshuai.xi     {                           \
241*53ee8cc1Swenshuai.xi         s32VPUMutexID = MsOS_CreateMutex(E_MSOS_FIFO,(char*)_u8VPU_Mutex, MSOS_PROCESS_SHARED); \
242*53ee8cc1Swenshuai.xi     }
243*53ee8cc1Swenshuai.xi 
244*53ee8cc1Swenshuai.xi #define _HAL_VPU_MutexDelete()              \
245*53ee8cc1Swenshuai.xi     if (s32VPUMutexID >= 0)                 \
246*53ee8cc1Swenshuai.xi     {                                       \
247*53ee8cc1Swenshuai.xi         MsOS_DeleteMutex(s32VPUMutexID);    \
248*53ee8cc1Swenshuai.xi         s32VPUMutexID = -1;                 \
249*53ee8cc1Swenshuai.xi     }
250*53ee8cc1Swenshuai.xi 
251*53ee8cc1Swenshuai.xi #define _HAL_VPU_Entry()                                                \
252*53ee8cc1Swenshuai.xi     if (s32VPUMutexID >= 0)                                             \
253*53ee8cc1Swenshuai.xi     {                                                                   \
254*53ee8cc1Swenshuai.xi         if (!MsOS_ObtainMutex(s32VPUMutexID, VPU_DEFAULT_MUTEX_TIMEOUT))       \
255*53ee8cc1Swenshuai.xi         {                                                               \
256*53ee8cc1Swenshuai.xi             printf("[HAL VPU][%06d] Mutex taking timeout\n", __LINE__); \
257*53ee8cc1Swenshuai.xi         }                                                               \
258*53ee8cc1Swenshuai.xi     }
259*53ee8cc1Swenshuai.xi 
260*53ee8cc1Swenshuai.xi #define _HAL_VPU_Return(_ret)                   \
261*53ee8cc1Swenshuai.xi     {                                           \
262*53ee8cc1Swenshuai.xi         if (s32VPUMutexID >= 0)                 \
263*53ee8cc1Swenshuai.xi         {                                       \
264*53ee8cc1Swenshuai.xi             MsOS_ReleaseMutex(s32VPUMutexID);   \
265*53ee8cc1Swenshuai.xi         }                                       \
266*53ee8cc1Swenshuai.xi         return _ret;                            \
267*53ee8cc1Swenshuai.xi     }
268*53ee8cc1Swenshuai.xi 
269*53ee8cc1Swenshuai.xi #define _HAL_VPU_Release()                      \
270*53ee8cc1Swenshuai.xi     {                                           \
271*53ee8cc1Swenshuai.xi         if (s32VPUMutexID >= 0)                 \
272*53ee8cc1Swenshuai.xi         {                                       \
273*53ee8cc1Swenshuai.xi             MsOS_ReleaseMutex(s32VPUMutexID);   \
274*53ee8cc1Swenshuai.xi         }                                       \
275*53ee8cc1Swenshuai.xi     }
276*53ee8cc1Swenshuai.xi #else
277*53ee8cc1Swenshuai.xi #define _HAL_VPU_MutexCreate()
278*53ee8cc1Swenshuai.xi #define _HAL_VPU_MutexDelete()
279*53ee8cc1Swenshuai.xi #define _HAL_VPU_Entry()
280*53ee8cc1Swenshuai.xi #define _HAL_VPU_Return(_ret)       {return _ret;}
281*53ee8cc1Swenshuai.xi #define _HAL_VPU_Release()
282*53ee8cc1Swenshuai.xi #endif
283*53ee8cc1Swenshuai.xi 
284*53ee8cc1Swenshuai.xi #define VPU_FW_MEM_OFFSET   0x100000UL  // 1M
285*53ee8cc1Swenshuai.xi #define VPU_CMD_TIMEOUT     1000 // 1 sec
286*53ee8cc1Swenshuai.xi 
287*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
288*53ee8cc1Swenshuai.xi //  Local Structures
289*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
290*53ee8cc1Swenshuai.xi typedef struct _VPU_HWInitFunc
291*53ee8cc1Swenshuai.xi {
292*53ee8cc1Swenshuai.xi     MS_BOOL (*pfMVDHW_Init)(void);
293*53ee8cc1Swenshuai.xi     MS_BOOL (*pfMVDHW_Deinit)(void);
294*53ee8cc1Swenshuai.xi     MS_BOOL (*pfHVDHW_Init)(MS_U32 u32Arg);
295*53ee8cc1Swenshuai.xi     MS_BOOL (*pfHVDHW_Deinit)(void);
296*53ee8cc1Swenshuai.xi } VPU_HWInitFunc;
297*53ee8cc1Swenshuai.xi 
298*53ee8cc1Swenshuai.xi typedef struct
299*53ee8cc1Swenshuai.xi {
300*53ee8cc1Swenshuai.xi     MS_U32  u32ApiHW_Version;   //<Version of current structure>
301*53ee8cc1Swenshuai.xi     MS_U16  u16ApiHW_Length;    //<Length of this structure>
302*53ee8cc1Swenshuai.xi 
303*53ee8cc1Swenshuai.xi     MS_U8   u8Cap_Support_Decoder_Num;
304*53ee8cc1Swenshuai.xi 
305*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_MPEG2;
306*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_H263;
307*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_MPEG4;
308*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_DIVX311;
309*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_DIVX412;
310*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_FLV;
311*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_VC1ADV;
312*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_VC1MAIN;
313*53ee8cc1Swenshuai.xi 
314*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_RV8;
315*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_RV9;
316*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_H264;
317*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_AVS;
318*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_AVS_PLUS;
319*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_MJPEG;
320*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_MVC;
321*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_VP8;
322*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_VP9;
323*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_HEVC;
324*53ee8cc1Swenshuai.xi 
325*53ee8cc1Swenshuai.xi     /*New HW Cap and Feature add in struct at the end*/
326*53ee8cc1Swenshuai.xi }VDEC_HwCap;
327*53ee8cc1Swenshuai.xi 
328*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
329*53ee8cc1Swenshuai.xi //  Local Functions Prototype
330*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
331*53ee8cc1Swenshuai.xi static MS_BOOL          _VPU_EX_LoadVLCTable(VPU_EX_VLCTblCfg *pVlcCfg, MS_U8 u8FwSrcType);
332*53ee8cc1Swenshuai.xi static MS_U8            _VPU_EX_GetOffsetIdx(MS_U32 u32Id);
333*53ee8cc1Swenshuai.xi static HVD_User_Cmd     _VPU_EX_MapCtrlCmd(VPU_EX_TaskInfo *pTaskInfo);
334*53ee8cc1Swenshuai.xi 
335*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
336*53ee8cc1Swenshuai.xi //  Global Variables
337*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
338*53ee8cc1Swenshuai.xi extern HVD_Return HAL_HVD_EX_SetCmd(MS_U32 u32Id, HVD_User_Cmd eUsrCmd, MS_U32 u32CmdArg);
339*53ee8cc1Swenshuai.xi extern MS_BOOL HAL_MVD_InitHW(void);
340*53ee8cc1Swenshuai.xi extern MS_BOOL HAL_MVD_DeinitHW(void);
341*53ee8cc1Swenshuai.xi extern MS_BOOL HAL_HVD_EX_InitHW(MS_U32 u32Id,VPU_EX_DecoderType DecoderType);
342*53ee8cc1Swenshuai.xi extern MS_BOOL HAL_HVD_EX_DeinitHW(void);
343*53ee8cc1Swenshuai.xi extern void    HAL_HVD_EX_SetBufferAddr(MS_U32 u32Id);
344*53ee8cc1Swenshuai.xi #if defined (__aeon__)
345*53ee8cc1Swenshuai.xi static MS_U32 u32VPURegOSBase = 0xA0000000;
346*53ee8cc1Swenshuai.xi #else
347*53ee8cc1Swenshuai.xi static MS_U32 u32VPURegOSBase = 0xBF200000;
348*53ee8cc1Swenshuai.xi #endif
349*53ee8cc1Swenshuai.xi 
350*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
351*53ee8cc1Swenshuai.xi //  Local Variables
352*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
353*53ee8cc1Swenshuai.xi #if 0
354*53ee8cc1Swenshuai.xi 
355*53ee8cc1Swenshuai.xi static MS_BOOL _bVPUPowered = FALSE;
356*53ee8cc1Swenshuai.xi static MS_BOOL _bVPURsted = FALSE;
357*53ee8cc1Swenshuai.xi static MS_BOOL _bVPUSingleMode = FALSE;
358*53ee8cc1Swenshuai.xi static VPU_EX_DecModCfg _stVPUDecMode;
359*53ee8cc1Swenshuai.xi 
360*53ee8cc1Swenshuai.xi static MS_U8 u8TaskCnt = 0;
361*53ee8cc1Swenshuai.xi 
362*53ee8cc1Swenshuai.xi static MS_U32 u32VpuUartCtrl = (E_VPU_UART_CTRL_ERR | E_VPU_UART_CTRL_MUST);
363*53ee8cc1Swenshuai.xi 
364*53ee8cc1Swenshuai.xi //Notice: this function must be consistent with _VPU_EX_GetOffsetIdx()
365*53ee8cc1Swenshuai.xi static VPU_EX_Stream _stVPUStream[] =
366*53ee8cc1Swenshuai.xi {
367*53ee8cc1Swenshuai.xi     {E_HAL_VPU_MAIN_STREAM0, E_VPU_EX_DECODER_NONE},
368*53ee8cc1Swenshuai.xi     {E_HAL_VPU_SUB_STREAM0, E_VPU_EX_DECODER_NONE},
369*53ee8cc1Swenshuai.xi };
370*53ee8cc1Swenshuai.xi static VPU_HWInitFunc stHWInitFunc =
371*53ee8cc1Swenshuai.xi {
372*53ee8cc1Swenshuai.xi     &HAL_MVD_InitHW,
373*53ee8cc1Swenshuai.xi     &HAL_MVD_DeinitHW,
374*53ee8cc1Swenshuai.xi     &HAL_HVD_EX_InitHW,
375*53ee8cc1Swenshuai.xi     &HAL_HVD_EX_DeinitHW,
376*53ee8cc1Swenshuai.xi };
377*53ee8cc1Swenshuai.xi 
378*53ee8cc1Swenshuai.xi #endif
379*53ee8cc1Swenshuai.xi 
380*53ee8cc1Swenshuai.xi #if VPU_ENABLE_EMBEDDED_FW_BINARY
381*53ee8cc1Swenshuai.xi static const MS_U8 u8HVD_FW_Binary[] = {
382*53ee8cc1Swenshuai.xi     #include "fwVPU.dat"
383*53ee8cc1Swenshuai.xi };
384*53ee8cc1Swenshuai.xi 
385*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
386*53ee8cc1Swenshuai.xi static const MS_U8 u8HVD_VLC_Binary[] = {
387*53ee8cc1Swenshuai.xi     #include "fwVPU_VLC.dat"
388*53ee8cc1Swenshuai.xi };
389*53ee8cc1Swenshuai.xi #endif
390*53ee8cc1Swenshuai.xi #endif
391*53ee8cc1Swenshuai.xi 
392*53ee8cc1Swenshuai.xi typedef struct
393*53ee8cc1Swenshuai.xi {
394*53ee8cc1Swenshuai.xi     MS_BOOL _bVPUPowered;
395*53ee8cc1Swenshuai.xi     MS_BOOL _bVPURsted;
396*53ee8cc1Swenshuai.xi     MS_BOOL _bVPUSingleMode;
397*53ee8cc1Swenshuai.xi     VPU_EX_DecModCfg _stVPUDecMode;
398*53ee8cc1Swenshuai.xi     MS_U8 u8TaskCnt;
399*53ee8cc1Swenshuai.xi     //Notice: this function must be consistent with _VPU_EX_GetOffsetIdx()
400*53ee8cc1Swenshuai.xi     VPU_EX_Stream _stVPUStream[2];
401*53ee8cc1Swenshuai.xi 
402*53ee8cc1Swenshuai.xi     VPU_HWInitFunc stHWInitFunc;
403*53ee8cc1Swenshuai.xi 
404*53ee8cc1Swenshuai.xi     MS_BOOL bVpuExReloadFW;
405*53ee8cc1Swenshuai.xi     MS_BOOL bVpuExLoadFWRlt;
406*53ee8cc1Swenshuai.xi     MS_VIRT  u32VPUSHMAddr;    //PA
407*53ee8cc1Swenshuai.xi     MS_BOOL bEnableVPUSecureMode;
408*53ee8cc1Swenshuai.xi 
409*53ee8cc1Swenshuai.xi     MS_VIRT  u32FWShareInfoAddr[4];
410*53ee8cc1Swenshuai.xi } VPU_Hal_CTX;
411*53ee8cc1Swenshuai.xi 
412*53ee8cc1Swenshuai.xi //global variables
413*53ee8cc1Swenshuai.xi VPU_Hal_CTX* pVPUHalContext = NULL;
414*53ee8cc1Swenshuai.xi VPU_Hal_CTX gVPUHalContext;
415*53ee8cc1Swenshuai.xi MS_U32 u32VpuUartCtrl = (E_VPU_UART_CTRL_ERR | E_VPU_UART_CTRL_MUST);
416*53ee8cc1Swenshuai.xi #if ENABLE_TEE
417*53ee8cc1Swenshuai.xi MS_BOOL bVPUMbxInitFlag = 0;
418*53ee8cc1Swenshuai.xi MS_U8 u8VPUMbxMsgClass = 0;
419*53ee8cc1Swenshuai.xi MBX_Msg VPUReeToTeeMbxMsg;
420*53ee8cc1Swenshuai.xi MBX_Msg VPUTeeToReeMbxMsg;
421*53ee8cc1Swenshuai.xi #endif
422*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
423*53ee8cc1Swenshuai.xi //  Debug Functions
424*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
425*53ee8cc1Swenshuai.xi 
426*53ee8cc1Swenshuai.xi 
427*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
428*53ee8cc1Swenshuai.xi //  Local Functions
429*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
430*53ee8cc1Swenshuai.xi 
_VPU_EX_LoadVLCTable(VPU_EX_VLCTblCfg * pVlcCfg,MS_U8 u8FwSrcType)431*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_LoadVLCTable(VPU_EX_VLCTblCfg *pVlcCfg, MS_U8 u8FwSrcType)
432*53ee8cc1Swenshuai.xi {
433*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
434*53ee8cc1Swenshuai.xi     if (E_HVD_FW_INPUT_SOURCE_FLASH == u8FwSrcType)
435*53ee8cc1Swenshuai.xi     {
436*53ee8cc1Swenshuai.xi #if VPU_ENABLE_BDMA_FW_FLASH_2_SDRAM
437*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("Load VLC outF2D: dest:0x%lx source:%lx size:%lx\n",
438*53ee8cc1Swenshuai.xi             pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
439*53ee8cc1Swenshuai.xi 
440*53ee8cc1Swenshuai.xi         if (pVlcCfg->u32BinSize)
441*53ee8cc1Swenshuai.xi         {
442*53ee8cc1Swenshuai.xi             SPIDMA_Dev cpyflag = E_SPIDMA_DEV_MIU1;
443*53ee8cc1Swenshuai.xi 
444*53ee8cc1Swenshuai.xi             if (HAL_MIU1_BASE <= MsOS_VA2PA(pVlcCfg->u32FrameBufAddr))
445*53ee8cc1Swenshuai.xi             {
446*53ee8cc1Swenshuai.xi                 cpyflag = E_SPIDMA_DEV_MIU1;
447*53ee8cc1Swenshuai.xi             }
448*53ee8cc1Swenshuai.xi             else
449*53ee8cc1Swenshuai.xi             {
450*53ee8cc1Swenshuai.xi                 cpyflag = E_SPIDMA_DEV_MIU0;
451*53ee8cc1Swenshuai.xi             }
452*53ee8cc1Swenshuai.xi 
453*53ee8cc1Swenshuai.xi             if (!HVD_FLASHcpy(MsOS_VA2PA(pVlcCfg->u32DstAddr), MsOS_VA2PA(pVlcCfg->u32BinAddr), pVlcCfg->u32BinSize, cpyflag))
454*53ee8cc1Swenshuai.xi             {
455*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("HVD_BDMAcpy VLC table Flash 2 DRAM failed: dest:0x%lx src:0x%lx size:0x%lx flag:%lu\n",
456*53ee8cc1Swenshuai.xi                      pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize, (MS_U32) cpyflag);
457*53ee8cc1Swenshuai.xi 
458*53ee8cc1Swenshuai.xi                 return FALSE;
459*53ee8cc1Swenshuai.xi             }
460*53ee8cc1Swenshuai.xi         }
461*53ee8cc1Swenshuai.xi         else
462*53ee8cc1Swenshuai.xi         {
463*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("During copy VLC from Flash to Dram, the source size of FW is zero\n");
464*53ee8cc1Swenshuai.xi             return FALSE;
465*53ee8cc1Swenshuai.xi         }
466*53ee8cc1Swenshuai.xi #else
467*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("driver not enable to use BDMA copy VLC from flash 2 sdram.\n");
468*53ee8cc1Swenshuai.xi         return FALSE;
469*53ee8cc1Swenshuai.xi #endif
470*53ee8cc1Swenshuai.xi     }
471*53ee8cc1Swenshuai.xi     else
472*53ee8cc1Swenshuai.xi     {
473*53ee8cc1Swenshuai.xi         if (E_HVD_FW_INPUT_SOURCE_DRAM == u8FwSrcType)
474*53ee8cc1Swenshuai.xi         {
475*53ee8cc1Swenshuai.xi             if ((pVlcCfg->u32BinAddr != 0) && (pVlcCfg->u32BinSize != 0))
476*53ee8cc1Swenshuai.xi             {
477*53ee8cc1Swenshuai.xi                 VPU_MSG_INFO("Load VLC outD2D: dest:0x%lx source:%lx size:%lx\n",
478*53ee8cc1Swenshuai.xi                             pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
479*53ee8cc1Swenshuai.xi 
480*53ee8cc1Swenshuai.xi #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
481*53ee8cc1Swenshuai.xi                 BDMA_Result bdmaRlt;
482*53ee8cc1Swenshuai.xi                 MS_U32 u32DstAdd = 0, u32SrcAdd = 0, u32tabsize = 0;
483*53ee8cc1Swenshuai.xi 
484*53ee8cc1Swenshuai.xi                 u32DstAdd   = pVlcCfg->u32FrameBufAddr + pVlcCfg->u32VLCTableOffset;
485*53ee8cc1Swenshuai.xi                 u32SrcAdd   = pVlcCfg->u32BinAddr;
486*53ee8cc1Swenshuai.xi                 u32tabsize  = pVlcCfg->u32BinSize;
487*53ee8cc1Swenshuai.xi                 //bdmaRlt = MDrv_BDMA_MemCopy(u32SrcAdd, u32DstAdd, SLQ_TBL_SIZE);
488*53ee8cc1Swenshuai.xi                 MsOS_FlushMemory();
489*53ee8cc1Swenshuai.xi                 bdmaRlt = HVD_dmacpy(u32DstAdd, u32SrcAdd, u32tabsize);
490*53ee8cc1Swenshuai.xi 
491*53ee8cc1Swenshuai.xi                 if (E_BDMA_OK != bdmaRlt)
492*53ee8cc1Swenshuai.xi                 {
493*53ee8cc1Swenshuai.xi                     VPU_MSG_ERR("MDrv_BDMA_MemCopy fail in %s(), ret=%x!\n", __FUNCTION__, bdmaRlt);
494*53ee8cc1Swenshuai.xi                 }
495*53ee8cc1Swenshuai.xi #else
496*53ee8cc1Swenshuai.xi                 HVD_memcpy(pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
497*53ee8cc1Swenshuai.xi #endif
498*53ee8cc1Swenshuai.xi             }
499*53ee8cc1Swenshuai.xi             else
500*53ee8cc1Swenshuai.xi             {
501*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR
502*53ee8cc1Swenshuai.xi                     ("During copy VLC from out Dram to Dram, the source size or virtual address of VLC is zero\n");
503*53ee8cc1Swenshuai.xi                 return FALSE;
504*53ee8cc1Swenshuai.xi             }
505*53ee8cc1Swenshuai.xi         }
506*53ee8cc1Swenshuai.xi         else
507*53ee8cc1Swenshuai.xi         {
508*53ee8cc1Swenshuai.xi #if VPU_ENABLE_EMBEDDED_FW_BINARY
509*53ee8cc1Swenshuai.xi #ifdef HVD_CACHE_TO_UNCACHE_CONVERT
510*53ee8cc1Swenshuai.xi             MS_U8 *pu8HVD_VLC_Binary;
511*53ee8cc1Swenshuai.xi 
512*53ee8cc1Swenshuai.xi             pu8HVD_VLC_Binary = (MS_U8 *) ((MS_VIRT) u8HVD_VLC_Binary | 0xA0000000UL);
513*53ee8cc1Swenshuai.xi 
514*53ee8cc1Swenshuai.xi             VPU_MSG_DBG("Load VLC inD2D: dest:0x%lx source:%lx size:%lx\n",
515*53ee8cc1Swenshuai.xi                         pVlcCfg->u32FrameBufAddr + pVlcCfg->u32VLCTableOffset, ((MS_VIRT) pu8HVD_VLC_Binary),
516*53ee8cc1Swenshuai.xi                         (MS_U32) sizeof(u8HVD_VLC_Binary));
517*53ee8cc1Swenshuai.xi 
518*53ee8cc1Swenshuai.xi             HVD_memcpy((void *) (pVlcCfg->u32FrameBufAddr + pVlcCfg->u32VLCTableOffset),
519*53ee8cc1Swenshuai.xi                        (void *) ((MS_U32) pu8HVD_VLC_Binary), sizeof(u8HVD_VLC_Binary));
520*53ee8cc1Swenshuai.xi #else
521*53ee8cc1Swenshuai.xi             VPU_MSG_INFO("Load VLC inD2D: dest:0x%lx source:%lx size:%x\n",
522*53ee8cc1Swenshuai.xi                         MsOS_VA2PA(pVlcCfg->u32DstAddr), (MS_VIRT) u8HVD_VLC_Binary,
523*53ee8cc1Swenshuai.xi                         (MS_U32) sizeof(u8HVD_VLC_Binary));
524*53ee8cc1Swenshuai.xi 
525*53ee8cc1Swenshuai.xi             HVD_memcpy(pVlcCfg->u32DstAddr, ((MS_VIRT) u8HVD_VLC_Binary), sizeof(u8HVD_VLC_Binary));
526*53ee8cc1Swenshuai.xi #endif
527*53ee8cc1Swenshuai.xi #else
528*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("driver not enable to use embedded VLC binary.\n");
529*53ee8cc1Swenshuai.xi             return FALSE;
530*53ee8cc1Swenshuai.xi #endif
531*53ee8cc1Swenshuai.xi         }
532*53ee8cc1Swenshuai.xi     }
533*53ee8cc1Swenshuai.xi #endif
534*53ee8cc1Swenshuai.xi 
535*53ee8cc1Swenshuai.xi     return TRUE;
536*53ee8cc1Swenshuai.xi }
537*53ee8cc1Swenshuai.xi 
538*53ee8cc1Swenshuai.xi //Notice: this function must be consistent with _stVPUStream[]
_VPU_EX_GetOffsetIdx(MS_U32 u32Id)539*53ee8cc1Swenshuai.xi static MS_U8 _VPU_EX_GetOffsetIdx(MS_U32 u32Id)
540*53ee8cc1Swenshuai.xi {
541*53ee8cc1Swenshuai.xi     MS_U8 u8OffsetIdx = 0;
542*53ee8cc1Swenshuai.xi     MS_U8 u8VSidBaseMask = 0xF0;
543*53ee8cc1Swenshuai.xi     HAL_VPU_StreamId eVSidBase = (HAL_VPU_StreamId)(u32Id & u8VSidBaseMask);
544*53ee8cc1Swenshuai.xi 
545*53ee8cc1Swenshuai.xi     switch (eVSidBase)
546*53ee8cc1Swenshuai.xi     {
547*53ee8cc1Swenshuai.xi         case E_HAL_VPU_MAIN_STREAM_BASE:
548*53ee8cc1Swenshuai.xi         {
549*53ee8cc1Swenshuai.xi             u8OffsetIdx = 0;
550*53ee8cc1Swenshuai.xi             break;
551*53ee8cc1Swenshuai.xi         }
552*53ee8cc1Swenshuai.xi         case E_HAL_VPU_SUB_STREAM_BASE:
553*53ee8cc1Swenshuai.xi         {
554*53ee8cc1Swenshuai.xi             u8OffsetIdx = 1;
555*53ee8cc1Swenshuai.xi             break;
556*53ee8cc1Swenshuai.xi         }
557*53ee8cc1Swenshuai.xi         case E_HAL_VPU_MVC_STREAM_BASE:
558*53ee8cc1Swenshuai.xi         {
559*53ee8cc1Swenshuai.xi             u8OffsetIdx = 0;
560*53ee8cc1Swenshuai.xi             break;
561*53ee8cc1Swenshuai.xi         }
562*53ee8cc1Swenshuai.xi         default:
563*53ee8cc1Swenshuai.xi         {
564*53ee8cc1Swenshuai.xi             u8OffsetIdx = 0;
565*53ee8cc1Swenshuai.xi             break;
566*53ee8cc1Swenshuai.xi         }
567*53ee8cc1Swenshuai.xi     }
568*53ee8cc1Swenshuai.xi 
569*53ee8cc1Swenshuai.xi     /*
570*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("u32Id=0x%lx, eVSidBase=0x%x, u8OffsetIdx=0x%x\n",
571*53ee8cc1Swenshuai.xi         u32Id, eVSidBase, u8OffsetIdx);
572*53ee8cc1Swenshuai.xi         */
573*53ee8cc1Swenshuai.xi     return u8OffsetIdx;
574*53ee8cc1Swenshuai.xi }
575*53ee8cc1Swenshuai.xi 
_VPU_EX_Context_Init(void)576*53ee8cc1Swenshuai.xi static void _VPU_EX_Context_Init(void)
577*53ee8cc1Swenshuai.xi {
578*53ee8cc1Swenshuai.xi     pVPUHalContext->_stVPUStream[0].eStreamId = E_HAL_VPU_MAIN_STREAM0;
579*53ee8cc1Swenshuai.xi     pVPUHalContext->_stVPUStream[1].eStreamId = E_HAL_VPU_SUB_STREAM0;
580*53ee8cc1Swenshuai.xi     pVPUHalContext->bVpuExReloadFW = TRUE;
581*53ee8cc1Swenshuai.xi 
582*53ee8cc1Swenshuai.xi     pVPUHalContext->u32FWShareInfoAddr[0] = 0xFFFFFFFF;
583*53ee8cc1Swenshuai.xi     pVPUHalContext->u32FWShareInfoAddr[1] = 0xFFFFFFFF;
584*53ee8cc1Swenshuai.xi     pVPUHalContext->u32FWShareInfoAddr[2] = 0xFFFFFFFF;
585*53ee8cc1Swenshuai.xi     pVPUHalContext->u32FWShareInfoAddr[3] = 0xFFFFFFFF;
586*53ee8cc1Swenshuai.xi }
587*53ee8cc1Swenshuai.xi 
588*53ee8cc1Swenshuai.xi 
_VPU_EX_MapCtrlCmd(VPU_EX_TaskInfo * pTaskInfo)589*53ee8cc1Swenshuai.xi static HVD_User_Cmd _VPU_EX_MapCtrlCmd(VPU_EX_TaskInfo *pTaskInfo)
590*53ee8cc1Swenshuai.xi {
591*53ee8cc1Swenshuai.xi     HVD_User_Cmd eCmd = E_HVD_CMD_INVALID_CMD;
592*53ee8cc1Swenshuai.xi     MS_U8 u8OffsetIdx = 0;
593*53ee8cc1Swenshuai.xi 
594*53ee8cc1Swenshuai.xi     if (NULL == pTaskInfo)
595*53ee8cc1Swenshuai.xi     {
596*53ee8cc1Swenshuai.xi         return eCmd;
597*53ee8cc1Swenshuai.xi     }
598*53ee8cc1Swenshuai.xi 
599*53ee8cc1Swenshuai.xi     u8OffsetIdx = _VPU_EX_GetOffsetIdx(pTaskInfo->u32Id);
600*53ee8cc1Swenshuai.xi 
601*53ee8cc1Swenshuai.xi     VPU_MSG_INFO("input TaskInfo u32Id=0x%08x eVpuId=0x%x src=0x%x dec=0x%x\n",
602*53ee8cc1Swenshuai.xi          pTaskInfo->u32Id, pTaskInfo->eVpuId, pTaskInfo->eSrcType, pTaskInfo->eDecType);
603*53ee8cc1Swenshuai.xi 
604*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
605*53ee8cc1Swenshuai.xi     {
606*53ee8cc1Swenshuai.xi         if (E_VPU_EX_INPUT_TSP == pTaskInfo->eSrcType)
607*53ee8cc1Swenshuai.xi         {
608*53ee8cc1Swenshuai.xi             eCmd = (u8OffsetIdx == 0) ? E_DUAL_CMD_TASK0_MVD_TSP : E_DUAL_CMD_TASK1_MVD_TSP;
609*53ee8cc1Swenshuai.xi         }
610*53ee8cc1Swenshuai.xi         else if (E_VPU_EX_INPUT_FILE == pTaskInfo->eSrcType)
611*53ee8cc1Swenshuai.xi         {
612*53ee8cc1Swenshuai.xi             eCmd = (u8OffsetIdx == 0) ? E_DUAL_CMD_TASK0_MVD_SLQ : E_DUAL_CMD_TASK1_MVD_SLQ;
613*53ee8cc1Swenshuai.xi         }
614*53ee8cc1Swenshuai.xi     }
615*53ee8cc1Swenshuai.xi     else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
616*53ee8cc1Swenshuai.xi     {
617*53ee8cc1Swenshuai.xi         if (E_VPU_EX_INPUT_TSP == pTaskInfo->eSrcType)
618*53ee8cc1Swenshuai.xi         {
619*53ee8cc1Swenshuai.xi             eCmd = (u8OffsetIdx == 0) ? E_DUAL_CMD_TASK0_HVD_TSP : E_DUAL_CMD_TASK1_HVD_TSP;
620*53ee8cc1Swenshuai.xi         }
621*53ee8cc1Swenshuai.xi         else if (E_VPU_EX_INPUT_FILE == pTaskInfo->eSrcType)
622*53ee8cc1Swenshuai.xi         {
623*53ee8cc1Swenshuai.xi             eCmd = (u8OffsetIdx == 0) ? E_DUAL_CMD_TASK0_HVD_BBU : E_DUAL_CMD_TASK1_HVD_BBU;
624*53ee8cc1Swenshuai.xi         }
625*53ee8cc1Swenshuai.xi     }
626*53ee8cc1Swenshuai.xi 
627*53ee8cc1Swenshuai.xi     VPU_MSG_INFO("output: eCmd=0x%x offsetIdx=0x%x\n", eCmd, u8OffsetIdx);
628*53ee8cc1Swenshuai.xi     return eCmd;
629*53ee8cc1Swenshuai.xi }
630*53ee8cc1Swenshuai.xi 
_VPU_EX_InitHW(VPU_EX_TaskInfo * pTaskInfo)631*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_InitHW(VPU_EX_TaskInfo *pTaskInfo)
632*53ee8cc1Swenshuai.xi {
633*53ee8cc1Swenshuai.xi     if (!pTaskInfo)
634*53ee8cc1Swenshuai.xi     {
635*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("null input\n");
636*53ee8cc1Swenshuai.xi         return FALSE;
637*53ee8cc1Swenshuai.xi     }
638*53ee8cc1Swenshuai.xi 
639*53ee8cc1Swenshuai.xi     //Check if we need to init MVD HW
640*53ee8cc1Swenshuai.xi     if ((E_VPU_EX_INPUT_TSP == pTaskInfo->eSrcType) ||
641*53ee8cc1Swenshuai.xi         (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType))
642*53ee8cc1Swenshuai.xi     {
643*53ee8cc1Swenshuai.xi         //Init HW
644*53ee8cc1Swenshuai.xi         if (FALSE == HAL_VPU_EX_MVDInUsed())
645*53ee8cc1Swenshuai.xi         {
646*53ee8cc1Swenshuai.xi             if (TRUE != HAL_MVD_InitHW())
647*53ee8cc1Swenshuai.xi             {
648*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("(%d):HAL_MVD_InitHW failed\n", __LINE__);
649*53ee8cc1Swenshuai.xi                 return FALSE;
650*53ee8cc1Swenshuai.xi             }
651*53ee8cc1Swenshuai.xi         }
652*53ee8cc1Swenshuai.xi         else
653*53ee8cc1Swenshuai.xi         {
654*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("(%d): do nothing\n", __LINE__);
655*53ee8cc1Swenshuai.xi         }
656*53ee8cc1Swenshuai.xi     }
657*53ee8cc1Swenshuai.xi 
658*53ee8cc1Swenshuai.xi     //MVD use sub mvop
659*53ee8cc1Swenshuai.xi     if((E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType) &&
660*53ee8cc1Swenshuai.xi         (E_HAL_VPU_SUB_STREAM0 == pTaskInfo->eVpuId) &&
661*53ee8cc1Swenshuai.xi         (E_VPU_DEC_MODE_DUAL_INDIE ==pVPUHalContext->_stVPUDecMode.u8DecMod))
662*53ee8cc1Swenshuai.xi     {
663*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Force turn on HVD\n");
664*53ee8cc1Swenshuai.xi         if(!HAL_VPU_EX_HVDInUsed())
665*53ee8cc1Swenshuai.xi         {
666*53ee8cc1Swenshuai.xi             if (!HAL_HVD_EX_InitHW(pTaskInfo->u32Id,pTaskInfo->eDecType))
667*53ee8cc1Swenshuai.xi             {
668*53ee8cc1Swenshuai.xi                  VPU_MSG_ERR("(%d):HAL_HVD_EX_InitHW failed\n", __LINE__);
669*53ee8cc1Swenshuai.xi                  return FALSE;
670*53ee8cc1Swenshuai.xi             }
671*53ee8cc1Swenshuai.xi         }
672*53ee8cc1Swenshuai.xi         else
673*53ee8cc1Swenshuai.xi         {
674*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("(%d): do nothing, HVD already init\n", __LINE__);
675*53ee8cc1Swenshuai.xi         }
676*53ee8cc1Swenshuai.xi     }
677*53ee8cc1Swenshuai.xi 
678*53ee8cc1Swenshuai.xi     //Check if we need to init HVD HW
679*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
680*53ee8cc1Swenshuai.xi     {
681*53ee8cc1Swenshuai.xi         if (!HAL_VPU_EX_MVDInUsed())
682*53ee8cc1Swenshuai.xi         {
683*53ee8cc1Swenshuai.xi             if (!HAL_MVD_InitHW())
684*53ee8cc1Swenshuai.xi             {
685*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("(%d):HAL_MVD_InitHW failed\n", __LINE__);
686*53ee8cc1Swenshuai.xi                 return FALSE;
687*53ee8cc1Swenshuai.xi             }
688*53ee8cc1Swenshuai.xi         }
689*53ee8cc1Swenshuai.xi 
690*53ee8cc1Swenshuai.xi         if (!HAL_HVD_EX_InitHW(pTaskInfo->u32Id,pTaskInfo->eDecType))
691*53ee8cc1Swenshuai.xi         {
692*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("(%d):HAL_HVD_EX_InitHW failed\n", __LINE__);
693*53ee8cc1Swenshuai.xi             return FALSE;
694*53ee8cc1Swenshuai.xi         }
695*53ee8cc1Swenshuai.xi     }
696*53ee8cc1Swenshuai.xi 
697*53ee8cc1Swenshuai.xi     return TRUE;
698*53ee8cc1Swenshuai.xi }
699*53ee8cc1Swenshuai.xi 
_VPU_EX_InClock(MS_U32 u32type)700*53ee8cc1Swenshuai.xi static MS_U32 _VPU_EX_InClock(MS_U32 u32type)
701*53ee8cc1Swenshuai.xi {
702*53ee8cc1Swenshuai.xi     switch (u32type)
703*53ee8cc1Swenshuai.xi     {
704*53ee8cc1Swenshuai.xi         case VPU_CLOCK_320MHZ:
705*53ee8cc1Swenshuai.xi             return 320000000UL;
706*53ee8cc1Swenshuai.xi         case VPU_CLOCK_288MHZ:
707*53ee8cc1Swenshuai.xi             return 288000000UL;
708*53ee8cc1Swenshuai.xi         case VPU_CLOCK_216MHZ:
709*53ee8cc1Swenshuai.xi             return 216000000UL;
710*53ee8cc1Swenshuai.xi         case VPU_CLOCK_192MHZ:
711*53ee8cc1Swenshuai.xi             return 192000000UL;
712*53ee8cc1Swenshuai.xi         case VPU_CLOCK_160MHZ:
713*53ee8cc1Swenshuai.xi             return 160000000UL;
714*53ee8cc1Swenshuai.xi         case VPU_CLOCK_144MHZ:
715*53ee8cc1Swenshuai.xi             return 144000000UL;
716*53ee8cc1Swenshuai.xi 
717*53ee8cc1Swenshuai.xi         default:
718*53ee8cc1Swenshuai.xi             return 320000000UL;
719*53ee8cc1Swenshuai.xi     }
720*53ee8cc1Swenshuai.xi }
721*53ee8cc1Swenshuai.xi 
722*53ee8cc1Swenshuai.xi 
723*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX)
724*53ee8cc1Swenshuai.xi //For REE
HAL_VPU_EX_REE_RegisterMBX(void)725*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_REE_RegisterMBX(void)
726*53ee8cc1Swenshuai.xi {
727*53ee8cc1Swenshuai.xi #if ENABLE_TEE
728*53ee8cc1Swenshuai.xi     MS_U8 ClassNum = 0;
729*53ee8cc1Swenshuai.xi     MBX_Result result;
730*53ee8cc1Swenshuai.xi 
731*53ee8cc1Swenshuai.xi     if (bVPUMbxInitFlag == TRUE)
732*53ee8cc1Swenshuai.xi     {
733*53ee8cc1Swenshuai.xi         return TRUE;
734*53ee8cc1Swenshuai.xi     }
735*53ee8cc1Swenshuai.xi 
736*53ee8cc1Swenshuai.xi     if (E_MBX_SUCCESS != MApi_MBX_Init(E_MBX_CPU_MIPS,E_MBX_ROLE_HK,1000))
737*53ee8cc1Swenshuai.xi     {
738*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("VDEC_TEE MApi_MBX_Init fail\n");
739*53ee8cc1Swenshuai.xi         return FALSE;
740*53ee8cc1Swenshuai.xi     }
741*53ee8cc1Swenshuai.xi 
742*53ee8cc1Swenshuai.xi     if (E_MBX_SUCCESS != MApi_MBX_QueryDynamicClass(E_MBX_CPU_MIPS_VPE1, "VDEC_TEE", (MS_U8 *)&ClassNum))
743*53ee8cc1Swenshuai.xi     {
744*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("VDEC_TEE MApi_MBX_QueryDynamicClass fail\n");
745*53ee8cc1Swenshuai.xi         return FALSE;
746*53ee8cc1Swenshuai.xi     }
747*53ee8cc1Swenshuai.xi 
748*53ee8cc1Swenshuai.xi     result = MApi_MBX_RegisterMSG(ClassNum, 10);
749*53ee8cc1Swenshuai.xi 
750*53ee8cc1Swenshuai.xi     if (( E_MBX_SUCCESS != result) && ( E_MBX_ERR_SLOT_AREADY_OPENNED != result ))
751*53ee8cc1Swenshuai.xi     {
752*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("%s fail\n",__FUNCTION__);
753*53ee8cc1Swenshuai.xi         return FALSE;
754*53ee8cc1Swenshuai.xi     }
755*53ee8cc1Swenshuai.xi     else
756*53ee8cc1Swenshuai.xi     {
757*53ee8cc1Swenshuai.xi         bVPUMbxInitFlag = TRUE;
758*53ee8cc1Swenshuai.xi         u8VPUMbxMsgClass = ClassNum;
759*53ee8cc1Swenshuai.xi         return TRUE;
760*53ee8cc1Swenshuai.xi     }
761*53ee8cc1Swenshuai.xi #else
762*53ee8cc1Swenshuai.xi 	return FALSE;
763*53ee8cc1Swenshuai.xi #endif
764*53ee8cc1Swenshuai.xi }
765*53ee8cc1Swenshuai.xi #if ENABLE_TEE
_VPU_EX_REE_SendMBXMsg(VDEC_REE_TO_TEE_MBX_MSG_TYPE msg_type)766*53ee8cc1Swenshuai.xi VDEC_TEE_TO_REE_MBX_ACK_TYPE _VPU_EX_REE_SendMBXMsg(VDEC_REE_TO_TEE_MBX_MSG_TYPE msg_type)
767*53ee8cc1Swenshuai.xi {
768*53ee8cc1Swenshuai.xi     MBX_Result result;
769*53ee8cc1Swenshuai.xi     MS_U8 u8Index;
770*53ee8cc1Swenshuai.xi 
771*53ee8cc1Swenshuai.xi     if (pVPUHalContext->bEnableVPUSecureMode == FALSE)
772*53ee8cc1Swenshuai.xi     {
773*53ee8cc1Swenshuai.xi         return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_NO_TEE;
774*53ee8cc1Swenshuai.xi     }
775*53ee8cc1Swenshuai.xi 
776*53ee8cc1Swenshuai.xi     if (bVPUMbxInitFlag == FALSE)
777*53ee8cc1Swenshuai.xi     {
778*53ee8cc1Swenshuai.xi         return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_INVALID;
779*53ee8cc1Swenshuai.xi     }
780*53ee8cc1Swenshuai.xi 
781*53ee8cc1Swenshuai.xi     VPUReeToTeeMbxMsg.eRoleID = E_MBX_CPU_MIPS_VPE1;
782*53ee8cc1Swenshuai.xi     VPUReeToTeeMbxMsg.u8Ctrl = 0;
783*53ee8cc1Swenshuai.xi     VPUReeToTeeMbxMsg.eMsgType = E_MBX_MSG_TYPE_INSTANT;
784*53ee8cc1Swenshuai.xi     VPUReeToTeeMbxMsg.u8MsgClass = u8VPUMbxMsgClass;
785*53ee8cc1Swenshuai.xi     VPUReeToTeeMbxMsg.u8Index = msg_type;
786*53ee8cc1Swenshuai.xi 
787*53ee8cc1Swenshuai.xi     result = MApi_MBX_SendMsg(&VPUReeToTeeMbxMsg);
788*53ee8cc1Swenshuai.xi     if (E_MBX_SUCCESS != result)
789*53ee8cc1Swenshuai.xi     {
790*53ee8cc1Swenshuai.xi         return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL;
791*53ee8cc1Swenshuai.xi     }
792*53ee8cc1Swenshuai.xi 
793*53ee8cc1Swenshuai.xi     // Receive Reply ACK from TEE side.
794*53ee8cc1Swenshuai.xi     memset(&VPUTeeToReeMbxMsg, 0, sizeof(MBX_Msg));
795*53ee8cc1Swenshuai.xi 
796*53ee8cc1Swenshuai.xi     VPUTeeToReeMbxMsg.u8MsgClass = u8VPUMbxMsgClass;
797*53ee8cc1Swenshuai.xi 
798*53ee8cc1Swenshuai.xi #if 0 // marked temperarily, wait kernel team to fix MApi_MBX_RecvMsg.
799*53ee8cc1Swenshuai.xi     if(E_MBX_SUCCESS != MApi_MBX_RecvMsg(TEE_MBX_MSG_CLASS, &(TEE_TO_REE_MBX_MSG), 20, MBX_CHECK_INSTANT_MSG))
800*53ee8cc1Swenshuai.xi     {
801*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("VDEC get Secure world ACK fail\n");
802*53ee8cc1Swenshuai.xi         return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL;
803*53ee8cc1Swenshuai.xi     }
804*53ee8cc1Swenshuai.xi     else
805*53ee8cc1Swenshuai.xi #else
806*53ee8cc1Swenshuai.xi     do
807*53ee8cc1Swenshuai.xi     {
808*53ee8cc1Swenshuai.xi         result = MApi_MBX_RecvMsg(u8VPUMbxMsgClass, &VPUTeeToReeMbxMsg, 2000, MBX_CHECK_INSTANT_MSG);
809*53ee8cc1Swenshuai.xi     } while(E_MBX_SUCCESS != result);
810*53ee8cc1Swenshuai.xi #endif
811*53ee8cc1Swenshuai.xi     {
812*53ee8cc1Swenshuai.xi         u8Index = VPUTeeToReeMbxMsg.u8Index;
813*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("VDEC get ACK cmd:%x\n", u8Index);
814*53ee8cc1Swenshuai.xi 
815*53ee8cc1Swenshuai.xi         if (E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL == u8Index)
816*53ee8cc1Swenshuai.xi         {
817*53ee8cc1Swenshuai.xi             return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL;
818*53ee8cc1Swenshuai.xi         }
819*53ee8cc1Swenshuai.xi     }
820*53ee8cc1Swenshuai.xi 
821*53ee8cc1Swenshuai.xi     return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS;
822*53ee8cc1Swenshuai.xi }
823*53ee8cc1Swenshuai.xi #endif
HAL_VPU_EX_REE_SetSHMBaseAddr(void)824*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_REE_SetSHMBaseAddr(void)
825*53ee8cc1Swenshuai.xi {
826*53ee8cc1Swenshuai.xi #if ENABLE_TEE
827*53ee8cc1Swenshuai.xi     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)
828*53ee8cc1Swenshuai.xi     {
829*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("[Error] VDEC load code in Secure world fail!\n");
830*53ee8cc1Swenshuai.xi         return FALSE;
831*53ee8cc1Swenshuai.xi     }
832*53ee8cc1Swenshuai.xi     else
833*53ee8cc1Swenshuai.xi     {
834*53ee8cc1Swenshuai.xi         MS_U32 u32VPUSHMoffset = (VPUTeeToReeMbxMsg.u8Parameters[0]&0xff) |
835*53ee8cc1Swenshuai.xi                                  ((VPUTeeToReeMbxMsg.u8Parameters[1]<<8)&0xff00)|
836*53ee8cc1Swenshuai.xi                                  ((VPUTeeToReeMbxMsg.u8Parameters[2]<<16)&0xff0000)|
837*53ee8cc1Swenshuai.xi                                  ((VPUTeeToReeMbxMsg.u8Parameters[3]<<24)&0xff000000);
838*53ee8cc1Swenshuai.xi         MS_U32 u32VPUSHMsize =   (VPUTeeToReeMbxMsg.u8Parameters[4]&0xff) |
839*53ee8cc1Swenshuai.xi                                  ((VPUTeeToReeMbxMsg.u8Parameters[5]<<8)&0xff00)|
840*53ee8cc1Swenshuai.xi                                  ((VPUTeeToReeMbxMsg.u8Parameters[6]<<16)&0xff0000)|
841*53ee8cc1Swenshuai.xi                                  ((VPUTeeToReeMbxMsg.u8Parameters[7]<<24)&0xff000000);
842*53ee8cc1Swenshuai.xi 
843*53ee8cc1Swenshuai.xi         VPU_MSG_INFO("u32VPUSHMoffset %x,u32VPUSHMsize %x,miu %d\n",(unsigned int)u32VPUSHMoffset,(unsigned int)u32VPUSHMsize,VPUTeeToReeMbxMsg.u8Parameters[8]);
844*53ee8cc1Swenshuai.xi         if(VPUTeeToReeMbxMsg.u8Parameters[8] == 1)
845*53ee8cc1Swenshuai.xi         {
846*53ee8cc1Swenshuai.xi             pVPUHalContext->u32VPUSHMAddr = u32VPUSHMoffset+HAL_MIU1_BASE;
847*53ee8cc1Swenshuai.xi         }
848*53ee8cc1Swenshuai.xi         else
849*53ee8cc1Swenshuai.xi         {
850*53ee8cc1Swenshuai.xi             pVPUHalContext->u32VPUSHMAddr = u32VPUSHMoffset;
851*53ee8cc1Swenshuai.xi         }
852*53ee8cc1Swenshuai.xi     }
853*53ee8cc1Swenshuai.xi     return true;
854*53ee8cc1Swenshuai.xi #else
855*53ee8cc1Swenshuai.xi 	return FALSE;
856*53ee8cc1Swenshuai.xi #endif
857*53ee8cc1Swenshuai.xi }
858*53ee8cc1Swenshuai.xi #endif
859*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetFWReload(void)860*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_GetFWReload(void)
861*53ee8cc1Swenshuai.xi {
862*53ee8cc1Swenshuai.xi     return pVPUHalContext->bVpuExReloadFW;
863*53ee8cc1Swenshuai.xi }
864*53ee8cc1Swenshuai.xi 
_VPU_EX_IsNeedDecompress(MS_VIRT u32SrcAddr)865*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_IsNeedDecompress(MS_VIRT u32SrcAddr)
866*53ee8cc1Swenshuai.xi {
867*53ee8cc1Swenshuai.xi     if(*((MS_U8*)(u32SrcAddr))=='V' && *((MS_U8*)(u32SrcAddr+1))=='D'
868*53ee8cc1Swenshuai.xi         && *((MS_U8*)(u32SrcAddr+2))=='E' && *((MS_U8*)(u32SrcAddr+3))=='C'
869*53ee8cc1Swenshuai.xi         && *((MS_U8*)(u32SrcAddr+4))=='2' && *((MS_U8*)(u32SrcAddr+5))=='0'
870*53ee8cc1Swenshuai.xi         && *((MS_U8*)(u32SrcAddr+0x88))=='V' && *((MS_U8*)(u32SrcAddr+0x89))=='D'
871*53ee8cc1Swenshuai.xi         && *((MS_U8*)(u32SrcAddr+0x8a))=='E' && *((MS_U8*)(u32SrcAddr+0x8b))=='C'
872*53ee8cc1Swenshuai.xi         && *((MS_U8*)(u32SrcAddr+0x8c))=='2' && *((MS_U8*)(u32SrcAddr+0x8d))=='0'
873*53ee8cc1Swenshuai.xi         )
874*53ee8cc1Swenshuai.xi     {
875*53ee8cc1Swenshuai.xi         return FALSE;
876*53ee8cc1Swenshuai.xi     }
877*53ee8cc1Swenshuai.xi     else
878*53ee8cc1Swenshuai.xi     {
879*53ee8cc1Swenshuai.xi         return TRUE;
880*53ee8cc1Swenshuai.xi     }
881*53ee8cc1Swenshuai.xi }
882*53ee8cc1Swenshuai.xi 
_VPU_EX_InitAll(VPU_EX_NDecInitPara * pInitPara)883*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_InitAll(VPU_EX_NDecInitPara *pInitPara)
884*53ee8cc1Swenshuai.xi {
885*53ee8cc1Swenshuai.xi     MS_U32 u32fwPA = NULL;  //physical address
886*53ee8cc1Swenshuai.xi     VPU_EX_ClockSpeed eClkSpeed = E_VPU_EX_CLOCK_320MHZ;
887*53ee8cc1Swenshuai.xi 
888*53ee8cc1Swenshuai.xi     if (TRUE == HAL_VPU_EX_IsPowered())
889*53ee8cc1Swenshuai.xi     {
890*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("IsPowered\n");
891*53ee8cc1Swenshuai.xi         return TRUE;
892*53ee8cc1Swenshuai.xi     }
893*53ee8cc1Swenshuai.xi     else
894*53ee8cc1Swenshuai.xi     {
895*53ee8cc1Swenshuai.xi         //VPU hold
896*53ee8cc1Swenshuai.xi         HAL_VPU_EX_SwRst(FALSE);
897*53ee8cc1Swenshuai.xi 
898*53ee8cc1Swenshuai.xi         //VPU clock on
899*53ee8cc1Swenshuai.xi         VPU_EX_InitParam VPUInitParams = {eClkSpeed, FALSE, -1, VPU_DEFAULT_MUTEX_TIMEOUT, TRUE};
900*53ee8cc1Swenshuai.xi         VPUInitParams.bInMIU1 = VPU_I_R_ON_MIU1;
901*53ee8cc1Swenshuai.xi 
902*53ee8cc1Swenshuai.xi         HAL_VPU_EX_Init(&VPUInitParams);
903*53ee8cc1Swenshuai.xi     }
904*53ee8cc1Swenshuai.xi 
905*53ee8cc1Swenshuai.xi     VPU_EX_FWCodeCfg *pFWCodeCfg   = NULL;
906*53ee8cc1Swenshuai.xi     VPU_EX_TaskInfo  *pTaskInfo    = NULL;
907*53ee8cc1Swenshuai.xi     VPU_EX_VLCTblCfg *pVlcCfg      = NULL;
908*53ee8cc1Swenshuai.xi 
909*53ee8cc1Swenshuai.xi     if (pInitPara)
910*53ee8cc1Swenshuai.xi     {
911*53ee8cc1Swenshuai.xi         pFWCodeCfg  = pInitPara->pFWCodeCfg;
912*53ee8cc1Swenshuai.xi         pTaskInfo   = pInitPara->pTaskInfo;
913*53ee8cc1Swenshuai.xi         pVlcCfg     = pInitPara->pVLCCfg;
914*53ee8cc1Swenshuai.xi     }
915*53ee8cc1Swenshuai.xi     else
916*53ee8cc1Swenshuai.xi     {
917*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("(%d) NULL para\n", __LINE__);
918*53ee8cc1Swenshuai.xi         return FALSE;
919*53ee8cc1Swenshuai.xi     }
920*53ee8cc1Swenshuai.xi 
921*53ee8cc1Swenshuai.xi     u32fwPA = MsOS_VA2PA(pFWCodeCfg->u32DstAddr);
922*53ee8cc1Swenshuai.xi #if ENABLE_TEE
923*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX)
924*53ee8cc1Swenshuai.xi     if(pVPUHalContext->bEnableVPUSecureMode == TRUE)
925*53ee8cc1Swenshuai.xi     {
926*53ee8cc1Swenshuai.xi         VPU_MSG_INFO("Load VDEC f/w code in Secure World\n");
927*53ee8cc1Swenshuai.xi 
928*53ee8cc1Swenshuai.xi         if (FALSE == HAL_VPU_EX_GetFWReload())
929*53ee8cc1Swenshuai.xi         {
930*53ee8cc1Swenshuai.xi             if (FALSE == pVPUHalContext->bVpuExLoadFWRlt)
931*53ee8cc1Swenshuai.xi             {
932*53ee8cc1Swenshuai.xi                 VPU_MSG_INFO("Never load fw successfully, load it anyway!\n");
933*53ee8cc1Swenshuai.xi                 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)
934*53ee8cc1Swenshuai.xi                 {
935*53ee8cc1Swenshuai.xi                     VPU_MSG_ERR("[Error] VDEC load code in Secure world fail!\n");
936*53ee8cc1Swenshuai.xi                     return FALSE;
937*53ee8cc1Swenshuai.xi                 }
938*53ee8cc1Swenshuai.xi                 pVPUHalContext->bVpuExLoadFWRlt = TRUE;
939*53ee8cc1Swenshuai.xi             }
940*53ee8cc1Swenshuai.xi             else
941*53ee8cc1Swenshuai.xi             {
942*53ee8cc1Swenshuai.xi                 //Check f/w prefix "VDEC20"
943*53ee8cc1Swenshuai.xi                 if (_VPU_EX_IsNeedDecompress(pFWCodeCfg->u32DstAddr) != FALSE)
944*53ee8cc1Swenshuai.xi                 {
945*53ee8cc1Swenshuai.xi                     VPU_MSG_ERR("Wrong prefix: reload fw!\n");
946*53ee8cc1Swenshuai.xi                     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)
947*53ee8cc1Swenshuai.xi                     {
948*53ee8cc1Swenshuai.xi                         VPU_MSG_ERR("[Error] VDEC load code in Secure world fail!\n");
949*53ee8cc1Swenshuai.xi                         pVPUHalContext->bVpuExLoadFWRlt = FALSE;
950*53ee8cc1Swenshuai.xi                         return FALSE;
951*53ee8cc1Swenshuai.xi                     }
952*53ee8cc1Swenshuai.xi                 }
953*53ee8cc1Swenshuai.xi                 else
954*53ee8cc1Swenshuai.xi                 {
955*53ee8cc1Swenshuai.xi                     VPU_MSG_INFO("Skip loading fw this time!!!\n");
956*53ee8cc1Swenshuai.xi                 }
957*53ee8cc1Swenshuai.xi             }
958*53ee8cc1Swenshuai.xi         }
959*53ee8cc1Swenshuai.xi         else
960*53ee8cc1Swenshuai.xi         {
961*53ee8cc1Swenshuai.xi             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)
962*53ee8cc1Swenshuai.xi             {
963*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("[Error] VDEC load code in Secure world fail!\n");
964*53ee8cc1Swenshuai.xi                 pVPUHalContext->bVpuExLoadFWRlt = FALSE;
965*53ee8cc1Swenshuai.xi                 return FALSE;
966*53ee8cc1Swenshuai.xi             }
967*53ee8cc1Swenshuai.xi             pVPUHalContext->bVpuExLoadFWRlt = TRUE;
968*53ee8cc1Swenshuai.xi         }
969*53ee8cc1Swenshuai.xi     }
970*53ee8cc1Swenshuai.xi     else
971*53ee8cc1Swenshuai.xi #endif
972*53ee8cc1Swenshuai.xi #endif
973*53ee8cc1Swenshuai.xi     {
974*53ee8cc1Swenshuai.xi         VPU_MSG_INFO("Load VDEC f/w code in Normal World\n");
975*53ee8cc1Swenshuai.xi 
976*53ee8cc1Swenshuai.xi         if (!HAL_VPU_EX_LoadCode(pFWCodeCfg))
977*53ee8cc1Swenshuai.xi         {
978*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("HAL_VPU_EX_LoadCode fail!\n");
979*53ee8cc1Swenshuai.xi             return FALSE;
980*53ee8cc1Swenshuai.xi         }
981*53ee8cc1Swenshuai.xi     }
982*53ee8cc1Swenshuai.xi 
983*53ee8cc1Swenshuai.xi     if (pVlcCfg)
984*53ee8cc1Swenshuai.xi     {
985*53ee8cc1Swenshuai.xi         if (!_VPU_EX_LoadVLCTable(pVlcCfg, pFWCodeCfg->u8SrcType))
986*53ee8cc1Swenshuai.xi         {
987*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("HAL_VPU_LoadVLCTable fail!\n");
988*53ee8cc1Swenshuai.xi             return FALSE;
989*53ee8cc1Swenshuai.xi         }
990*53ee8cc1Swenshuai.xi     }
991*53ee8cc1Swenshuai.xi 
992*53ee8cc1Swenshuai.xi     if (!HAL_VPU_EX_CPUSetting(u32fwPA))
993*53ee8cc1Swenshuai.xi     {
994*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("HAL_VPU_EX_CPUSetting fail!\n");
995*53ee8cc1Swenshuai.xi         return FALSE;
996*53ee8cc1Swenshuai.xi     }
997*53ee8cc1Swenshuai.xi 
998*53ee8cc1Swenshuai.xi     //Init HW
999*53ee8cc1Swenshuai.xi     if (FALSE == _VPU_EX_InitHW(pTaskInfo))
1000*53ee8cc1Swenshuai.xi     {
1001*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("(%d): InitHW failed\n", __LINE__);
1002*53ee8cc1Swenshuai.xi         //_MVD_INIT_FAIL_RET();
1003*53ee8cc1Swenshuai.xi         return FALSE;
1004*53ee8cc1Swenshuai.xi     }
1005*53ee8cc1Swenshuai.xi     else
1006*53ee8cc1Swenshuai.xi     {
1007*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("(%d): InitHW success\n", __LINE__);
1008*53ee8cc1Swenshuai.xi     }
1009*53ee8cc1Swenshuai.xi 
1010*53ee8cc1Swenshuai.xi     //set vpu clock to FW
1011*53ee8cc1Swenshuai.xi     struct _ctl_info *ctl_ptr = (struct _ctl_info *)
1012*53ee8cc1Swenshuai.xi                     MsOS_PA2KSEG1(MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr) + CTL_INFO_ADDR);
1013*53ee8cc1Swenshuai.xi 
1014*53ee8cc1Swenshuai.xi     ctl_ptr->statue = CTL_STU_NONE;
1015*53ee8cc1Swenshuai.xi     //notify controller the interface version of VPU driver.
1016*53ee8cc1Swenshuai.xi     ctl_ptr->ctl_interface = VPU_CTL_INTERFACE_VER;
1017*53ee8cc1Swenshuai.xi     ctl_ptr->vpu_clk = _VPU_EX_InClock(eClkSpeed);
1018*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
1019*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("clock speed=0x%x\n", ctl_ptr->vpu_clk);
1020*53ee8cc1Swenshuai.xi 
1021*53ee8cc1Swenshuai.xi     //Release VPU: For dual decoder, we only release VPU if it is not released yet.
1022*53ee8cc1Swenshuai.xi     if (TRUE == HAL_VPU_EX_IsRsted())
1023*53ee8cc1Swenshuai.xi     {
1024*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("VPU_IsRsted\n");
1025*53ee8cc1Swenshuai.xi         return TRUE;
1026*53ee8cc1Swenshuai.xi     }
1027*53ee8cc1Swenshuai.xi     else
1028*53ee8cc1Swenshuai.xi     {
1029*53ee8cc1Swenshuai.xi         HAL_VPU_EX_SwRstRelse();
1030*53ee8cc1Swenshuai.xi     }
1031*53ee8cc1Swenshuai.xi 
1032*53ee8cc1Swenshuai.xi     return TRUE;
1033*53ee8cc1Swenshuai.xi }
1034*53ee8cc1Swenshuai.xi 
_VPU_EX_DeinitHW(void)1035*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_DeinitHW(void)
1036*53ee8cc1Swenshuai.xi {
1037*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
1038*53ee8cc1Swenshuai.xi 
1039*53ee8cc1Swenshuai.xi     if (FALSE == HAL_VPU_EX_MVDInUsed())
1040*53ee8cc1Swenshuai.xi     {
1041*53ee8cc1Swenshuai.xi         bRet = HAL_MVD_DeinitHW();
1042*53ee8cc1Swenshuai.xi     }
1043*53ee8cc1Swenshuai.xi 
1044*53ee8cc1Swenshuai.xi     if (FALSE == HAL_VPU_EX_HVDInUsed())
1045*53ee8cc1Swenshuai.xi     {
1046*53ee8cc1Swenshuai.xi         bRet = HAL_HVD_EX_DeinitHW();
1047*53ee8cc1Swenshuai.xi     }
1048*53ee8cc1Swenshuai.xi 
1049*53ee8cc1Swenshuai.xi     return bRet;
1050*53ee8cc1Swenshuai.xi }
1051*53ee8cc1Swenshuai.xi 
_VPU_EX_DeinitAll(void)1052*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_DeinitAll(void)
1053*53ee8cc1Swenshuai.xi {
1054*53ee8cc1Swenshuai.xi     HAL_VPU_EX_SwRst(TRUE);
1055*53ee8cc1Swenshuai.xi     _VPU_EX_DeinitHW();
1056*53ee8cc1Swenshuai.xi     HAL_VPU_EX_DeInit();
1057*53ee8cc1Swenshuai.xi 
1058*53ee8cc1Swenshuai.xi     return TRUE;
1059*53ee8cc1Swenshuai.xi }
1060*53ee8cc1Swenshuai.xi 
_VPU_EX_GetActiveCodecCnt(void)1061*53ee8cc1Swenshuai.xi static MS_U8 _VPU_EX_GetActiveCodecCnt(void)
1062*53ee8cc1Swenshuai.xi {
1063*53ee8cc1Swenshuai.xi     MS_U32 i;
1064*53ee8cc1Swenshuai.xi     MS_U8  u8ActiveCnt = 0;
1065*53ee8cc1Swenshuai.xi     for (i = 0; i < sizeof(pVPUHalContext->_stVPUStream) / sizeof(pVPUHalContext->_stVPUStream[0]); i++)
1066*53ee8cc1Swenshuai.xi     {
1067*53ee8cc1Swenshuai.xi         if (E_VPU_EX_DECODER_NONE != pVPUHalContext->_stVPUStream[i].eDecodertype)
1068*53ee8cc1Swenshuai.xi         {
1069*53ee8cc1Swenshuai.xi             u8ActiveCnt++;
1070*53ee8cc1Swenshuai.xi         }
1071*53ee8cc1Swenshuai.xi     }
1072*53ee8cc1Swenshuai.xi     if (pVPUHalContext->u8TaskCnt != u8ActiveCnt)
1073*53ee8cc1Swenshuai.xi     {
1074*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Err u8TaskCnt(%d) != u8ActiveCnt(%d)\n", pVPUHalContext->u8TaskCnt, u8ActiveCnt);
1075*53ee8cc1Swenshuai.xi     }
1076*53ee8cc1Swenshuai.xi     VPU_MSG_DBG(" = %d\n", u8ActiveCnt);
1077*53ee8cc1Swenshuai.xi     return u8ActiveCnt;
1078*53ee8cc1Swenshuai.xi }
_VPU_EX_ClockInv(MS_BOOL bEnable)1079*53ee8cc1Swenshuai.xi static void _VPU_EX_ClockInv(MS_BOOL bEnable)
1080*53ee8cc1Swenshuai.xi {
1081*53ee8cc1Swenshuai.xi     if (TRUE)
1082*53ee8cc1Swenshuai.xi     {
1083*53ee8cc1Swenshuai.xi         _VPU_WriteWordMask(REG_TOP_VPU, 0, TOP_CKG_VPU_INV);
1084*53ee8cc1Swenshuai.xi     }
1085*53ee8cc1Swenshuai.xi     else
1086*53ee8cc1Swenshuai.xi     {
1087*53ee8cc1Swenshuai.xi         _VPU_WriteWordMask(REG_TOP_VPU, TOP_CKG_VPU_INV, TOP_CKG_VPU_INV);
1088*53ee8cc1Swenshuai.xi     }
1089*53ee8cc1Swenshuai.xi }
1090*53ee8cc1Swenshuai.xi 
_VPU_EX_ClockSpeed(MS_U32 u32type)1091*53ee8cc1Swenshuai.xi static void _VPU_EX_ClockSpeed(MS_U32 u32type)
1092*53ee8cc1Swenshuai.xi {
1093*53ee8cc1Swenshuai.xi     switch (u32type)
1094*53ee8cc1Swenshuai.xi     {
1095*53ee8cc1Swenshuai.xi         case VPU_CLOCK_320MHZ:
1096*53ee8cc1Swenshuai.xi         case VPU_CLOCK_288MHZ:
1097*53ee8cc1Swenshuai.xi         case VPU_CLOCK_216MHZ:
1098*53ee8cc1Swenshuai.xi         case VPU_CLOCK_192MHZ:
1099*53ee8cc1Swenshuai.xi         case VPU_CLOCK_160MHZ:
1100*53ee8cc1Swenshuai.xi         case VPU_CLOCK_144MHZ:
1101*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(REG_TOP_VPU, u32type, TOP_CKG_VPU_CLK_MASK);
1102*53ee8cc1Swenshuai.xi             break;
1103*53ee8cc1Swenshuai.xi         default:
1104*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(REG_TOP_VPU, VPU_CLOCK_320MHZ, TOP_CKG_VPU_CLK_MASK);
1105*53ee8cc1Swenshuai.xi             break;
1106*53ee8cc1Swenshuai.xi     }
1107*53ee8cc1Swenshuai.xi }
1108*53ee8cc1Swenshuai.xi 
_VPU_EX_MAU_IDLE(void)1109*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_MAU_IDLE(void)
1110*53ee8cc1Swenshuai.xi {
1111*53ee8cc1Swenshuai.xi     if (((_VPU_Read2Byte(MAU1_ARB0_DBG0) & MAU1_FSM_CS_MASK) == MAU1_FSM_CS_IDLE)
1112*53ee8cc1Swenshuai.xi         && ((_VPU_Read2Byte(MAU1_ARB1_DBG0) & MAU1_FSM_CS_MASK) == MAU1_FSM_CS_IDLE))
1113*53ee8cc1Swenshuai.xi     {
1114*53ee8cc1Swenshuai.xi         return TRUE;
1115*53ee8cc1Swenshuai.xi     }
1116*53ee8cc1Swenshuai.xi     return FALSE;
1117*53ee8cc1Swenshuai.xi }
1118*53ee8cc1Swenshuai.xi 
1119*53ee8cc1Swenshuai.xi 
1120*53ee8cc1Swenshuai.xi #if (ENABLE_DECOMPRESS_FUNCTION==TRUE)
_VPU_EX_DecompressBin(MS_VIRT u32SrcAddr,MS_VIRT u32SrcSize,MS_VIRT u32DestAddr,MS_VIRT u32SlidingAddr)1121*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_DecompressBin(MS_VIRT u32SrcAddr, MS_VIRT u32SrcSize, MS_VIRT u32DestAddr, MS_VIRT u32SlidingAddr)
1122*53ee8cc1Swenshuai.xi {
1123*53ee8cc1Swenshuai.xi     if(_VPU_EX_IsNeedDecompress(u32SrcAddr))
1124*53ee8cc1Swenshuai.xi     {
1125*53ee8cc1Swenshuai.xi         ms_VDECDecompressInit((MS_U8*)u32SlidingAddr, (MS_U8*)u32DestAddr);
1126*53ee8cc1Swenshuai.xi         ms_VDECDecompress((MS_U8*)u32SrcAddr, u32SrcSize);
1127*53ee8cc1Swenshuai.xi         ms_VDECDecompressDeInit();
1128*53ee8cc1Swenshuai.xi         return TRUE;
1129*53ee8cc1Swenshuai.xi     }
1130*53ee8cc1Swenshuai.xi     else
1131*53ee8cc1Swenshuai.xi     {
1132*53ee8cc1Swenshuai.xi         return FALSE;
1133*53ee8cc1Swenshuai.xi     }
1134*53ee8cc1Swenshuai.xi }
1135*53ee8cc1Swenshuai.xi #endif
1136*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_SetSingleDecodeMode(MS_BOOL bEnable)1137*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_SetSingleDecodeMode(MS_BOOL bEnable)
1138*53ee8cc1Swenshuai.xi {
1139*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
1140*53ee8cc1Swenshuai.xi     pVPUHalContext->_bVPUSingleMode = bEnable;
1141*53ee8cc1Swenshuai.xi     return bRet;
1142*53ee8cc1Swenshuai.xi }
1143*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_SetDecodeMode(VPU_EX_DecModCfg * pstCfg)1144*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_SetDecodeMode(VPU_EX_DecModCfg *pstCfg)
1145*53ee8cc1Swenshuai.xi {
1146*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
1147*53ee8cc1Swenshuai.xi     MS_U8 i=0;
1148*53ee8cc1Swenshuai.xi     if (pstCfg != NULL)
1149*53ee8cc1Swenshuai.xi     {
1150*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUDecMode.u8DecMod = pstCfg->u8DecMod;
1151*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUDecMode.u8CodecCnt = pstCfg->u8CodecCnt;
1152*53ee8cc1Swenshuai.xi         for (i=0; ((i<pstCfg->u8CodecCnt)&&(i<VPU_MAX_DEC_NUM)); i++)
1153*53ee8cc1Swenshuai.xi         {
1154*53ee8cc1Swenshuai.xi             pVPUHalContext->_stVPUDecMode.u8CodecType[i] = pstCfg->u8CodecType[i];
1155*53ee8cc1Swenshuai.xi         }
1156*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUDecMode.u8ArgSize = pstCfg->u8ArgSize;
1157*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUDecMode.u32Arg    = pstCfg->u32Arg;
1158*53ee8cc1Swenshuai.xi     }
1159*53ee8cc1Swenshuai.xi     else
1160*53ee8cc1Swenshuai.xi     {
1161*53ee8cc1Swenshuai.xi         bRet = FALSE;
1162*53ee8cc1Swenshuai.xi     }
1163*53ee8cc1Swenshuai.xi     return bRet;
1164*53ee8cc1Swenshuai.xi }
1165*53ee8cc1Swenshuai.xi 
1166*53ee8cc1Swenshuai.xi //static MS_BOOL bVpuExReloadFW = TRUE;
1167*53ee8cc1Swenshuai.xi //static MS_BOOL bVpuExLoadFWRlt = FALSE;
HAL_VPU_EX_SetFWReload(MS_BOOL bReload)1168*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_SetFWReload(MS_BOOL bReload)
1169*53ee8cc1Swenshuai.xi {
1170*53ee8cc1Swenshuai.xi     pVPUHalContext->bVpuExReloadFW = bReload;
1171*53ee8cc1Swenshuai.xi     //printf("%s bVpuExReloadFW = %x\n", __FUNCTION__, bVpuExReloadFW);
1172*53ee8cc1Swenshuai.xi     return TRUE;
1173*53ee8cc1Swenshuai.xi }
1174*53ee8cc1Swenshuai.xi 
1175*53ee8cc1Swenshuai.xi 
1176*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1177*53ee8cc1Swenshuai.xi //  Global Functions
1178*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
HAL_VPU_EX_TaskCreate(MS_U32 u32Id,VPU_EX_NDecInitPara * pInitPara)1179*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_TaskCreate(MS_U32 u32Id, VPU_EX_NDecInitPara *pInitPara)
1180*53ee8cc1Swenshuai.xi {
1181*53ee8cc1Swenshuai.xi     VPU_EX_TaskInfo *pTaskInfo  = pInitPara->pTaskInfo;
1182*53ee8cc1Swenshuai.xi     MS_U8 u8Offset              = _VPU_EX_GetOffsetIdx(u32Id);
1183*53ee8cc1Swenshuai.xi     HVD_User_Cmd eCmd           = E_HVD_CMD_INVALID_CMD;
1184*53ee8cc1Swenshuai.xi     VPU_EX_DecoderType eDecType = E_VPU_EX_DECODER_NONE;
1185*53ee8cc1Swenshuai.xi     MS_U32 u32Arg = 0xFFFFFFFF;
1186*53ee8cc1Swenshuai.xi     MS_U32 u32Timeout = 0;
1187*53ee8cc1Swenshuai.xi     HVD_Return eCtrlRet = E_HVD_RETURN_FAIL;
1188*53ee8cc1Swenshuai.xi     MS_U32 u32CmdArg = 0;
1189*53ee8cc1Swenshuai.xi     struct _ctl_info *ctl_ptr = (struct _ctl_info *)
1190*53ee8cc1Swenshuai.xi                     MsOS_PA2KSEG1(MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr) + CTL_INFO_ADDR);
1191*53ee8cc1Swenshuai.xi 
1192*53ee8cc1Swenshuai.xi     _HAL_VPU_Entry();
1193*53ee8cc1Swenshuai.xi     //Check FW buffer size
1194*53ee8cc1Swenshuai.xi     if (1 == u8Offset)
1195*53ee8cc1Swenshuai.xi     {
1196*53ee8cc1Swenshuai.xi         MS_VIRT u32MinFWBuffSize = (u8Offset + 1) * VPU_FW_MEM_OFFSET;
1197*53ee8cc1Swenshuai.xi         MS_VIRT u32CurFWBuffSize = pInitPara->pFWCodeCfg->u32DstSize;
1198*53ee8cc1Swenshuai.xi 
1199*53ee8cc1Swenshuai.xi         if (u32CurFWBuffSize < u32MinFWBuffSize)
1200*53ee8cc1Swenshuai.xi         {
1201*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("FW BuffSize(0x%lx < 0x%lx) is too small!\n", u32CurFWBuffSize, u32MinFWBuffSize);
1202*53ee8cc1Swenshuai.xi             _HAL_VPU_Release();
1203*53ee8cc1Swenshuai.xi             return FALSE;
1204*53ee8cc1Swenshuai.xi         }
1205*53ee8cc1Swenshuai.xi     }
1206*53ee8cc1Swenshuai.xi 
1207*53ee8cc1Swenshuai.xi     if (0 == pVPUHalContext->u8TaskCnt)
1208*53ee8cc1Swenshuai.xi     {
1209*53ee8cc1Swenshuai.xi         //No task is created, need to load f/w, etc.
1210*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("u8TaskCnt=%d\n", pVPUHalContext->u8TaskCnt);
1211*53ee8cc1Swenshuai.xi 
1212*53ee8cc1Swenshuai.xi         if (!_VPU_EX_InitAll(pInitPara))
1213*53ee8cc1Swenshuai.xi         {
1214*53ee8cc1Swenshuai.xi             VPU_MSG_DBG("(%d) fail to InitAll\n", __LINE__);
1215*53ee8cc1Swenshuai.xi             _HAL_VPU_Release();
1216*53ee8cc1Swenshuai.xi             return FALSE;
1217*53ee8cc1Swenshuai.xi         }
1218*53ee8cc1Swenshuai.xi 
1219*53ee8cc1Swenshuai.xi         //Check if controller finish initialization: clear mailbox, etc.
1220*53ee8cc1Swenshuai.xi         //Need to check it before sending any controller commands!
1221*53ee8cc1Swenshuai.xi         u32Timeout = HVD_GetSysTime_ms() + VPU_CMD_TIMEOUT;
1222*53ee8cc1Swenshuai.xi         while (CTL_STU_NONE == ctl_ptr->statue)
1223*53ee8cc1Swenshuai.xi         {
1224*53ee8cc1Swenshuai.xi             if (HVD_GetSysTime_ms() > u32Timeout)
1225*53ee8cc1Swenshuai.xi             {
1226*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("Ctl init timeout, st=%x\n", ctl_ptr->statue);
1227*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("version=0x%x, statue=0x%x, last_ctl_cmd=0x%x, last_ctl_arg=0x%x, t0=%d, t1=%d\n",
1228*53ee8cc1Swenshuai.xi                      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]);
1229*53ee8cc1Swenshuai.xi                 MS_U32 t=0;
1230*53ee8cc1Swenshuai.xi                 for (t=0; t<30; t++)
1231*53ee8cc1Swenshuai.xi                 {
1232*53ee8cc1Swenshuai.xi                     VPU_MSG_DBG("_pc=0x%x\n", HAL_VPU_EX_GetProgCnt());
1233*53ee8cc1Swenshuai.xi                 }
1234*53ee8cc1Swenshuai.xi                 _HAL_VPU_Release();
1235*53ee8cc1Swenshuai.xi                 return FALSE;
1236*53ee8cc1Swenshuai.xi             }
1237*53ee8cc1Swenshuai.xi 
1238*53ee8cc1Swenshuai.xi             MsOS_ReadMemory();
1239*53ee8cc1Swenshuai.xi         }
1240*53ee8cc1Swenshuai.xi 
1241*53ee8cc1Swenshuai.xi         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",
1242*53ee8cc1Swenshuai.xi              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]);
1243*53ee8cc1Swenshuai.xi 
1244*53ee8cc1Swenshuai.xi     }
1245*53ee8cc1Swenshuai.xi     else
1246*53ee8cc1Swenshuai.xi     {
1247*53ee8cc1Swenshuai.xi         if (pVPUHalContext->_bVPUSingleMode)
1248*53ee8cc1Swenshuai.xi         {
1249*53ee8cc1Swenshuai.xi             //Show error message
1250*53ee8cc1Swenshuai.xi             printf("This task will use dram instead of sram!!!\n");
1251*53ee8cc1Swenshuai.xi             VPU_MSG_INFO("VDEC warn: this task will use dram instead of sram!!!\n");
1252*53ee8cc1Swenshuai.xi         }
1253*53ee8cc1Swenshuai.xi 
1254*53ee8cc1Swenshuai.xi         if (!_VPU_EX_InitHW(pInitPara->pTaskInfo))
1255*53ee8cc1Swenshuai.xi         {
1256*53ee8cc1Swenshuai.xi             VPU_MSG_DBG("(%d) fail to InitHW\n", __LINE__);
1257*53ee8cc1Swenshuai.xi             _HAL_VPU_Release();
1258*53ee8cc1Swenshuai.xi             return FALSE;
1259*53ee8cc1Swenshuai.xi         }
1260*53ee8cc1Swenshuai.xi         if (pInitPara->pVLCCfg)
1261*53ee8cc1Swenshuai.xi         {
1262*53ee8cc1Swenshuai.xi             if (!_VPU_EX_LoadVLCTable(pInitPara->pVLCCfg, pInitPara->pFWCodeCfg->u8SrcType))
1263*53ee8cc1Swenshuai.xi             {
1264*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("HAL_VPU_LoadVLCTable fail!\n");
1265*53ee8cc1Swenshuai.xi                 _HAL_VPU_Release();
1266*53ee8cc1Swenshuai.xi                 return FALSE;
1267*53ee8cc1Swenshuai.xi             }
1268*53ee8cc1Swenshuai.xi         }
1269*53ee8cc1Swenshuai.xi     }
1270*53ee8cc1Swenshuai.xi 
1271*53ee8cc1Swenshuai.xi     #if 1  // For TEE
1272*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
1273*53ee8cc1Swenshuai.xi     {
1274*53ee8cc1Swenshuai.xi         MS_U32 u32FWPhyAddr = MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr);
1275*53ee8cc1Swenshuai.xi 
1276*53ee8cc1Swenshuai.xi         if (pVPUHalContext->u32FWShareInfoAddr[u8Offset] == 0xFFFFFFFF)
1277*53ee8cc1Swenshuai.xi         {
1278*53ee8cc1Swenshuai.xi             ctl_ptr->u32TaskShareInfoAddr[u8Offset] = 0xFFFFFFFF;
1279*53ee8cc1Swenshuai.xi         }
1280*53ee8cc1Swenshuai.xi         else
1281*53ee8cc1Swenshuai.xi         {
1282*53ee8cc1Swenshuai.xi             ctl_ptr->u32TaskShareInfoAddr[u8Offset] = pVPUHalContext->u32FWShareInfoAddr[u8Offset] - u32FWPhyAddr;
1283*53ee8cc1Swenshuai.xi         }
1284*53ee8cc1Swenshuai.xi 
1285*53ee8cc1Swenshuai.xi         MsOS_FlushMemory();
1286*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("task share info offset = 0x%x\n", ctl_ptr->u32TaskShareInfoAddr[u8Offset]);
1287*53ee8cc1Swenshuai.xi 
1288*53ee8cc1Swenshuai.xi         ///printf("DRV side,      share info offset = 0x%lx\n", pVPUHalContext->u32FWShareInfoAddr[u8Offset]);
1289*53ee8cc1Swenshuai.xi         ///printf("FW side,  task share info offset = 0x%x\n", ctl_ptr->u32TaskShareInfoAddr[u8Offset]);
1290*53ee8cc1Swenshuai.xi     }
1291*53ee8cc1Swenshuai.xi     #endif
1292*53ee8cc1Swenshuai.xi 
1293*53ee8cc1Swenshuai.xi     if ((TRUE==pVPUHalContext->_bVPUSingleMode) || (E_VPU_DEC_MODE_SINGLE==pVPUHalContext->_stVPUDecMode.u8DecMod))
1294*53ee8cc1Swenshuai.xi     {
1295*53ee8cc1Swenshuai.xi         //Issue E_DUAL_CMD_SINGLE_TASK to FW controller
1296*53ee8cc1Swenshuai.xi         //arg=1 to get better performance for single task
1297*53ee8cc1Swenshuai.xi         u32CmdArg = (pVPUHalContext->_bVPUSingleMode) ? 1 : 0;
1298*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("Issue E_DUAL_CMD_SINGLE_TASK to FW controller arg=%x\n", u32CmdArg);
1299*53ee8cc1Swenshuai.xi         eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_CMD_SINGLE_TASK, u32CmdArg);
1300*53ee8cc1Swenshuai.xi         if (E_HVD_RETURN_SUCCESS != eCtrlRet)
1301*53ee8cc1Swenshuai.xi         {
1302*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("E_DUAL_CMD_SINGLE_TASK NG eCtrlRet=%x\n", eCtrlRet);
1303*53ee8cc1Swenshuai.xi         }
1304*53ee8cc1Swenshuai.xi     }
1305*53ee8cc1Swenshuai.xi     else if (E_VPU_DEC_MODE_DUAL_3D==pVPUHalContext->_stVPUDecMode.u8DecMod)
1306*53ee8cc1Swenshuai.xi     {
1307*53ee8cc1Swenshuai.xi         if(pVPUHalContext->_stVPUDecMode.u8CodecType[0] != pVPUHalContext->_stVPUDecMode.u8CodecType[1])
1308*53ee8cc1Swenshuai.xi         {
1309*53ee8cc1Swenshuai.xi             switch (pVPUHalContext->_stVPUDecMode.u32Arg)
1310*53ee8cc1Swenshuai.xi             {
1311*53ee8cc1Swenshuai.xi                 case E_VPU_CMD_MODE_KR3D_INTERLACE:
1312*53ee8cc1Swenshuai.xi                     u32CmdArg = CTL_MODE_3DTV;
1313*53ee8cc1Swenshuai.xi                     break;
1314*53ee8cc1Swenshuai.xi                 case E_VPU_CMD_MODE_KR3D_FORCE_P:
1315*53ee8cc1Swenshuai.xi                     u32CmdArg = CTL_MODE_3DTV_PROG;
1316*53ee8cc1Swenshuai.xi                     break;
1317*53ee8cc1Swenshuai.xi                 case E_VPU_CMD_MODE_KR3D_INTERLACE_TWO_PITCH:
1318*53ee8cc1Swenshuai.xi                     u32CmdArg = CTL_MODE_3DTV_TWO_PITCH;
1319*53ee8cc1Swenshuai.xi                     break;
1320*53ee8cc1Swenshuai.xi                 case E_VPU_CMD_MODE_KR3D_FORCE_P_TWO_PITCH:
1321*53ee8cc1Swenshuai.xi                     u32CmdArg = CTL_MODE_3DTV_PROG_TWO_PITCH;
1322*53ee8cc1Swenshuai.xi                     break;
1323*53ee8cc1Swenshuai.xi                 default:
1324*53ee8cc1Swenshuai.xi                     u32CmdArg = CTL_MODE_3DTV;
1325*53ee8cc1Swenshuai.xi                     VPU_MSG_INFO("%x not defined, use CTL_MODE_3DTV for KR3D\n", pVPUHalContext->_stVPUDecMode.u32Arg);
1326*53ee8cc1Swenshuai.xi                     break;
1327*53ee8cc1Swenshuai.xi             }
1328*53ee8cc1Swenshuai.xi         }
1329*53ee8cc1Swenshuai.xi         else
1330*53ee8cc1Swenshuai.xi         {
1331*53ee8cc1Swenshuai.xi             u32CmdArg = CTL_MODE_3DWMV;
1332*53ee8cc1Swenshuai.xi         }
1333*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("Issue E_DUAL_CMD_MODE to FW controller arg=%x\n", u32CmdArg);
1334*53ee8cc1Swenshuai.xi         eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_CMD_MODE, u32CmdArg);
1335*53ee8cc1Swenshuai.xi         if (E_HVD_RETURN_SUCCESS != eCtrlRet)
1336*53ee8cc1Swenshuai.xi         {
1337*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("E_DUAL_CMD_MODE NG eCtrlRet=%x\n", eCtrlRet);
1338*53ee8cc1Swenshuai.xi         }
1339*53ee8cc1Swenshuai.xi     }
1340*53ee8cc1Swenshuai.xi     else if(E_VPU_DEC_MODE_DUAL_INDIE == pVPUHalContext->_stVPUDecMode.u8DecMod)
1341*53ee8cc1Swenshuai.xi     {
1342*53ee8cc1Swenshuai.xi         if(E_VPU_CMD_MODE_PIP_SYNC_MAIN_STC == pVPUHalContext->_stVPUDecMode.u32Arg)
1343*53ee8cc1Swenshuai.xi         {
1344*53ee8cc1Swenshuai.xi             u32CmdArg = CTL_MODE_ONE_STC;
1345*53ee8cc1Swenshuai.xi         }
1346*53ee8cc1Swenshuai.xi         else
1347*53ee8cc1Swenshuai.xi         {
1348*53ee8cc1Swenshuai.xi             u32CmdArg = (pVPUHalContext->_stVPUDecMode.u32Arg==E_VPU_CMD_MODE_PIP_SYNC_SWITCH) ? CTL_MODE_SWITCH_STC : CTL_MODE_NORMAL;
1349*53ee8cc1Swenshuai.xi         }
1350*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("Issue E_DUAL_CMD_MODE to FW controller arg=%x\n", u32CmdArg);
1351*53ee8cc1Swenshuai.xi         eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_CMD_MODE, u32CmdArg);
1352*53ee8cc1Swenshuai.xi         if (E_HVD_RETURN_SUCCESS != eCtrlRet)
1353*53ee8cc1Swenshuai.xi         {
1354*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("E_DUAL_CMD_MODE NG eCtrlRet=%x\n", eCtrlRet);
1355*53ee8cc1Swenshuai.xi         }
1356*53ee8cc1Swenshuai.xi     }
1357*53ee8cc1Swenshuai.xi     // Set heap size for current task
1358*53ee8cc1Swenshuai.xi     ctl_ptr->heap_size[u8Offset] = pInitPara->pTaskInfo->u32HeapSize;
1359*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
1360*53ee8cc1Swenshuai.xi 
1361*53ee8cc1Swenshuai.xi     eCmd = _VPU_EX_MapCtrlCmd(pTaskInfo);
1362*53ee8cc1Swenshuai.xi #if defined(SUPPORT_NEW_MEM_LAYOUT)
1363*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
1364*53ee8cc1Swenshuai.xi         u32Arg = u8Offset * VPU_FW_MEM_OFFSET + OFFSET_BASE;
1365*53ee8cc1Swenshuai.xi     else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
1366*53ee8cc1Swenshuai.xi         u32Arg = u8Offset * VPU_FW_MEM_OFFSET + HVD_SHARE_MEM_ST_OFFSET;
1367*53ee8cc1Swenshuai.xi     else
1368*53ee8cc1Swenshuai.xi     {
1369*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Can't find eDecType! %d\n", pTaskInfo->eDecType);
1370*53ee8cc1Swenshuai.xi         _HAL_VPU_Release();
1371*53ee8cc1Swenshuai.xi         return FALSE;
1372*53ee8cc1Swenshuai.xi     }
1373*53ee8cc1Swenshuai.xi #else
1374*53ee8cc1Swenshuai.xi     u32Arg = u8Offset * VPU_FW_MEM_OFFSET;
1375*53ee8cc1Swenshuai.xi #endif
1376*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetCmd(u32Id, eCmd, u32Arg);
1377*53ee8cc1Swenshuai.xi 
1378*53ee8cc1Swenshuai.xi     MsOS_ReadMemory();
1379*53ee8cc1Swenshuai.xi     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",
1380*53ee8cc1Swenshuai.xi          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]);
1381*53ee8cc1Swenshuai.xi 
1382*53ee8cc1Swenshuai.xi     u32Timeout = HVD_GetSysTime_ms() + VPU_CMD_TIMEOUT;
1383*53ee8cc1Swenshuai.xi     while (CTL_TASK_CMDRDY != ctl_ptr->task_statue[u8Offset])
1384*53ee8cc1Swenshuai.xi     {
1385*53ee8cc1Swenshuai.xi         if (HVD_GetSysTime_ms() > u32Timeout)
1386*53ee8cc1Swenshuai.xi         {
1387*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("Task %d creation timeout\n", u8Offset);
1388*53ee8cc1Swenshuai.xi             MS_U32 t=0;
1389*53ee8cc1Swenshuai.xi             for (t=0; t<30; t++)
1390*53ee8cc1Swenshuai.xi             {
1391*53ee8cc1Swenshuai.xi                 VPU_MSG_DBG("_pc=0x%x\n", HAL_VPU_EX_GetProgCnt());
1392*53ee8cc1Swenshuai.xi             }
1393*53ee8cc1Swenshuai.xi 
1394*53ee8cc1Swenshuai.xi             pVPUHalContext->bVpuExLoadFWRlt = FALSE; ///error handling
1395*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("set bVpuExLoadFWRlt as FALSE\n\n");
1396*53ee8cc1Swenshuai.xi             _HAL_VPU_Release();
1397*53ee8cc1Swenshuai.xi             return FALSE;
1398*53ee8cc1Swenshuai.xi         }
1399*53ee8cc1Swenshuai.xi 
1400*53ee8cc1Swenshuai.xi         MsOS_ReadMemory();
1401*53ee8cc1Swenshuai.xi     }
1402*53ee8cc1Swenshuai.xi 
1403*53ee8cc1Swenshuai.xi     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",
1404*53ee8cc1Swenshuai.xi          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]);
1405*53ee8cc1Swenshuai.xi 
1406*53ee8cc1Swenshuai.xi 
1407*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
1408*53ee8cc1Swenshuai.xi     {
1409*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetBufferAddr(u32Id);
1410*53ee8cc1Swenshuai.xi     }
1411*53ee8cc1Swenshuai.xi 
1412*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
1413*53ee8cc1Swenshuai.xi     {
1414*53ee8cc1Swenshuai.xi         eDecType = E_VPU_EX_DECODER_MVD;
1415*53ee8cc1Swenshuai.xi     }
1416*53ee8cc1Swenshuai.xi     else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
1417*53ee8cc1Swenshuai.xi     {
1418*53ee8cc1Swenshuai.xi         eDecType = E_VPU_EX_DECODER_HVD;
1419*53ee8cc1Swenshuai.xi     }
1420*53ee8cc1Swenshuai.xi     else
1421*53ee8cc1Swenshuai.xi     {
1422*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Can't find eDecType! %d\n", pTaskInfo->eDecType);
1423*53ee8cc1Swenshuai.xi         _HAL_VPU_Release();
1424*53ee8cc1Swenshuai.xi         return FALSE;
1425*53ee8cc1Swenshuai.xi     }
1426*53ee8cc1Swenshuai.xi 
1427*53ee8cc1Swenshuai.xi     if (pTaskInfo->eDecType != eDecType)
1428*53ee8cc1Swenshuai.xi     {
1429*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("warning pTaskInfo->eDecType=%x not %x\n",
1430*53ee8cc1Swenshuai.xi             pTaskInfo->eDecType, eDecType);
1431*53ee8cc1Swenshuai.xi     }
1432*53ee8cc1Swenshuai.xi     goto _SAVE_DEC_TYPE;
1433*53ee8cc1Swenshuai.xi 
1434*53ee8cc1Swenshuai.xi _SAVE_DEC_TYPE:
1435*53ee8cc1Swenshuai.xi     if (pVPUHalContext->_stVPUStream[u8Offset].eStreamId == (u32Id & 0xFF))
1436*53ee8cc1Swenshuai.xi     {
1437*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUStream[u8Offset].eDecodertype = eDecType;
1438*53ee8cc1Swenshuai.xi     }
1439*53ee8cc1Swenshuai.xi     else
1440*53ee8cc1Swenshuai.xi     {
1441*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Cannot save eDecType!!\n");
1442*53ee8cc1Swenshuai.xi     }
1443*53ee8cc1Swenshuai.xi 
1444*53ee8cc1Swenshuai.xi     (pVPUHalContext->u8TaskCnt)++;
1445*53ee8cc1Swenshuai.xi     _HAL_VPU_Release();
1446*53ee8cc1Swenshuai.xi     return TRUE;
1447*53ee8cc1Swenshuai.xi }
1448*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_TaskDelete(MS_U32 u32Id,VPU_EX_NDecInitPara * pInitPara)1449*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_TaskDelete(MS_U32 u32Id, VPU_EX_NDecInitPara *pInitPara)
1450*53ee8cc1Swenshuai.xi {
1451*53ee8cc1Swenshuai.xi     HVD_Return eRet;
1452*53ee8cc1Swenshuai.xi     HVD_User_Cmd eCmd = E_DUAL_CMD_DEL_TASK;
1453*53ee8cc1Swenshuai.xi     MS_U8 u8OffsetIdx = _VPU_EX_GetOffsetIdx(u32Id);
1454*53ee8cc1Swenshuai.xi     MS_U32 u32Timeout       = HVD_GetSysTime_ms() + 3000;
1455*53ee8cc1Swenshuai.xi 
1456*53ee8cc1Swenshuai.xi     _HAL_VPU_Entry();
1457*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("DecType=%d\n", pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype);
1458*53ee8cc1Swenshuai.xi 
1459*53ee8cc1Swenshuai.xi     eRet = HAL_HVD_EX_SetCmd(u32Id, eCmd, u8OffsetIdx);
1460*53ee8cc1Swenshuai.xi     if(eRet != E_HVD_RETURN_SUCCESS)
1461*53ee8cc1Swenshuai.xi     {
1462*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("VPU fail to DEL Task %d\n", eRet);
1463*53ee8cc1Swenshuai.xi     }
1464*53ee8cc1Swenshuai.xi 
1465*53ee8cc1Swenshuai.xi     {
1466*53ee8cc1Swenshuai.xi         struct _ctl_info *ctl_ptr = (struct _ctl_info *)
1467*53ee8cc1Swenshuai.xi             MsOS_PA2KSEG1(MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr) + CTL_INFO_ADDR);
1468*53ee8cc1Swenshuai.xi         u32Timeout = HVD_GetSysTime_ms() + VPU_CMD_TIMEOUT;
1469*53ee8cc1Swenshuai.xi 
1470*53ee8cc1Swenshuai.xi         MsOS_ReadMemory();
1471*53ee8cc1Swenshuai.xi 
1472*53ee8cc1Swenshuai.xi         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",
1473*53ee8cc1Swenshuai.xi             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]);
1474*53ee8cc1Swenshuai.xi 
1475*53ee8cc1Swenshuai.xi         while (CTL_TASK_NONE != ctl_ptr->task_statue[u8OffsetIdx])
1476*53ee8cc1Swenshuai.xi         {
1477*53ee8cc1Swenshuai.xi             if (HVD_GetSysTime_ms() > u32Timeout)
1478*53ee8cc1Swenshuai.xi             {
1479*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("Task %u deletion timeout\n", u8OffsetIdx);
1480*53ee8cc1Swenshuai.xi                 pVPUHalContext->bVpuExLoadFWRlt = FALSE; ///error handling
1481*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("Set bVpuExLoadFWRlt as FALSE\n");
1482*53ee8cc1Swenshuai.xi 
1483*53ee8cc1Swenshuai.xi                 if(pVPUHalContext->u8TaskCnt == 1)
1484*53ee8cc1Swenshuai.xi                 {
1485*53ee8cc1Swenshuai.xi                     VPU_MSG_ERR("Due to one task remain, driver can force delete task\n");
1486*53ee8cc1Swenshuai.xi                     break;
1487*53ee8cc1Swenshuai.xi                 }
1488*53ee8cc1Swenshuai.xi                 else if(pVPUHalContext->u8TaskCnt == 2)
1489*53ee8cc1Swenshuai.xi                 {
1490*53ee8cc1Swenshuai.xi                     VPU_MSG_ERR("Due to two tasks remain, driver can't force delete task\n");
1491*53ee8cc1Swenshuai.xi                     _HAL_VPU_Release();
1492*53ee8cc1Swenshuai.xi                     return FALSE;
1493*53ee8cc1Swenshuai.xi                 }
1494*53ee8cc1Swenshuai.xi                 else
1495*53ee8cc1Swenshuai.xi                 {
1496*53ee8cc1Swenshuai.xi                     VPU_MSG_ERR("Task number is not correct\n");
1497*53ee8cc1Swenshuai.xi                     _HAL_VPU_Release();
1498*53ee8cc1Swenshuai.xi                     return FALSE;
1499*53ee8cc1Swenshuai.xi                 }
1500*53ee8cc1Swenshuai.xi             }
1501*53ee8cc1Swenshuai.xi 
1502*53ee8cc1Swenshuai.xi             MsOS_ReadMemory();
1503*53ee8cc1Swenshuai.xi         }
1504*53ee8cc1Swenshuai.xi 
1505*53ee8cc1Swenshuai.xi         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",
1506*53ee8cc1Swenshuai.xi             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]);
1507*53ee8cc1Swenshuai.xi     }
1508*53ee8cc1Swenshuai.xi 
1509*53ee8cc1Swenshuai.xi     pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype = E_VPU_EX_DECODER_NONE;
1510*53ee8cc1Swenshuai.xi     if( (u8OffsetIdx == 0) && (pVPUHalContext->_stVPUStream[u8OffsetIdx].eStreamId == E_HAL_VPU_MVC_MAIN_VIEW))
1511*53ee8cc1Swenshuai.xi     {
1512*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUStream[u8OffsetIdx].eStreamId = E_HAL_VPU_MAIN_STREAM0;
1513*53ee8cc1Swenshuai.xi     }
1514*53ee8cc1Swenshuai.xi 
1515*53ee8cc1Swenshuai.xi     if (pVPUHalContext->u8TaskCnt)
1516*53ee8cc1Swenshuai.xi     {
1517*53ee8cc1Swenshuai.xi         (pVPUHalContext->u8TaskCnt)--;
1518*53ee8cc1Swenshuai.xi     }
1519*53ee8cc1Swenshuai.xi     else
1520*53ee8cc1Swenshuai.xi     {
1521*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("Warning: u8TaskCnt=0\n");
1522*53ee8cc1Swenshuai.xi     }
1523*53ee8cc1Swenshuai.xi 
1524*53ee8cc1Swenshuai.xi     if (0 == pVPUHalContext->u8TaskCnt)
1525*53ee8cc1Swenshuai.xi     {
1526*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("u8TaskCnt=%d time to terminate\n", pVPUHalContext->u8TaskCnt);
1527*53ee8cc1Swenshuai.xi         _VPU_EX_DeinitAll();
1528*53ee8cc1Swenshuai.xi         HAL_VPU_EX_SetSingleDecodeMode(FALSE);
1529*53ee8cc1Swenshuai.xi         pVPUHalContext->u32VPUSHMAddr = 0;
1530*53ee8cc1Swenshuai.xi         pVPUHalContext->u32FWShareInfoAddr[0] = 0xFFFFFFFF;
1531*53ee8cc1Swenshuai.xi         pVPUHalContext->u32FWShareInfoAddr[1] = 0xFFFFFFFF;
1532*53ee8cc1Swenshuai.xi         pVPUHalContext->u32FWShareInfoAddr[2] = 0xFFFFFFFF;
1533*53ee8cc1Swenshuai.xi         pVPUHalContext->u32FWShareInfoAddr[3] = 0xFFFFFFFF;
1534*53ee8cc1Swenshuai.xi     }
1535*53ee8cc1Swenshuai.xi     else
1536*53ee8cc1Swenshuai.xi     {
1537*53ee8cc1Swenshuai.xi         pVPUHalContext->u32FWShareInfoAddr[u8OffsetIdx] = 0xFFFFFFFF;
1538*53ee8cc1Swenshuai.xi         _VPU_EX_DeinitHW();
1539*53ee8cc1Swenshuai.xi     }
1540*53ee8cc1Swenshuai.xi 
1541*53ee8cc1Swenshuai.xi     _HAL_VPU_Release();
1542*53ee8cc1Swenshuai.xi     return TRUE;
1543*53ee8cc1Swenshuai.xi }
1544*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_LoadCode(VPU_EX_FWCodeCfg * pFWCodeCfg)1545*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_LoadCode(VPU_EX_FWCodeCfg *pFWCodeCfg)
1546*53ee8cc1Swenshuai.xi {
1547*53ee8cc1Swenshuai.xi     MS_VIRT u32DestAddr  = pFWCodeCfg->u32DstAddr;
1548*53ee8cc1Swenshuai.xi     MS_VIRT u32BinAddr   = pFWCodeCfg->u32BinAddr;
1549*53ee8cc1Swenshuai.xi     MS_VIRT u32Size      = pFWCodeCfg->u32BinSize;
1550*53ee8cc1Swenshuai.xi #if (ENABLE_DECOMPRESS_FUNCTION==TRUE)
1551*53ee8cc1Swenshuai.xi     MS_U32 u32DestSize  = pFWCodeCfg->u32DstSize;
1552*53ee8cc1Swenshuai.xi #endif
1553*53ee8cc1Swenshuai.xi 
1554*53ee8cc1Swenshuai.xi     if (FALSE == HAL_VPU_EX_GetFWReload())
1555*53ee8cc1Swenshuai.xi     {
1556*53ee8cc1Swenshuai.xi         //printf("%s bFWReload FALSE!!!\n", __FUNCTION__);
1557*53ee8cc1Swenshuai.xi         if (FALSE == pVPUHalContext->bVpuExLoadFWRlt)
1558*53ee8cc1Swenshuai.xi         {
1559*53ee8cc1Swenshuai.xi             VPU_MSG_INFO("Never load fw successfully, load it anyway!\n");
1560*53ee8cc1Swenshuai.xi         }
1561*53ee8cc1Swenshuai.xi         else
1562*53ee8cc1Swenshuai.xi         {
1563*53ee8cc1Swenshuai.xi             //Check f/w prefix "VDEC20"
1564*53ee8cc1Swenshuai.xi             if (_VPU_EX_IsNeedDecompress(u32DestAddr)!=FALSE)
1565*53ee8cc1Swenshuai.xi             {
1566*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("Wrong prefix: reload fw!\n");
1567*53ee8cc1Swenshuai.xi             }
1568*53ee8cc1Swenshuai.xi             else
1569*53ee8cc1Swenshuai.xi             {
1570*53ee8cc1Swenshuai.xi                 VPU_MSG_INFO("Skip loading fw this time!!!\n");
1571*53ee8cc1Swenshuai.xi                 return TRUE;
1572*53ee8cc1Swenshuai.xi             }
1573*53ee8cc1Swenshuai.xi         }
1574*53ee8cc1Swenshuai.xi     }
1575*53ee8cc1Swenshuai.xi 
1576*53ee8cc1Swenshuai.xi     if (E_HVD_FW_INPUT_SOURCE_FLASH == pFWCodeCfg->u8SrcType)
1577*53ee8cc1Swenshuai.xi     {
1578*53ee8cc1Swenshuai.xi #if VPU_ENABLE_BDMA_FW_FLASH_2_SDRAM
1579*53ee8cc1Swenshuai.xi         if (u32Size != 0)
1580*53ee8cc1Swenshuai.xi         {
1581*53ee8cc1Swenshuai.xi             SPIDMA_Dev cpyflag = E_SPIDMA_DEV_MIU1;
1582*53ee8cc1Swenshuai.xi 
1583*53ee8cc1Swenshuai.xi             if (HAL_MIU1_BASE <= MsOS_VA2PA(u32DestAddr))
1584*53ee8cc1Swenshuai.xi             {
1585*53ee8cc1Swenshuai.xi                 cpyflag = E_SPIDMA_DEV_MIU1;
1586*53ee8cc1Swenshuai.xi             }
1587*53ee8cc1Swenshuai.xi             else
1588*53ee8cc1Swenshuai.xi             {
1589*53ee8cc1Swenshuai.xi                 cpyflag = E_SPIDMA_DEV_MIU0;
1590*53ee8cc1Swenshuai.xi             }
1591*53ee8cc1Swenshuai.xi 
1592*53ee8cc1Swenshuai.xi             if (!HVD_FLASHcpy(MsOS_VA2PA(u32DestAddr), MsOS_VA2PA(u32BinAddr), u32Size, cpyflag))
1593*53ee8cc1Swenshuai.xi             {
1594*53ee8cc1Swenshuai.xi                 goto _load_code_fail;
1595*53ee8cc1Swenshuai.xi             }
1596*53ee8cc1Swenshuai.xi         }
1597*53ee8cc1Swenshuai.xi         else
1598*53ee8cc1Swenshuai.xi         {
1599*53ee8cc1Swenshuai.xi             goto _load_code_fail;
1600*53ee8cc1Swenshuai.xi         }
1601*53ee8cc1Swenshuai.xi #else
1602*53ee8cc1Swenshuai.xi         goto _load_code_fail;
1603*53ee8cc1Swenshuai.xi #endif
1604*53ee8cc1Swenshuai.xi     }
1605*53ee8cc1Swenshuai.xi     else if (E_HVD_FW_INPUT_SOURCE_DRAM == pFWCodeCfg->u8SrcType)
1606*53ee8cc1Swenshuai.xi     {
1607*53ee8cc1Swenshuai.xi         if (u32BinAddr != 0 && u32Size != 0)
1608*53ee8cc1Swenshuai.xi         {
1609*53ee8cc1Swenshuai.xi #if (ENABLE_DECOMPRESS_FUNCTION==TRUE)
1610*53ee8cc1Swenshuai.xi             if(_VPU_EX_DecompressBin(u32BinAddr, u32Size, u32DestAddr, u32DestAddr+u32DestSize-WINDOW_SIZE)==TRUE)
1611*53ee8cc1Swenshuai.xi             {
1612*53ee8cc1Swenshuai.xi                 if(_VPU_EX_IsNeedDecompress(u32DestAddr)==FALSE)
1613*53ee8cc1Swenshuai.xi                 {
1614*53ee8cc1Swenshuai.xi                     VPU_MSG_INFO("Decompress ok!!!\n");
1615*53ee8cc1Swenshuai.xi                 }
1616*53ee8cc1Swenshuai.xi                 else
1617*53ee8cc1Swenshuai.xi                 {
1618*53ee8cc1Swenshuai.xi                     VPU_MSG_INFO("Decompress fail!!!\n");
1619*53ee8cc1Swenshuai.xi                 }
1620*53ee8cc1Swenshuai.xi             }
1621*53ee8cc1Swenshuai.xi             else
1622*53ee8cc1Swenshuai.xi #endif
1623*53ee8cc1Swenshuai.xi             {
1624*53ee8cc1Swenshuai.xi                 HVD_memcpy(u32DestAddr, u32BinAddr, u32Size);
1625*53ee8cc1Swenshuai.xi             }
1626*53ee8cc1Swenshuai.xi         }
1627*53ee8cc1Swenshuai.xi         else
1628*53ee8cc1Swenshuai.xi         {
1629*53ee8cc1Swenshuai.xi             goto _load_code_fail;
1630*53ee8cc1Swenshuai.xi         }
1631*53ee8cc1Swenshuai.xi     }
1632*53ee8cc1Swenshuai.xi     else
1633*53ee8cc1Swenshuai.xi     {
1634*53ee8cc1Swenshuai.xi #if VPU_ENABLE_EMBEDDED_FW_BINARY
1635*53ee8cc1Swenshuai.xi         VPU_MSG_INFO("Load FW inD2D: dest=0x%lx, source=0x%lx, size=%d\n",
1636*53ee8cc1Swenshuai.xi                     u32DestAddr, ((MS_VIRT) u8HVD_FW_Binary),
1637*53ee8cc1Swenshuai.xi                     (MS_U32) sizeof(u8HVD_FW_Binary));
1638*53ee8cc1Swenshuai.xi 
1639*53ee8cc1Swenshuai.xi #if (ENABLE_DECOMPRESS_FUNCTION==TRUE)
1640*53ee8cc1Swenshuai.xi         if(_VPU_EX_DecompressBin((MS_VIRT)u8HVD_FW_Binary, (MS_VIRT)sizeof(u8HVD_FW_Binary), u32DestAddr, u32DestAddr+u32DestSize-WINDOW_SIZE)==TRUE)
1641*53ee8cc1Swenshuai.xi         {
1642*53ee8cc1Swenshuai.xi             if(_VPU_EX_IsNeedDecompress(u32DestAddr)==FALSE)
1643*53ee8cc1Swenshuai.xi             {
1644*53ee8cc1Swenshuai.xi                 VPU_MSG_INFO("Decompress ok!!!\n");
1645*53ee8cc1Swenshuai.xi             }
1646*53ee8cc1Swenshuai.xi             else
1647*53ee8cc1Swenshuai.xi             {
1648*53ee8cc1Swenshuai.xi                 VPU_MSG_INFO("Decompress fail!!!\n");
1649*53ee8cc1Swenshuai.xi             }
1650*53ee8cc1Swenshuai.xi         }
1651*53ee8cc1Swenshuai.xi         else
1652*53ee8cc1Swenshuai.xi #endif
1653*53ee8cc1Swenshuai.xi         {
1654*53ee8cc1Swenshuai.xi             HVD_memcpy(u32DestAddr, (MS_VIRT)u8HVD_FW_Binary, sizeof(u8HVD_FW_Binary));
1655*53ee8cc1Swenshuai.xi         }
1656*53ee8cc1Swenshuai.xi #else
1657*53ee8cc1Swenshuai.xi         goto _load_code_fail;
1658*53ee8cc1Swenshuai.xi #endif
1659*53ee8cc1Swenshuai.xi     }
1660*53ee8cc1Swenshuai.xi 
1661*53ee8cc1Swenshuai.xi     MAsm_CPU_Sync();
1662*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
1663*53ee8cc1Swenshuai.xi 
1664*53ee8cc1Swenshuai.xi     if (FALSE == (*((MS_U8*)(u32DestAddr+6))=='R' && *((MS_U8*)(u32DestAddr+7))=='2'))
1665*53ee8cc1Swenshuai.xi     {
1666*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("FW is not R2 version! _%x_ _%x_\n", *(MS_U8*)(u32DestAddr+6), *(MS_U8*)(u32DestAddr+7));
1667*53ee8cc1Swenshuai.xi         goto _load_code_fail;
1668*53ee8cc1Swenshuai.xi     }
1669*53ee8cc1Swenshuai.xi 
1670*53ee8cc1Swenshuai.xi     pVPUHalContext->bVpuExLoadFWRlt = TRUE;
1671*53ee8cc1Swenshuai.xi     return TRUE;
1672*53ee8cc1Swenshuai.xi 
1673*53ee8cc1Swenshuai.xi _load_code_fail:
1674*53ee8cc1Swenshuai.xi     pVPUHalContext->bVpuExLoadFWRlt = FALSE;
1675*53ee8cc1Swenshuai.xi     return FALSE;
1676*53ee8cc1Swenshuai.xi }
1677*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_InitRegBase(MS_VIRT u32RegBase)1678*53ee8cc1Swenshuai.xi void HAL_VPU_EX_InitRegBase(MS_VIRT u32RegBase)
1679*53ee8cc1Swenshuai.xi {
1680*53ee8cc1Swenshuai.xi     u32VPURegOSBase = u32RegBase;
1681*53ee8cc1Swenshuai.xi }
1682*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_Init_Share_Mem(void)1683*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_Init_Share_Mem(void)
1684*53ee8cc1Swenshuai.xi {
1685*53ee8cc1Swenshuai.xi #if ((defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_ECOS)) && (!defined(SUPPORT_X_MODEL_FEATURE)))
1686*53ee8cc1Swenshuai.xi 
1687*53ee8cc1Swenshuai.xi     MS_U32 u32ShmId;
1688*53ee8cc1Swenshuai.xi     MS_VIRT u32Addr;
1689*53ee8cc1Swenshuai.xi     MS_U32 u32BufSize;
1690*53ee8cc1Swenshuai.xi 
1691*53ee8cc1Swenshuai.xi 
1692*53ee8cc1Swenshuai.xi     if (FALSE == MsOS_SHM_GetId( (MS_U8*)"Linux HAL VPU",
1693*53ee8cc1Swenshuai.xi                                           sizeof(VPU_Hal_CTX),
1694*53ee8cc1Swenshuai.xi                                           &u32ShmId,
1695*53ee8cc1Swenshuai.xi                                           &u32Addr,
1696*53ee8cc1Swenshuai.xi                                           &u32BufSize,
1697*53ee8cc1Swenshuai.xi                                           MSOS_SHM_QUERY))
1698*53ee8cc1Swenshuai.xi     {
1699*53ee8cc1Swenshuai.xi         if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux HAL VPU",
1700*53ee8cc1Swenshuai.xi                                              sizeof(VPU_Hal_CTX),
1701*53ee8cc1Swenshuai.xi                                              &u32ShmId,
1702*53ee8cc1Swenshuai.xi                                              &u32Addr,
1703*53ee8cc1Swenshuai.xi                                              &u32BufSize,
1704*53ee8cc1Swenshuai.xi                                              MSOS_SHM_CREATE))
1705*53ee8cc1Swenshuai.xi         {
1706*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("[%s]SHM allocation failed!!!use global structure instead!!!\n",__FUNCTION__);
1707*53ee8cc1Swenshuai.xi             if(pVPUHalContext == NULL)
1708*53ee8cc1Swenshuai.xi             {
1709*53ee8cc1Swenshuai.xi                 pVPUHalContext = &gVPUHalContext;
1710*53ee8cc1Swenshuai.xi                 memset(pVPUHalContext,0,sizeof(VPU_Hal_CTX));
1711*53ee8cc1Swenshuai.xi                 _VPU_EX_Context_Init();
1712*53ee8cc1Swenshuai.xi                 printf("[%s]Global structure init Success!!!\n",__FUNCTION__);
1713*53ee8cc1Swenshuai.xi             }
1714*53ee8cc1Swenshuai.xi             else
1715*53ee8cc1Swenshuai.xi             {
1716*53ee8cc1Swenshuai.xi                 printf("[%s]Global structure exists!!!\n",__FUNCTION__);
1717*53ee8cc1Swenshuai.xi             }
1718*53ee8cc1Swenshuai.xi             //return FALSE;
1719*53ee8cc1Swenshuai.xi         }
1720*53ee8cc1Swenshuai.xi         else
1721*53ee8cc1Swenshuai.xi         {
1722*53ee8cc1Swenshuai.xi             memset((MS_U8*)u32Addr,0,sizeof(VPU_Hal_CTX));
1723*53ee8cc1Swenshuai.xi             pVPUHalContext = (VPU_Hal_CTX*)u32Addr; // for one process
1724*53ee8cc1Swenshuai.xi             _VPU_EX_Context_Init();
1725*53ee8cc1Swenshuai.xi         }
1726*53ee8cc1Swenshuai.xi     }
1727*53ee8cc1Swenshuai.xi     else
1728*53ee8cc1Swenshuai.xi     {
1729*53ee8cc1Swenshuai.xi         pVPUHalContext = (VPU_Hal_CTX*)u32Addr; // for another process
1730*53ee8cc1Swenshuai.xi     }
1731*53ee8cc1Swenshuai.xi #else
1732*53ee8cc1Swenshuai.xi     if(pVPUHalContext == NULL)
1733*53ee8cc1Swenshuai.xi     {
1734*53ee8cc1Swenshuai.xi         pVPUHalContext = &gVPUHalContext;
1735*53ee8cc1Swenshuai.xi         memset(pVPUHalContext,0,sizeof(VPU_Hal_CTX));
1736*53ee8cc1Swenshuai.xi         _VPU_EX_Context_Init();
1737*53ee8cc1Swenshuai.xi     }
1738*53ee8cc1Swenshuai.xi #endif
1739*53ee8cc1Swenshuai.xi 
1740*53ee8cc1Swenshuai.xi     return TRUE;
1741*53ee8cc1Swenshuai.xi 
1742*53ee8cc1Swenshuai.xi }
1743*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetFreeStream(HAL_VPU_StreamType eStreamType)1744*53ee8cc1Swenshuai.xi HAL_VPU_StreamId HAL_VPU_EX_GetFreeStream(HAL_VPU_StreamType eStreamType)
1745*53ee8cc1Swenshuai.xi {
1746*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
1747*53ee8cc1Swenshuai.xi 
1748*53ee8cc1Swenshuai.xi     _HAL_VPU_MutexCreate();
1749*53ee8cc1Swenshuai.xi 
1750*53ee8cc1Swenshuai.xi     if (E_HAL_VPU_MVC_STREAM == eStreamType)
1751*53ee8cc1Swenshuai.xi     {
1752*53ee8cc1Swenshuai.xi         if((E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[0].eDecodertype) && (E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[1].eDecodertype))
1753*53ee8cc1Swenshuai.xi         {
1754*53ee8cc1Swenshuai.xi             pVPUHalContext->_stVPUStream[0].eStreamId = E_HAL_VPU_MVC_MAIN_VIEW;
1755*53ee8cc1Swenshuai.xi             return pVPUHalContext->_stVPUStream[0].eStreamId;       /// Need to check
1756*53ee8cc1Swenshuai.xi         }
1757*53ee8cc1Swenshuai.xi     }
1758*53ee8cc1Swenshuai.xi     else if (E_HAL_VPU_MAIN_STREAM == eStreamType)
1759*53ee8cc1Swenshuai.xi     {
1760*53ee8cc1Swenshuai.xi         for (i = 0;i < MAX_SUPPORT_DECODER_NUM; i++)
1761*53ee8cc1Swenshuai.xi         {
1762*53ee8cc1Swenshuai.xi             if ((E_HAL_VPU_MAIN_STREAM_BASE & pVPUHalContext->_stVPUStream[i].eStreamId)
1763*53ee8cc1Swenshuai.xi                 && (E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[i].eDecodertype))
1764*53ee8cc1Swenshuai.xi             {
1765*53ee8cc1Swenshuai.xi                 return pVPUHalContext->_stVPUStream[i].eStreamId;
1766*53ee8cc1Swenshuai.xi             }
1767*53ee8cc1Swenshuai.xi         }
1768*53ee8cc1Swenshuai.xi     }
1769*53ee8cc1Swenshuai.xi     else if (E_HAL_VPU_SUB_STREAM == eStreamType)
1770*53ee8cc1Swenshuai.xi     {
1771*53ee8cc1Swenshuai.xi         for (i = 0;i < MAX_SUPPORT_DECODER_NUM; i++)
1772*53ee8cc1Swenshuai.xi         {
1773*53ee8cc1Swenshuai.xi             if ((E_HAL_VPU_SUB_STREAM_BASE & pVPUHalContext->_stVPUStream[i].eStreamId)
1774*53ee8cc1Swenshuai.xi                 && (E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[i].eDecodertype))
1775*53ee8cc1Swenshuai.xi             {
1776*53ee8cc1Swenshuai.xi                 return pVPUHalContext->_stVPUStream[i].eStreamId;
1777*53ee8cc1Swenshuai.xi             }
1778*53ee8cc1Swenshuai.xi         }
1779*53ee8cc1Swenshuai.xi     }
1780*53ee8cc1Swenshuai.xi 
1781*53ee8cc1Swenshuai.xi     return E_HAL_VPU_STREAM_NONE;
1782*53ee8cc1Swenshuai.xi }
1783*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_Init(VPU_EX_InitParam * InitParams)1784*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_Init(VPU_EX_InitParam *InitParams)
1785*53ee8cc1Swenshuai.xi {
1786*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("Inv=%d, clk=%d\n", InitParams->bClockInv, InitParams->eClockSpeed);
1787*53ee8cc1Swenshuai.xi 
1788*53ee8cc1Swenshuai.xi     // enable module
1789*53ee8cc1Swenshuai.xi     _VPU_EX_ClockInv(InitParams->bClockInv);
1790*53ee8cc1Swenshuai.xi     _VPU_EX_ClockSpeed(InitParams->eClockSpeed);
1791*53ee8cc1Swenshuai.xi     HAL_VPU_EX_PowerCtrl(TRUE);
1792*53ee8cc1Swenshuai.xi 
1793*53ee8cc1Swenshuai.xi #if 1                           //Create VPU's own mutex
1794*53ee8cc1Swenshuai.xi     //_HAL_VPU_MutexCreate();
1795*53ee8cc1Swenshuai.xi #else
1796*53ee8cc1Swenshuai.xi     pVPUHalContext->s32VPUMutexID = InitParams->s32VPUMutexID;
1797*53ee8cc1Swenshuai.xi     pVPUHalContext->u32VPUMutexTimeOut = InitParams->u32VPUMutexTimeout;
1798*53ee8cc1Swenshuai.xi #endif
1799*53ee8cc1Swenshuai.xi 
1800*53ee8cc1Swenshuai.xi     return TRUE;
1801*53ee8cc1Swenshuai.xi }
1802*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_DeInit(void)1803*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_DeInit(void)
1804*53ee8cc1Swenshuai.xi {
1805*53ee8cc1Swenshuai.xi     if (0 != _VPU_EX_GetActiveCodecCnt())
1806*53ee8cc1Swenshuai.xi     {
1807*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("do nothing since codec is active.\n");
1808*53ee8cc1Swenshuai.xi         return TRUE;
1809*53ee8cc1Swenshuai.xi     }
1810*53ee8cc1Swenshuai.xi 
1811*53ee8cc1Swenshuai.xi     memset(&(pVPUHalContext->_stVPUDecMode),0,sizeof(VPU_EX_DecModCfg));
1812*53ee8cc1Swenshuai.xi 
1813*53ee8cc1Swenshuai.xi     HAL_VPU_EX_PowerCtrl(FALSE);
1814*53ee8cc1Swenshuai.xi     HAL_VPU_EX_SwRelseMAU();
1815*53ee8cc1Swenshuai.xi     //_HAL_VPU_MutexDelete();
1816*53ee8cc1Swenshuai.xi 
1817*53ee8cc1Swenshuai.xi     return TRUE;
1818*53ee8cc1Swenshuai.xi }
1819*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_PowerCtrl(MS_BOOL bEnable)1820*53ee8cc1Swenshuai.xi void HAL_VPU_EX_PowerCtrl(MS_BOOL bEnable)
1821*53ee8cc1Swenshuai.xi {
1822*53ee8cc1Swenshuai.xi     if (bEnable)
1823*53ee8cc1Swenshuai.xi     {
1824*53ee8cc1Swenshuai.xi         _VPU_WriteWordMask(REG_TOP_VPU, 0, TOP_CKG_VPU_DIS);
1825*53ee8cc1Swenshuai.xi         pVPUHalContext->_bVPUPowered = TRUE;
1826*53ee8cc1Swenshuai.xi     }
1827*53ee8cc1Swenshuai.xi     else
1828*53ee8cc1Swenshuai.xi     {
1829*53ee8cc1Swenshuai.xi         _VPU_WriteWordMask(REG_TOP_VPU, TOP_CKG_VPU_DIS, TOP_CKG_VPU_DIS);
1830*53ee8cc1Swenshuai.xi         pVPUHalContext->_bVPUPowered = FALSE;
1831*53ee8cc1Swenshuai.xi     }
1832*53ee8cc1Swenshuai.xi }
1833*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_MIU_RW_Protect(MS_BOOL bEnable)1834*53ee8cc1Swenshuai.xi void HAL_VPU_EX_MIU_RW_Protect(MS_BOOL bEnable)
1835*53ee8cc1Swenshuai.xi {
1836*53ee8cc1Swenshuai.xi     _VPU_MIU_SetReqMask(VPU_D_RW, bEnable);
1837*53ee8cc1Swenshuai.xi     _VPU_MIU_SetReqMask(VPU_Q_RW, bEnable);
1838*53ee8cc1Swenshuai.xi     _VPU_MIU_SetReqMask(VPU_I_R, bEnable);
1839*53ee8cc1Swenshuai.xi     VPU_EX_TimerDelayMS(1);
1840*53ee8cc1Swenshuai.xi }
1841*53ee8cc1Swenshuai.xi 
1842*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
1843*53ee8cc1Swenshuai.xi /// config AVCH264 CPU
1844*53ee8cc1Swenshuai.xi /// @param u32StAddr \b IN: CPU binary code base address in DRAM.
1845*53ee8cc1Swenshuai.xi /// @param u8dlend_en \b IN: endian
1846*53ee8cc1Swenshuai.xi ///     - 1, little endian
1847*53ee8cc1Swenshuai.xi ///     - 0, big endian
1848*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_CPUSetting(MS_U32 u32StAddr)1849*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_CPUSetting(MS_U32 u32StAddr)
1850*53ee8cc1Swenshuai.xi {
1851*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
1852*53ee8cc1Swenshuai.xi     MS_U32 u32Offset = 0;
1853*53ee8cc1Swenshuai.xi     MS_U16 tempreg = 0;
1854*53ee8cc1Swenshuai.xi 
1855*53ee8cc1Swenshuai.xi     u32Offset = (u32StAddr >= HAL_MIU1_BASE) ? (u32StAddr-HAL_MIU1_BASE) : u32StAddr ;
1856*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_SPI_BASE,  0xC000);
1857*53ee8cc1Swenshuai.xi     _VPU_WriteWordMask( VPU_REG_CPU_SETTING , 0 , VPU_REG_CPU_SPI_BOOT );
1858*53ee8cc1Swenshuai.xi     _VPU_WriteWordMask( VPU_REG_CPU_SETTING , 0 , VPU_REG_CPU_SDRAM_BOOT );
1859*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_DQMEM_MASK_L,  0xc000);
1860*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_DQMEM_MASK_H,  0xffff);
1861*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_IO2_BASE,  0x8000);
1862*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_DQMEM_BASE_L,  0x0000);
1863*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_DQMEM_BASE_H, 0x2000);
1864*53ee8cc1Swenshuai.xi 
1865*53ee8cc1Swenshuai.xi 
1866*53ee8cc1Swenshuai.xi     if(u32StAddr >= HAL_MIU1_BASE)
1867*53ee8cc1Swenshuai.xi     {
1868*53ee8cc1Swenshuai.xi         // Data sram base Unit: byte address
1869*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_DCU_SDR_BASE_L, (MS_U16)((u32Offset | VPU_MIU1BASE_ADDR) & 0x0000ffff)) ;
1870*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_DCU_SDR_BASE_H, (MS_U16)(((u32Offset | VPU_MIU1BASE_ADDR)>>16) & 0xffff));
1871*53ee8cc1Swenshuai.xi         // Instruction sram base Unit: byte address
1872*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_ICU_SDR_BASE_L, (MS_U16)(u32Offset & 0x0000ffff)) ;
1873*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_ICU_SDR_BASE_H, (MS_U16)((u32Offset >>16) & 0xffff));
1874*53ee8cc1Swenshuai.xi     }
1875*53ee8cc1Swenshuai.xi     else
1876*53ee8cc1Swenshuai.xi     {
1877*53ee8cc1Swenshuai.xi         // Data sram base Unit: byte address
1878*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_DCU_SDR_BASE_L, (MS_U16)(u32Offset & 0x0000ffff)) ;
1879*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_DCU_SDR_BASE_H, (MS_U16)((u32Offset>>16) & 0xffff));
1880*53ee8cc1Swenshuai.xi         // Instruction sram base Unit: byte address
1881*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_ICU_SDR_BASE_L, (MS_U16)(u32Offset & 0x0000ffff)) ;
1882*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_ICU_SDR_BASE_H, (MS_U16)((u32Offset>>16) & 0xffff));
1883*53ee8cc1Swenshuai.xi     }
1884*53ee8cc1Swenshuai.xi 
1885*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_CONTROL_SET);
1886*53ee8cc1Swenshuai.xi     tempreg |= VPU_REG_IO2_EN;
1887*53ee8cc1Swenshuai.xi     tempreg |= VPU_REG_QMEM_SPACE_EN;
1888*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CONTROL_SET, tempreg);
1889*53ee8cc1Swenshuai.xi 
1890*53ee8cc1Swenshuai.xi     return bRet;
1891*53ee8cc1Swenshuai.xi }
1892*53ee8cc1Swenshuai.xi 
1893*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
1894*53ee8cc1Swenshuai.xi /// H.264 SW reset
1895*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
1896*53ee8cc1Swenshuai.xi ///     - TRUE, Success
1897*53ee8cc1Swenshuai.xi ///     - FALSE, Failed
1898*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_SwRst(MS_BOOL bCheckMauIdle)1899*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_SwRst(MS_BOOL bCheckMauIdle)
1900*53ee8cc1Swenshuai.xi {
1901*53ee8cc1Swenshuai.xi     MS_U16 tempreg = 0, tempreg1 = 0;
1902*53ee8cc1Swenshuai.xi 
1903*53ee8cc1Swenshuai.xi     //From T4, need to check MAU idle before reset VPU
1904*53ee8cc1Swenshuai.xi     if (bCheckMauIdle)
1905*53ee8cc1Swenshuai.xi     {
1906*53ee8cc1Swenshuai.xi         MS_U32 mau_idle_cnt = 100;// ms
1907*53ee8cc1Swenshuai.xi         while (mau_idle_cnt)
1908*53ee8cc1Swenshuai.xi         {
1909*53ee8cc1Swenshuai.xi             if (TRUE == _VPU_EX_MAU_IDLE())
1910*53ee8cc1Swenshuai.xi             {
1911*53ee8cc1Swenshuai.xi                 break;
1912*53ee8cc1Swenshuai.xi             }
1913*53ee8cc1Swenshuai.xi             mau_idle_cnt--;
1914*53ee8cc1Swenshuai.xi             MsOS_DelayTask(1);
1915*53ee8cc1Swenshuai.xi         }
1916*53ee8cc1Swenshuai.xi 
1917*53ee8cc1Swenshuai.xi         if (mau_idle_cnt == 0)
1918*53ee8cc1Swenshuai.xi         {
1919*53ee8cc1Swenshuai.xi             printf("MAU idle time out~~~~~\n");
1920*53ee8cc1Swenshuai.xi         }
1921*53ee8cc1Swenshuai.xi     }
1922*53ee8cc1Swenshuai.xi 
1923*53ee8cc1Swenshuai.xi 
1924*53ee8cc1Swenshuai.xi     HAL_VPU_EX_MIU_RW_Protect(TRUE);
1925*53ee8cc1Swenshuai.xi 
1926*53ee8cc1Swenshuai.xi     tempreg1 = _VPU_Read2Byte(MAU1_CPU_RST);
1927*53ee8cc1Swenshuai.xi     tempreg1 |= MAU1_REG_SW_RESET;
1928*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(MAU1_CPU_RST, tempreg1);
1929*53ee8cc1Swenshuai.xi 
1930*53ee8cc1Swenshuai.xi #if defined(UDMA_FPGA_ENVI)
1931*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_RESET);
1932*53ee8cc1Swenshuai.xi    _VPU_Write2Byte(VPU_REG_RESET, (tempreg& 0xfffd));
1933*53ee8cc1Swenshuai.xi #endif
1934*53ee8cc1Swenshuai.xi 
1935*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_CPU_SETTING);
1936*53ee8cc1Swenshuai.xi     tempreg &= ~VPU_REG_CPU_R2_EN;
1937*53ee8cc1Swenshuai.xi     tempreg &= ~VPU_REG_CPU_SW_RSTZ;
1938*53ee8cc1Swenshuai.xi     tempreg &= ~VPU_REG_CPU_MIU_SW_RSTZ;
1939*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CPU_SETTING, tempreg);
1940*53ee8cc1Swenshuai.xi 
1941*53ee8cc1Swenshuai.xi     VPU_EX_TimerDelayMS(1);
1942*53ee8cc1Swenshuai.xi     HAL_VPU_EX_MIU_RW_Protect(FALSE);
1943*53ee8cc1Swenshuai.xi 
1944*53ee8cc1Swenshuai.xi     pVPUHalContext->_bVPURsted = FALSE;
1945*53ee8cc1Swenshuai.xi     return TRUE;
1946*53ee8cc1Swenshuai.xi }
1947*53ee8cc1Swenshuai.xi 
1948*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
1949*53ee8cc1Swenshuai.xi /// CPU reset release
1950*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_SwRstRelse(void)1951*53ee8cc1Swenshuai.xi void HAL_VPU_EX_SwRstRelse(void)
1952*53ee8cc1Swenshuai.xi {
1953*53ee8cc1Swenshuai.xi     MS_U16 tempreg = 0, tempreg1 = 0;
1954*53ee8cc1Swenshuai.xi 
1955*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_CPU_SETTING);
1956*53ee8cc1Swenshuai.xi     tempreg |= VPU_REG_CPU_R2_EN;
1957*53ee8cc1Swenshuai.xi     tempreg |= VPU_REG_CPU_SW_RSTZ;
1958*53ee8cc1Swenshuai.xi     tempreg |= VPU_REG_CPU_MIU_SW_RSTZ;
1959*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CPU_SETTING, tempreg);
1960*53ee8cc1Swenshuai.xi 
1961*53ee8cc1Swenshuai.xi     tempreg1 = _VPU_Read2Byte(MAU1_CPU_RST);
1962*53ee8cc1Swenshuai.xi     tempreg1 &= ~MAU1_REG_SW_RESET;
1963*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(MAU1_CPU_RST, tempreg1);
1964*53ee8cc1Swenshuai.xi 
1965*53ee8cc1Swenshuai.xi     pVPUHalContext->_bVPURsted = TRUE;
1966*53ee8cc1Swenshuai.xi }
1967*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_SwRelseMAU(void)1968*53ee8cc1Swenshuai.xi void HAL_VPU_EX_SwRelseMAU(void)
1969*53ee8cc1Swenshuai.xi {
1970*53ee8cc1Swenshuai.xi     MS_U16 tempreg = 0;
1971*53ee8cc1Swenshuai.xi 
1972*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(MAU1_CPU_RST);
1973*53ee8cc1Swenshuai.xi     tempreg &= ~MAU1_REG_SW_RESET;
1974*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(MAU1_CPU_RST, tempreg);
1975*53ee8cc1Swenshuai.xi }
1976*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_MemRead(MS_U32 u32Addr)1977*53ee8cc1Swenshuai.xi MS_U32 HAL_VPU_EX_MemRead(MS_U32 u32Addr)
1978*53ee8cc1Swenshuai.xi {
1979*53ee8cc1Swenshuai.xi     MS_U32 u32value = 0;
1980*53ee8cc1Swenshuai.xi 
1981*53ee8cc1Swenshuai.xi     return u32value;
1982*53ee8cc1Swenshuai.xi }
1983*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_MemWrite(MS_U32 u32Addr,MS_U32 u32value)1984*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_MemWrite(MS_U32 u32Addr, MS_U32 u32value)
1985*53ee8cc1Swenshuai.xi {
1986*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
1987*53ee8cc1Swenshuai.xi 
1988*53ee8cc1Swenshuai.xi     return bRet;
1989*53ee8cc1Swenshuai.xi }
1990*53ee8cc1Swenshuai.xi 
1991*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
1992*53ee8cc1Swenshuai.xi /// Check AVCH264 Ready or not
1993*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
1994*53ee8cc1Swenshuai.xi ///     - TRUE, MailBox is free
1995*53ee8cc1Swenshuai.xi ///     - FALSE, MailBox is busy
1996*53ee8cc1Swenshuai.xi /// @param u8MBox \b IN: MailBox to check
1997*53ee8cc1Swenshuai.xi ///     - AVCH264_HI_MBOX0,
1998*53ee8cc1Swenshuai.xi ///     - AVCH264_HI_MBOX1,
1999*53ee8cc1Swenshuai.xi ///     - AVCH264_RISC_MBOX0,
2000*53ee8cc1Swenshuai.xi ///     - AVCH264_RISC_MBOX1,
2001*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_MBoxRdy(MS_U32 u32type)2002*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_MBoxRdy(MS_U32 u32type)
2003*53ee8cc1Swenshuai.xi {
2004*53ee8cc1Swenshuai.xi     MS_BOOL bResult = FALSE;
2005*53ee8cc1Swenshuai.xi 
2006*53ee8cc1Swenshuai.xi     switch (u32type)
2007*53ee8cc1Swenshuai.xi     {
2008*53ee8cc1Swenshuai.xi         case VPU_HI_MBOX0:
2009*53ee8cc1Swenshuai.xi             bResult = (_VPU_Read2Byte(VPU_REG_HI_MBOX_RDY) & VPU_REG_HI_MBOX0_RDY) ? FALSE : TRUE;
2010*53ee8cc1Swenshuai.xi             break;
2011*53ee8cc1Swenshuai.xi         case VPU_HI_MBOX1:
2012*53ee8cc1Swenshuai.xi             bResult = (_VPU_Read2Byte(VPU_REG_HI_MBOX_RDY) & VPU_REG_HI_MBOX1_RDY) ? FALSE : TRUE;
2013*53ee8cc1Swenshuai.xi             break;
2014*53ee8cc1Swenshuai.xi         case VPU_RISC_MBOX0:
2015*53ee8cc1Swenshuai.xi             bResult = (_VPU_Read2Byte(VPU_REG_RISC_MBOX_RDY) & VPU_REG_RISC_MBOX0_RDY) ? TRUE : FALSE;
2016*53ee8cc1Swenshuai.xi             break;
2017*53ee8cc1Swenshuai.xi         case VPU_RISC_MBOX1:
2018*53ee8cc1Swenshuai.xi             bResult = (_VPU_Read2Byte(VPU_REG_RISC_MBOX_RDY) & VPU_REG_RISC_MBOX1_RDY) ? TRUE : FALSE;
2019*53ee8cc1Swenshuai.xi             break;
2020*53ee8cc1Swenshuai.xi         default:
2021*53ee8cc1Swenshuai.xi             break;
2022*53ee8cc1Swenshuai.xi     }
2023*53ee8cc1Swenshuai.xi     return bResult;
2024*53ee8cc1Swenshuai.xi }
2025*53ee8cc1Swenshuai.xi 
2026*53ee8cc1Swenshuai.xi 
2027*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
2028*53ee8cc1Swenshuai.xi /// Read message from AVCH264
2029*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
2030*53ee8cc1Swenshuai.xi ///     - TRUE, success
2031*53ee8cc1Swenshuai.xi ///     - FALSE, failed
2032*53ee8cc1Swenshuai.xi /// @param u8MBox \b IN: MailBox to read
2033*53ee8cc1Swenshuai.xi ///     - AVCH264_RISC_MBOX0
2034*53ee8cc1Swenshuai.xi ///     - AVCH264_RISC_MBOX1
2035*53ee8cc1Swenshuai.xi /// @param u32Msg \b OUT: message read
2036*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_MBoxRead(MS_U32 u32type,MS_U32 * u32Msg)2037*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_MBoxRead(MS_U32 u32type, MS_U32 * u32Msg)
2038*53ee8cc1Swenshuai.xi {
2039*53ee8cc1Swenshuai.xi     MS_BOOL bResult = TRUE;
2040*53ee8cc1Swenshuai.xi 
2041*53ee8cc1Swenshuai.xi     switch (u32type)
2042*53ee8cc1Swenshuai.xi     {
2043*53ee8cc1Swenshuai.xi         case VPU_HI_MBOX0:
2044*53ee8cc1Swenshuai.xi             *u32Msg = ((MS_U32) (_VPU_Read2Byte(VPU_REG_HI_MBOX0_H)) << 16) |
2045*53ee8cc1Swenshuai.xi                 ((MS_U32) (_VPU_Read2Byte(VPU_REG_HI_MBOX0_L)));
2046*53ee8cc1Swenshuai.xi             break;
2047*53ee8cc1Swenshuai.xi         case VPU_HI_MBOX1:
2048*53ee8cc1Swenshuai.xi             *u32Msg = ((MS_U32) (_VPU_Read2Byte(VPU_REG_HI_MBOX1_H)) << 16) |
2049*53ee8cc1Swenshuai.xi                 ((MS_U32) (_VPU_Read2Byte(VPU_REG_HI_MBOX1_L)));
2050*53ee8cc1Swenshuai.xi             break;
2051*53ee8cc1Swenshuai.xi         case VPU_RISC_MBOX0:
2052*53ee8cc1Swenshuai.xi             *u32Msg = ((MS_U32) (_VPU_Read2Byte(VPU_REG_RISC_MBOX0_H)) << 16) |
2053*53ee8cc1Swenshuai.xi                 ((MS_U32) (_VPU_Read2Byte(VPU_REG_RISC_MBOX0_L)));
2054*53ee8cc1Swenshuai.xi             break;
2055*53ee8cc1Swenshuai.xi         case VPU_RISC_MBOX1:
2056*53ee8cc1Swenshuai.xi             *u32Msg = ((MS_U32) (_VPU_Read2Byte(VPU_REG_RISC_MBOX1_H)) << 16) |
2057*53ee8cc1Swenshuai.xi                 ((MS_U32) (_VPU_Read2Byte(VPU_REG_RISC_MBOX1_L)));
2058*53ee8cc1Swenshuai.xi             break;
2059*53ee8cc1Swenshuai.xi         default:
2060*53ee8cc1Swenshuai.xi             *u32Msg = 0;
2061*53ee8cc1Swenshuai.xi             bResult = FALSE;
2062*53ee8cc1Swenshuai.xi             break;
2063*53ee8cc1Swenshuai.xi     }
2064*53ee8cc1Swenshuai.xi     return bResult;
2065*53ee8cc1Swenshuai.xi }
2066*53ee8cc1Swenshuai.xi 
2067*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
2068*53ee8cc1Swenshuai.xi /// Mailbox from AVCH264 clear bit resest
2069*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_MBoxClear(MS_U32 u32type)2070*53ee8cc1Swenshuai.xi void HAL_VPU_EX_MBoxClear(MS_U32 u32type)
2071*53ee8cc1Swenshuai.xi {
2072*53ee8cc1Swenshuai.xi     switch (u32type)
2073*53ee8cc1Swenshuai.xi     {
2074*53ee8cc1Swenshuai.xi         case VPU_RISC_MBOX0:
2075*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(VPU_REG_RISC_MBOX_CLR, VPU_REG_RISC_MBOX0_CLR, VPU_REG_RISC_MBOX0_CLR);
2076*53ee8cc1Swenshuai.xi             break;
2077*53ee8cc1Swenshuai.xi         case VPU_RISC_MBOX1:
2078*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(VPU_REG_RISC_MBOX_CLR, VPU_REG_RISC_MBOX1_CLR, VPU_REG_RISC_MBOX1_CLR);
2079*53ee8cc1Swenshuai.xi             break;
2080*53ee8cc1Swenshuai.xi         default:
2081*53ee8cc1Swenshuai.xi             break;
2082*53ee8cc1Swenshuai.xi     }
2083*53ee8cc1Swenshuai.xi }
2084*53ee8cc1Swenshuai.xi 
2085*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
2086*53ee8cc1Swenshuai.xi /// Send message to AVCH264
2087*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
2088*53ee8cc1Swenshuai.xi ///     - TRUE, Success
2089*53ee8cc1Swenshuai.xi ///     - FALSE, Failed
2090*53ee8cc1Swenshuai.xi /// @param u8MBox \b IN: MailBox
2091*53ee8cc1Swenshuai.xi ///     - AVCH264_HI_MBOX0,
2092*53ee8cc1Swenshuai.xi ///     - AVCH264_HI_MBOX1,
2093*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_MBoxSend(MS_U32 u32type,MS_U32 u32Msg)2094*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_MBoxSend(MS_U32 u32type, MS_U32 u32Msg)
2095*53ee8cc1Swenshuai.xi {
2096*53ee8cc1Swenshuai.xi     MS_BOOL bResult = TRUE;
2097*53ee8cc1Swenshuai.xi 
2098*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("type=%u, msg=0x%x\n", u32type, u32Msg);
2099*53ee8cc1Swenshuai.xi 
2100*53ee8cc1Swenshuai.xi     switch (u32type)
2101*53ee8cc1Swenshuai.xi     {
2102*53ee8cc1Swenshuai.xi         case VPU_HI_MBOX0:
2103*53ee8cc1Swenshuai.xi         {
2104*53ee8cc1Swenshuai.xi             _VPU_Write4Byte(VPU_REG_HI_MBOX0_L, u32Msg);
2105*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(VPU_REG_HI_MBOX_SET, VPU_REG_HI_MBOX0_SET, VPU_REG_HI_MBOX0_SET);
2106*53ee8cc1Swenshuai.xi             break;
2107*53ee8cc1Swenshuai.xi         }
2108*53ee8cc1Swenshuai.xi         case VPU_HI_MBOX1:
2109*53ee8cc1Swenshuai.xi         {
2110*53ee8cc1Swenshuai.xi             _VPU_Write4Byte(VPU_REG_HI_MBOX1_L, u32Msg);
2111*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(VPU_REG_HI_MBOX_SET, VPU_REG_HI_MBOX1_SET, VPU_REG_HI_MBOX1_SET);
2112*53ee8cc1Swenshuai.xi             break;
2113*53ee8cc1Swenshuai.xi         }
2114*53ee8cc1Swenshuai.xi         default:
2115*53ee8cc1Swenshuai.xi         {
2116*53ee8cc1Swenshuai.xi             bResult = FALSE;
2117*53ee8cc1Swenshuai.xi             break;
2118*53ee8cc1Swenshuai.xi         }
2119*53ee8cc1Swenshuai.xi     }
2120*53ee8cc1Swenshuai.xi 
2121*53ee8cc1Swenshuai.xi     return bResult;
2122*53ee8cc1Swenshuai.xi }
2123*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetProgCnt(void)2124*53ee8cc1Swenshuai.xi MS_U32 HAL_VPU_EX_GetProgCnt(void)
2125*53ee8cc1Swenshuai.xi {
2126*53ee8cc1Swenshuai.xi 
2127*53ee8cc1Swenshuai.xi     MS_U16 expc_l=0;
2128*53ee8cc1Swenshuai.xi     MS_U16 expc_h=0;
2129*53ee8cc1Swenshuai.xi     expc_l = _VPU_Read2Byte(VPU_REG_EXPC_L) & 0xFFFF;
2130*53ee8cc1Swenshuai.xi     expc_h = _VPU_Read2Byte(VPU_REG_EXPC_H) & 0xFFFF;
2131*53ee8cc1Swenshuai.xi     return (((MS_U32)expc_h) << 16) | (MS_U32)expc_l;
2132*53ee8cc1Swenshuai.xi }
2133*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetTaskId(MS_U32 u32Id)2134*53ee8cc1Swenshuai.xi MS_U8 HAL_VPU_EX_GetTaskId(MS_U32 u32Id)
2135*53ee8cc1Swenshuai.xi {
2136*53ee8cc1Swenshuai.xi     return _VPU_EX_GetOffsetIdx(u32Id);
2137*53ee8cc1Swenshuai.xi }
2138*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_SetShareInfoAddr(MS_U32 u32Id,MS_VIRT u32ShmAddr)2139*53ee8cc1Swenshuai.xi void HAL_VPU_EX_SetShareInfoAddr(MS_U32 u32Id, MS_VIRT u32ShmAddr)
2140*53ee8cc1Swenshuai.xi {
2141*53ee8cc1Swenshuai.xi     MS_U8 u8Offset = _VPU_EX_GetOffsetIdx(u32Id);
2142*53ee8cc1Swenshuai.xi 
2143*53ee8cc1Swenshuai.xi     if (u32ShmAddr == 0)
2144*53ee8cc1Swenshuai.xi     {
2145*53ee8cc1Swenshuai.xi         pVPUHalContext->u32FWShareInfoAddr[u8Offset] = 0xFFFFFFFF;
2146*53ee8cc1Swenshuai.xi     }
2147*53ee8cc1Swenshuai.xi     else
2148*53ee8cc1Swenshuai.xi     {
2149*53ee8cc1Swenshuai.xi         if (u8Offset == 0)
2150*53ee8cc1Swenshuai.xi         {
2151*53ee8cc1Swenshuai.xi             pVPUHalContext->u32FWShareInfoAddr[u8Offset] = u32ShmAddr;
2152*53ee8cc1Swenshuai.xi         }
2153*53ee8cc1Swenshuai.xi         else if (u8Offset == 1)
2154*53ee8cc1Swenshuai.xi         {
2155*53ee8cc1Swenshuai.xi             pVPUHalContext->u32FWShareInfoAddr[u8Offset] = u32ShmAddr + TEE_ONE_TASK_SHM_SIZE;
2156*53ee8cc1Swenshuai.xi         }
2157*53ee8cc1Swenshuai.xi     }
2158*53ee8cc1Swenshuai.xi 
2159*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("set PA ShareInfoAddr[%d] = 0x%lx \n", u8Offset, pVPUHalContext->u32FWShareInfoAddr[u8Offset]);
2160*53ee8cc1Swenshuai.xi     return;
2161*53ee8cc1Swenshuai.xi }
2162*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetShareInfoAddr(MS_U32 u32Id)2163*53ee8cc1Swenshuai.xi MS_VIRT HAL_VPU_EX_GetShareInfoAddr(MS_U32 u32Id)
2164*53ee8cc1Swenshuai.xi {
2165*53ee8cc1Swenshuai.xi     MS_U8 u8Offset = _VPU_EX_GetOffsetIdx(u32Id);
2166*53ee8cc1Swenshuai.xi 
2167*53ee8cc1Swenshuai.xi     return pVPUHalContext->u32FWShareInfoAddr[u8Offset];
2168*53ee8cc1Swenshuai.xi }
2169*53ee8cc1Swenshuai.xi 
2170*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_IsPowered(void)2171*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_IsPowered(void)
2172*53ee8cc1Swenshuai.xi {
2173*53ee8cc1Swenshuai.xi     return pVPUHalContext->_bVPUPowered;
2174*53ee8cc1Swenshuai.xi }
2175*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_IsRsted(void)2176*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_IsRsted(void)
2177*53ee8cc1Swenshuai.xi {
2178*53ee8cc1Swenshuai.xi     return pVPUHalContext->_bVPURsted;
2179*53ee8cc1Swenshuai.xi }
2180*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_MVDInUsed(void)2181*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_MVDInUsed(void)
2182*53ee8cc1Swenshuai.xi {
2183*53ee8cc1Swenshuai.xi     //MVD is in used for MVD or HVD_TSP mode.
2184*53ee8cc1Swenshuai.xi     MS_U8 i;
2185*53ee8cc1Swenshuai.xi     MS_U8 u8UseCnt = 0;
2186*53ee8cc1Swenshuai.xi 
2187*53ee8cc1Swenshuai.xi     for (i = 0; i < sizeof(pVPUHalContext->_stVPUStream) / sizeof(pVPUHalContext->_stVPUStream[0]); i++)
2188*53ee8cc1Swenshuai.xi     {
2189*53ee8cc1Swenshuai.xi         if ((pVPUHalContext->_stVPUStream[i].eDecodertype == E_VPU_EX_DECODER_MVD) ||
2190*53ee8cc1Swenshuai.xi             (pVPUHalContext->_stVPUStream[i].eDecodertype == E_VPU_EX_DECODER_HVD) )
2191*53ee8cc1Swenshuai.xi         {
2192*53ee8cc1Swenshuai.xi             u8UseCnt++;
2193*53ee8cc1Swenshuai.xi         }
2194*53ee8cc1Swenshuai.xi     }
2195*53ee8cc1Swenshuai.xi 
2196*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("MVD u8UseCnt=%d\n", u8UseCnt);
2197*53ee8cc1Swenshuai.xi 
2198*53ee8cc1Swenshuai.xi     if (u8UseCnt != 0)
2199*53ee8cc1Swenshuai.xi     {
2200*53ee8cc1Swenshuai.xi         return TRUE;
2201*53ee8cc1Swenshuai.xi     }
2202*53ee8cc1Swenshuai.xi     else
2203*53ee8cc1Swenshuai.xi     {
2204*53ee8cc1Swenshuai.xi         return FALSE;
2205*53ee8cc1Swenshuai.xi     }
2206*53ee8cc1Swenshuai.xi }
2207*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_HVDInUsed(void)2208*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_HVDInUsed(void)
2209*53ee8cc1Swenshuai.xi {
2210*53ee8cc1Swenshuai.xi     //HVD is in used for HVD or MVD in sub stream.
2211*53ee8cc1Swenshuai.xi     MS_U8 i;
2212*53ee8cc1Swenshuai.xi     MS_U8 u8UseCnt = 0;
2213*53ee8cc1Swenshuai.xi 
2214*53ee8cc1Swenshuai.xi     for (i = 0; i < sizeof(pVPUHalContext->_stVPUStream) / sizeof(pVPUHalContext->_stVPUStream[0]); i++)
2215*53ee8cc1Swenshuai.xi     {
2216*53ee8cc1Swenshuai.xi         if ((E_VPU_EX_DECODER_HVD == pVPUHalContext->_stVPUStream[i].eDecodertype) ||
2217*53ee8cc1Swenshuai.xi             ((E_VPU_EX_DECODER_MVD == pVPUHalContext->_stVPUStream[i].eDecodertype) && (E_HAL_VPU_SUB_STREAM0 == pVPUHalContext->_stVPUStream[i].eStreamId)))
2218*53ee8cc1Swenshuai.xi         {
2219*53ee8cc1Swenshuai.xi             u8UseCnt++;
2220*53ee8cc1Swenshuai.xi         }
2221*53ee8cc1Swenshuai.xi     }
2222*53ee8cc1Swenshuai.xi 
2223*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("HVD u8UseCnt=%d\n", u8UseCnt);
2224*53ee8cc1Swenshuai.xi 
2225*53ee8cc1Swenshuai.xi     if (u8UseCnt != 0)
2226*53ee8cc1Swenshuai.xi     {
2227*53ee8cc1Swenshuai.xi         return TRUE;
2228*53ee8cc1Swenshuai.xi     }
2229*53ee8cc1Swenshuai.xi     else
2230*53ee8cc1Swenshuai.xi     {
2231*53ee8cc1Swenshuai.xi         return FALSE;
2232*53ee8cc1Swenshuai.xi     }
2233*53ee8cc1Swenshuai.xi }
2234*53ee8cc1Swenshuai.xi 
2235*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2236*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDbgLevel()
2237*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set debug level
2238*53ee8cc1Swenshuai.xi /// @param -elevel \b IN : debug level
2239*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
HAL_VPU_EX_SetDbgLevel(VPU_EX_UartLevel eLevel)2240*53ee8cc1Swenshuai.xi void HAL_VPU_EX_SetDbgLevel(VPU_EX_UartLevel eLevel)
2241*53ee8cc1Swenshuai.xi {
2242*53ee8cc1Swenshuai.xi     printf("%s eLevel=0x%x\n", __FUNCTION__, eLevel);
2243*53ee8cc1Swenshuai.xi 
2244*53ee8cc1Swenshuai.xi     switch (eLevel)
2245*53ee8cc1Swenshuai.xi     {
2246*53ee8cc1Swenshuai.xi         case E_VPU_EX_UART_LEVEL_ERR:
2247*53ee8cc1Swenshuai.xi         {
2248*53ee8cc1Swenshuai.xi             u32VpuUartCtrl = E_VPU_UART_CTRL_ERR;
2249*53ee8cc1Swenshuai.xi             break;
2250*53ee8cc1Swenshuai.xi         }
2251*53ee8cc1Swenshuai.xi         case E_VPU_EX_UART_LEVEL_INFO:
2252*53ee8cc1Swenshuai.xi         {
2253*53ee8cc1Swenshuai.xi             u32VpuUartCtrl = E_VPU_UART_CTRL_INFO | E_VPU_UART_CTRL_ERR;
2254*53ee8cc1Swenshuai.xi             break;
2255*53ee8cc1Swenshuai.xi         }
2256*53ee8cc1Swenshuai.xi         case E_VPU_EX_UART_LEVEL_DBG:
2257*53ee8cc1Swenshuai.xi         {
2258*53ee8cc1Swenshuai.xi             u32VpuUartCtrl = E_VPU_UART_CTRL_DBG | E_VPU_UART_CTRL_ERR | E_VPU_UART_CTRL_INFO;
2259*53ee8cc1Swenshuai.xi             break;
2260*53ee8cc1Swenshuai.xi         }
2261*53ee8cc1Swenshuai.xi         case E_VPU_EX_UART_LEVEL_TRACE:
2262*53ee8cc1Swenshuai.xi         {
2263*53ee8cc1Swenshuai.xi             u32VpuUartCtrl = E_VPU_UART_CTRL_TRACE | E_VPU_UART_CTRL_ERR | E_VPU_UART_CTRL_INFO | E_VPU_UART_CTRL_DBG;
2264*53ee8cc1Swenshuai.xi             break;
2265*53ee8cc1Swenshuai.xi         }
2266*53ee8cc1Swenshuai.xi         case E_VPU_EX_UART_LEVEL_FW:
2267*53ee8cc1Swenshuai.xi         {
2268*53ee8cc1Swenshuai.xi             u32VpuUartCtrl = E_VPU_UART_CTRL_DISABLE;
2269*53ee8cc1Swenshuai.xi             break;
2270*53ee8cc1Swenshuai.xi         }
2271*53ee8cc1Swenshuai.xi         default:
2272*53ee8cc1Swenshuai.xi         {
2273*53ee8cc1Swenshuai.xi             u32VpuUartCtrl = E_VPU_UART_CTRL_DISABLE;
2274*53ee8cc1Swenshuai.xi             break;
2275*53ee8cc1Swenshuai.xi         }
2276*53ee8cc1Swenshuai.xi     }
2277*53ee8cc1Swenshuai.xi }
2278*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetFWVer(MS_U32 u32Id,VPU_EX_FWVerType eVerType)2279*53ee8cc1Swenshuai.xi MS_U32 HAL_VPU_EX_GetFWVer(MS_U32 u32Id, VPU_EX_FWVerType eVerType)
2280*53ee8cc1Swenshuai.xi {
2281*53ee8cc1Swenshuai.xi     HVD_Return eCtrlRet = E_HVD_RETURN_FAIL;
2282*53ee8cc1Swenshuai.xi     MS_U32 u32CmdArg = (MS_U32)eVerType;
2283*53ee8cc1Swenshuai.xi     MS_U32 u32Version = 0xFFFFFFFF;
2284*53ee8cc1Swenshuai.xi     eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_VERSION, u32CmdArg);
2285*53ee8cc1Swenshuai.xi     if (E_HVD_RETURN_SUCCESS != eCtrlRet)
2286*53ee8cc1Swenshuai.xi     {
2287*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("E_DUAL_VERSION NG eCtrlRet=%x\n", eCtrlRet);
2288*53ee8cc1Swenshuai.xi         return u32Version;
2289*53ee8cc1Swenshuai.xi     }
2290*53ee8cc1Swenshuai.xi 
2291*53ee8cc1Swenshuai.xi     MS_BOOL bRet = false;
2292*53ee8cc1Swenshuai.xi     MS_U32 u32TimeOut = 0xFFFFFFFF;
2293*53ee8cc1Swenshuai.xi 
2294*53ee8cc1Swenshuai.xi     while(--u32TimeOut)
2295*53ee8cc1Swenshuai.xi     {
2296*53ee8cc1Swenshuai.xi         if(HAL_VPU_EX_MBoxRdy(VPU_RISC_MBOX0))
2297*53ee8cc1Swenshuai.xi         {
2298*53ee8cc1Swenshuai.xi             bRet = HAL_VPU_EX_MBoxRead(VPU_RISC_MBOX0, &u32Version);
2299*53ee8cc1Swenshuai.xi             if (false == bRet)
2300*53ee8cc1Swenshuai.xi             {
2301*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("E_DUAL_VERSION NG bRet=%x\n", bRet);
2302*53ee8cc1Swenshuai.xi                 return u32Version;
2303*53ee8cc1Swenshuai.xi             }
2304*53ee8cc1Swenshuai.xi 
2305*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(  VPU_REG_RISC_MBOX_CLR , VPU_REG_RISC_MBOX0_CLR  , VPU_REG_RISC_MBOX0_CLR);
2306*53ee8cc1Swenshuai.xi             VPU_MSG_DBG("E_DUAL_VERSION arg=%x u32Version = 0x%x\n", u32CmdArg, u32Version);
2307*53ee8cc1Swenshuai.xi             return u32Version;
2308*53ee8cc1Swenshuai.xi         }
2309*53ee8cc1Swenshuai.xi     }
2310*53ee8cc1Swenshuai.xi 
2311*53ee8cc1Swenshuai.xi     VPU_MSG_ERR("get E_DUAL_VERSION=%x timeout", eVerType);
2312*53ee8cc1Swenshuai.xi 
2313*53ee8cc1Swenshuai.xi     return u32Version;
2314*53ee8cc1Swenshuai.xi }
2315*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_NotSupportDS(void)2316*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_NotSupportDS(void)
2317*53ee8cc1Swenshuai.xi {
2318*53ee8cc1Swenshuai.xi     return FALSE;
2319*53ee8cc1Swenshuai.xi }
2320*53ee8cc1Swenshuai.xi 
2321*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2322*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_VPU_EX_MIU1BASE()
2323*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get VPU MIU base address
2324*53ee8cc1Swenshuai.xi /// @return - vpu MIU1 base
2325*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
HAL_VPU_EX_MIU1BASE(void)2326*53ee8cc1Swenshuai.xi MS_VIRT HAL_VPU_EX_MIU1BASE(void)
2327*53ee8cc1Swenshuai.xi {
2328*53ee8cc1Swenshuai.xi     return VPU_MIU1BASE_ADDR;
2329*53ee8cc1Swenshuai.xi }
2330*53ee8cc1Swenshuai.xi 
2331*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetSHMAddr(void)2332*53ee8cc1Swenshuai.xi MS_VIRT HAL_VPU_EX_GetSHMAddr(void)
2333*53ee8cc1Swenshuai.xi {
2334*53ee8cc1Swenshuai.xi     if(pVPUHalContext->bEnableVPUSecureMode == FALSE)
2335*53ee8cc1Swenshuai.xi     {
2336*53ee8cc1Swenshuai.xi         return 0;
2337*53ee8cc1Swenshuai.xi     }
2338*53ee8cc1Swenshuai.xi     return pVPUHalContext->u32VPUSHMAddr;
2339*53ee8cc1Swenshuai.xi }
HAL_VPU_EX_EnableSecurityMode(MS_BOOL enable)2340*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_EnableSecurityMode(MS_BOOL enable)
2341*53ee8cc1Swenshuai.xi {
2342*53ee8cc1Swenshuai.xi     pVPUHalContext->bEnableVPUSecureMode = enable;
2343*53ee8cc1Swenshuai.xi     return TRUE;
2344*53ee8cc1Swenshuai.xi }
2345*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_CHIP_Capability(void * pHWCap)2346*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_CHIP_Capability(void* pHWCap)
2347*53ee8cc1Swenshuai.xi {
2348*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->u8Cap_Support_Decoder_Num = 2;
2349*53ee8cc1Swenshuai.xi 
2350*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_MPEG2 = TRUE;
2351*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_H263 = TRUE;
2352*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_MPEG4 = TRUE;
2353*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_DIVX311 = TRUE;
2354*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_DIVX412 = TRUE;
2355*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_FLV = TRUE;
2356*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_VC1ADV = TRUE;
2357*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_VC1MAIN = TRUE;
2358*53ee8cc1Swenshuai.xi 
2359*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_RV8 = TRUE;
2360*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_RV9 = TRUE;
2361*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_H264 = TRUE;
2362*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_AVS = TRUE;
2363*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_MJPEG = TRUE;
2364*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_MVC = TRUE;
2365*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_VP8 = TRUE;
2366*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_HEVC = TRUE;
2367*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_VP9 = TRUE;
2368*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_AVS_PLUS = TRUE;
2369*53ee8cc1Swenshuai.xi 
2370*53ee8cc1Swenshuai.xi     return TRUE;
2371*53ee8cc1Swenshuai.xi }
2372*53ee8cc1Swenshuai.xi 
2373*53ee8cc1Swenshuai.xi #else
2374*53ee8cc1Swenshuai.xi #include "halVPU_EX.h"
2375*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
2376*53ee8cc1Swenshuai.xi #include "../hvd_ex/regHVD_EX.h"
2377*53ee8cc1Swenshuai.xi 
2378*53ee8cc1Swenshuai.xi extern int lib_lowprintf(const char *fmt, ...);
2379*53ee8cc1Swenshuai.xi #define PRINTF lib_lowprintf
2380*53ee8cc1Swenshuai.xi #define HVD_LWORD(x)    (MS_U16)((x)&0xffff)
2381*53ee8cc1Swenshuai.xi #define HVD_HWORD(x)    (MS_U16)(((x)>>16)&0xffff)
2382*53ee8cc1Swenshuai.xi 
2383*53ee8cc1Swenshuai.xi MS_U8 u8FW_Binary[] = {
2384*53ee8cc1Swenshuai.xi     #include "fwVPU.dat"
2385*53ee8cc1Swenshuai.xi };
2386*53ee8cc1Swenshuai.xi 
2387*53ee8cc1Swenshuai.xi MS_U32 u32HVDRegOSBase;
2388*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_LoadCodeInSecure(MS_U32 addr)2389*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_LoadCodeInSecure(MS_U32 addr)
2390*53ee8cc1Swenshuai.xi {
2391*53ee8cc1Swenshuai.xi     //PRINTF("do load code,u32DestAddr %x\n",addr);
2392*53ee8cc1Swenshuai.xi     memcpy((void*)addr, (void*)u8FW_Binary, sizeof(u8FW_Binary));
2393*53ee8cc1Swenshuai.xi     MAsm_CPU_Sync();
2394*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
2395*53ee8cc1Swenshuai.xi 
2396*53ee8cc1Swenshuai.xi     if (FALSE == (*((MS_U8*)(addr+6))=='R' && *((MS_U8*)(addr+7))=='2'))
2397*53ee8cc1Swenshuai.xi     {
2398*53ee8cc1Swenshuai.xi         PRINTF("FW is not R2 version! _%x_ _%x_\n", *(MS_U8*)(addr+6), *(MS_U8*)(addr+7));
2399*53ee8cc1Swenshuai.xi         return FALSE;
2400*53ee8cc1Swenshuai.xi     }
2401*53ee8cc1Swenshuai.xi     return TRUE;
2402*53ee8cc1Swenshuai.xi }
2403*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_SetLockDownRegister(void * param)2404*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_SetLockDownRegister(void* param)
2405*53ee8cc1Swenshuai.xi {
2406*53ee8cc1Swenshuai.xi #if 1
2407*53ee8cc1Swenshuai.xi     MS_U32 u32StAddr_main;
2408*53ee8cc1Swenshuai.xi     MS_U32 u32StAddr_sub;
2409*53ee8cc1Swenshuai.xi     MS_U32 u32NonPMBankSize = 0;
2410*53ee8cc1Swenshuai.xi     VPU_EX_LOCK_DOWN_REGISTER* register_lockdown;
2411*53ee8cc1Swenshuai.xi 
2412*53ee8cc1Swenshuai.xi     if(param == NULL)
2413*53ee8cc1Swenshuai.xi     {
2414*53ee8cc1Swenshuai.xi         return FALSE;
2415*53ee8cc1Swenshuai.xi     }
2416*53ee8cc1Swenshuai.xi 
2417*53ee8cc1Swenshuai.xi     register_lockdown = (VPU_EX_LOCK_DOWN_REGISTER*)param;
2418*53ee8cc1Swenshuai.xi 
2419*53ee8cc1Swenshuai.xi     MDrv_MMIO_GetBASE(&u32HVDRegOSBase, &u32NonPMBankSize, MS_MODULE_HW);
2420*53ee8cc1Swenshuai.xi 
2421*53ee8cc1Swenshuai.xi     // ES buffer
2422*53ee8cc1Swenshuai.xi     u32StAddr_main = register_lockdown->Bitstream_Addr_Main;
2423*53ee8cc1Swenshuai.xi     u32StAddr_sub = register_lockdown->Bitstream_Addr_Sub;
2424*53ee8cc1Swenshuai.xi 
2425*53ee8cc1Swenshuai.xi     if (u32StAddr_main >= register_lockdown->MIU1_BaseAddr)
2426*53ee8cc1Swenshuai.xi     {
2427*53ee8cc1Swenshuai.xi         u32StAddr_main -= register_lockdown->MIU1_BaseAddr;
2428*53ee8cc1Swenshuai.xi     }
2429*53ee8cc1Swenshuai.xi 
2430*53ee8cc1Swenshuai.xi     if (u32StAddr_sub >= register_lockdown->MIU1_BaseAddr)
2431*53ee8cc1Swenshuai.xi     {
2432*53ee8cc1Swenshuai.xi         u32StAddr_sub -= register_lockdown->MIU1_BaseAddr;
2433*53ee8cc1Swenshuai.xi     }
2434*53ee8cc1Swenshuai.xi 
2435*53ee8cc1Swenshuai.xi     //Lock down register
2436*53ee8cc1Swenshuai.xi     _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L(REG_HVD_BASE), HVD_LWORD(u32StAddr_main >> 3));
2437*53ee8cc1Swenshuai.xi     _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H(REG_HVD_BASE), HVD_HWORD(u32StAddr_main >> 3));
2438*53ee8cc1Swenshuai.xi 
2439*53ee8cc1Swenshuai.xi     _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L_BS2, HVD_LWORD(u32StAddr_sub >> 3));
2440*53ee8cc1Swenshuai.xi     _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H_BS2, HVD_HWORD(u32StAddr_sub >> 3));
2441*53ee8cc1Swenshuai.xi     //~
2442*53ee8cc1Swenshuai.xi 
2443*53ee8cc1Swenshuai.xi     // Lock Down
2444*53ee8cc1Swenshuai.xi     //_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)));
2445*53ee8cc1Swenshuai.xi     //~
2446*53ee8cc1Swenshuai.xi #endif
2447*53ee8cc1Swenshuai.xi     return TRUE;
2448*53ee8cc1Swenshuai.xi }
2449*53ee8cc1Swenshuai.xi 
2450*53ee8cc1Swenshuai.xi 
2451*53ee8cc1Swenshuai.xi #endif
2452*53ee8cc1Swenshuai.xi 
2453