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