xref: /utopia/UTPA2-700.0.x/modules/vdec_v3/hal/maserati/vpu_v3/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 #ifdef MSOS_TYPE_LINUX_KERNEL
101*53ee8cc1Swenshuai.xi #include <linux/string.h>
102*53ee8cc1Swenshuai.xi #else
103*53ee8cc1Swenshuai.xi #include <string.h>
104*53ee8cc1Swenshuai.xi #endif
105*53ee8cc1Swenshuai.xi 
106*53ee8cc1Swenshuai.xi #if defined(REDLION_LINUX_KERNEL_ENVI)
107*53ee8cc1Swenshuai.xi #include "drvHVD_Common.h"
108*53ee8cc1Swenshuai.xi #else
109*53ee8cc1Swenshuai.xi #include "MsCommon.h"
110*53ee8cc1Swenshuai.xi #endif
111*53ee8cc1Swenshuai.xi 
112*53ee8cc1Swenshuai.xi #include "MsOS.h"
113*53ee8cc1Swenshuai.xi #include "asmCPU.h"
114*53ee8cc1Swenshuai.xi 
115*53ee8cc1Swenshuai.xi 
116*53ee8cc1Swenshuai.xi #if (!defined(MSOS_TYPE_NUTTX) && !defined(MSOS_TYPE_OPTEE)) || defined(SUPPORT_X_MODEL_FEATURE)
117*53ee8cc1Swenshuai.xi 
118*53ee8cc1Swenshuai.xi // Internal Definition
119*53ee8cc1Swenshuai.xi #include "regVPU_EX.h"
120*53ee8cc1Swenshuai.xi #include "halVPU_EX.h"
121*53ee8cc1Swenshuai.xi #include "halCHIP.h"
122*53ee8cc1Swenshuai.xi #include "drvSYS.h"
123*53ee8cc1Swenshuai.xi #if defined(VDEC3)
124*53ee8cc1Swenshuai.xi #include "../../../drv/hvd_v3/drvHVD_def.h"
125*53ee8cc1Swenshuai.xi #include "../hvd_v3/fwHVD_if.h"
126*53ee8cc1Swenshuai.xi #include "../mvd_v3/mvd4_interface.h"
127*53ee8cc1Swenshuai.xi #include "halHVD_EX.h"
128*53ee8cc1Swenshuai.xi #else
129*53ee8cc1Swenshuai.xi #include "../../../drv/hvd_v3/drvHVD_def.h"
130*53ee8cc1Swenshuai.xi #include "../hvd_v3/fwHVD_if.h"
131*53ee8cc1Swenshuai.xi #include "../mvd_v3/mvd4_interface.h"
132*53ee8cc1Swenshuai.xi #endif
133*53ee8cc1Swenshuai.xi #include "controller.h"
134*53ee8cc1Swenshuai.xi 
135*53ee8cc1Swenshuai.xi #if (ENABLE_DECOMPRESS_FUNCTION == TRUE)
136*53ee8cc1Swenshuai.xi #include "ms_decompress.h"
137*53ee8cc1Swenshuai.xi #include "ms_decompress_priv.h"
138*53ee8cc1Swenshuai.xi #endif
139*53ee8cc1Swenshuai.xi #include "../../drv/mbx/apiMBX_St.h"
140*53ee8cc1Swenshuai.xi #include "../../drv/mbx/apiMBX.h"
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi #if VPU_ENABLE_BDMA_FW_FLASH_2_SDRAM
143*53ee8cc1Swenshuai.xi #include "drvSERFLASH.h"
144*53ee8cc1Swenshuai.xi #define HVD_FLASHcpy(DESTADDR, SRCADDR, LEN, Flag)  MDrv_SERFLASH_CopyHnd((MS_PHY)(SRCADDR), (MS_PHY)(DESTADDR), (LEN), (Flag), SPIDMA_OPCFG_DEF)
145*53ee8cc1Swenshuai.xi #endif
146*53ee8cc1Swenshuai.xi 
147*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
148*53ee8cc1Swenshuai.xi #define VPRINTF printk
149*53ee8cc1Swenshuai.xi #else
150*53ee8cc1Swenshuai.xi #ifndef ANDROID
151*53ee8cc1Swenshuai.xi #define VPRINTF printf
152*53ee8cc1Swenshuai.xi #else
153*53ee8cc1Swenshuai.xi #include <sys/mman.h>
154*53ee8cc1Swenshuai.xi #include <cutils/ashmem.h>
155*53ee8cc1Swenshuai.xi #include <cutils/log.h>
156*53ee8cc1Swenshuai.xi #define VPRINTF ALOGD
157*53ee8cc1Swenshuai.xi #endif
158*53ee8cc1Swenshuai.xi #endif
159*53ee8cc1Swenshuai.xi 
160*53ee8cc1Swenshuai.xi #ifdef CONFIG_MSTAR_CLKM
161*53ee8cc1Swenshuai.xi #include "drvCLKM.h"
162*53ee8cc1Swenshuai.xi #endif
163*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
164*53ee8cc1Swenshuai.xi //  Driver Compiler Options
165*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
166*53ee8cc1Swenshuai.xi 
167*53ee8cc1Swenshuai.xi 
168*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
169*53ee8cc1Swenshuai.xi //  Local Defines
170*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
171*53ee8cc1Swenshuai.xi #define VPU_CTL_INTERFACE_VER   0x00000001  //the interface version of VPU driver
172*53ee8cc1Swenshuai.xi 
173*53ee8cc1Swenshuai.xi #define VPU_MIU1BASE_ADDR    0x40000000UL   //Notice: this define must be comfirm with designer
174*53ee8cc1Swenshuai.xi #ifdef VDEC3
175*53ee8cc1Swenshuai.xi #define MAX_EVD_BBU_COUNT 2 // This definition is chip-dependent.
176*53ee8cc1Swenshuai.xi #define MAX_HVD_BBU_COUNT 2 // The Chip after Monaco(included) have two EVD BBU, must check this definition when bring up
177*53ee8cc1Swenshuai.xi #define MAX_MVD_SLQ_COUNT 2
178*53ee8cc1Swenshuai.xi #define MAX_SUPPORT_DECODER_NUM 16
179*53ee8cc1Swenshuai.xi #else
180*53ee8cc1Swenshuai.xi #define MAX_SUPPORT_DECODER_NUM 2
181*53ee8cc1Swenshuai.xi #endif
182*53ee8cc1Swenshuai.xi typedef enum
183*53ee8cc1Swenshuai.xi {
184*53ee8cc1Swenshuai.xi     E_VDEC_EX_REE_TO_TEE_MBX_MSG_NULL,
185*53ee8cc1Swenshuai.xi     E_VDEC_EX_REE_TO_TEE_MBX_MSG_FW_LoadCode,
186*53ee8cc1Swenshuai.xi     E_VDEC_EX_REE_TO_TEE_MBX_MSG_GETSHMBASEADDR,
187*53ee8cc1Swenshuai.xi } VDEC_REE_TO_TEE_MBX_MSG_TYPE;
188*53ee8cc1Swenshuai.xi 
189*53ee8cc1Swenshuai.xi 
190*53ee8cc1Swenshuai.xi typedef enum
191*53ee8cc1Swenshuai.xi {
192*53ee8cc1Swenshuai.xi     E_VDEC_EX_TEE_TO_REE_MBX_MSG_NULL,
193*53ee8cc1Swenshuai.xi     E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_INVALID,
194*53ee8cc1Swenshuai.xi     E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_NO_TEE,
195*53ee8cc1Swenshuai.xi     E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS,
196*53ee8cc1Swenshuai.xi     E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL
197*53ee8cc1Swenshuai.xi } VDEC_TEE_TO_REE_MBX_ACK_TYPE;
198*53ee8cc1Swenshuai.xi 
199*53ee8cc1Swenshuai.xi typedef enum
200*53ee8cc1Swenshuai.xi {
201*53ee8cc1Swenshuai.xi     E_VPU_UART_CTRL_DISABLE = BIT(4),
202*53ee8cc1Swenshuai.xi     E_VPU_UART_CTRL_ERR     = BIT(0),
203*53ee8cc1Swenshuai.xi     E_VPU_UART_CTRL_INFO    = BIT(1),
204*53ee8cc1Swenshuai.xi     E_VPU_UART_CTRL_DBG     = BIT(2),
205*53ee8cc1Swenshuai.xi     E_VPU_UART_CTRL_FW      = BIT(3),
206*53ee8cc1Swenshuai.xi     E_VPU_UART_CTRL_MUST    = BIT(4),
207*53ee8cc1Swenshuai.xi     E_VPU_UART_CTRL_TRACE   = BIT(5),
208*53ee8cc1Swenshuai.xi } VPU_EX_UartCtrl;
209*53ee8cc1Swenshuai.xi 
210*53ee8cc1Swenshuai.xi typedef struct
211*53ee8cc1Swenshuai.xi {
212*53ee8cc1Swenshuai.xi     HAL_VPU_StreamId eStreamId;
213*53ee8cc1Swenshuai.xi     VPU_EX_DecoderType eDecodertype;
214*53ee8cc1Swenshuai.xi } VPU_EX_Stream;
215*53ee8cc1Swenshuai.xi 
216*53ee8cc1Swenshuai.xi typedef struct
217*53ee8cc1Swenshuai.xi {
218*53ee8cc1Swenshuai.xi     MS_BOOL bSTCSetMode;
219*53ee8cc1Swenshuai.xi     MS_U32  u32STCIndex;
220*53ee8cc1Swenshuai.xi } VPU_EX_STC;
221*53ee8cc1Swenshuai.xi 
222*53ee8cc1Swenshuai.xi #include "ULog.h"
223*53ee8cc1Swenshuai.xi #define VPU_MSG_ERR(format, args...)                \
224*53ee8cc1Swenshuai.xi     do                                              \
225*53ee8cc1Swenshuai.xi     {                                               \
226*53ee8cc1Swenshuai.xi         if (u32VpuUartCtrl & E_VPU_UART_CTRL_ERR)   \
227*53ee8cc1Swenshuai.xi         {                                           \
228*53ee8cc1Swenshuai.xi             ULOGE("VPU", "[ERR]%s:", __FUNCTION__); \
229*53ee8cc1Swenshuai.xi             ULOGE("VPU", format, ##args);           \
230*53ee8cc1Swenshuai.xi         }                                           \
231*53ee8cc1Swenshuai.xi     } while (0)
232*53ee8cc1Swenshuai.xi 
233*53ee8cc1Swenshuai.xi #define VPU_MSG_DBG(format, args...)                \
234*53ee8cc1Swenshuai.xi     do                                              \
235*53ee8cc1Swenshuai.xi     {                                               \
236*53ee8cc1Swenshuai.xi         if (u32VpuUartCtrl & E_VPU_UART_CTRL_DBG)   \
237*53ee8cc1Swenshuai.xi         {                                           \
238*53ee8cc1Swenshuai.xi             ULOGD("VPU", "[DBG]%s:", __FUNCTION__); \
239*53ee8cc1Swenshuai.xi             ULOGD("VPU", format, ##args);           \
240*53ee8cc1Swenshuai.xi         }                                           \
241*53ee8cc1Swenshuai.xi     } while (0)
242*53ee8cc1Swenshuai.xi 
243*53ee8cc1Swenshuai.xi #define VPU_MSG_INFO(format, args...)               \
244*53ee8cc1Swenshuai.xi     do                                              \
245*53ee8cc1Swenshuai.xi     {                                               \
246*53ee8cc1Swenshuai.xi         if (u32VpuUartCtrl & E_VPU_UART_CTRL_INFO)  \
247*53ee8cc1Swenshuai.xi         {                                           \
248*53ee8cc1Swenshuai.xi             ULOGI("VPU", "[INF]%s:", __FUNCTION__); \
249*53ee8cc1Swenshuai.xi             ULOGI("VPU", format, ##args);           \
250*53ee8cc1Swenshuai.xi         }                                           \
251*53ee8cc1Swenshuai.xi     } while (0)
252*53ee8cc1Swenshuai.xi 
253*53ee8cc1Swenshuai.xi //------------------------------ MIU SETTINGS ----------------------------------
254*53ee8cc1Swenshuai.xi #ifdef EVDR2
255*53ee8cc1Swenshuai.xi #define _MaskMiuReq_VPU_D_RW(m)     _VPU_WriteRegBit(MIU0_REG_RQ0_MASK, m, BIT(6))
256*53ee8cc1Swenshuai.xi #define _MaskMiuReq_VPU_Q_RW(m)     _VPU_WriteRegBit(MIU0_REG_RQ0_MASK, m, BIT(6))
257*53ee8cc1Swenshuai.xi #define _MaskMiuReq_VPU_I_R(m)      _VPU_WriteRegBit(MIU0_REG_RQ0_MASK+1, m, BIT(0))
258*53ee8cc1Swenshuai.xi 
259*53ee8cc1Swenshuai.xi #define _MaskMiu1Req_VPU_D_RW(m)    _VPU_WriteRegBit(MIU1_REG_RQ0_MASK, m, BIT(6))
260*53ee8cc1Swenshuai.xi #define _MaskMiu1Req_VPU_Q_RW(m)    _VPU_WriteRegBit(MIU1_REG_RQ0_MASK, m, BIT(6))
261*53ee8cc1Swenshuai.xi #define _MaskMiu1Req_VPU_I_R(m)     _VPU_WriteRegBit(MIU1_REG_RQ0_MASK+1, m, BIT(0))
262*53ee8cc1Swenshuai.xi 
263*53ee8cc1Swenshuai.xi #define _MaskMiu2Req_VPU_D_RW(m)    _VPU_WriteRegBit(MIU2_REG_RQ0_MASK, m, BIT(6))
264*53ee8cc1Swenshuai.xi #define _MaskMiu2Req_VPU_Q_RW(m)    _VPU_WriteRegBit(MIU2_REG_RQ0_MASK, m, BIT(6))
265*53ee8cc1Swenshuai.xi #define _MaskMiu2Req_VPU_I_R(m)     _VPU_WriteRegBit(MIU2_REG_RQ0_MASK+1, m, BIT(0))
266*53ee8cc1Swenshuai.xi 
267*53ee8cc1Swenshuai.xi 
268*53ee8cc1Swenshuai.xi #define VPU_D_RW_ON_MIU0            (((_VPU_ReadByte(MIU0_REG_SEL0) & BIT(6)) == 0) && ((_VPU_ReadByte(MIU2_REG_SEL0) & BIT(6)) == 0))
269*53ee8cc1Swenshuai.xi #define VPU_Q_RW_ON_MIU0            (((_VPU_ReadByte(MIU0_REG_SEL0) & BIT(6)) == 0) && ((_VPU_ReadByte(MIU2_REG_SEL0) & BIT(6)) == 0))
270*53ee8cc1Swenshuai.xi #define VPU_I_R_ON_MIU0             (((_VPU_ReadByte(MIU0_REG_SEL0+1) & BIT(0)) == 0) && ((_VPU_ReadByte(MIU2_REG_SEL0+1) & BIT(0)) == 0)) //g08
271*53ee8cc1Swenshuai.xi #define VPU_D_RW_ON_MIU1            (((_VPU_ReadByte(MIU0_REG_SEL0) & BIT(6)) == BIT(6)) && ((_VPU_ReadByte(MIU2_REG_SEL0) & BIT(6)) == 0))
272*53ee8cc1Swenshuai.xi #define VPU_Q_RW_ON_MIU1            (((_VPU_ReadByte(MIU0_REG_SEL0) & BIT(6)) == BIT(6)) && ((_VPU_ReadByte(MIU2_REG_SEL0) & BIT(6)) == 0))
273*53ee8cc1Swenshuai.xi #define VPU_I_R_ON_MIU1             (((_VPU_ReadByte(MIU0_REG_SEL0+1) & BIT(0)) == BIT(0)) && ((_VPU_ReadByte(MIU2_REG_SEL0+1) & BIT(0)) == 0)) //g08
274*53ee8cc1Swenshuai.xi #define VPU_D_RW_ON_MIU2            (((_VPU_ReadByte(MIU0_REG_SEL0) & BIT(6)) == 0) && ((_VPU_ReadByte(MIU2_REG_SEL0) & BIT(6)) == BIT(6)))
275*53ee8cc1Swenshuai.xi #define VPU_Q_RW_ON_MIU2            (((_VPU_ReadByte(MIU0_REG_SEL0) & BIT(6)) == 0) && ((_VPU_ReadByte(MIU2_REG_SEL0) & BIT(6)) == BIT(6)))
276*53ee8cc1Swenshuai.xi #define VPU_I_R_ON_MIU2             (((_VPU_ReadByte(MIU0_REG_SEL0+1) & BIT(0)) == 0) && ((_VPU_ReadByte(MIU2_REG_SEL0+1) & BIT(0)) == BIT(0))) //g08
277*53ee8cc1Swenshuai.xi #endif
278*53ee8cc1Swenshuai.xi 
279*53ee8cc1Swenshuai.xi 
280*53ee8cc1Swenshuai.xi 
281*53ee8cc1Swenshuai.xi #define _VPU_MIU_SetReqMask(miu_clients, mask)  \
282*53ee8cc1Swenshuai.xi     do                                          \
283*53ee8cc1Swenshuai.xi     {                                           \
284*53ee8cc1Swenshuai.xi        if (miu_clients##_ON_MIU0 == 1)   \
285*53ee8cc1Swenshuai.xi        {                                       \
286*53ee8cc1Swenshuai.xi            _MaskMiuReq_##miu_clients(mask);     \
287*53ee8cc1Swenshuai.xi        }                                       \
288*53ee8cc1Swenshuai.xi        else                                     \
289*53ee8cc1Swenshuai.xi        {                                       \
290*53ee8cc1Swenshuai.xi            if (miu_clients##_ON_MIU1 == 1)   \
291*53ee8cc1Swenshuai.xi            {                                       \
292*53ee8cc1Swenshuai.xi            _MaskMiu1Req_##miu_clients(mask);    \
293*53ee8cc1Swenshuai.xi            }                                       \
294*53ee8cc1Swenshuai.xi            else if (miu_clients##_ON_MIU2 == 1)   \
295*53ee8cc1Swenshuai.xi            {                                           \
296*53ee8cc1Swenshuai.xi                _MaskMiu2Req_##miu_clients(mask);   \
297*53ee8cc1Swenshuai.xi            }                                           \
298*53ee8cc1Swenshuai.xi        }                                       \
299*53ee8cc1Swenshuai.xi    } while(0)
300*53ee8cc1Swenshuai.xi 
301*53ee8cc1Swenshuai.xi 
302*53ee8cc1Swenshuai.xi 
303*53ee8cc1Swenshuai.xi 
304*53ee8cc1Swenshuai.xi #if ENABLE_VPU_MUTEX_PROTECTION
305*53ee8cc1Swenshuai.xi MS_S32 s32VPUMutexID = -1;
306*53ee8cc1Swenshuai.xi MS_U8 _u8VPU_Mutex[] = { "VPU_Mutex" };
307*53ee8cc1Swenshuai.xi 
308*53ee8cc1Swenshuai.xi #define _HAL_VPU_MutexCreate()  \
309*53ee8cc1Swenshuai.xi     if (s32VPUMutexID < 0)      \
310*53ee8cc1Swenshuai.xi     {                           \
311*53ee8cc1Swenshuai.xi         s32VPUMutexID = MsOS_CreateMutex(E_MSOS_FIFO,(char*)_u8VPU_Mutex, MSOS_PROCESS_SHARED); \
312*53ee8cc1Swenshuai.xi     }
313*53ee8cc1Swenshuai.xi 
314*53ee8cc1Swenshuai.xi #define _HAL_VPU_MutexDelete()              \
315*53ee8cc1Swenshuai.xi     if (s32VPUMutexID >= 0)                 \
316*53ee8cc1Swenshuai.xi     {                                       \
317*53ee8cc1Swenshuai.xi         MsOS_DeleteMutex(s32VPUMutexID);    \
318*53ee8cc1Swenshuai.xi         s32VPUMutexID = -1;                 \
319*53ee8cc1Swenshuai.xi     }
320*53ee8cc1Swenshuai.xi 
321*53ee8cc1Swenshuai.xi #define _HAL_VPU_Entry()                                                \
322*53ee8cc1Swenshuai.xi     if (s32VPUMutexID >= 0)                                             \
323*53ee8cc1Swenshuai.xi     {                                                                   \
324*53ee8cc1Swenshuai.xi         if (!MsOS_ObtainMutex(s32VPUMutexID, VPU_DEFAULT_MUTEX_TIMEOUT))       \
325*53ee8cc1Swenshuai.xi         {                                                               \
326*53ee8cc1Swenshuai.xi             printf("[HAL VPU][%06d] Mutex taking timeout\n", __LINE__); \
327*53ee8cc1Swenshuai.xi         }                                                               \
328*53ee8cc1Swenshuai.xi     }
329*53ee8cc1Swenshuai.xi 
330*53ee8cc1Swenshuai.xi #define _HAL_VPU_Return(_ret)                   \
331*53ee8cc1Swenshuai.xi     {                                           \
332*53ee8cc1Swenshuai.xi         if (s32VPUMutexID >= 0)                 \
333*53ee8cc1Swenshuai.xi         {                                       \
334*53ee8cc1Swenshuai.xi             MsOS_ReleaseMutex(s32VPUMutexID);   \
335*53ee8cc1Swenshuai.xi         }                                       \
336*53ee8cc1Swenshuai.xi         return _ret;                            \
337*53ee8cc1Swenshuai.xi     }
338*53ee8cc1Swenshuai.xi 
339*53ee8cc1Swenshuai.xi #define _HAL_VPU_Release()                      \
340*53ee8cc1Swenshuai.xi     {                                           \
341*53ee8cc1Swenshuai.xi         if (s32VPUMutexID >= 0)                 \
342*53ee8cc1Swenshuai.xi         {                                       \
343*53ee8cc1Swenshuai.xi             MsOS_ReleaseMutex(s32VPUMutexID);   \
344*53ee8cc1Swenshuai.xi         }                                       \
345*53ee8cc1Swenshuai.xi     }
346*53ee8cc1Swenshuai.xi #else
347*53ee8cc1Swenshuai.xi #define _HAL_VPU_MutexCreate()
348*53ee8cc1Swenshuai.xi #define _HAL_VPU_MutexDelete()
349*53ee8cc1Swenshuai.xi #define _HAL_VPU_Entry()
350*53ee8cc1Swenshuai.xi #define _HAL_VPU_Return(_ret)       {return _ret;}
351*53ee8cc1Swenshuai.xi #define _HAL_VPU_Release()
352*53ee8cc1Swenshuai.xi #endif
353*53ee8cc1Swenshuai.xi 
354*53ee8cc1Swenshuai.xi #define VPU_FW_MEM_OFFSET   0x100000UL  // 1M
355*53ee8cc1Swenshuai.xi #define VPU_CMD_TIMEOUT     1000 // 1 sec
356*53ee8cc1Swenshuai.xi 
357*53ee8cc1Swenshuai.xi 
358*53ee8cc1Swenshuai.xi #if( !defined(MSOS_TYPE_LINUX_KERNEL) && !defined(ANDROID))
359*53ee8cc1Swenshuai.xi #define VPU_FIELD_DETECTOR          TRUE
360*53ee8cc1Swenshuai.xi #else
361*53ee8cc1Swenshuai.xi #define VPU_FIELD_DETECTOR          FALSE
362*53ee8cc1Swenshuai.xi #endif
363*53ee8cc1Swenshuai.xi 
364*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
365*53ee8cc1Swenshuai.xi //  Local Structures
366*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
367*53ee8cc1Swenshuai.xi typedef struct _VPU_HWInitFunc
368*53ee8cc1Swenshuai.xi {
369*53ee8cc1Swenshuai.xi     MS_BOOL (*pfMVDHW_Init)(void);
370*53ee8cc1Swenshuai.xi     MS_BOOL (*pfMVDHW_Deinit)(void);
371*53ee8cc1Swenshuai.xi     MS_BOOL (*pfHVDHW_Init)(MS_U32 u32Arg);
372*53ee8cc1Swenshuai.xi     MS_BOOL (*pfHVDHW_Deinit)(void);
373*53ee8cc1Swenshuai.xi } VPU_HWInitFunc;
374*53ee8cc1Swenshuai.xi 
375*53ee8cc1Swenshuai.xi typedef struct
376*53ee8cc1Swenshuai.xi {
377*53ee8cc1Swenshuai.xi     MS_U32  u32ApiHW_Version;   //<Version of current structure>
378*53ee8cc1Swenshuai.xi     MS_U16  u16ApiHW_Length;    //<Length of this structure>
379*53ee8cc1Swenshuai.xi 
380*53ee8cc1Swenshuai.xi     MS_U8   u8Cap_Support_Decoder_Num;
381*53ee8cc1Swenshuai.xi 
382*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_MPEG2;
383*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_H263;
384*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_MPEG4;
385*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_DIVX311;
386*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_DIVX412;
387*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_FLV;
388*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_VC1ADV;
389*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_VC1MAIN;
390*53ee8cc1Swenshuai.xi 
391*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_RV8;
392*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_RV9;
393*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_H264;
394*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_AVS;
395*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_AVS_PLUS;
396*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_MJPEG;
397*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_MVC;
398*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_VP8;
399*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_VP9;
400*53ee8cc1Swenshuai.xi     MS_BOOL bCap_Support_HEVC;
401*53ee8cc1Swenshuai.xi 
402*53ee8cc1Swenshuai.xi     /*New HW Cap and Feature add in struct at the end*/
403*53ee8cc1Swenshuai.xi }VDEC_HwCap;
404*53ee8cc1Swenshuai.xi 
405*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
406*53ee8cc1Swenshuai.xi //  Local Functions Prototype
407*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
408*53ee8cc1Swenshuai.xi static MS_BOOL          _VPU_EX_LoadVLCTable(VPU_EX_VLCTblCfg *pVlcCfg, MS_U8 u8FwSrcType);
409*53ee8cc1Swenshuai.xi MS_U8                   _VPU_EX_GetOffsetIdx(MS_U32 u32Id);
410*53ee8cc1Swenshuai.xi static HVD_User_Cmd     _VPU_EX_MapCtrlCmd(VPU_EX_TaskInfo *pTaskInfo);
411*53ee8cc1Swenshuai.xi 
412*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
413*53ee8cc1Swenshuai.xi //  Global Variables
414*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
415*53ee8cc1Swenshuai.xi extern HVD_Return HAL_HVD_EX_SetCmd(MS_U32 u32Id, HVD_User_Cmd eUsrCmd, MS_U32 u32CmdArg);
416*53ee8cc1Swenshuai.xi extern MS_BOOL HAL_MVD_InitHW(VPU_EX_SourceType SourceType,VPU_EX_DecoderType eDecType);
417*53ee8cc1Swenshuai.xi extern MS_BOOL HAL_MVD_DeinitHW(VPU_EX_SourceType SourceType, VPU_EX_DecoderType eDecType);
418*53ee8cc1Swenshuai.xi extern MS_BOOL HAL_HVD_EX_InitHW(MS_U32 u32Id,VPU_EX_DecoderType DecoderType);
419*53ee8cc1Swenshuai.xi extern MS_BOOL HAL_HVD_EX_DeinitHW(MS_U32 u32Id);
420*53ee8cc1Swenshuai.xi extern MS_BOOL HAL_EVD_EX_DeinitHW(MS_U32 u32Id);
421*53ee8cc1Swenshuai.xi extern MS_VIRT HAL_HVD_EX_GetShmAddr(MS_U32 u32Id);
422*53ee8cc1Swenshuai.xi #if SUPPORT_G2VP9 && defined(VDEC3)
423*53ee8cc1Swenshuai.xi extern MS_BOOL HAL_VP9_EX_DeinitHW(void);
424*53ee8cc1Swenshuai.xi #endif
425*53ee8cc1Swenshuai.xi #if defined (__aeon__)
426*53ee8cc1Swenshuai.xi static MS_VIRT u32VPURegOSBase = 0xA0000000UL;
427*53ee8cc1Swenshuai.xi #else
428*53ee8cc1Swenshuai.xi static MS_VIRT u32VPURegOSBase = 0xBF200000UL;
429*53ee8cc1Swenshuai.xi #endif
430*53ee8cc1Swenshuai.xi 
431*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
432*53ee8cc1Swenshuai.xi //  Local Variables
433*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
434*53ee8cc1Swenshuai.xi #if 0
435*53ee8cc1Swenshuai.xi 
436*53ee8cc1Swenshuai.xi static MS_BOOL _bVPUPowered = FALSE;
437*53ee8cc1Swenshuai.xi static MS_BOOL _bVPURsted = FALSE;
438*53ee8cc1Swenshuai.xi static MS_BOOL _bVPUSingleMode = FALSE;
439*53ee8cc1Swenshuai.xi static VPU_EX_DecModCfg _stVPUDecMode;
440*53ee8cc1Swenshuai.xi 
441*53ee8cc1Swenshuai.xi static MS_U8 u8TaskCnt = 0;
442*53ee8cc1Swenshuai.xi 
443*53ee8cc1Swenshuai.xi static MS_U32 u32VpuUartCtrl = (E_VPU_UART_CTRL_ERR | E_VPU_UART_CTRL_MUST);
444*53ee8cc1Swenshuai.xi 
445*53ee8cc1Swenshuai.xi //Notice: this function must be consistent with _VPU_EX_GetOffsetIdx()
446*53ee8cc1Swenshuai.xi static VPU_EX_Stream _stVPUStream[] =
447*53ee8cc1Swenshuai.xi {
448*53ee8cc1Swenshuai.xi     {E_HAL_VPU_MAIN_STREAM0, E_VPU_EX_DECODER_NONE},
449*53ee8cc1Swenshuai.xi     {E_HAL_VPU_SUB_STREAM0, E_VPU_EX_DECODER_NONE},
450*53ee8cc1Swenshuai.xi };
451*53ee8cc1Swenshuai.xi static VPU_HWInitFunc stHWInitFunc =
452*53ee8cc1Swenshuai.xi {
453*53ee8cc1Swenshuai.xi     &HAL_MVD_InitHW,
454*53ee8cc1Swenshuai.xi     &HAL_MVD_DeinitHW,
455*53ee8cc1Swenshuai.xi     &HAL_HVD_EX_InitHW,
456*53ee8cc1Swenshuai.xi     &HAL_HVD_EX_DeinitHW,
457*53ee8cc1Swenshuai.xi };
458*53ee8cc1Swenshuai.xi 
459*53ee8cc1Swenshuai.xi #endif
460*53ee8cc1Swenshuai.xi 
461*53ee8cc1Swenshuai.xi #if VPU_ENABLE_EMBEDDED_FW_BINARY
462*53ee8cc1Swenshuai.xi static const MS_U8 u8HVD_FW_Binary[] = {
463*53ee8cc1Swenshuai.xi     #include "fwVPU.dat"
464*53ee8cc1Swenshuai.xi };
465*53ee8cc1Swenshuai.xi 
466*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
467*53ee8cc1Swenshuai.xi static const MS_U8 u8HVD_VLC_Binary[] = {
468*53ee8cc1Swenshuai.xi     #include "fwVPU_VLC.dat"
469*53ee8cc1Swenshuai.xi };
470*53ee8cc1Swenshuai.xi #endif
471*53ee8cc1Swenshuai.xi #endif
472*53ee8cc1Swenshuai.xi 
473*53ee8cc1Swenshuai.xi 
474*53ee8cc1Swenshuai.xi #ifdef VDEC3
475*53ee8cc1Swenshuai.xi typedef struct
476*53ee8cc1Swenshuai.xi {
477*53ee8cc1Swenshuai.xi     MS_BOOL bTSP;
478*53ee8cc1Swenshuai.xi     MS_U8   u8RegSetting;  //NAL_TBL: BIT(0), ES_BUFFER: BIT(1)
479*53ee8cc1Swenshuai.xi     MS_U32  u32Used;
480*53ee8cc1Swenshuai.xi } BBU_STATE;
481*53ee8cc1Swenshuai.xi 
482*53ee8cc1Swenshuai.xi typedef struct
483*53ee8cc1Swenshuai.xi {
484*53ee8cc1Swenshuai.xi     MS_BOOL bTSP;
485*53ee8cc1Swenshuai.xi     MS_BOOL bUsedbyMVD;
486*53ee8cc1Swenshuai.xi     MS_U32 u32Used;
487*53ee8cc1Swenshuai.xi } SLQ_STATE;
488*53ee8cc1Swenshuai.xi #endif
489*53ee8cc1Swenshuai.xi 
490*53ee8cc1Swenshuai.xi typedef struct
491*53ee8cc1Swenshuai.xi {
492*53ee8cc1Swenshuai.xi     MS_BOOL _bVPUPowered;
493*53ee8cc1Swenshuai.xi     MS_BOOL _bVPURsted;
494*53ee8cc1Swenshuai.xi     MS_BOOL _bVPUSingleMode;
495*53ee8cc1Swenshuai.xi     VPU_EX_DecModCfg _stVPUDecMode;
496*53ee8cc1Swenshuai.xi     MS_U8 u8TaskCnt;
497*53ee8cc1Swenshuai.xi     //Notice: this function must be consistent with _VPU_EX_GetOffsetIdx()
498*53ee8cc1Swenshuai.xi #ifdef VDEC3
499*53ee8cc1Swenshuai.xi     VPU_EX_Stream _stVPUStream[MAX_SUPPORT_DECODER_NUM];
500*53ee8cc1Swenshuai.xi #else
501*53ee8cc1Swenshuai.xi     VPU_EX_Stream _stVPUStream[2];
502*53ee8cc1Swenshuai.xi #endif
503*53ee8cc1Swenshuai.xi 
504*53ee8cc1Swenshuai.xi     VPU_HWInitFunc stHWInitFunc;
505*53ee8cc1Swenshuai.xi 
506*53ee8cc1Swenshuai.xi     MS_BOOL bVpuExReloadFW;
507*53ee8cc1Swenshuai.xi     MS_BOOL bVpuExLoadFWRlt;
508*53ee8cc1Swenshuai.xi     MS_VIRT  u32VPUSHMAddr;    //PA
509*53ee8cc1Swenshuai.xi     MS_BOOL bEnableVPUSecureMode;
510*53ee8cc1Swenshuai.xi 
511*53ee8cc1Swenshuai.xi     MS_VIRT  u32FWShareInfoAddr[MAX_SUPPORT_DECODER_NUM];
512*53ee8cc1Swenshuai.xi     MS_BOOL bEnableDymanicFBMode;
513*53ee8cc1Swenshuai.xi     MS_PHY u32DynamicFBAddress;
514*53ee8cc1Swenshuai.xi     MS_U32 u32DynamicFBSize;
515*53ee8cc1Swenshuai.xi     #ifdef VDEC3
516*53ee8cc1Swenshuai.xi     MS_VIRT  u32FWCodeAddr;
517*53ee8cc1Swenshuai.xi     MS_VIRT  u32BitstreamAddress[MAX_SUPPORT_DECODER_NUM];
518*53ee8cc1Swenshuai.xi 
519*53ee8cc1Swenshuai.xi     BBU_STATE stHVD_BBU_STATE[MAX_HVD_BBU_COUNT];
520*53ee8cc1Swenshuai.xi     BBU_STATE stEVD_BBU_STATE[MAX_EVD_BBU_COUNT];
521*53ee8cc1Swenshuai.xi     SLQ_STATE stMVD_SLQ_STATE[MAX_MVD_SLQ_COUNT];
522*53ee8cc1Swenshuai.xi 
523*53ee8cc1Swenshuai.xi     MS_U8 u8HALId[MAX_SUPPORT_DECODER_NUM];
524*53ee8cc1Swenshuai.xi     #endif
525*53ee8cc1Swenshuai.xi     MS_U8 u8ForceRst;
526*53ee8cc1Swenshuai.xi     VPU_EX_STC _stVPUSTCMode[MAX_SUPPORT_DECODER_NUM];
527*53ee8cc1Swenshuai.xi 
528*53ee8cc1Swenshuai.xi     MS_S32 s32VpuFdTaskId[MAX_SUPPORT_DECODER_NUM];
529*53ee8cc1Swenshuai.xi     MS_BOOL bFDInit[MAX_SUPPORT_DECODER_NUM];
530*53ee8cc1Swenshuai.xi 
531*53ee8cc1Swenshuai.xi } VPU_Hal_CTX;
532*53ee8cc1Swenshuai.xi 
533*53ee8cc1Swenshuai.xi //global variables
534*53ee8cc1Swenshuai.xi VPU_Hal_CTX* pVPUHalContext = NULL;
535*53ee8cc1Swenshuai.xi VPU_Hal_CTX gVPUHalContext;
536*53ee8cc1Swenshuai.xi MS_U32 u32VpuUartCtrl = (E_VPU_UART_CTRL_ERR | E_VPU_UART_CTRL_MUST);
537*53ee8cc1Swenshuai.xi MS_BOOL bVPUMbxInitFlag = 0;
538*53ee8cc1Swenshuai.xi MS_U8 u8VPUMbxMsgClass = 0;
539*53ee8cc1Swenshuai.xi MBX_Msg VPUReeToTeeMbxMsg;
540*53ee8cc1Swenshuai.xi MBX_Msg VPUTeeToReeMbxMsg;
541*53ee8cc1Swenshuai.xi 
542*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
543*53ee8cc1Swenshuai.xi //  Debug Functions
544*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
545*53ee8cc1Swenshuai.xi 
546*53ee8cc1Swenshuai.xi 
547*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
548*53ee8cc1Swenshuai.xi //  Local Functions
549*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
550*53ee8cc1Swenshuai.xi 
_VPU_EX_LoadVLCTable(VPU_EX_VLCTblCfg * pVlcCfg,MS_U8 u8FwSrcType)551*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_LoadVLCTable(VPU_EX_VLCTblCfg *pVlcCfg, MS_U8 u8FwSrcType)
552*53ee8cc1Swenshuai.xi {
553*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
554*53ee8cc1Swenshuai.xi     if (E_HVD_FW_INPUT_SOURCE_FLASH == u8FwSrcType)
555*53ee8cc1Swenshuai.xi     {
556*53ee8cc1Swenshuai.xi #if VPU_ENABLE_BDMA_FW_FLASH_2_SDRAM
557*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("Load VLC outF2D: dest:0x%lx source:%lx size:%lx\n",
558*53ee8cc1Swenshuai.xi             pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
559*53ee8cc1Swenshuai.xi 
560*53ee8cc1Swenshuai.xi         if (pVlcCfg->u32BinSize)
561*53ee8cc1Swenshuai.xi         {
562*53ee8cc1Swenshuai.xi             SPIDMA_Dev cpyflag = E_SPIDMA_DEV_MIU1;
563*53ee8cc1Swenshuai.xi 
564*53ee8cc1Swenshuai.xi             MS_U32 u32Start;
565*53ee8cc1Swenshuai.xi             MS_U32 u32StartOffset;
566*53ee8cc1Swenshuai.xi             MS_U8  u8MiuSel;
567*53ee8cc1Swenshuai.xi 
568*53ee8cc1Swenshuai.xi             // Get MIU selection and offset from physical address = 0x30000000
569*53ee8cc1Swenshuai.xi             _phy_to_miu_offset(u8MiuSel, u32StartOffset, pVlcCfg->u32FrameBufAddr);
570*53ee8cc1Swenshuai.xi 
571*53ee8cc1Swenshuai.xi 
572*53ee8cc1Swenshuai.xi             if(u8MiuSel == E_CHIP_MIU_0)
573*53ee8cc1Swenshuai.xi                 cpyflag = E_SPIDMA_DEV_MIU0;
574*53ee8cc1Swenshuai.xi             else if(u8MiuSel == E_CHIP_MIU_1)
575*53ee8cc1Swenshuai.xi                 cpyflag = E_SPIDMA_DEV_MIU1;
576*53ee8cc1Swenshuai.xi             else if(u8MiuSel == E_CHIP_MIU_2)
577*53ee8cc1Swenshuai.xi                 cpyflag = E_SPIDMA_DEV_MIU2;
578*53ee8cc1Swenshuai.xi 
579*53ee8cc1Swenshuai.xi             if (!HVD_FLASHcpy(MsOS_VA2PA(pVlcCfg->u32DstAddr), MsOS_VA2PA(pVlcCfg->u32BinAddr), pVlcCfg->u32BinSize, cpyflag))
580*53ee8cc1Swenshuai.xi             {
581*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",
582*53ee8cc1Swenshuai.xi                      pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize, (MS_U32) cpyflag);
583*53ee8cc1Swenshuai.xi 
584*53ee8cc1Swenshuai.xi                 return FALSE;
585*53ee8cc1Swenshuai.xi             }
586*53ee8cc1Swenshuai.xi         }
587*53ee8cc1Swenshuai.xi         else
588*53ee8cc1Swenshuai.xi         {
589*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("During copy VLC from Flash to Dram, the source size of FW is zero\n");
590*53ee8cc1Swenshuai.xi             return FALSE;
591*53ee8cc1Swenshuai.xi         }
592*53ee8cc1Swenshuai.xi #else
593*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("driver not enable to use BDMA copy VLC from flash 2 sdram.\n");
594*53ee8cc1Swenshuai.xi         return FALSE;
595*53ee8cc1Swenshuai.xi #endif
596*53ee8cc1Swenshuai.xi     }
597*53ee8cc1Swenshuai.xi     else
598*53ee8cc1Swenshuai.xi     {
599*53ee8cc1Swenshuai.xi         if (E_HVD_FW_INPUT_SOURCE_DRAM == u8FwSrcType)
600*53ee8cc1Swenshuai.xi         {
601*53ee8cc1Swenshuai.xi             if ((pVlcCfg->u32BinAddr != 0) && (pVlcCfg->u32BinSize != 0))
602*53ee8cc1Swenshuai.xi             {
603*53ee8cc1Swenshuai.xi                 VPU_MSG_INFO("Load VLC outD2D: dest:0x%lx source:%lx size:%lx\n",
604*53ee8cc1Swenshuai.xi                             (unsigned long)pVlcCfg->u32DstAddr, (unsigned long)pVlcCfg->u32BinAddr, (unsigned long)pVlcCfg->u32BinSize);
605*53ee8cc1Swenshuai.xi 
606*53ee8cc1Swenshuai.xi #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
607*53ee8cc1Swenshuai.xi                 BDMA_Result bdmaRlt;
608*53ee8cc1Swenshuai.xi                 MS_VIRT u32DstAdd = 0, u32SrcAdd = 0, u32tabsize = 0;
609*53ee8cc1Swenshuai.xi 
610*53ee8cc1Swenshuai.xi                 u32DstAdd   = pVlcCfg->u32FrameBufAddr + pVlcCfg->u32VLCTableOffset;
611*53ee8cc1Swenshuai.xi                 u32SrcAdd   = pVlcCfg->u32BinAddr;
612*53ee8cc1Swenshuai.xi                 u32tabsize  = pVlcCfg->u32BinSize;
613*53ee8cc1Swenshuai.xi                 //bdmaRlt = MDrv_BDMA_MemCopy(u32SrcAdd, u32DstAdd, SLQ_TBL_SIZE);
614*53ee8cc1Swenshuai.xi                 MsOS_FlushMemory();
615*53ee8cc1Swenshuai.xi                 bdmaRlt = HVD_dmacpy(u32DstAdd, u32SrcAdd, u32tabsize);
616*53ee8cc1Swenshuai.xi 
617*53ee8cc1Swenshuai.xi                 if (E_BDMA_OK != bdmaRlt)
618*53ee8cc1Swenshuai.xi                 {
619*53ee8cc1Swenshuai.xi                     VPU_MSG_ERR("MDrv_BDMA_MemCopy fail in %s(), ret=%x!\n", __FUNCTION__, bdmaRlt);
620*53ee8cc1Swenshuai.xi                 }
621*53ee8cc1Swenshuai.xi #else
622*53ee8cc1Swenshuai.xi                 HVD_memcpy(pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
623*53ee8cc1Swenshuai.xi #endif
624*53ee8cc1Swenshuai.xi             }
625*53ee8cc1Swenshuai.xi             else
626*53ee8cc1Swenshuai.xi             {
627*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR
628*53ee8cc1Swenshuai.xi                     ("During copy VLC from out Dram to Dram, the source size or virtual address of VLC is zero\n");
629*53ee8cc1Swenshuai.xi                 return FALSE;
630*53ee8cc1Swenshuai.xi             }
631*53ee8cc1Swenshuai.xi         }
632*53ee8cc1Swenshuai.xi         else
633*53ee8cc1Swenshuai.xi         {
634*53ee8cc1Swenshuai.xi #if VPU_ENABLE_EMBEDDED_FW_BINARY
635*53ee8cc1Swenshuai.xi #ifdef HVD_CACHE_TO_UNCACHE_CONVERT
636*53ee8cc1Swenshuai.xi             MS_U8 *pu8HVD_VLC_Binary;
637*53ee8cc1Swenshuai.xi 
638*53ee8cc1Swenshuai.xi             pu8HVD_VLC_Binary = (MS_U8 *) ((MS_U32) u8HVD_VLC_Binary | 0xA0000000);
639*53ee8cc1Swenshuai.xi 
640*53ee8cc1Swenshuai.xi             VPU_MSG_DBG("Load VLC inD2D: dest:0x%lx source:%lx size:%lx\n",
641*53ee8cc1Swenshuai.xi                         pVlcCfg->u32FrameBufAddr + pVlcCfg->u32VLCTableOffset, ((MS_U32) pu8HVD_VLC_Binary),
642*53ee8cc1Swenshuai.xi                         (MS_U32) sizeof(u8HVD_VLC_Binary));
643*53ee8cc1Swenshuai.xi 
644*53ee8cc1Swenshuai.xi             HVD_memcpy((void *) (pVlcCfg->u32FrameBufAddr + pVlcCfg->u32VLCTableOffset),
645*53ee8cc1Swenshuai.xi                        (void *) ((MS_U32) pu8HVD_VLC_Binary), sizeof(u8HVD_VLC_Binary));
646*53ee8cc1Swenshuai.xi #else
647*53ee8cc1Swenshuai.xi             VPU_MSG_INFO("Load VLC inD2D: dest:0x%lx source:%lx size:%x\n",
648*53ee8cc1Swenshuai.xi                         (unsigned long)MsOS_VA2PA(pVlcCfg->u32DstAddr), (unsigned long)u8HVD_VLC_Binary,
649*53ee8cc1Swenshuai.xi                         (MS_U32) sizeof(u8HVD_VLC_Binary));
650*53ee8cc1Swenshuai.xi 
651*53ee8cc1Swenshuai.xi             HVD_memcpy(pVlcCfg->u32DstAddr, ((unsigned long)u8HVD_VLC_Binary), sizeof(u8HVD_VLC_Binary));
652*53ee8cc1Swenshuai.xi #endif
653*53ee8cc1Swenshuai.xi #else
654*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("driver not enable to use embedded VLC binary.\n");
655*53ee8cc1Swenshuai.xi             return FALSE;
656*53ee8cc1Swenshuai.xi #endif
657*53ee8cc1Swenshuai.xi         }
658*53ee8cc1Swenshuai.xi     }
659*53ee8cc1Swenshuai.xi #endif
660*53ee8cc1Swenshuai.xi 
661*53ee8cc1Swenshuai.xi     return TRUE;
662*53ee8cc1Swenshuai.xi }
663*53ee8cc1Swenshuai.xi 
664*53ee8cc1Swenshuai.xi //Notice: this function must be consistent with _stVPUStream[]
_VPU_EX_GetOffsetIdx(MS_U32 u32Id)665*53ee8cc1Swenshuai.xi MS_U8 _VPU_EX_GetOffsetIdx(MS_U32 u32Id)
666*53ee8cc1Swenshuai.xi {
667*53ee8cc1Swenshuai.xi     MS_U8 u8OffsetIdx = 0;
668*53ee8cc1Swenshuai.xi     MS_U8 u8VSidBaseMask = 0xF0;
669*53ee8cc1Swenshuai.xi     HAL_VPU_StreamId eVSidBase = (HAL_VPU_StreamId)(u32Id & u8VSidBaseMask);
670*53ee8cc1Swenshuai.xi 
671*53ee8cc1Swenshuai.xi     switch (eVSidBase)
672*53ee8cc1Swenshuai.xi     {
673*53ee8cc1Swenshuai.xi         case E_HAL_VPU_MAIN_STREAM_BASE:
674*53ee8cc1Swenshuai.xi         {
675*53ee8cc1Swenshuai.xi             u8OffsetIdx = 0;
676*53ee8cc1Swenshuai.xi             break;
677*53ee8cc1Swenshuai.xi         }
678*53ee8cc1Swenshuai.xi         case E_HAL_VPU_SUB_STREAM_BASE:
679*53ee8cc1Swenshuai.xi         {
680*53ee8cc1Swenshuai.xi             u8OffsetIdx = 1;
681*53ee8cc1Swenshuai.xi             break;
682*53ee8cc1Swenshuai.xi         }
683*53ee8cc1Swenshuai.xi         case E_HAL_VPU_MVC_STREAM_BASE:
684*53ee8cc1Swenshuai.xi         {
685*53ee8cc1Swenshuai.xi             u8OffsetIdx = 0;
686*53ee8cc1Swenshuai.xi             break;
687*53ee8cc1Swenshuai.xi         }
688*53ee8cc1Swenshuai.xi #ifdef VDEC3
689*53ee8cc1Swenshuai.xi         case E_HAL_VPU_N_STREAM_BASE:
690*53ee8cc1Swenshuai.xi         {
691*53ee8cc1Swenshuai.xi             u8OffsetIdx = u32Id & 0x0F;
692*53ee8cc1Swenshuai.xi             break;
693*53ee8cc1Swenshuai.xi         }
694*53ee8cc1Swenshuai.xi #endif
695*53ee8cc1Swenshuai.xi         default:
696*53ee8cc1Swenshuai.xi         {
697*53ee8cc1Swenshuai.xi             u8OffsetIdx = 0;
698*53ee8cc1Swenshuai.xi             break;
699*53ee8cc1Swenshuai.xi         }
700*53ee8cc1Swenshuai.xi     }
701*53ee8cc1Swenshuai.xi 
702*53ee8cc1Swenshuai.xi     /*
703*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("u32Id=0x%lx, eVSidBase=0x%x, u8OffsetIdx=0x%x\n",
704*53ee8cc1Swenshuai.xi         u32Id, eVSidBase, u8OffsetIdx);
705*53ee8cc1Swenshuai.xi         */
706*53ee8cc1Swenshuai.xi     return u8OffsetIdx;
707*53ee8cc1Swenshuai.xi }
708*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetOffsetIdx(MS_U32 u32Id)709*53ee8cc1Swenshuai.xi MS_U8 HAL_VPU_EX_GetOffsetIdx(MS_U32 u32Id)
710*53ee8cc1Swenshuai.xi {
711*53ee8cc1Swenshuai.xi     return _VPU_EX_GetOffsetIdx(u32Id);
712*53ee8cc1Swenshuai.xi }
713*53ee8cc1Swenshuai.xi 
_VPU_EX_Context_Init(void)714*53ee8cc1Swenshuai.xi static void _VPU_EX_Context_Init(void)
715*53ee8cc1Swenshuai.xi {
716*53ee8cc1Swenshuai.xi #ifdef VDEC3
717*53ee8cc1Swenshuai.xi     MS_U8 i;
718*53ee8cc1Swenshuai.xi 
719*53ee8cc1Swenshuai.xi     for (i = 0; i < MAX_SUPPORT_DECODER_NUM; i++)
720*53ee8cc1Swenshuai.xi     {
721*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUStream[i].eStreamId = E_HAL_VPU_N_STREAM0 + i;
722*53ee8cc1Swenshuai.xi         pVPUHalContext->u32FWShareInfoAddr[i] = 0xFFFFFFFFUL;
723*53ee8cc1Swenshuai.xi     }
724*53ee8cc1Swenshuai.xi 
725*53ee8cc1Swenshuai.xi     for (i = 0; i < MAX_HVD_BBU_COUNT; i++)
726*53ee8cc1Swenshuai.xi     {
727*53ee8cc1Swenshuai.xi         pVPUHalContext->stHVD_BBU_STATE[i].bTSP = FALSE;
728*53ee8cc1Swenshuai.xi         pVPUHalContext->stHVD_BBU_STATE[i].u32Used = 0;
729*53ee8cc1Swenshuai.xi     }
730*53ee8cc1Swenshuai.xi 
731*53ee8cc1Swenshuai.xi     for (i = 0; i < MAX_EVD_BBU_COUNT; i++)
732*53ee8cc1Swenshuai.xi     {
733*53ee8cc1Swenshuai.xi         pVPUHalContext->stEVD_BBU_STATE[i].bTSP = FALSE;
734*53ee8cc1Swenshuai.xi         pVPUHalContext->stEVD_BBU_STATE[i].u32Used = 0;
735*53ee8cc1Swenshuai.xi     }
736*53ee8cc1Swenshuai.xi 
737*53ee8cc1Swenshuai.xi     for (i = 0; i < MAX_MVD_SLQ_COUNT; i++)
738*53ee8cc1Swenshuai.xi     {
739*53ee8cc1Swenshuai.xi         pVPUHalContext->stMVD_SLQ_STATE[i].bTSP = FALSE;
740*53ee8cc1Swenshuai.xi         pVPUHalContext->stMVD_SLQ_STATE[i].bUsedbyMVD= FALSE;
741*53ee8cc1Swenshuai.xi         pVPUHalContext->stMVD_SLQ_STATE[i].u32Used = 0;
742*53ee8cc1Swenshuai.xi     }
743*53ee8cc1Swenshuai.xi #else
744*53ee8cc1Swenshuai.xi     pVPUHalContext->_stVPUStream[0].eStreamId = E_HAL_VPU_MAIN_STREAM0;
745*53ee8cc1Swenshuai.xi     pVPUHalContext->_stVPUStream[1].eStreamId = E_HAL_VPU_SUB_STREAM0;
746*53ee8cc1Swenshuai.xi #endif
747*53ee8cc1Swenshuai.xi     pVPUHalContext->bVpuExReloadFW = TRUE;
748*53ee8cc1Swenshuai.xi     pVPUHalContext->u8ForceRst = 0;
749*53ee8cc1Swenshuai.xi 
750*53ee8cc1Swenshuai.xi     for (i = 0; i < MAX_SUPPORT_DECODER_NUM; i++)
751*53ee8cc1Swenshuai.xi     {
752*53ee8cc1Swenshuai.xi         pVPUHalContext->s32VpuFdTaskId[i] = -1;
753*53ee8cc1Swenshuai.xi         pVPUHalContext->bFDInit[i] = FALSE;
754*53ee8cc1Swenshuai.xi     }
755*53ee8cc1Swenshuai.xi 
756*53ee8cc1Swenshuai.xi }
757*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_ForceSwRst(void)758*53ee8cc1Swenshuai.xi void HAL_VPU_EX_ForceSwRst(void)
759*53ee8cc1Swenshuai.xi {
760*53ee8cc1Swenshuai.xi     pVPUHalContext->u8ForceRst = 1;
761*53ee8cc1Swenshuai.xi }
762*53ee8cc1Swenshuai.xi 
_VPU_EX_MapCtrlCmd(VPU_EX_TaskInfo * pTaskInfo)763*53ee8cc1Swenshuai.xi static HVD_User_Cmd _VPU_EX_MapCtrlCmd(VPU_EX_TaskInfo *pTaskInfo)
764*53ee8cc1Swenshuai.xi {
765*53ee8cc1Swenshuai.xi     HVD_User_Cmd eCmd = E_HVD_CMD_INVALID_CMD;
766*53ee8cc1Swenshuai.xi     MS_U8 u8OffsetIdx = 0;
767*53ee8cc1Swenshuai.xi 
768*53ee8cc1Swenshuai.xi     if (NULL == pTaskInfo)
769*53ee8cc1Swenshuai.xi     {
770*53ee8cc1Swenshuai.xi         return eCmd;
771*53ee8cc1Swenshuai.xi     }
772*53ee8cc1Swenshuai.xi 
773*53ee8cc1Swenshuai.xi     u8OffsetIdx = _VPU_EX_GetOffsetIdx(pTaskInfo->u32Id);
774*53ee8cc1Swenshuai.xi 
775*53ee8cc1Swenshuai.xi     VPU_MSG_INFO("input TaskInfo u32Id=0x%08x eVpuId=0x%x src=0x%x dec=0x%x\n",
776*53ee8cc1Swenshuai.xi          pTaskInfo->u32Id, pTaskInfo->eVpuId, pTaskInfo->eSrcType, pTaskInfo->eDecType);
777*53ee8cc1Swenshuai.xi 
778*53ee8cc1Swenshuai.xi #ifdef VDEC3
779*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
780*53ee8cc1Swenshuai.xi     {
781*53ee8cc1Swenshuai.xi         if (E_VPU_EX_INPUT_TSP == pTaskInfo->eSrcType)
782*53ee8cc1Swenshuai.xi         {
783*53ee8cc1Swenshuai.xi             eCmd = E_NST_CMD_TASK_MVD_TSP;
784*53ee8cc1Swenshuai.xi         }
785*53ee8cc1Swenshuai.xi         else if (E_VPU_EX_INPUT_FILE == pTaskInfo->eSrcType)
786*53ee8cc1Swenshuai.xi         {
787*53ee8cc1Swenshuai.xi             eCmd = E_NST_CMD_TASK_MVD_SLQ;
788*53ee8cc1Swenshuai.xi         }
789*53ee8cc1Swenshuai.xi     }
790*53ee8cc1Swenshuai.xi #else
791*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
792*53ee8cc1Swenshuai.xi     {
793*53ee8cc1Swenshuai.xi         if (E_VPU_EX_INPUT_TSP == pTaskInfo->eSrcType)
794*53ee8cc1Swenshuai.xi         {
795*53ee8cc1Swenshuai.xi             eCmd = (u8OffsetIdx == 0) ? E_DUAL_CMD_TASK0_MVD_TSP : E_DUAL_CMD_TASK1_MVD_TSP;
796*53ee8cc1Swenshuai.xi         }
797*53ee8cc1Swenshuai.xi         else if (E_VPU_EX_INPUT_FILE == pTaskInfo->eSrcType)
798*53ee8cc1Swenshuai.xi         {
799*53ee8cc1Swenshuai.xi             eCmd = (u8OffsetIdx == 0) ? E_DUAL_CMD_TASK0_MVD_SLQ : E_DUAL_CMD_TASK1_MVD_SLQ;
800*53ee8cc1Swenshuai.xi         }
801*53ee8cc1Swenshuai.xi     }
802*53ee8cc1Swenshuai.xi #endif
803*53ee8cc1Swenshuai.xi #ifdef VDEC3
804*53ee8cc1Swenshuai.xi   #if SUPPORT_G2VP9
805*53ee8cc1Swenshuai.xi     else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_G2VP9 == pTaskInfo->eDecType)
806*53ee8cc1Swenshuai.xi   #else
807*53ee8cc1Swenshuai.xi     else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType)
808*53ee8cc1Swenshuai.xi   #endif
809*53ee8cc1Swenshuai.xi     {
810*53ee8cc1Swenshuai.xi         if (E_VPU_EX_INPUT_TSP == pTaskInfo->eSrcType)
811*53ee8cc1Swenshuai.xi         {
812*53ee8cc1Swenshuai.xi             eCmd = E_NST_CMD_TASK_HVD_TSP;
813*53ee8cc1Swenshuai.xi         }
814*53ee8cc1Swenshuai.xi         else if (E_VPU_EX_INPUT_FILE == pTaskInfo->eSrcType)
815*53ee8cc1Swenshuai.xi         {
816*53ee8cc1Swenshuai.xi             eCmd = E_NST_CMD_TASK_HVD_BBU;
817*53ee8cc1Swenshuai.xi         }
818*53ee8cc1Swenshuai.xi     }
819*53ee8cc1Swenshuai.xi #else
820*53ee8cc1Swenshuai.xi     else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
821*53ee8cc1Swenshuai.xi     {
822*53ee8cc1Swenshuai.xi         if (E_VPU_EX_INPUT_TSP == pTaskInfo->eSrcType)
823*53ee8cc1Swenshuai.xi         {
824*53ee8cc1Swenshuai.xi             eCmd = (u8OffsetIdx == 0) ? E_DUAL_CMD_TASK0_HVD_TSP : E_DUAL_CMD_TASK1_HVD_TSP;
825*53ee8cc1Swenshuai.xi         }
826*53ee8cc1Swenshuai.xi         else if (E_VPU_EX_INPUT_FILE == pTaskInfo->eSrcType)
827*53ee8cc1Swenshuai.xi         {
828*53ee8cc1Swenshuai.xi             eCmd = (u8OffsetIdx == 0) ? E_DUAL_CMD_TASK0_HVD_BBU : E_DUAL_CMD_TASK1_HVD_BBU;
829*53ee8cc1Swenshuai.xi         }
830*53ee8cc1Swenshuai.xi     }
831*53ee8cc1Swenshuai.xi #endif
832*53ee8cc1Swenshuai.xi 
833*53ee8cc1Swenshuai.xi     VPU_MSG_INFO("output: eCmd=0x%x offsetIdx=0x%x\n", eCmd, u8OffsetIdx);
834*53ee8cc1Swenshuai.xi     return eCmd;
835*53ee8cc1Swenshuai.xi }
836*53ee8cc1Swenshuai.xi 
_VPU_EX_InitHW(VPU_EX_TaskInfo * pTaskInfo)837*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_InitHW(VPU_EX_TaskInfo *pTaskInfo)
838*53ee8cc1Swenshuai.xi {
839*53ee8cc1Swenshuai.xi     if (!pTaskInfo)
840*53ee8cc1Swenshuai.xi     {
841*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("null input\n");
842*53ee8cc1Swenshuai.xi         return FALSE;
843*53ee8cc1Swenshuai.xi     }
844*53ee8cc1Swenshuai.xi 
845*53ee8cc1Swenshuai.xi     //Check if we need to init MVD HW
846*53ee8cc1Swenshuai.xi     if ((E_VPU_EX_INPUT_TSP == pTaskInfo->eSrcType) ||
847*53ee8cc1Swenshuai.xi         (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType))
848*53ee8cc1Swenshuai.xi     {
849*53ee8cc1Swenshuai.xi         //Init HW
850*53ee8cc1Swenshuai.xi         if (FALSE == HAL_VPU_EX_MVDInUsed())
851*53ee8cc1Swenshuai.xi         {
852*53ee8cc1Swenshuai.xi             if (TRUE != HAL_MVD_InitHW(pTaskInfo->eSrcType,pTaskInfo->eDecType))
853*53ee8cc1Swenshuai.xi             {
854*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("(%d):HAL_MVD_InitHW failed\n", __LINE__);
855*53ee8cc1Swenshuai.xi                 return FALSE;
856*53ee8cc1Swenshuai.xi             }
857*53ee8cc1Swenshuai.xi         }
858*53ee8cc1Swenshuai.xi         else
859*53ee8cc1Swenshuai.xi         {
860*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("(%d): do nothing\n", __LINE__);
861*53ee8cc1Swenshuai.xi         }
862*53ee8cc1Swenshuai.xi     }
863*53ee8cc1Swenshuai.xi 
864*53ee8cc1Swenshuai.xi     //MVD use sub mvop
865*53ee8cc1Swenshuai.xi     if((E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType) &&
866*53ee8cc1Swenshuai.xi #ifdef VDEC3
867*53ee8cc1Swenshuai.xi         (pTaskInfo->u8HalId == 1) )
868*53ee8cc1Swenshuai.xi #else
869*53ee8cc1Swenshuai.xi         (E_HAL_VPU_SUB_STREAM0 == pTaskInfo->eVpuId))
870*53ee8cc1Swenshuai.xi #endif
871*53ee8cc1Swenshuai.xi     {
872*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Force turn on HVD\n");
873*53ee8cc1Swenshuai.xi         if(!HAL_VPU_EX_HVDInUsed())
874*53ee8cc1Swenshuai.xi         {
875*53ee8cc1Swenshuai.xi             if(E_VPU_DEC_MODE_DUAL_INDIE == pVPUHalContext->_stVPUDecMode.u8DecMod)
876*53ee8cc1Swenshuai.xi             {
877*53ee8cc1Swenshuai.xi                 if (!HAL_HVD_EX_InitHW(pTaskInfo->u32Id,pTaskInfo->eDecType))
878*53ee8cc1Swenshuai.xi                 {
879*53ee8cc1Swenshuai.xi                      VPU_MSG_ERR("(%d):HAL_HVD_EX_InitHW failed\n", __LINE__);
880*53ee8cc1Swenshuai.xi                      return FALSE;
881*53ee8cc1Swenshuai.xi                 }
882*53ee8cc1Swenshuai.xi             }
883*53ee8cc1Swenshuai.xi             else
884*53ee8cc1Swenshuai.xi             {
885*53ee8cc1Swenshuai.xi                 VPU_MSG_INFO("%s  MVD 3DTV sub\n",__FUNCTION__);
886*53ee8cc1Swenshuai.xi                 #ifdef CONFIG_MSTAR_CLKM
887*53ee8cc1Swenshuai.xi                     HAL_VPU_EX_SetClkManagement(E_VPU_EX_CLKPORT_HVD, TRUE);
888*53ee8cc1Swenshuai.xi                 #else
889*53ee8cc1Swenshuai.xi                     HAL_HVD_EX_PowerCtrl(pTaskInfo->u32Id, TRUE);
890*53ee8cc1Swenshuai.xi                 #endif
891*53ee8cc1Swenshuai.xi             }
892*53ee8cc1Swenshuai.xi         }
893*53ee8cc1Swenshuai.xi         else
894*53ee8cc1Swenshuai.xi         {
895*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("(%d): do nothing, HVD already init\n", __LINE__);
896*53ee8cc1Swenshuai.xi         }
897*53ee8cc1Swenshuai.xi     }
898*53ee8cc1Swenshuai.xi 
899*53ee8cc1Swenshuai.xi     //Check if we need to init HVD HW
900*53ee8cc1Swenshuai.xi #ifdef VDEC3
901*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType)
902*53ee8cc1Swenshuai.xi #else
903*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
904*53ee8cc1Swenshuai.xi #endif
905*53ee8cc1Swenshuai.xi     {
906*53ee8cc1Swenshuai.xi         if (!HAL_VPU_EX_MVDInUsed())
907*53ee8cc1Swenshuai.xi         {
908*53ee8cc1Swenshuai.xi             if (!HAL_MVD_InitHW(pTaskInfo->eSrcType,pTaskInfo->eDecType))
909*53ee8cc1Swenshuai.xi             {
910*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("(%d):HAL_MVD_InitHW failed\n", __LINE__);
911*53ee8cc1Swenshuai.xi                 return FALSE;
912*53ee8cc1Swenshuai.xi             }
913*53ee8cc1Swenshuai.xi         }
914*53ee8cc1Swenshuai.xi 
915*53ee8cc1Swenshuai.xi         if (!HAL_HVD_EX_InitHW(pTaskInfo->u32Id,pTaskInfo->eDecType))
916*53ee8cc1Swenshuai.xi         {
917*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("(%d):HAL_HVD_EX_InitHW failed\n", __LINE__);
918*53ee8cc1Swenshuai.xi             return FALSE;
919*53ee8cc1Swenshuai.xi         }
920*53ee8cc1Swenshuai.xi #if SUPPORT_MSVP9
921*53ee8cc1Swenshuai.xi         if (E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType)
922*53ee8cc1Swenshuai.xi         {
923*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(REG_CLKGEN1_RESERVERD0, SELECT_CLK_HVD_AEC_P_216, SELECT_CLK_HVD_AEC_P_MASK); //for VP9 dqmem
924*53ee8cc1Swenshuai.xi         }
925*53ee8cc1Swenshuai.xi #endif
926*53ee8cc1Swenshuai.xi     }
927*53ee8cc1Swenshuai.xi 
928*53ee8cc1Swenshuai.xi     #if SUPPORT_G2VP9 && defined(VDEC3)
929*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_G2VP9 == pTaskInfo->eDecType)
930*53ee8cc1Swenshuai.xi     {
931*53ee8cc1Swenshuai.xi         if (!HAL_VPU_EX_MVDInUsed())
932*53ee8cc1Swenshuai.xi         {
933*53ee8cc1Swenshuai.xi             if (!HAL_MVD_InitHW(pTaskInfo->eSrcType,pTaskInfo->eDecType))
934*53ee8cc1Swenshuai.xi             {
935*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("(%d):HAL_MVD_InitHW failed\n", __LINE__);
936*53ee8cc1Swenshuai.xi                 return FALSE;
937*53ee8cc1Swenshuai.xi             }
938*53ee8cc1Swenshuai.xi         }
939*53ee8cc1Swenshuai.xi         if (!HAL_HVD_EX_InitHW(pTaskInfo->u32Id,pTaskInfo->eDecType))
940*53ee8cc1Swenshuai.xi         {
941*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("(%d):HAL_HVD_EX_InitHW failed for VP9\n", __LINE__);
942*53ee8cc1Swenshuai.xi             return FALSE;
943*53ee8cc1Swenshuai.xi         }
944*53ee8cc1Swenshuai.xi     }
945*53ee8cc1Swenshuai.xi     #endif
946*53ee8cc1Swenshuai.xi 
947*53ee8cc1Swenshuai.xi     return TRUE;
948*53ee8cc1Swenshuai.xi }
949*53ee8cc1Swenshuai.xi 
_VPU_EX_InClock(MS_U32 u32type)950*53ee8cc1Swenshuai.xi static MS_U32 _VPU_EX_InClock(MS_U32 u32type)
951*53ee8cc1Swenshuai.xi {
952*53ee8cc1Swenshuai.xi     switch (u32type)
953*53ee8cc1Swenshuai.xi     {
954*53ee8cc1Swenshuai.xi         case VPU_CLOCK_240MHZ:
955*53ee8cc1Swenshuai.xi             return 240000000UL;
956*53ee8cc1Swenshuai.xi         case VPU_CLOCK_216MHZ:
957*53ee8cc1Swenshuai.xi             return 216000000UL;
958*53ee8cc1Swenshuai.xi         case VPU_CLOCK_192MHZ:
959*53ee8cc1Swenshuai.xi             return 192000000UL;
960*53ee8cc1Swenshuai.xi         case VPU_CLOCK_12MHZ:
961*53ee8cc1Swenshuai.xi             return 12000000UL;
962*53ee8cc1Swenshuai.xi         case VPU_CLOCK_320MHZ:
963*53ee8cc1Swenshuai.xi             return 320000000UL;
964*53ee8cc1Swenshuai.xi         case VPU_CLOCK_288MHZ:
965*53ee8cc1Swenshuai.xi             return 288000000UL;
966*53ee8cc1Swenshuai.xi         case VPU_CLOCK_432MHZ:
967*53ee8cc1Swenshuai.xi             return 432000000UL;
968*53ee8cc1Swenshuai.xi         default:
969*53ee8cc1Swenshuai.xi             return 384000000UL;
970*53ee8cc1Swenshuai.xi     }
971*53ee8cc1Swenshuai.xi }
972*53ee8cc1Swenshuai.xi 
973*53ee8cc1Swenshuai.xi 
974*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
975*53ee8cc1Swenshuai.xi //For REE
HAL_VPU_EX_REE_RegisterMBX(void)976*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_REE_RegisterMBX(void)
977*53ee8cc1Swenshuai.xi {
978*53ee8cc1Swenshuai.xi //#ifndef MSOS_TYPE_LINUX_KERNEL
979*53ee8cc1Swenshuai.xi #if 1
980*53ee8cc1Swenshuai.xi     MS_U8 ClassNum = 0;
981*53ee8cc1Swenshuai.xi     MBX_Result result;
982*53ee8cc1Swenshuai.xi 
983*53ee8cc1Swenshuai.xi #if 0
984*53ee8cc1Swenshuai.xi     if (bVPUMbxInitFlag == TRUE)
985*53ee8cc1Swenshuai.xi     {
986*53ee8cc1Swenshuai.xi         return TRUE;
987*53ee8cc1Swenshuai.xi     }
988*53ee8cc1Swenshuai.xi #endif
989*53ee8cc1Swenshuai.xi 
990*53ee8cc1Swenshuai.xi     if (E_MBX_SUCCESS != MApi_MBX_Init(E_MBX_CPU_MIPS,E_MBX_ROLE_HK,1000))
991*53ee8cc1Swenshuai.xi     {
992*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("VDEC_TEE MApi_MBX_Init fail\n");
993*53ee8cc1Swenshuai.xi         return FALSE;
994*53ee8cc1Swenshuai.xi     }
995*53ee8cc1Swenshuai.xi     else
996*53ee8cc1Swenshuai.xi     {
997*53ee8cc1Swenshuai.xi         MApi_MBX_Enable(TRUE);
998*53ee8cc1Swenshuai.xi     }
999*53ee8cc1Swenshuai.xi 
1000*53ee8cc1Swenshuai.xi     result = MApi_MBX_QueryDynamicClass(E_MBX_CPU_MIPS_VPE1, "VDEC_TEE", (MS_U8 *)&ClassNum);
1001*53ee8cc1Swenshuai.xi 
1002*53ee8cc1Swenshuai.xi     if (E_MBX_SUCCESS != result)
1003*53ee8cc1Swenshuai.xi     {
1004*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("VDEC_TEE MApi_MBX_QueryDynamicClass fail,result %d\n",(unsigned int)result);
1005*53ee8cc1Swenshuai.xi         return FALSE;
1006*53ee8cc1Swenshuai.xi     }
1007*53ee8cc1Swenshuai.xi 
1008*53ee8cc1Swenshuai.xi     result = MApi_MBX_RegisterMSG(ClassNum, 10);
1009*53ee8cc1Swenshuai.xi 
1010*53ee8cc1Swenshuai.xi     if (( E_MBX_SUCCESS != result) && ( E_MBX_ERR_SLOT_AREADY_OPENNED != result ))
1011*53ee8cc1Swenshuai.xi     {
1012*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("%s fail\n",__FUNCTION__);
1013*53ee8cc1Swenshuai.xi         return FALSE;
1014*53ee8cc1Swenshuai.xi     }
1015*53ee8cc1Swenshuai.xi     else
1016*53ee8cc1Swenshuai.xi     {
1017*53ee8cc1Swenshuai.xi         bVPUMbxInitFlag = TRUE;
1018*53ee8cc1Swenshuai.xi         u8VPUMbxMsgClass = ClassNum;
1019*53ee8cc1Swenshuai.xi         return TRUE;
1020*53ee8cc1Swenshuai.xi     }
1021*53ee8cc1Swenshuai.xi #else
1022*53ee8cc1Swenshuai.xi     return FALSE;
1023*53ee8cc1Swenshuai.xi #endif
1024*53ee8cc1Swenshuai.xi }
1025*53ee8cc1Swenshuai.xi 
1026*53ee8cc1Swenshuai.xi //#ifdef MBX_2K
1027*53ee8cc1Swenshuai.xi #if 1
_VPU_EX_REE_SendMBXMsg(VDEC_REE_TO_TEE_MBX_MSG_TYPE msg_type)1028*53ee8cc1Swenshuai.xi VDEC_TEE_TO_REE_MBX_ACK_TYPE _VPU_EX_REE_SendMBXMsg(VDEC_REE_TO_TEE_MBX_MSG_TYPE msg_type)
1029*53ee8cc1Swenshuai.xi {
1030*53ee8cc1Swenshuai.xi     MBX_Result result;
1031*53ee8cc1Swenshuai.xi     VDEC_TEE_TO_REE_MBX_ACK_TYPE u8Index;
1032*53ee8cc1Swenshuai.xi 
1033*53ee8cc1Swenshuai.xi     if (pVPUHalContext->bEnableVPUSecureMode == FALSE)
1034*53ee8cc1Swenshuai.xi     {
1035*53ee8cc1Swenshuai.xi         return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_NO_TEE;
1036*53ee8cc1Swenshuai.xi     }
1037*53ee8cc1Swenshuai.xi 
1038*53ee8cc1Swenshuai.xi     if (bVPUMbxInitFlag == FALSE)
1039*53ee8cc1Swenshuai.xi     {
1040*53ee8cc1Swenshuai.xi         return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_INVALID;
1041*53ee8cc1Swenshuai.xi     }
1042*53ee8cc1Swenshuai.xi 
1043*53ee8cc1Swenshuai.xi     VPUReeToTeeMbxMsg.eRoleID = E_MBX_CPU_MIPS_VPE1;
1044*53ee8cc1Swenshuai.xi     VPUReeToTeeMbxMsg.u8Ctrl = 0;
1045*53ee8cc1Swenshuai.xi     VPUReeToTeeMbxMsg.eMsgType = E_MBX_MSG_TYPE_INSTANT;
1046*53ee8cc1Swenshuai.xi     VPUReeToTeeMbxMsg.u8MsgClass = u8VPUMbxMsgClass;
1047*53ee8cc1Swenshuai.xi     VPUReeToTeeMbxMsg.u8Index = msg_type;
1048*53ee8cc1Swenshuai.xi 
1049*53ee8cc1Swenshuai.xi     result = MApi_MBX_SendMsg(&VPUReeToTeeMbxMsg);
1050*53ee8cc1Swenshuai.xi     if (E_MBX_SUCCESS != result)
1051*53ee8cc1Swenshuai.xi     {
1052*53ee8cc1Swenshuai.xi         printf("VDEC_TEE Send MBX fail,result %d\n",(unsigned int)result);
1053*53ee8cc1Swenshuai.xi         return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL;
1054*53ee8cc1Swenshuai.xi     }
1055*53ee8cc1Swenshuai.xi 
1056*53ee8cc1Swenshuai.xi     // Receive Reply ACK from TEE side.
1057*53ee8cc1Swenshuai.xi     memset(&VPUTeeToReeMbxMsg, 0, sizeof(MBX_Msg));
1058*53ee8cc1Swenshuai.xi 
1059*53ee8cc1Swenshuai.xi     VPUTeeToReeMbxMsg.u8MsgClass = u8VPUMbxMsgClass;
1060*53ee8cc1Swenshuai.xi 
1061*53ee8cc1Swenshuai.xi #if 0 // marked temperarily, wait kernel team to fix MApi_MBX_RecvMsg.
1062*53ee8cc1Swenshuai.xi     if(E_MBX_SUCCESS != MApi_MBX_RecvMsg(TEE_MBX_MSG_CLASS, &(TEE_TO_REE_MBX_MSG), 20, MBX_CHECK_INSTANT_MSG))
1063*53ee8cc1Swenshuai.xi     {
1064*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("VDEC get Secure world ACK fail\n");
1065*53ee8cc1Swenshuai.xi         return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL;
1066*53ee8cc1Swenshuai.xi     }
1067*53ee8cc1Swenshuai.xi     else
1068*53ee8cc1Swenshuai.xi #else
1069*53ee8cc1Swenshuai.xi     do
1070*53ee8cc1Swenshuai.xi     {
1071*53ee8cc1Swenshuai.xi         result = MApi_MBX_RecvMsg(u8VPUMbxMsgClass, &VPUTeeToReeMbxMsg, 2000, MBX_CHECK_INSTANT_MSG);
1072*53ee8cc1Swenshuai.xi     } while(E_MBX_SUCCESS != result);
1073*53ee8cc1Swenshuai.xi #endif
1074*53ee8cc1Swenshuai.xi     {
1075*53ee8cc1Swenshuai.xi         u8Index = VPUTeeToReeMbxMsg.u8Index;
1076*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("VDEC get ACK cmd:%x\n", u8Index);
1077*53ee8cc1Swenshuai.xi 
1078*53ee8cc1Swenshuai.xi         if (E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL == u8Index)
1079*53ee8cc1Swenshuai.xi         {
1080*53ee8cc1Swenshuai.xi             return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_FAIL;
1081*53ee8cc1Swenshuai.xi         }
1082*53ee8cc1Swenshuai.xi     }
1083*53ee8cc1Swenshuai.xi 
1084*53ee8cc1Swenshuai.xi     return E_VDEC_EX_TEE_TO_REE_MBX_ACK_MSG_ACTION_SUCCESS;
1085*53ee8cc1Swenshuai.xi }
1086*53ee8cc1Swenshuai.xi #endif
1087*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_REE_SetSHMBaseAddr(MS_U32 U32Type,MS_PHY u32SHMAddr,MS_PHY u32SHMSize,MS_PHY u32MIU1Addr)1088*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_REE_SetSHMBaseAddr(MS_U32 U32Type,MS_PHY u32SHMAddr,MS_PHY u32SHMSize,MS_PHY u32MIU1Addr)
1089*53ee8cc1Swenshuai.xi {
1090*53ee8cc1Swenshuai.xi     if(U32Type == SYS_TEEINFO_OSTYPE_NUTTX)
1091*53ee8cc1Swenshuai.xi     {
1092*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)
1093*53ee8cc1Swenshuai.xi         {
1094*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("[Error] VDEC load code in Secure world fail!\n");
1095*53ee8cc1Swenshuai.xi             return FALSE;
1096*53ee8cc1Swenshuai.xi         }
1097*53ee8cc1Swenshuai.xi         else
1098*53ee8cc1Swenshuai.xi         {
1099*53ee8cc1Swenshuai.xi             MS_VIRT u32VPUSHMoffset = (VPUTeeToReeMbxMsg.u8Parameters[0]&0xff) |
1100*53ee8cc1Swenshuai.xi                                      ((VPUTeeToReeMbxMsg.u8Parameters[1]<<8)&0xff00)|
1101*53ee8cc1Swenshuai.xi                                      ((VPUTeeToReeMbxMsg.u8Parameters[2]<<16)&0xff0000)|
1102*53ee8cc1Swenshuai.xi                                      ((VPUTeeToReeMbxMsg.u8Parameters[3]<<24)&0xff000000);
1103*53ee8cc1Swenshuai.xi             MS_U32 u32VPUSHMsize =   (VPUTeeToReeMbxMsg.u8Parameters[4]&0xff) |
1104*53ee8cc1Swenshuai.xi                                      ((VPUTeeToReeMbxMsg.u8Parameters[5]<<8)&0xff00)|
1105*53ee8cc1Swenshuai.xi                                      ((VPUTeeToReeMbxMsg.u8Parameters[6]<<16)&0xff0000)|
1106*53ee8cc1Swenshuai.xi                                      ((VPUTeeToReeMbxMsg.u8Parameters[7]<<24)&0xff000000);
1107*53ee8cc1Swenshuai.xi 
1108*53ee8cc1Swenshuai.xi             VPU_MSG_INFO("u32VPUSHMoffset %lx,u32VPUSHMsize %x,miu %d\n",(unsigned long)u32VPUSHMoffset,(unsigned int)u32VPUSHMsize,VPUTeeToReeMbxMsg.u8Parameters[8]);
1109*53ee8cc1Swenshuai.xi 
1110*53ee8cc1Swenshuai.xi 
1111*53ee8cc1Swenshuai.xi             MS_U32 u32Start;
1112*53ee8cc1Swenshuai.xi 
1113*53ee8cc1Swenshuai.xi             if(VPUTeeToReeMbxMsg.u8Parameters[8] == 1)
1114*53ee8cc1Swenshuai.xi             {
1115*53ee8cc1Swenshuai.xi                 _miu_offset_to_phy(E_CHIP_MIU_1, u32VPUSHMoffset, u32Start);
1116*53ee8cc1Swenshuai.xi                 pVPUHalContext->u32VPUSHMAddr =  u32Start;
1117*53ee8cc1Swenshuai.xi             }
1118*53ee8cc1Swenshuai.xi             else if(VPUTeeToReeMbxMsg.u8Parameters[8] == 2)
1119*53ee8cc1Swenshuai.xi             {
1120*53ee8cc1Swenshuai.xi                 _miu_offset_to_phy(E_CHIP_MIU_2, u32VPUSHMoffset, u32Start);
1121*53ee8cc1Swenshuai.xi                 pVPUHalContext->u32VPUSHMAddr =  u32Start;
1122*53ee8cc1Swenshuai.xi 
1123*53ee8cc1Swenshuai.xi             }
1124*53ee8cc1Swenshuai.xi             else // == 0
1125*53ee8cc1Swenshuai.xi             {
1126*53ee8cc1Swenshuai.xi                 pVPUHalContext->u32VPUSHMAddr = u32VPUSHMoffset;
1127*53ee8cc1Swenshuai.xi             }
1128*53ee8cc1Swenshuai.xi         }
1129*53ee8cc1Swenshuai.xi     }
1130*53ee8cc1Swenshuai.xi     else if(U32Type == SYS_TEEINFO_OSTYPE_OPTEE)
1131*53ee8cc1Swenshuai.xi     {
1132*53ee8cc1Swenshuai.xi         MS_U32 u32Offset;
1133*53ee8cc1Swenshuai.xi         if((u32SHMAddr >= u32MIU1Addr) && (u32MIU1Addr!=0))
1134*53ee8cc1Swenshuai.xi         {
1135*53ee8cc1Swenshuai.xi             u32Offset = u32SHMAddr-u32MIU1Addr;
1136*53ee8cc1Swenshuai.xi             _miu_offset_to_phy(E_CHIP_MIU_1, u32Offset, pVPUHalContext->u32VPUSHMAddr);
1137*53ee8cc1Swenshuai.xi         }
1138*53ee8cc1Swenshuai.xi         else
1139*53ee8cc1Swenshuai.xi         {
1140*53ee8cc1Swenshuai.xi             pVPUHalContext->u32VPUSHMAddr = u32SHMAddr;
1141*53ee8cc1Swenshuai.xi         }
1142*53ee8cc1Swenshuai.xi     }
1143*53ee8cc1Swenshuai.xi     return TRUE;
1144*53ee8cc1Swenshuai.xi }
1145*53ee8cc1Swenshuai.xi 
HAL_VPU_Set_MBX_param(MS_U8 u8APIMbxMsgClass)1146*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_Set_MBX_param(MS_U8 u8APIMbxMsgClass)
1147*53ee8cc1Swenshuai.xi {
1148*53ee8cc1Swenshuai.xi     bVPUMbxInitFlag = TRUE;
1149*53ee8cc1Swenshuai.xi     u8VPUMbxMsgClass = u8APIMbxMsgClass;
1150*53ee8cc1Swenshuai.xi     return TRUE;
1151*53ee8cc1Swenshuai.xi }
1152*53ee8cc1Swenshuai.xi 
1153*53ee8cc1Swenshuai.xi #endif
1154*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetFWReload(void)1155*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_GetFWReload(void)
1156*53ee8cc1Swenshuai.xi {
1157*53ee8cc1Swenshuai.xi     return pVPUHalContext->bVpuExReloadFW;
1158*53ee8cc1Swenshuai.xi }
1159*53ee8cc1Swenshuai.xi 
_VPU_EX_IsNeedDecompress(MS_VIRT u32SrcAddr)1160*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_IsNeedDecompress(MS_VIRT u32SrcAddr)
1161*53ee8cc1Swenshuai.xi {
1162*53ee8cc1Swenshuai.xi     if(*((MS_U8*)(u32SrcAddr))=='V' && *((MS_U8*)(u32SrcAddr+1))=='D'
1163*53ee8cc1Swenshuai.xi         && *((MS_U8*)(u32SrcAddr+2))=='E' && *((MS_U8*)(u32SrcAddr+3))=='C'
1164*53ee8cc1Swenshuai.xi         && *((MS_U8*)(u32SrcAddr+4))=='3' && *((MS_U8*)(u32SrcAddr+5))=='1'
1165*53ee8cc1Swenshuai.xi         && *((MS_U8*)(u32SrcAddr+0xe8))=='V' && *((MS_U8*)(u32SrcAddr+0xe9))=='D'
1166*53ee8cc1Swenshuai.xi         && *((MS_U8*)(u32SrcAddr+0xea))=='E' && *((MS_U8*)(u32SrcAddr+0xeb))=='C'
1167*53ee8cc1Swenshuai.xi         && *((MS_U8*)(u32SrcAddr+0xec))=='3' && *((MS_U8*)(u32SrcAddr+0xed))=='0'
1168*53ee8cc1Swenshuai.xi         )
1169*53ee8cc1Swenshuai.xi     {
1170*53ee8cc1Swenshuai.xi         return FALSE;
1171*53ee8cc1Swenshuai.xi     }
1172*53ee8cc1Swenshuai.xi     else
1173*53ee8cc1Swenshuai.xi     {
1174*53ee8cc1Swenshuai.xi         return TRUE;
1175*53ee8cc1Swenshuai.xi     }
1176*53ee8cc1Swenshuai.xi }
1177*53ee8cc1Swenshuai.xi 
_VPU_EX_InitAll(VPU_EX_NDecInitPara * pInitPara)1178*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_InitAll(VPU_EX_NDecInitPara *pInitPara)
1179*53ee8cc1Swenshuai.xi {
1180*53ee8cc1Swenshuai.xi     MS_PHY u32fwPA = NULL;  //physical address
1181*53ee8cc1Swenshuai.xi     VPU_EX_ClockSpeed eClkSpeed = E_VPU_EX_CLOCK_432MHZ;
1182*53ee8cc1Swenshuai.xi 
1183*53ee8cc1Swenshuai.xi     if (TRUE == HAL_VPU_EX_IsPowered())
1184*53ee8cc1Swenshuai.xi     {
1185*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("IsPowered\n");
1186*53ee8cc1Swenshuai.xi         return TRUE;
1187*53ee8cc1Swenshuai.xi     }
1188*53ee8cc1Swenshuai.xi     else
1189*53ee8cc1Swenshuai.xi     {
1190*53ee8cc1Swenshuai.xi         //VPU hold
1191*53ee8cc1Swenshuai.xi         HAL_VPU_EX_SwRst(FALSE);
1192*53ee8cc1Swenshuai.xi 
1193*53ee8cc1Swenshuai.xi         //VPU clock on
1194*53ee8cc1Swenshuai.xi         VPU_EX_InitParam VPUInitParams = {eClkSpeed, FALSE, -1, VPU_DEFAULT_MUTEX_TIMEOUT, TRUE};
1195*53ee8cc1Swenshuai.xi 
1196*53ee8cc1Swenshuai.xi         if (VPU_I_R_ON_MIU0)
1197*53ee8cc1Swenshuai.xi             VPUInitParams.u8MiuSel = 0;
1198*53ee8cc1Swenshuai.xi         else if (VPU_I_R_ON_MIU1)
1199*53ee8cc1Swenshuai.xi             VPUInitParams.u8MiuSel = 1;
1200*53ee8cc1Swenshuai.xi         else if (VPU_I_R_ON_MIU2)
1201*53ee8cc1Swenshuai.xi             VPUInitParams.u8MiuSel = 2;
1202*53ee8cc1Swenshuai.xi 
1203*53ee8cc1Swenshuai.xi         HAL_VPU_EX_Init(&VPUInitParams);
1204*53ee8cc1Swenshuai.xi     }
1205*53ee8cc1Swenshuai.xi 
1206*53ee8cc1Swenshuai.xi     VPU_EX_FWCodeCfg *pFWCodeCfg   = NULL;
1207*53ee8cc1Swenshuai.xi     VPU_EX_TaskInfo  *pTaskInfo    = NULL;
1208*53ee8cc1Swenshuai.xi     VPU_EX_VLCTblCfg *pVlcCfg      = NULL;
1209*53ee8cc1Swenshuai.xi 
1210*53ee8cc1Swenshuai.xi     if (pInitPara)
1211*53ee8cc1Swenshuai.xi     {
1212*53ee8cc1Swenshuai.xi         pFWCodeCfg  = pInitPara->pFWCodeCfg;
1213*53ee8cc1Swenshuai.xi         pTaskInfo   = pInitPara->pTaskInfo;
1214*53ee8cc1Swenshuai.xi         pVlcCfg     = pInitPara->pVLCCfg;
1215*53ee8cc1Swenshuai.xi     }
1216*53ee8cc1Swenshuai.xi     else
1217*53ee8cc1Swenshuai.xi     {
1218*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("(%d) NULL para\n", __LINE__);
1219*53ee8cc1Swenshuai.xi         return FALSE;
1220*53ee8cc1Swenshuai.xi     }
1221*53ee8cc1Swenshuai.xi 
1222*53ee8cc1Swenshuai.xi     u32fwPA = MsOS_VA2PA(pFWCodeCfg->u32DstAddr);
1223*53ee8cc1Swenshuai.xi //#ifdef MBX_2K
1224*53ee8cc1Swenshuai.xi #if 1
1225*53ee8cc1Swenshuai.xi #if (defined(MSOS_TYPE_LINUX)||defined(MSOS_TYPE_LINUX_KERNEL))
1226*53ee8cc1Swenshuai.xi     if(pVPUHalContext->bEnableVPUSecureMode == TRUE)
1227*53ee8cc1Swenshuai.xi     {
1228*53ee8cc1Swenshuai.xi         SYS_TEEINFO teemode;
1229*53ee8cc1Swenshuai.xi         MDrv_SYS_ReadKernelCmdLine();
1230*53ee8cc1Swenshuai.xi         MDrv_SYS_GetTEEInfo(&teemode);
1231*53ee8cc1Swenshuai.xi         if(teemode.OsType == SYS_TEEINFO_OSTYPE_NUTTX)
1232*53ee8cc1Swenshuai.xi         {
1233*53ee8cc1Swenshuai.xi             VPU_MSG_INFO("Load VDEC f/w code in Secure World\n");
1234*53ee8cc1Swenshuai.xi 
1235*53ee8cc1Swenshuai.xi             if (FALSE == HAL_VPU_EX_GetFWReload())
1236*53ee8cc1Swenshuai.xi             {
1237*53ee8cc1Swenshuai.xi                 if (FALSE == pVPUHalContext->bVpuExLoadFWRlt)
1238*53ee8cc1Swenshuai.xi                 {
1239*53ee8cc1Swenshuai.xi                     VPU_MSG_INFO("Never load fw successfully, load it anyway!\n");
1240*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)
1241*53ee8cc1Swenshuai.xi                     {
1242*53ee8cc1Swenshuai.xi                         VPU_MSG_ERR("[Error] VDEC load code in Secure world fail!\n");
1243*53ee8cc1Swenshuai.xi                         return FALSE;
1244*53ee8cc1Swenshuai.xi                     }
1245*53ee8cc1Swenshuai.xi                     pVPUHalContext->bVpuExLoadFWRlt = TRUE;
1246*53ee8cc1Swenshuai.xi                 }
1247*53ee8cc1Swenshuai.xi                 else
1248*53ee8cc1Swenshuai.xi                 {
1249*53ee8cc1Swenshuai.xi                     //Check f/w prefix "VDEC30"
1250*53ee8cc1Swenshuai.xi                     if (_VPU_EX_IsNeedDecompress(pFWCodeCfg->u32DstAddr) != FALSE)
1251*53ee8cc1Swenshuai.xi                     {
1252*53ee8cc1Swenshuai.xi                         VPU_MSG_ERR("Wrong prefix: reload fw!\n");
1253*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)
1254*53ee8cc1Swenshuai.xi                         {
1255*53ee8cc1Swenshuai.xi                             VPU_MSG_ERR("[Error] VDEC load code in Secure world fail!\n");
1256*53ee8cc1Swenshuai.xi                             pVPUHalContext->bVpuExLoadFWRlt = FALSE;
1257*53ee8cc1Swenshuai.xi                             return FALSE;
1258*53ee8cc1Swenshuai.xi                         }
1259*53ee8cc1Swenshuai.xi                     }
1260*53ee8cc1Swenshuai.xi                     else
1261*53ee8cc1Swenshuai.xi                     {
1262*53ee8cc1Swenshuai.xi                         VPU_MSG_INFO("Skip loading fw this time!!!\n");
1263*53ee8cc1Swenshuai.xi                     }
1264*53ee8cc1Swenshuai.xi                 }
1265*53ee8cc1Swenshuai.xi             }
1266*53ee8cc1Swenshuai.xi             else
1267*53ee8cc1Swenshuai.xi             {
1268*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)
1269*53ee8cc1Swenshuai.xi                 {
1270*53ee8cc1Swenshuai.xi                     VPU_MSG_ERR("[Error] VDEC load code in Secure world fail!\n");
1271*53ee8cc1Swenshuai.xi                     pVPUHalContext->bVpuExLoadFWRlt = FALSE;
1272*53ee8cc1Swenshuai.xi                     return FALSE;
1273*53ee8cc1Swenshuai.xi                 }
1274*53ee8cc1Swenshuai.xi                 pVPUHalContext->bVpuExLoadFWRlt = TRUE;
1275*53ee8cc1Swenshuai.xi             }
1276*53ee8cc1Swenshuai.xi         }
1277*53ee8cc1Swenshuai.xi     }
1278*53ee8cc1Swenshuai.xi     else
1279*53ee8cc1Swenshuai.xi #endif
1280*53ee8cc1Swenshuai.xi #endif
1281*53ee8cc1Swenshuai.xi     {
1282*53ee8cc1Swenshuai.xi         VPU_MSG_INFO("Load VDEC f/w code in Normal World\n");
1283*53ee8cc1Swenshuai.xi 
1284*53ee8cc1Swenshuai.xi         if (!HAL_VPU_EX_LoadCode(pFWCodeCfg))
1285*53ee8cc1Swenshuai.xi         {
1286*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("HAL_VPU_EX_LoadCode fail!\n");
1287*53ee8cc1Swenshuai.xi             return FALSE;
1288*53ee8cc1Swenshuai.xi         }
1289*53ee8cc1Swenshuai.xi     }
1290*53ee8cc1Swenshuai.xi 
1291*53ee8cc1Swenshuai.xi     if (pVlcCfg)
1292*53ee8cc1Swenshuai.xi     {
1293*53ee8cc1Swenshuai.xi         if (!_VPU_EX_LoadVLCTable(pVlcCfg, pFWCodeCfg->u8SrcType))
1294*53ee8cc1Swenshuai.xi         {
1295*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("HAL_VPU_LoadVLCTable fail!\n");
1296*53ee8cc1Swenshuai.xi             return FALSE;
1297*53ee8cc1Swenshuai.xi         }
1298*53ee8cc1Swenshuai.xi     }
1299*53ee8cc1Swenshuai.xi 
1300*53ee8cc1Swenshuai.xi     if (!HAL_VPU_EX_CPUSetting(u32fwPA))
1301*53ee8cc1Swenshuai.xi     {
1302*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("HAL_VPU_EX_CPUSetting fail!\n");
1303*53ee8cc1Swenshuai.xi         return FALSE;
1304*53ee8cc1Swenshuai.xi     }
1305*53ee8cc1Swenshuai.xi 
1306*53ee8cc1Swenshuai.xi     //Init HW
1307*53ee8cc1Swenshuai.xi     if (FALSE == _VPU_EX_InitHW(pTaskInfo))
1308*53ee8cc1Swenshuai.xi     {
1309*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("(%d): InitHW failed\n", __LINE__);
1310*53ee8cc1Swenshuai.xi         //_MVD_INIT_FAIL_RET();
1311*53ee8cc1Swenshuai.xi         return FALSE;
1312*53ee8cc1Swenshuai.xi     }
1313*53ee8cc1Swenshuai.xi     else
1314*53ee8cc1Swenshuai.xi     {
1315*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("(%d): InitHW success\n", __LINE__);
1316*53ee8cc1Swenshuai.xi     }
1317*53ee8cc1Swenshuai.xi 
1318*53ee8cc1Swenshuai.xi     //set vpu clock to FW
1319*53ee8cc1Swenshuai.xi     struct _ctl_info *ctl_ptr = (struct _ctl_info *)
1320*53ee8cc1Swenshuai.xi                     MsOS_PA2KSEG1(MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr) + CTL_INFO_ADDR);
1321*53ee8cc1Swenshuai.xi 
1322*53ee8cc1Swenshuai.xi     ctl_ptr->statue = CTL_STU_NONE;
1323*53ee8cc1Swenshuai.xi     //notify controller the interface version of VPU driver.
1324*53ee8cc1Swenshuai.xi     ctl_ptr->ctl_interface = VPU_CTL_INTERFACE_VER;
1325*53ee8cc1Swenshuai.xi     ctl_ptr->vpu_clk = _VPU_EX_InClock(eClkSpeed);
1326*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
1327*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("clock speed=0x%x\n", ctl_ptr->vpu_clk);
1328*53ee8cc1Swenshuai.xi 
1329*53ee8cc1Swenshuai.xi     //Release VPU: For dual decoder, we only release VPU if it is not released yet.
1330*53ee8cc1Swenshuai.xi     if (TRUE == HAL_VPU_EX_IsRsted())
1331*53ee8cc1Swenshuai.xi     {
1332*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("VPU_IsRsted\n");
1333*53ee8cc1Swenshuai.xi         return TRUE;
1334*53ee8cc1Swenshuai.xi     }
1335*53ee8cc1Swenshuai.xi     else
1336*53ee8cc1Swenshuai.xi     {
1337*53ee8cc1Swenshuai.xi         HAL_VPU_EX_SwRstRelse();
1338*53ee8cc1Swenshuai.xi     }
1339*53ee8cc1Swenshuai.xi 
1340*53ee8cc1Swenshuai.xi     return TRUE;
1341*53ee8cc1Swenshuai.xi }
1342*53ee8cc1Swenshuai.xi 
_VPU_EX_DeinitHW(VPU_EX_TaskInfo * pTaskInfo)1343*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_DeinitHW(VPU_EX_TaskInfo *pTaskInfo)
1344*53ee8cc1Swenshuai.xi {
1345*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
1346*53ee8cc1Swenshuai.xi #if defined(VDEC3)
1347*53ee8cc1Swenshuai.xi     MS_BOOL isEVD = (E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType);
1348*53ee8cc1Swenshuai.xi #else
1349*53ee8cc1Swenshuai.xi     MS_BOOL isEVD = FALSE ;
1350*53ee8cc1Swenshuai.xi #endif
1351*53ee8cc1Swenshuai.xi     MS_BOOL isHVD = (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
1352*53ee8cc1Swenshuai.xi                     || (E_VPU_EX_DECODER_VP8 == pTaskInfo->eDecType)
1353*53ee8cc1Swenshuai.xi                     || (E_VPU_EX_DECODER_MVC == pTaskInfo->eDecType);
1354*53ee8cc1Swenshuai.xi 
1355*53ee8cc1Swenshuai.xi     if (FALSE == HAL_VPU_EX_MVDInUsed())
1356*53ee8cc1Swenshuai.xi     {
1357*53ee8cc1Swenshuai.xi         bRet = HAL_MVD_DeinitHW(pTaskInfo->eSrcType, pTaskInfo->eDecType);
1358*53ee8cc1Swenshuai.xi     }
1359*53ee8cc1Swenshuai.xi 
1360*53ee8cc1Swenshuai.xi     if (TRUE == isHVD)
1361*53ee8cc1Swenshuai.xi     {
1362*53ee8cc1Swenshuai.xi         bRet = HAL_HVD_EX_DeinitHW(pTaskInfo->u32Id);
1363*53ee8cc1Swenshuai.xi     }
1364*53ee8cc1Swenshuai.xi 
1365*53ee8cc1Swenshuai.xi #if defined(VDEC3)
1366*53ee8cc1Swenshuai.xi     if (TRUE == isEVD)
1367*53ee8cc1Swenshuai.xi     {
1368*53ee8cc1Swenshuai.xi         bRet = HAL_EVD_EX_DeinitHW(pTaskInfo->u32Id);
1369*53ee8cc1Swenshuai.xi     }
1370*53ee8cc1Swenshuai.xi #endif
1371*53ee8cc1Swenshuai.xi 
1372*53ee8cc1Swenshuai.xi #if SUPPORT_G2VP9 && defined(VDEC3)
1373*53ee8cc1Swenshuai.xi     if (FALSE == HAL_VPU_EX_G2VP9InUsed())
1374*53ee8cc1Swenshuai.xi     {
1375*53ee8cc1Swenshuai.xi         bRet = HAL_VP9_EX_DeinitHW();
1376*53ee8cc1Swenshuai.xi     }
1377*53ee8cc1Swenshuai.xi #endif
1378*53ee8cc1Swenshuai.xi     return bRet;
1379*53ee8cc1Swenshuai.xi }
1380*53ee8cc1Swenshuai.xi 
_VPU_EX_DeinitAll(VPU_EX_NDecInitPara * pInitPara)1381*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_DeinitAll(VPU_EX_NDecInitPara *pInitPara)
1382*53ee8cc1Swenshuai.xi {
1383*53ee8cc1Swenshuai.xi     HAL_VPU_EX_SwRst(TRUE);
1384*53ee8cc1Swenshuai.xi     _VPU_EX_DeinitHW(pInitPara->pTaskInfo);
1385*53ee8cc1Swenshuai.xi     HAL_VPU_EX_DeInit();
1386*53ee8cc1Swenshuai.xi 
1387*53ee8cc1Swenshuai.xi     return TRUE;
1388*53ee8cc1Swenshuai.xi }
1389*53ee8cc1Swenshuai.xi 
_VPU_EX_GetActiveCodecCnt(void)1390*53ee8cc1Swenshuai.xi static MS_U8 _VPU_EX_GetActiveCodecCnt(void)
1391*53ee8cc1Swenshuai.xi {
1392*53ee8cc1Swenshuai.xi     MS_U32 i;
1393*53ee8cc1Swenshuai.xi     MS_U8  u8ActiveCnt = 0;
1394*53ee8cc1Swenshuai.xi     for (i = 0; i < sizeof(pVPUHalContext->_stVPUStream) / sizeof(pVPUHalContext->_stVPUStream[0]); i++)
1395*53ee8cc1Swenshuai.xi     {
1396*53ee8cc1Swenshuai.xi         if (E_VPU_EX_DECODER_NONE != pVPUHalContext->_stVPUStream[i].eDecodertype &&
1397*53ee8cc1Swenshuai.xi             E_VPU_EX_DECODER_GET != pVPUHalContext->_stVPUStream[i].eDecodertype &&
1398*53ee8cc1Swenshuai.xi             E_VPU_EX_DECODER_GET_MVC != pVPUHalContext->_stVPUStream[i].eDecodertype)
1399*53ee8cc1Swenshuai.xi         {
1400*53ee8cc1Swenshuai.xi             u8ActiveCnt++;
1401*53ee8cc1Swenshuai.xi         }
1402*53ee8cc1Swenshuai.xi     }
1403*53ee8cc1Swenshuai.xi     if (pVPUHalContext->u8TaskCnt != u8ActiveCnt)
1404*53ee8cc1Swenshuai.xi     {
1405*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Err u8TaskCnt(%d) != u8ActiveCnt(%d)\n", pVPUHalContext->u8TaskCnt, u8ActiveCnt);
1406*53ee8cc1Swenshuai.xi     }
1407*53ee8cc1Swenshuai.xi     VPU_MSG_DBG(" = %d\n", u8ActiveCnt);
1408*53ee8cc1Swenshuai.xi     return u8ActiveCnt;
1409*53ee8cc1Swenshuai.xi }
_VPU_EX_ClockInv(MS_BOOL bEnable)1410*53ee8cc1Swenshuai.xi static void _VPU_EX_ClockInv(MS_BOOL bEnable)
1411*53ee8cc1Swenshuai.xi {
1412*53ee8cc1Swenshuai.xi     if (TRUE)
1413*53ee8cc1Swenshuai.xi     {
1414*53ee8cc1Swenshuai.xi         _VPU_WriteWordMask(REG_TOP_VPU, 0, TOP_CKG_VPU_INV);
1415*53ee8cc1Swenshuai.xi     }
1416*53ee8cc1Swenshuai.xi     else
1417*53ee8cc1Swenshuai.xi     {
1418*53ee8cc1Swenshuai.xi         _VPU_WriteWordMask(REG_TOP_VPU, TOP_CKG_VPU_INV, TOP_CKG_VPU_INV);
1419*53ee8cc1Swenshuai.xi     }
1420*53ee8cc1Swenshuai.xi }
1421*53ee8cc1Swenshuai.xi 
_VPU_EX_ClockSpeed(MS_U32 u32type)1422*53ee8cc1Swenshuai.xi static void _VPU_EX_ClockSpeed(MS_U32 u32type)
1423*53ee8cc1Swenshuai.xi {
1424*53ee8cc1Swenshuai.xi     switch (u32type)
1425*53ee8cc1Swenshuai.xi     {
1426*53ee8cc1Swenshuai.xi         case VPU_CLOCK_240MHZ:
1427*53ee8cc1Swenshuai.xi         case VPU_CLOCK_216MHZ:
1428*53ee8cc1Swenshuai.xi         case VPU_CLOCK_192MHZ:
1429*53ee8cc1Swenshuai.xi         case VPU_CLOCK_12MHZ:
1430*53ee8cc1Swenshuai.xi         case VPU_CLOCK_320MHZ:
1431*53ee8cc1Swenshuai.xi         case VPU_CLOCK_288MHZ:
1432*53ee8cc1Swenshuai.xi         case VPU_CLOCK_384MHZ:
1433*53ee8cc1Swenshuai.xi         case VPU_CLOCK_432MHZ:
1434*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(REG_TOP_VPU, u32type, TOP_CKG_VPU_CLK_MASK);
1435*53ee8cc1Swenshuai.xi             break;
1436*53ee8cc1Swenshuai.xi         default:
1437*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(REG_TOP_VPU, VPU_CLOCK_384MHZ, TOP_CKG_VPU_CLK_MASK);
1438*53ee8cc1Swenshuai.xi             break;
1439*53ee8cc1Swenshuai.xi     }
1440*53ee8cc1Swenshuai.xi }
1441*53ee8cc1Swenshuai.xi #ifdef HAL_FEATURE_MAU
_VPU_EX_MAU_IDLE(void)1442*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_MAU_IDLE(void)
1443*53ee8cc1Swenshuai.xi {
1444*53ee8cc1Swenshuai.xi     if (((_VPU_Read2Byte(MAU1_ARB0_DBG0) & MAU1_FSM_CS_MASK) == MAU1_FSM_CS_IDLE)
1445*53ee8cc1Swenshuai.xi         && ((_VPU_Read2Byte(MAU1_ARB1_DBG0) & MAU1_FSM_CS_MASK) == MAU1_FSM_CS_IDLE))
1446*53ee8cc1Swenshuai.xi     {
1447*53ee8cc1Swenshuai.xi         return TRUE;
1448*53ee8cc1Swenshuai.xi     }
1449*53ee8cc1Swenshuai.xi     return FALSE;
1450*53ee8cc1Swenshuai.xi }
1451*53ee8cc1Swenshuai.xi #endif
1452*53ee8cc1Swenshuai.xi 
1453*53ee8cc1Swenshuai.xi 
1454*53ee8cc1Swenshuai.xi #if (ENABLE_DECOMPRESS_FUNCTION==TRUE)
_VPU_EX_DecompressBin(MS_VIRT u32SrcAddr,MS_U32 u32SrcSize,MS_VIRT u32DestAddr,MS_VIRT u32SlidingAddr)1455*53ee8cc1Swenshuai.xi static MS_BOOL _VPU_EX_DecompressBin(MS_VIRT u32SrcAddr, MS_U32 u32SrcSize, MS_VIRT u32DestAddr, MS_VIRT u32SlidingAddr)
1456*53ee8cc1Swenshuai.xi {
1457*53ee8cc1Swenshuai.xi     if(_VPU_EX_IsNeedDecompress(u32SrcAddr))
1458*53ee8cc1Swenshuai.xi     {
1459*53ee8cc1Swenshuai.xi         ms_VDECDecompressInit((MS_U8*)u32SlidingAddr, (MS_U8*)u32DestAddr);
1460*53ee8cc1Swenshuai.xi         ms_VDECDecompress((MS_U8*)u32SrcAddr, u32SrcSize);
1461*53ee8cc1Swenshuai.xi         ms_VDECDecompressDeInit();
1462*53ee8cc1Swenshuai.xi         return TRUE;
1463*53ee8cc1Swenshuai.xi     }
1464*53ee8cc1Swenshuai.xi     else
1465*53ee8cc1Swenshuai.xi     {
1466*53ee8cc1Swenshuai.xi         return FALSE;
1467*53ee8cc1Swenshuai.xi     }
1468*53ee8cc1Swenshuai.xi }
1469*53ee8cc1Swenshuai.xi #endif
1470*53ee8cc1Swenshuai.xi 
1471*53ee8cc1Swenshuai.xi #if VPU_FIELD_DETECTOR
1472*53ee8cc1Swenshuai.xi 
1473*53ee8cc1Swenshuai.xi #include "FieldDetection.h"
1474*53ee8cc1Swenshuai.xi 
_HAL_VPU_EX_Field_Detecor_Task_HVD(MS_U32 u32Id)1475*53ee8cc1Swenshuai.xi static MS_BOOL _HAL_VPU_EX_Field_Detecor_Task_HVD(MS_U32 u32Id)
1476*53ee8cc1Swenshuai.xi {
1477*53ee8cc1Swenshuai.xi     MS_U8 u8Offset              = _VPU_EX_GetOffsetIdx(u32Id);
1478*53ee8cc1Swenshuai.xi     HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
1479*53ee8cc1Swenshuai.xi     //VPU_FD_DispFrameInfo DispFrmInfo;
1480*53ee8cc1Swenshuai.xi     MsOS_ReadMemory();
1481*53ee8cc1Swenshuai.xi     //memset(&DispFrmInfo,0,sizeof(VPU_FD_DispFrameInfo));
1482*53ee8cc1Swenshuai.xi 
1483*53ee8cc1Swenshuai.xi     if(pShm->u32CodecType == E_HVD_Codec_AVS)
1484*53ee8cc1Swenshuai.xi     {
1485*53ee8cc1Swenshuai.xi         pShm->u8FrmPostProcSupport |= E_HVD_POST_PROC_FIELD_DETECT;
1486*53ee8cc1Swenshuai.xi     }
1487*53ee8cc1Swenshuai.xi 
1488*53ee8cc1Swenshuai.xi     while (1)
1489*53ee8cc1Swenshuai.xi     {
1490*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
1491*53ee8cc1Swenshuai.xi         HVD_Frm_Information *pFrmInfo = (HVD_Frm_Information *)&pShm->DispQueue[pShm->u8PpQueueWPtr];
1492*53ee8cc1Swenshuai.xi         MS_U32 u32SrcMiuSel = (pShm->u32VDEC_MIU_SEL >> VDEC_PPIN_MIUSEL) & VDEC_MIUSEL_MASK;
1493*53ee8cc1Swenshuai.xi 
1494*53ee8cc1Swenshuai.xi         FrameInfo stFrameInfo;
1495*53ee8cc1Swenshuai.xi         stFrameInfo.bFieldOrderSet = (pFrmInfo->u8ModeFlag & E_HVD_PP_FD_TOP_FIELD_FIRST)? 1:0;
1496*53ee8cc1Swenshuai.xi         _miu_offset_to_phy(u32SrcMiuSel, pFrmInfo->u32LumaAddr, stFrameInfo.phyBuffAddr);
1497*53ee8cc1Swenshuai.xi         stFrameInfo.u16Height = pFrmInfo->u16Height;
1498*53ee8cc1Swenshuai.xi         stFrameInfo.u16Width= pFrmInfo->u16Width;
1499*53ee8cc1Swenshuai.xi         stFrameInfo.u32BuffSize = (pFrmInfo->u16Height)*(pFrmInfo->u16Width);
1500*53ee8cc1Swenshuai.xi 
1501*53ee8cc1Swenshuai.xi         if(pShm->u32CodecType == E_HVD_Codec_AVS
1502*53ee8cc1Swenshuai.xi             && pShm->u8FrmPostProcSupport & E_HVD_POST_PROC_FIELD_DETECT_ONGOING)
1503*53ee8cc1Swenshuai.xi         {
1504*53ee8cc1Swenshuai.xi             if(pVPUHalContext->bFDInit[u8Offset]==FALSE)
1505*53ee8cc1Swenshuai.xi             {
1506*53ee8cc1Swenshuai.xi                 FODInfo stFod;
1507*53ee8cc1Swenshuai.xi                 stFod.height =pFrmInfo->u16Height;
1508*53ee8cc1Swenshuai.xi                 stFod.width=pFrmInfo->u16Width;
1509*53ee8cc1Swenshuai.xi                 stFod.pitch=pFrmInfo->u16Pitch;
1510*53ee8cc1Swenshuai.xi                 stFod.tile_width = 16;
1511*53ee8cc1Swenshuai.xi                 stFod.tile_height= 32;
1512*53ee8cc1Swenshuai.xi                 VPU_MSG_INFO("Init Field Detector!!\n");
1513*53ee8cc1Swenshuai.xi                 InitFieldDetection(&stFod);
1514*53ee8cc1Swenshuai.xi 
1515*53ee8cc1Swenshuai.xi                 InitMemoryFromVPU(stFrameInfo.phyBuffAddr+stFrameInfo.u32BuffSize*20,
1516*53ee8cc1Swenshuai.xi                         stFrameInfo.phyBuffAddr+stFrameInfo.u32BuffSize*21,
1517*53ee8cc1Swenshuai.xi                         stFrameInfo.phyBuffAddr+stFrameInfo.u32BuffSize*22);
1518*53ee8cc1Swenshuai.xi                     pVPUHalContext->bFDInit[u8Offset] = TRUE;
1519*53ee8cc1Swenshuai.xi             }
1520*53ee8cc1Swenshuai.xi 
1521*53ee8cc1Swenshuai.xi             VPU_MSG_INFO("[%dx%d], [0x%x, 0x%x], %d ", stFrameInfo.u16Width, stFrameInfo.u16Height,
1522*53ee8cc1Swenshuai.xi             (MS_U32)stFrameInfo.phyBuffAddr, (MS_U32)stFrameInfo.u32BuffSize, stFrameInfo.bFieldOrderSet);
1523*53ee8cc1Swenshuai.xi 
1524*53ee8cc1Swenshuai.xi             MS_U32 u32Timer= MsOS_GetSystemTime();
1525*53ee8cc1Swenshuai.xi             eIsFieldOrderInverse eResult = IsFieldOrderInverse(&stFrameInfo);
1526*53ee8cc1Swenshuai.xi             VPU_MSG_INFO("[%dms] ", MsOS_GetSystemTime()-u32Timer);
1527*53ee8cc1Swenshuai.xi             if(eResult == E_VDEC_IFOI_TRUE)
1528*53ee8cc1Swenshuai.xi             {
1529*53ee8cc1Swenshuai.xi                 pShm->u8FrmPostProcSupport |= E_HVD_POST_PROC_FIELD_DETECT_NEED_REVERSE;
1530*53ee8cc1Swenshuai.xi                 VPU_MSG_INFO("reverse=1\n");
1531*53ee8cc1Swenshuai.xi             }
1532*53ee8cc1Swenshuai.xi             else if(eResult == E_VDEC_IFOI_FALSE)
1533*53ee8cc1Swenshuai.xi             {
1534*53ee8cc1Swenshuai.xi                 pShm->u8FrmPostProcSupport &= ~E_HVD_POST_PROC_FIELD_DETECT_NEED_REVERSE;
1535*53ee8cc1Swenshuai.xi                 VPU_MSG_INFO("reverse=0\n");
1536*53ee8cc1Swenshuai.xi             }
1537*53ee8cc1Swenshuai.xi 
1538*53ee8cc1Swenshuai.xi             pShm->u8FrmPostProcSupport &= ~E_HVD_POST_PROC_FIELD_DETECT_ONGOING;
1539*53ee8cc1Swenshuai.xi 
1540*53ee8cc1Swenshuai.xi             MsOS_FlushMemory();
1541*53ee8cc1Swenshuai.xi         }
1542*53ee8cc1Swenshuai.xi         MsOS_ReadMemory();
1543*53ee8cc1Swenshuai.xi 
1544*53ee8cc1Swenshuai.xi     }
1545*53ee8cc1Swenshuai.xi 
1546*53ee8cc1Swenshuai.xi     return TRUE;
1547*53ee8cc1Swenshuai.xi }
1548*53ee8cc1Swenshuai.xi 
_HAL_VPU_EX_Field_Detecor_Task_MVD(MS_U32 u32Id)1549*53ee8cc1Swenshuai.xi static MS_BOOL _HAL_VPU_EX_Field_Detecor_Task_MVD(MS_U32 u32Id)
1550*53ee8cc1Swenshuai.xi {
1551*53ee8cc1Swenshuai.xi     u32Id = u32Id;
1552*53ee8cc1Swenshuai.xi     while(1)
1553*53ee8cc1Swenshuai.xi     {
1554*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
1555*53ee8cc1Swenshuai.xi         // TODO: handle MVD case here
1556*53ee8cc1Swenshuai.xi     }
1557*53ee8cc1Swenshuai.xi     return TRUE;
1558*53ee8cc1Swenshuai.xi }
1559*53ee8cc1Swenshuai.xi 
_HAL_VPU_EX_FdTask_Delete(MS_U32 u32Id,VPU_Hal_CTX * pVPUHalContext)1560*53ee8cc1Swenshuai.xi static void _HAL_VPU_EX_FdTask_Delete(MS_U32 u32Id, VPU_Hal_CTX* pVPUHalContext)
1561*53ee8cc1Swenshuai.xi {
1562*53ee8cc1Swenshuai.xi     MS_U8 u8Offset              = _VPU_EX_GetOffsetIdx(u32Id);
1563*53ee8cc1Swenshuai.xi     FInitFieldDetection();
1564*53ee8cc1Swenshuai.xi     pVPUHalContext->bFDInit[u8Offset] = FALSE;
1565*53ee8cc1Swenshuai.xi     MsOS_DeleteTask(pVPUHalContext->s32VpuFdTaskId[u8Offset]);
1566*53ee8cc1Swenshuai.xi     pVPUHalContext->s32VpuFdTaskId[u8Offset] = -1;
1567*53ee8cc1Swenshuai.xi }
1568*53ee8cc1Swenshuai.xi 
1569*53ee8cc1Swenshuai.xi 
1570*53ee8cc1Swenshuai.xi #endif
HAL_VPU_EX_SetSingleDecodeMode(MS_BOOL bEnable)1571*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_SetSingleDecodeMode(MS_BOOL bEnable)
1572*53ee8cc1Swenshuai.xi {
1573*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
1574*53ee8cc1Swenshuai.xi     pVPUHalContext->_bVPUSingleMode = bEnable;
1575*53ee8cc1Swenshuai.xi     return bRet;
1576*53ee8cc1Swenshuai.xi }
1577*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_SetSTCMode(MS_U32 u32Id,MS_U32 u32STCIndex)1578*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_SetSTCMode(MS_U32 u32Id, MS_U32 u32STCIndex)
1579*53ee8cc1Swenshuai.xi {
1580*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
1581*53ee8cc1Swenshuai.xi     MS_U8 u8OffsetIdx = _VPU_EX_GetOffsetIdx(u32Id);
1582*53ee8cc1Swenshuai.xi     pVPUHalContext->_stVPUSTCMode[u8OffsetIdx].bSTCSetMode = TRUE;
1583*53ee8cc1Swenshuai.xi     pVPUHalContext->_stVPUSTCMode[u8OffsetIdx].u32STCIndex = u32STCIndex;
1584*53ee8cc1Swenshuai.xi 
1585*53ee8cc1Swenshuai.xi     return bRet;
1586*53ee8cc1Swenshuai.xi }
1587*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_SetDecodeMode(VPU_EX_DecModCfg * pstCfg)1588*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_SetDecodeMode(VPU_EX_DecModCfg *pstCfg)
1589*53ee8cc1Swenshuai.xi {
1590*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
1591*53ee8cc1Swenshuai.xi     MS_U8 i=0;
1592*53ee8cc1Swenshuai.xi     if (pstCfg != NULL)
1593*53ee8cc1Swenshuai.xi     {
1594*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUDecMode.u8DecMod = pstCfg->u8DecMod;
1595*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUDecMode.u8CodecCnt = pstCfg->u8CodecCnt;
1596*53ee8cc1Swenshuai.xi         for (i=0; ((i<pstCfg->u8CodecCnt)&&(i<VPU_MAX_DEC_NUM)); i++)
1597*53ee8cc1Swenshuai.xi         {
1598*53ee8cc1Swenshuai.xi             pVPUHalContext->_stVPUDecMode.u8CodecType[i] = pstCfg->u8CodecType[i];
1599*53ee8cc1Swenshuai.xi         }
1600*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUDecMode.u8ArgSize = pstCfg->u8ArgSize;
1601*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUDecMode.u32Arg    = pstCfg->u32Arg;
1602*53ee8cc1Swenshuai.xi     }
1603*53ee8cc1Swenshuai.xi     else
1604*53ee8cc1Swenshuai.xi     {
1605*53ee8cc1Swenshuai.xi         bRet = FALSE;
1606*53ee8cc1Swenshuai.xi     }
1607*53ee8cc1Swenshuai.xi     return bRet;
1608*53ee8cc1Swenshuai.xi }
1609*53ee8cc1Swenshuai.xi 
1610*53ee8cc1Swenshuai.xi //static MS_BOOL bVpuExReloadFW = TRUE;
1611*53ee8cc1Swenshuai.xi //static MS_BOOL bVpuExLoadFWRlt = FALSE;
HAL_VPU_EX_SetFWReload(MS_BOOL bReload)1612*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_SetFWReload(MS_BOOL bReload)
1613*53ee8cc1Swenshuai.xi {
1614*53ee8cc1Swenshuai.xi     pVPUHalContext->bVpuExReloadFW = bReload;
1615*53ee8cc1Swenshuai.xi     //printf("%s bVpuExReloadFW = %x\n", __FUNCTION__, bVpuExReloadFW);
1616*53ee8cc1Swenshuai.xi     return TRUE;
1617*53ee8cc1Swenshuai.xi }
1618*53ee8cc1Swenshuai.xi 
1619*53ee8cc1Swenshuai.xi 
1620*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1621*53ee8cc1Swenshuai.xi //  Global Functions
1622*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1623*53ee8cc1Swenshuai.xi #ifdef VDEC3_FB
HAL_VPU_EX_LoadVLCTable(VPU_EX_VLCTblCfg * pVlcCfg,MS_U8 u8FwSrcType)1624*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_LoadVLCTable(VPU_EX_VLCTblCfg *pVlcCfg, MS_U8 u8FwSrcType)
1625*53ee8cc1Swenshuai.xi {
1626*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
1627*53ee8cc1Swenshuai.xi     if (E_HVD_FW_INPUT_SOURCE_FLASH == u8FwSrcType)
1628*53ee8cc1Swenshuai.xi     {
1629*53ee8cc1Swenshuai.xi #if VPU_ENABLE_BDMA_FW_FLASH_2_SDRAM
1630*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("Load VLC outF2D: dest:0x%lx source:%lx size:%lx\n",
1631*53ee8cc1Swenshuai.xi             pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
1632*53ee8cc1Swenshuai.xi 
1633*53ee8cc1Swenshuai.xi         if (pVlcCfg->u32BinSize)
1634*53ee8cc1Swenshuai.xi         {
1635*53ee8cc1Swenshuai.xi             SPIDMA_Dev cpyflag = E_SPIDMA_DEV_MIU1;
1636*53ee8cc1Swenshuai.xi 
1637*53ee8cc1Swenshuai.xi             if (HAL_MIU1_BASE <= MsOS_VA2PA(pVlcCfg->u32DstAddr))
1638*53ee8cc1Swenshuai.xi             {
1639*53ee8cc1Swenshuai.xi                 cpyflag = E_SPIDMA_DEV_MIU1;
1640*53ee8cc1Swenshuai.xi             }
1641*53ee8cc1Swenshuai.xi             else
1642*53ee8cc1Swenshuai.xi             {
1643*53ee8cc1Swenshuai.xi                 cpyflag = E_SPIDMA_DEV_MIU0;
1644*53ee8cc1Swenshuai.xi             }
1645*53ee8cc1Swenshuai.xi 
1646*53ee8cc1Swenshuai.xi             if (!HVD_FLASHcpy(MsOS_VA2PA(pVlcCfg->u32DstAddr), MsOS_VA2PA(pVlcCfg->u32BinAddr), pVlcCfg->u32BinSize, cpyflag))
1647*53ee8cc1Swenshuai.xi             {
1648*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",
1649*53ee8cc1Swenshuai.xi                      pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize, (MS_U32) cpyflag);
1650*53ee8cc1Swenshuai.xi 
1651*53ee8cc1Swenshuai.xi                 return FALSE;
1652*53ee8cc1Swenshuai.xi             }
1653*53ee8cc1Swenshuai.xi         }
1654*53ee8cc1Swenshuai.xi         else
1655*53ee8cc1Swenshuai.xi         {
1656*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("During copy VLC from Flash to Dram, the source size of FW is zero\n");
1657*53ee8cc1Swenshuai.xi             return FALSE;
1658*53ee8cc1Swenshuai.xi         }
1659*53ee8cc1Swenshuai.xi #else
1660*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("driver not enable to use BDMA copy VLC from flash 2 sdram.\n");
1661*53ee8cc1Swenshuai.xi         return FALSE;
1662*53ee8cc1Swenshuai.xi #endif
1663*53ee8cc1Swenshuai.xi     }
1664*53ee8cc1Swenshuai.xi     else
1665*53ee8cc1Swenshuai.xi     {
1666*53ee8cc1Swenshuai.xi         if (E_HVD_FW_INPUT_SOURCE_DRAM == u8FwSrcType)
1667*53ee8cc1Swenshuai.xi         {
1668*53ee8cc1Swenshuai.xi             if ((pVlcCfg->u32BinAddr != 0) && (pVlcCfg->u32BinSize != 0))
1669*53ee8cc1Swenshuai.xi             {
1670*53ee8cc1Swenshuai.xi                 VPU_MSG_INFO("Load VLC outD2D: dest:0x%lx source:%lx size:%lx\n",
1671*53ee8cc1Swenshuai.xi                             (unsigned long)pVlcCfg->u32DstAddr, (unsigned long)pVlcCfg->u32BinAddr, (unsigned long)pVlcCfg->u32BinSize);
1672*53ee8cc1Swenshuai.xi 
1673*53ee8cc1Swenshuai.xi #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
1674*53ee8cc1Swenshuai.xi                 BDMA_Result bdmaRlt;
1675*53ee8cc1Swenshuai.xi 
1676*53ee8cc1Swenshuai.xi                 MsOS_FlushMemory();
1677*53ee8cc1Swenshuai.xi                 bdmaRlt = HVD_dmacpy(pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
1678*53ee8cc1Swenshuai.xi 
1679*53ee8cc1Swenshuai.xi                 if (E_BDMA_OK != bdmaRlt)
1680*53ee8cc1Swenshuai.xi                 {
1681*53ee8cc1Swenshuai.xi                     VPU_MSG_ERR("MDrv_BDMA_MemCopy fail in %s(), ret=%x!\n", __FUNCTION__, bdmaRlt);
1682*53ee8cc1Swenshuai.xi                 }
1683*53ee8cc1Swenshuai.xi #else
1684*53ee8cc1Swenshuai.xi                 HVD_memcpy(pVlcCfg->u32DstAddr, pVlcCfg->u32BinAddr, pVlcCfg->u32BinSize);
1685*53ee8cc1Swenshuai.xi #endif
1686*53ee8cc1Swenshuai.xi             }
1687*53ee8cc1Swenshuai.xi             else
1688*53ee8cc1Swenshuai.xi             {
1689*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR
1690*53ee8cc1Swenshuai.xi                     ("During copy VLC from out Dram to Dram, the source size or virtual address of VLC is zero\n");
1691*53ee8cc1Swenshuai.xi                 return FALSE;
1692*53ee8cc1Swenshuai.xi             }
1693*53ee8cc1Swenshuai.xi         }
1694*53ee8cc1Swenshuai.xi         else
1695*53ee8cc1Swenshuai.xi         {
1696*53ee8cc1Swenshuai.xi #if VPU_ENABLE_EMBEDDED_FW_BINARY
1697*53ee8cc1Swenshuai.xi #ifdef HVD_CACHE_TO_UNCACHE_CONVERT
1698*53ee8cc1Swenshuai.xi             MS_U8 *pu8HVD_VLC_Binary;
1699*53ee8cc1Swenshuai.xi 
1700*53ee8cc1Swenshuai.xi             pu8HVD_VLC_Binary = (MS_U8 *) ((MS_U32) u8HVD_VLC_Binary | 0xA0000000);
1701*53ee8cc1Swenshuai.xi 
1702*53ee8cc1Swenshuai.xi             VPU_MSG_DBG("Load VLC inD2D: dest:0x%lx source:%lx size:%lx\n",
1703*53ee8cc1Swenshuai.xi                         (unsigned long)pVlcCfg->u32DstAddr, (unsigned long) pu8HVD_VLC_Binary),
1704*53ee8cc1Swenshuai.xi                         (MS_U32) sizeof(u8HVD_VLC_Binary));
1705*53ee8cc1Swenshuai.xi 
1706*53ee8cc1Swenshuai.xi             HVD_memcpy((void *) (pVlcCfg->u32DstAddr),
1707*53ee8cc1Swenshuai.xi                        (void *) ((MS_U32) pu8HVD_VLC_Binary), sizeof(u8HVD_VLC_Binary));
1708*53ee8cc1Swenshuai.xi #else
1709*53ee8cc1Swenshuai.xi             VPU_MSG_INFO("Load VLC inD2D: dest:0x%lx source:%lx size:%x\n",
1710*53ee8cc1Swenshuai.xi                         (unsigned long)MsOS_VA2PA(pVlcCfg->u32DstAddr), (unsigned long) u8HVD_VLC_Binary,
1711*53ee8cc1Swenshuai.xi                         (MS_U32) sizeof(u8HVD_VLC_Binary));
1712*53ee8cc1Swenshuai.xi 
1713*53ee8cc1Swenshuai.xi             HVD_memcpy(pVlcCfg->u32DstAddr, ((MS_VIRT) u8HVD_VLC_Binary), sizeof(u8HVD_VLC_Binary));
1714*53ee8cc1Swenshuai.xi #endif
1715*53ee8cc1Swenshuai.xi #else
1716*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("driver not enable to use embedded VLC binary.\n");
1717*53ee8cc1Swenshuai.xi             return FALSE;
1718*53ee8cc1Swenshuai.xi #endif
1719*53ee8cc1Swenshuai.xi         }
1720*53ee8cc1Swenshuai.xi     }
1721*53ee8cc1Swenshuai.xi #endif
1722*53ee8cc1Swenshuai.xi 
1723*53ee8cc1Swenshuai.xi     return TRUE;
1724*53ee8cc1Swenshuai.xi }
1725*53ee8cc1Swenshuai.xi #endif
1726*53ee8cc1Swenshuai.xi #ifdef VDEC3
HAL_VPU_EX_TaskCreate(MS_U32 u32Id,VPU_EX_NDecInitPara * pInitPara,MS_BOOL bFWdecideFB,MS_U32 u32BBUId)1727*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_TaskCreate(MS_U32 u32Id, VPU_EX_NDecInitPara *pInitPara, MS_BOOL bFWdecideFB, MS_U32 u32BBUId)
1728*53ee8cc1Swenshuai.xi #else
1729*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_TaskCreate(MS_U32 u32Id, VPU_EX_NDecInitPara *pInitPara)
1730*53ee8cc1Swenshuai.xi #endif
1731*53ee8cc1Swenshuai.xi {
1732*53ee8cc1Swenshuai.xi     VPU_EX_TaskInfo *pTaskInfo  = pInitPara->pTaskInfo;
1733*53ee8cc1Swenshuai.xi     MS_U8 u8Offset              = _VPU_EX_GetOffsetIdx(u32Id);
1734*53ee8cc1Swenshuai.xi     HVD_User_Cmd eCmd           = E_HVD_CMD_INVALID_CMD;
1735*53ee8cc1Swenshuai.xi     VPU_EX_DecoderType eDecType = E_VPU_EX_DECODER_NONE;
1736*53ee8cc1Swenshuai.xi     MS_U32 u32Arg = 0xFFFFFFFF;
1737*53ee8cc1Swenshuai.xi     MS_U32 u32Timeout = 0;
1738*53ee8cc1Swenshuai.xi     HVD_Return eCtrlRet = E_HVD_RETURN_FAIL;
1739*53ee8cc1Swenshuai.xi     MS_U32 u32CmdArg = 0;
1740*53ee8cc1Swenshuai.xi     struct _ctl_info *ctl_ptr = (struct _ctl_info *)
1741*53ee8cc1Swenshuai.xi                     MsOS_PA2KSEG1(MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr) + CTL_INFO_ADDR);
1742*53ee8cc1Swenshuai.xi 
1743*53ee8cc1Swenshuai.xi     _HAL_VPU_Entry();
1744*53ee8cc1Swenshuai.xi     //Check FW buffer size
1745*53ee8cc1Swenshuai.xi     if (1 == u8Offset)
1746*53ee8cc1Swenshuai.xi     {
1747*53ee8cc1Swenshuai.xi         MS_VIRT u32MinFWBuffSize = (u8Offset + 1) * VPU_FW_MEM_OFFSET;
1748*53ee8cc1Swenshuai.xi         MS_VIRT u32CurFWBuffSize = pInitPara->pFWCodeCfg->u32DstSize;
1749*53ee8cc1Swenshuai.xi 
1750*53ee8cc1Swenshuai.xi         if (u32CurFWBuffSize < u32MinFWBuffSize)
1751*53ee8cc1Swenshuai.xi         {
1752*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("FW BuffSize(0x%lx < 0x%lx) is too small!\n", (unsigned long)u32CurFWBuffSize, (unsigned long)u32MinFWBuffSize);
1753*53ee8cc1Swenshuai.xi             _HAL_VPU_Release();
1754*53ee8cc1Swenshuai.xi             return FALSE;
1755*53ee8cc1Swenshuai.xi         }
1756*53ee8cc1Swenshuai.xi     }
1757*53ee8cc1Swenshuai.xi 
1758*53ee8cc1Swenshuai.xi     if(( E_HAL_VPU_MVC_STREAM_BASE == (0xFF & u32Id))
1759*53ee8cc1Swenshuai.xi         &&(E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[0].eDecodertype)
1760*53ee8cc1Swenshuai.xi         &&(E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[1].eDecodertype))
1761*53ee8cc1Swenshuai.xi     {
1762*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUStream[0].eStreamId = E_HAL_VPU_MVC_MAIN_VIEW;
1763*53ee8cc1Swenshuai.xi     }
1764*53ee8cc1Swenshuai.xi     #ifdef VDEC3
1765*53ee8cc1Swenshuai.xi     pVPUHalContext->u32FWCodeAddr = MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr);
1766*53ee8cc1Swenshuai.xi     #endif
1767*53ee8cc1Swenshuai.xi 
1768*53ee8cc1Swenshuai.xi     if (0 == pVPUHalContext->u8TaskCnt)
1769*53ee8cc1Swenshuai.xi     {
1770*53ee8cc1Swenshuai.xi         //No task is created, need to load f/w, etc.
1771*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("u8TaskCnt=%d\n", pVPUHalContext->u8TaskCnt);
1772*53ee8cc1Swenshuai.xi 
1773*53ee8cc1Swenshuai.xi         if (!_VPU_EX_InitAll(pInitPara))
1774*53ee8cc1Swenshuai.xi         {
1775*53ee8cc1Swenshuai.xi             VPU_MSG_DBG("(%d) fail to InitAll\n", __LINE__);
1776*53ee8cc1Swenshuai.xi             _HAL_VPU_Release();
1777*53ee8cc1Swenshuai.xi             return FALSE;
1778*53ee8cc1Swenshuai.xi         }
1779*53ee8cc1Swenshuai.xi 
1780*53ee8cc1Swenshuai.xi         //Check if controller finish initialization: clear mailbox, etc.
1781*53ee8cc1Swenshuai.xi         //Need to check it before sending any controller commands!
1782*53ee8cc1Swenshuai.xi         u32Timeout = HVD_GetSysTime_ms() + VPU_CMD_TIMEOUT;
1783*53ee8cc1Swenshuai.xi         while (CTL_STU_NONE == ctl_ptr->statue)
1784*53ee8cc1Swenshuai.xi         {
1785*53ee8cc1Swenshuai.xi             if (HVD_GetSysTime_ms() > u32Timeout)
1786*53ee8cc1Swenshuai.xi             {
1787*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("Ctl init timeout, st=%x\n", ctl_ptr->statue);
1788*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",
1789*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]);
1790*53ee8cc1Swenshuai.xi                 MS_U32 t=0;
1791*53ee8cc1Swenshuai.xi                 for (t=0; t<30; t++)
1792*53ee8cc1Swenshuai.xi                 {
1793*53ee8cc1Swenshuai.xi                     VPU_MSG_DBG("_pc=0x%x\n", HAL_VPU_EX_GetProgCnt());
1794*53ee8cc1Swenshuai.xi                 }
1795*53ee8cc1Swenshuai.xi                 _HAL_VPU_Release();
1796*53ee8cc1Swenshuai.xi                 return FALSE;
1797*53ee8cc1Swenshuai.xi             }
1798*53ee8cc1Swenshuai.xi 
1799*53ee8cc1Swenshuai.xi             MsOS_ReadMemory();
1800*53ee8cc1Swenshuai.xi         }
1801*53ee8cc1Swenshuai.xi 
1802*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",
1803*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]);
1804*53ee8cc1Swenshuai.xi 
1805*53ee8cc1Swenshuai.xi     }
1806*53ee8cc1Swenshuai.xi     else
1807*53ee8cc1Swenshuai.xi     {
1808*53ee8cc1Swenshuai.xi         if (pVPUHalContext->_bVPUSingleMode)
1809*53ee8cc1Swenshuai.xi         {
1810*53ee8cc1Swenshuai.xi             //Show error message
1811*53ee8cc1Swenshuai.xi             printf("This task will use dram instead of sram!!!\n");
1812*53ee8cc1Swenshuai.xi             VPU_MSG_INFO("VDEC warn: this task will use dram instead of sram!!!\n");
1813*53ee8cc1Swenshuai.xi         }
1814*53ee8cc1Swenshuai.xi 
1815*53ee8cc1Swenshuai.xi         if (!_VPU_EX_InitHW(pInitPara->pTaskInfo))
1816*53ee8cc1Swenshuai.xi         {
1817*53ee8cc1Swenshuai.xi             VPU_MSG_DBG("(%d) fail to InitHW\n", __LINE__);
1818*53ee8cc1Swenshuai.xi             _HAL_VPU_Release();
1819*53ee8cc1Swenshuai.xi             return FALSE;
1820*53ee8cc1Swenshuai.xi         }
1821*53ee8cc1Swenshuai.xi         if (pInitPara->pVLCCfg)
1822*53ee8cc1Swenshuai.xi         {
1823*53ee8cc1Swenshuai.xi             if (!_VPU_EX_LoadVLCTable(pInitPara->pVLCCfg, pInitPara->pFWCodeCfg->u8SrcType))
1824*53ee8cc1Swenshuai.xi             {
1825*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("HAL_VPU_LoadVLCTable fail!\n");
1826*53ee8cc1Swenshuai.xi                 _HAL_VPU_Release();
1827*53ee8cc1Swenshuai.xi                 return FALSE;
1828*53ee8cc1Swenshuai.xi             }
1829*53ee8cc1Swenshuai.xi         }
1830*53ee8cc1Swenshuai.xi     }
1831*53ee8cc1Swenshuai.xi 
1832*53ee8cc1Swenshuai.xi 
1833*53ee8cc1Swenshuai.xi     #ifdef VDEC3
1834*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
1835*53ee8cc1Swenshuai.xi     {
1836*53ee8cc1Swenshuai.xi             VDEC_VBBU *pTemp4 = (VDEC_VBBU *)MsOS_PA2KSEG1(MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr) + VBBU_TABLE_START + u8Offset*VPU_FW_MEM_OFFSET);
1837*53ee8cc1Swenshuai.xi 
1838*53ee8cc1Swenshuai.xi             memset(pTemp4,0,sizeof(VDEC_VBBU));
1839*53ee8cc1Swenshuai.xi 
1840*53ee8cc1Swenshuai.xi             *((unsigned int*)(pTemp4->u8Reserved)) = MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr)-HAL_MIU1_BASE;
1841*53ee8cc1Swenshuai.xi 
1842*53ee8cc1Swenshuai.xi             DISPQ_IN_DRAM *pTemp = (DISPQ_IN_DRAM *)MsOS_PA2KSEG1(MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr) + DISP_QUEUE_START + u8Offset*VPU_FW_MEM_OFFSET);
1843*53ee8cc1Swenshuai.xi 
1844*53ee8cc1Swenshuai.xi             memset(pTemp,0,sizeof(DISPQ_IN_DRAM));
1845*53ee8cc1Swenshuai.xi 
1846*53ee8cc1Swenshuai.xi             CMD_QUEUE *pTemp2 = (CMD_QUEUE *)MsOS_PA2KSEG1(MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr) + VCOMMANDQ_INFO_START + u8Offset*VPU_FW_MEM_OFFSET);
1847*53ee8cc1Swenshuai.xi 
1848*53ee8cc1Swenshuai.xi             memset(pTemp2,0,sizeof(CMD_QUEUE));
1849*53ee8cc1Swenshuai.xi 
1850*53ee8cc1Swenshuai.xi             pTemp2->u32HVD_DISPCMDQ_DRAM_ST_ADDR = VDISP_COMMANDQ_START + u8Offset*VPU_FW_MEM_OFFSET;
1851*53ee8cc1Swenshuai.xi 
1852*53ee8cc1Swenshuai.xi             pTemp2->u32HVD_CMDQ_DRAM_ST_ADDR = VNORMAL_COMMANDQ_START + u8Offset*VPU_FW_MEM_OFFSET;
1853*53ee8cc1Swenshuai.xi 
1854*53ee8cc1Swenshuai.xi             unsigned char* pTemp3 = (unsigned char*)MsOS_PA2KSEG1(MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr) + VDISP_COMMANDQ_START + u8Offset*VPU_FW_MEM_OFFSET);
1855*53ee8cc1Swenshuai.xi 
1856*53ee8cc1Swenshuai.xi             memset(pTemp3,0,0x2000);
1857*53ee8cc1Swenshuai.xi 
1858*53ee8cc1Swenshuai.xi             unsigned int* pVersion = (unsigned int*)MsOS_PA2KSEG1(MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr) + OFFSET_BASE + u8Offset*VPU_FW_MEM_OFFSET);
1859*53ee8cc1Swenshuai.xi 
1860*53ee8cc1Swenshuai.xi             memset((void*)pVersion,0,0x8);
1861*53ee8cc1Swenshuai.xi 
1862*53ee8cc1Swenshuai.xi             *pVersion = 1; //0:diu, 1:wb
1863*53ee8cc1Swenshuai.xi     }
1864*53ee8cc1Swenshuai.xi 
1865*53ee8cc1Swenshuai.xi     #endif
1866*53ee8cc1Swenshuai.xi 
1867*53ee8cc1Swenshuai.xi     #if 1  // For TEE
1868*53ee8cc1Swenshuai.xi #ifdef VDEC3
1869*53ee8cc1Swenshuai.xi   #if SUPPORT_G2VP9
1870*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType ||
1871*53ee8cc1Swenshuai.xi         E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_G2VP9 == pTaskInfo->eDecType)
1872*53ee8cc1Swenshuai.xi   #else
1873*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType)
1874*53ee8cc1Swenshuai.xi   #endif
1875*53ee8cc1Swenshuai.xi #else
1876*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
1877*53ee8cc1Swenshuai.xi #endif
1878*53ee8cc1Swenshuai.xi     {
1879*53ee8cc1Swenshuai.xi         MS_VIRT u32FWPhyAddr = MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr);
1880*53ee8cc1Swenshuai.xi 
1881*53ee8cc1Swenshuai.xi         if (pVPUHalContext->u32FWShareInfoAddr[u8Offset] == 0xFFFFFFFFUL)
1882*53ee8cc1Swenshuai.xi         {
1883*53ee8cc1Swenshuai.xi             ctl_ptr->u32TaskShareInfoAddr[u8Offset] = 0xFFFFFFFFUL;
1884*53ee8cc1Swenshuai.xi         }
1885*53ee8cc1Swenshuai.xi         else
1886*53ee8cc1Swenshuai.xi         {
1887*53ee8cc1Swenshuai.xi             ctl_ptr->u32TaskShareInfoAddr[u8Offset] = pVPUHalContext->u32FWShareInfoAddr[u8Offset] - u32FWPhyAddr;
1888*53ee8cc1Swenshuai.xi         }
1889*53ee8cc1Swenshuai.xi 
1890*53ee8cc1Swenshuai.xi         MsOS_FlushMemory();
1891*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("task share info offset = 0x%x\n", ctl_ptr->u32TaskShareInfoAddr[u8Offset]);
1892*53ee8cc1Swenshuai.xi 
1893*53ee8cc1Swenshuai.xi         ///printf("DRV side,      share info offset = 0x%lx\n", pVPUHalContext->u32FWShareInfoAddr[u8Offset]);
1894*53ee8cc1Swenshuai.xi         ///printf("FW side,  task share info offset = 0x%x\n", ctl_ptr->u32TaskShareInfoAddr[u8Offset]);
1895*53ee8cc1Swenshuai.xi     }
1896*53ee8cc1Swenshuai.xi     #endif
1897*53ee8cc1Swenshuai.xi 
1898*53ee8cc1Swenshuai.xi     if ((pVPUHalContext->bEnableDymanicFBMode == TRUE) && (pVPUHalContext->u8TaskCnt == 0))
1899*53ee8cc1Swenshuai.xi     {
1900*53ee8cc1Swenshuai.xi         ctl_ptr->FB_ADDRESS = pVPUHalContext->u32DynamicFBAddress;
1901*53ee8cc1Swenshuai.xi         ctl_ptr->FB_Total_SIZE = pVPUHalContext->u32DynamicFBSize;
1902*53ee8cc1Swenshuai.xi 
1903*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetCmd(u32Id, E_DUAL_CMD_COMMON, 0);
1904*53ee8cc1Swenshuai.xi 
1905*53ee8cc1Swenshuai.xi         MsOS_FlushMemory();
1906*53ee8cc1Swenshuai.xi     }
1907*53ee8cc1Swenshuai.xi 
1908*53ee8cc1Swenshuai.xi     if (pVPUHalContext->_stVPUSTCMode[u8Offset].bSTCSetMode)
1909*53ee8cc1Swenshuai.xi     {
1910*53ee8cc1Swenshuai.xi         eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_CMD_STC_MODE, pVPUHalContext->_stVPUSTCMode[u8Offset].u32STCIndex);
1911*53ee8cc1Swenshuai.xi         if (E_HVD_RETURN_SUCCESS != eCtrlRet)
1912*53ee8cc1Swenshuai.xi         {
1913*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("E_HVD_CMD_STC_MODE NG eCtrlRet=%x\n", eCtrlRet);
1914*53ee8cc1Swenshuai.xi         }
1915*53ee8cc1Swenshuai.xi     }
1916*53ee8cc1Swenshuai.xi 
1917*53ee8cc1Swenshuai.xi     if ((TRUE==pVPUHalContext->_bVPUSingleMode) || (E_VPU_DEC_MODE_SINGLE==pVPUHalContext->_stVPUDecMode.u8DecMod))
1918*53ee8cc1Swenshuai.xi     {
1919*53ee8cc1Swenshuai.xi         //Issue E_DUAL_CMD_SINGLE_TASK to FW controller
1920*53ee8cc1Swenshuai.xi         //arg=1 to get better performance for single task
1921*53ee8cc1Swenshuai.xi         u32CmdArg = (pVPUHalContext->_bVPUSingleMode) ? 1 : 0;
1922*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("Issue E_DUAL_CMD_SINGLE_TASK to FW controller arg=%x\n", u32CmdArg);
1923*53ee8cc1Swenshuai.xi         eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_CMD_SINGLE_TASK, u32CmdArg);
1924*53ee8cc1Swenshuai.xi         if (E_HVD_RETURN_SUCCESS != eCtrlRet)
1925*53ee8cc1Swenshuai.xi         {
1926*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("E_DUAL_CMD_SINGLE_TASK NG eCtrlRet=%x\n", eCtrlRet);
1927*53ee8cc1Swenshuai.xi         }
1928*53ee8cc1Swenshuai.xi     }
1929*53ee8cc1Swenshuai.xi     else if (E_VPU_DEC_MODE_DUAL_3D==pVPUHalContext->_stVPUDecMode.u8DecMod)
1930*53ee8cc1Swenshuai.xi     {
1931*53ee8cc1Swenshuai.xi         if(pVPUHalContext->_stVPUDecMode.u8CodecType[0] != pVPUHalContext->_stVPUDecMode.u8CodecType[1])
1932*53ee8cc1Swenshuai.xi         {
1933*53ee8cc1Swenshuai.xi             switch (pVPUHalContext->_stVPUDecMode.u32Arg)
1934*53ee8cc1Swenshuai.xi             {
1935*53ee8cc1Swenshuai.xi                 case E_VPU_CMD_MODE_KR3D_INTERLACE:
1936*53ee8cc1Swenshuai.xi                     u32CmdArg = CTL_MODE_3DTV;
1937*53ee8cc1Swenshuai.xi                     break;
1938*53ee8cc1Swenshuai.xi                 case E_VPU_CMD_MODE_KR3D_FORCE_P:
1939*53ee8cc1Swenshuai.xi                     u32CmdArg = CTL_MODE_3DTV_PROG;
1940*53ee8cc1Swenshuai.xi                     break;
1941*53ee8cc1Swenshuai.xi                 case E_VPU_CMD_MODE_KR3D_INTERLACE_TWO_PITCH:
1942*53ee8cc1Swenshuai.xi                     u32CmdArg = CTL_MODE_3DTV_TWO_PITCH;
1943*53ee8cc1Swenshuai.xi                     break;
1944*53ee8cc1Swenshuai.xi                 case E_VPU_CMD_MODE_KR3D_FORCE_P_TWO_PITCH:
1945*53ee8cc1Swenshuai.xi                     u32CmdArg = CTL_MODE_3DTV_PROG_TWO_PITCH;
1946*53ee8cc1Swenshuai.xi                     break;
1947*53ee8cc1Swenshuai.xi                 default:
1948*53ee8cc1Swenshuai.xi                     u32CmdArg = CTL_MODE_3DTV;
1949*53ee8cc1Swenshuai.xi                     VPU_MSG_INFO("%x not defined, use CTL_MODE_3DTV for KR3D\n", pVPUHalContext->_stVPUDecMode.u32Arg);
1950*53ee8cc1Swenshuai.xi                     break;
1951*53ee8cc1Swenshuai.xi             }
1952*53ee8cc1Swenshuai.xi         }
1953*53ee8cc1Swenshuai.xi         else
1954*53ee8cc1Swenshuai.xi         {
1955*53ee8cc1Swenshuai.xi             u32CmdArg = CTL_MODE_3DWMV;
1956*53ee8cc1Swenshuai.xi         }
1957*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("Issue E_DUAL_CMD_MODE to FW controller arg=%x\n", u32CmdArg);
1958*53ee8cc1Swenshuai.xi         eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_CMD_MODE, u32CmdArg);
1959*53ee8cc1Swenshuai.xi         if (E_HVD_RETURN_SUCCESS != eCtrlRet)
1960*53ee8cc1Swenshuai.xi         {
1961*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("E_DUAL_CMD_MODE NG eCtrlRet=%x\n", eCtrlRet);
1962*53ee8cc1Swenshuai.xi         }
1963*53ee8cc1Swenshuai.xi     }
1964*53ee8cc1Swenshuai.xi     else if(E_VPU_DEC_MODE_DUAL_INDIE == pVPUHalContext->_stVPUDecMode.u8DecMod)
1965*53ee8cc1Swenshuai.xi     {
1966*53ee8cc1Swenshuai.xi         if(E_VPU_CMD_MODE_PIP_SYNC_MAIN_STC == pVPUHalContext->_stVPUDecMode.u32Arg)
1967*53ee8cc1Swenshuai.xi         {
1968*53ee8cc1Swenshuai.xi             u32CmdArg = CTL_MODE_ONE_STC;
1969*53ee8cc1Swenshuai.xi         }
1970*53ee8cc1Swenshuai.xi         else
1971*53ee8cc1Swenshuai.xi         {
1972*53ee8cc1Swenshuai.xi             u32CmdArg = (pVPUHalContext->_stVPUDecMode.u32Arg==E_VPU_CMD_MODE_PIP_SYNC_SWITCH) ? CTL_MODE_SWITCH_STC : CTL_MODE_NORMAL;
1973*53ee8cc1Swenshuai.xi         }
1974*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("Issue E_DUAL_CMD_MODE to FW controller arg=%x\n", u32CmdArg);
1975*53ee8cc1Swenshuai.xi         eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_CMD_MODE, u32CmdArg);
1976*53ee8cc1Swenshuai.xi         if (E_HVD_RETURN_SUCCESS != eCtrlRet)
1977*53ee8cc1Swenshuai.xi         {
1978*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("E_DUAL_CMD_MODE NG eCtrlRet=%x\n", eCtrlRet);
1979*53ee8cc1Swenshuai.xi         }
1980*53ee8cc1Swenshuai.xi     }
1981*53ee8cc1Swenshuai.xi 
1982*53ee8cc1Swenshuai.xi     eCmd = _VPU_EX_MapCtrlCmd(pTaskInfo);
1983*53ee8cc1Swenshuai.xi #if defined(SUPPORT_NEW_MEM_LAYOUT)
1984*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
1985*53ee8cc1Swenshuai.xi #ifdef VDEC3
1986*53ee8cc1Swenshuai.xi     {
1987*53ee8cc1Swenshuai.xi         u32Arg = (u32BBUId << VDEC_BBU_ID_SHIFT) + u8Offset * VPU_FW_MEM_OFFSET + OFFSET_BASE;
1988*53ee8cc1Swenshuai.xi     }
1989*53ee8cc1Swenshuai.xi #else
1990*53ee8cc1Swenshuai.xi         u32Arg = u8Offset * VPU_FW_MEM_OFFSET + OFFSET_BASE;
1991*53ee8cc1Swenshuai.xi #endif
1992*53ee8cc1Swenshuai.xi 
1993*53ee8cc1Swenshuai.xi #ifdef VDEC3
1994*53ee8cc1Swenshuai.xi     #if SUPPORT_G2VP9
1995*53ee8cc1Swenshuai.xi     else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_G2VP9 == pTaskInfo->eDecType)
1996*53ee8cc1Swenshuai.xi     #else
1997*53ee8cc1Swenshuai.xi     else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType)
1998*53ee8cc1Swenshuai.xi     #endif
1999*53ee8cc1Swenshuai.xi     {
2000*53ee8cc1Swenshuai.xi         u32Arg = (u32BBUId << VDEC_BBU_ID_SHIFT) + (u8Offset * VPU_FW_MEM_OFFSET) + HVD_SHARE_MEM_ST_OFFSET;
2001*53ee8cc1Swenshuai.xi     }
2002*53ee8cc1Swenshuai.xi #else
2003*53ee8cc1Swenshuai.xi     else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
2004*53ee8cc1Swenshuai.xi         u32Arg = u8Offset * VPU_FW_MEM_OFFSET + HVD_SHARE_MEM_ST_OFFSET;
2005*53ee8cc1Swenshuai.xi #endif
2006*53ee8cc1Swenshuai.xi     else
2007*53ee8cc1Swenshuai.xi     {
2008*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Can't find eDecType! %d\n", pTaskInfo->eDecType);
2009*53ee8cc1Swenshuai.xi         _HAL_VPU_Release();
2010*53ee8cc1Swenshuai.xi         return FALSE;
2011*53ee8cc1Swenshuai.xi     }
2012*53ee8cc1Swenshuai.xi #else
2013*53ee8cc1Swenshuai.xi     u32Arg = u8Offset * VPU_FW_MEM_OFFSET;
2014*53ee8cc1Swenshuai.xi #endif
2015*53ee8cc1Swenshuai.xi 
2016*53ee8cc1Swenshuai.xi     VPRINTF("[NDec][%s][%d] create task : id 0x%x, cmd 0x%x, arg 0x%x, bbuID %d, offset %d \n", __FUNCTION__, __LINE__, u32Id, eCmd, u32Arg, u32BBUId, u8Offset);
2017*53ee8cc1Swenshuai.xi     HAL_HVD_EX_SetCmd(u32Id, eCmd, u32Arg);
2018*53ee8cc1Swenshuai.xi 
2019*53ee8cc1Swenshuai.xi     MsOS_ReadMemory();
2020*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",
2021*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]);
2022*53ee8cc1Swenshuai.xi 
2023*53ee8cc1Swenshuai.xi     u32Timeout = HVD_GetSysTime_ms() + VPU_CMD_TIMEOUT;
2024*53ee8cc1Swenshuai.xi     while (CTL_TASK_CMDRDY != ctl_ptr->task_statue[u8Offset])
2025*53ee8cc1Swenshuai.xi     {
2026*53ee8cc1Swenshuai.xi         if (HVD_GetSysTime_ms() > u32Timeout)
2027*53ee8cc1Swenshuai.xi         {
2028*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("Task %d creation timeout\n", u8Offset);
2029*53ee8cc1Swenshuai.xi             MS_U32 t=0;
2030*53ee8cc1Swenshuai.xi             for (t=0; t<30; t++)
2031*53ee8cc1Swenshuai.xi             {
2032*53ee8cc1Swenshuai.xi                 VPU_MSG_DBG("_pc=0x%x\n", HAL_VPU_EX_GetProgCnt());
2033*53ee8cc1Swenshuai.xi             }
2034*53ee8cc1Swenshuai.xi //#ifndef VDEC3 // FIXME: workaround fw response time is slow sometimes in multiple stream case so far
2035*53ee8cc1Swenshuai.xi             pVPUHalContext->bVpuExLoadFWRlt = FALSE; ///error handling
2036*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("set bVpuExLoadFWRlt as FALSE\n\n");
2037*53ee8cc1Swenshuai.xi             _HAL_VPU_Release();
2038*53ee8cc1Swenshuai.xi             return FALSE;
2039*53ee8cc1Swenshuai.xi //#endif
2040*53ee8cc1Swenshuai.xi         }
2041*53ee8cc1Swenshuai.xi 
2042*53ee8cc1Swenshuai.xi         MsOS_ReadMemory();
2043*53ee8cc1Swenshuai.xi     }
2044*53ee8cc1Swenshuai.xi 
2045*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",
2046*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]);
2047*53ee8cc1Swenshuai.xi 
2048*53ee8cc1Swenshuai.xi #ifdef VDEC3
2049*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType || E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType)
2050*53ee8cc1Swenshuai.xi #else
2051*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
2052*53ee8cc1Swenshuai.xi #endif
2053*53ee8cc1Swenshuai.xi     {
2054*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetNalTblAddr(u32Id);
2055*53ee8cc1Swenshuai.xi     }
2056*53ee8cc1Swenshuai.xi 
2057*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
2058*53ee8cc1Swenshuai.xi     {
2059*53ee8cc1Swenshuai.xi         eDecType = E_VPU_EX_DECODER_MVD;
2060*53ee8cc1Swenshuai.xi     }
2061*53ee8cc1Swenshuai.xi     else if (E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType)
2062*53ee8cc1Swenshuai.xi     {
2063*53ee8cc1Swenshuai.xi         eDecType = E_VPU_EX_DECODER_HVD;
2064*53ee8cc1Swenshuai.xi     }
2065*53ee8cc1Swenshuai.xi #ifdef VDEC3
2066*53ee8cc1Swenshuai.xi     else if (E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType)
2067*53ee8cc1Swenshuai.xi     {
2068*53ee8cc1Swenshuai.xi         eDecType = E_VPU_EX_DECODER_EVD;
2069*53ee8cc1Swenshuai.xi     }
2070*53ee8cc1Swenshuai.xi     #if SUPPORT_G2VP9
2071*53ee8cc1Swenshuai.xi     else if (E_VPU_EX_DECODER_G2VP9 == pTaskInfo->eDecType)
2072*53ee8cc1Swenshuai.xi     {
2073*53ee8cc1Swenshuai.xi         eDecType = E_VPU_EX_DECODER_G2VP9;
2074*53ee8cc1Swenshuai.xi     }
2075*53ee8cc1Swenshuai.xi     #endif
2076*53ee8cc1Swenshuai.xi #endif
2077*53ee8cc1Swenshuai.xi     else
2078*53ee8cc1Swenshuai.xi     {
2079*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Can't find eDecType! %d\n", pTaskInfo->eDecType);
2080*53ee8cc1Swenshuai.xi         _HAL_VPU_Release();
2081*53ee8cc1Swenshuai.xi         return FALSE;
2082*53ee8cc1Swenshuai.xi     }
2083*53ee8cc1Swenshuai.xi 
2084*53ee8cc1Swenshuai.xi #ifdef VDEC3
2085*53ee8cc1Swenshuai.xi     if ((bFWdecideFB == TRUE) && (pVPUHalContext->u8TaskCnt == 0))
2086*53ee8cc1Swenshuai.xi     {
2087*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetCmd(u32Id, E_DUAL_R2_CMD_FBADDR, pInitPara->pFBCfg->u32FrameBufAddr);
2088*53ee8cc1Swenshuai.xi         HAL_HVD_EX_SetCmd(u32Id, E_DUAL_R2_CMD_FBSIZE, pInitPara->pFBCfg->u32FrameBufSize);
2089*53ee8cc1Swenshuai.xi     }
2090*53ee8cc1Swenshuai.xi #endif
2091*53ee8cc1Swenshuai.xi 
2092*53ee8cc1Swenshuai.xi     if (pTaskInfo->eDecType != eDecType)
2093*53ee8cc1Swenshuai.xi     {
2094*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("warning pTaskInfo->eDecType=%x not %x\n",
2095*53ee8cc1Swenshuai.xi             pTaskInfo->eDecType, eDecType);
2096*53ee8cc1Swenshuai.xi     }
2097*53ee8cc1Swenshuai.xi     goto _SAVE_DEC_TYPE;
2098*53ee8cc1Swenshuai.xi 
2099*53ee8cc1Swenshuai.xi _SAVE_DEC_TYPE:
2100*53ee8cc1Swenshuai.xi     if (pVPUHalContext->_stVPUStream[u8Offset].eStreamId == (u32Id & 0xFF))
2101*53ee8cc1Swenshuai.xi     {
2102*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUStream[u8Offset].eDecodertype = eDecType;
2103*53ee8cc1Swenshuai.xi     }
2104*53ee8cc1Swenshuai.xi     else
2105*53ee8cc1Swenshuai.xi     {
2106*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Cannot save eDecType!!\n");
2107*53ee8cc1Swenshuai.xi     }
2108*53ee8cc1Swenshuai.xi 
2109*53ee8cc1Swenshuai.xi #if VPU_FIELD_DETECTOR
2110*53ee8cc1Swenshuai.xi     if(pVPUHalContext->s32VpuFdTaskId[0] == -1 && pVPUHalContext->s32VpuFdTaskId[1] == -1
2111*53ee8cc1Swenshuai.xi         && pVPUHalContext->s32VpuFdTaskId[2] == -1 && pVPUHalContext->s32VpuFdTaskId[3] == -1
2112*53ee8cc1Swenshuai.xi         && pVPUHalContext->s32VpuFdTaskId[4] == -1 && pVPUHalContext->s32VpuFdTaskId[5] == -1
2113*53ee8cc1Swenshuai.xi         && pVPUHalContext->s32VpuFdTaskId[6] == -1 && pVPUHalContext->s32VpuFdTaskId[7] == -1
2114*53ee8cc1Swenshuai.xi         && pVPUHalContext->s32VpuFdTaskId[8] == -1 && pVPUHalContext->s32VpuFdTaskId[9] == -1
2115*53ee8cc1Swenshuai.xi         && pVPUHalContext->s32VpuFdTaskId[10] == -1 && pVPUHalContext->s32VpuFdTaskId[11] == -1
2116*53ee8cc1Swenshuai.xi         && pVPUHalContext->s32VpuFdTaskId[12] == -1 && pVPUHalContext->s32VpuFdTaskId[13] == -1
2117*53ee8cc1Swenshuai.xi         && pVPUHalContext->s32VpuFdTaskId[14] == -1 && pVPUHalContext->s32VpuFdTaskId[15] == -1
2118*53ee8cc1Swenshuai.xi         )
2119*53ee8cc1Swenshuai.xi     {
2120*53ee8cc1Swenshuai.xi         MS_S32 s32VPUFDTaskId = -1;
2121*53ee8cc1Swenshuai.xi         if (E_VPU_EX_DECODER_MVD == pTaskInfo->eDecType)
2122*53ee8cc1Swenshuai.xi         {
2123*53ee8cc1Swenshuai.xi             s32VPUFDTaskId = MsOS_CreateTask((TaskEntry)_HAL_VPU_EX_Field_Detecor_Task_MVD,
2124*53ee8cc1Swenshuai.xi                                                 u32Id,
2125*53ee8cc1Swenshuai.xi                                                 E_TASK_PRI_MEDIUM,
2126*53ee8cc1Swenshuai.xi                                                 TRUE,
2127*53ee8cc1Swenshuai.xi                                                 NULL,
2128*53ee8cc1Swenshuai.xi                                                 32, // stack size..
2129*53ee8cc1Swenshuai.xi                                                 "VPU_FieldDetector_MVD_task");
2130*53ee8cc1Swenshuai.xi         }
2131*53ee8cc1Swenshuai.xi         else if(E_VPU_EX_DECODER_HVD == pTaskInfo->eDecType ||E_VPU_EX_DECODER_EVD == pTaskInfo->eDecType)
2132*53ee8cc1Swenshuai.xi         {
2133*53ee8cc1Swenshuai.xi             VPU_MSG_INFO(" Create _HAL_VPU_EX_Field_Detecor_Task_HVD()\n");
2134*53ee8cc1Swenshuai.xi             s32VPUFDTaskId = MsOS_CreateTask((TaskEntry)_HAL_VPU_EX_Field_Detecor_Task_HVD,
2135*53ee8cc1Swenshuai.xi                                                 u32Id,
2136*53ee8cc1Swenshuai.xi                                                 E_TASK_PRI_MEDIUM,
2137*53ee8cc1Swenshuai.xi                                                 TRUE,
2138*53ee8cc1Swenshuai.xi                                                 NULL,
2139*53ee8cc1Swenshuai.xi                                                 32, // stack size..
2140*53ee8cc1Swenshuai.xi                                                 "VPU_FieldDetector_HVD_task");
2141*53ee8cc1Swenshuai.xi         }
2142*53ee8cc1Swenshuai.xi         if (s32VPUFDTaskId < 0)
2143*53ee8cc1Swenshuai.xi         {
2144*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("Field Detector Task create failed\n");
2145*53ee8cc1Swenshuai.xi         }
2146*53ee8cc1Swenshuai.xi         else
2147*53ee8cc1Swenshuai.xi         {
2148*53ee8cc1Swenshuai.xi             pVPUHalContext->s32VpuFdTaskId[u8Offset]= s32VPUFDTaskId;
2149*53ee8cc1Swenshuai.xi         }
2150*53ee8cc1Swenshuai.xi 
2151*53ee8cc1Swenshuai.xi     }
2152*53ee8cc1Swenshuai.xi #endif
2153*53ee8cc1Swenshuai.xi 
2154*53ee8cc1Swenshuai.xi     (pVPUHalContext->u8TaskCnt)++;
2155*53ee8cc1Swenshuai.xi     _HAL_VPU_Release();
2156*53ee8cc1Swenshuai.xi     return TRUE;
2157*53ee8cc1Swenshuai.xi }
2158*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_TaskDelete(MS_U32 u32Id,VPU_EX_NDecInitPara * pInitPara)2159*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_TaskDelete(MS_U32 u32Id, VPU_EX_NDecInitPara *pInitPara)
2160*53ee8cc1Swenshuai.xi {
2161*53ee8cc1Swenshuai.xi     HVD_Return eRet;
2162*53ee8cc1Swenshuai.xi #ifdef VDEC3
2163*53ee8cc1Swenshuai.xi     HVD_User_Cmd eCmd = E_NST_CMD_DEL_TASK;
2164*53ee8cc1Swenshuai.xi #else
2165*53ee8cc1Swenshuai.xi     HVD_User_Cmd eCmd = E_DUAL_CMD_DEL_TASK;
2166*53ee8cc1Swenshuai.xi #endif
2167*53ee8cc1Swenshuai.xi     MS_U8 u8OffsetIdx = _VPU_EX_GetOffsetIdx(u32Id);
2168*53ee8cc1Swenshuai.xi     MS_U32 u32Timeout       = HVD_GetSysTime_ms() + 3000;
2169*53ee8cc1Swenshuai.xi 
2170*53ee8cc1Swenshuai.xi     _HAL_VPU_Entry();
2171*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("DecType=%d\n", pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype);
2172*53ee8cc1Swenshuai.xi 
2173*53ee8cc1Swenshuai.xi     eRet = HAL_HVD_EX_SetCmd(u32Id, eCmd, u8OffsetIdx);
2174*53ee8cc1Swenshuai.xi     if(eRet != E_HVD_RETURN_SUCCESS)
2175*53ee8cc1Swenshuai.xi     {
2176*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("VPU fail to DEL Task %d\n", eRet);
2177*53ee8cc1Swenshuai.xi     }
2178*53ee8cc1Swenshuai.xi 
2179*53ee8cc1Swenshuai.xi     {
2180*53ee8cc1Swenshuai.xi         struct _ctl_info *ctl_ptr = (struct _ctl_info *)
2181*53ee8cc1Swenshuai.xi             MsOS_PA2KSEG1(MsOS_VA2PA(pInitPara->pFWCodeCfg->u32DstAddr) + CTL_INFO_ADDR);
2182*53ee8cc1Swenshuai.xi         u32Timeout = HVD_GetSysTime_ms() + VPU_CMD_TIMEOUT;
2183*53ee8cc1Swenshuai.xi 
2184*53ee8cc1Swenshuai.xi         MsOS_ReadMemory();
2185*53ee8cc1Swenshuai.xi 
2186*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",
2187*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]);
2188*53ee8cc1Swenshuai.xi 
2189*53ee8cc1Swenshuai.xi         while (CTL_TASK_NONE != ctl_ptr->task_statue[u8OffsetIdx])
2190*53ee8cc1Swenshuai.xi         {
2191*53ee8cc1Swenshuai.xi             if (HVD_GetSysTime_ms() > u32Timeout)
2192*53ee8cc1Swenshuai.xi             {
2193*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("Task %u deletion timeout\n", u8OffsetIdx);
2194*53ee8cc1Swenshuai.xi                 pVPUHalContext->bVpuExLoadFWRlt = FALSE; ///error handling
2195*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("Set bVpuExLoadFWRlt as FALSE\n");
2196*53ee8cc1Swenshuai.xi 
2197*53ee8cc1Swenshuai.xi                 if(pVPUHalContext->u8TaskCnt == 1)
2198*53ee8cc1Swenshuai.xi                 {
2199*53ee8cc1Swenshuai.xi                     VPU_MSG_ERR("Due to one task remain, driver can force delete task\n");
2200*53ee8cc1Swenshuai.xi                     break;
2201*53ee8cc1Swenshuai.xi                 }
2202*53ee8cc1Swenshuai.xi                 else if(pVPUHalContext->u8TaskCnt == 2)
2203*53ee8cc1Swenshuai.xi                 {
2204*53ee8cc1Swenshuai.xi                     VPU_MSG_ERR("Due to two tasks remain, driver can't force delete task\n");
2205*53ee8cc1Swenshuai.xi                     break;
2206*53ee8cc1Swenshuai.xi                 }
2207*53ee8cc1Swenshuai.xi                 else
2208*53ee8cc1Swenshuai.xi                 {
2209*53ee8cc1Swenshuai.xi                     VPU_MSG_ERR("Task number is not correct\n");
2210*53ee8cc1Swenshuai.xi                     _HAL_VPU_Release();
2211*53ee8cc1Swenshuai.xi                     return FALSE;
2212*53ee8cc1Swenshuai.xi                 }
2213*53ee8cc1Swenshuai.xi             }
2214*53ee8cc1Swenshuai.xi 
2215*53ee8cc1Swenshuai.xi             MsOS_ReadMemory();
2216*53ee8cc1Swenshuai.xi         }
2217*53ee8cc1Swenshuai.xi 
2218*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",
2219*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]);
2220*53ee8cc1Swenshuai.xi     }
2221*53ee8cc1Swenshuai.xi     #if SUPPORT_EVD
2222*53ee8cc1Swenshuai.xi     if (pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype == E_VPU_EX_DECODER_EVD)
2223*53ee8cc1Swenshuai.xi     {
2224*53ee8cc1Swenshuai.xi         HAL_EVD_EX_ClearTSPInput(u32Id);
2225*53ee8cc1Swenshuai.xi     }
2226*53ee8cc1Swenshuai.xi     #endif
2227*53ee8cc1Swenshuai.xi 
2228*53ee8cc1Swenshuai.xi     pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype = E_VPU_EX_DECODER_NONE;
2229*53ee8cc1Swenshuai.xi     if( (u8OffsetIdx == 0) && (pVPUHalContext->_stVPUStream[u8OffsetIdx].eStreamId == E_HAL_VPU_MVC_MAIN_VIEW))
2230*53ee8cc1Swenshuai.xi     {
2231*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUStream[u8OffsetIdx].eStreamId = E_HAL_VPU_N_STREAM0;
2232*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUStream[0].eDecodertype = E_VPU_EX_DECODER_NONE;
2233*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUStream[1].eDecodertype = E_VPU_EX_DECODER_NONE;
2234*53ee8cc1Swenshuai.xi     }
2235*53ee8cc1Swenshuai.xi 
2236*53ee8cc1Swenshuai.xi #if VPU_FIELD_DETECTOR
2237*53ee8cc1Swenshuai.xi     _HAL_VPU_EX_FdTask_Delete(u32Id, pVPUHalContext);
2238*53ee8cc1Swenshuai.xi #endif
2239*53ee8cc1Swenshuai.xi 
2240*53ee8cc1Swenshuai.xi     if (pVPUHalContext->u8TaskCnt)
2241*53ee8cc1Swenshuai.xi     {
2242*53ee8cc1Swenshuai.xi         (pVPUHalContext->u8TaskCnt)--;
2243*53ee8cc1Swenshuai.xi     }
2244*53ee8cc1Swenshuai.xi     else
2245*53ee8cc1Swenshuai.xi     {
2246*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("Warning: u8TaskCnt=0\n");
2247*53ee8cc1Swenshuai.xi     }
2248*53ee8cc1Swenshuai.xi 
2249*53ee8cc1Swenshuai.xi     if (0 == pVPUHalContext->u8TaskCnt)
2250*53ee8cc1Swenshuai.xi     {
2251*53ee8cc1Swenshuai.xi         int i;
2252*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("u8TaskCnt=%d time to terminate\n", pVPUHalContext->u8TaskCnt);
2253*53ee8cc1Swenshuai.xi         _VPU_EX_DeinitAll(pInitPara);
2254*53ee8cc1Swenshuai.xi         HAL_VPU_EX_SetSingleDecodeMode(FALSE);
2255*53ee8cc1Swenshuai.xi         pVPUHalContext->u32VPUSHMAddr = 0;
2256*53ee8cc1Swenshuai.xi 
2257*53ee8cc1Swenshuai.xi         for (i = 0; i < MAX_SUPPORT_DECODER_NUM; i++)
2258*53ee8cc1Swenshuai.xi             pVPUHalContext->u32FWShareInfoAddr[i] = 0xFFFFFFFFUL;
2259*53ee8cc1Swenshuai.xi     }
2260*53ee8cc1Swenshuai.xi     else
2261*53ee8cc1Swenshuai.xi     {
2262*53ee8cc1Swenshuai.xi         pVPUHalContext->u32FWShareInfoAddr[u8OffsetIdx] = 0xFFFFFFFFUL;
2263*53ee8cc1Swenshuai.xi         _VPU_EX_DeinitHW(pInitPara->pTaskInfo);
2264*53ee8cc1Swenshuai.xi     }
2265*53ee8cc1Swenshuai.xi 
2266*53ee8cc1Swenshuai.xi     _HAL_VPU_Release();
2267*53ee8cc1Swenshuai.xi     return TRUE;
2268*53ee8cc1Swenshuai.xi }
2269*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_LoadCode(VPU_EX_FWCodeCfg * pFWCodeCfg)2270*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_LoadCode(VPU_EX_FWCodeCfg *pFWCodeCfg)
2271*53ee8cc1Swenshuai.xi {
2272*53ee8cc1Swenshuai.xi     MS_VIRT u32DestAddr  = pFWCodeCfg->u32DstAddr;
2273*53ee8cc1Swenshuai.xi     MS_VIRT u32BinAddr   = pFWCodeCfg->u32BinAddr;
2274*53ee8cc1Swenshuai.xi     MS_U32 u32Size      = pFWCodeCfg->u32BinSize;
2275*53ee8cc1Swenshuai.xi #if (ENABLE_DECOMPRESS_FUNCTION==TRUE)
2276*53ee8cc1Swenshuai.xi     MS_U32 u32DestSize  = pFWCodeCfg->u32DstSize;
2277*53ee8cc1Swenshuai.xi #endif
2278*53ee8cc1Swenshuai.xi 
2279*53ee8cc1Swenshuai.xi     if (FALSE == HAL_VPU_EX_GetFWReload())
2280*53ee8cc1Swenshuai.xi     {
2281*53ee8cc1Swenshuai.xi         //printf("%s bFWReload FALSE!!!\n", __FUNCTION__);
2282*53ee8cc1Swenshuai.xi         if (FALSE == pVPUHalContext->bVpuExLoadFWRlt)
2283*53ee8cc1Swenshuai.xi         {
2284*53ee8cc1Swenshuai.xi             VPU_MSG_INFO("Never load fw successfully, load it anyway!\n");
2285*53ee8cc1Swenshuai.xi         }
2286*53ee8cc1Swenshuai.xi         else
2287*53ee8cc1Swenshuai.xi         {
2288*53ee8cc1Swenshuai.xi             //Check f/w prefix "VDEC30"
2289*53ee8cc1Swenshuai.xi             if (_VPU_EX_IsNeedDecompress(u32DestAddr)!=FALSE)
2290*53ee8cc1Swenshuai.xi             {
2291*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("Wrong prefix: reload fw!\n");
2292*53ee8cc1Swenshuai.xi             }
2293*53ee8cc1Swenshuai.xi             else
2294*53ee8cc1Swenshuai.xi             {
2295*53ee8cc1Swenshuai.xi                 VPU_MSG_INFO("Skip loading fw this time!!!\n");
2296*53ee8cc1Swenshuai.xi                 return TRUE;
2297*53ee8cc1Swenshuai.xi             }
2298*53ee8cc1Swenshuai.xi         }
2299*53ee8cc1Swenshuai.xi     }
2300*53ee8cc1Swenshuai.xi 
2301*53ee8cc1Swenshuai.xi     if (E_HVD_FW_INPUT_SOURCE_FLASH == pFWCodeCfg->u8SrcType)
2302*53ee8cc1Swenshuai.xi     {
2303*53ee8cc1Swenshuai.xi #if VPU_ENABLE_BDMA_FW_FLASH_2_SDRAM
2304*53ee8cc1Swenshuai.xi         if (u32Size != 0)
2305*53ee8cc1Swenshuai.xi         {
2306*53ee8cc1Swenshuai.xi             SPIDMA_Dev cpyflag = E_SPIDMA_DEV_MIU1;
2307*53ee8cc1Swenshuai.xi 
2308*53ee8cc1Swenshuai.xi 
2309*53ee8cc1Swenshuai.xi             MS_U32 u32Start;
2310*53ee8cc1Swenshuai.xi             MS_U32 u32StartOffset;
2311*53ee8cc1Swenshuai.xi             MS_U8  u8MiuSel;
2312*53ee8cc1Swenshuai.xi 
2313*53ee8cc1Swenshuai.xi             _phy_to_miu_offset(u8MiuSel, u32StartOffset, u32DestAddr);
2314*53ee8cc1Swenshuai.xi 
2315*53ee8cc1Swenshuai.xi 
2316*53ee8cc1Swenshuai.xi             if(u8MiuSel == E_CHIP_MIU_0)
2317*53ee8cc1Swenshuai.xi                 cpyflag = E_SPIDMA_DEV_MIU0;
2318*53ee8cc1Swenshuai.xi             else if(u8MiuSel == E_CHIP_MIU_1)
2319*53ee8cc1Swenshuai.xi                 cpyflag = E_SPIDMA_DEV_MIU1;
2320*53ee8cc1Swenshuai.xi             else if(u8MiuSel == E_CHIP_MIU_2)
2321*53ee8cc1Swenshuai.xi                 ; ///TODO:  cpyflag = E_SPIDMA_DEV_MIU2;
2322*53ee8cc1Swenshuai.xi 
2323*53ee8cc1Swenshuai.xi             if (!HVD_FLASHcpy(MsOS_VA2PA(u32DestAddr), MsOS_VA2PA(u32BinAddr), u32Size, cpyflag))
2324*53ee8cc1Swenshuai.xi             {
2325*53ee8cc1Swenshuai.xi                 goto _load_code_fail;
2326*53ee8cc1Swenshuai.xi             }
2327*53ee8cc1Swenshuai.xi         }
2328*53ee8cc1Swenshuai.xi         else
2329*53ee8cc1Swenshuai.xi         {
2330*53ee8cc1Swenshuai.xi             goto _load_code_fail;
2331*53ee8cc1Swenshuai.xi         }
2332*53ee8cc1Swenshuai.xi #else
2333*53ee8cc1Swenshuai.xi         goto _load_code_fail;
2334*53ee8cc1Swenshuai.xi #endif
2335*53ee8cc1Swenshuai.xi     }
2336*53ee8cc1Swenshuai.xi     else if (E_HVD_FW_INPUT_SOURCE_DRAM == pFWCodeCfg->u8SrcType)
2337*53ee8cc1Swenshuai.xi     {
2338*53ee8cc1Swenshuai.xi         if (u32BinAddr != 0 && u32Size != 0)
2339*53ee8cc1Swenshuai.xi         {
2340*53ee8cc1Swenshuai.xi #if (ENABLE_DECOMPRESS_FUNCTION==TRUE)
2341*53ee8cc1Swenshuai.xi             if(_VPU_EX_DecompressBin(u32BinAddr, u32Size, u32DestAddr, u32DestAddr+u32DestSize-WINDOW_SIZE)==TRUE)
2342*53ee8cc1Swenshuai.xi             {
2343*53ee8cc1Swenshuai.xi                 if(_VPU_EX_IsNeedDecompress(u32DestAddr)==FALSE)
2344*53ee8cc1Swenshuai.xi                 {
2345*53ee8cc1Swenshuai.xi                     VPU_MSG_INFO("Decompress ok!!!\n");
2346*53ee8cc1Swenshuai.xi                 }
2347*53ee8cc1Swenshuai.xi                 else
2348*53ee8cc1Swenshuai.xi                 {
2349*53ee8cc1Swenshuai.xi                     VPU_MSG_INFO("Decompress fail!!!\n");
2350*53ee8cc1Swenshuai.xi                 }
2351*53ee8cc1Swenshuai.xi             }
2352*53ee8cc1Swenshuai.xi             else
2353*53ee8cc1Swenshuai.xi #endif
2354*53ee8cc1Swenshuai.xi             {
2355*53ee8cc1Swenshuai.xi                 HVD_memcpy(u32DestAddr, u32BinAddr, u32Size);
2356*53ee8cc1Swenshuai.xi             }
2357*53ee8cc1Swenshuai.xi         }
2358*53ee8cc1Swenshuai.xi         else
2359*53ee8cc1Swenshuai.xi         {
2360*53ee8cc1Swenshuai.xi             goto _load_code_fail;
2361*53ee8cc1Swenshuai.xi         }
2362*53ee8cc1Swenshuai.xi     }
2363*53ee8cc1Swenshuai.xi     else
2364*53ee8cc1Swenshuai.xi     {
2365*53ee8cc1Swenshuai.xi #if VPU_ENABLE_EMBEDDED_FW_BINARY
2366*53ee8cc1Swenshuai.xi         VPU_MSG_INFO("Load FW inD2D: dest=0x%lx, source=0x%lx, size=%d\n",
2367*53ee8cc1Swenshuai.xi                     (unsigned long)u32DestAddr, ((unsigned long) u8HVD_FW_Binary),
2368*53ee8cc1Swenshuai.xi                     (MS_U32) sizeof(u8HVD_FW_Binary));
2369*53ee8cc1Swenshuai.xi 
2370*53ee8cc1Swenshuai.xi #if (ENABLE_DECOMPRESS_FUNCTION==TRUE)
2371*53ee8cc1Swenshuai.xi         if(_VPU_EX_DecompressBin((MS_VIRT)u8HVD_FW_Binary, (MS_U32)sizeof(u8HVD_FW_Binary), u32DestAddr, u32DestAddr+u32DestSize-WINDOW_SIZE)==TRUE)
2372*53ee8cc1Swenshuai.xi         {
2373*53ee8cc1Swenshuai.xi             if(_VPU_EX_IsNeedDecompress(u32DestAddr)==FALSE)
2374*53ee8cc1Swenshuai.xi             {
2375*53ee8cc1Swenshuai.xi                 VPU_MSG_INFO("Decompress ok!!!\n");
2376*53ee8cc1Swenshuai.xi             }
2377*53ee8cc1Swenshuai.xi             else
2378*53ee8cc1Swenshuai.xi             {
2379*53ee8cc1Swenshuai.xi                 VPU_MSG_INFO("Decompress fail!!!\n");
2380*53ee8cc1Swenshuai.xi             }
2381*53ee8cc1Swenshuai.xi         }
2382*53ee8cc1Swenshuai.xi         else
2383*53ee8cc1Swenshuai.xi #endif
2384*53ee8cc1Swenshuai.xi         {
2385*53ee8cc1Swenshuai.xi             HVD_memcpy(u32DestAddr, (MS_VIRT)u8HVD_FW_Binary, sizeof(u8HVD_FW_Binary));
2386*53ee8cc1Swenshuai.xi         }
2387*53ee8cc1Swenshuai.xi #else
2388*53ee8cc1Swenshuai.xi         goto _load_code_fail;
2389*53ee8cc1Swenshuai.xi #endif
2390*53ee8cc1Swenshuai.xi     }
2391*53ee8cc1Swenshuai.xi 
2392*53ee8cc1Swenshuai.xi     MAsm_CPU_Sync();
2393*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
2394*53ee8cc1Swenshuai.xi 
2395*53ee8cc1Swenshuai.xi     if (FALSE == (*((MS_U8*)(u32DestAddr+6))=='R' && *((MS_U8*)(u32DestAddr+7))=='2'))
2396*53ee8cc1Swenshuai.xi     {
2397*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("FW is not R2 version! _%x_ _%x_\n", *(MS_U8*)(u32DestAddr+6), *(MS_U8*)(u32DestAddr+7));
2398*53ee8cc1Swenshuai.xi         goto _load_code_fail;
2399*53ee8cc1Swenshuai.xi     }
2400*53ee8cc1Swenshuai.xi 
2401*53ee8cc1Swenshuai.xi     pVPUHalContext->bVpuExLoadFWRlt = TRUE;
2402*53ee8cc1Swenshuai.xi     return TRUE;
2403*53ee8cc1Swenshuai.xi 
2404*53ee8cc1Swenshuai.xi _load_code_fail:
2405*53ee8cc1Swenshuai.xi     pVPUHalContext->bVpuExLoadFWRlt = FALSE;
2406*53ee8cc1Swenshuai.xi     return FALSE;
2407*53ee8cc1Swenshuai.xi }
2408*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_InitRegBase(MS_VIRT u32RegBase)2409*53ee8cc1Swenshuai.xi void HAL_VPU_EX_InitRegBase(MS_VIRT u32RegBase)
2410*53ee8cc1Swenshuai.xi {
2411*53ee8cc1Swenshuai.xi     u32VPURegOSBase = u32RegBase;
2412*53ee8cc1Swenshuai.xi }
2413*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_Init_Share_Mem(void)2414*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_Init_Share_Mem(void)
2415*53ee8cc1Swenshuai.xi {
2416*53ee8cc1Swenshuai.xi #if ((defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_ECOS)) && (!defined(SUPPORT_X_MODEL_FEATURE)))
2417*53ee8cc1Swenshuai.xi 
2418*53ee8cc1Swenshuai.xi     MS_U32 u32ShmId;
2419*53ee8cc1Swenshuai.xi     MS_VIRT u32Addr;
2420*53ee8cc1Swenshuai.xi     MS_U32 u32BufSize;
2421*53ee8cc1Swenshuai.xi 
2422*53ee8cc1Swenshuai.xi 
2423*53ee8cc1Swenshuai.xi     if (FALSE == MsOS_SHM_GetId( (MS_U8*)"Linux HAL VPU",
2424*53ee8cc1Swenshuai.xi                                           sizeof(VPU_Hal_CTX),
2425*53ee8cc1Swenshuai.xi                                           &u32ShmId,
2426*53ee8cc1Swenshuai.xi                                           &u32Addr,
2427*53ee8cc1Swenshuai.xi                                           &u32BufSize,
2428*53ee8cc1Swenshuai.xi                                           MSOS_SHM_QUERY))
2429*53ee8cc1Swenshuai.xi     {
2430*53ee8cc1Swenshuai.xi         if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux HAL VPU",
2431*53ee8cc1Swenshuai.xi                                              sizeof(VPU_Hal_CTX),
2432*53ee8cc1Swenshuai.xi                                              &u32ShmId,
2433*53ee8cc1Swenshuai.xi                                              &u32Addr,
2434*53ee8cc1Swenshuai.xi                                              &u32BufSize,
2435*53ee8cc1Swenshuai.xi                                              MSOS_SHM_CREATE))
2436*53ee8cc1Swenshuai.xi         {
2437*53ee8cc1Swenshuai.xi             VPU_MSG_ERR("[%s]SHM allocation failed!!!use global structure instead!!!\n",__FUNCTION__);
2438*53ee8cc1Swenshuai.xi             if(pVPUHalContext == NULL)
2439*53ee8cc1Swenshuai.xi             {
2440*53ee8cc1Swenshuai.xi                 pVPUHalContext = &gVPUHalContext;
2441*53ee8cc1Swenshuai.xi                 memset(pVPUHalContext,0,sizeof(VPU_Hal_CTX));
2442*53ee8cc1Swenshuai.xi                 _VPU_EX_Context_Init();
2443*53ee8cc1Swenshuai.xi                 printf("[%s]Global structure init Success!!!\n",__FUNCTION__);
2444*53ee8cc1Swenshuai.xi             }
2445*53ee8cc1Swenshuai.xi             else
2446*53ee8cc1Swenshuai.xi             {
2447*53ee8cc1Swenshuai.xi                 printf("[%s]Global structure exists!!!\n",__FUNCTION__);
2448*53ee8cc1Swenshuai.xi             }
2449*53ee8cc1Swenshuai.xi             //return FALSE;
2450*53ee8cc1Swenshuai.xi         }
2451*53ee8cc1Swenshuai.xi         else
2452*53ee8cc1Swenshuai.xi         {
2453*53ee8cc1Swenshuai.xi             memset((MS_U8*)u32Addr,0,sizeof(VPU_Hal_CTX));
2454*53ee8cc1Swenshuai.xi             pVPUHalContext = (VPU_Hal_CTX*)u32Addr; // for one process
2455*53ee8cc1Swenshuai.xi             _VPU_EX_Context_Init();
2456*53ee8cc1Swenshuai.xi         }
2457*53ee8cc1Swenshuai.xi     }
2458*53ee8cc1Swenshuai.xi     else
2459*53ee8cc1Swenshuai.xi     {
2460*53ee8cc1Swenshuai.xi         pVPUHalContext = (VPU_Hal_CTX*)u32Addr; // for another process
2461*53ee8cc1Swenshuai.xi     }
2462*53ee8cc1Swenshuai.xi #else
2463*53ee8cc1Swenshuai.xi     if(pVPUHalContext == NULL)
2464*53ee8cc1Swenshuai.xi     {
2465*53ee8cc1Swenshuai.xi         pVPUHalContext = &gVPUHalContext;
2466*53ee8cc1Swenshuai.xi         memset(pVPUHalContext,0,sizeof(VPU_Hal_CTX));
2467*53ee8cc1Swenshuai.xi         _VPU_EX_Context_Init();
2468*53ee8cc1Swenshuai.xi     }
2469*53ee8cc1Swenshuai.xi #endif
2470*53ee8cc1Swenshuai.xi 
2471*53ee8cc1Swenshuai.xi     return TRUE;
2472*53ee8cc1Swenshuai.xi 
2473*53ee8cc1Swenshuai.xi }
2474*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetFreeStream(HAL_VPU_StreamType eStreamType)2475*53ee8cc1Swenshuai.xi HAL_VPU_StreamId HAL_VPU_EX_GetFreeStream(HAL_VPU_StreamType eStreamType)
2476*53ee8cc1Swenshuai.xi {
2477*53ee8cc1Swenshuai.xi     MS_U32 i = 0;
2478*53ee8cc1Swenshuai.xi 
2479*53ee8cc1Swenshuai.xi     _HAL_VPU_MutexCreate();
2480*53ee8cc1Swenshuai.xi 
2481*53ee8cc1Swenshuai.xi     _HAL_VPU_Entry();
2482*53ee8cc1Swenshuai.xi 
2483*53ee8cc1Swenshuai.xi     if (E_HAL_VPU_MVC_STREAM == eStreamType)
2484*53ee8cc1Swenshuai.xi     {
2485*53ee8cc1Swenshuai.xi         if((E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[0].eDecodertype) && (E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[1].eDecodertype))
2486*53ee8cc1Swenshuai.xi         {
2487*53ee8cc1Swenshuai.xi             pVPUHalContext->_stVPUStream[0].eStreamId = E_HAL_VPU_MVC_MAIN_VIEW;
2488*53ee8cc1Swenshuai.xi             pVPUHalContext->_stVPUStream[0].eDecodertype = E_VPU_EX_DECODER_GET_MVC;
2489*53ee8cc1Swenshuai.xi             pVPUHalContext->_stVPUStream[1].eDecodertype = E_VPU_EX_DECODER_GET_MVC;
2490*53ee8cc1Swenshuai.xi             _HAL_VPU_Release();
2491*53ee8cc1Swenshuai.xi             return pVPUHalContext->_stVPUStream[0].eStreamId;       /// Need to check
2492*53ee8cc1Swenshuai.xi         }
2493*53ee8cc1Swenshuai.xi     }
2494*53ee8cc1Swenshuai.xi     else if (E_HAL_VPU_MAIN_STREAM == eStreamType)
2495*53ee8cc1Swenshuai.xi     {
2496*53ee8cc1Swenshuai.xi         for (i = 0;i < MAX_SUPPORT_DECODER_NUM; i++)
2497*53ee8cc1Swenshuai.xi         {
2498*53ee8cc1Swenshuai.xi             if ((E_HAL_VPU_MAIN_STREAM_BASE & pVPUHalContext->_stVPUStream[i].eStreamId)
2499*53ee8cc1Swenshuai.xi                 && (E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[i].eDecodertype))
2500*53ee8cc1Swenshuai.xi             {
2501*53ee8cc1Swenshuai.xi                 pVPUHalContext->_stVPUStream[i].eDecodertype = E_VPU_EX_DECODER_GET;
2502*53ee8cc1Swenshuai.xi                 _HAL_VPU_Release();
2503*53ee8cc1Swenshuai.xi                 return pVPUHalContext->_stVPUStream[i].eStreamId;
2504*53ee8cc1Swenshuai.xi             }
2505*53ee8cc1Swenshuai.xi         }
2506*53ee8cc1Swenshuai.xi     }
2507*53ee8cc1Swenshuai.xi     else if (E_HAL_VPU_SUB_STREAM == eStreamType)
2508*53ee8cc1Swenshuai.xi     {
2509*53ee8cc1Swenshuai.xi         for (i = 0;i < MAX_SUPPORT_DECODER_NUM; i++)
2510*53ee8cc1Swenshuai.xi         {
2511*53ee8cc1Swenshuai.xi             if ((E_HAL_VPU_SUB_STREAM_BASE & pVPUHalContext->_stVPUStream[i].eStreamId)
2512*53ee8cc1Swenshuai.xi                 && (E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[i].eDecodertype))
2513*53ee8cc1Swenshuai.xi             {
2514*53ee8cc1Swenshuai.xi                 pVPUHalContext->_stVPUStream[i].eDecodertype = E_VPU_EX_DECODER_GET;
2515*53ee8cc1Swenshuai.xi                 _HAL_VPU_Release();
2516*53ee8cc1Swenshuai.xi                 return pVPUHalContext->_stVPUStream[i].eStreamId;
2517*53ee8cc1Swenshuai.xi             }
2518*53ee8cc1Swenshuai.xi         }
2519*53ee8cc1Swenshuai.xi     }
2520*53ee8cc1Swenshuai.xi #ifdef VDEC3
2521*53ee8cc1Swenshuai.xi     else if (eStreamType >= E_HAL_VPU_N_STREAM && eStreamType < (E_HAL_VPU_N_STREAM + VPU_MAX_DEC_NUM))
2522*53ee8cc1Swenshuai.xi     {
2523*53ee8cc1Swenshuai.xi #if 1 // bound FW task to main/sub stream
2524*53ee8cc1Swenshuai.xi         i = eStreamType - E_HAL_VPU_N_STREAM;
2525*53ee8cc1Swenshuai.xi         if (pVPUHalContext->_stVPUStream[i].eDecodertype == E_VPU_EX_DECODER_NONE)
2526*53ee8cc1Swenshuai.xi         {
2527*53ee8cc1Swenshuai.xi             pVPUHalContext->_stVPUStream[i].eDecodertype = E_VPU_EX_DECODER_GET;
2528*53ee8cc1Swenshuai.xi             _HAL_VPU_Release();
2529*53ee8cc1Swenshuai.xi             return pVPUHalContext->_stVPUStream[i].eStreamId;
2530*53ee8cc1Swenshuai.xi         }
2531*53ee8cc1Swenshuai.xi #else // dynamic select FW task id
2532*53ee8cc1Swenshuai.xi         for (i = 0;i < MAX_SUPPORT_DECODER_NUM; i++)
2533*53ee8cc1Swenshuai.xi         {
2534*53ee8cc1Swenshuai.xi             if ((E_HAL_VPU_N_STREAM_BASE & pVPUHalContext->_stVPUStream[i].eStreamId)
2535*53ee8cc1Swenshuai.xi                 && (E_VPU_EX_DECODER_NONE == pVPUHalContext->_stVPUStream[i].eDecodertype))
2536*53ee8cc1Swenshuai.xi             {
2537*53ee8cc1Swenshuai.xi                 return pVPUHalContext->_stVPUStream[i].eStreamId;
2538*53ee8cc1Swenshuai.xi             }
2539*53ee8cc1Swenshuai.xi         }
2540*53ee8cc1Swenshuai.xi #endif
2541*53ee8cc1Swenshuai.xi     }
2542*53ee8cc1Swenshuai.xi #endif
2543*53ee8cc1Swenshuai.xi 
2544*53ee8cc1Swenshuai.xi     _HAL_VPU_Release();
2545*53ee8cc1Swenshuai.xi 
2546*53ee8cc1Swenshuai.xi     return E_HAL_VPU_STREAM_NONE;
2547*53ee8cc1Swenshuai.xi }
2548*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_ReleaseFreeStream(MS_U8 u8Idx)2549*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_ReleaseFreeStream(MS_U8 u8Idx)
2550*53ee8cc1Swenshuai.xi {
2551*53ee8cc1Swenshuai.xi     _HAL_VPU_Entry();
2552*53ee8cc1Swenshuai.xi 
2553*53ee8cc1Swenshuai.xi     if(pVPUHalContext->_stVPUStream[u8Idx].eDecodertype == E_VPU_EX_DECODER_GET_MVC)
2554*53ee8cc1Swenshuai.xi     {
2555*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUStream[0].eDecodertype = E_VPU_EX_DECODER_NONE;
2556*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUStream[1].eDecodertype = E_VPU_EX_DECODER_NONE;
2557*53ee8cc1Swenshuai.xi     }
2558*53ee8cc1Swenshuai.xi     else if(pVPUHalContext->_stVPUStream[u8Idx].eDecodertype == E_VPU_EX_DECODER_GET)
2559*53ee8cc1Swenshuai.xi     {
2560*53ee8cc1Swenshuai.xi         pVPUHalContext->_stVPUStream[u8Idx].eDecodertype = E_VPU_EX_DECODER_NONE;
2561*53ee8cc1Swenshuai.xi     }
2562*53ee8cc1Swenshuai.xi 
2563*53ee8cc1Swenshuai.xi     _HAL_VPU_Release();
2564*53ee8cc1Swenshuai.xi 
2565*53ee8cc1Swenshuai.xi     return TRUE;
2566*53ee8cc1Swenshuai.xi }
2567*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_CheckFreeStream(VPU_EX_Original_Stream eStream)2568*53ee8cc1Swenshuai.xi MS_U8 HAL_VPU_EX_CheckFreeStream(VPU_EX_Original_Stream eStream)
2569*53ee8cc1Swenshuai.xi {
2570*53ee8cc1Swenshuai.xi     MS_U8 u8Idx = 0;
2571*53ee8cc1Swenshuai.xi 
2572*53ee8cc1Swenshuai.xi     //VPRINTF("[NDec][%s][%d] eStream = %d\n", __FUNCTION__, __LINE__, eStream);
2573*53ee8cc1Swenshuai.xi 
2574*53ee8cc1Swenshuai.xi     if(eStream == E_VPU_ORIGINAL_MAIN_STREAM)
2575*53ee8cc1Swenshuai.xi     {
2576*53ee8cc1Swenshuai.xi         if(pVPUHalContext->_stVPUStream[0].eDecodertype == E_VPU_EX_DECODER_NONE)
2577*53ee8cc1Swenshuai.xi         {
2578*53ee8cc1Swenshuai.xi             //VPRINTF("[NDec][%s][%d] main stream using u8Idx = 0\n", __FUNCTION__, __LINE__);
2579*53ee8cc1Swenshuai.xi             return 0;
2580*53ee8cc1Swenshuai.xi         }
2581*53ee8cc1Swenshuai.xi     }
2582*53ee8cc1Swenshuai.xi     else if(eStream == E_VPU_ORIGINAL_SUB_STREAM)
2583*53ee8cc1Swenshuai.xi     {
2584*53ee8cc1Swenshuai.xi         if(pVPUHalContext->_stVPUStream[1].eDecodertype == E_VPU_EX_DECODER_NONE)
2585*53ee8cc1Swenshuai.xi         {
2586*53ee8cc1Swenshuai.xi             //VPRINTF("[NDec][%s][%d] sub stream using u8Idx = 1\n", __FUNCTION__, __LINE__);
2587*53ee8cc1Swenshuai.xi             return 1;
2588*53ee8cc1Swenshuai.xi         }
2589*53ee8cc1Swenshuai.xi     }
2590*53ee8cc1Swenshuai.xi 
2591*53ee8cc1Swenshuai.xi     for (u8Idx = 0; u8Idx < MAX_SUPPORT_DECODER_NUM; u8Idx++)
2592*53ee8cc1Swenshuai.xi     {
2593*53ee8cc1Swenshuai.xi         if (pVPUHalContext->_stVPUStream[u8Idx].eDecodertype == E_VPU_EX_DECODER_NONE)
2594*53ee8cc1Swenshuai.xi             break;
2595*53ee8cc1Swenshuai.xi     }
2596*53ee8cc1Swenshuai.xi 
2597*53ee8cc1Swenshuai.xi     if (u8Idx >= MAX_SUPPORT_DECODER_NUM)
2598*53ee8cc1Swenshuai.xi     {
2599*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("all vpu free streams are occupied \n");
2600*53ee8cc1Swenshuai.xi         return 0xFF;
2601*53ee8cc1Swenshuai.xi     }
2602*53ee8cc1Swenshuai.xi 
2603*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("available vpu free stream %d \n", u8Idx);
2604*53ee8cc1Swenshuai.xi     return u8Idx;
2605*53ee8cc1Swenshuai.xi }
2606*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_Init(VPU_EX_InitParam * InitParams)2607*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_Init(VPU_EX_InitParam *InitParams)
2608*53ee8cc1Swenshuai.xi {
2609*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("Inv=%d, clk=%d\n", InitParams->bClockInv, InitParams->eClockSpeed);
2610*53ee8cc1Swenshuai.xi 
2611*53ee8cc1Swenshuai.xi     // enable module
2612*53ee8cc1Swenshuai.xi     _VPU_EX_ClockInv(InitParams->bClockInv);
2613*53ee8cc1Swenshuai.xi     _VPU_EX_ClockSpeed(InitParams->eClockSpeed);
2614*53ee8cc1Swenshuai.xi     HAL_VPU_EX_PowerCtrl(TRUE);
2615*53ee8cc1Swenshuai.xi 
2616*53ee8cc1Swenshuai.xi #ifdef CONFIG_MSTAR_CLKM
2617*53ee8cc1Swenshuai.xi     HAL_VPU_EX_SetClkManagement(E_VPU_EX_CLKPORT_VD_MHEG5, TRUE);
2618*53ee8cc1Swenshuai.xi #endif
2619*53ee8cc1Swenshuai.xi 
2620*53ee8cc1Swenshuai.xi #ifdef CONFIG_MSTAR_SRAMPD
2621*53ee8cc1Swenshuai.xi     _VPU_WriteWordMask(REG_CODEC_SRAM_SD_EN, CODEC_SRAM_HVD_R2, CODEC_SRAM_HVD_R2);
2622*53ee8cc1Swenshuai.xi     HVD_Delay_ms(1);
2623*53ee8cc1Swenshuai.xi     _VPU_WriteWordMask(REG_CODEC_SRAM_SD_EN, CODEC_SRAM_HVD_R2_MIU0_BWP, CODEC_SRAM_HVD_R2_MIU0_BWP);
2624*53ee8cc1Swenshuai.xi     HVD_Delay_ms(1);
2625*53ee8cc1Swenshuai.xi     _VPU_WriteWordMask(REG_CODEC_SRAM_SD_EN, CODEC_SRAM_HVD_R2_MIU1_BWP, CODEC_SRAM_HVD_R2_MIU1_BWP);
2626*53ee8cc1Swenshuai.xi     HVD_Delay_ms(1);
2627*53ee8cc1Swenshuai.xi #endif
2628*53ee8cc1Swenshuai.xi #if 1                           //Create VPU's own mutex
2629*53ee8cc1Swenshuai.xi     //_HAL_VPU_MutexCreate();
2630*53ee8cc1Swenshuai.xi #else
2631*53ee8cc1Swenshuai.xi     pVPUHalContext->s32VPUMutexID = InitParams->s32VPUMutexID;
2632*53ee8cc1Swenshuai.xi     pVPUHalContext->u32VPUMutexTimeOut = InitParams->u32VPUMutexTimeout;
2633*53ee8cc1Swenshuai.xi #endif
2634*53ee8cc1Swenshuai.xi 
2635*53ee8cc1Swenshuai.xi     return TRUE;
2636*53ee8cc1Swenshuai.xi }
2637*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_DeInit(void)2638*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_DeInit(void)
2639*53ee8cc1Swenshuai.xi {
2640*53ee8cc1Swenshuai.xi     if (0 != _VPU_EX_GetActiveCodecCnt())
2641*53ee8cc1Swenshuai.xi     {
2642*53ee8cc1Swenshuai.xi         VPU_MSG_DBG("do nothing since codec is active.\n");
2643*53ee8cc1Swenshuai.xi         return TRUE;
2644*53ee8cc1Swenshuai.xi     }
2645*53ee8cc1Swenshuai.xi 
2646*53ee8cc1Swenshuai.xi     memset(&(pVPUHalContext->_stVPUDecMode),0,sizeof(VPU_EX_DecModCfg));
2647*53ee8cc1Swenshuai.xi 
2648*53ee8cc1Swenshuai.xi #ifdef CONFIG_MSTAR_CLKM
2649*53ee8cc1Swenshuai.xi     HAL_VPU_EX_SetClkManagement(E_VPU_EX_CLKPORT_VD_MHEG5, FALSE);
2650*53ee8cc1Swenshuai.xi #else
2651*53ee8cc1Swenshuai.xi     HAL_VPU_EX_PowerCtrl(FALSE);
2652*53ee8cc1Swenshuai.xi #endif
2653*53ee8cc1Swenshuai.xi 
2654*53ee8cc1Swenshuai.xi #ifdef CONFIG_MSTAR_SRAMPD
2655*53ee8cc1Swenshuai.xi     _VPU_WriteWordMask(REG_CODEC_SRAM_SD_EN, ~CODEC_SRAM_HVD_R2, CODEC_SRAM_HVD_R2);
2656*53ee8cc1Swenshuai.xi     HVD_Delay_ms(1);
2657*53ee8cc1Swenshuai.xi     _VPU_WriteWordMask(REG_CODEC_SRAM_SD_EN, ~CODEC_SRAM_HVD_R2_MIU0_BWP, CODEC_SRAM_HVD_R2_MIU0_BWP);
2658*53ee8cc1Swenshuai.xi     HVD_Delay_ms(1);
2659*53ee8cc1Swenshuai.xi     _VPU_WriteWordMask(REG_CODEC_SRAM_SD_EN, ~CODEC_SRAM_HVD_R2_MIU1_BWP, CODEC_SRAM_HVD_R2_MIU1_BWP);
2660*53ee8cc1Swenshuai.xi     HVD_Delay_ms(1);
2661*53ee8cc1Swenshuai.xi #endif
2662*53ee8cc1Swenshuai.xi 
2663*53ee8cc1Swenshuai.xi     HAL_VPU_EX_SwRelseMAU();
2664*53ee8cc1Swenshuai.xi     //_HAL_VPU_MutexDelete();
2665*53ee8cc1Swenshuai.xi 
2666*53ee8cc1Swenshuai.xi     return TRUE;
2667*53ee8cc1Swenshuai.xi }
2668*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_PowerCtrl(MS_BOOL bEnable)2669*53ee8cc1Swenshuai.xi void HAL_VPU_EX_PowerCtrl(MS_BOOL bEnable)
2670*53ee8cc1Swenshuai.xi {
2671*53ee8cc1Swenshuai.xi     if (bEnable)
2672*53ee8cc1Swenshuai.xi     {
2673*53ee8cc1Swenshuai.xi         _VPU_WriteWordMask(REG_TOP_VPU, 0, TOP_CKG_VPU_DIS);
2674*53ee8cc1Swenshuai.xi         _VPU_WriteWordMask( REG_CHIPTOP_DUMMY_CODEC, REG_CHIPTOP_DUMMY_CODEC_ENABLE, REG_CHIPTOP_DUMMY_CODEC_ENABLE);
2675*53ee8cc1Swenshuai.xi         pVPUHalContext->_bVPUPowered = TRUE;
2676*53ee8cc1Swenshuai.xi     }
2677*53ee8cc1Swenshuai.xi     else
2678*53ee8cc1Swenshuai.xi     {
2679*53ee8cc1Swenshuai.xi         _VPU_WriteWordMask(REG_TOP_VPU, TOP_CKG_VPU_DIS, TOP_CKG_VPU_DIS);
2680*53ee8cc1Swenshuai.xi         _VPU_WriteWordMask( REG_CHIPTOP_DUMMY_CODEC, 0, REG_CHIPTOP_DUMMY_CODEC_ENABLE);
2681*53ee8cc1Swenshuai.xi         pVPUHalContext->_bVPUPowered = FALSE;
2682*53ee8cc1Swenshuai.xi     }
2683*53ee8cc1Swenshuai.xi }
2684*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_MIU_RW_Protect(MS_BOOL bEnable)2685*53ee8cc1Swenshuai.xi void HAL_VPU_EX_MIU_RW_Protect(MS_BOOL bEnable)
2686*53ee8cc1Swenshuai.xi {
2687*53ee8cc1Swenshuai.xi     _VPU_MIU_SetReqMask(VPU_D_RW, bEnable);
2688*53ee8cc1Swenshuai.xi     _VPU_MIU_SetReqMask(VPU_Q_RW, bEnable);
2689*53ee8cc1Swenshuai.xi     _VPU_MIU_SetReqMask(VPU_I_R, bEnable);
2690*53ee8cc1Swenshuai.xi     VPU_EX_TimerDelayMS(1);
2691*53ee8cc1Swenshuai.xi }
2692*53ee8cc1Swenshuai.xi 
2693*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
2694*53ee8cc1Swenshuai.xi /// config AVCH264 CPU
2695*53ee8cc1Swenshuai.xi /// @param u32StAddr \b IN: CPU binary code base address in DRAM.
2696*53ee8cc1Swenshuai.xi /// @param u8dlend_en \b IN: endian
2697*53ee8cc1Swenshuai.xi ///     - 1, little endian
2698*53ee8cc1Swenshuai.xi ///     - 0, big endian
2699*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_CPUSetting(MS_PHY u32StAddr)2700*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_CPUSetting(MS_PHY u32StAddr)
2701*53ee8cc1Swenshuai.xi {
2702*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
2703*53ee8cc1Swenshuai.xi     MS_U32 u32Offset = 0;
2704*53ee8cc1Swenshuai.xi     MS_U16 tempreg = 0;
2705*53ee8cc1Swenshuai.xi     MS_U8  u8MiuSel;
2706*53ee8cc1Swenshuai.xi     //MS_U32 u32TmpStartOffset;
2707*53ee8cc1Swenshuai.xi 
2708*53ee8cc1Swenshuai.xi     _phy_to_miu_offset(u8MiuSel, u32Offset, u32StAddr);
2709*53ee8cc1Swenshuai.xi 
2710*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_SPI_BASE,  0xC000);
2711*53ee8cc1Swenshuai.xi     _VPU_WriteWordMask( VPU_REG_MIU_LAST , 0 , VPU_REG_MIU_LAST_EN );
2712*53ee8cc1Swenshuai.xi     _VPU_WriteWordMask( VPU_REG_CPU_SETTING , 0 , VPU_REG_CPU_SPI_BOOT );
2713*53ee8cc1Swenshuai.xi     _VPU_WriteWordMask( VPU_REG_CPU_SETTING , 0 , VPU_REG_CPU_SDRAM_BOOT );
2714*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_DQMEM_MASK_L,  0xc000);
2715*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_DQMEM_MASK_H,  0xffff);
2716*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_IO1_BASE,  0xf900); // UART BASE
2717*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_IO2_BASE,  0xf000);
2718*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_DQMEM_BASE_L,  0x0000);
2719*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_DQMEM_BASE_H, 0xf200);
2720*53ee8cc1Swenshuai.xi 
2721*53ee8cc1Swenshuai.xi     #if (HVD_ENABLE_IQMEM)
2722*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_IQMEM_BASE_L, (MS_U16)(VPU_IQMEM_BASE & 0x0000ffff));
2723*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_IQMEM_BASE_H, (MS_U16)((VPU_IQMEM_BASE>>16) & 0xffff));
2724*53ee8cc1Swenshuai.xi     #endif
2725*53ee8cc1Swenshuai.xi 
2726*53ee8cc1Swenshuai.xi     #if (VPU_FORCE_MIU_MODE)
2727*53ee8cc1Swenshuai.xi         // Data sram base Unit: byte address
2728*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_DCU_SDR_BASE_L, (MS_U16)(u32Offset & 0x0000ffff)) ;
2729*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_DCU_SDR_BASE_H, (MS_U16)((u32Offset >>16) & 0xffff));
2730*53ee8cc1Swenshuai.xi         // Instruction sram base Unit: byte address
2731*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_ICU_SDR_BASE_L, (MS_U16)(u32Offset & 0x0000ffff)) ;
2732*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_ICU_SDR_BASE_H, (MS_U16)((u32Offset >>16) & 0xffff));
2733*53ee8cc1Swenshuai.xi 
2734*53ee8cc1Swenshuai.xi #ifndef HAL_FEATURE_MAU
2735*53ee8cc1Swenshuai.xi     MS_U16 r2_miu_sel = (_VPU_Read2Byte(VPU_REG_R2_MI_SEL_BASE) & 0xfff);
2736*53ee8cc1Swenshuai.xi #endif
2737*53ee8cc1Swenshuai.xi     VPRINTF("\033[1;32m[%s] %d  u8MiuSel = %d  r2_miu_sel = 0x%x \033[m\n",__FUNCTION__,__LINE__,u8MiuSel,r2_miu_sel);
2738*53ee8cc1Swenshuai.xi 
2739*53ee8cc1Swenshuai.xi 	//use force miu mode
2740*53ee8cc1Swenshuai.xi     if(u8MiuSel == E_CHIP_MIU_0)
2741*53ee8cc1Swenshuai.xi     {
2742*53ee8cc1Swenshuai.xi #ifdef HAL_FEATURE_MAU
2743*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(MAU1_MIU_SEL, 0x8900);
2744*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(MAU1_LV2_0_MIU_SEL, 0x8900);
2745*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(MAU1_LV2_1_MIU_SEL, 0x8900);
2746*53ee8cc1Swenshuai.xi #else
2747*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_R2_MI_SEL_BASE, r2_miu_sel);//1 Manhattan has no MAU, use this register to select miu
2748*53ee8cc1Swenshuai.xi #endif
2749*53ee8cc1Swenshuai.xi     }
2750*53ee8cc1Swenshuai.xi     else if(u8MiuSel == E_CHIP_MIU_1)
2751*53ee8cc1Swenshuai.xi     {
2752*53ee8cc1Swenshuai.xi #ifdef HAL_FEATURE_MAU
2753*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(MAU1_MIU_SEL, 0x8900);
2754*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(MAU1_LV2_0_MIU_SEL, 0x8b00);
2755*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(MAU1_LV2_1_MIU_SEL, 0x8900);
2756*53ee8cc1Swenshuai.xi #else
2757*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_R2_MI_SEL_BASE, r2_miu_sel|0x5000);
2758*53ee8cc1Swenshuai.xi #endif
2759*53ee8cc1Swenshuai.xi     }
2760*53ee8cc1Swenshuai.xi     else //miu 2
2761*53ee8cc1Swenshuai.xi     {
2762*53ee8cc1Swenshuai.xi #ifdef HAL_FEATURE_MAU
2763*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(MAU1_MIU_SEL, 0x8b00);
2764*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(MAU1_LV2_0_MIU_SEL, 0x8900);
2765*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(MAU1_LV2_1_MIU_SEL, 0x8900);
2766*53ee8cc1Swenshuai.xi #else
2767*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_R2_MI_SEL_BASE, r2_miu_sel|0xa000);
2768*53ee8cc1Swenshuai.xi #endif
2769*53ee8cc1Swenshuai.xi     }
2770*53ee8cc1Swenshuai.xi     #else
2771*53ee8cc1Swenshuai.xi     ///TODO:
2772*53ee8cc1Swenshuai.xi     #endif
2773*53ee8cc1Swenshuai.xi 
2774*53ee8cc1Swenshuai.xi 
2775*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_CONTROL_SET);
2776*53ee8cc1Swenshuai.xi     tempreg |= VPU_REG_IO2_EN;
2777*53ee8cc1Swenshuai.xi     tempreg |= VPU_REG_QMEM_SPACE_EN;
2778*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CONTROL_SET, tempreg);
2779*53ee8cc1Swenshuai.xi 
2780*53ee8cc1Swenshuai.xi     return bRet;
2781*53ee8cc1Swenshuai.xi }
2782*53ee8cc1Swenshuai.xi 
2783*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
2784*53ee8cc1Swenshuai.xi /// Set IQMem data access mode or instruction fetch mode
2785*53ee8cc1Swenshuai.xi /// @param u8dlend_en \b IN: endian
2786*53ee8cc1Swenshuai.xi ///     - 1, switch to data access mode
2787*53ee8cc1Swenshuai.xi ///     - 0, switch to instruction fetch mode
2788*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_IQMemSetDAMode(MS_BOOL bEnable)2789*53ee8cc1Swenshuai.xi void HAL_VPU_EX_IQMemSetDAMode(MS_BOOL bEnable)
2790*53ee8cc1Swenshuai.xi {
2791*53ee8cc1Swenshuai.xi 
2792*53ee8cc1Swenshuai.xi     if(bEnable){
2793*53ee8cc1Swenshuai.xi 
2794*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_IQMEM_SETTING, _VPU_Read2Byte(VPU_REG_IQMEM_SETTING)|0x10);
2795*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_QMEM_OWNER, _VPU_Read2Byte(VPU_REG_QMEM_OWNER)&0xFFDE);
2796*53ee8cc1Swenshuai.xi 
2797*53ee8cc1Swenshuai.xi     }
2798*53ee8cc1Swenshuai.xi     else{
2799*53ee8cc1Swenshuai.xi 
2800*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_IQMEM_SETTING, _VPU_Read2Byte(VPU_REG_IQMEM_SETTING)& 0xFFEF);
2801*53ee8cc1Swenshuai.xi 
2802*53ee8cc1Swenshuai.xi     }
2803*53ee8cc1Swenshuai.xi }
2804*53ee8cc1Swenshuai.xi 
2805*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
2806*53ee8cc1Swenshuai.xi /// H.264 SW reset
2807*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
2808*53ee8cc1Swenshuai.xi ///     - TRUE, Success
2809*53ee8cc1Swenshuai.xi ///     - FALSE, Failed
2810*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_SwRst(MS_BOOL bCheckMauIdle)2811*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_SwRst(MS_BOOL bCheckMauIdle)
2812*53ee8cc1Swenshuai.xi {
2813*53ee8cc1Swenshuai.xi     MS_U16 tempreg = 0, tempreg1 = 0;
2814*53ee8cc1Swenshuai.xi     MS_U16 idle_cnt;
2815*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_CPU_CONFIG);
2816*53ee8cc1Swenshuai.xi     tempreg |= VPU_REG_CPU_STALL_EN;
2817*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CPU_CONFIG, tempreg);
2818*53ee8cc1Swenshuai.xi 
2819*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_CPU_SETTING);
2820*53ee8cc1Swenshuai.xi     // 0xf means VPU is not stalled
2821*53ee8cc1Swenshuai.xi     if (tempreg & 0xf || pVPUHalContext->u8ForceRst == 1) {
2822*53ee8cc1Swenshuai.xi         pVPUHalContext->u8ForceRst = 0;
2823*53ee8cc1Swenshuai.xi         // write R2 RIU registers to select DCU/ICU debug data
2824*53ee8cc1Swenshuai.xi         // Writing these registers here provides enough time for them to
2825*53ee8cc1Swenshuai.xi         // take effect.
2826*53ee8cc1Swenshuai.xi         tempreg1 = _VPU_Read2Byte(VPU_REG_DCU_DBG_SEL);
2827*53ee8cc1Swenshuai.xi         tempreg1 |= VPU_REG_DCU_DBG_SEL_0 | VPU_REG_DCU_DBG_SEL_1;
2828*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_DCU_DBG_SEL, tempreg1);
2829*53ee8cc1Swenshuai.xi         _VPU_Write2Byte(VPU_REG_ICU_DBG_SEL, 0);
2830*53ee8cc1Swenshuai.xi 
2831*53ee8cc1Swenshuai.xi         // wait at least 1ms for VPU_REG_CPU_STALL_EN to take effect
2832*53ee8cc1Swenshuai.xi         // This step is important because in the next step we want to make
2833*53ee8cc1Swenshuai.xi         // sure "DCU is not replaying when R2 is stalled".
2834*53ee8cc1Swenshuai.xi         idle_cnt = 100;
2835*53ee8cc1Swenshuai.xi         do
2836*53ee8cc1Swenshuai.xi         {
2837*53ee8cc1Swenshuai.xi             if (--idle_cnt == 0)
2838*53ee8cc1Swenshuai.xi             {
2839*53ee8cc1Swenshuai.xi                 printf("VPU_REG_CPU_STALL_EN is not set\n");
2840*53ee8cc1Swenshuai.xi                 break;
2841*53ee8cc1Swenshuai.xi             }
2842*53ee8cc1Swenshuai.xi             MsOS_DelayTask(1);
2843*53ee8cc1Swenshuai.xi         } while ((_VPU_Read2Byte(VPU_REG_CPU_CONFIG) & VPU_REG_CPU_STALL_EN) == 0);
2844*53ee8cc1Swenshuai.xi         // check CPU status: DCU should NOT be replaying
2845*53ee8cc1Swenshuai.xi         // If R2 has been stalled, we can guarantee that if we found DCU is
2846*53ee8cc1Swenshuai.xi         // NOT replaying, it will NOT replay later even CPU is going to issue
2847*53ee8cc1Swenshuai.xi         // a load/store instruction.
2848*53ee8cc1Swenshuai.xi         idle_cnt = 100;
2849*53ee8cc1Swenshuai.xi         while (_VPU_Read2Byte(VPU_REG_CPU_STATUS) & VPU_REG_CPU_D_REPLAY)
2850*53ee8cc1Swenshuai.xi         {
2851*53ee8cc1Swenshuai.xi             if (--idle_cnt == 0)
2852*53ee8cc1Swenshuai.xi             {
2853*53ee8cc1Swenshuai.xi                 printf("DCU is replaying\n");
2854*53ee8cc1Swenshuai.xi                 break;
2855*53ee8cc1Swenshuai.xi             }
2856*53ee8cc1Swenshuai.xi             MsOS_DelayTask(1);
2857*53ee8cc1Swenshuai.xi         }
2858*53ee8cc1Swenshuai.xi         // wait 1ms to prevent race condition between (1) DCU is not
2859*53ee8cc1Swenshuai.xi         // replaying, and (2) BIU start to doing new job or ICU start to
2860*53ee8cc1Swenshuai.xi         // fetch new instruction
2861*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
2862*53ee8cc1Swenshuai.xi 
2863*53ee8cc1Swenshuai.xi         // check BIU should be empty
2864*53ee8cc1Swenshuai.xi         idle_cnt = 100;
2865*53ee8cc1Swenshuai.xi         while ( (_VPU_Read2Byte(VPU_REG_DCU_STATUS) & VPU_REG_BIU_EMPTY) == 0 )
2866*53ee8cc1Swenshuai.xi         {
2867*53ee8cc1Swenshuai.xi             if (--idle_cnt == 0)
2868*53ee8cc1Swenshuai.xi             {
2869*53ee8cc1Swenshuai.xi                 printf("BIU DCU idle time out~~~~~\n");
2870*53ee8cc1Swenshuai.xi                 break;
2871*53ee8cc1Swenshuai.xi             }
2872*53ee8cc1Swenshuai.xi             MsOS_DelayTask(1);
2873*53ee8cc1Swenshuai.xi         }
2874*53ee8cc1Swenshuai.xi 
2875*53ee8cc1Swenshuai.xi         // check CPU is not requesting ICU
2876*53ee8cc1Swenshuai.xi         idle_cnt = 100;
2877*53ee8cc1Swenshuai.xi         while (_VPU_Read2Byte(VPU_REG_ICU_DBG_DAT0) & VPU_REG_ICPU_REQ)
2878*53ee8cc1Swenshuai.xi         {
2879*53ee8cc1Swenshuai.xi             if (--idle_cnt == 0)
2880*53ee8cc1Swenshuai.xi             {
2881*53ee8cc1Swenshuai.xi                 printf("CPU keeps requesting ICU\n");
2882*53ee8cc1Swenshuai.xi                 break;
2883*53ee8cc1Swenshuai.xi             }
2884*53ee8cc1Swenshuai.xi             MsOS_DelayTask(1);
2885*53ee8cc1Swenshuai.xi         }
2886*53ee8cc1Swenshuai.xi 
2887*53ee8cc1Swenshuai.xi         // wait 1ms to avoid race condition of (1) CPU stop requesting ICU, and
2888*53ee8cc1Swenshuai.xi         // (2) ISB start to fetch
2889*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
2890*53ee8cc1Swenshuai.xi 
2891*53ee8cc1Swenshuai.xi         // check ISB should be idle
2892*53ee8cc1Swenshuai.xi         idle_cnt = 100;
2893*53ee8cc1Swenshuai.xi         while ( (_VPU_Read2Byte(VPU_REG_ICU_STATUS) & VPU_REG_ISB_IDLE) == 0 )
2894*53ee8cc1Swenshuai.xi         {
2895*53ee8cc1Swenshuai.xi             if (--idle_cnt == 0)
2896*53ee8cc1Swenshuai.xi             {
2897*53ee8cc1Swenshuai.xi                 printf("ISB is busy\n");
2898*53ee8cc1Swenshuai.xi                 break;
2899*53ee8cc1Swenshuai.xi             }
2900*53ee8cc1Swenshuai.xi             MsOS_DelayTask(1);
2901*53ee8cc1Swenshuai.xi         }
2902*53ee8cc1Swenshuai.xi     }
2903*53ee8cc1Swenshuai.xi #ifdef HAL_FEATURE_MAU
2904*53ee8cc1Swenshuai.xi //MAU has been removed since manhattan, so it is not necessary to check MAU status
2905*53ee8cc1Swenshuai.xi     if (bCheckMauIdle)
2906*53ee8cc1Swenshuai.xi     {
2907*53ee8cc1Swenshuai.xi         MS_U32 mau_idle_cnt = 100;// ms
2908*53ee8cc1Swenshuai.xi         while (mau_idle_cnt)
2909*53ee8cc1Swenshuai.xi         {
2910*53ee8cc1Swenshuai.xi             if (TRUE == _VPU_EX_MAU_IDLE())
2911*53ee8cc1Swenshuai.xi             {
2912*53ee8cc1Swenshuai.xi                 break;
2913*53ee8cc1Swenshuai.xi             }
2914*53ee8cc1Swenshuai.xi             mau_idle_cnt--;
2915*53ee8cc1Swenshuai.xi             MsOS_DelayTask(1);
2916*53ee8cc1Swenshuai.xi         }
2917*53ee8cc1Swenshuai.xi 
2918*53ee8cc1Swenshuai.xi         if (mau_idle_cnt == 0)
2919*53ee8cc1Swenshuai.xi         {
2920*53ee8cc1Swenshuai.xi             printf("MAU idle time out~~~~~\n");
2921*53ee8cc1Swenshuai.xi         }
2922*53ee8cc1Swenshuai.xi     }
2923*53ee8cc1Swenshuai.xi #endif
2924*53ee8cc1Swenshuai.xi 
2925*53ee8cc1Swenshuai.xi     // this command set MIU to block R2 (does not ack R2's request)
2926*53ee8cc1Swenshuai.xi     HAL_VPU_EX_MIU_RW_Protect(TRUE);
2927*53ee8cc1Swenshuai.xi 
2928*53ee8cc1Swenshuai.xi #ifdef HAL_FEATURE_MAU
2929*53ee8cc1Swenshuai.xi     // reset MAU
2930*53ee8cc1Swenshuai.xi     tempreg1 = _VPU_Read2Byte(MAU1_CPU_RST);
2931*53ee8cc1Swenshuai.xi     tempreg1 |= MAU1_REG_SW_RESET;
2932*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(MAU1_CPU_RST, tempreg1);
2933*53ee8cc1Swenshuai.xi #if defined(UDMA_FPGA_ENVI)
2934*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_RESET);
2935*53ee8cc1Swenshuai.xi    _VPU_Write2Byte(VPU_REG_RESET, (tempreg& 0xfffd));
2936*53ee8cc1Swenshuai.xi #endif
2937*53ee8cc1Swenshuai.xi #endif
2938*53ee8cc1Swenshuai.xi 
2939*53ee8cc1Swenshuai.xi     // reset R2
2940*53ee8cc1Swenshuai.xi     // We should trigger MIU reset before R2 reset. If we set MIU/R2 reset
2941*53ee8cc1Swenshuai.xi     // by the same RIU write, the R2 reset signal may reach afifo eralier
2942*53ee8cc1Swenshuai.xi     // than MIU reset and afifo write pointer will be reset to position 0.
2943*53ee8cc1Swenshuai.xi     // In this case, afifo consider it is not empty because read/write
2944*53ee8cc1Swenshuai.xi     // pointer are mismatch and then BIU sends out unpredicted MIU request.
2945*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_CPU_SETTING);
2946*53ee8cc1Swenshuai.xi     tempreg &= ~VPU_REG_CPU_MIU_SW_RSTZ;
2947*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CPU_SETTING, tempreg);
2948*53ee8cc1Swenshuai.xi     VPU_EX_TimerDelayMS(1);
2949*53ee8cc1Swenshuai.xi     tempreg &= ~VPU_REG_CPU_R2_EN;
2950*53ee8cc1Swenshuai.xi     tempreg &= ~VPU_REG_CPU_SW_RSTZ;
2951*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CPU_SETTING, tempreg);
2952*53ee8cc1Swenshuai.xi 
2953*53ee8cc1Swenshuai.xi     VPU_EX_TimerDelayMS(1);
2954*53ee8cc1Swenshuai.xi 
2955*53ee8cc1Swenshuai.xi     // this command set MIU to accept R2 (can ack R2's request)
2956*53ee8cc1Swenshuai.xi     HAL_VPU_EX_MIU_RW_Protect(FALSE);
2957*53ee8cc1Swenshuai.xi 
2958*53ee8cc1Swenshuai.xi     pVPUHalContext->_bVPURsted = FALSE;
2959*53ee8cc1Swenshuai.xi     return TRUE;
2960*53ee8cc1Swenshuai.xi }
2961*53ee8cc1Swenshuai.xi /*
2962*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_SwRst(MS_BOOL bCheckMauIdle)
2963*53ee8cc1Swenshuai.xi {
2964*53ee8cc1Swenshuai.xi     MS_U16 tempreg = 0, tempreg1 = 0;
2965*53ee8cc1Swenshuai.xi #ifndef HAL_FEATURE_MAU
2966*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_CPU_CONFIG);
2967*53ee8cc1Swenshuai.xi     tempreg |= VPU_REG_CPU_STALL_EN;
2968*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CPU_CONFIG, tempreg);
2969*53ee8cc1Swenshuai.xi 
2970*53ee8cc1Swenshuai.xi      MS_U32 idle_cnt = 100;// ms
2971*53ee8cc1Swenshuai.xi      while (idle_cnt)
2972*53ee8cc1Swenshuai.xi      {
2973*53ee8cc1Swenshuai.xi          if (_VPU_Read2Byte(VPU_REG_ICU_STATUS) & (VPU_REG_ISB_IDLE | VPU_REG_ICU_IDLE))
2974*53ee8cc1Swenshuai.xi          {
2975*53ee8cc1Swenshuai.xi              break;
2976*53ee8cc1Swenshuai.xi          }
2977*53ee8cc1Swenshuai.xi          idle_cnt--;
2978*53ee8cc1Swenshuai.xi          MsOS_DelayTask(1);
2979*53ee8cc1Swenshuai.xi      }
2980*53ee8cc1Swenshuai.xi 
2981*53ee8cc1Swenshuai.xi      if (idle_cnt == 0)
2982*53ee8cc1Swenshuai.xi      {
2983*53ee8cc1Swenshuai.xi          printf("ISB ICU idle time out~~~~~\n");
2984*53ee8cc1Swenshuai.xi      }
2985*53ee8cc1Swenshuai.xi 
2986*53ee8cc1Swenshuai.xi     tempreg1 = _VPU_Read2Byte(VPU_REG_DCU_DBG_SEL);
2987*53ee8cc1Swenshuai.xi     tempreg1 |= VPU_REG_DCU_DBG_SEL_0;
2988*53ee8cc1Swenshuai.xi     tempreg1 |= VPU_REG_DCU_DBG_SEL_1;
2989*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_DCU_DBG_SEL, tempreg1);
2990*53ee8cc1Swenshuai.xi 
2991*53ee8cc1Swenshuai.xi     MS_U32 idle_cnt_1 = 100;// ms
2992*53ee8cc1Swenshuai.xi      while (idle_cnt_1)
2993*53ee8cc1Swenshuai.xi      {
2994*53ee8cc1Swenshuai.xi          if (_VPU_Read2Byte(VPU_REG_DCU_STATUS) & (VPU_REG_BIU_EMPTY))
2995*53ee8cc1Swenshuai.xi          {
2996*53ee8cc1Swenshuai.xi              break;
2997*53ee8cc1Swenshuai.xi          }
2998*53ee8cc1Swenshuai.xi          idle_cnt_1--;
2999*53ee8cc1Swenshuai.xi          MsOS_DelayTask(1);
3000*53ee8cc1Swenshuai.xi      }
3001*53ee8cc1Swenshuai.xi 
3002*53ee8cc1Swenshuai.xi      if (idle_cnt_1 == 0)
3003*53ee8cc1Swenshuai.xi      {
3004*53ee8cc1Swenshuai.xi          printf("BIU DCU idle time out~~~~~\n");
3005*53ee8cc1Swenshuai.xi      }
3006*53ee8cc1Swenshuai.xi 
3007*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_CPU_SETTING);
3008*53ee8cc1Swenshuai.xi     tempreg &= ~VPU_REG_CPU_MIU_SW_RSTZ;
3009*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CPU_SETTING, tempreg);
3010*53ee8cc1Swenshuai.xi     VPU_EX_TimerDelayMS(1);
3011*53ee8cc1Swenshuai.xi     tempreg &= ~VPU_REG_CPU_R2_EN;
3012*53ee8cc1Swenshuai.xi     tempreg &= ~VPU_REG_CPU_SW_RSTZ;
3013*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CPU_SETTING, tempreg);
3014*53ee8cc1Swenshuai.xi 
3015*53ee8cc1Swenshuai.xi #else
3016*53ee8cc1Swenshuai.xi //MAU has been removed since manhattan, so it is not necessary to check MAU status
3017*53ee8cc1Swenshuai.xi 
3018*53ee8cc1Swenshuai.xi     if (bCheckMauIdle)
3019*53ee8cc1Swenshuai.xi     {
3020*53ee8cc1Swenshuai.xi         MS_U32 mau_idle_cnt = 100;// ms
3021*53ee8cc1Swenshuai.xi         while (mau_idle_cnt)
3022*53ee8cc1Swenshuai.xi         {
3023*53ee8cc1Swenshuai.xi             if (TRUE == _VPU_EX_MAU_IDLE())
3024*53ee8cc1Swenshuai.xi             {
3025*53ee8cc1Swenshuai.xi                 break;
3026*53ee8cc1Swenshuai.xi             }
3027*53ee8cc1Swenshuai.xi             mau_idle_cnt--;
3028*53ee8cc1Swenshuai.xi             MsOS_DelayTask(1);
3029*53ee8cc1Swenshuai.xi         }
3030*53ee8cc1Swenshuai.xi 
3031*53ee8cc1Swenshuai.xi         if (mau_idle_cnt == 0)
3032*53ee8cc1Swenshuai.xi         {
3033*53ee8cc1Swenshuai.xi             printf("MAU idle time out~~~~~\n");
3034*53ee8cc1Swenshuai.xi         }
3035*53ee8cc1Swenshuai.xi     }
3036*53ee8cc1Swenshuai.xi 
3037*53ee8cc1Swenshuai.xi 
3038*53ee8cc1Swenshuai.xi     HAL_VPU_EX_MIU_RW_Protect(TRUE);
3039*53ee8cc1Swenshuai.xi 
3040*53ee8cc1Swenshuai.xi     tempreg1 = _VPU_Read2Byte(MAU1_CPU_RST);
3041*53ee8cc1Swenshuai.xi     tempreg1 |= MAU1_REG_SW_RESET;
3042*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(MAU1_CPU_RST, tempreg1);
3043*53ee8cc1Swenshuai.xi 
3044*53ee8cc1Swenshuai.xi #if defined(UDMA_FPGA_ENVI)
3045*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_RESET);
3046*53ee8cc1Swenshuai.xi    _VPU_Write2Byte(VPU_REG_RESET, (tempreg& 0xfffd));
3047*53ee8cc1Swenshuai.xi #endif
3048*53ee8cc1Swenshuai.xi 
3049*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_CPU_SETTING);
3050*53ee8cc1Swenshuai.xi     tempreg &= ~VPU_REG_CPU_R2_EN;
3051*53ee8cc1Swenshuai.xi     tempreg &= ~VPU_REG_CPU_SW_RSTZ;
3052*53ee8cc1Swenshuai.xi     tempreg &= ~VPU_REG_CPU_MIU_SW_RSTZ;
3053*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CPU_SETTING, tempreg);
3054*53ee8cc1Swenshuai.xi #endif
3055*53ee8cc1Swenshuai.xi     VPU_EX_TimerDelayMS(1);
3056*53ee8cc1Swenshuai.xi     HAL_VPU_EX_MIU_RW_Protect(FALSE);
3057*53ee8cc1Swenshuai.xi 
3058*53ee8cc1Swenshuai.xi     pVPUHalContext->_bVPURsted = FALSE;
3059*53ee8cc1Swenshuai.xi     return TRUE;
3060*53ee8cc1Swenshuai.xi }
3061*53ee8cc1Swenshuai.xi */
3062*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
3063*53ee8cc1Swenshuai.xi /// CPU reset release
3064*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_SwRstRelse(void)3065*53ee8cc1Swenshuai.xi void HAL_VPU_EX_SwRstRelse(void)
3066*53ee8cc1Swenshuai.xi {
3067*53ee8cc1Swenshuai.xi     MS_U16 tempreg = 0;
3068*53ee8cc1Swenshuai.xi 
3069*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_CPU_CONFIG);
3070*53ee8cc1Swenshuai.xi     tempreg &= ~VPU_REG_CPU_STALL_EN;
3071*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CPU_CONFIG, tempreg);
3072*53ee8cc1Swenshuai.xi 
3073*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(VPU_REG_CPU_SETTING);
3074*53ee8cc1Swenshuai.xi     tempreg |= VPU_REG_CPU_MIU_SW_RSTZ;
3075*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CPU_SETTING, tempreg);
3076*53ee8cc1Swenshuai.xi     VPU_EX_TimerDelayMS(1);
3077*53ee8cc1Swenshuai.xi     tempreg |= VPU_REG_CPU_SW_RSTZ;
3078*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CPU_SETTING, tempreg);
3079*53ee8cc1Swenshuai.xi     VPU_EX_TimerDelayMS(1);
3080*53ee8cc1Swenshuai.xi     tempreg |= VPU_REG_CPU_R2_EN;
3081*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(VPU_REG_CPU_SETTING, tempreg);
3082*53ee8cc1Swenshuai.xi #ifdef HAL_FEATURE_MAU
3083*53ee8cc1Swenshuai.xi     MS_U16 tempreg1 = 0;
3084*53ee8cc1Swenshuai.xi     tempreg1 = _VPU_Read2Byte(MAU1_CPU_RST);
3085*53ee8cc1Swenshuai.xi     tempreg1 &= ~MAU1_REG_SW_RESET;
3086*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(MAU1_CPU_RST, tempreg1);
3087*53ee8cc1Swenshuai.xi #endif
3088*53ee8cc1Swenshuai.xi     pVPUHalContext->_bVPURsted = TRUE;
3089*53ee8cc1Swenshuai.xi }
3090*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_SwRelseMAU(void)3091*53ee8cc1Swenshuai.xi void HAL_VPU_EX_SwRelseMAU(void)
3092*53ee8cc1Swenshuai.xi {
3093*53ee8cc1Swenshuai.xi 
3094*53ee8cc1Swenshuai.xi #ifdef HAL_FEATURE_MAU
3095*53ee8cc1Swenshuai.xi     MS_U16 tempreg = 0;
3096*53ee8cc1Swenshuai.xi     tempreg = _VPU_Read2Byte(MAU1_CPU_RST);
3097*53ee8cc1Swenshuai.xi     tempreg &= ~MAU1_REG_SW_RESET;
3098*53ee8cc1Swenshuai.xi     _VPU_Write2Byte(MAU1_CPU_RST, tempreg);
3099*53ee8cc1Swenshuai.xi #endif
3100*53ee8cc1Swenshuai.xi }
3101*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_MemRead(MS_VIRT u32Addr)3102*53ee8cc1Swenshuai.xi MS_U32 HAL_VPU_EX_MemRead(MS_VIRT u32Addr)
3103*53ee8cc1Swenshuai.xi {
3104*53ee8cc1Swenshuai.xi     MS_U32 u32value = 0;
3105*53ee8cc1Swenshuai.xi 
3106*53ee8cc1Swenshuai.xi     return u32value;
3107*53ee8cc1Swenshuai.xi }
3108*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_MemWrite(MS_VIRT u32Addr,MS_U32 u32value)3109*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_MemWrite(MS_VIRT u32Addr, MS_U32 u32value)
3110*53ee8cc1Swenshuai.xi {
3111*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
3112*53ee8cc1Swenshuai.xi 
3113*53ee8cc1Swenshuai.xi     return bRet;
3114*53ee8cc1Swenshuai.xi }
3115*53ee8cc1Swenshuai.xi 
3116*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
3117*53ee8cc1Swenshuai.xi /// Check AVCH264 Ready or not
3118*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
3119*53ee8cc1Swenshuai.xi ///     - TRUE, MailBox is free
3120*53ee8cc1Swenshuai.xi ///     - FALSE, MailBox is busy
3121*53ee8cc1Swenshuai.xi /// @param u8MBox \b IN: MailBox to check
3122*53ee8cc1Swenshuai.xi ///     - AVCH264_HI_MBOX0,
3123*53ee8cc1Swenshuai.xi ///     - AVCH264_HI_MBOX1,
3124*53ee8cc1Swenshuai.xi ///     - AVCH264_RISC_MBOX0,
3125*53ee8cc1Swenshuai.xi ///     - AVCH264_RISC_MBOX1,
3126*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_MBoxRdy(MS_U32 u32type)3127*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_MBoxRdy(MS_U32 u32type)
3128*53ee8cc1Swenshuai.xi {
3129*53ee8cc1Swenshuai.xi     MS_BOOL bResult = FALSE;
3130*53ee8cc1Swenshuai.xi 
3131*53ee8cc1Swenshuai.xi     switch (u32type)
3132*53ee8cc1Swenshuai.xi     {
3133*53ee8cc1Swenshuai.xi         case VPU_HI_MBOX0:
3134*53ee8cc1Swenshuai.xi             bResult = (_VPU_Read2Byte(VPU_REG_HI_MBOX_RDY) & VPU_REG_HI_MBOX0_RDY) ? FALSE : TRUE;
3135*53ee8cc1Swenshuai.xi             break;
3136*53ee8cc1Swenshuai.xi         case VPU_HI_MBOX1:
3137*53ee8cc1Swenshuai.xi             bResult = (_VPU_Read2Byte(VPU_REG_HI_MBOX_RDY) & VPU_REG_HI_MBOX1_RDY) ? FALSE : TRUE;
3138*53ee8cc1Swenshuai.xi             break;
3139*53ee8cc1Swenshuai.xi         case VPU_RISC_MBOX0:
3140*53ee8cc1Swenshuai.xi             bResult = (_VPU_Read2Byte(VPU_REG_RISC_MBOX_RDY) & VPU_REG_RISC_MBOX0_RDY) ? TRUE : FALSE;
3141*53ee8cc1Swenshuai.xi             break;
3142*53ee8cc1Swenshuai.xi         case VPU_RISC_MBOX1:
3143*53ee8cc1Swenshuai.xi             bResult = (_VPU_Read2Byte(VPU_REG_RISC_MBOX_RDY) & VPU_REG_RISC_MBOX1_RDY) ? TRUE : FALSE;
3144*53ee8cc1Swenshuai.xi             break;
3145*53ee8cc1Swenshuai.xi         default:
3146*53ee8cc1Swenshuai.xi             break;
3147*53ee8cc1Swenshuai.xi     }
3148*53ee8cc1Swenshuai.xi     return bResult;
3149*53ee8cc1Swenshuai.xi }
3150*53ee8cc1Swenshuai.xi 
3151*53ee8cc1Swenshuai.xi 
3152*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
3153*53ee8cc1Swenshuai.xi /// Read message from AVCH264
3154*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
3155*53ee8cc1Swenshuai.xi ///     - TRUE, success
3156*53ee8cc1Swenshuai.xi ///     - FALSE, failed
3157*53ee8cc1Swenshuai.xi /// @param u8MBox \b IN: MailBox to read
3158*53ee8cc1Swenshuai.xi ///     - AVCH264_RISC_MBOX0
3159*53ee8cc1Swenshuai.xi ///     - AVCH264_RISC_MBOX1
3160*53ee8cc1Swenshuai.xi /// @param u32Msg \b OUT: message read
3161*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_MBoxRead(MS_U32 u32type,MS_U32 * u32Msg)3162*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_MBoxRead(MS_U32 u32type, MS_U32 * u32Msg)
3163*53ee8cc1Swenshuai.xi {
3164*53ee8cc1Swenshuai.xi     MS_BOOL bResult = TRUE;
3165*53ee8cc1Swenshuai.xi 
3166*53ee8cc1Swenshuai.xi     switch (u32type)
3167*53ee8cc1Swenshuai.xi     {
3168*53ee8cc1Swenshuai.xi         case VPU_HI_MBOX0:
3169*53ee8cc1Swenshuai.xi             *u32Msg = ((MS_U32) (_VPU_Read2Byte(VPU_REG_HI_MBOX0_H)) << 16) |
3170*53ee8cc1Swenshuai.xi                 ((MS_U32) (_VPU_Read2Byte(VPU_REG_HI_MBOX0_L)));
3171*53ee8cc1Swenshuai.xi             break;
3172*53ee8cc1Swenshuai.xi         case VPU_HI_MBOX1:
3173*53ee8cc1Swenshuai.xi             *u32Msg = ((MS_U32) (_VPU_Read2Byte(VPU_REG_HI_MBOX1_H)) << 16) |
3174*53ee8cc1Swenshuai.xi                 ((MS_U32) (_VPU_Read2Byte(VPU_REG_HI_MBOX1_L)));
3175*53ee8cc1Swenshuai.xi             break;
3176*53ee8cc1Swenshuai.xi         case VPU_RISC_MBOX0:
3177*53ee8cc1Swenshuai.xi             *u32Msg = ((MS_U32) (_VPU_Read2Byte(VPU_REG_RISC_MBOX0_H)) << 16) |
3178*53ee8cc1Swenshuai.xi                 ((MS_U32) (_VPU_Read2Byte(VPU_REG_RISC_MBOX0_L)));
3179*53ee8cc1Swenshuai.xi             break;
3180*53ee8cc1Swenshuai.xi         case VPU_RISC_MBOX1:
3181*53ee8cc1Swenshuai.xi             *u32Msg = ((MS_U32) (_VPU_Read2Byte(VPU_REG_RISC_MBOX1_H)) << 16) |
3182*53ee8cc1Swenshuai.xi                 ((MS_U32) (_VPU_Read2Byte(VPU_REG_RISC_MBOX1_L)));
3183*53ee8cc1Swenshuai.xi             break;
3184*53ee8cc1Swenshuai.xi         default:
3185*53ee8cc1Swenshuai.xi             *u32Msg = 0;
3186*53ee8cc1Swenshuai.xi             bResult = FALSE;
3187*53ee8cc1Swenshuai.xi             break;
3188*53ee8cc1Swenshuai.xi     }
3189*53ee8cc1Swenshuai.xi     return bResult;
3190*53ee8cc1Swenshuai.xi }
3191*53ee8cc1Swenshuai.xi 
3192*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
3193*53ee8cc1Swenshuai.xi /// Mailbox from AVCH264 clear bit resest
3194*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_MBoxClear(MS_U32 u32type)3195*53ee8cc1Swenshuai.xi void HAL_VPU_EX_MBoxClear(MS_U32 u32type)
3196*53ee8cc1Swenshuai.xi {
3197*53ee8cc1Swenshuai.xi     switch (u32type)
3198*53ee8cc1Swenshuai.xi     {
3199*53ee8cc1Swenshuai.xi         case VPU_RISC_MBOX0:
3200*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(VPU_REG_RISC_MBOX_CLR, VPU_REG_RISC_MBOX0_CLR, VPU_REG_RISC_MBOX0_CLR);
3201*53ee8cc1Swenshuai.xi             break;
3202*53ee8cc1Swenshuai.xi         case VPU_RISC_MBOX1:
3203*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(VPU_REG_RISC_MBOX_CLR, VPU_REG_RISC_MBOX1_CLR, VPU_REG_RISC_MBOX1_CLR);
3204*53ee8cc1Swenshuai.xi             break;
3205*53ee8cc1Swenshuai.xi         default:
3206*53ee8cc1Swenshuai.xi             break;
3207*53ee8cc1Swenshuai.xi     }
3208*53ee8cc1Swenshuai.xi }
3209*53ee8cc1Swenshuai.xi 
3210*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
3211*53ee8cc1Swenshuai.xi /// Send message to AVCH264
3212*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
3213*53ee8cc1Swenshuai.xi ///     - TRUE, Success
3214*53ee8cc1Swenshuai.xi ///     - FALSE, Failed
3215*53ee8cc1Swenshuai.xi /// @param u8MBox \b IN: MailBox
3216*53ee8cc1Swenshuai.xi ///     - AVCH264_HI_MBOX0,
3217*53ee8cc1Swenshuai.xi ///     - AVCH264_HI_MBOX1,
3218*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_MBoxSend(MS_U32 u32type,MS_U32 u32Msg)3219*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_MBoxSend(MS_U32 u32type, MS_U32 u32Msg)
3220*53ee8cc1Swenshuai.xi {
3221*53ee8cc1Swenshuai.xi     MS_BOOL bResult = TRUE;
3222*53ee8cc1Swenshuai.xi 
3223*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("type=%u, msg=0x%x\n", u32type, u32Msg);
3224*53ee8cc1Swenshuai.xi 
3225*53ee8cc1Swenshuai.xi     switch (u32type)
3226*53ee8cc1Swenshuai.xi     {
3227*53ee8cc1Swenshuai.xi         case VPU_HI_MBOX0:
3228*53ee8cc1Swenshuai.xi         {
3229*53ee8cc1Swenshuai.xi             _VPU_Write4Byte(VPU_REG_HI_MBOX0_L, u32Msg);
3230*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(VPU_REG_HI_MBOX_SET, VPU_REG_HI_MBOX0_SET, VPU_REG_HI_MBOX0_SET);
3231*53ee8cc1Swenshuai.xi             break;
3232*53ee8cc1Swenshuai.xi         }
3233*53ee8cc1Swenshuai.xi         case VPU_HI_MBOX1:
3234*53ee8cc1Swenshuai.xi         {
3235*53ee8cc1Swenshuai.xi             _VPU_Write4Byte(VPU_REG_HI_MBOX1_L, u32Msg);
3236*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(VPU_REG_HI_MBOX_SET, VPU_REG_HI_MBOX1_SET, VPU_REG_HI_MBOX1_SET);
3237*53ee8cc1Swenshuai.xi             break;
3238*53ee8cc1Swenshuai.xi         }
3239*53ee8cc1Swenshuai.xi         default:
3240*53ee8cc1Swenshuai.xi         {
3241*53ee8cc1Swenshuai.xi             bResult = FALSE;
3242*53ee8cc1Swenshuai.xi             break;
3243*53ee8cc1Swenshuai.xi         }
3244*53ee8cc1Swenshuai.xi     }
3245*53ee8cc1Swenshuai.xi 
3246*53ee8cc1Swenshuai.xi     return bResult;
3247*53ee8cc1Swenshuai.xi }
3248*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetProgCnt(void)3249*53ee8cc1Swenshuai.xi MS_U32 HAL_VPU_EX_GetProgCnt(void)
3250*53ee8cc1Swenshuai.xi {
3251*53ee8cc1Swenshuai.xi 
3252*53ee8cc1Swenshuai.xi     MS_U16 expc_l=0;
3253*53ee8cc1Swenshuai.xi     MS_U16 expc_h=0;
3254*53ee8cc1Swenshuai.xi     expc_l = _VPU_Read2Byte(VPU_REG_EXPC_L) & 0xFFFF;
3255*53ee8cc1Swenshuai.xi     expc_h = _VPU_Read2Byte(VPU_REG_EXPC_H) & 0xFFFF;
3256*53ee8cc1Swenshuai.xi     return (((MS_U32)expc_h) << 16) | (MS_U32)expc_l;
3257*53ee8cc1Swenshuai.xi }
3258*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetTaskId(MS_U32 u32Id)3259*53ee8cc1Swenshuai.xi MS_U8 HAL_VPU_EX_GetTaskId(MS_U32 u32Id)
3260*53ee8cc1Swenshuai.xi {
3261*53ee8cc1Swenshuai.xi     return _VPU_EX_GetOffsetIdx(u32Id);
3262*53ee8cc1Swenshuai.xi }
3263*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_SetShareInfoAddr(MS_U32 u32Id,MS_VIRT u32ShmAddr)3264*53ee8cc1Swenshuai.xi void HAL_VPU_EX_SetShareInfoAddr(MS_U32 u32Id, MS_VIRT u32ShmAddr)
3265*53ee8cc1Swenshuai.xi {
3266*53ee8cc1Swenshuai.xi     MS_U8 u8Offset = _VPU_EX_GetOffsetIdx(u32Id);
3267*53ee8cc1Swenshuai.xi 
3268*53ee8cc1Swenshuai.xi     if (u32ShmAddr == 0)
3269*53ee8cc1Swenshuai.xi     {
3270*53ee8cc1Swenshuai.xi         pVPUHalContext->u32FWShareInfoAddr[u8Offset] = 0xFFFFFFFFUL;
3271*53ee8cc1Swenshuai.xi     }
3272*53ee8cc1Swenshuai.xi     else
3273*53ee8cc1Swenshuai.xi     {
3274*53ee8cc1Swenshuai.xi         if (u8Offset == 0)
3275*53ee8cc1Swenshuai.xi         {
3276*53ee8cc1Swenshuai.xi             pVPUHalContext->u32FWShareInfoAddr[u8Offset] = u32ShmAddr;
3277*53ee8cc1Swenshuai.xi         }
3278*53ee8cc1Swenshuai.xi         else if (u8Offset == 1)
3279*53ee8cc1Swenshuai.xi         {
3280*53ee8cc1Swenshuai.xi             pVPUHalContext->u32FWShareInfoAddr[u8Offset] = u32ShmAddr + TEE_ONE_TASK_SHM_SIZE;
3281*53ee8cc1Swenshuai.xi         }
3282*53ee8cc1Swenshuai.xi     }
3283*53ee8cc1Swenshuai.xi 
3284*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("set PA ShareInfoAddr[%d] = 0x%lx \n", u8Offset, (unsigned long)pVPUHalContext->u32FWShareInfoAddr[u8Offset]);
3285*53ee8cc1Swenshuai.xi     return;
3286*53ee8cc1Swenshuai.xi }
3287*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetShareInfoAddr(MS_U32 u32Id)3288*53ee8cc1Swenshuai.xi MS_VIRT HAL_VPU_EX_GetShareInfoAddr(MS_U32 u32Id)
3289*53ee8cc1Swenshuai.xi {
3290*53ee8cc1Swenshuai.xi     MS_U8 u8Offset = _VPU_EX_GetOffsetIdx(u32Id);
3291*53ee8cc1Swenshuai.xi 
3292*53ee8cc1Swenshuai.xi     return pVPUHalContext->u32FWShareInfoAddr[u8Offset];
3293*53ee8cc1Swenshuai.xi }
3294*53ee8cc1Swenshuai.xi 
3295*53ee8cc1Swenshuai.xi #if defined(VDEC_FW31)
HAL_VPU_EX_GetVsyncAddrOffset(MS_U32 u32Id)3296*53ee8cc1Swenshuai.xi MS_VIRT HAL_VPU_EX_GetVsyncAddrOffset(MS_U32 u32Id)
3297*53ee8cc1Swenshuai.xi {
3298*53ee8cc1Swenshuai.xi     MS_U8  u8Offset = _VPU_EX_GetOffsetIdx(u32Id);
3299*53ee8cc1Swenshuai.xi     MS_VIRT VPUSHMAddr = HAL_VPU_EX_GetSHMAddr();
3300*53ee8cc1Swenshuai.xi     MS_VIRT VsyncBridgeOffset = 0;
3301*53ee8cc1Swenshuai.xi 
3302*53ee8cc1Swenshuai.xi     if (VPUSHMAddr != 0)  // TEE project
3303*53ee8cc1Swenshuai.xi     {
3304*53ee8cc1Swenshuai.xi         if ((u8Offset == 0) || (u8Offset == 1))
3305*53ee8cc1Swenshuai.xi         {
3306*53ee8cc1Swenshuai.xi             VsyncBridgeOffset = VSYNC_BRIDGE_OFFSET;
3307*53ee8cc1Swenshuai.xi         }
3308*53ee8cc1Swenshuai.xi         else
3309*53ee8cc1Swenshuai.xi         {
3310*53ee8cc1Swenshuai.xi             VsyncBridgeOffset = VSYNC_BRIDGE_NWAY_OFFSET + (u8Offset - 2) * VSYNC_BRIDGE_INFO_SIZE;
3311*53ee8cc1Swenshuai.xi         }
3312*53ee8cc1Swenshuai.xi     }
3313*53ee8cc1Swenshuai.xi     else  // normal project
3314*53ee8cc1Swenshuai.xi     {
3315*53ee8cc1Swenshuai.xi         if ((u8Offset == 0) || (u8Offset == 1))
3316*53ee8cc1Swenshuai.xi         {
3317*53ee8cc1Swenshuai.xi             VsyncBridgeOffset = COMMON_AREA_START + VSYNC_BRIDGE_OFFSET;
3318*53ee8cc1Swenshuai.xi         }
3319*53ee8cc1Swenshuai.xi         else
3320*53ee8cc1Swenshuai.xi         {
3321*53ee8cc1Swenshuai.xi             VsyncBridgeOffset = COMMON_AREA_START + VSYNC_BRIDGE_NWAY_OFFSET + (u8Offset - 2) * VSYNC_BRIDGE_INFO_SIZE;
3322*53ee8cc1Swenshuai.xi         }
3323*53ee8cc1Swenshuai.xi     }
3324*53ee8cc1Swenshuai.xi 
3325*53ee8cc1Swenshuai.xi     return VsyncBridgeOffset;
3326*53ee8cc1Swenshuai.xi }
3327*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetVsyncExtAddrOffset(MS_U32 u32Id)3328*53ee8cc1Swenshuai.xi MS_VIRT HAL_VPU_EX_GetVsyncExtAddrOffset(MS_U32 u32Id)
3329*53ee8cc1Swenshuai.xi {
3330*53ee8cc1Swenshuai.xi     MS_U8  u8Offset = _VPU_EX_GetOffsetIdx(u32Id);
3331*53ee8cc1Swenshuai.xi     MS_VIRT VPUSHMAddr = HAL_VPU_EX_GetSHMAddr();
3332*53ee8cc1Swenshuai.xi     MS_VIRT VsyncBridgeExtOffset = 0;
3333*53ee8cc1Swenshuai.xi 
3334*53ee8cc1Swenshuai.xi     if (VPUSHMAddr != 0)  // TEE project
3335*53ee8cc1Swenshuai.xi     {
3336*53ee8cc1Swenshuai.xi         if ((u8Offset == 0) || (u8Offset == 1))
3337*53ee8cc1Swenshuai.xi         {
3338*53ee8cc1Swenshuai.xi             VsyncBridgeExtOffset = VSYNC_BRIDGE_EXT_OFFSET;
3339*53ee8cc1Swenshuai.xi         }
3340*53ee8cc1Swenshuai.xi         else
3341*53ee8cc1Swenshuai.xi         {
3342*53ee8cc1Swenshuai.xi             VsyncBridgeExtOffset = VSYNC_BRIDGE_EXT_NWAY_OFFSET + (u8Offset - 2) * VSYNC_BRIDGE_INFO_SIZE;
3343*53ee8cc1Swenshuai.xi         }
3344*53ee8cc1Swenshuai.xi     }
3345*53ee8cc1Swenshuai.xi     else  // normal project
3346*53ee8cc1Swenshuai.xi     {
3347*53ee8cc1Swenshuai.xi         if ((u8Offset == 0) || (u8Offset == 1))
3348*53ee8cc1Swenshuai.xi         {
3349*53ee8cc1Swenshuai.xi             VsyncBridgeExtOffset = COMMON_AREA_START + VSYNC_BRIDGE_EXT_OFFSET;
3350*53ee8cc1Swenshuai.xi         }
3351*53ee8cc1Swenshuai.xi         else
3352*53ee8cc1Swenshuai.xi         {
3353*53ee8cc1Swenshuai.xi             VsyncBridgeExtOffset = COMMON_AREA_START + VSYNC_BRIDGE_EXT_NWAY_OFFSET + (u8Offset - 2) * VSYNC_BRIDGE_INFO_SIZE;
3354*53ee8cc1Swenshuai.xi         }
3355*53ee8cc1Swenshuai.xi     }
3356*53ee8cc1Swenshuai.xi 
3357*53ee8cc1Swenshuai.xi     return VsyncBridgeExtOffset;
3358*53ee8cc1Swenshuai.xi }
3359*53ee8cc1Swenshuai.xi #endif
3360*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_IsPowered(void)3361*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_IsPowered(void)
3362*53ee8cc1Swenshuai.xi {
3363*53ee8cc1Swenshuai.xi     return pVPUHalContext->_bVPUPowered;
3364*53ee8cc1Swenshuai.xi }
3365*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_IsRsted(void)3366*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_IsRsted(void)
3367*53ee8cc1Swenshuai.xi {
3368*53ee8cc1Swenshuai.xi     return pVPUHalContext->_bVPURsted;
3369*53ee8cc1Swenshuai.xi }
3370*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_IsEVDR2(void)3371*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_IsEVDR2(void)
3372*53ee8cc1Swenshuai.xi {
3373*53ee8cc1Swenshuai.xi #ifdef EVDR2
3374*53ee8cc1Swenshuai.xi     return TRUE;
3375*53ee8cc1Swenshuai.xi #else
3376*53ee8cc1Swenshuai.xi     return FALSE;
3377*53ee8cc1Swenshuai.xi #endif
3378*53ee8cc1Swenshuai.xi }
3379*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_MVDInUsed(void)3380*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_MVDInUsed(void)
3381*53ee8cc1Swenshuai.xi {
3382*53ee8cc1Swenshuai.xi     //MVD is in used for MVD or HVD_TSP mode.
3383*53ee8cc1Swenshuai.xi     MS_U8 i;
3384*53ee8cc1Swenshuai.xi     MS_U8 u8UseCnt = 0;
3385*53ee8cc1Swenshuai.xi 
3386*53ee8cc1Swenshuai.xi     for (i = 0; i < sizeof(pVPUHalContext->_stVPUStream) / sizeof(pVPUHalContext->_stVPUStream[0]); i++)
3387*53ee8cc1Swenshuai.xi     {
3388*53ee8cc1Swenshuai.xi         if ((pVPUHalContext->_stVPUStream[i].eDecodertype == E_VPU_EX_DECODER_MVD) ||
3389*53ee8cc1Swenshuai.xi #ifdef VDEC3
3390*53ee8cc1Swenshuai.xi             (pVPUHalContext->_stVPUStream[i].eDecodertype == E_VPU_EX_DECODER_EVD) ||
3391*53ee8cc1Swenshuai.xi #endif
3392*53ee8cc1Swenshuai.xi             (pVPUHalContext->_stVPUStream[i].eDecodertype == E_VPU_EX_DECODER_HVD) )
3393*53ee8cc1Swenshuai.xi         {
3394*53ee8cc1Swenshuai.xi             u8UseCnt++;
3395*53ee8cc1Swenshuai.xi         }
3396*53ee8cc1Swenshuai.xi     }
3397*53ee8cc1Swenshuai.xi 
3398*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("MVD u8UseCnt=%d\n", u8UseCnt);
3399*53ee8cc1Swenshuai.xi 
3400*53ee8cc1Swenshuai.xi     if (u8UseCnt != 0)
3401*53ee8cc1Swenshuai.xi     {
3402*53ee8cc1Swenshuai.xi         return TRUE;
3403*53ee8cc1Swenshuai.xi     }
3404*53ee8cc1Swenshuai.xi     else
3405*53ee8cc1Swenshuai.xi     {
3406*53ee8cc1Swenshuai.xi         return FALSE;
3407*53ee8cc1Swenshuai.xi     }
3408*53ee8cc1Swenshuai.xi }
3409*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_HVDInUsed(void)3410*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_HVDInUsed(void)
3411*53ee8cc1Swenshuai.xi {
3412*53ee8cc1Swenshuai.xi     //HVD is in used for HVD or MVD in sub stream.
3413*53ee8cc1Swenshuai.xi     MS_U8 i;
3414*53ee8cc1Swenshuai.xi     MS_U8 u8UseCnt = 0;
3415*53ee8cc1Swenshuai.xi     for (i = 0; i < sizeof(pVPUHalContext->_stVPUStream) / sizeof(pVPUHalContext->_stVPUStream[0]); i++)
3416*53ee8cc1Swenshuai.xi     {
3417*53ee8cc1Swenshuai.xi         if ((E_VPU_EX_DECODER_HVD == pVPUHalContext->_stVPUStream[i].eDecodertype))
3418*53ee8cc1Swenshuai.xi         {
3419*53ee8cc1Swenshuai.xi             u8UseCnt++;
3420*53ee8cc1Swenshuai.xi         }
3421*53ee8cc1Swenshuai.xi     }
3422*53ee8cc1Swenshuai.xi 
3423*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("HVD u8UseCnt=%d\n", u8UseCnt);
3424*53ee8cc1Swenshuai.xi 
3425*53ee8cc1Swenshuai.xi     if (u8UseCnt != 0)
3426*53ee8cc1Swenshuai.xi     {
3427*53ee8cc1Swenshuai.xi         return TRUE;
3428*53ee8cc1Swenshuai.xi     }
3429*53ee8cc1Swenshuai.xi     else
3430*53ee8cc1Swenshuai.xi     {
3431*53ee8cc1Swenshuai.xi         return FALSE;
3432*53ee8cc1Swenshuai.xi     }
3433*53ee8cc1Swenshuai.xi }
3434*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_Mutex_Lock(void)3435*53ee8cc1Swenshuai.xi void HAL_VPU_EX_Mutex_Lock(void)
3436*53ee8cc1Swenshuai.xi {
3437*53ee8cc1Swenshuai.xi     _HAL_VPU_Entry();
3438*53ee8cc1Swenshuai.xi }
3439*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_Mutex_UnLock(void)3440*53ee8cc1Swenshuai.xi void HAL_VPU_EX_Mutex_UnLock(void)
3441*53ee8cc1Swenshuai.xi {
3442*53ee8cc1Swenshuai.xi     _HAL_VPU_Release();
3443*53ee8cc1Swenshuai.xi }
3444*53ee8cc1Swenshuai.xi 
3445*53ee8cc1Swenshuai.xi #ifdef VDEC3
HAL_VPU_EX_EVDInUsed(void)3446*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_EVDInUsed(void)
3447*53ee8cc1Swenshuai.xi {
3448*53ee8cc1Swenshuai.xi     MS_U8 i;
3449*53ee8cc1Swenshuai.xi     MS_U8 u8UseCnt = 0;
3450*53ee8cc1Swenshuai.xi 
3451*53ee8cc1Swenshuai.xi     for (i = 0; i < sizeof(pVPUHalContext->_stVPUStream) / sizeof(pVPUHalContext->_stVPUStream[0]); i++)
3452*53ee8cc1Swenshuai.xi     {
3453*53ee8cc1Swenshuai.xi         if (E_VPU_EX_DECODER_EVD == pVPUHalContext->_stVPUStream[i].eDecodertype)
3454*53ee8cc1Swenshuai.xi         {
3455*53ee8cc1Swenshuai.xi             u8UseCnt++;
3456*53ee8cc1Swenshuai.xi         }
3457*53ee8cc1Swenshuai.xi     }
3458*53ee8cc1Swenshuai.xi 
3459*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("EVD u8UseCnt=%d\n", u8UseCnt);
3460*53ee8cc1Swenshuai.xi 
3461*53ee8cc1Swenshuai.xi     if (u8UseCnt != 0)
3462*53ee8cc1Swenshuai.xi     {
3463*53ee8cc1Swenshuai.xi         return TRUE;
3464*53ee8cc1Swenshuai.xi     }
3465*53ee8cc1Swenshuai.xi     else
3466*53ee8cc1Swenshuai.xi     {
3467*53ee8cc1Swenshuai.xi         return FALSE;
3468*53ee8cc1Swenshuai.xi     }
3469*53ee8cc1Swenshuai.xi }
3470*53ee8cc1Swenshuai.xi 
3471*53ee8cc1Swenshuai.xi #if SUPPORT_G2VP9 && defined(VDEC3)
HAL_VPU_EX_G2VP9InUsed(void)3472*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_G2VP9InUsed(void)
3473*53ee8cc1Swenshuai.xi {
3474*53ee8cc1Swenshuai.xi     MS_U8 i;
3475*53ee8cc1Swenshuai.xi     MS_U8 u8UseCnt = 0;
3476*53ee8cc1Swenshuai.xi 
3477*53ee8cc1Swenshuai.xi     for (i = 0; i < sizeof(pVPUHalContext->_stVPUStream) / sizeof(pVPUHalContext->_stVPUStream[0]); i++)
3478*53ee8cc1Swenshuai.xi     {
3479*53ee8cc1Swenshuai.xi         if (E_VPU_EX_DECODER_G2VP9 == pVPUHalContext->_stVPUStream[i].eDecodertype)
3480*53ee8cc1Swenshuai.xi         {
3481*53ee8cc1Swenshuai.xi             u8UseCnt++;
3482*53ee8cc1Swenshuai.xi         }
3483*53ee8cc1Swenshuai.xi     }
3484*53ee8cc1Swenshuai.xi 
3485*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("G2 VP9 u8UseCnt=%d\n", u8UseCnt);
3486*53ee8cc1Swenshuai.xi 
3487*53ee8cc1Swenshuai.xi     if (u8UseCnt != 0)
3488*53ee8cc1Swenshuai.xi     {
3489*53ee8cc1Swenshuai.xi         return TRUE;
3490*53ee8cc1Swenshuai.xi     }
3491*53ee8cc1Swenshuai.xi     else
3492*53ee8cc1Swenshuai.xi     {
3493*53ee8cc1Swenshuai.xi         return FALSE;
3494*53ee8cc1Swenshuai.xi     }
3495*53ee8cc1Swenshuai.xi }
3496*53ee8cc1Swenshuai.xi #endif
3497*53ee8cc1Swenshuai.xi #endif
3498*53ee8cc1Swenshuai.xi 
3499*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3500*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDbgLevel()
3501*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set debug level
3502*53ee8cc1Swenshuai.xi /// @param -elevel \b IN : debug level
3503*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
HAL_VPU_EX_SetDbgLevel(VPU_EX_UartLevel eLevel)3504*53ee8cc1Swenshuai.xi void HAL_VPU_EX_SetDbgLevel(VPU_EX_UartLevel eLevel)
3505*53ee8cc1Swenshuai.xi {
3506*53ee8cc1Swenshuai.xi     printf("%s eLevel=0x%x\n", __FUNCTION__, eLevel);
3507*53ee8cc1Swenshuai.xi 
3508*53ee8cc1Swenshuai.xi     switch (eLevel)
3509*53ee8cc1Swenshuai.xi     {
3510*53ee8cc1Swenshuai.xi         case E_VPU_EX_UART_LEVEL_ERR:
3511*53ee8cc1Swenshuai.xi         {
3512*53ee8cc1Swenshuai.xi             u32VpuUartCtrl = E_VPU_UART_CTRL_ERR;
3513*53ee8cc1Swenshuai.xi             break;
3514*53ee8cc1Swenshuai.xi         }
3515*53ee8cc1Swenshuai.xi         case E_VPU_EX_UART_LEVEL_INFO:
3516*53ee8cc1Swenshuai.xi         {
3517*53ee8cc1Swenshuai.xi             u32VpuUartCtrl = E_VPU_UART_CTRL_INFO | E_VPU_UART_CTRL_ERR;
3518*53ee8cc1Swenshuai.xi             break;
3519*53ee8cc1Swenshuai.xi         }
3520*53ee8cc1Swenshuai.xi         case E_VPU_EX_UART_LEVEL_DBG:
3521*53ee8cc1Swenshuai.xi         {
3522*53ee8cc1Swenshuai.xi             u32VpuUartCtrl = E_VPU_UART_CTRL_DBG | E_VPU_UART_CTRL_ERR | E_VPU_UART_CTRL_INFO;
3523*53ee8cc1Swenshuai.xi             break;
3524*53ee8cc1Swenshuai.xi         }
3525*53ee8cc1Swenshuai.xi         case E_VPU_EX_UART_LEVEL_TRACE:
3526*53ee8cc1Swenshuai.xi         {
3527*53ee8cc1Swenshuai.xi             u32VpuUartCtrl = E_VPU_UART_CTRL_TRACE | E_VPU_UART_CTRL_ERR | E_VPU_UART_CTRL_INFO | E_VPU_UART_CTRL_DBG;
3528*53ee8cc1Swenshuai.xi             break;
3529*53ee8cc1Swenshuai.xi         }
3530*53ee8cc1Swenshuai.xi         case E_VPU_EX_UART_LEVEL_FW:
3531*53ee8cc1Swenshuai.xi         {
3532*53ee8cc1Swenshuai.xi             u32VpuUartCtrl = E_VPU_UART_CTRL_DISABLE;
3533*53ee8cc1Swenshuai.xi             break;
3534*53ee8cc1Swenshuai.xi         }
3535*53ee8cc1Swenshuai.xi         default:
3536*53ee8cc1Swenshuai.xi         {
3537*53ee8cc1Swenshuai.xi             u32VpuUartCtrl = E_VPU_UART_CTRL_DISABLE;
3538*53ee8cc1Swenshuai.xi             break;
3539*53ee8cc1Swenshuai.xi         }
3540*53ee8cc1Swenshuai.xi     }
3541*53ee8cc1Swenshuai.xi }
3542*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetFWVer(MS_U32 u32Id,VPU_EX_FWVerType eVerType)3543*53ee8cc1Swenshuai.xi MS_U32 HAL_VPU_EX_GetFWVer(MS_U32 u32Id, VPU_EX_FWVerType eVerType)
3544*53ee8cc1Swenshuai.xi {
3545*53ee8cc1Swenshuai.xi     HVD_Return eCtrlRet = E_HVD_RETURN_FAIL;
3546*53ee8cc1Swenshuai.xi     MS_U32 u32CmdArg = (MS_U32)eVerType;
3547*53ee8cc1Swenshuai.xi     MS_U32 u32Version = 0xFFFFFFFF;
3548*53ee8cc1Swenshuai.xi     eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_VERSION, u32CmdArg);
3549*53ee8cc1Swenshuai.xi     if (E_HVD_RETURN_SUCCESS != eCtrlRet)
3550*53ee8cc1Swenshuai.xi     {
3551*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("E_DUAL_VERSION NG eCtrlRet=%x\n", eCtrlRet);
3552*53ee8cc1Swenshuai.xi         return u32Version;
3553*53ee8cc1Swenshuai.xi     }
3554*53ee8cc1Swenshuai.xi 
3555*53ee8cc1Swenshuai.xi     MS_BOOL bRet = false;
3556*53ee8cc1Swenshuai.xi     MS_U32 u32TimeOut = 0xFFFFFFFF;
3557*53ee8cc1Swenshuai.xi 
3558*53ee8cc1Swenshuai.xi     while(--u32TimeOut)
3559*53ee8cc1Swenshuai.xi     {
3560*53ee8cc1Swenshuai.xi         if(HAL_VPU_EX_MBoxRdy(VPU_RISC_MBOX0))
3561*53ee8cc1Swenshuai.xi         {
3562*53ee8cc1Swenshuai.xi             bRet = HAL_VPU_EX_MBoxRead(VPU_RISC_MBOX0, &u32Version);
3563*53ee8cc1Swenshuai.xi             if (false == bRet)
3564*53ee8cc1Swenshuai.xi             {
3565*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("E_DUAL_VERSION NG bRet=%x\n", bRet);
3566*53ee8cc1Swenshuai.xi                 return u32Version;
3567*53ee8cc1Swenshuai.xi             }
3568*53ee8cc1Swenshuai.xi 
3569*53ee8cc1Swenshuai.xi             _VPU_WriteWordMask(  VPU_REG_RISC_MBOX_CLR , VPU_REG_RISC_MBOX0_CLR  , VPU_REG_RISC_MBOX0_CLR);
3570*53ee8cc1Swenshuai.xi             VPU_MSG_DBG("E_DUAL_VERSION arg=%x u32Version = 0x%x\n", u32CmdArg, u32Version);
3571*53ee8cc1Swenshuai.xi             return u32Version;
3572*53ee8cc1Swenshuai.xi         }
3573*53ee8cc1Swenshuai.xi     }
3574*53ee8cc1Swenshuai.xi 
3575*53ee8cc1Swenshuai.xi     VPU_MSG_ERR("get E_DUAL_VERSION=%x timeout", eVerType);
3576*53ee8cc1Swenshuai.xi 
3577*53ee8cc1Swenshuai.xi     return u32Version;
3578*53ee8cc1Swenshuai.xi }
3579*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_NotSupportDS(void)3580*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_NotSupportDS(void)
3581*53ee8cc1Swenshuai.xi {
3582*53ee8cc1Swenshuai.xi     return TRUE;// maserati disable SN DS
3583*53ee8cc1Swenshuai.xi }
3584*53ee8cc1Swenshuai.xi 
3585*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3586*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_VPU_EX_MIU1BASE()
3587*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get VPU MIU base address
3588*53ee8cc1Swenshuai.xi /// @return - vpu MIU1 base
3589*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
HAL_VPU_EX_MIU1BASE(void)3590*53ee8cc1Swenshuai.xi MS_VIRT HAL_VPU_EX_MIU1BASE(void)
3591*53ee8cc1Swenshuai.xi {
3592*53ee8cc1Swenshuai.xi     return VPU_MIU1BASE_ADDR;
3593*53ee8cc1Swenshuai.xi }
3594*53ee8cc1Swenshuai.xi 
3595*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetSHMAddr(void)3596*53ee8cc1Swenshuai.xi MS_VIRT HAL_VPU_EX_GetSHMAddr(void)
3597*53ee8cc1Swenshuai.xi {
3598*53ee8cc1Swenshuai.xi     if (pVPUHalContext->bEnableVPUSecureMode == FALSE)
3599*53ee8cc1Swenshuai.xi     {
3600*53ee8cc1Swenshuai.xi         return 0;
3601*53ee8cc1Swenshuai.xi     }
3602*53ee8cc1Swenshuai.xi     return pVPUHalContext->u32VPUSHMAddr;
3603*53ee8cc1Swenshuai.xi }
HAL_VPU_EX_EnableSecurityMode(MS_BOOL enable)3604*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_EnableSecurityMode(MS_BOOL enable)
3605*53ee8cc1Swenshuai.xi {
3606*53ee8cc1Swenshuai.xi     pVPUHalContext->bEnableVPUSecureMode = enable;
3607*53ee8cc1Swenshuai.xi     return TRUE;
3608*53ee8cc1Swenshuai.xi }
3609*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_CHIP_Capability(void * pHWCap)3610*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_CHIP_Capability(void* pHWCap)
3611*53ee8cc1Swenshuai.xi {
3612*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->u8Cap_Support_Decoder_Num = 2;
3613*53ee8cc1Swenshuai.xi 
3614*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_MPEG2 = TRUE;
3615*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_H263 = TRUE;
3616*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_MPEG4 = TRUE;
3617*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_DIVX311 = TRUE;
3618*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_DIVX412 = TRUE;
3619*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_FLV = TRUE;
3620*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_VC1ADV = TRUE;
3621*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_VC1MAIN = TRUE;
3622*53ee8cc1Swenshuai.xi 
3623*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_RV8 = TRUE;
3624*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_RV9 = TRUE;
3625*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_H264 = TRUE;
3626*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_AVS = TRUE;
3627*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_MJPEG = TRUE;
3628*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_MVC = TRUE;
3629*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_VP8 = TRUE;
3630*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_HEVC = TRUE;
3631*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_VP9 = TRUE;
3632*53ee8cc1Swenshuai.xi     ((VDEC_HwCap*)pHWCap)->bCap_Support_AVS_PLUS = TRUE;
3633*53ee8cc1Swenshuai.xi 
3634*53ee8cc1Swenshuai.xi     return TRUE;
3635*53ee8cc1Swenshuai.xi }
3636*53ee8cc1Swenshuai.xi 
3637*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3638*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_VPU_EX_GetCodecCapInfo()
3639*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get chip codec capability  (for vudu)
3640*53ee8cc1Swenshuai.xi /// @return - success/fail
3641*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
HAL_VPU_EX_GetCodecCapInfo(int eCodecType,VDEC_EX_CODEC_CAP_INFO * pCodecCapInfo)3642*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_GetCodecCapInfo( int eCodecType, VDEC_EX_CODEC_CAP_INFO *pCodecCapInfo)
3643*53ee8cc1Swenshuai.xi {
3644*53ee8cc1Swenshuai.xi #define MAX_CAPABILITY_INFO_NUM 8
3645*53ee8cc1Swenshuai.xi #define MAX_CODEC_TYPE_NUM 18
3646*53ee8cc1Swenshuai.xi 
3647*53ee8cc1Swenshuai.xi     unsigned int capability[MAX_CODEC_TYPE_NUM][MAX_CAPABILITY_INFO_NUM] =
3648*53ee8cc1Swenshuai.xi     {
3649*53ee8cc1Swenshuai.xi             //width, height , frmrate,                                                 profile,                                        level,                                          version                          bit rate    reserved2
3650*53ee8cc1Swenshuai.xi             {    0,    0,      0,     E_VDEC_EX_CODEC_PROFILE_NONE,             E_VDEC_EX_CODEC_LEVEL_NONE,         E_VDEC_EX_CODEC_VERSION_NONE,         0,        0},//E_HVD_EX_CODEC_TYPE_NONE
3651*53ee8cc1Swenshuai.xi             { 1920, 1080,     60,     E_VDEC_EX_CODEC_PROFILE_MP2_MAIN,         E_VDEC_EX_CODEC_LEVEL_MP2_HIGH,     E_VDEC_EX_CODEC_VERSION_NONE,        40,        0},//E_HVD_EX_CODEC_TYPE_MPEG2
3652*53ee8cc1Swenshuai.xi             { 1920, 1080,     60,     E_VDEC_EX_CODEC_PROFILE_H263_BASELINE,    E_VDEC_EX_CODEC_LEVEL_NONE,         E_VDEC_EX_CODEC_VERSION_H263_1,      40,        0},//E_HVD_EX_CODEC_TYPE_H263
3653*53ee8cc1Swenshuai.xi             { 1920, 1080,     60,     E_VDEC_EX_CODEC_PROFILE_MP4_ASP,          E_VDEC_EX_CODEC_LEVEL_MP4_L5,       E_VDEC_EX_CODEC_VERSION_NONE,        40,        0},//E_HVD_EX_CODEC_TYPE_MPEG4
3654*53ee8cc1Swenshuai.xi             { 1920, 1080,     60,     E_VDEC_EX_CODEC_PROFILE_NONE,             E_VDEC_EX_CODEC_LEVEL_NONE,         E_VDEC_EX_CODEC_VERSION_DIVX_311,    40,        0},//E_HVD_EX_CODEC_TYPE_DIVX311
3655*53ee8cc1Swenshuai.xi             { 1920, 1080,     60,     E_VDEC_EX_CODEC_PROFILE_NONE,             E_VDEC_EX_CODEC_LEVEL_NONE,         E_VDEC_EX_CODEC_VERSION_DIVX_6,      40,        0},//E_HVD_EX_CODEC_TYPE_DIVX412
3656*53ee8cc1Swenshuai.xi             { 1920, 1080,     60,     E_VDEC_EX_CODEC_PROFILE_NONE,             E_VDEC_EX_CODEC_LEVEL_NONE,         E_VDEC_EX_CODEC_VERSION_FLV_1,       40,        0},//E_HVD_EX_CODEC_TYPE_FLV
3657*53ee8cc1Swenshuai.xi             { 1920, 1080,     60,     E_VDEC_EX_CODEC_PROFILE_VC1_AP,           E_VDEC_EX_CODEC_LEVEL_VC1_L3,       E_VDEC_EX_CODEC_VERSION_NONE,        40,        0},//E_HVD_EX_CODEC_TYPE_VC1_ADV
3658*53ee8cc1Swenshuai.xi             { 1920, 1080,     60,     E_VDEC_EX_CODEC_PROFILE_RCV_MAIN,         E_VDEC_EX_CODEC_LEVEL_RCV_HIGH,     E_VDEC_EX_CODEC_VERSION_NONE,        40,        0},//E_HVD_EX_CODEC_TYPE_VC1_MAIN (RCV)
3659*53ee8cc1Swenshuai.xi             { 1920, 1080,     60,     E_VDEC_EX_CODEC_PROFILE_NONE,             E_VDEC_EX_CODEC_LEVEL_NONE,         E_VDEC_EX_CODEC_VERSION_NONE,        40,        0},//E_HVD_EX_CODEC_TYPE_RV8
3660*53ee8cc1Swenshuai.xi             { 1920, 1080,     60,     E_VDEC_EX_CODEC_PROFILE_NONE,             E_VDEC_EX_CODEC_LEVEL_NONE,         E_VDEC_EX_CODEC_VERSION_NONE,        40,        0},//E_HVD_EX_CODEC_TYPE_RV9
3661*53ee8cc1Swenshuai.xi             { 4096, 2160,     30,     E_VDEC_EX_CODEC_PROFILE_H264_HIP,         E_VDEC_EX_CODEC_LEVEL_H264_5_1,     E_VDEC_EX_CODEC_VERSION_NONE,       135,        0},//E_HVD_EX_CODEC_TYPE_H264
3662*53ee8cc1Swenshuai.xi             { 1920, 1080,     60,     E_VDEC_EX_CODEC_PROFILE_AVS_BROADCASTING, E_VDEC_EX_CODEC_LEVEL_AVS_6010860,  E_VDEC_EX_CODEC_VERSION_NONE,        50,        0},//E_HVD_EX_CODEC_TYPE_AVS
3663*53ee8cc1Swenshuai.xi             { 1920, 1080,     30,     E_VDEC_EX_CODEC_PROFILE_NONE,             E_VDEC_EX_CODEC_LEVEL_NONE,         E_VDEC_EX_CODEC_VERSION_NONE,        10,        0},//E_HVD_EX_CODEC_TYPE_MJPEG
3664*53ee8cc1Swenshuai.xi             { 1920, 1080,     30,     E_VDEC_EX_CODEC_PROFILE_H264_HIP,         E_VDEC_EX_CODEC_LEVEL_H264_5_1,     E_VDEC_EX_CODEC_VERSION_NONE,        80,        0},//E_HVD_EX_CODEC_TYPE_MVC
3665*53ee8cc1Swenshuai.xi             { 1920, 1080,     30,     E_VDEC_EX_CODEC_PROFILE_NONE,             E_VDEC_EX_CODEC_LEVEL_NONE,         E_VDEC_EX_CODEC_VERSION_NONE,        20,        0},//E_HVD_EX_CODEC_TYPE_VP8
3666*53ee8cc1Swenshuai.xi             { 4096, 2160,     60,     E_VDEC_EX_CODEC_PROFILE_H265_MAIN_10,     E_VDEC_EX_CODEC_LEVEL_H265_5_1_HT,  E_VDEC_EX_CODEC_VERSION_NONE,       160,        0},//E_HVD_EX_CODEC_TYPE_HEVC
3667*53ee8cc1Swenshuai.xi             { 4096, 2160,     60,     E_VDEC_EX_CODEC_PROFILE_VP9_2,            E_VDEC_EX_CODEC_LEVEL_NONE,         E_VDEC_EX_CODEC_VERSION_NONE,       160,        0},//E_HVD_EX_CODEC_TYPE_VP9
3668*53ee8cc1Swenshuai.xi     };
3669*53ee8cc1Swenshuai.xi 
3670*53ee8cc1Swenshuai.xi     if(eCodecType < MAX_CODEC_TYPE_NUM)
3671*53ee8cc1Swenshuai.xi     {
3672*53ee8cc1Swenshuai.xi         pCodecCapInfo->u16CodecCapWidth     = capability[eCodecType][0];
3673*53ee8cc1Swenshuai.xi         pCodecCapInfo->u16CodecCapHeight    = capability[eCodecType][1];
3674*53ee8cc1Swenshuai.xi         pCodecCapInfo->u8CodecCapFrameRate  = capability[eCodecType][2];
3675*53ee8cc1Swenshuai.xi         pCodecCapInfo->u8CodecCapProfile    = capability[eCodecType][3];
3676*53ee8cc1Swenshuai.xi         pCodecCapInfo->u8CodecCapLevel      = capability[eCodecType][4];
3677*53ee8cc1Swenshuai.xi         pCodecCapInfo->u8CodecCapVersion    = capability[eCodecType][5];
3678*53ee8cc1Swenshuai.xi         return TRUE;
3679*53ee8cc1Swenshuai.xi     }
3680*53ee8cc1Swenshuai.xi     else
3681*53ee8cc1Swenshuai.xi     {
3682*53ee8cc1Swenshuai.xi         return FALSE;
3683*53ee8cc1Swenshuai.xi     }
3684*53ee8cc1Swenshuai.xi }
3685*53ee8cc1Swenshuai.xi 
3686*53ee8cc1Swenshuai.xi #ifdef VDEC3
HAL_VPU_EX_SetBBUSetting(MS_U32 u32Id,MS_U32 u32BBUId,VPU_EX_DecoderType eDecType,MS_U8 u8TypeBit)3687*53ee8cc1Swenshuai.xi void HAL_VPU_EX_SetBBUSetting(MS_U32 u32Id, MS_U32 u32BBUId, VPU_EX_DecoderType eDecType, MS_U8 u8TypeBit)
3688*53ee8cc1Swenshuai.xi {
3689*53ee8cc1Swenshuai.xi     (void) u32Id;
3690*53ee8cc1Swenshuai.xi     BBU_STATE *bbu_state;
3691*53ee8cc1Swenshuai.xi 
3692*53ee8cc1Swenshuai.xi     if (   (eDecType == E_VPU_EX_DECODER_MVD)
3693*53ee8cc1Swenshuai.xi         || (eDecType == E_VPU_EX_DECODER_VP8)
3694*53ee8cc1Swenshuai.xi         #if SUPPORT_G2VP9
3695*53ee8cc1Swenshuai.xi         || (eDecType == E_VPU_EX_DECODER_G2VP9)
3696*53ee8cc1Swenshuai.xi         #endif
3697*53ee8cc1Swenshuai.xi        )
3698*53ee8cc1Swenshuai.xi     {
3699*53ee8cc1Swenshuai.xi         // MVD should not call this function.
3700*53ee8cc1Swenshuai.xi         // VP8 and G2_VP9 don't have the concept of BBU, so we just return.
3701*53ee8cc1Swenshuai.xi         return;
3702*53ee8cc1Swenshuai.xi     }
3703*53ee8cc1Swenshuai.xi 
3704*53ee8cc1Swenshuai.xi     switch (eDecType)
3705*53ee8cc1Swenshuai.xi     {
3706*53ee8cc1Swenshuai.xi         case E_VPU_EX_DECODER_EVD:
3707*53ee8cc1Swenshuai.xi             bbu_state = &pVPUHalContext->stEVD_BBU_STATE[0];
3708*53ee8cc1Swenshuai.xi             break;
3709*53ee8cc1Swenshuai.xi         case E_VPU_EX_DECODER_HVD:
3710*53ee8cc1Swenshuai.xi         case E_VPU_EX_DECODER_RVD:
3711*53ee8cc1Swenshuai.xi         case E_VPU_EX_DECODER_MVC:
3712*53ee8cc1Swenshuai.xi         default:
3713*53ee8cc1Swenshuai.xi             bbu_state = &pVPUHalContext->stHVD_BBU_STATE[0];
3714*53ee8cc1Swenshuai.xi             break;
3715*53ee8cc1Swenshuai.xi     }
3716*53ee8cc1Swenshuai.xi 
3717*53ee8cc1Swenshuai.xi     bbu_state[u32BBUId].u8RegSetting |= u8TypeBit;
3718*53ee8cc1Swenshuai.xi     return;
3719*53ee8cc1Swenshuai.xi }
3720*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_CheckBBUSetting(MS_U32 u32Id,MS_U32 u32BBUId,VPU_EX_DecoderType eDecType,MS_U8 u8TypeBit)3721*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_CheckBBUSetting(MS_U32 u32Id, MS_U32 u32BBUId, VPU_EX_DecoderType eDecType, MS_U8 u8TypeBit)
3722*53ee8cc1Swenshuai.xi {
3723*53ee8cc1Swenshuai.xi     (void) u32Id;
3724*53ee8cc1Swenshuai.xi     BBU_STATE *bbu_state;
3725*53ee8cc1Swenshuai.xi 
3726*53ee8cc1Swenshuai.xi     if (   (eDecType == E_VPU_EX_DECODER_MVD)
3727*53ee8cc1Swenshuai.xi         || (eDecType == E_VPU_EX_DECODER_VP8)
3728*53ee8cc1Swenshuai.xi         #if SUPPORT_G2VP9
3729*53ee8cc1Swenshuai.xi         || (eDecType == E_VPU_EX_DECODER_G2VP9)
3730*53ee8cc1Swenshuai.xi         #endif
3731*53ee8cc1Swenshuai.xi        )
3732*53ee8cc1Swenshuai.xi     {
3733*53ee8cc1Swenshuai.xi         // MVD should not call this function.
3734*53ee8cc1Swenshuai.xi         // VP8 and G2_VP9 don't have the concept of BBU, so we just return TRUE and not set related registers.
3735*53ee8cc1Swenshuai.xi         return TRUE;
3736*53ee8cc1Swenshuai.xi     }
3737*53ee8cc1Swenshuai.xi 
3738*53ee8cc1Swenshuai.xi     switch (eDecType)
3739*53ee8cc1Swenshuai.xi     {
3740*53ee8cc1Swenshuai.xi         case E_VPU_EX_DECODER_EVD:
3741*53ee8cc1Swenshuai.xi             bbu_state = &pVPUHalContext->stEVD_BBU_STATE[0];
3742*53ee8cc1Swenshuai.xi             break;
3743*53ee8cc1Swenshuai.xi         case E_VPU_EX_DECODER_HVD:
3744*53ee8cc1Swenshuai.xi         case E_VPU_EX_DECODER_RVD:
3745*53ee8cc1Swenshuai.xi         case E_VPU_EX_DECODER_MVC:
3746*53ee8cc1Swenshuai.xi         default:
3747*53ee8cc1Swenshuai.xi             bbu_state = &pVPUHalContext->stHVD_BBU_STATE[0];
3748*53ee8cc1Swenshuai.xi             break;
3749*53ee8cc1Swenshuai.xi     }
3750*53ee8cc1Swenshuai.xi 
3751*53ee8cc1Swenshuai.xi     return (bbu_state[u32BBUId].u8RegSetting & u8TypeBit);
3752*53ee8cc1Swenshuai.xi }
3753*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_ClearBBUSetting(MS_U32 u32Id,MS_U32 u32BBUId,VPU_EX_DecoderType eDecType)3754*53ee8cc1Swenshuai.xi void HAL_VPU_EX_ClearBBUSetting(MS_U32 u32Id, MS_U32 u32BBUId, VPU_EX_DecoderType eDecType)
3755*53ee8cc1Swenshuai.xi {
3756*53ee8cc1Swenshuai.xi     (void) u32Id;
3757*53ee8cc1Swenshuai.xi     BBU_STATE *bbu_state;
3758*53ee8cc1Swenshuai.xi 
3759*53ee8cc1Swenshuai.xi     if (   (eDecType == E_VPU_EX_DECODER_MVD)
3760*53ee8cc1Swenshuai.xi         || (eDecType == E_VPU_EX_DECODER_VP8)
3761*53ee8cc1Swenshuai.xi         #if SUPPORT_G2VP9
3762*53ee8cc1Swenshuai.xi         || (eDecType == E_VPU_EX_DECODER_G2VP9)
3763*53ee8cc1Swenshuai.xi         #endif
3764*53ee8cc1Swenshuai.xi        )
3765*53ee8cc1Swenshuai.xi     {
3766*53ee8cc1Swenshuai.xi         // MVD should not call this function.
3767*53ee8cc1Swenshuai.xi         // VP8 and G2_VP9 don't have the concept of BBU, so we just return.
3768*53ee8cc1Swenshuai.xi         return;
3769*53ee8cc1Swenshuai.xi     }
3770*53ee8cc1Swenshuai.xi 
3771*53ee8cc1Swenshuai.xi     switch (eDecType)
3772*53ee8cc1Swenshuai.xi     {
3773*53ee8cc1Swenshuai.xi         case E_VPU_EX_DECODER_EVD:
3774*53ee8cc1Swenshuai.xi             bbu_state = &pVPUHalContext->stEVD_BBU_STATE[0];
3775*53ee8cc1Swenshuai.xi             break;
3776*53ee8cc1Swenshuai.xi         case E_VPU_EX_DECODER_HVD:
3777*53ee8cc1Swenshuai.xi         case E_VPU_EX_DECODER_RVD:
3778*53ee8cc1Swenshuai.xi         case E_VPU_EX_DECODER_MVC:
3779*53ee8cc1Swenshuai.xi         default:
3780*53ee8cc1Swenshuai.xi             bbu_state = &pVPUHalContext->stHVD_BBU_STATE[0];
3781*53ee8cc1Swenshuai.xi             break;
3782*53ee8cc1Swenshuai.xi     }
3783*53ee8cc1Swenshuai.xi 
3784*53ee8cc1Swenshuai.xi     if (bbu_state[u32BBUId].u32Used == 0)
3785*53ee8cc1Swenshuai.xi     {
3786*53ee8cc1Swenshuai.xi         bbu_state[u32BBUId].u8RegSetting = 0;
3787*53ee8cc1Swenshuai.xi     }
3788*53ee8cc1Swenshuai.xi 
3789*53ee8cc1Swenshuai.xi     return;
3790*53ee8cc1Swenshuai.xi }
3791*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetBBUId(MS_U32 u32Id,VPU_EX_TaskInfo * pTaskInfo,MS_BOOL bShareBBU)3792*53ee8cc1Swenshuai.xi MS_U32 HAL_VPU_EX_GetBBUId(MS_U32 u32Id, VPU_EX_TaskInfo *pTaskInfo, MS_BOOL bShareBBU)
3793*53ee8cc1Swenshuai.xi {
3794*53ee8cc1Swenshuai.xi     MS_U32 i, max_bbu_cnt;
3795*53ee8cc1Swenshuai.xi     MS_U32 retBBUId = HAL_VPU_INVALID_BBU_ID;
3796*53ee8cc1Swenshuai.xi 
3797*53ee8cc1Swenshuai.xi     if(pTaskInfo == NULL)
3798*53ee8cc1Swenshuai.xi         return retBBUId;
3799*53ee8cc1Swenshuai.xi 
3800*53ee8cc1Swenshuai.xi     BBU_STATE *bbu_state;
3801*53ee8cc1Swenshuai.xi     SLQ_STATE *slq_state = &pVPUHalContext->stMVD_SLQ_STATE[0];
3802*53ee8cc1Swenshuai.xi     MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
3803*53ee8cc1Swenshuai.xi 
3804*53ee8cc1Swenshuai.xi     MS_BOOL bTSP = (pTaskInfo->eSrcType == E_VPU_EX_INPUT_TSP);
3805*53ee8cc1Swenshuai.xi 
3806*53ee8cc1Swenshuai.xi     pVPUHalContext->u8HALId[u8TaskId] = pTaskInfo->u8HalId;
3807*53ee8cc1Swenshuai.xi 
3808*53ee8cc1Swenshuai.xi /*    HVD_EX_MSG_ERR("[%d] DecType=0x%x \n", u32Id & 0xFF, pTaskInfo->eDecType);
3809*53ee8cc1Swenshuai.xi     for(i = 0; i < MAX_MVD_SLQ_COUNT; i++)
3810*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("slq_state[%d] u32Used=0x%x bTSP=%x bUsedbyMVD=%x\n",i,slq_state[i].u32Used,slq_state[i].bTSP,slq_state[i].bUsedbyMVD);
3811*53ee8cc1Swenshuai.xi 
3812*53ee8cc1Swenshuai.xi     for(i = 0; i < MAX_EVD_BBU_COUNT; i++)
3813*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("EVD_BBU_state[%d] u32Used=0x%x bTSP=%x\n",i,pVPUHalContext->stEVD_BBU_STATE[i].u32Used,pVPUHalContext->stEVD_BBU_STATE[i].bTSP);
3814*53ee8cc1Swenshuai.xi 
3815*53ee8cc1Swenshuai.xi     for(i = 0; i < MAX_HVD_BBU_COUNT; i++)
3816*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("HVD_BBU_state[%d] u32Used=0x%x bTSP=%x\n",i,pVPUHalContext->stHVD_BBU_STATE[i].u32Used,pVPUHalContext->stHVD_BBU_STATE[i].bTSP);
3817*53ee8cc1Swenshuai.xi */
3818*53ee8cc1Swenshuai.xi #if 1
3819*53ee8cc1Swenshuai.xi     if(pTaskInfo->eDecType == E_VPU_EX_DECODER_MVD) // MVD case
3820*53ee8cc1Swenshuai.xi     {
3821*53ee8cc1Swenshuai.xi         max_bbu_cnt = MAX_MVD_SLQ_COUNT;
3822*53ee8cc1Swenshuai.xi         if (bTSP)
3823*53ee8cc1Swenshuai.xi         {
3824*53ee8cc1Swenshuai.xi             if ((u8TaskId < MAX_MVD_SLQ_COUNT) && (slq_state[u8TaskId].u32Used == 0))
3825*53ee8cc1Swenshuai.xi             {
3826*53ee8cc1Swenshuai.xi                 VPRINTF("[NDec][0x%x][%d] MVD bTSP, use bbu %d \n", u32Id, u8TaskId, u8TaskId);
3827*53ee8cc1Swenshuai.xi                 slq_state[u8TaskId].u32Used |= (1 << u8TaskId); // Record the HVD use the TSP parser
3828*53ee8cc1Swenshuai.xi                 slq_state[u8TaskId].bTSP = TRUE;
3829*53ee8cc1Swenshuai.xi                 slq_state[u8TaskId].bUsedbyMVD = TRUE;
3830*53ee8cc1Swenshuai.xi                 return u8TaskId;
3831*53ee8cc1Swenshuai.xi             }
3832*53ee8cc1Swenshuai.xi         }
3833*53ee8cc1Swenshuai.xi         else
3834*53ee8cc1Swenshuai.xi         {
3835*53ee8cc1Swenshuai.xi             MS_U32 shared_bbu_idx = HAL_VPU_INVALID_BBU_ID;
3836*53ee8cc1Swenshuai.xi             MS_U32 avaliable_bbu_idx = HAL_VPU_INVALID_BBU_ID;
3837*53ee8cc1Swenshuai.xi             for (i = 0; i < MAX_MVD_SLQ_COUNT; i++)
3838*53ee8cc1Swenshuai.xi             {
3839*53ee8cc1Swenshuai.xi                 if (slq_state[i].u32Used != 0)
3840*53ee8cc1Swenshuai.xi                 {
3841*53ee8cc1Swenshuai.xi                     if (shared_bbu_idx == HAL_VPU_INVALID_BBU_ID && slq_state[i].bTSP == FALSE)
3842*53ee8cc1Swenshuai.xi                     {
3843*53ee8cc1Swenshuai.xi                         shared_bbu_idx = i; // recored the first used MM bbu for sharing
3844*53ee8cc1Swenshuai.xi                     }
3845*53ee8cc1Swenshuai.xi                 }
3846*53ee8cc1Swenshuai.xi                 else if (avaliable_bbu_idx == HAL_VPU_INVALID_BBU_ID)
3847*53ee8cc1Swenshuai.xi                 {
3848*53ee8cc1Swenshuai.xi                     avaliable_bbu_idx = i; // recored the first empty bbu
3849*53ee8cc1Swenshuai.xi                 }
3850*53ee8cc1Swenshuai.xi             }
3851*53ee8cc1Swenshuai.xi 
3852*53ee8cc1Swenshuai.xi             VPRINTF("[NDec][0x%x][%d] MVD bShareBBU %d, shared_bbu %d, avail_bbu %d \n", u32Id, u8TaskId, bShareBBU, shared_bbu_idx, avaliable_bbu_idx);
3853*53ee8cc1Swenshuai.xi 
3854*53ee8cc1Swenshuai.xi             if ((bShareBBU == TRUE) && (shared_bbu_idx != HAL_VPU_INVALID_BBU_ID)) { // In Nstream mode, first priority is sharing bbu
3855*53ee8cc1Swenshuai.xi                 slq_state[shared_bbu_idx].u32Used |= (1 << u8TaskId);
3856*53ee8cc1Swenshuai.xi                 slq_state[shared_bbu_idx].bTSP = FALSE;
3857*53ee8cc1Swenshuai.xi                 slq_state[shared_bbu_idx].bUsedbyMVD = TRUE;
3858*53ee8cc1Swenshuai.xi                 VPRINTF("[NDec][0x%x][%d] MVD shared_bbu %d \n", u32Id, u8TaskId, shared_bbu_idx);
3859*53ee8cc1Swenshuai.xi                 return shared_bbu_idx;
3860*53ee8cc1Swenshuai.xi             }
3861*53ee8cc1Swenshuai.xi             else if (slq_state[u8TaskId].u32Used == FALSE && u8TaskId < max_bbu_cnt) { // 2nd priority is task id
3862*53ee8cc1Swenshuai.xi                 slq_state[u8TaskId].u32Used |= (1 << u8TaskId);
3863*53ee8cc1Swenshuai.xi                 slq_state[u8TaskId].bTSP = FALSE;
3864*53ee8cc1Swenshuai.xi                 slq_state[u8TaskId].bUsedbyMVD = TRUE;
3865*53ee8cc1Swenshuai.xi 
3866*53ee8cc1Swenshuai.xi                 if (bShareBBU == FALSE)
3867*53ee8cc1Swenshuai.xi                 {
3868*53ee8cc1Swenshuai.xi                     slq_state[u8TaskId].bTSP = TRUE;
3869*53ee8cc1Swenshuai.xi                     VPRINTF("[NDec] MVD occupy one BBU_ID \n");
3870*53ee8cc1Swenshuai.xi                 }
3871*53ee8cc1Swenshuai.xi                 VPRINTF("[NDec][0x%x][%d] MVD u8TaskId %d \n", u32Id, u8TaskId, u8TaskId);
3872*53ee8cc1Swenshuai.xi                 return u8TaskId;
3873*53ee8cc1Swenshuai.xi             }
3874*53ee8cc1Swenshuai.xi             else if (avaliable_bbu_idx != HAL_VPU_INVALID_BBU_ID && avaliable_bbu_idx < max_bbu_cnt) { // 3rd priority is avaliable bbu id
3875*53ee8cc1Swenshuai.xi                 slq_state[avaliable_bbu_idx].u32Used |= (1 << u8TaskId);
3876*53ee8cc1Swenshuai.xi                 slq_state[avaliable_bbu_idx].bTSP = FALSE;
3877*53ee8cc1Swenshuai.xi                 slq_state[avaliable_bbu_idx].bUsedbyMVD = TRUE;
3878*53ee8cc1Swenshuai.xi 
3879*53ee8cc1Swenshuai.xi                 if (bShareBBU == FALSE)
3880*53ee8cc1Swenshuai.xi                 {
3881*53ee8cc1Swenshuai.xi                     slq_state[avaliable_bbu_idx].bTSP = TRUE;
3882*53ee8cc1Swenshuai.xi                     VPRINTF("[NDec] MVD occupy one BBU_ID \n");
3883*53ee8cc1Swenshuai.xi                 }
3884*53ee8cc1Swenshuai.xi                 VPRINTF("[NDec][0x%x][%d] MVD avaliable_bbu_idx %d \n", u32Id, u8TaskId, avaliable_bbu_idx);
3885*53ee8cc1Swenshuai.xi                 return avaliable_bbu_idx;
3886*53ee8cc1Swenshuai.xi             }
3887*53ee8cc1Swenshuai.xi             else {
3888*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("ERROR!!! MVD can't get avaliable BBU ID taskId=%d at %s\n", u8TaskId, __FUNCTION__);
3889*53ee8cc1Swenshuai.xi             }
3890*53ee8cc1Swenshuai.xi         }
3891*53ee8cc1Swenshuai.xi     }
3892*53ee8cc1Swenshuai.xi #if SUPPORT_G2VP9
3893*53ee8cc1Swenshuai.xi     else if(pTaskInfo->eDecType == E_VPU_EX_DECODER_G2VP9) // G2_VP9 case
3894*53ee8cc1Swenshuai.xi     {
3895*53ee8cc1Swenshuai.xi         // G2_VP9 don't have the concept of BBU, so we don't need to record the hardware BBU usage situation
3896*53ee8cc1Swenshuai.xi         // Don't care the return value, G2_VP9 will not use it.
3897*53ee8cc1Swenshuai.xi         return 0;
3898*53ee8cc1Swenshuai.xi     }
3899*53ee8cc1Swenshuai.xi #endif
3900*53ee8cc1Swenshuai.xi     else if(pTaskInfo->eDecType == E_VPU_EX_DECODER_VP8) // VP8 case
3901*53ee8cc1Swenshuai.xi     {
3902*53ee8cc1Swenshuai.xi         // G2_VP8 always use the same BBU, so we don't need to record the hardware BBU usage situation
3903*53ee8cc1Swenshuai.xi         // Don't care the return value, VP8 will not use it.
3904*53ee8cc1Swenshuai.xi         MS_U8 u8Offset = _VPU_EX_GetOffsetIdx(u32Id);
3905*53ee8cc1Swenshuai.xi         return u8Offset;
3906*53ee8cc1Swenshuai.xi         //return 0;
3907*53ee8cc1Swenshuai.xi     }
3908*53ee8cc1Swenshuai.xi     else
3909*53ee8cc1Swenshuai.xi     {
3910*53ee8cc1Swenshuai.xi         switch (pTaskInfo->eDecType)
3911*53ee8cc1Swenshuai.xi         {
3912*53ee8cc1Swenshuai.xi             case E_VPU_EX_DECODER_EVD:
3913*53ee8cc1Swenshuai.xi                 max_bbu_cnt = MAX_EVD_BBU_COUNT;
3914*53ee8cc1Swenshuai.xi                 bbu_state = &pVPUHalContext->stEVD_BBU_STATE[0];
3915*53ee8cc1Swenshuai.xi                 break;
3916*53ee8cc1Swenshuai.xi             case E_VPU_EX_DECODER_HVD:
3917*53ee8cc1Swenshuai.xi             case E_VPU_EX_DECODER_RVD:
3918*53ee8cc1Swenshuai.xi             case E_VPU_EX_DECODER_MVC:
3919*53ee8cc1Swenshuai.xi             default:
3920*53ee8cc1Swenshuai.xi                 max_bbu_cnt = MAX_HVD_BBU_COUNT;
3921*53ee8cc1Swenshuai.xi                 bbu_state = &pVPUHalContext->stHVD_BBU_STATE[0];
3922*53ee8cc1Swenshuai.xi                 break;
3923*53ee8cc1Swenshuai.xi         }
3924*53ee8cc1Swenshuai.xi 
3925*53ee8cc1Swenshuai.xi         // FIXME: TSP assume bbu id = u8TaskId, so it does not support N decode. Use the same logic with MM to support it
3926*53ee8cc1Swenshuai.xi         if (bTSP)
3927*53ee8cc1Swenshuai.xi         {
3928*53ee8cc1Swenshuai.xi             if ((u8TaskId < max_bbu_cnt) && (bbu_state[u8TaskId].u32Used == 0) && (slq_state[u8TaskId].u32Used == 0))
3929*53ee8cc1Swenshuai.xi             {
3930*53ee8cc1Swenshuai.xi                 VPRINTF("[NDec][0x%x][%d] bTSP, use bbu %d \n", u32Id, u8TaskId, u8TaskId);
3931*53ee8cc1Swenshuai.xi                 bbu_state[u8TaskId].u32Used |= (1 << u8TaskId);
3932*53ee8cc1Swenshuai.xi                 bbu_state[u8TaskId].bTSP = TRUE;
3933*53ee8cc1Swenshuai.xi                 slq_state[u8TaskId].u32Used |= (1 << u8TaskId); // Record the HVD use the TSP parser
3934*53ee8cc1Swenshuai.xi                 slq_state[u8TaskId].bTSP = TRUE;
3935*53ee8cc1Swenshuai.xi                 slq_state[u8TaskId].bUsedbyMVD = FALSE;
3936*53ee8cc1Swenshuai.xi                 return u8TaskId;
3937*53ee8cc1Swenshuai.xi             }
3938*53ee8cc1Swenshuai.xi         }
3939*53ee8cc1Swenshuai.xi         else
3940*53ee8cc1Swenshuai.xi         {
3941*53ee8cc1Swenshuai.xi             MS_U32 shared_bbu_idx = HAL_VPU_INVALID_BBU_ID;
3942*53ee8cc1Swenshuai.xi             MS_U32 avaliable_bbu_idx = HAL_VPU_INVALID_BBU_ID;
3943*53ee8cc1Swenshuai.xi             for (i = 0; i < max_bbu_cnt; i++)
3944*53ee8cc1Swenshuai.xi             {
3945*53ee8cc1Swenshuai.xi                 if (shared_bbu_idx == HAL_VPU_INVALID_BBU_ID && bbu_state[i].u32Used != 0)
3946*53ee8cc1Swenshuai.xi                 {
3947*53ee8cc1Swenshuai.xi                     if (bbu_state[i].bTSP == FALSE)
3948*53ee8cc1Swenshuai.xi                     {
3949*53ee8cc1Swenshuai.xi                         shared_bbu_idx = i;
3950*53ee8cc1Swenshuai.xi                     }
3951*53ee8cc1Swenshuai.xi                 }
3952*53ee8cc1Swenshuai.xi                 else if (avaliable_bbu_idx == HAL_VPU_INVALID_BBU_ID)
3953*53ee8cc1Swenshuai.xi                 {
3954*53ee8cc1Swenshuai.xi                     avaliable_bbu_idx = i;
3955*53ee8cc1Swenshuai.xi                 }
3956*53ee8cc1Swenshuai.xi             }
3957*53ee8cc1Swenshuai.xi 
3958*53ee8cc1Swenshuai.xi             VPRINTF("[NDec][0x%x][%d] bShareBBU %d, shared_bbu %d, avail_bbu %d \n", u32Id, u8TaskId, bShareBBU, shared_bbu_idx, avaliable_bbu_idx);
3959*53ee8cc1Swenshuai.xi 
3960*53ee8cc1Swenshuai.xi             if ((bShareBBU == TRUE) && (shared_bbu_idx != HAL_VPU_INVALID_BBU_ID)) { // // In Nstream mode, first priority is sharing bbu
3961*53ee8cc1Swenshuai.xi                 bbu_state[shared_bbu_idx].u32Used |= (1 << u8TaskId);
3962*53ee8cc1Swenshuai.xi                 VPRINTF("[NDec][0x%x][%d] shared_bbu %d \n", u32Id, u8TaskId, shared_bbu_idx);
3963*53ee8cc1Swenshuai.xi                 return shared_bbu_idx;
3964*53ee8cc1Swenshuai.xi             }
3965*53ee8cc1Swenshuai.xi             else if (bbu_state[u8TaskId].u32Used == FALSE && u8TaskId < max_bbu_cnt) { // 2nd priority is task id
3966*53ee8cc1Swenshuai.xi                 bbu_state[u8TaskId].u32Used |= (1 << u8TaskId);
3967*53ee8cc1Swenshuai.xi 
3968*53ee8cc1Swenshuai.xi                 if (bShareBBU == FALSE)
3969*53ee8cc1Swenshuai.xi                 {
3970*53ee8cc1Swenshuai.xi                     bbu_state[u8TaskId].bTSP = TRUE;
3971*53ee8cc1Swenshuai.xi                     VPRINTF("[NDec] occupy one BBU_ID \n");
3972*53ee8cc1Swenshuai.xi                 }
3973*53ee8cc1Swenshuai.xi                 VPRINTF("[NDec][0x%x][%d] u8TaskId %d \n", u32Id, u8TaskId, u8TaskId);
3974*53ee8cc1Swenshuai.xi                 return u8TaskId;
3975*53ee8cc1Swenshuai.xi             }
3976*53ee8cc1Swenshuai.xi             else if (avaliable_bbu_idx != HAL_VPU_INVALID_BBU_ID && avaliable_bbu_idx < max_bbu_cnt) { // 3rd priority is avaliable bbu id
3977*53ee8cc1Swenshuai.xi                 bbu_state[avaliable_bbu_idx].u32Used |= (1 << u8TaskId);
3978*53ee8cc1Swenshuai.xi 
3979*53ee8cc1Swenshuai.xi                 if (bShareBBU == FALSE)
3980*53ee8cc1Swenshuai.xi                 {
3981*53ee8cc1Swenshuai.xi                     bbu_state[avaliable_bbu_idx].bTSP = TRUE;
3982*53ee8cc1Swenshuai.xi                     VPRINTF("[NDec] occupy one BBU_ID \n");
3983*53ee8cc1Swenshuai.xi                 }
3984*53ee8cc1Swenshuai.xi                 VPRINTF("[NDec][0x%x][%d] avaliable_bbu_idx %d \n", u32Id, u8TaskId, avaliable_bbu_idx);
3985*53ee8cc1Swenshuai.xi                 return avaliable_bbu_idx;
3986*53ee8cc1Swenshuai.xi             }
3987*53ee8cc1Swenshuai.xi             else {
3988*53ee8cc1Swenshuai.xi                 VPU_MSG_ERR("ERROR!!! can't get avaliable BBU ID taskId=%d at %s\n", u8TaskId, __FUNCTION__);
3989*53ee8cc1Swenshuai.xi             }
3990*53ee8cc1Swenshuai.xi         }
3991*53ee8cc1Swenshuai.xi     }
3992*53ee8cc1Swenshuai.xi #else // The following source code is wiser selecting BBU id. Howerver, it need HW to support and we mark it temporarily.
3993*53ee8cc1Swenshuai.xi     MS_U32 j;
3994*53ee8cc1Swenshuai.xi     MS_BOOL Got = FALSE;
3995*53ee8cc1Swenshuai.xi     if(pTaskInfo->eDecType == E_VPU_EX_DECODER_MVD) // MVD case
3996*53ee8cc1Swenshuai.xi     {
3997*53ee8cc1Swenshuai.xi         for (i = 0; i < MAX_MVD_SLQ_COUNT; i++)
3998*53ee8cc1Swenshuai.xi         {
3999*53ee8cc1Swenshuai.xi             if(slq_state[i].u32Used != 0)
4000*53ee8cc1Swenshuai.xi             {
4001*53ee8cc1Swenshuai.xi                 if(!bTSP && slq_state[i].bTSP == FALSE) // MVD non-first MM case
4002*53ee8cc1Swenshuai.xi                 {
4003*53ee8cc1Swenshuai.xi                         retBBUId = i;
4004*53ee8cc1Swenshuai.xi                         slq_state[retBBUId].u32Used |= (1 << u8TaskId);
4005*53ee8cc1Swenshuai.xi                         slq_state[retBBUId].bTSP = bTSP;
4006*53ee8cc1Swenshuai.xi                         slq_state[retBBUId].bUsedbyMVD = TRUE;
4007*53ee8cc1Swenshuai.xi                         return retBBUId;
4008*53ee8cc1Swenshuai.xi                 }
4009*53ee8cc1Swenshuai.xi             }
4010*53ee8cc1Swenshuai.xi             else if(!Got && slq_state[i].u32Used == 0) // MVD first MM or TS case
4011*53ee8cc1Swenshuai.xi             {
4012*53ee8cc1Swenshuai.xi                 if(i < MAX_EVD_BBU_COUNT) // Trend to select used EVD BBU id
4013*53ee8cc1Swenshuai.xi                 {
4014*53ee8cc1Swenshuai.xi                     if(pVPUHalContext->stEVD_BBU_STATE[i].u32Used != 0 && pVPUHalContext->stEVD_BBU_STATE[i].bTSP == FALSE)
4015*53ee8cc1Swenshuai.xi                     {
4016*53ee8cc1Swenshuai.xi                         Got = TRUE;
4017*53ee8cc1Swenshuai.xi                         retBBUId = i;
4018*53ee8cc1Swenshuai.xi                     }
4019*53ee8cc1Swenshuai.xi                 }
4020*53ee8cc1Swenshuai.xi 
4021*53ee8cc1Swenshuai.xi                 if(!Got && i < MAX_HVD_BBU_COUNT) // Trend to select used HVD BBU id
4022*53ee8cc1Swenshuai.xi                 {
4023*53ee8cc1Swenshuai.xi                     if(pVPUHalContext->stHVD_BBU_STATE[i].u32Used != 0 && pVPUHalContext->stHVD_BBU_STATE[i].bTSP == FALSE)
4024*53ee8cc1Swenshuai.xi                     {
4025*53ee8cc1Swenshuai.xi                         Got = TRUE;
4026*53ee8cc1Swenshuai.xi                         retBBUId = i;
4027*53ee8cc1Swenshuai.xi                     }
4028*53ee8cc1Swenshuai.xi                 }
4029*53ee8cc1Swenshuai.xi 
4030*53ee8cc1Swenshuai.xi                  if(!Got && retBBUId == HAL_VPU_INVALID_BBU_ID) // if no used EVD BBU id, select the first BBU_ID
4031*53ee8cc1Swenshuai.xi                     retBBUId = i;
4032*53ee8cc1Swenshuai.xi             }
4033*53ee8cc1Swenshuai.xi         }
4034*53ee8cc1Swenshuai.xi         if(retBBUId != HAL_VPU_INVALID_BBU_ID)
4035*53ee8cc1Swenshuai.xi         {
4036*53ee8cc1Swenshuai.xi             slq_state[retBBUId].u32Used |= (1 << u8TaskId);
4037*53ee8cc1Swenshuai.xi             slq_state[retBBUId].bTSP = bTSP;
4038*53ee8cc1Swenshuai.xi             slq_state[retBBUId].bUsedbyMVD = TRUE;
4039*53ee8cc1Swenshuai.xi         }
4040*53ee8cc1Swenshuai.xi     }
4041*53ee8cc1Swenshuai.xi     #if SUPPORT_G2VP9
4042*53ee8cc1Swenshuai.xi     else if(pTaskInfo->eDecType == E_VPU_EX_DECODER_G2VP9) // G2_VP9 case
4043*53ee8cc1Swenshuai.xi     {
4044*53ee8cc1Swenshuai.xi         // G2_VP9 don't have the concept of BBU, so we don't need to record the hardware BBU usage situation
4045*53ee8cc1Swenshuai.xi         // Don't care the return value, G2_VP9 will not use it.
4046*53ee8cc1Swenshuai.xi         return 0;
4047*53ee8cc1Swenshuai.xi     }
4048*53ee8cc1Swenshuai.xi     #endif
4049*53ee8cc1Swenshuai.xi     else if(pTaskInfo->eDecType == E_VPU_EX_DECODER_VP8) // VP8 case
4050*53ee8cc1Swenshuai.xi     {
4051*53ee8cc1Swenshuai.xi         // G2_VP8 always use the same BBU, so we don't need to record the hardware BBU usage situation
4052*53ee8cc1Swenshuai.xi         // Don't care the return value, VP8 will not use it.
4053*53ee8cc1Swenshuai.xi         return 0;
4054*53ee8cc1Swenshuai.xi     }
4055*53ee8cc1Swenshuai.xi     else // HVD/EVD case
4056*53ee8cc1Swenshuai.xi     {
4057*53ee8cc1Swenshuai.xi         switch (pTaskInfo->eDecType)
4058*53ee8cc1Swenshuai.xi         {
4059*53ee8cc1Swenshuai.xi             case E_VPU_EX_DECODER_EVD:
4060*53ee8cc1Swenshuai.xi             case E_VPU_EX_DECODER_G2VP9:
4061*53ee8cc1Swenshuai.xi                 max_bbu_cnt = MAX_EVD_BBU_COUNT;
4062*53ee8cc1Swenshuai.xi                 bbu_state = &pVPUHalContext->stEVD_BBU_STATE[0];
4063*53ee8cc1Swenshuai.xi                 break;
4064*53ee8cc1Swenshuai.xi             case E_VPU_EX_DECODER_HVD:
4065*53ee8cc1Swenshuai.xi             case E_VPU_EX_DECODER_RVD:
4066*53ee8cc1Swenshuai.xi             case E_VPU_EX_DECODER_MVC:
4067*53ee8cc1Swenshuai.xi             default:
4068*53ee8cc1Swenshuai.xi                 max_bbu_cnt = MAX_HVD_BBU_COUNT;
4069*53ee8cc1Swenshuai.xi                 bbu_state = &pVPUHalContext->stHVD_BBU_STATE[0];
4070*53ee8cc1Swenshuai.xi                 break;
4071*53ee8cc1Swenshuai.xi         }
4072*53ee8cc1Swenshuai.xi 
4073*53ee8cc1Swenshuai.xi         for (i = 0; i < max_bbu_cnt; i++)
4074*53ee8cc1Swenshuai.xi         {
4075*53ee8cc1Swenshuai.xi             if(bbu_state[i].u32Used != 0)
4076*53ee8cc1Swenshuai.xi             {
4077*53ee8cc1Swenshuai.xi                 if(!bTSP && bbu_state[i].bTSP == FALSE) // HVD/EVD non-first MM case
4078*53ee8cc1Swenshuai.xi                 {
4079*53ee8cc1Swenshuai.xi                         retBBUId = i;
4080*53ee8cc1Swenshuai.xi                         bbu_state[retBBUId].u32Used |= (1 << u8TaskId);
4081*53ee8cc1Swenshuai.xi                         bbu_state[retBBUId].bTSP = bTSP;
4082*53ee8cc1Swenshuai.xi                         return retBBUId;
4083*53ee8cc1Swenshuai.xi                 }
4084*53ee8cc1Swenshuai.xi             }
4085*53ee8cc1Swenshuai.xi             else if(bbu_state[i].u32Used == 0) // HVD/EVD first MM or TS case
4086*53ee8cc1Swenshuai.xi             {
4087*53ee8cc1Swenshuai.xi                 if(i < MAX_MVD_SLQ_COUNT)
4088*53ee8cc1Swenshuai.xi                 {
4089*53ee8cc1Swenshuai.xi                     if(!bTSP) //HVD/EVD first MM case
4090*53ee8cc1Swenshuai.xi                     {
4091*53ee8cc1Swenshuai.xi                         if( slq_state[i].u32Used != 0 && slq_state[i].bUsedbyMVD== TRUE) // HVD/EVD MM will trend to select used MVD SLQ id
4092*53ee8cc1Swenshuai.xi                         {
4093*53ee8cc1Swenshuai.xi                             retBBUId = i;
4094*53ee8cc1Swenshuai.xi                             bbu_state[retBBUId].u32Used |= (1 << u8TaskId);
4095*53ee8cc1Swenshuai.xi                             bbu_state[retBBUId].bTSP = bTSP;
4096*53ee8cc1Swenshuai.xi                             return retBBUId;
4097*53ee8cc1Swenshuai.xi                         }
4098*53ee8cc1Swenshuai.xi 
4099*53ee8cc1Swenshuai.xi                         if(retBBUId == HAL_VPU_INVALID_BBU_ID) // if no used MVD SLQ id, select the first BBU_ID
4100*53ee8cc1Swenshuai.xi                             retBBUId = i;
4101*53ee8cc1Swenshuai.xi                     }
4102*53ee8cc1Swenshuai.xi                     else if(slq_state[i].u32Used == 0) //HVD/EVD TSP case, just find a empty slq id
4103*53ee8cc1Swenshuai.xi                     {
4104*53ee8cc1Swenshuai.xi                         retBBUId = i;
4105*53ee8cc1Swenshuai.xi                         bbu_state[retBBUId].u32Used |= (1 << u8TaskId);
4106*53ee8cc1Swenshuai.xi                         bbu_state[retBBUId].bTSP = bTSP;
4107*53ee8cc1Swenshuai.xi                         slq_state[retBBUId].bUsedbyMVD = FALSE;
4108*53ee8cc1Swenshuai.xi                         slq_state[retBBUId].u32Used |= (1 << u8TaskId);
4109*53ee8cc1Swenshuai.xi                         slq_state[retBBUId].bTSP = bTSP;
4110*53ee8cc1Swenshuai.xi                         return retBBUId;
4111*53ee8cc1Swenshuai.xi                     }
4112*53ee8cc1Swenshuai.xi                 }
4113*53ee8cc1Swenshuai.xi             }
4114*53ee8cc1Swenshuai.xi         }
4115*53ee8cc1Swenshuai.xi         if(retBBUId != HAL_VPU_INVALID_BBU_ID)
4116*53ee8cc1Swenshuai.xi         {
4117*53ee8cc1Swenshuai.xi             bbu_state[retBBUId].u32Used |= (1 << u8TaskId);
4118*53ee8cc1Swenshuai.xi             bbu_state[retBBUId].bTSP = bTSP;
4119*53ee8cc1Swenshuai.xi             if(bTSP)
4120*53ee8cc1Swenshuai.xi             {
4121*53ee8cc1Swenshuai.xi                 slq_state[retBBUId].bUsedbyMVD = FALSE;
4122*53ee8cc1Swenshuai.xi                 slq_state[retBBUId].u32Used |= (1 << u8TaskId);
4123*53ee8cc1Swenshuai.xi                 slq_state[retBBUId].bTSP = bTSP;
4124*53ee8cc1Swenshuai.xi             }
4125*53ee8cc1Swenshuai.xi         }
4126*53ee8cc1Swenshuai.xi     }
4127*53ee8cc1Swenshuai.xi #endif
4128*53ee8cc1Swenshuai.xi     return retBBUId;
4129*53ee8cc1Swenshuai.xi }
4130*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_FreeBBUId(MS_U32 u32Id,MS_U32 u32BBUId,VPU_EX_TaskInfo * pTaskInfo)4131*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_FreeBBUId(MS_U32 u32Id, MS_U32 u32BBUId, VPU_EX_TaskInfo *pTaskInfo)
4132*53ee8cc1Swenshuai.xi {
4133*53ee8cc1Swenshuai.xi     MS_U32 max_bbu_cnt;
4134*53ee8cc1Swenshuai.xi     BBU_STATE *bbu_state;
4135*53ee8cc1Swenshuai.xi     SLQ_STATE *slq_state = &pVPUHalContext->stMVD_SLQ_STATE[0];
4136*53ee8cc1Swenshuai.xi 
4137*53ee8cc1Swenshuai.xi     if(pTaskInfo == NULL)
4138*53ee8cc1Swenshuai.xi         return FALSE;
4139*53ee8cc1Swenshuai.xi     MS_U8 u8TaskId = HAL_VPU_EX_GetTaskId(u32Id);
4140*53ee8cc1Swenshuai.xi     MS_BOOL bTSP = (pTaskInfo->eSrcType == E_VPU_EX_INPUT_TSP);
4141*53ee8cc1Swenshuai.xi 
4142*53ee8cc1Swenshuai.xi     HVD_EX_MSG_DBG("[%d] DecType=0x%x \n", (int)(u32Id & 0xFF), pTaskInfo->eDecType);
4143*53ee8cc1Swenshuai.xi /*  MS_U32 i;
4144*53ee8cc1Swenshuai.xi     for(i = 0; i < MAX_MVD_SLQ_COUNT; i++)
4145*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("slq_state[%d] u32Used=0x%x bTSP=%x bUsedbyMVD=%x\n",i,slq_state[i].u32Used,slq_state[i].bTSP,slq_state[i].bUsedbyMVD);
4146*53ee8cc1Swenshuai.xi 
4147*53ee8cc1Swenshuai.xi     for(i = 0; i < MAX_EVD_BBU_COUNT; i++)
4148*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("EVD_BBU_state[%d] u32Used=0x%x bTSP=%x\n",i,pVPUHalContext->stEVD_BBU_STATE[i].u32Used,pVPUHalContext->stEVD_BBU_STATE[i].bTSP);
4149*53ee8cc1Swenshuai.xi 
4150*53ee8cc1Swenshuai.xi     for(i = 0; i < MAX_HVD_BBU_COUNT; i++)
4151*53ee8cc1Swenshuai.xi         HVD_EX_MSG_ERR("HVD_BBU_state[%d] u32Used=0x%x bTSP=%x\n",i,pVPUHalContext->stHVD_BBU_STATE[i].u32Used,pVPUHalContext->stHVD_BBU_STATE[i].bTSP);
4152*53ee8cc1Swenshuai.xi */
4153*53ee8cc1Swenshuai.xi     if(pTaskInfo->eDecType == E_VPU_EX_DECODER_MVD) // MVD case
4154*53ee8cc1Swenshuai.xi     {
4155*53ee8cc1Swenshuai.xi         // TO DO
4156*53ee8cc1Swenshuai.xi         if(u32BBUId < MAX_MVD_SLQ_COUNT)
4157*53ee8cc1Swenshuai.xi         {
4158*53ee8cc1Swenshuai.xi             slq_state[u32BBUId].u32Used &= ~(1 << u8TaskId); // Record the HVD use the TSP parser
4159*53ee8cc1Swenshuai.xi             slq_state[u32BBUId].bTSP = FALSE;
4160*53ee8cc1Swenshuai.xi             slq_state[u32BBUId].bUsedbyMVD = FALSE;
4161*53ee8cc1Swenshuai.xi             return TRUE;
4162*53ee8cc1Swenshuai.xi         }
4163*53ee8cc1Swenshuai.xi     }
4164*53ee8cc1Swenshuai.xi #if SUPPORT_G2VP9
4165*53ee8cc1Swenshuai.xi     else if(pTaskInfo->eDecType == E_VPU_EX_DECODER_G2VP9) // G2_VP9 case
4166*53ee8cc1Swenshuai.xi     {
4167*53ee8cc1Swenshuai.xi         // G2_VP9 don't have the concept of BBU, so we don't need to record the hardware BBU usage situation
4168*53ee8cc1Swenshuai.xi         return TRUE;
4169*53ee8cc1Swenshuai.xi     }
4170*53ee8cc1Swenshuai.xi #endif
4171*53ee8cc1Swenshuai.xi     else if(pTaskInfo->eDecType == E_VPU_EX_DECODER_VP8) // VP8 case
4172*53ee8cc1Swenshuai.xi     {
4173*53ee8cc1Swenshuai.xi         // G2_VP8 always use the same BBU, so we don't need to record the hardware BBU usage situation
4174*53ee8cc1Swenshuai.xi         return TRUE;
4175*53ee8cc1Swenshuai.xi     }
4176*53ee8cc1Swenshuai.xi     else
4177*53ee8cc1Swenshuai.xi     {
4178*53ee8cc1Swenshuai.xi         switch (pTaskInfo->eDecType)
4179*53ee8cc1Swenshuai.xi         {
4180*53ee8cc1Swenshuai.xi             case E_VPU_EX_DECODER_EVD:
4181*53ee8cc1Swenshuai.xi                 max_bbu_cnt = MAX_EVD_BBU_COUNT;
4182*53ee8cc1Swenshuai.xi                 bbu_state = &pVPUHalContext->stEVD_BBU_STATE[0];
4183*53ee8cc1Swenshuai.xi                 break;
4184*53ee8cc1Swenshuai.xi             case E_VPU_EX_DECODER_HVD:
4185*53ee8cc1Swenshuai.xi             case E_VPU_EX_DECODER_RVD:
4186*53ee8cc1Swenshuai.xi             case E_VPU_EX_DECODER_MVC:
4187*53ee8cc1Swenshuai.xi             default:
4188*53ee8cc1Swenshuai.xi                 max_bbu_cnt = MAX_HVD_BBU_COUNT;
4189*53ee8cc1Swenshuai.xi                 bbu_state = &pVPUHalContext->stHVD_BBU_STATE[0];
4190*53ee8cc1Swenshuai.xi                 break;
4191*53ee8cc1Swenshuai.xi         }
4192*53ee8cc1Swenshuai.xi 
4193*53ee8cc1Swenshuai.xi         if (u32BBUId < max_bbu_cnt)
4194*53ee8cc1Swenshuai.xi         {
4195*53ee8cc1Swenshuai.xi             bbu_state[u32BBUId].u32Used &= ~(1 << u8TaskId);
4196*53ee8cc1Swenshuai.xi             bbu_state[u32BBUId].bTSP = FALSE;
4197*53ee8cc1Swenshuai.xi 
4198*53ee8cc1Swenshuai.xi             if (bTSP)
4199*53ee8cc1Swenshuai.xi             {
4200*53ee8cc1Swenshuai.xi                 slq_state[u32BBUId].u32Used &= ~(1 << u8TaskId); // Record the HVD use the TSP parser
4201*53ee8cc1Swenshuai.xi                 slq_state[u32BBUId].bTSP = FALSE;
4202*53ee8cc1Swenshuai.xi                 slq_state[u32BBUId].bUsedbyMVD = FALSE;
4203*53ee8cc1Swenshuai.xi             }
4204*53ee8cc1Swenshuai.xi 
4205*53ee8cc1Swenshuai.xi             #if 1
4206*53ee8cc1Swenshuai.xi             HAL_VPU_EX_ClearBBUSetting(u32Id, u32BBUId, pTaskInfo->eDecType);
4207*53ee8cc1Swenshuai.xi             #else
4208*53ee8cc1Swenshuai.xi             if (bbu_state[u32BBUId].u32Used == 0)
4209*53ee8cc1Swenshuai.xi             {
4210*53ee8cc1Swenshuai.xi                 bbu_state[u32BBUId].u8RegSetting = 0;  // clear record of both NAL_TBL and ES_BUFFER
4211*53ee8cc1Swenshuai.xi             }
4212*53ee8cc1Swenshuai.xi             #endif
4213*53ee8cc1Swenshuai.xi 
4214*53ee8cc1Swenshuai.xi             return TRUE;
4215*53ee8cc1Swenshuai.xi         }
4216*53ee8cc1Swenshuai.xi     }
4217*53ee8cc1Swenshuai.xi     return FALSE;
4218*53ee8cc1Swenshuai.xi }
4219*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetVBBUVacancy(MS_VIRT u32VBBUAddr)4220*53ee8cc1Swenshuai.xi MS_U32 HAL_VPU_EX_GetVBBUVacancy(MS_VIRT u32VBBUAddr)
4221*53ee8cc1Swenshuai.xi {
4222*53ee8cc1Swenshuai.xi     VDEC_VBBU *pstVBBU = (VDEC_VBBU *)MsOS_PA2KSEG1(pVPUHalContext->u32FWCodeAddr + u32VBBUAddr);
4223*53ee8cc1Swenshuai.xi 
4224*53ee8cc1Swenshuai.xi     if (CHECK_NULL_PTR(pstVBBU))
4225*53ee8cc1Swenshuai.xi         return 0;
4226*53ee8cc1Swenshuai.xi     MS_U32 u32WrPtr = pstVBBU->u32WrPtr;
4227*53ee8cc1Swenshuai.xi     MS_U32 u32RdPtr = pstVBBU->u32RdPtr;
4228*53ee8cc1Swenshuai.xi     MS_U32 u32Vacancy = 0;
4229*53ee8cc1Swenshuai.xi 
4230*53ee8cc1Swenshuai.xi     if (u32WrPtr == u32RdPtr)
4231*53ee8cc1Swenshuai.xi     {
4232*53ee8cc1Swenshuai.xi         u32Vacancy = MAX_VDEC_VBBU_ENTRY_COUNT;
4233*53ee8cc1Swenshuai.xi     }
4234*53ee8cc1Swenshuai.xi     else if (u32WrPtr > u32RdPtr)
4235*53ee8cc1Swenshuai.xi     {
4236*53ee8cc1Swenshuai.xi         u32Vacancy = MAX_VDEC_VBBU_ENTRY_COUNT - (u32WrPtr - u32RdPtr);
4237*53ee8cc1Swenshuai.xi     }
4238*53ee8cc1Swenshuai.xi     else
4239*53ee8cc1Swenshuai.xi     {
4240*53ee8cc1Swenshuai.xi         u32Vacancy = u32RdPtr - u32WrPtr - 1;
4241*53ee8cc1Swenshuai.xi     }
4242*53ee8cc1Swenshuai.xi 
4243*53ee8cc1Swenshuai.xi     return u32Vacancy;
4244*53ee8cc1Swenshuai.xi }
4245*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetInputQueueNum(MS_U32 u32Id)4246*53ee8cc1Swenshuai.xi MS_U32 HAL_VPU_EX_GetInputQueueNum(MS_U32 u32Id)
4247*53ee8cc1Swenshuai.xi {
4248*53ee8cc1Swenshuai.xi     return MAX_VDEC_VBBU_ENTRY_COUNT;
4249*53ee8cc1Swenshuai.xi }
4250*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetFWCodeAddr(MS_U32 u32Id)4251*53ee8cc1Swenshuai.xi MS_PHY HAL_VPU_EX_GetFWCodeAddr(MS_U32 u32Id)
4252*53ee8cc1Swenshuai.xi {
4253*53ee8cc1Swenshuai.xi     return pVPUHalContext->u32FWCodeAddr;
4254*53ee8cc1Swenshuai.xi }
4255*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetESReadPtr(MS_U32 u32Id,MS_VIRT u32VBBUAddr)4256*53ee8cc1Swenshuai.xi MS_VIRT HAL_VPU_EX_GetESReadPtr(MS_U32 u32Id, MS_VIRT u32VBBUAddr)
4257*53ee8cc1Swenshuai.xi {
4258*53ee8cc1Swenshuai.xi     VDEC_VBBU *pstVBBU = (VDEC_VBBU *)MsOS_PA2KSEG1(pVPUHalContext->u32FWCodeAddr + u32VBBUAddr);
4259*53ee8cc1Swenshuai.xi     #if SUPPORT_G2VP9
4260*53ee8cc1Swenshuai.xi     MS_U8 u8OffsetIdx = _VPU_EX_GetOffsetIdx(u32Id);
4261*53ee8cc1Swenshuai.xi     #endif
4262*53ee8cc1Swenshuai.xi 
4263*53ee8cc1Swenshuai.xi     if (CHECK_NULL_PTR(pstVBBU))
4264*53ee8cc1Swenshuai.xi         return FALSE;
4265*53ee8cc1Swenshuai.xi     MsOS_ReadMemory();
4266*53ee8cc1Swenshuai.xi     VDEC_VBBU_Entry *stEntry = (VDEC_VBBU_Entry *) &pstVBBU->stEntry[pstVBBU->u32RdPtr];
4267*53ee8cc1Swenshuai.xi 
4268*53ee8cc1Swenshuai.xi     if(NULL == stEntry)
4269*53ee8cc1Swenshuai.xi     {
4270*53ee8cc1Swenshuai.xi         return 0;
4271*53ee8cc1Swenshuai.xi     }
4272*53ee8cc1Swenshuai.xi 
4273*53ee8cc1Swenshuai.xi //    ALOGE("JJJ1: %d %d %d", pstVBBU->u32RdPtr, pstVBBU->u32WrPtr, stEntry->u32Offset);
4274*53ee8cc1Swenshuai.xi     if (pstVBBU->u32RdPtr == pstVBBU->u32WrPtr)
4275*53ee8cc1Swenshuai.xi     {
4276*53ee8cc1Swenshuai.xi         return HAL_VPU_EX_GetESWritePtr(u32Id, u32VBBUAddr);
4277*53ee8cc1Swenshuai.xi     }
4278*53ee8cc1Swenshuai.xi     else
4279*53ee8cc1Swenshuai.xi     {
4280*53ee8cc1Swenshuai.xi         #if SUPPORT_G2VP9
4281*53ee8cc1Swenshuai.xi         if (E_VPU_EX_DECODER_G2VP9 == pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype)
4282*53ee8cc1Swenshuai.xi         {
4283*53ee8cc1Swenshuai.xi             if (stEntry->u32Offset == 0)
4284*53ee8cc1Swenshuai.xi                 return 0;
4285*53ee8cc1Swenshuai.xi             else
4286*53ee8cc1Swenshuai.xi                 return stEntry->u32Offset - pVPUHalContext->u32BitstreamAddress[u8OffsetIdx];
4287*53ee8cc1Swenshuai.xi         }
4288*53ee8cc1Swenshuai.xi         else
4289*53ee8cc1Swenshuai.xi         #endif
4290*53ee8cc1Swenshuai.xi         {
4291*53ee8cc1Swenshuai.xi             return stEntry->u32Offset;
4292*53ee8cc1Swenshuai.xi         }
4293*53ee8cc1Swenshuai.xi     }
4294*53ee8cc1Swenshuai.xi }
4295*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetESWritePtr(MS_U32 u32Id,MS_VIRT u32VBBUAddr)4296*53ee8cc1Swenshuai.xi MS_VIRT HAL_VPU_EX_GetESWritePtr(MS_U32 u32Id, MS_VIRT u32VBBUAddr)
4297*53ee8cc1Swenshuai.xi {
4298*53ee8cc1Swenshuai.xi     VDEC_VBBU *pstVBBU = (VDEC_VBBU *)MsOS_PA2KSEG1(pVPUHalContext->u32FWCodeAddr + u32VBBUAddr);
4299*53ee8cc1Swenshuai.xi     VDEC_VBBU_Entry *stEntry;
4300*53ee8cc1Swenshuai.xi     #if SUPPORT_G2VP9
4301*53ee8cc1Swenshuai.xi     MS_U8 u8OffsetIdx = _VPU_EX_GetOffsetIdx(u32Id);
4302*53ee8cc1Swenshuai.xi     #endif
4303*53ee8cc1Swenshuai.xi 
4304*53ee8cc1Swenshuai.xi     MsOS_ReadMemory();
4305*53ee8cc1Swenshuai.xi     if (CHECK_NULL_PTR(pstVBBU))
4306*53ee8cc1Swenshuai.xi         return 0;
4307*53ee8cc1Swenshuai.xi     MS_U32 u32WrPtr = pstVBBU->u32WrPtr;
4308*53ee8cc1Swenshuai.xi 
4309*53ee8cc1Swenshuai.xi     if (u32WrPtr == 0)
4310*53ee8cc1Swenshuai.xi         u32WrPtr = MAX_VDEC_VBBU_ENTRY_COUNT;
4311*53ee8cc1Swenshuai.xi     else
4312*53ee8cc1Swenshuai.xi         u32WrPtr--;
4313*53ee8cc1Swenshuai.xi 
4314*53ee8cc1Swenshuai.xi     stEntry = (VDEC_VBBU_Entry*) &pstVBBU->stEntry[u32WrPtr];
4315*53ee8cc1Swenshuai.xi 
4316*53ee8cc1Swenshuai.xi     if(NULL == stEntry)
4317*53ee8cc1Swenshuai.xi     {
4318*53ee8cc1Swenshuai.xi         return 0;
4319*53ee8cc1Swenshuai.xi     }
4320*53ee8cc1Swenshuai.xi 
4321*53ee8cc1Swenshuai.xi     //ALOGE("JJJ2: %d %d %d %d", pstVBBU->u32RdPtr, u32WrPtr, stEntry->u32Offset, stEntry->u32Length);
4322*53ee8cc1Swenshuai.xi     #if SUPPORT_G2VP9
4323*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_G2VP9 == pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype)
4324*53ee8cc1Swenshuai.xi     {
4325*53ee8cc1Swenshuai.xi         if (stEntry->u32Offset == 0)
4326*53ee8cc1Swenshuai.xi             return 0;
4327*53ee8cc1Swenshuai.xi         else
4328*53ee8cc1Swenshuai.xi             return stEntry->u32Offset + stEntry->u32Length - pVPUHalContext->u32BitstreamAddress[u8OffsetIdx];
4329*53ee8cc1Swenshuai.xi     }
4330*53ee8cc1Swenshuai.xi     else
4331*53ee8cc1Swenshuai.xi     #endif
4332*53ee8cc1Swenshuai.xi     {
4333*53ee8cc1Swenshuai.xi         return stEntry->u32Offset + stEntry->u32Length;
4334*53ee8cc1Swenshuai.xi     }
4335*53ee8cc1Swenshuai.xi }
4336*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_Push2VBBU(MS_U32 u32Id,HAL_VPU_EX_PacketInfo * stVpuPkt,MS_VIRT u32VBBUAddr)4337*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_Push2VBBU(MS_U32 u32Id, HAL_VPU_EX_PacketInfo *stVpuPkt, MS_VIRT u32VBBUAddr)
4338*53ee8cc1Swenshuai.xi {
4339*53ee8cc1Swenshuai.xi     VDEC_VBBU *pstVBBU = (VDEC_VBBU *)MsOS_PA2KSEG1(pVPUHalContext->u32FWCodeAddr + u32VBBUAddr);
4340*53ee8cc1Swenshuai.xi     #if SUPPORT_G2VP9
4341*53ee8cc1Swenshuai.xi     MS_U8 u8OffsetIdx = _VPU_EX_GetOffsetIdx(u32Id);
4342*53ee8cc1Swenshuai.xi     #endif
4343*53ee8cc1Swenshuai.xi 
4344*53ee8cc1Swenshuai.xi     if (CHECK_NULL_PTR(pstVBBU) || CHECK_NULL_PTR(stVpuPkt))
4345*53ee8cc1Swenshuai.xi         return FALSE;
4346*53ee8cc1Swenshuai.xi     MsOS_ReadMemory();
4347*53ee8cc1Swenshuai.xi     VDEC_VBBU_Entry *stEntry = (VDEC_VBBU_Entry*) &pstVBBU->stEntry[pstVBBU->u32WrPtr];
4348*53ee8cc1Swenshuai.xi     MS_U32 u32NewWrPtr;
4349*53ee8cc1Swenshuai.xi 
4350*53ee8cc1Swenshuai.xi     u32NewWrPtr = pstVBBU->u32WrPtr + 1;
4351*53ee8cc1Swenshuai.xi     if (u32NewWrPtr == (MAX_VDEC_VBBU_ENTRY_COUNT + 1))
4352*53ee8cc1Swenshuai.xi     {
4353*53ee8cc1Swenshuai.xi         u32NewWrPtr = 0;
4354*53ee8cc1Swenshuai.xi     }
4355*53ee8cc1Swenshuai.xi 
4356*53ee8cc1Swenshuai.xi     if (u32NewWrPtr == pstVBBU->u32RdPtr) return FALSE;
4357*53ee8cc1Swenshuai.xi 
4358*53ee8cc1Swenshuai.xi     stEntry->u32Offset = stVpuPkt->u32Offset;
4359*53ee8cc1Swenshuai.xi 
4360*53ee8cc1Swenshuai.xi     #if SUPPORT_G2VP9
4361*53ee8cc1Swenshuai.xi     if (E_VPU_EX_DECODER_G2VP9 == pVPUHalContext->_stVPUStream[u8OffsetIdx].eDecodertype)
4362*53ee8cc1Swenshuai.xi     {
4363*53ee8cc1Swenshuai.xi         stEntry->u32Offset += pVPUHalContext->u32BitstreamAddress[u8OffsetIdx];
4364*53ee8cc1Swenshuai.xi     }
4365*53ee8cc1Swenshuai.xi     #endif
4366*53ee8cc1Swenshuai.xi 
4367*53ee8cc1Swenshuai.xi     stEntry->u32Length = stVpuPkt->u32Length;
4368*53ee8cc1Swenshuai.xi     stEntry->u64TimeStamp = stVpuPkt->u64TimeStamp;
4369*53ee8cc1Swenshuai.xi     stEntry->u32ID_H = stVpuPkt->u32ID_H;
4370*53ee8cc1Swenshuai.xi     stEntry->u32ID_L = stVpuPkt->u32ID_L;
4371*53ee8cc1Swenshuai.xi     stEntry->u8Version = stVpuPkt->u8Version;
4372*53ee8cc1Swenshuai.xi 
4373*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();//make sure vbbu offset/length already flushed to memory before vbbu wptr advancing
4374*53ee8cc1Swenshuai.xi 
4375*53ee8cc1Swenshuai.xi     pstVBBU->u32WrPtr = u32NewWrPtr;
4376*53ee8cc1Swenshuai.xi 
4377*53ee8cc1Swenshuai.xi     //ALOGE("JJJ3: %d", pstVBBU->u32WrPtr);
4378*53ee8cc1Swenshuai.xi 
4379*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
4380*53ee8cc1Swenshuai.xi 
4381*53ee8cc1Swenshuai.xi     return TRUE;
4382*53ee8cc1Swenshuai.xi }
4383*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_IsVBBUEmpty(MS_VIRT u32VBBUAddr)4384*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_IsVBBUEmpty(MS_VIRT u32VBBUAddr)
4385*53ee8cc1Swenshuai.xi {
4386*53ee8cc1Swenshuai.xi     VDEC_VBBU *pstVBBU = (VDEC_VBBU *)MsOS_PA2KSEG1(pVPUHalContext->u32FWCodeAddr + u32VBBUAddr);
4387*53ee8cc1Swenshuai.xi 
4388*53ee8cc1Swenshuai.xi     if (CHECK_NULL_PTR(pstVBBU))
4389*53ee8cc1Swenshuai.xi         return FALSE;
4390*53ee8cc1Swenshuai.xi     return pstVBBU->u32RdPtr == pstVBBU->u32WrPtr;
4391*53ee8cc1Swenshuai.xi }
4392*53ee8cc1Swenshuai.xi 
4393*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
4394*53ee8cc1Swenshuai.xi /// specify the command send to Mail box or DRAM
4395*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
4396*53ee8cc1Swenshuai.xi ///     - TRUE, Mail box
4397*53ee8cc1Swenshuai.xi ///     - FALSE, Dram
4398*53ee8cc1Swenshuai.xi /// @param u32Cmd \b IN: Command is going to be sned
4399*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_IsMailBoxCMD(MS_U32 u32Cmd)4400*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_IsMailBoxCMD(MS_U32 u32Cmd)
4401*53ee8cc1Swenshuai.xi {
4402*53ee8cc1Swenshuai.xi     MS_BOOL bResult = TRUE;
4403*53ee8cc1Swenshuai.xi 
4404*53ee8cc1Swenshuai.xi     switch (u32Cmd)
4405*53ee8cc1Swenshuai.xi     {
4406*53ee8cc1Swenshuai.xi         // *********** Runtime action Command
4407*53ee8cc1Swenshuai.xi /*        case E_HVD_CMD_RELEASE_DISPQ:
4408*53ee8cc1Swenshuai.xi         case E_HVD_CMD_UPDATE_DISPQ:
4409*53ee8cc1Swenshuai.xi         case E_HVD_CMD_FLUSH_DEC_Q:
4410*53ee8cc1Swenshuai.xi         case E_HVD_CMD_FLUSH:
4411*53ee8cc1Swenshuai.xi         case E_HVD_CMD_PLAY:
4412*53ee8cc1Swenshuai.xi         case E_HVD_CMD_PAUSE:
4413*53ee8cc1Swenshuai.xi         case E_HVD_CMD_STOP:
4414*53ee8cc1Swenshuai.xi         case E_HVD_CMD_STEP_DECODE:
4415*53ee8cc1Swenshuai.xi         case E_HVD_CMD_SKIP_DEC:
4416*53ee8cc1Swenshuai.xi         case E_HVD_CMD_DISP_I_DIRECT:*/
4417*53ee8cc1Swenshuai.xi         // *********** Dual-Stream Create Task Command
4418*53ee8cc1Swenshuai.xi         case E_DUAL_CMD_TASK0_HVD_BBU:
4419*53ee8cc1Swenshuai.xi         case E_DUAL_CMD_TASK0_HVD_TSP:
4420*53ee8cc1Swenshuai.xi         case E_DUAL_CMD_TASK0_MVD_SLQ:
4421*53ee8cc1Swenshuai.xi         case E_DUAL_CMD_TASK0_MVD_TSP:
4422*53ee8cc1Swenshuai.xi         case E_DUAL_CMD_TASK1_HVD_BBU:
4423*53ee8cc1Swenshuai.xi         case E_DUAL_CMD_TASK1_HVD_TSP:
4424*53ee8cc1Swenshuai.xi         case E_DUAL_CMD_MODE:
4425*53ee8cc1Swenshuai.xi #ifndef _WIN32
4426*53ee8cc1Swenshuai.xi         case E_DUAL_CMD_TASK1_MVD_SLQ:
4427*53ee8cc1Swenshuai.xi         case E_DUAL_CMD_TASK1_MVD_TSP:
4428*53ee8cc1Swenshuai.xi #endif
4429*53ee8cc1Swenshuai.xi         case E_DUAL_CMD_DEL_TASK:
4430*53ee8cc1Swenshuai.xi         case E_DUAL_CMD_SINGLE_TASK:
4431*53ee8cc1Swenshuai.xi         case E_DUAL_VERSION:
4432*53ee8cc1Swenshuai.xi         case E_DUAL_R2_CMD_EXIT:
4433*53ee8cc1Swenshuai.xi         case E_DUAL_CMD_STC_MODE:
4434*53ee8cc1Swenshuai.xi #ifdef VDEC3
4435*53ee8cc1Swenshuai.xi         case E_DUAL_R2_CMD_FBADDR:
4436*53ee8cc1Swenshuai.xi         case E_DUAL_R2_CMD_FBSIZE:
4437*53ee8cc1Swenshuai.xi         // *********** N-Streams
4438*53ee8cc1Swenshuai.xi         case E_NST_CMD_TASK_HVD_TSP:
4439*53ee8cc1Swenshuai.xi         case E_NST_CMD_TASK_HVD_BBU:
4440*53ee8cc1Swenshuai.xi         case E_NST_CMD_TASK_MVD_TSP:
4441*53ee8cc1Swenshuai.xi         case E_NST_CMD_TASK_MVD_SLQ:
4442*53ee8cc1Swenshuai.xi         case E_NST_CMD_DEL_TASK:
4443*53ee8cc1Swenshuai.xi         case E_NST_CMD_COMMON_MASK:
4444*53ee8cc1Swenshuai.xi         case E_NST_CMD_COMMON_CMD1:
4445*53ee8cc1Swenshuai.xi #endif
4446*53ee8cc1Swenshuai.xi         case E_DUAL_CMD_COMMON:
4447*53ee8cc1Swenshuai.xi             {
4448*53ee8cc1Swenshuai.xi                 bResult = TRUE;
4449*53ee8cc1Swenshuai.xi             }
4450*53ee8cc1Swenshuai.xi                 break;
4451*53ee8cc1Swenshuai.xi         default:
4452*53ee8cc1Swenshuai.xi             {
4453*53ee8cc1Swenshuai.xi                 bResult = FALSE;
4454*53ee8cc1Swenshuai.xi             }
4455*53ee8cc1Swenshuai.xi             break;
4456*53ee8cc1Swenshuai.xi     }
4457*53ee8cc1Swenshuai.xi 
4458*53ee8cc1Swenshuai.xi     return bResult;
4459*53ee8cc1Swenshuai.xi }
4460*53ee8cc1Swenshuai.xi 
4461*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
4462*53ee8cc1Swenshuai.xi /// specify the command send to Mail box or DRAM
4463*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
4464*53ee8cc1Swenshuai.xi ///     - TRUE, Mail box
4465*53ee8cc1Swenshuai.xi ///     - FALSE, Dram
4466*53ee8cc1Swenshuai.xi /// @param u32Cmd \b IN: Command is going to be sned
4467*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_IsDisplayQueueCMD(MS_U32 u32Cmd)4468*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_IsDisplayQueueCMD(MS_U32 u32Cmd)
4469*53ee8cc1Swenshuai.xi {
4470*53ee8cc1Swenshuai.xi     MS_BOOL bResult = TRUE;
4471*53ee8cc1Swenshuai.xi 
4472*53ee8cc1Swenshuai.xi     switch (u32Cmd)
4473*53ee8cc1Swenshuai.xi     {
4474*53ee8cc1Swenshuai.xi         // *********** Runtime action Command
4475*53ee8cc1Swenshuai.xi         case E_HVD_CMD_RELEASE_DISPQ:
4476*53ee8cc1Swenshuai.xi         case E_HVD_CMD_UPDATE_DISPQ:
4477*53ee8cc1Swenshuai.xi         case E_HVD_CMD_FLUSH_DEC_Q:
4478*53ee8cc1Swenshuai.xi         case E_HVD_CMD_PAUSE:
4479*53ee8cc1Swenshuai.xi         case E_HVD_CMD_FLUSH:
4480*53ee8cc1Swenshuai.xi         case E_HVD_CMD_PLAY:
4481*53ee8cc1Swenshuai.xi         case E_HVD_CMD_STOP:
4482*53ee8cc1Swenshuai.xi         case E_HVD_CMD_SKIP_DEC:
4483*53ee8cc1Swenshuai.xi         case E_HVD_CMD_DISP_I_DIRECT:
4484*53ee8cc1Swenshuai.xi         case E_HVD_CMD_STEP_DECODE:
4485*53ee8cc1Swenshuai.xi         case E_HVD_CMD_INC_DISPQ_NUM:
4486*53ee8cc1Swenshuai.xi         case E_HVD_CMD_DYNAMIC_CONNECT_DISP_PATH:
4487*53ee8cc1Swenshuai.xi             {
4488*53ee8cc1Swenshuai.xi                 bResult = TRUE;
4489*53ee8cc1Swenshuai.xi             }
4490*53ee8cc1Swenshuai.xi                 break;
4491*53ee8cc1Swenshuai.xi         default:
4492*53ee8cc1Swenshuai.xi             {
4493*53ee8cc1Swenshuai.xi                 bResult = FALSE;
4494*53ee8cc1Swenshuai.xi             }
4495*53ee8cc1Swenshuai.xi             break;
4496*53ee8cc1Swenshuai.xi     }
4497*53ee8cc1Swenshuai.xi 
4498*53ee8cc1Swenshuai.xi     return bResult;
4499*53ee8cc1Swenshuai.xi }
4500*53ee8cc1Swenshuai.xi 
4501*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
4502*53ee8cc1Swenshuai.xi /// Send message to HVD stream command queue
4503*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
4504*53ee8cc1Swenshuai.xi ///     - TRUE, Success
4505*53ee8cc1Swenshuai.xi ///     - FALSE, Failed
4506*53ee8cc1Swenshuai.xi /// @param u32DramAddr \b IN: address to be writen
4507*53ee8cc1Swenshuai.xi /// @param u32Msg \b IN: data to be writen
4508*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_DRAMCMDQueueSend(MS_VIRT u32DramAddr,MS_U32 u32Msg)4509*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_DRAMCMDQueueSend(MS_VIRT u32DramAddr, MS_U32 u32Msg)
4510*53ee8cc1Swenshuai.xi {
4511*53ee8cc1Swenshuai.xi     MS_BOOL bResult = TRUE;
4512*53ee8cc1Swenshuai.xi 
4513*53ee8cc1Swenshuai.xi     VPU_MSG_DBG("Send to Command Queue Address=0x%lx, msg=0x%x\n", (unsigned long)u32DramAddr, u32Msg);
4514*53ee8cc1Swenshuai.xi 
4515*53ee8cc1Swenshuai.xi     WRITE_LONG(u32DramAddr,u32Msg);
4516*53ee8cc1Swenshuai.xi 
4517*53ee8cc1Swenshuai.xi     return bResult;
4518*53ee8cc1Swenshuai.xi }
4519*53ee8cc1Swenshuai.xi 
4520*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
4521*53ee8cc1Swenshuai.xi /// Read task share memory to specify that task command queue is empty or not
4522*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
4523*53ee8cc1Swenshuai.xi ///     - TRUE, Empty
4524*53ee8cc1Swenshuai.xi ///     - FALSE, Non empty
4525*53ee8cc1Swenshuai.xi /// @param u32Id \b IN: Task information
4526*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_DRAMCMDQueueIsEmpty(void * cmd_queue)4527*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_DRAMCMDQueueIsEmpty(void *cmd_queue)
4528*53ee8cc1Swenshuai.xi {
4529*53ee8cc1Swenshuai.xi //    HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4530*53ee8cc1Swenshuai.xi     CMD_QUEUE *cmd_q = (CMD_QUEUE *)cmd_queue;
4531*53ee8cc1Swenshuai.xi     if (!cmd_q)
4532*53ee8cc1Swenshuai.xi     {
4533*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Invalid parameter with share memory address=0x%lx %s:%d \n", (unsigned long)cmd_q, __FUNCTION__, __LINE__);
4534*53ee8cc1Swenshuai.xi         return FALSE;
4535*53ee8cc1Swenshuai.xi     }
4536*53ee8cc1Swenshuai.xi 
4537*53ee8cc1Swenshuai.xi     return cmd_q->u32HVD_STREAM_CMDQ_WD == cmd_q->u32HVD_STREAM_CMDQ_RD;
4538*53ee8cc1Swenshuai.xi }
4539*53ee8cc1Swenshuai.xi 
4540*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
4541*53ee8cc1Swenshuai.xi /// Read task share memory to specify that task command queue is full or not
4542*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
4543*53ee8cc1Swenshuai.xi ///     - TRUE, Full
4544*53ee8cc1Swenshuai.xi ///     - FALSE, Non full
4545*53ee8cc1Swenshuai.xi /// @param u32Id \b IN: Task information
4546*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_DRAMCMDQueueIsFull(void * cmd_queue)4547*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_DRAMCMDQueueIsFull(void *cmd_queue)
4548*53ee8cc1Swenshuai.xi {
4549*53ee8cc1Swenshuai.xi //    HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4550*53ee8cc1Swenshuai.xi     CMD_QUEUE *cmd_q = (CMD_QUEUE *)cmd_queue;
4551*53ee8cc1Swenshuai.xi     if (!cmd_q)
4552*53ee8cc1Swenshuai.xi     {
4553*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Invalid parameter with share memory address=0x%lx %s:%d \n", (unsigned long)cmd_q, __FUNCTION__, __LINE__);
4554*53ee8cc1Swenshuai.xi         return TRUE;
4555*53ee8cc1Swenshuai.xi     }
4556*53ee8cc1Swenshuai.xi     MS_U32 NewWD = cmd_q->u32HVD_STREAM_CMDQ_WD + (HVD_DRAM_CMDQ_CMD_SIZE + HVD_DRAM_CMDQ_ARG_SIZE); //preserve one slot
4557*53ee8cc1Swenshuai.xi 
4558*53ee8cc1Swenshuai.xi     if(NewWD >= HVD_CMDQ_DRAM_ST_SIZE)
4559*53ee8cc1Swenshuai.xi         NewWD -= HVD_CMDQ_DRAM_ST_SIZE;
4560*53ee8cc1Swenshuai.xi 
4561*53ee8cc1Swenshuai.xi     return NewWD == cmd_q->u32HVD_STREAM_CMDQ_RD;
4562*53ee8cc1Swenshuai.xi }
4563*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_DRAMStreamCMDQueueSend(MS_U32 u32Id,void * cmd_queue,MS_U8 u8CmdType,MS_U32 u32Msg)4564*53ee8cc1Swenshuai.xi MS_U32 HAL_VPU_EX_DRAMStreamCMDQueueSend(MS_U32 u32Id, void *cmd_queue, MS_U8 u8CmdType, MS_U32 u32Msg)
4565*53ee8cc1Swenshuai.xi {
4566*53ee8cc1Swenshuai.xi     MS_U32 bResult = E_HVD_COMMAND_QUEUE_SEND_FAIL;
4567*53ee8cc1Swenshuai.xi     CMD_QUEUE *cmd_q = (CMD_QUEUE *)cmd_queue;
4568*53ee8cc1Swenshuai.xi     MS_U8 u8TaskID = HAL_VPU_EX_GetTaskId(u32Id);
4569*53ee8cc1Swenshuai.xi 
4570*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
4571*53ee8cc1Swenshuai.xi     if (E_HAL_VPU_MVC_STREAM_BASE == u8TaskID)
4572*53ee8cc1Swenshuai.xi     {
4573*53ee8cc1Swenshuai.xi         u8TaskID = E_HAL_VPU_MAIN_STREAM_BASE;
4574*53ee8cc1Swenshuai.xi     }
4575*53ee8cc1Swenshuai.xi #endif
4576*53ee8cc1Swenshuai.xi 
4577*53ee8cc1Swenshuai.xi     if (CHECK_NULL_PTR(cmd_q))
4578*53ee8cc1Swenshuai.xi     {
4579*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Invalid parameter with share memory address=0x%lx %s:%d \n", (unsigned long)cmd_q, __FUNCTION__, __LINE__);
4580*53ee8cc1Swenshuai.xi         return bResult;
4581*53ee8cc1Swenshuai.xi     }
4582*53ee8cc1Swenshuai.xi     MS_VIRT u32CmdQWdPtr;
4583*53ee8cc1Swenshuai.xi 
4584*53ee8cc1Swenshuai.xi     if (CHECK_NULL_PTR((MS_VIRT)cmd_q->u32HVD_CMDQ_DRAM_ST_ADDR))
4585*53ee8cc1Swenshuai.xi         return E_HVD_COMMAND_QUEUE_NOT_INITIALED;
4586*53ee8cc1Swenshuai.xi 
4587*53ee8cc1Swenshuai.xi     if (HAL_VPU_EX_DRAMCMDQueueIsFull(cmd_q))
4588*53ee8cc1Swenshuai.xi         return E_HVD_COMMAND_QUEUE_FULL;
4589*53ee8cc1Swenshuai.xi     else
4590*53ee8cc1Swenshuai.xi     {
4591*53ee8cc1Swenshuai.xi         u32CmdQWdPtr = MsOS_PA2KSEG1(pVPUHalContext->u32FWCodeAddr + cmd_q->u32HVD_CMDQ_DRAM_ST_ADDR + cmd_q->u32HVD_STREAM_CMDQ_WD);
4592*53ee8cc1Swenshuai.xi     }
4593*53ee8cc1Swenshuai.xi 
4594*53ee8cc1Swenshuai.xi     switch (u8CmdType)
4595*53ee8cc1Swenshuai.xi     {
4596*53ee8cc1Swenshuai.xi         case E_HVD_CMDQ_CMD:
4597*53ee8cc1Swenshuai.xi         {
4598*53ee8cc1Swenshuai.xi             u32Msg |= (u8TaskID << 24);
4599*53ee8cc1Swenshuai.xi             bResult = HAL_VPU_EX_DRAMCMDQueueSend(u32CmdQWdPtr, u32Msg);
4600*53ee8cc1Swenshuai.xi 
4601*53ee8cc1Swenshuai.xi             MsOS_FlushMemory();//make sure u32DISPCMDQWdPtr already flushed to memory
4602*53ee8cc1Swenshuai.xi 
4603*53ee8cc1Swenshuai.xi             if (bResult)
4604*53ee8cc1Swenshuai.xi             {
4605*53ee8cc1Swenshuai.xi                 cmd_q->u32HVD_STREAM_CMDQ_WD += (HVD_DRAM_CMDQ_CMD_SIZE + HVD_DRAM_CMDQ_ARG_SIZE);
4606*53ee8cc1Swenshuai.xi 
4607*53ee8cc1Swenshuai.xi                 if (cmd_q->u32HVD_STREAM_CMDQ_WD == HVD_CMDQ_DRAM_ST_SIZE)
4608*53ee8cc1Swenshuai.xi                     cmd_q->u32HVD_STREAM_CMDQ_WD = 0;
4609*53ee8cc1Swenshuai.xi 
4610*53ee8cc1Swenshuai.xi                 bResult = E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL;
4611*53ee8cc1Swenshuai.xi             }
4612*53ee8cc1Swenshuai.xi             break;
4613*53ee8cc1Swenshuai.xi         }
4614*53ee8cc1Swenshuai.xi         case E_HVD_CMDQ_ARG:
4615*53ee8cc1Swenshuai.xi         {
4616*53ee8cc1Swenshuai.xi             bResult = HAL_VPU_EX_DRAMCMDQueueSend(u32CmdQWdPtr + HVD_DRAM_CMDQ_CMD_SIZE, u32Msg);
4617*53ee8cc1Swenshuai.xi             if (bResult)
4618*53ee8cc1Swenshuai.xi                 bResult = E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL;
4619*53ee8cc1Swenshuai.xi             break;
4620*53ee8cc1Swenshuai.xi         }
4621*53ee8cc1Swenshuai.xi         default:
4622*53ee8cc1Swenshuai.xi         {
4623*53ee8cc1Swenshuai.xi             bResult = E_HVD_COMMAND_QUEUE_SEND_FAIL;
4624*53ee8cc1Swenshuai.xi             break;
4625*53ee8cc1Swenshuai.xi         }
4626*53ee8cc1Swenshuai.xi     }
4627*53ee8cc1Swenshuai.xi 
4628*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
4629*53ee8cc1Swenshuai.xi 
4630*53ee8cc1Swenshuai.xi     return bResult;
4631*53ee8cc1Swenshuai.xi }
4632*53ee8cc1Swenshuai.xi 
4633*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
4634*53ee8cc1Swenshuai.xi /// Read task share memory to specify that task display command queue is empty or not
4635*53ee8cc1Swenshuai.xi /// @return TRUE or FALSE
4636*53ee8cc1Swenshuai.xi ///     - TRUE, Empty
4637*53ee8cc1Swenshuai.xi ///     - FALSE, Non empty
4638*53ee8cc1Swenshuai.xi /// @param u32Id \b IN: Task information
4639*53ee8cc1Swenshuai.xi ///-----------------------------------------------------------------------------
HAL_VPU_EX_DRAMDispCMDQueueIsEmpty(void * cmd_queue)4640*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_DRAMDispCMDQueueIsEmpty(void *cmd_queue)
4641*53ee8cc1Swenshuai.xi {
4642*53ee8cc1Swenshuai.xi //    HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4643*53ee8cc1Swenshuai.xi     CMD_QUEUE *cmd_q = (CMD_QUEUE *) cmd_queue;
4644*53ee8cc1Swenshuai.xi     if (!cmd_q)
4645*53ee8cc1Swenshuai.xi     {
4646*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Invalid parameter with share memory address=0x%lx %s:%d \n", (unsigned long)cmd_q, __FUNCTION__, __LINE__);
4647*53ee8cc1Swenshuai.xi         return FALSE;
4648*53ee8cc1Swenshuai.xi     }
4649*53ee8cc1Swenshuai.xi 
4650*53ee8cc1Swenshuai.xi     return cmd_q->u32HVD_STREAM_DISPCMDQ_WD == cmd_q->u32HVD_STREAM_DISPCMDQ_RD;
4651*53ee8cc1Swenshuai.xi }
4652*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_DRAMDispCMDQueueIsFull(void * cmd_queue)4653*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_DRAMDispCMDQueueIsFull(void *cmd_queue)
4654*53ee8cc1Swenshuai.xi {
4655*53ee8cc1Swenshuai.xi //    HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4656*53ee8cc1Swenshuai.xi     CMD_QUEUE *cmd_q = (CMD_QUEUE *) cmd_queue;
4657*53ee8cc1Swenshuai.xi     if (!cmd_q)
4658*53ee8cc1Swenshuai.xi     {
4659*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Invalid parameter with share memory address=0x%lx %s:%d \n", (unsigned long)cmd_q, __FUNCTION__, __LINE__);
4660*53ee8cc1Swenshuai.xi         return TRUE;
4661*53ee8cc1Swenshuai.xi     }
4662*53ee8cc1Swenshuai.xi 
4663*53ee8cc1Swenshuai.xi     MS_U32 NewWD = cmd_q->u32HVD_STREAM_DISPCMDQ_WD + (HVD_DRAM_CMDQ_CMD_SIZE + HVD_DRAM_CMDQ_ARG_SIZE); //preserve one slot
4664*53ee8cc1Swenshuai.xi 
4665*53ee8cc1Swenshuai.xi     if(NewWD >= HVD_DISPCMDQ_DRAM_ST_SIZE)
4666*53ee8cc1Swenshuai.xi         NewWD -= HVD_DISPCMDQ_DRAM_ST_SIZE;
4667*53ee8cc1Swenshuai.xi 
4668*53ee8cc1Swenshuai.xi     return NewWD == cmd_q->u32HVD_STREAM_DISPCMDQ_RD;
4669*53ee8cc1Swenshuai.xi }
4670*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_DRAMStreamDispCMDQueueSend(MS_U32 u32Id,void * cmd_queue,MS_U8 u8CmdType,MS_U32 u32Msg)4671*53ee8cc1Swenshuai.xi MS_U32 HAL_VPU_EX_DRAMStreamDispCMDQueueSend(MS_U32 u32Id, void *cmd_queue, MS_U8 u8CmdType, MS_U32 u32Msg)
4672*53ee8cc1Swenshuai.xi {
4673*53ee8cc1Swenshuai.xi     HVD_DRAM_COMMAND_QUEUE_SEND_STATUS bResult = E_HVD_COMMAND_QUEUE_SEND_FAIL;
4674*53ee8cc1Swenshuai.xi     CMD_QUEUE *cmd_q = (CMD_QUEUE *)cmd_queue;
4675*53ee8cc1Swenshuai.xi     MS_U8 u8TaskID = HAL_VPU_EX_GetTaskId(u32Id);
4676*53ee8cc1Swenshuai.xi 
4677*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
4678*53ee8cc1Swenshuai.xi     if (E_HAL_VPU_MVC_STREAM_BASE == u8TaskID)
4679*53ee8cc1Swenshuai.xi     {
4680*53ee8cc1Swenshuai.xi         u8TaskID = E_HAL_VPU_MAIN_STREAM_BASE;
4681*53ee8cc1Swenshuai.xi     }
4682*53ee8cc1Swenshuai.xi #endif
4683*53ee8cc1Swenshuai.xi 
4684*53ee8cc1Swenshuai.xi //    HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
4685*53ee8cc1Swenshuai.xi     //HVD_EX_MSG_DBG("DP shmAddr=%X u8TaskID = %X u8CmdType = %X u32Msg = %X\n", pShm, u8TaskID, u8CmdType, u32Msg);
4686*53ee8cc1Swenshuai.xi 
4687*53ee8cc1Swenshuai.xi     if (CHECK_NULL_PTR(cmd_q))
4688*53ee8cc1Swenshuai.xi     {
4689*53ee8cc1Swenshuai.xi         VPU_MSG_ERR("Invalid parameter with share memory address=0x%lx %s:%d \n", (unsigned long)cmd_q, __FUNCTION__, __LINE__);
4690*53ee8cc1Swenshuai.xi         return bResult;
4691*53ee8cc1Swenshuai.xi     }
4692*53ee8cc1Swenshuai.xi 
4693*53ee8cc1Swenshuai.xi     MS_VIRT u32DISPCMDQWdPtr;
4694*53ee8cc1Swenshuai.xi 
4695*53ee8cc1Swenshuai.xi     if (CHECK_NULL_PTR((MS_VIRT)cmd_q->u32HVD_DISPCMDQ_DRAM_ST_ADDR))
4696*53ee8cc1Swenshuai.xi         return E_HVD_COMMAND_QUEUE_NOT_INITIALED;
4697*53ee8cc1Swenshuai.xi 
4698*53ee8cc1Swenshuai.xi     if (HAL_VPU_EX_DRAMDispCMDQueueIsFull(cmd_q))
4699*53ee8cc1Swenshuai.xi         return E_HVD_COMMAND_QUEUE_FULL;
4700*53ee8cc1Swenshuai.xi     else
4701*53ee8cc1Swenshuai.xi     {
4702*53ee8cc1Swenshuai.xi         u32DISPCMDQWdPtr = MsOS_PA2KSEG1(pVPUHalContext->u32FWCodeAddr + cmd_q->u32HVD_DISPCMDQ_DRAM_ST_ADDR + cmd_q->u32HVD_STREAM_DISPCMDQ_WD);
4703*53ee8cc1Swenshuai.xi     }
4704*53ee8cc1Swenshuai.xi 
4705*53ee8cc1Swenshuai.xi     // HVD_EX_MSG_DBG("VDispCmdQ_BASE_ADDR=%X PDispCmsQ_BASE_ADDR=%X u32DISPCMDQWdPtr=%X DISPCMDQ_TOTAL_SIZE = %X\n", cmd_q->u32HVD_DISPCMDQ_DRAM_ST_ADDR, pVPUHalContext->u32FWCodeVAddr + cmd_q->u32HVD_DISPCMDQ_DRAM_ST_ADDR, u32DISPCMDQWdPtr,HVD_DISPCMDQ_DRAM_ST_SIZE);
4706*53ee8cc1Swenshuai.xi 
4707*53ee8cc1Swenshuai.xi     switch (u8CmdType)
4708*53ee8cc1Swenshuai.xi     {
4709*53ee8cc1Swenshuai.xi         case E_HVD_CMDQ_CMD:
4710*53ee8cc1Swenshuai.xi         {
4711*53ee8cc1Swenshuai.xi             u32Msg |= (u8TaskID << 24);
4712*53ee8cc1Swenshuai.xi             bResult = HAL_VPU_EX_DRAMCMDQueueSend(u32DISPCMDQWdPtr, u32Msg);
4713*53ee8cc1Swenshuai.xi 
4714*53ee8cc1Swenshuai.xi             MsOS_FlushMemory();//make sure u32DISPCMDQWdPtr already flushed to memory
4715*53ee8cc1Swenshuai.xi 
4716*53ee8cc1Swenshuai.xi             if (bResult)
4717*53ee8cc1Swenshuai.xi             {
4718*53ee8cc1Swenshuai.xi                 cmd_q->u32HVD_STREAM_DISPCMDQ_WD += (HVD_DRAM_CMDQ_CMD_SIZE + HVD_DRAM_CMDQ_ARG_SIZE);
4719*53ee8cc1Swenshuai.xi 
4720*53ee8cc1Swenshuai.xi                 if (cmd_q->u32HVD_STREAM_DISPCMDQ_WD == HVD_DISPCMDQ_DRAM_ST_SIZE)
4721*53ee8cc1Swenshuai.xi                     cmd_q->u32HVD_STREAM_DISPCMDQ_WD = 0;
4722*53ee8cc1Swenshuai.xi 
4723*53ee8cc1Swenshuai.xi                 bResult = E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL;
4724*53ee8cc1Swenshuai.xi             }
4725*53ee8cc1Swenshuai.xi             break;
4726*53ee8cc1Swenshuai.xi         }
4727*53ee8cc1Swenshuai.xi         case E_HVD_CMDQ_ARG:
4728*53ee8cc1Swenshuai.xi         {
4729*53ee8cc1Swenshuai.xi             bResult = HAL_VPU_EX_DRAMCMDQueueSend(u32DISPCMDQWdPtr + HVD_DRAM_CMDQ_CMD_SIZE, u32Msg);
4730*53ee8cc1Swenshuai.xi             if (bResult)
4731*53ee8cc1Swenshuai.xi                 bResult = E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL;
4732*53ee8cc1Swenshuai.xi             break;
4733*53ee8cc1Swenshuai.xi         }
4734*53ee8cc1Swenshuai.xi         default:
4735*53ee8cc1Swenshuai.xi         {
4736*53ee8cc1Swenshuai.xi             bResult = E_HVD_COMMAND_QUEUE_SEND_FAIL;
4737*53ee8cc1Swenshuai.xi             break;
4738*53ee8cc1Swenshuai.xi         }
4739*53ee8cc1Swenshuai.xi     }
4740*53ee8cc1Swenshuai.xi 
4741*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
4742*53ee8cc1Swenshuai.xi 
4743*53ee8cc1Swenshuai.xi     return bResult;
4744*53ee8cc1Swenshuai.xi }
4745*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_SetBitstreamBufAddress(MS_U32 u32Id,MS_VIRT u32BsAddr)4746*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_SetBitstreamBufAddress(MS_U32 u32Id, MS_VIRT u32BsAddr)
4747*53ee8cc1Swenshuai.xi {
4748*53ee8cc1Swenshuai.xi     MS_U8 u8OffsetIdx = _VPU_EX_GetOffsetIdx(u32Id);
4749*53ee8cc1Swenshuai.xi     MS_U32 u32StAddr;
4750*53ee8cc1Swenshuai.xi     MS_U8 u8TmpMiuSel;
4751*53ee8cc1Swenshuai.xi 
4752*53ee8cc1Swenshuai.xi     _phy_to_miu_offset(u8TmpMiuSel, u32StAddr, u32BsAddr);
4753*53ee8cc1Swenshuai.xi 
4754*53ee8cc1Swenshuai.xi     pVPUHalContext->u32BitstreamAddress[u8OffsetIdx] = u32StAddr;
4755*53ee8cc1Swenshuai.xi 
4756*53ee8cc1Swenshuai.xi     return TRUE;
4757*53ee8cc1Swenshuai.xi }
4758*53ee8cc1Swenshuai.xi #endif
4759*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_DynamicFBMode(MS_BOOL bEnable,MS_PHY u32address,MS_U32 u32Size)4760*53ee8cc1Swenshuai.xi void HAL_VPU_EX_DynamicFBMode(MS_BOOL bEnable,MS_PHY u32address,MS_U32 u32Size)
4761*53ee8cc1Swenshuai.xi {
4762*53ee8cc1Swenshuai.xi     pVPUHalContext->bEnableDymanicFBMode = bEnable;
4763*53ee8cc1Swenshuai.xi 
4764*53ee8cc1Swenshuai.xi     if(u32address >= HAL_MIU1_BASE)
4765*53ee8cc1Swenshuai.xi     {
4766*53ee8cc1Swenshuai.xi         pVPUHalContext->u32DynamicFBAddress = u32address-HAL_MIU1_BASE;
4767*53ee8cc1Swenshuai.xi     }
4768*53ee8cc1Swenshuai.xi     else
4769*53ee8cc1Swenshuai.xi     {
4770*53ee8cc1Swenshuai.xi         pVPUHalContext->u32DynamicFBAddress = u32address;
4771*53ee8cc1Swenshuai.xi     }
4772*53ee8cc1Swenshuai.xi 
4773*53ee8cc1Swenshuai.xi     pVPUHalContext->u32DynamicFBSize = u32Size;
4774*53ee8cc1Swenshuai.xi }
4775*53ee8cc1Swenshuai.xi #ifdef CONFIG_MSTAR_CLKM
HAL_VPU_EX_SetClkManagement(VPU_EX_ClkPortType eClkPortType,MS_BOOL bEnable)4776*53ee8cc1Swenshuai.xi void HAL_VPU_EX_SetClkManagement(VPU_EX_ClkPortType eClkPortType, MS_BOOL bEnable)
4777*53ee8cc1Swenshuai.xi {
4778*53ee8cc1Swenshuai.xi     MS_S32 handle;
4779*53ee8cc1Swenshuai.xi     switch(eClkPortType)
4780*53ee8cc1Swenshuai.xi     {
4781*53ee8cc1Swenshuai.xi         case E_VPU_EX_CLKPORT_MVD:
4782*53ee8cc1Swenshuai.xi         {
4783*53ee8cc1Swenshuai.xi             handle = Drv_Clkm_Get_Handle("g_clk_mvd");
4784*53ee8cc1Swenshuai.xi             if(bEnable)
4785*53ee8cc1Swenshuai.xi             {
4786*53ee8cc1Swenshuai.xi                 Drv_Clkm_Set_Clk_Source(handle, "FAST_MODE");
4787*53ee8cc1Swenshuai.xi             }
4788*53ee8cc1Swenshuai.xi             else
4789*53ee8cc1Swenshuai.xi             {
4790*53ee8cc1Swenshuai.xi                 Drv_Clkm_Clk_Gate_Disable(handle);
4791*53ee8cc1Swenshuai.xi             }
4792*53ee8cc1Swenshuai.xi             break;
4793*53ee8cc1Swenshuai.xi         }
4794*53ee8cc1Swenshuai.xi         case E_VPU_EX_CLKPORT_MVD_CORE:
4795*53ee8cc1Swenshuai.xi         {
4796*53ee8cc1Swenshuai.xi             handle = Drv_Clkm_Get_Handle("g_clk_mvd_core");
4797*53ee8cc1Swenshuai.xi             if(bEnable)
4798*53ee8cc1Swenshuai.xi             {
4799*53ee8cc1Swenshuai.xi                 Drv_Clkm_Set_Clk_Source(handle, "");
4800*53ee8cc1Swenshuai.xi             }
4801*53ee8cc1Swenshuai.xi             else
4802*53ee8cc1Swenshuai.xi             {
4803*53ee8cc1Swenshuai.xi                 Drv_Clkm_Clk_Gate_Disable(handle);
4804*53ee8cc1Swenshuai.xi             }
4805*53ee8cc1Swenshuai.xi             break;
4806*53ee8cc1Swenshuai.xi         }
4807*53ee8cc1Swenshuai.xi         case E_VPU_EX_CLKPORT_MVD_PAS:
4808*53ee8cc1Swenshuai.xi         {
4809*53ee8cc1Swenshuai.xi             handle = Drv_Clkm_Get_Handle("g_clk_mvd_pas");
4810*53ee8cc1Swenshuai.xi             if(bEnable)
4811*53ee8cc1Swenshuai.xi             {
4812*53ee8cc1Swenshuai.xi                 Drv_Clkm_Set_Clk_Source(handle, "");
4813*53ee8cc1Swenshuai.xi             }
4814*53ee8cc1Swenshuai.xi             else
4815*53ee8cc1Swenshuai.xi             {
4816*53ee8cc1Swenshuai.xi                 Drv_Clkm_Clk_Gate_Disable(handle);
4817*53ee8cc1Swenshuai.xi             }
4818*53ee8cc1Swenshuai.xi             break;
4819*53ee8cc1Swenshuai.xi         }
4820*53ee8cc1Swenshuai.xi         case E_VPU_EX_CLKPORT_HVD:
4821*53ee8cc1Swenshuai.xi         {
4822*53ee8cc1Swenshuai.xi             handle = Drv_Clkm_Get_Handle("g_clk_hvd");
4823*53ee8cc1Swenshuai.xi             if(bEnable)
4824*53ee8cc1Swenshuai.xi             {
4825*53ee8cc1Swenshuai.xi                 Drv_Clkm_Set_Clk_Source(handle, "FAST_MODE");
4826*53ee8cc1Swenshuai.xi             }
4827*53ee8cc1Swenshuai.xi             else
4828*53ee8cc1Swenshuai.xi             {
4829*53ee8cc1Swenshuai.xi                 Drv_Clkm_Clk_Gate_Disable(handle);
4830*53ee8cc1Swenshuai.xi             }
4831*53ee8cc1Swenshuai.xi             break;
4832*53ee8cc1Swenshuai.xi         }
4833*53ee8cc1Swenshuai.xi         case E_VPU_EX_CLKPORT_HVD_IDB:
4834*53ee8cc1Swenshuai.xi         {
4835*53ee8cc1Swenshuai.xi             handle = Drv_Clkm_Get_Handle("g_clk_hvd_idb");
4836*53ee8cc1Swenshuai.xi             if(bEnable)
4837*53ee8cc1Swenshuai.xi             {
4838*53ee8cc1Swenshuai.xi                 Drv_Clkm_Set_Clk_Source(handle, "FAST_MODE");
4839*53ee8cc1Swenshuai.xi             }
4840*53ee8cc1Swenshuai.xi             else
4841*53ee8cc1Swenshuai.xi             {
4842*53ee8cc1Swenshuai.xi                 Drv_Clkm_Clk_Gate_Disable(handle);
4843*53ee8cc1Swenshuai.xi             }
4844*53ee8cc1Swenshuai.xi             break;
4845*53ee8cc1Swenshuai.xi         }
4846*53ee8cc1Swenshuai.xi         case E_VPU_EX_CLKPORT_HVD_AEC:
4847*53ee8cc1Swenshuai.xi         {
4848*53ee8cc1Swenshuai.xi             handle = Drv_Clkm_Get_Handle("g_clk_hvd_aec");
4849*53ee8cc1Swenshuai.xi             if(bEnable)
4850*53ee8cc1Swenshuai.xi             {
4851*53ee8cc1Swenshuai.xi                 Drv_Clkm_Set_Clk_Source(handle, "FAST_MODE");
4852*53ee8cc1Swenshuai.xi             }
4853*53ee8cc1Swenshuai.xi             else
4854*53ee8cc1Swenshuai.xi             {
4855*53ee8cc1Swenshuai.xi                 Drv_Clkm_Clk_Gate_Disable(handle);
4856*53ee8cc1Swenshuai.xi             }
4857*53ee8cc1Swenshuai.xi             break;
4858*53ee8cc1Swenshuai.xi         }
4859*53ee8cc1Swenshuai.xi         case E_VPU_EX_CLKPORT_HVD_AEC_LITE:
4860*53ee8cc1Swenshuai.xi         {
4861*53ee8cc1Swenshuai.xi             handle = Drv_Clkm_Get_Handle("g_clk_hvd_aec_lite");
4862*53ee8cc1Swenshuai.xi             if(bEnable)
4863*53ee8cc1Swenshuai.xi             {
4864*53ee8cc1Swenshuai.xi                 Drv_Clkm_Set_Clk_Source(handle, "FAST_MODE");
4865*53ee8cc1Swenshuai.xi             }
4866*53ee8cc1Swenshuai.xi             else
4867*53ee8cc1Swenshuai.xi             {
4868*53ee8cc1Swenshuai.xi                 Drv_Clkm_Clk_Gate_Disable(handle);
4869*53ee8cc1Swenshuai.xi             }
4870*53ee8cc1Swenshuai.xi             break;
4871*53ee8cc1Swenshuai.xi         }
4872*53ee8cc1Swenshuai.xi         case E_VPU_EX_CLKPORT_VP8:
4873*53ee8cc1Swenshuai.xi         {
4874*53ee8cc1Swenshuai.xi             handle = Drv_Clkm_Get_Handle("g_clk_vp8");
4875*53ee8cc1Swenshuai.xi             if(bEnable)
4876*53ee8cc1Swenshuai.xi             {
4877*53ee8cc1Swenshuai.xi                 Drv_Clkm_Set_Clk_Source(handle, "FAST_MODE");
4878*53ee8cc1Swenshuai.xi             }
4879*53ee8cc1Swenshuai.xi             else
4880*53ee8cc1Swenshuai.xi             {
4881*53ee8cc1Swenshuai.xi                 Drv_Clkm_Clk_Gate_Disable(handle);
4882*53ee8cc1Swenshuai.xi             }
4883*53ee8cc1Swenshuai.xi             break;
4884*53ee8cc1Swenshuai.xi         }
4885*53ee8cc1Swenshuai.xi         case E_VPU_EX_CLKPORT_EVD:
4886*53ee8cc1Swenshuai.xi         {
4887*53ee8cc1Swenshuai.xi             handle = Drv_Clkm_Get_Handle("g_clk_evd");
4888*53ee8cc1Swenshuai.xi             if(bEnable)
4889*53ee8cc1Swenshuai.xi             {
4890*53ee8cc1Swenshuai.xi                 Drv_Clkm_Set_Clk_Source(handle, "FAST_MODE");
4891*53ee8cc1Swenshuai.xi             }
4892*53ee8cc1Swenshuai.xi             else
4893*53ee8cc1Swenshuai.xi             {
4894*53ee8cc1Swenshuai.xi                 Drv_Clkm_Clk_Gate_Disable(handle);
4895*53ee8cc1Swenshuai.xi             }
4896*53ee8cc1Swenshuai.xi             break;
4897*53ee8cc1Swenshuai.xi         }
4898*53ee8cc1Swenshuai.xi         case E_VPU_EX_CLKPORT_EVD_PPU:
4899*53ee8cc1Swenshuai.xi         {
4900*53ee8cc1Swenshuai.xi             handle = Drv_Clkm_Get_Handle("g_clk_evd_ppu");
4901*53ee8cc1Swenshuai.xi             if(bEnable)
4902*53ee8cc1Swenshuai.xi             {
4903*53ee8cc1Swenshuai.xi                 Drv_Clkm_Set_Clk_Source(handle, "FAST_MODE");
4904*53ee8cc1Swenshuai.xi             }
4905*53ee8cc1Swenshuai.xi             else
4906*53ee8cc1Swenshuai.xi             {
4907*53ee8cc1Swenshuai.xi                 Drv_Clkm_Clk_Gate_Disable(handle);
4908*53ee8cc1Swenshuai.xi             }
4909*53ee8cc1Swenshuai.xi             break;
4910*53ee8cc1Swenshuai.xi         }
4911*53ee8cc1Swenshuai.xi         case E_VPU_EX_CLKPORT_EVD_LITE:
4912*53ee8cc1Swenshuai.xi         {
4913*53ee8cc1Swenshuai.xi             handle = Drv_Clkm_Get_Handle("g_clk_evd_lite");
4914*53ee8cc1Swenshuai.xi             if(bEnable)
4915*53ee8cc1Swenshuai.xi             {
4916*53ee8cc1Swenshuai.xi                 Drv_Clkm_Set_Clk_Source(handle, "FAST_MODE");
4917*53ee8cc1Swenshuai.xi             }
4918*53ee8cc1Swenshuai.xi             else
4919*53ee8cc1Swenshuai.xi             {
4920*53ee8cc1Swenshuai.xi                 Drv_Clkm_Clk_Gate_Disable(handle);
4921*53ee8cc1Swenshuai.xi             }
4922*53ee8cc1Swenshuai.xi             break;
4923*53ee8cc1Swenshuai.xi         }
4924*53ee8cc1Swenshuai.xi         case E_VPU_EX_CLKPORT_EVD_PPU_LITE:
4925*53ee8cc1Swenshuai.xi         {
4926*53ee8cc1Swenshuai.xi             handle = Drv_Clkm_Get_Handle("g_clk_evd_ppu_lite");
4927*53ee8cc1Swenshuai.xi             if(bEnable)
4928*53ee8cc1Swenshuai.xi             {
4929*53ee8cc1Swenshuai.xi                 Drv_Clkm_Set_Clk_Source(handle, "FAST_MODE");
4930*53ee8cc1Swenshuai.xi             }
4931*53ee8cc1Swenshuai.xi             else
4932*53ee8cc1Swenshuai.xi             {
4933*53ee8cc1Swenshuai.xi                 Drv_Clkm_Clk_Gate_Disable(handle);
4934*53ee8cc1Swenshuai.xi             }
4935*53ee8cc1Swenshuai.xi             break;
4936*53ee8cc1Swenshuai.xi         }
4937*53ee8cc1Swenshuai.xi         case E_VPU_EX_CLKPORT_VD_MHEG5:
4938*53ee8cc1Swenshuai.xi         {
4939*53ee8cc1Swenshuai.xi             handle = Drv_Clkm_Get_Handle("g_clk_vd_mheg5");
4940*53ee8cc1Swenshuai.xi             if(bEnable)
4941*53ee8cc1Swenshuai.xi             {
4942*53ee8cc1Swenshuai.xi                 Drv_Clkm_Set_Clk_Source(handle, "");
4943*53ee8cc1Swenshuai.xi             }
4944*53ee8cc1Swenshuai.xi             else
4945*53ee8cc1Swenshuai.xi             {
4946*53ee8cc1Swenshuai.xi                 Drv_Clkm_Clk_Gate_Disable(handle);
4947*53ee8cc1Swenshuai.xi             }
4948*53ee8cc1Swenshuai.xi             break;
4949*53ee8cc1Swenshuai.xi         }
4950*53ee8cc1Swenshuai.xi         case E_VPU_EX_CLKPORT_VD_MHEG5_LITE:
4951*53ee8cc1Swenshuai.xi         {
4952*53ee8cc1Swenshuai.xi             handle = Drv_Clkm_Get_Handle("g_clk_vd_mheg5_lite");
4953*53ee8cc1Swenshuai.xi             if(bEnable)
4954*53ee8cc1Swenshuai.xi             {
4955*53ee8cc1Swenshuai.xi                 Drv_Clkm_Set_Clk_Source(handle, "");
4956*53ee8cc1Swenshuai.xi             }
4957*53ee8cc1Swenshuai.xi             else
4958*53ee8cc1Swenshuai.xi             {
4959*53ee8cc1Swenshuai.xi                 Drv_Clkm_Clk_Gate_Disable(handle);
4960*53ee8cc1Swenshuai.xi             }
4961*53ee8cc1Swenshuai.xi             break;
4962*53ee8cc1Swenshuai.xi         }
4963*53ee8cc1Swenshuai.xi     }
4964*53ee8cc1Swenshuai.xi }
4965*53ee8cc1Swenshuai.xi #endif  //#ifdef CONFIG_MSTAR_CLKM
_VPU_EX_GetFrameBufferDefaultSize(VPU_EX_CodecType eCodecType)4966*53ee8cc1Swenshuai.xi MS_SIZE _VPU_EX_GetFrameBufferDefaultSize(VPU_EX_CodecType eCodecType)
4967*53ee8cc1Swenshuai.xi {
4968*53ee8cc1Swenshuai.xi     MS_SIZE FrameBufferSize = 0;
4969*53ee8cc1Swenshuai.xi 
4970*53ee8cc1Swenshuai.xi     switch(eCodecType)
4971*53ee8cc1Swenshuai.xi     {
4972*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_MPEG2:
4973*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_H263:
4974*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_MPEG4:
4975*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_DIVX311:
4976*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_DIVX412:
4977*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_FLV:
4978*53ee8cc1Swenshuai.xi             FrameBufferSize = 0x1E00000;
4979*53ee8cc1Swenshuai.xi             break;
4980*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_VC1_ADV:
4981*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_VC1_MAIN:
4982*53ee8cc1Swenshuai.xi             FrameBufferSize = 0x6C00000;
4983*53ee8cc1Swenshuai.xi             break;
4984*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_RV8:
4985*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_RV9:
4986*53ee8cc1Swenshuai.xi             FrameBufferSize = 0x1B00000;
4987*53ee8cc1Swenshuai.xi             break;
4988*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_VP8:
4989*53ee8cc1Swenshuai.xi             FrameBufferSize = 0x1500000;
4990*53ee8cc1Swenshuai.xi             break;
4991*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_H264:
4992*53ee8cc1Swenshuai.xi             FrameBufferSize = 0x8200000;
4993*53ee8cc1Swenshuai.xi             //FrameBufferSize = 0x7A00000;  //UHD 122MB ,5 ref frame
4994*53ee8cc1Swenshuai.xi             //FrameBufferSize = 0x7A80000;  //UHD 4K2K 16:19  126.5MB
4995*53ee8cc1Swenshuai.xi             //FrameBufferSize = 0x8E00000;  //UHD 4K2K 16:19  142MB
4996*53ee8cc1Swenshuai.xi             break;
4997*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_AVS:
4998*53ee8cc1Swenshuai.xi #if VPU_FIELD_DETECTOR
4999*53ee8cc1Swenshuai.xi             FrameBufferSize = 0x3600000;
5000*53ee8cc1Swenshuai.xi #else
5001*53ee8cc1Swenshuai.xi             FrameBufferSize = 0x1B00000;
5002*53ee8cc1Swenshuai.xi #endif
5003*53ee8cc1Swenshuai.xi             break;
5004*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_MJPEG:
5005*53ee8cc1Swenshuai.xi             FrameBufferSize = 0x2800000;
5006*53ee8cc1Swenshuai.xi             break;
5007*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_MVC:
5008*53ee8cc1Swenshuai.xi             FrameBufferSize = 0x4200000;
5009*53ee8cc1Swenshuai.xi             break;
5010*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_HEVC_DV:
5011*53ee8cc1Swenshuai.xi             FrameBufferSize = 0xB000000;
5012*53ee8cc1Swenshuai.xi             break;
5013*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_HEVC:
5014*53ee8cc1Swenshuai.xi #if SUPPORT_MSVP9
5015*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_VP9:
5016*53ee8cc1Swenshuai.xi #endif
5017*53ee8cc1Swenshuai.xi             FrameBufferSize = 0xA000000;
5018*53ee8cc1Swenshuai.xi             break;
5019*53ee8cc1Swenshuai.xi #if !SUPPORT_MSVP9
5020*53ee8cc1Swenshuai.xi         case E_VPU_EX_CODEC_TYPE_VP9:
5021*53ee8cc1Swenshuai.xi             FrameBufferSize = 0x7800000;
5022*53ee8cc1Swenshuai.xi             break;
5023*53ee8cc1Swenshuai.xi #endif
5024*53ee8cc1Swenshuai.xi         default:
5025*53ee8cc1Swenshuai.xi             FrameBufferSize = 0;
5026*53ee8cc1Swenshuai.xi             break;
5027*53ee8cc1Swenshuai.xi     }
5028*53ee8cc1Swenshuai.xi 
5029*53ee8cc1Swenshuai.xi     return FrameBufferSize;
5030*53ee8cc1Swenshuai.xi }
5031*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetFrameBufferDefaultSize(VPU_EX_CodecType eCodecType)5032*53ee8cc1Swenshuai.xi MS_SIZE HAL_VPU_EX_GetFrameBufferDefaultSize(VPU_EX_CodecType eCodecType)
5033*53ee8cc1Swenshuai.xi {
5034*53ee8cc1Swenshuai.xi     return _VPU_EX_GetFrameBufferDefaultSize(eCodecType);
5035*53ee8cc1Swenshuai.xi }
5036*53ee8cc1Swenshuai.xi 
5037*53ee8cc1Swenshuai.xi // To-do: Taking the source type into consideration
HAL_VPU_EX_GetCMAMemSize(VPU_EX_CodecType eCodecType,VPU_EX_SrcMode eSrcMode,MS_U64 * offset,MS_SIZE * length,MS_U64 total_length,MS_SIZE unUseSize)5038*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_GetCMAMemSize(VPU_EX_CodecType eCodecType, VPU_EX_SrcMode eSrcMode,
5039*53ee8cc1Swenshuai.xi     MS_U64 *offset, MS_SIZE *length, MS_U64 total_length, MS_SIZE unUseSize)
5040*53ee8cc1Swenshuai.xi {
5041*53ee8cc1Swenshuai.xi     MS_SIZE FrameBufferSize = 0;
5042*53ee8cc1Swenshuai.xi 
5043*53ee8cc1Swenshuai.xi     if (!offset || !length)
5044*53ee8cc1Swenshuai.xi         return FALSE;
5045*53ee8cc1Swenshuai.xi 
5046*53ee8cc1Swenshuai.xi     total_length -= unUseSize;
5047*53ee8cc1Swenshuai.xi     VPRINTF("[HAL][%s]:[%d] total_length:%llu, cType:%d, sType:%d\n", __FUNCTION__, __LINE__,
5048*53ee8cc1Swenshuai.xi         (unsigned long long)total_length, (int)eCodecType, (int)eSrcMode);
5049*53ee8cc1Swenshuai.xi 
5050*53ee8cc1Swenshuai.xi     FrameBufferSize = _VPU_EX_GetFrameBufferDefaultSize(eCodecType);
5051*53ee8cc1Swenshuai.xi 
5052*53ee8cc1Swenshuai.xi     if(FrameBufferSize == 0)
5053*53ee8cc1Swenshuai.xi     {
5054*53ee8cc1Swenshuai.xi         return FALSE;
5055*53ee8cc1Swenshuai.xi     }
5056*53ee8cc1Swenshuai.xi     VPRINTF("[HAL][%s]:[%d] FrameSize:%llu, offset:%llu, length:%llu ", __FUNCTION__, __LINE__,
5057*53ee8cc1Swenshuai.xi         (unsigned long long)FrameBufferSize, (unsigned long long)*offset, (unsigned long long)*length);
5058*53ee8cc1Swenshuai.xi     if (total_length < FrameBufferSize)
5059*53ee8cc1Swenshuai.xi     {
5060*53ee8cc1Swenshuai.xi         *offset = unUseSize;
5061*53ee8cc1Swenshuai.xi         *length = total_length;
5062*53ee8cc1Swenshuai.xi     }
5063*53ee8cc1Swenshuai.xi     else  // todo, dual decode case
5064*53ee8cc1Swenshuai.xi     {
5065*53ee8cc1Swenshuai.xi         *offset = unUseSize;
5066*53ee8cc1Swenshuai.xi         *length = FrameBufferSize;
5067*53ee8cc1Swenshuai.xi     }
5068*53ee8cc1Swenshuai.xi     return TRUE;
5069*53ee8cc1Swenshuai.xi }
5070*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_strcmp(const char * string1,const char * string2)5071*53ee8cc1Swenshuai.xi static int HAL_VPU_EX_strcmp(const char *string1, const char *string2)
5072*53ee8cc1Swenshuai.xi {
5073*53ee8cc1Swenshuai.xi     int iRet, i;
5074*53ee8cc1Swenshuai.xi 
5075*53ee8cc1Swenshuai.xi     i = 0;
5076*53ee8cc1Swenshuai.xi     while(string1[i] || string2[i])
5077*53ee8cc1Swenshuai.xi     {
5078*53ee8cc1Swenshuai.xi         iRet = string1[i] - string2[i];
5079*53ee8cc1Swenshuai.xi         if(iRet)
5080*53ee8cc1Swenshuai.xi         {
5081*53ee8cc1Swenshuai.xi             return iRet;
5082*53ee8cc1Swenshuai.xi         }
5083*53ee8cc1Swenshuai.xi         i++;
5084*53ee8cc1Swenshuai.xi     }
5085*53ee8cc1Swenshuai.xi     return 0;
5086*53ee8cc1Swenshuai.xi }
5087*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_GetCapability(MS_U8 * pu8CmdNameIn,void * pParamIn,void * pParamOut)5088*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_GetCapability(MS_U8 *pu8CmdNameIn, void *pParamIn, void *pParamOut)
5089*53ee8cc1Swenshuai.xi {
5090*53ee8cc1Swenshuai.xi     typedef enum
5091*53ee8cc1Swenshuai.xi     {
5092*53ee8cc1Swenshuai.xi         E_CAP_NDEC_FB_MIU_SELECT,
5093*53ee8cc1Swenshuai.xi         E_CAP_NDEC_NSTREAM_FB_SIZE,
5094*53ee8cc1Swenshuai.xi         E_CAP_NDEC_NSTREAM_BS_SIZE,
5095*53ee8cc1Swenshuai.xi         E_CAP_NDEC_SUPPORT_SHAREBBU,
5096*53ee8cc1Swenshuai.xi         E_CAP_SUPPORT_ALLOCATOR,
5097*53ee8cc1Swenshuai.xi 
5098*53ee8cc1Swenshuai.xi     } VPU_EX_GetCapabilityCmdId;
5099*53ee8cc1Swenshuai.xi 
5100*53ee8cc1Swenshuai.xi     typedef struct
5101*53ee8cc1Swenshuai.xi     {
5102*53ee8cc1Swenshuai.xi         VPU_EX_GetCapabilityCmdId eCmdId;
5103*53ee8cc1Swenshuai.xi         MS_U8 u8CmdName[32];
5104*53ee8cc1Swenshuai.xi 
5105*53ee8cc1Swenshuai.xi     } VPU_EX_GetCapabilityCmd;
5106*53ee8cc1Swenshuai.xi 
5107*53ee8cc1Swenshuai.xi     static VPU_EX_GetCapabilityCmd stCapCmd[] =
5108*53ee8cc1Swenshuai.xi     {
5109*53ee8cc1Swenshuai.xi         {E_CAP_NDEC_FB_MIU_SELECT,    "CAP_NDEC_FB_MIU_SELECT"},
5110*53ee8cc1Swenshuai.xi         {E_CAP_NDEC_NSTREAM_FB_SIZE,  "CAP_NDEC_NSTREAM_FB_SIZE"},
5111*53ee8cc1Swenshuai.xi         {E_CAP_NDEC_NSTREAM_BS_SIZE,  "CAP_NDEC_NSTREAM_BS_SIZE"},
5112*53ee8cc1Swenshuai.xi         {E_CAP_NDEC_SUPPORT_SHAREBBU, "CAP_NDEC_SUPPORT_SHAREBBU"},
5113*53ee8cc1Swenshuai.xi         {E_CAP_SUPPORT_ALLOCATOR,     "CAP_SUPPORT_ALLOCATOR"},
5114*53ee8cc1Swenshuai.xi     };
5115*53ee8cc1Swenshuai.xi 
5116*53ee8cc1Swenshuai.xi     MS_U32 bRet = FALSE;
5117*53ee8cc1Swenshuai.xi     MS_U32 u32TotalCmdCnt = sizeof(stCapCmd) / sizeof(stCapCmd[0]);
5118*53ee8cc1Swenshuai.xi     MS_U32 u32CmdCnt;
5119*53ee8cc1Swenshuai.xi 
5120*53ee8cc1Swenshuai.xi     for(u32CmdCnt = 0; u32CmdCnt < u32TotalCmdCnt; u32CmdCnt++)
5121*53ee8cc1Swenshuai.xi     {
5122*53ee8cc1Swenshuai.xi         if(HAL_VPU_EX_strcmp((const char *)(stCapCmd[u32CmdCnt].u8CmdName), (const char *)pu8CmdNameIn) == 0)
5123*53ee8cc1Swenshuai.xi         {
5124*53ee8cc1Swenshuai.xi             bRet = TRUE;
5125*53ee8cc1Swenshuai.xi             switch(stCapCmd[u32CmdCnt].eCmdId)
5126*53ee8cc1Swenshuai.xi             {
5127*53ee8cc1Swenshuai.xi                 case E_CAP_NDEC_FB_MIU_SELECT:
5128*53ee8cc1Swenshuai.xi                     {
5129*53ee8cc1Swenshuai.xi                         VPU_EX_CodecType eCodecType = *((VPU_EX_CodecType *)pParamIn);
5130*53ee8cc1Swenshuai.xi                         MS_BOOL *pSupport = (MS_BOOL *)pParamOut;
5131*53ee8cc1Swenshuai.xi                         if((eCodecType == E_VPU_EX_CODEC_TYPE_HEVC) ||
5132*53ee8cc1Swenshuai.xi                            (eCodecType == E_VPU_EX_CODEC_TYPE_VP9)  ||
5133*53ee8cc1Swenshuai.xi                            (eCodecType == E_VPU_EX_CODEC_TYPE_HEVC_DV))
5134*53ee8cc1Swenshuai.xi                         {
5135*53ee8cc1Swenshuai.xi                             *pSupport = TRUE;
5136*53ee8cc1Swenshuai.xi                         }
5137*53ee8cc1Swenshuai.xi                         else
5138*53ee8cc1Swenshuai.xi                         {
5139*53ee8cc1Swenshuai.xi                             *pSupport = FALSE;
5140*53ee8cc1Swenshuai.xi                         }
5141*53ee8cc1Swenshuai.xi                     }
5142*53ee8cc1Swenshuai.xi                     break;
5143*53ee8cc1Swenshuai.xi 
5144*53ee8cc1Swenshuai.xi                 // FIXME: Patch for waiting dynamic frame buffer and preset task_spec
5145*53ee8cc1Swenshuai.xi                 case E_CAP_NDEC_NSTREAM_FB_SIZE:
5146*53ee8cc1Swenshuai.xi                     {
5147*53ee8cc1Swenshuai.xi                         MS_SIZE *pSize = (MS_SIZE *)pParamOut;
5148*53ee8cc1Swenshuai.xi                         *pSize = 0x1300000;  // 19M
5149*53ee8cc1Swenshuai.xi                     }
5150*53ee8cc1Swenshuai.xi                     break;
5151*53ee8cc1Swenshuai.xi 
5152*53ee8cc1Swenshuai.xi                 // FIXME: Patch for waiting dynamic bitstream buffer
5153*53ee8cc1Swenshuai.xi                 case E_CAP_NDEC_NSTREAM_BS_SIZE:
5154*53ee8cc1Swenshuai.xi                     {
5155*53ee8cc1Swenshuai.xi                         MS_SIZE *pSize = (MS_SIZE *)pParamOut;
5156*53ee8cc1Swenshuai.xi                         *pSize = 0x400000;  // 4M
5157*53ee8cc1Swenshuai.xi                     }
5158*53ee8cc1Swenshuai.xi                     break;
5159*53ee8cc1Swenshuai.xi 
5160*53ee8cc1Swenshuai.xi                 case E_CAP_NDEC_SUPPORT_SHAREBBU:
5161*53ee8cc1Swenshuai.xi                     {
5162*53ee8cc1Swenshuai.xi                         MS_BOOL *pbSupportShareBBU = (MS_BOOL *)pParamOut;
5163*53ee8cc1Swenshuai.xi                         *pbSupportShareBBU = TRUE;
5164*53ee8cc1Swenshuai.xi                     }
5165*53ee8cc1Swenshuai.xi                     break;
5166*53ee8cc1Swenshuai.xi 
5167*53ee8cc1Swenshuai.xi                 case E_CAP_SUPPORT_ALLOCATOR:
5168*53ee8cc1Swenshuai.xi                     {
5169*53ee8cc1Swenshuai.xi                         MS_BOOL *pSupport = (MS_BOOL *)pParamOut;
5170*53ee8cc1Swenshuai.xi                         *pSupport = TRUE;
5171*53ee8cc1Swenshuai.xi                     }
5172*53ee8cc1Swenshuai.xi                     break;
5173*53ee8cc1Swenshuai.xi 
5174*53ee8cc1Swenshuai.xi                 default:
5175*53ee8cc1Swenshuai.xi                     bRet = FALSE;
5176*53ee8cc1Swenshuai.xi                     break;
5177*53ee8cc1Swenshuai.xi             }
5178*53ee8cc1Swenshuai.xi         }
5179*53ee8cc1Swenshuai.xi     }
5180*53ee8cc1Swenshuai.xi 
5181*53ee8cc1Swenshuai.xi     return bRet;
5182*53ee8cc1Swenshuai.xi }
5183*53ee8cc1Swenshuai.xi 
5184*53ee8cc1Swenshuai.xi #else
5185*53ee8cc1Swenshuai.xi #include "halVPU_EX.h"
5186*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
5187*53ee8cc1Swenshuai.xi #include "../../../../vdec_v2/hal/maserati/hvd_ex/regHVD_EX.h"
5188*53ee8cc1Swenshuai.xi #include "halCHIP.h"
5189*53ee8cc1Swenshuai.xi 
5190*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_NUTTX)
5191*53ee8cc1Swenshuai.xi extern int lib_lowprintf(const char *fmt, ...);
5192*53ee8cc1Swenshuai.xi #define PRINTF lib_lowprintf
5193*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_OPTEE)
5194*53ee8cc1Swenshuai.xi #define PRINTF printf
5195*53ee8cc1Swenshuai.xi #endif
5196*53ee8cc1Swenshuai.xi 
5197*53ee8cc1Swenshuai.xi #define HVD_LWORD(x)    (MS_U16)((x)&0xffff)
5198*53ee8cc1Swenshuai.xi #define HVD_HWORD(x)    (MS_U16)(((x)>>16)&0xffff)
5199*53ee8cc1Swenshuai.xi 
5200*53ee8cc1Swenshuai.xi MS_U8 u8FW_Binary[] = {
5201*53ee8cc1Swenshuai.xi     #include "fwVPU.dat"
5202*53ee8cc1Swenshuai.xi };
5203*53ee8cc1Swenshuai.xi 
5204*53ee8cc1Swenshuai.xi MS_U32 u32HVDRegOSBase;
5205*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_LoadCodeInSecure(MS_VIRT addr)5206*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_LoadCodeInSecure(MS_VIRT addr)
5207*53ee8cc1Swenshuai.xi {
5208*53ee8cc1Swenshuai.xi     //PRINTF("do load code,u32DestAddr %x\n",addr);
5209*53ee8cc1Swenshuai.xi     memcpy((void*)addr, (void*)u8FW_Binary, sizeof(u8FW_Binary));
5210*53ee8cc1Swenshuai.xi     MAsm_CPU_Sync();
5211*53ee8cc1Swenshuai.xi     MsOS_FlushMemory();
5212*53ee8cc1Swenshuai.xi 
5213*53ee8cc1Swenshuai.xi     if (FALSE == (*((MS_U8*)(addr+6))=='R' && *((MS_U8*)(addr+7))=='2'))
5214*53ee8cc1Swenshuai.xi     {
5215*53ee8cc1Swenshuai.xi         PRINTF("FW is not R2 version! _%x_ _%x_\n", *(MS_U8*)(addr+6), *(MS_U8*)(addr+7));
5216*53ee8cc1Swenshuai.xi         return FALSE;
5217*53ee8cc1Swenshuai.xi     }
5218*53ee8cc1Swenshuai.xi     return TRUE;
5219*53ee8cc1Swenshuai.xi }
5220*53ee8cc1Swenshuai.xi 
HAL_VPU_EX_SetLockDownRegister(void * param)5221*53ee8cc1Swenshuai.xi MS_BOOL HAL_VPU_EX_SetLockDownRegister(void* param)
5222*53ee8cc1Swenshuai.xi {
5223*53ee8cc1Swenshuai.xi #if 1
5224*53ee8cc1Swenshuai.xi     MS_PHY u32StAddr_main;
5225*53ee8cc1Swenshuai.xi     MS_PHY u32StAddr_sub;
5226*53ee8cc1Swenshuai.xi     MS_U32 u32NonPMBankSize = 0;
5227*53ee8cc1Swenshuai.xi     VPU_EX_LOCK_DOWN_REGISTER* register_lockdown;
5228*53ee8cc1Swenshuai.xi 
5229*53ee8cc1Swenshuai.xi     if(param == NULL)
5230*53ee8cc1Swenshuai.xi     {
5231*53ee8cc1Swenshuai.xi         return FALSE;
5232*53ee8cc1Swenshuai.xi     }
5233*53ee8cc1Swenshuai.xi 
5234*53ee8cc1Swenshuai.xi     register_lockdown = (VPU_EX_LOCK_DOWN_REGISTER*)param;
5235*53ee8cc1Swenshuai.xi 
5236*53ee8cc1Swenshuai.xi     MDrv_MMIO_GetBASE(&u32HVDRegOSBase, &u32NonPMBankSize, MS_MODULE_HW);
5237*53ee8cc1Swenshuai.xi 
5238*53ee8cc1Swenshuai.xi     // ES buffer
5239*53ee8cc1Swenshuai.xi     u32StAddr_main = register_lockdown->Bitstream_Addr_Main;
5240*53ee8cc1Swenshuai.xi     u32StAddr_sub = register_lockdown->Bitstream_Addr_Sub;
5241*53ee8cc1Swenshuai.xi 
5242*53ee8cc1Swenshuai.xi 
5243*53ee8cc1Swenshuai.xi     MS_PHY u32StartOffset;
5244*53ee8cc1Swenshuai.xi     MS_U8  u8MiuSel;
5245*53ee8cc1Swenshuai.xi 
5246*53ee8cc1Swenshuai.xi      _phy_to_miu_offset(u8MiuSel, u32StartOffset, u32StAddr_main);
5247*53ee8cc1Swenshuai.xi     u32StAddr_main = u32StartOffset;
5248*53ee8cc1Swenshuai.xi 
5249*53ee8cc1Swenshuai.xi      _phy_to_miu_offset(u8MiuSel, u32StartOffset, u32StAddr_sub);
5250*53ee8cc1Swenshuai.xi     u32StAddr_sub = u32StartOffset;
5251*53ee8cc1Swenshuai.xi 
5252*53ee8cc1Swenshuai.xi     //Lock down register
5253*53ee8cc1Swenshuai.xi     _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L(REG_HVD_BASE), HVD_LWORD(u32StAddr_main >> 3));
5254*53ee8cc1Swenshuai.xi     _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H(REG_HVD_BASE), HVD_HWORD(u32StAddr_main >> 3));
5255*53ee8cc1Swenshuai.xi 
5256*53ee8cc1Swenshuai.xi     _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_L_BS2, HVD_LWORD(u32StAddr_sub >> 3));
5257*53ee8cc1Swenshuai.xi     _HVD_Write2Byte(HVD_REG_ESB_ST_ADDR_H_BS2, HVD_HWORD(u32StAddr_sub >> 3));
5258*53ee8cc1Swenshuai.xi     //~
5259*53ee8cc1Swenshuai.xi 
5260*53ee8cc1Swenshuai.xi     // Lock Down
5261*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)));
5262*53ee8cc1Swenshuai.xi     //~
5263*53ee8cc1Swenshuai.xi #endif
5264*53ee8cc1Swenshuai.xi     return TRUE;
5265*53ee8cc1Swenshuai.xi }
5266*53ee8cc1Swenshuai.xi 
5267*53ee8cc1Swenshuai.xi #endif
5268