1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 // Software and any modification/derivatives thereof.
18 // No right, ownership, or interest to MStar Software and any
19 // modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 // supplied together with third party`s software and the use of MStar
23 // Software may require additional licenses from third parties.
24 // Therefore, you hereby agree it is your sole responsibility to separately
25 // obtain any and all third party right and license necessary for your use of
26 // such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 // MStar`s confidential information and you agree to keep MStar`s
30 // confidential information in strictest confidence and not disclose to any
31 // third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 // kind. Any warranties are hereby expressly disclaimed by MStar, including
35 // without limitation, any warranties of merchantability, non-infringement of
36 // intellectual property rights, fitness for a particular purpose, error free
37 // and in conformity with any international standard. You agree to waive any
38 // claim against MStar for any loss, damage, cost or expense that you may
39 // incur related to your use of MStar Software.
40 // In no event shall MStar be liable for any direct, indirect, incidental or
41 // consequential damages, including without limitation, lost of profit or
42 // revenues, lost or damage of data, and unauthorized system use.
43 // You agree that this Section 4 shall still apply without being affected
44 // even if MStar Software has been modified by MStar in accordance with your
45 // request or instruction for your use, except otherwise agreed by both
46 // parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 // services in relation with MStar Software to you for your use of
50 // MStar Software in conjunction with your or your customer`s product
51 // ("Services").
52 // You understand and agree that, except otherwise agreed by both parties in
53 // writing, Services are provided on an "AS IS" basis and the warranty
54 // disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 // or otherwise:
58 // (a) conferring any license or right to use MStar name, trademark, service
59 // mark, symbol or any other identification;
60 // (b) obligating MStar or any of its affiliates to furnish any person,
61 // including without limitation, you and your customers, any assistance
62 // of any kind whatsoever, or any information; or
63 // (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 // of Taiwan, R.O.C., excluding its conflict of law rules.
67 // Any and all dispute arising out hereof or related hereto shall be finally
68 // settled by arbitration referred to the Chinese Arbitration Association,
69 // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 // Rules of the Association by three (3) arbitrators appointed in accordance
71 // with the said Rules.
72 // The place of arbitration shall be in Taipei, Taiwan and the language shall
73 // be English.
74 // The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94
95
96 //-------------------------------------------------------------------------------------------------
97 // Include Files
98 //-------------------------------------------------------------------------------------------------
99 // Common Definition
100 #ifdef MSOS_TYPE_LINUX_KERNEL
101 #include <linux/string.h>
102 #else
103 #include <string.h>
104 #endif
105
106 #include "MsCommon.h"
107 #include "drvMVD_EX.h"
108 #include "drvBDMA.h"
109
110 // Internal Definition
111 #include "regMVD_EX.h"
112 #include "halMVD_EX.h"
113 #include "halVPU_EX.h"
114 #include "osalMVD_EX.h"
115 #include "mvd4_interface.h" //firmware header
116 #include "asmCPU.h"
117 #include "controller.h"
118 #include "MVD_EX_Common.h"
119 #include "halCHIP.h"
120 #include "drvCMAPool.h"
121 #if defined(MSOS_TYPE_LINUX)
122 #include "msos/linux/ion_uapi.h"
123 #include "msos/linux/mdrv_cma_pool_st.h"
124 #endif
125
126 #if (!defined(MSOS_TYPE_NUTTX) && !defined(MSOS_TYPE_OPTEE)) || defined(SUPPORT_X_MODEL_FEATURE)
127
128
129 #ifdef MSOS_TYPE_LINUX_KERNEL
130 #define VPRINTF printk
131 #else
132 #ifndef ANDROID
133 #define VPRINTF printf
134 #else
135 #include <sys/mman.h>
136 #include <cutils/ashmem.h>
137 #include <cutils/log.h>
138 #define VPRINTF ALOGD
139 #endif
140 #endif
141 //-------------------------------------------------------------------------------------------------
142 // Driver Compiler Options
143 //-------------------------------------------------------------------------------------------------
144 #define SLQ_NEW_PUSH 1
145 #define VIRTUAL_CMD_TIMEOUT 50
146 #ifdef VDEC3
147 #define v3_temp 1
148 #define v3_thinplayer 0
149 #else
150 #define v3_temp 0
151 #define v3_thinplayer 0
152 #endif
153
154 //-------------------------------------------------------------------------------------------------
155 // Local Defines
156 //-------------------------------------------------------------------------------------------------
157 #define MIU1_BASEADDR pMVDHalContext->stMiuCfg.u32Miu1BaseAddr
158 #define _PA2Offset(x) (((x)>=MIU1_BASEADDR)?(x-MIU1_BASEADDR):(x))
159
160 #ifdef MSOS_TYPE_LINUX_KERNEL
161 #include <asm/div64.h>
162 #define _90K_TO_MS_U64(x) ((x!=MVD_U64_MAX)?(do_div(x,90)):(x)) //90k counter ==> ms
163 #else
164 #define _90K_TO_MS_U64(x) ((x!=MVD_U64_MAX)?(x/90):(x)) //90k counter ==> ms
165 #endif
166
167 #ifndef MS_ASSERT
168 #ifdef MS_DEBUG
169 #define MS_ASSERT(expr) do { \
170 if(!(expr)) \
171 printf("MVD assert fail %s %d!\n", __FILE__, __LINE__); \
172 } while(0)
173 #else
174 #define MS_ASSERT(expr)
175 #endif
176 #endif
177
178 #ifndef UNUSED
179 #define UNUSED(x) (void)(x)
180 #endif
181 //constant
182 #define MVD_PollingTimes 0x40000UL
183
184 #define MVD_DEBUGVERBAL(x) if (_u8HalDbgLevel>3) { (x); }
185 #define MVD_DEBUG_FWCMD(x) if (_u8HalDbgLevel>2) { (x); }
186 #define MVD_DEBUGINFO(x) if (_u8HalDbgLevel>1) { (x); }
187 #define MVD_DEBUGERROR(x) if (_u8HalDbgLevel>0) { (x); }
188 #define MVD_ERROR(x) x
189
190 #define RIU ((unsigned short volatile *) (u32RiuBaseAdd))
191 #define RIU8 ((unsigned char volatile *) (u32RiuBaseAdd))
192
193 #define MVDCPU_ON_MIU1 ((HAL_MVD_RegReadByte(MIU0_SEL0_H) & BIT4) == BIT4)
194 //#define MVDHW_ON_MIU1 ((HAL_MVD_RegReadByte(MIU0_SEL2_L) & BIT4) == BIT4)
195 #define MVDHW_ON_MIU0 ((HAL_MVD_RegReadByte(MIU0_SEL2_L) & BIT4) == 0)
196 #define MVDHW_ON_MIU1 ((HAL_MVD_RegReadByte(MIU0_SEL2_L) & BIT4) == BIT4)
197
198 // MVD5
199 #define SLQ_TBL_ENTRY_LEN 0x7FFFFFFF //31-bit
200
201 #define MVD_WIDTH_ALIGN_BYTE 16
202 #define MVD_WIDTH_ALIGN_MASK (MVD_WIDTH_ALIGN_BYTE - 1)
203 #define MVD_WIDTH_ALIGN_BITS 4
204
205 #define MVD_FBNUM_DEFAULT 4
206 #define MVD_FBNUM_MAX 5
207 #define MVD_FBNUM_MIN MVD_FBNUM_DEFAULT
208
209 #define MVD_DHD_FBSIZE 0x5FA000 //Framebuffer size minimum for Dual HD: (1920*2)*1088*1.5
210 #define MVD_HD_FBSIZE 0x2FD000 //Framebuffer size minimum for High Definition
211 #define MVD4_VC1_FBSIZE_HDMIN 0xEF1000 //5 * 1920 * 1088 * 1.5 = 14.95MB
212 #define MVD4_VC1_FBSIZE_HDMIN1 0xBF4000 //4 * 1920 * 1088 * 1.5 = 11.96MB
213 #define MVD4_VC1_FBSIZE_SDMIN 0x2F7600 //5 * 720 * 576 * 1.5 = 2.97MB
214 #define MVD4_MPEG_FBSIZE_HDMIN 0xBF4000 //4 * 1920 * 1088 * 1.5 = 11.96MB
215 #define MVD4_MPEG_FBSIZE_SDMIN 0x25F800 //4 * 720 * 576 * 1.5 = 2.38MB
216
217 #define _IS_VC1(x) ((x==E_MVD_CODEC_VC1_ADV) || (x==E_MVD_CODEC_VC1_MAIN))
218
219 #define SLQ_ENTRY_LEN 8 //8-byte per entry
220
221 #define MVD_U32_MAX 0xffffffffUL
222 #define MVD_U64_MAX 0xffffffffffffffffULL
223 #define MVD_GENERAL_MAX ((size_t)(-1))
224
225 #define MAX_ADD_28BIT 0x0fffffffUL
226
227 #define SLQ_ADDR_LEN SLQ_TBL_ENTRY_LEN //Slq address length is the same as SlqTbl
228
229 //Initial value for PTS table
230 #define _INIT_ADDR MVD_U32_MAX
231 #define _INIT_LEN 0
232 #define _INIT_TIMESTAMP MVD_U32_MAX
233 #define _INIT_ID MVD_U32_MAX
234
235 #define _MS_TO_90K(x) (x*90) //ms ==> 90k counter
236 #define _90K_TO_MS(x) ((x!=MVD_U32_MAX)?(x/90):(x)) //90k counter ==> ms
237 //#define _90K_TO_MS_U64(x) ((x!=MVD_U64_MAX)?(do_div(x,90)):(x)) //90k counter ==> ms
238
239 #define MVD_DBG_STS(x) {}
240 #define _SLQTBL_DUMP_PTS FALSE//TRUE
241 #define _SLQTBL_DUMP_PUSHQ FALSE//TRUE
242 #define _SLQTBL_DUMP_PKT FALSE//TRUE
243 #define MVD_TURBO_INIT FALSE//TRUE
244
245 #define SLQ_ENTRY_MAX 1024
246 #define SLQ_ENTRY_LEN 8 //8-byte per entry
247 #define SLQ_TBL_SIZE (SLQ_ENTRY_MAX * SLQ_ENTRY_LEN)
248 #define ES_TBL_SIZE (SLQ_ENTRY_MAX * 8) //8-byte per entry
249
250 #define MVD_FW_SLQTBL_PTS_LEN 32
251
252 #define SLQ_TBL_SAFERANGE (40*SLQ_ENTRY_LEN)
253 //this should be smaller than FW's lookup range (current it's 16 entries)
254
255 #define SLQTBL_CHECKVACANCY_WATERLEVEL (44*SLQ_ENTRY_LEN)
256
257
258 #define DIVX_PATTERN 0x63643030
259 #define FLV_PATTERN 0xffff0000
260 #define MPEG_PATTERN_0 0xC6010000 //this SC just for mpeg2/4
261 #if SLQ_NEW_PUSH
262 #define SLQ_PIC_START_FLAG 0x40000000
263 #define VC1_PATTERN 0x0D010000
264 #define RCV_PATTERN 0xFF00A55A
265 #endif
266 #define VC1_PATTERN_0 0xff010000
267 #define VC1_PATTERN_1 0x0000ffff
268 #define VC1_PATTERN_2 0xffffff01
269 #define VC1_PATTERN_3 0x0000ffee
270
271 #define RCV_PATTERN_0 0x00000000
272 #define RCV_PATTERN_1 0xffffffff
273 #define RCV_PATTERN_2 0x00000000
274 #define RCV_PATTERN_3 0xeeeeeeee
275
276 #define DUMMY_PATTERN 0xBE010000
277 #define DUMMY_SIZE 0x2000 //8K
278
279 #define END_PATTERN_0 0xFF010000
280 #define END_PATTERN_1 0xDDCCBBAA
281 #define END_PATTERN_2 0xBBAAFFEE
282 #define END_PATTERN_3 0xFFEEDDCC
283 #define END_PATTERN_SIZE 256
284
285 #define SKIP_PATTERN_0 0xc5010000
286 #define SKIP_PATTERN_1 0x270608ab
287 #define SKIP_PATTERN_SIZE 8
288
289 #define CMD_TIMEOUT_MS 500
290 #define SKIP_DATA_TIMEOUT_MS 15
291
292 //Length of internal buffers
293 #define MVD_FW_IAP_BUF_LEN (0x4000UL) // 16k
294 #define MVD_FW_DP_BUF_LEN (0x80000UL) //512k
295 #define MVD_FW_MV_BUF_LEN (0x48000UL) //288K
296 //Alignment of HW buffers start address
297 #define MVD_FW_IAP_BUF_ALIGN (0x4000UL) // 16k
298 #define MVD_FW_DP_BUF_ALIGN (0x8000UL) // 32k
299 #define MVD_FW_MV_BUF_ALIGN (0x8000UL) // 32k
300
301 //Three HW buffers are allocated after framebuffer, so we need to
302 //consider these buffers when checking the available framebuffer size/number.
303 #define MVD_HW_BUF_TOTAL_LEN (MVD_FW_IAP_BUF_LEN + MVD_FW_DP_BUF_LEN + MVD_FW_MV_BUF_LEN) //u32HWBuffTotalSize
304
305 #define MVD_FW_CODE_LEN (OFFSET_BASE)//refer to the define in mvd4_interface.h
306 #define MVD_FW_CODE_LEN_V00 (0x70000UL) //length for old layout
307 #define MVD_FW_MPOOL_START_OFFSET (0x90000UL) //576K
308 #define MVD_FW_TASK_OFFSET (0x100000UL) //1M
309
310 #define MVD3_FW_VOL_INFO_BUF_LEN (0x1000UL) // 4K
311 #define MVD3_FW_FRAME_INFO_BUF_LEN (0x1000UL) // 4K
312 #define MVD3_FW_DIVX_INFO_BUF_LEN (0x1000UL) // 4K
313 #define MVD3_FW_USER_DATA_BUF_LEN (0x4000UL) // 16K
314 #define MVD3_FW_USER_DATA_BUF_BACKUP_LEN MVD3_FW_USER_DATA_BUF_LEN // 16K
315 #define MVD3_FW_SLQ_TAB_TMPBUF_LEN (0x200UL)
316 #define MVD_FW_SLQTBL_PTS_BUF_LEN (SLQ_ENTRY_MAX*MVD_FW_SLQTBL_PTS_LEN)
317 #define MVD_FW_DYN_SCALE_BUF_LEN (0x2000UL) // 8K
318 #define MVD_FW_SCALER_INFO_BUF_LEN (0x100UL) // 256bytes reserved
319 #define MVD_FW_DECFRM_INFO_BUF_LEN (0x100UL) // 256bytes reserved
320 #define MVD_FW_VBBU_TABLE_LEN (0x2000UL) // 8K
321
322 #define MVD_FW_USER_DATA_HDR_LEN (6)
323 #define MVD_FW_USER_DATA_PKT_LEN (256)
324 #define MVD_FW_USER_DATA_EXT_HDR_LEN (16)
325 #define FW_BUFF_ALIGN (0x1000) //4k align
326
327 #define SLQ_ENTRY_MAX 1024
328 #define MVD_FW_SLQTBL_PTS_LEN 32
329 #define MVD_NULLPKT_PTS MVD_U32_MAX
330
331 #define MVD_HW_MAX_PIXEL (1920*1088*61000ULL) // FHD@60p
332
333 //Get the start address, and the next start address.
334 #define GET_FW_BUFFADD(cur, size, start) \
335 do { \
336 start = cur; \
337 cur += size; \
338 } while(0)
339
340 //Get the aligned start address, and the next start address.
341 #define GET_FW_BUFFADD_ALIGN(cur, align, size, alignStart) \
342 do { \
343 cur = (MemAlign(cur, align)); \
344 GET_FW_BUFFADD(cur, size, alignStart); \
345 } while(0)
346
347 //Init command arguments
348 #define SETUP_CMDARG(x) \
349 do { \
350 x.Arg0 = 0; \
351 x.Arg1 = 0; \
352 x.Arg2 = 0; \
353 x.Arg3 = 0; \
354 x.Arg4 = 0; \
355 x.Arg5 = 0; \
356 } while(0)
357
358 //Set command arguments
359 #define SET_CMDARG(cmd, u32val, u8Num) \
360 do { \
361 cmd.Arg0 = L_WORD(u32val); \
362 cmd.Arg1 = H_WORD(u32val); \
363 cmd.Arg2 = L_DWORD(u32val); \
364 cmd.Arg3 = H_DWORD(u32val); \
365 cmd.Arg4 = 0; \
366 cmd.Arg5 = u8Num; \
367 } while(0)
368
369 #define SET_CMD_RET_FALSE(_cmdVal, _pStcmdArg) \
370 do { \
371 if (HAL_MVD_MVDCommand(_cmdVal, (_pStcmdArg)) == FALSE) \
372 { \
373 MVD_DEBUGERROR(printf("Command: 0x%x fail!!\r\n", _cmdVal)); \
374 return FALSE; \
375 } \
376 } while(0)
377
378 #define SET_CMD_RET_VOID(_cmdVal, _pStcmdArg) \
379 do { \
380 if (HAL_MVD_MVDCommand(_cmdVal, (_pStcmdArg)) == FALSE) \
381 { \
382 MVD_DEBUGERROR(printf("Command: 0x%x fail!!\r\n", _cmdVal)); \
383 return; \
384 } \
385 } while(0)
386
387 #define HAL_MVD_InvalidBuffRetFalse(x) \
388 do { \
389 if ((x)==0) \
390 { \
391 MVD_DEBUGERROR(printf("%s(%d) error: NULL buffer address.\n", __FUNCTION__, __LINE__)); \
392 return FALSE; \
393 } \
394 } while(0)
395
396 #define _MVD_Memset(pDstAddr, u32value, u32Size) \
397 do { \
398 MS_U32 x = 0; \
399 for (x = 0; x < (u32Size/4); x=x+4) \
400 { \
401 HAL_MVD_Memset4Byte(pDstAddr+x,u32value); \
402 } \
403 HAL_MVD_CPU_Sync(); \
404 HAL_MVD_ReadMemory(); \
405 } while (0)
406
407 #define _MVD_MemResetBit(pDstAddr, mask_num) \
408 do{ \
409 *pDstAddr = (*pDstAddr) & (~(0x1<<mask_num)); \
410 }while(0) \
411
412
413 typedef enum
414 {
415 MVD_HKSLQ_GET_READPTR = 0,
416 MVD_HKSLQ_GET_WRITEPTR = 1,
417 MVD_HKSLQ_NONE = 2,
418 } MVD_HKSLQ_CMD;
419
420 #if SLQ_NEW_PUSH
421 typedef struct _MVD_SLQ_STATUS
422 {
423 MS_BOOL bSlqPicStart;
424 MS_BOOL bSlqPicCollect;
425 MS_BOOL bSlqPicWaitNextStart;
426 MS_BOOL bSlqFireRdy;
427 MS_BOOL bSlqCtrlBit;
428 MS_BOOL bSlqEnLastFrameShow;
429 MS_VIRT u32SlqPatternAddr;
430 MS_U32 u32SlqPushLength;
431 MS_VIRT u32VaildWptrAddr;
432 } MVD_SLQ_STATUS;
433 #endif
434
435 typedef struct _MVD_SLQ_TBL_ST
436 {
437 MS_VIRT u32StAdd;
438 MS_VIRT u32EndAdd;
439 MS_U32 u32EntryCntMax;
440
441 MS_VIRT u32RdPtr;
442 MS_VIRT u32WrPtr;
443 MS_VIRT u32Empty;
444 MS_VIRT* pu32LastEntry;
445 } MVD_SLQ_TBL_ST;
446
447 typedef struct _MVD_ALIVEInfo
448 {
449 MS_U32 u32decode_count;
450 MS_U32 u32searchbuf_count;
451 MS_U32 u32searchcode_count;
452 MS_U32 u32prebuf_count;
453 MS_U32 u32vfifobuf_count;
454 MS_U32 u32searchheader_count;
455 MS_U32 u32flashpattern_count;
456 } MVD_ALIVEInfo;
457
458
459 typedef struct _MVD_SLQ_ES_ST
460 {
461 MS_VIRT u32StAdd;
462 MS_VIRT u32EndAdd;
463
464 MS_VIRT u32RdPtr;
465 MS_VIRT u32WrPtr;
466 } MVD_SLQ_ES_ST;
467
468 typedef struct _MVD_FWBuff
469 {
470 MS_VIRT pu8MVDGetVolBufStart;
471 MS_VIRT u32VolAdd;
472 MS_VIRT pu8MVDGetFrameInfoBufStart;
473 MS_VIRT pu8MVDSetHeaderBufStart;
474 MS_VIRT u32UserDataBuf;
475 MS_VIRT u32MVDFWSLQTABTmpbufAdr;
476 MS_VIRT u32MVDFWPtsTblAddr;
477 MS_VIRT u32DynScalingAdd;
478 MS_VIRT u32ScalerInfoAdd;
479 MS_VIRT u32DecFrmInfoAdd;
480 MS_VIRT u32VBBUTableAdd;
481 } MVD_FWBuff;
482
483 typedef enum _FW_BUFF_TYPE
484 {
485 FW_BUFF_VOLINFO,
486 FW_BUFF_FRMINFO,
487 FW_BUFF_HDR,
488 FW_BUFF_USRDATA,
489 FW_BUFF_SLQTBL,
490 FW_BUFF_FWSLQTAB,
491 FW_BUFF_PTSTBL,
492 FW_BUFF_DS,
493 FW_BUFF_XCINFO,
494 FW_BUFF_DECFRMINFO,
495 } FW_BUFF_TYPE;
496
497 typedef struct _MVD_SLQTBLInfo
498 {
499 MS_U32 u32LastPts; ///< record the last PTS to handle the repeat case
500 MS_U32 u32DummyPktCnt; ///< accumulated dummy packet counter
501 MS_U32 u32SlqByteCnt; ///< accumulated byte counter
502 MS_VIRT u32ESBuffEnd; ///< miu offset of ES buffer end, used for report TS read/write ptr.
503 MS_VIRT u32FileEndPtr; ///< write ptr of file-end
504 MS_VIRT u32PreEsRd; ///< previous ES read ptr
505 MS_VIRT u32PreEsWr; ///< previous ES write ptr
506 MS_BOOL bRdyToFireCmd; ///< TRUE after FW is ready to update write pointer
507 MS_BOOL bSlqTblHasValidData; ///< TRUE if the write ptr is not updated
508 MS_BOOL bEnSlqTblHkCtrl;
509 BDMA_CpyType bdmaCpyType;
510 MVD_SLQ_STATUS* pSlqStatus;
511 MVD_SLQ_TBL_ST* pDrvSlqTbl;
512 MVD_SLQ_ES_ST* pDrvEsTbl;
513 MVD_SLQ_ES_ST* pDrvDivxTbl;
514 } MVD_SLQTBLInfo;
515
516 //Only keep one record of MIU setting since there should be only one,
517 //even for multiple decoders.
518 typedef struct _MVDMiuCfg
519 {
520 MS_PHY u32Miu1BaseAddr;
521 MS_PHY u32Miu2BaseAddr;
522 MS_PHY u32Miu3BaseAddr;
523 MS_U8 u8FWMiuSel;
524 MS_U8 u8HWMiuSel;
525 } MVDMiuCfg;
526
527 typedef struct
528 {
529 MS_U64 u64PTS;
530 MS_U32 u32POC;
531 MS_U8 u8FrameType;
532 } MVD_PVR_Seamless_Info;
533
534 typedef enum
535 {
536 E_MVD_DEC_0 = 0,
537 E_MVD_DEC_1,
538 E_MVD_DEC_MAX
539 } MVD_DecNum;
540 #ifdef VDEC3
541 #define MAX_DEC_NUM 16
542 #else
543 #define MAX_DEC_NUM E_MVD_DEC_MAX
544 #endif
545
546 //-------------------------------------------------------------------------------------------------
547 // Local Structures
548 //-------------------------------------------------------------------------------------------------
549
550
551 //-------------------------------------------------------------------------------------------------
552 // Global Variables
553 //-------------------------------------------------------------------------------------------------
554 static MS_VIRT u32RiuBaseAdd = 0;
555 MS_U8 _u8HalDbgLevel = 0;
556 #ifdef VDEC3//#ifdef VDEC3
557 static MS_U32 u32SharememoryBase[MAX_DEC_NUM] ={MVD_U32_MAX,MVD_U32_MAX,MVD_U32_MAX,MVD_U32_MAX};
558 #else
559 static MS_U32 u32SharememoryBase[MAX_DEC_NUM] ={MVD_U32_MAX,MVD_U32_MAX};
560 #endif
561 static MS_U8 u8SHMMiuSel=0;
562 #if 0
563 static MVD_MEMCfg stMemCfg[MAX_DEC_NUM];
564 static MVD_CtrlCfg stCtrlCfg[MAX_DEC_NUM];
565 static MVD_FWCfg stFwCfg[MAX_DEC_NUM];
566
567 // For SLQ table link
568 static MVD_SLQTBLInfo stSlqTblInfo[MAX_DEC_NUM];
569 static MVD_SLQ_STATUS _SlqStatus[MAX_DEC_NUM]; //for SLQ_NEW_PUSH
570 static MVD_SLQ_TBL_ST _drvSlqTbl[MAX_DEC_NUM];
571 static MVD_SLQ_ES_ST _drvEsTbl[MAX_DEC_NUM]; //maintain to report ES read/write ptr
572 static MVD_SLQ_ES_ST _drvDivxTbl[MAX_DEC_NUM]; //header for divx311
573 static FW_DIVX_INFO gdivxInfo[MAX_DEC_NUM];
574
575 MS_BOOL bSlqTblHKCtrl = FALSE; //read/write pointer can be accessed by HK directly
576 static MS_BOOL bStopped = TRUE;
577
578 static HAL_MVD_Stream _stMVDStream[MAX_DEC_NUM] = {
579 {E_HAL_MVD_MAIN_STREAM0, FALSE},
580 {E_HAL_MVD_SUB_STREAM0, FALSE},
581 //{E_HAL_MVD_SUB_STREAM1, FALSE},
582 };
583 static MVD_FWBuff stFWBuff[MAX_DEC_NUM];
584 #endif
585
586 #define FRM_RATE_CODE_NUM 9
587
588 typedef struct
589 {
590 MVD_MEMCfg stMemCfg[MAX_DEC_NUM];
591 MVD_CtrlCfg stCtrlCfg[MAX_DEC_NUM];
592 MVD_FWCfg stFwCfg[MAX_DEC_NUM];
593
594 // For SLQ table link
595 MVD_SLQTBLInfo stSlqTblInfo[MAX_DEC_NUM];
596 MVD_SLQ_STATUS _SlqStatus[MAX_DEC_NUM]; //for SLQ_NEW_PUSH
597 MVD_SLQ_TBL_ST _drvSlqTbl[MAX_DEC_NUM];
598 MVD_SLQ_ES_ST _drvEsTbl[MAX_DEC_NUM]; //maintain to report ES read/write ptr
599 MVD_SLQ_ES_ST _drvDivxTbl[MAX_DEC_NUM]; //header for divx311
600 FW_DIVX_INFO gdivxInfo[MAX_DEC_NUM];
601
602 MS_BOOL bSlqTblHKCtrl[MAX_DEC_NUM]; //read/write pointer can be accessed by HK directly
603 MS_BOOL bStopped[MAX_DEC_NUM];
604
605 HAL_MVD_Stream _stMVDStream[MAX_DEC_NUM];
606
607 MVD_FWBuff stFWBuff[MAX_DEC_NUM];
608
609 #if _SLQTBL_DUMP_PKT
610 MS_U32 u32SendTimes[MAX_DEC_NUM];//HAL_MVD_SLQTblSendPacket
611 #endif
612
613 MS_U32 u32pqTimes[MAX_DEC_NUM];//HAL_MVD_PushQueue
614 MS_BOOL bSetSkip[MAX_DEC_NUM];//MVD_FlushTSQueue
615
616 MS_U32 u32PreVdCnt[MAX_DEC_NUM];//HAL_MVD_DbgDump
617 MS_U32 u32PreErrCnt[MAX_DEC_NUM];
618 MS_BOOL b1stDump[MAX_DEC_NUM];
619 //pre_set
620 HAL_MVD_Pre_Ctrl gMVDPreCtrl[MAX_DEC_NUM];
621 MS_BOOL bAutoInsertDummyPattern[MAX_DEC_NUM];
622 MVDMiuCfg stMiuCfg;
623 MS_BOOL bDropOnePTS[MAX_DEC_NUM];
624 MVD_ALIVEInfo aliveInfo[MAX_DEC_NUM];
625
626 MS_U32 u32DmxFrameRate[MAX_DEC_NUM];
627 MS_U32 u32DmxFrameRateBase[MAX_DEC_NUM];
628 MS_BOOL bCMAUsed;
629
630 struct CMA_Pool_Init_Param cmaInitParam; // support two MIU
631 struct CMA_Pool_Free_Param cmaFreeParam[MAX_DEC_NUM];
632 MS_BOOL bCMATwoMIU[MAX_DEC_NUM];
633 MS_U32 u32LastAliveTime[MAX_DEC_NUM];
634 } MVD_Hal_CTX;
635
636 //global variables
637 MVD_Hal_CTX* pMVDHalContext = NULL;
638 MVD_Hal_CTX gMVDHalContext;
639 const MS_U16 stFrameRateCode[FRM_RATE_CODE_NUM]=
640 {
641 NULL,23976,24000,25000,29976,30000,50000,59947,60000
642 };
643
644
645 #define GET_VOL_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].pu8MVDGetVolBufStart
646 #define GET_VOL_BUFFADD_NONCACHE(idx) pMVDHalContext->stFWBuff[(idx)].u32VolAdd
647 #define GET_FRMINFO_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].pu8MVDGetFrameInfoBufStart
648 #define GET_HDR_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].pu8MVDSetHeaderBufStart
649 #define GET_USRDATA_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].u32UserDataBuf
650 #define GET_SLQ_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].u32MVDFWSLQTABTmpbufAdr
651 #define GET_PTSTBL_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].u32MVDFWPtsTblAddr
652 #define GET_DS_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].u32DynScalingAdd
653 #define GET_XCINFO_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].u32ScalerInfoAdd
654 #define GET_DECFRMINFO_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].u32DecFrmInfoAdd
655 #define GET_VBBUTABLEADD(idx) pMVDHalContext->stFWBuff[(idx)].u32VBBUTableAdd
656
657
658
659 //-------------------------------------------------------------------------------------------------
660 // Local Variables
661 //-------------------------------------------------------------------------------------------------
662
663
664 //-------------------------------------------------------------------------------------------------
665 // Debug Functions
666 //-------------------------------------------------------------------------------------------------
667
668
669 //-------------------------------------------------------------------------------------------------
670 // Local Functions
671 //-------------------------------------------------------------------------------------------------
672
HAL_MVD_Context_Init(void)673 static void HAL_MVD_Context_Init(void)
674 {
675 #ifdef VDEC3
676 MS_U8 i;
677
678 for (i = 0; i < MAX_DEC_NUM; i++)
679 {
680 pMVDHalContext->bStopped[i] = TRUE;
681 pMVDHalContext->b1stDump[i] = TRUE;
682 pMVDHalContext->_stMVDStream[i].eStreamId = E_HAL_MVD_N_STREAM0 + i;
683 }
684 #else
685 pMVDHalContext->bStopped[0] = TRUE;
686 pMVDHalContext->bStopped[1] = TRUE;
687 pMVDHalContext->_stMVDStream[0].eStreamId = E_HAL_MVD_MAIN_STREAM0;
688 pMVDHalContext->_stMVDStream[1].eStreamId = E_HAL_MVD_SUB_STREAM0;
689
690 pMVDHalContext->b1stDump[0] = TRUE;
691 pMVDHalContext->b1stDump[1] = TRUE;
692 #endif
693 }
694
695
696
HAL_MVD_SetIsUsed(MS_U8 u8Idx,MS_BOOL bUsed)697 static void HAL_MVD_SetIsUsed(MS_U8 u8Idx, MS_BOOL bUsed)
698 {
699 pMVDHalContext->_stMVDStream[u8Idx].bUsed = bUsed;
700 }
701
702 //Given the start address & the available size for the FW buffers,
703 //return the address of each buffers.
704 //Now only support u8Size==1, 2, 4
MVD_GetFWBuffData(MS_U8 u8Idx,FW_BUFF_TYPE eBuffType,MS_U16 u16Offset,MS_U8 u8Size)705 static MS_U32 MVD_GetFWBuffData(MS_U8 u8Idx, FW_BUFF_TYPE eBuffType, MS_U16 u16Offset, MS_U8 u8Size)
706 {
707 MS_U32 u32Val = 0;
708 MS_VIRT u32BufStart = NULL;
709 switch (eBuffType)
710 {
711 case FW_BUFF_VOLINFO: u32BufStart = GET_VOL_BUFFADD(u8Idx); break;
712 case FW_BUFF_FRMINFO: u32BufStart = GET_FRMINFO_BUFFADD(u8Idx); break;
713 case FW_BUFF_HDR: u32BufStart = GET_HDR_BUFFADD(u8Idx); break;
714 case FW_BUFF_USRDATA: u32BufStart = GET_USRDATA_BUFFADD(u8Idx); break;
715 case FW_BUFF_FWSLQTAB: u32BufStart = GET_SLQ_BUFFADD(u8Idx); break;
716 case FW_BUFF_PTSTBL: u32BufStart = GET_PTSTBL_BUFFADD(u8Idx); break;
717 case FW_BUFF_DS: u32BufStart = GET_DS_BUFFADD(u8Idx); break;
718 case FW_BUFF_XCINFO: u32BufStart = GET_XCINFO_BUFFADD(u8Idx); break;
719 case FW_BUFF_DECFRMINFO: u32BufStart = GET_DECFRMINFO_BUFFADD(u8Idx); break;
720 default:
721 break;
722 }
723 if (NULL == u32BufStart)
724 {
725 printf("%s err: u8Idx=0x%x, bufType=0x%x, offset=%d, size=%d\n",
726 __FUNCTION__, u8Idx, eBuffType, u16Offset, u8Size);
727 return 0;
728 }
729
730 if (u8Size == sizeof(MS_U8))
731 {
732 u32Val = (MS_U32)HAL_MVD_MemReadByte(u32BufStart+u16Offset);
733 }
734 else if (u8Size == sizeof(MS_U32))
735 {
736 u32Val = HAL_MVD_MemRead4Byte(u32BufStart+u16Offset);
737 }
738 else if (u8Size == sizeof(MS_U16))
739 {
740 u32Val = HAL_MVD_MemRead2Byte(u32BufStart+u16Offset);
741 }
742
743 MVD_DEBUGVERBAL(printf("%s: u32Val=%d for u8Idx=0x%x, bufType=0x%x, offset=%d, size=%d\n",
744 __FUNCTION__, u32Val, u8Idx, eBuffType, u16Offset, u8Size));
745 return u32Val;
746 }
747
748 #ifdef VDEC3
MVD_SetFWBuffData(MS_U8 u8Idx,FW_BUFF_TYPE eBuffType,MS_U16 u16Offset,MS_U8 u8Size,MS_U32 u32Value)749 static void MVD_SetFWBuffData(MS_U8 u8Idx, FW_BUFF_TYPE eBuffType, MS_U16 u16Offset, MS_U8 u8Size, MS_U32 u32Value)
750 {
751 MS_VIRT u32BufStart = NULL;
752
753 switch (eBuffType)
754 {
755 case FW_BUFF_VOLINFO: u32BufStart = GET_VOL_BUFFADD(u8Idx); break;
756 case FW_BUFF_FRMINFO: u32BufStart = GET_FRMINFO_BUFFADD(u8Idx); break;
757 case FW_BUFF_HDR: u32BufStart = GET_HDR_BUFFADD(u8Idx); break;
758 case FW_BUFF_USRDATA: u32BufStart = GET_USRDATA_BUFFADD(u8Idx); break;
759 case FW_BUFF_FWSLQTAB: u32BufStart = GET_SLQ_BUFFADD(u8Idx); break;
760 case FW_BUFF_PTSTBL: u32BufStart = GET_PTSTBL_BUFFADD(u8Idx); break;
761 case FW_BUFF_DS: u32BufStart = GET_DS_BUFFADD(u8Idx); break;
762 case FW_BUFF_XCINFO: u32BufStart = GET_XCINFO_BUFFADD(u8Idx); break;
763 case FW_BUFF_DECFRMINFO: u32BufStart = GET_DECFRMINFO_BUFFADD(u8Idx); break;
764 default:
765 break;
766 }
767
768 if (NULL == u32BufStart)
769 {
770 printf("%s err: u8Idx=0x%x, bufType=0x%x, offset=%d, size=%d, value=%d\n",
771 __FUNCTION__, (unsigned int)u8Idx,(unsigned int) eBuffType,(unsigned int) u16Offset,(unsigned int) u8Size,(unsigned int)u32Value);
772 }
773
774 if (pMVDHalContext->stMiuCfg.u8HWMiuSel == MIU_SEL_1)
775 {
776 u32BufStart += HAL_MIU1_BASE;
777 }
778 /* else if (pMVDHalContext->stMiuCfg.u8HWMiuSel == MIU_SEL_2)
779 {
780 u32BufStart += HAL_MIU2_BASE;
781 }*/
782
783 if (u8Size == sizeof(MS_U8))
784 {
785 MS_U8* temp = (MS_U8*)MsOS_PA2KSEG1(u32BufStart+u16Offset);
786 *temp = (MS_U8)u32Value;
787 }
788 else if (u8Size == sizeof(MS_U32))
789 {
790 MS_U32* temp = (MS_U32*)MsOS_PA2KSEG1(u32BufStart+u16Offset);
791 *temp = (MS_U32)u32Value;
792 }
793 else if (u8Size == sizeof(MS_U16))
794 {
795 MS_U16* temp = (MS_U16*)MsOS_PA2KSEG1(u32BufStart+u16Offset);
796 *temp = (MS_U16)u32Value;
797 }
798
799 MVD_DEBUGVERBAL(printf("%s: u8Idx=0x%x, bufType=0x%x, offset=%d, size=%d, value=%d\n",
800 __FUNCTION__, (unsigned int)u8Idx, (unsigned int)eBuffType, (unsigned int)u16Offset, (unsigned int)u8Size,(unsigned int)u32Value));
801 }
802 #endif
803
804
805 //-------------------------------------------------------------------------------------------------
806 // Global Functions
807 //-------------------------------------------------------------------------------------------------
HAL_MVD_SetDbgLevel(MS_U8 level)808 void HAL_MVD_SetDbgLevel(MS_U8 level)
809 {
810 _u8HalDbgLevel = level;
811 return;
812 }
813
814
HAL_MVD_GetCaps(void)815 MS_U8 HAL_MVD_GetCaps(void)
816 {
817 MS_U8 caps = 0;
818
819 caps |= (MVD_SUPPORT_MPEG2|MVD_SUPPORT_MPEG4|MVD_SUPPORT_VC1);
820 return caps;
821 }
822
HAL_MVD_GetMaxPixel(MS_U32 u32Id)823 MS_U64 HAL_MVD_GetMaxPixel(MS_U32 u32Id)
824 {
825 return (MS_U64)MVD_HW_MAX_PIXEL/1000;
826 }
827
HAL_MVD_GetDrvFwVer(void)828 MS_U32 HAL_MVD_GetDrvFwVer(void)
829 {
830 return MVD_FW_VERSION;
831 }
832
833 #if 0
834 MS_U32 HAL_MVD_GetMiu1BaseAdd(void)
835 {
836 return MIU1_BASEADDR;
837 }
838 #endif
839
840 //#if defined(CHIP_MUJI)
HAL_MVD_GetMiu1BaseAdd(void)841 MS_VIRT HAL_MVD_GetMiu1BaseAdd(void)
842 {
843 return MIU1_BASEADDR;
844 }
845
HAL_MVD_GetFWSelMiu1(void)846 MS_BOOL HAL_MVD_GetFWSelMiu1(void)
847 {
848 return MVDCPU_ON_MIU1;
849 }
850 //#endif
851
852
HAL_MVD_GetFWSelMiu(void)853 MS_U8 HAL_MVD_GetFWSelMiu(void)
854 {
855 return pMVDHalContext->stMiuCfg.u8FWMiuSel;
856 }
857
858
859
HAL_MVD_MemGetMap(MS_U8 u8Idx,MS_U8 u8type,MS_VIRT * pu32addr,MS_SIZE * pu32len)860 void HAL_MVD_MemGetMap(MS_U8 u8Idx, MS_U8 u8type, MS_VIRT* pu32addr, MS_SIZE* pu32len)
861 {
862 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
863 MS_VIRT u32StartOffset;
864 MS_U8 u8MiuSel;
865
866 switch (u8type)
867 {
868 case E_MVD_MMAP_ALL:
869 case E_MVD_MMAP_FW:
870 _phy_to_miu_offset(u8MiuSel, u32StartOffset, pstMemCfg->u32FWCodeAddr);
871 *pu32addr = u32StartOffset;
872 *pu32len = pstMemCfg->u32FWCodeSize;
873 break;
874 case E_MVD_MMAP_BS:
875 _phy_to_miu_offset(u8MiuSel, u32StartOffset, pstMemCfg->u32BSAddr);
876 *pu32addr = u32StartOffset;
877 *pu32len = pstMemCfg->u32BSSize;
878 break;
879 case E_MVD_MMAP_FB:
880 _phy_to_miu_offset(u8MiuSel, u32StartOffset, pstMemCfg->u32FBAddr);
881 *pu32addr = u32StartOffset;
882 *pu32len = pstMemCfg->u32FBSize;
883 break;
884 case E_MVD_MMAP_DRV:
885 _phy_to_miu_offset(u8MiuSel, u32StartOffset, pstMemCfg->u32DrvBufAddr);
886 *pu32addr = u32StartOffset;
887 *pu32len = pstMemCfg->u32DrvBufSize;
888 break;
889 default:
890 break;
891 }
892
893 MVD_DEBUGINFO(printf("HAL_MVD_MemGetMap[%d] add=0x%lx len=0x%lx\n",u8type,(unsigned long)*pu32addr,(unsigned long)*pu32len));
894 return;
895 }
896
HAL_MVD_RegSetBase(MS_VIRT u32Base)897 void HAL_MVD_RegSetBase(MS_VIRT u32Base)
898 {
899 u32RiuBaseAdd = u32Base;
900 HAL_VPU_EX_InitRegBase(u32Base);
901 }
902
HAL_MVD_RegWriteByte(MS_VIRT u32Reg,MS_U8 u8Val)903 void HAL_MVD_RegWriteByte(MS_VIRT u32Reg, MS_U8 u8Val)
904 {
905 if ( __builtin_constant_p( u32Reg ) )
906 {
907 RIU8[((u32Reg) * 2) - ((u32Reg) & 1)] = u8Val;
908 }
909 else
910 {
911 RIU8[(u32Reg << 1) - (u32Reg & 1)] = u8Val;
912 }
913 }
914
HAL_MVD_RegReadByte(MS_VIRT u32Reg)915 MS_U8 HAL_MVD_RegReadByte(MS_VIRT u32Reg)
916 {
917 return (__builtin_constant_p( u32Reg ) ?
918 (((u32Reg) & 0x01) ? RIU8[(u32Reg) * 2 - 1] : RIU8[(u32Reg) * 2]) :
919 (RIU8[(u32Reg << 1) - (u32Reg & 1)]));
920 }
921
HAL_MVD_RegWriteBit(MS_VIRT u32Reg,MS_BOOL bEnable,MS_U8 u8Mask)922 void HAL_MVD_RegWriteBit(MS_VIRT u32Reg, MS_BOOL bEnable, MS_U8 u8Mask)
923 {
924 MS_VIRT u32Reg8 = ((u32Reg) * 2) - ((u32Reg) & 1);
925 RIU8[u32Reg8] = (bEnable) ? (RIU8[u32Reg8] | (u8Mask)) :
926 (RIU8[u32Reg8] & ~(u8Mask));
927 }
928
HAL_MVD_RegWriteByteMask(MS_VIRT u32Reg,MS_U8 u8Val,MS_U8 u8Msk)929 void HAL_MVD_RegWriteByteMask(MS_VIRT u32Reg, MS_U8 u8Val, MS_U8 u8Msk)
930 {
931 MS_VIRT u32Reg8 = ((u32Reg) * 2) - ((u32Reg) & 1);
932 RIU8[u32Reg8] = (RIU8[u32Reg8] & ~(u8Msk)) | ((u8Val) & (u8Msk));
933 }
934
HAL_MVD_RegWrite4Byte(MS_VIRT u32Reg,MS_U32 u32Val)935 void HAL_MVD_RegWrite4Byte(MS_VIRT u32Reg, MS_U32 u32Val)
936 {
937 if ( __builtin_constant_p( u32Reg ) && !((u32Reg) & 0x01) )
938 {
939 RIU[u32Reg] = (MS_U16)(u32Val);
940 RIU[(u32Reg) + 2] = (MS_U16)((u32Val) >> 16);
941 }
942 else
943 {
944 if (u32Reg & 0x01)
945 {
946 RIU8[(u32Reg << 1) - 1] = u32Val;
947 RIU[u32Reg + 1] = (u32Val >> 8);
948 RIU8[((u32Reg + 3) << 1)] = (u32Val >> 24);
949 }
950 else
951 {
952 RIU[u32Reg] = u32Val;
953 RIU[u32Reg + 2] = (u32Val >> 16);
954 }
955 }
956 }
957
958
HAL_MVD_MemRead4Byte(MS_VIRT u32Address)959 MS_U32 HAL_MVD_MemRead4Byte(MS_VIRT u32Address)
960 {
961 volatile MS_U32 u32Val;
962 MS_ASSERT(!(u32Address & 0x03UL));
963
964 HAL_MVD_CPU_Sync();
965 HAL_MVD_ReadMemory();
966
967 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32Address,u32Address);
968
969 u32Val = *(volatile MS_U32*) HAL_MVD_PA2NonCacheSeg(u32Address);
970
971 //printf("mvd rd 0x%lx = 0x%lx\n", u32Address, u32Val);
972 return u32Val;
973 }
974
HAL_MVD_MemRead2Byte(MS_VIRT u32Address)975 MS_U16 HAL_MVD_MemRead2Byte(MS_VIRT u32Address)
976 {
977 MS_VIRT u32ReadAddr;
978 MS_U32 u32ReadValue;
979 MS_U16 u16Value;
980 MS_U8 u8Shift;
981 u32ReadAddr = (u32Address >> 2) << 2;
982 u8Shift = (MS_U8)((u32Address & 0x03) * 8);
983 u32ReadValue = HAL_MVD_MemRead4Byte(u32ReadAddr);
984
985 u16Value = (MS_U16)(u32ReadValue >> u8Shift);
986 if(u8Shift == 24)
987 {
988 u32ReadValue = HAL_MVD_MemRead4Byte(u32ReadAddr+4);
989 u16Value = u16Value << 8 || (MS_U16)(u32ReadValue & 0xFF);
990 }
991 return u16Value;
992 }
993
HAL_MVD_MemReadByte(MS_VIRT u32Address)994 MS_U8 HAL_MVD_MemReadByte(MS_VIRT u32Address)
995 {
996 MS_VIRT u32ReadAddr;
997 MS_U32 u32ReadValue;
998 MS_U8 u8Value;
999 MS_U8 u8Shift;
1000 u32ReadAddr = (u32Address >> 2) << 2;
1001 u8Shift = (MS_U8)((u32Address & 0x03) * 8);
1002 u32ReadValue = HAL_MVD_MemRead4Byte(u32ReadAddr);
1003 u8Value = (MS_U8)(u32ReadValue >> u8Shift);
1004
1005 return u8Value;
1006 }
1007
HAL_MVD_MemWrite4Byte(MS_VIRT u32Address,MS_U32 u32Value)1008 MS_BOOL HAL_MVD_MemWrite4Byte(MS_VIRT u32Address, MS_U32 u32Value)
1009 {
1010
1011 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32Address,u32Address);
1012
1013 *(volatile MS_U32 *) HAL_MVD_PA2NonCacheSeg(u32Address) = u32Value;
1014
1015 HAL_MVD_CPU_Sync();
1016 HAL_MVD_FlushMemory();
1017
1018 return TRUE;
1019 }
1020
HAL_MVD_MemWriteByte(MS_VIRT u32Address,MS_U8 u8Value)1021 MS_BOOL HAL_MVD_MemWriteByte(MS_VIRT u32Address, MS_U8 u8Value)
1022 {
1023 MS_VIRT u32ReadAddr;
1024 MS_U32 u32ReadValue;
1025 MS_U8 u8Shift;
1026
1027 u32ReadAddr = (u32Address >> 2) << 2;
1028 u8Shift = (MS_U8)((u32Address & 0x03UL) * 8);
1029 u32ReadValue = HAL_MVD_MemRead4Byte(u32ReadAddr);
1030 u32ReadValue &= ~(0xFFUL << u8Shift);
1031 u32ReadValue |= ((MS_U32)u8Value << u8Shift);
1032 HAL_MVD_MemWrite4Byte(u32ReadAddr, u32ReadValue);
1033 return TRUE;
1034 }
1035
HAL_MVD_MemWrite2Byte(MS_VIRT u32Address,MS_U16 u16Value)1036 MS_BOOL HAL_MVD_MemWrite2Byte(MS_VIRT u32Address, MS_U16 u16Value)
1037 {
1038 MS_VIRT u32ReadAddr;
1039 MS_U32 u32ReadValue;
1040 MS_U8 u8Shift;
1041
1042 u8Shift = (MS_U8)((u32Address & 0x03UL) * 8) ;
1043 if(u8Shift < 24)
1044 {
1045 u32ReadAddr = (u32Address >> 2) << 2;
1046 u32ReadValue = HAL_MVD_MemRead4Byte(u32ReadAddr);
1047 u32ReadValue &= ~(0xFFFF << u8Shift);
1048 u32ReadValue |= ((MS_U32)u16Value << u8Shift);
1049 HAL_MVD_MemWrite4Byte(u32ReadAddr, u32ReadValue);
1050 }
1051 else
1052 {
1053 HAL_MVD_MemWriteByte(u32Address, (MS_U8)(u16Value));
1054 HAL_MVD_MemWriteByte(u32Address+1, (MS_U8)(u16Value >> 8));
1055 }
1056 return TRUE;
1057 }
1058
1059
HAL_MVD_SetReqMask(MS_BOOL bEnMask)1060 void HAL_MVD_SetReqMask(MS_BOOL bEnMask)
1061 {
1062 HAL_VPU_EX_MIU_RW_Protect(bEnMask);
1063
1064 if (MVDHW_ON_MIU1)
1065 {
1066 HAL_MVD_RegWriteBit(MIU1_RQ2_MASK_L, bEnMask, BIT4); //MVD R/W
1067 HAL_MVD_RegWriteBit(MIU1_RQ0_MASK_H, bEnMask, BIT4); //MVD bbu R/W
1068 }
1069 else if(MVDHW_ON_MIU0)
1070 {
1071 HAL_MVD_RegWriteBit(MIU0_RQ2_MASK_L, bEnMask, BIT4); //MVD R/W
1072 HAL_MVD_RegWriteBit(MIU0_RQ0_MASK_H, bEnMask, BIT4); //MVD bbu R/W
1073 }
1074
1075 HAL_MVD_Delayms(1);
1076
1077 return;
1078 }
1079
HAL_MVD_Memset4Byte(MS_VIRT u32Address,MS_U32 u32Value)1080 static MS_BOOL HAL_MVD_Memset4Byte(MS_VIRT u32Address, MS_U32 u32Value)
1081 {
1082 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32Address,u32Address);
1083
1084 *(volatile MS_U32 *) HAL_MVD_PA2NonCacheSeg(u32Address) = u32Value;
1085
1086 return TRUE;
1087 }
1088
1089 //------------------------------------------------------------------------------
1090 /// Initialize MVD
1091 /// @return -result of resetting MVD hardware
1092 //------------------------------------------------------------------------------
HAL_MVD_RstHW(void)1093 MS_BOOL HAL_MVD_RstHW(void)
1094 {
1095 MS_U32 u32Time = 0;
1096
1097 OSAL_MVD_LockHwMutex();
1098
1099 HAL_MVD_SetReqMask(ENABLE);
1100
1101 HAL_MVD_RegWriteBit(MVD_CTRL, 1, MVD_CTRL_DISCONNECT_MIU);//disconnect MIU
1102 HAL_MVD_RegWriteBit(MVD_CTRL, 0, MVD_CTRL_DISCONNECT_MIU);//release reset
1103
1104 HAL_MVD_RegWriteBit(MVD_CTRL, 1, MVD_CTRL_RST);//reset MVD
1105 HAL_MVD_RegWriteBit(MVD_CTRL, 0, MVD_CTRL_RST);//release reset
1106
1107 u32Time = HAL_MVD_GetTime();
1108 while ( ((HAL_MVD_RegReadByte(MVD_STATUS) & MVD_STATUS_READY) == 0)
1109 && ((HAL_MVD_GetTime() - u32Time) < 200) );
1110
1111 #if 0 //bring up
1112 printf("====================>>>>MVD Ctrl status1.5a : 0x%x\n",HAL_MVD_RegReadByte(MVD_STATUS));
1113 HAL_MVD_RegWriteBit(MVD_STATUS, 1, MVD_T8_MIU_128_0);//release reset
1114 HAL_MVD_RegWriteBit(MVD_STATUS, 1, MVD_T8_MIU_128_1);//release reset
1115 MVD_DEBUGINFO(printf("MVD Ctrl status : 0x%x\n",HAL_MVD_RegReadByte(MVD_STATUS)));
1116 printf("====================>>>>MVD Ctrl status1.5b : 0x%x\n",HAL_MVD_RegReadByte(MVD_STATUS));
1117 #endif
1118
1119 HAL_MVD_SetReqMask(DISABLE);
1120
1121 OSAL_MVD_UnlockHwMutex();
1122
1123 return TRUE;
1124 }
1125
1126
1127 //------------------------------------------------------------------------------
1128 /// Release CPU
1129 /// @return -release CPU successfully or not
1130 //------------------------------------------------------------------------------
HAL_MVD_ReleaseFW(void)1131 MS_BOOL HAL_MVD_ReleaseFW(void)
1132 {
1133 //For dual decoder, we only release VPU if it is not released yet.
1134 if (TRUE == HAL_VPU_EX_IsRsted())
1135 {
1136 MVD_DEBUGINFO(printf("%s VPU_IsRsted\n", __FUNCTION__));
1137 return TRUE;
1138 }
1139
1140 HAL_VPU_EX_SwRstRelse();
1141 return TRUE;
1142 }
1143
HAL_MVD_PA2NonCacheSeg(MS_PHY u32PhyAddr)1144 MS_VIRT HAL_MVD_PA2NonCacheSeg(MS_PHY u32PhyAddr)
1145 {
1146 return MS_PA2KSEG1(u32PhyAddr);
1147 }
1148
HAL_MVD_GetTime(void)1149 MS_U32 HAL_MVD_GetTime(void)
1150 {
1151 return MsOS_GetSystemTime();
1152 }
1153
HAL_MVD_Delayms(MS_U32 u32msecs)1154 void HAL_MVD_Delayms(MS_U32 u32msecs)
1155 {
1156 MsOS_DelayTask(u32msecs);
1157 }
1158
HAL_MVD_CPU_Sync(void)1159 void HAL_MVD_CPU_Sync(void)
1160 {
1161 MAsm_CPU_Sync();
1162 }
1163
HAL_MVD_FlushMemory(void)1164 void HAL_MVD_FlushMemory(void)
1165 {
1166 MsOS_FlushMemory();
1167 }
1168
HAL_MVD_ReadMemory(void)1169 void HAL_MVD_ReadMemory(void)
1170 {
1171 MsOS_ReadMemory();
1172 }
1173
1174 //Record the memory layout from system configuration
HAL_MVD_SetMEMCfg(MS_U8 u8Idx,MVD_MEMCfg * pMEMCfg)1175 MS_BOOL HAL_MVD_SetMEMCfg(MS_U8 u8Idx, MVD_MEMCfg* pMEMCfg)
1176 {
1177 memcpy(&(pMVDHalContext->stMemCfg[u8Idx]), pMEMCfg, sizeof(MVD_MEMCfg));
1178 //record the MIU settings
1179 pMVDHalContext->stMiuCfg.u32Miu1BaseAddr = pMEMCfg->u32Miu1BaseAddr;
1180 pMVDHalContext->stMiuCfg.u32Miu2BaseAddr = pMEMCfg->u32Miu2BaseAddr;
1181 pMVDHalContext->stMiuCfg.u32Miu3BaseAddr = pMEMCfg->u32Miu3BaseAddr;
1182 pMVDHalContext->stMiuCfg.u8FWMiuSel = pMEMCfg->u8FWMiuSel;
1183 pMVDHalContext->stMiuCfg.u8HWMiuSel = pMEMCfg->u8HWMiuSel;
1184 return TRUE;
1185 }
1186
HAL_MVD_GetMEMCfg(MS_U8 u8Idx)1187 MVD_MEMCfg* HAL_MVD_GetMEMCfg(MS_U8 u8Idx)
1188 {
1189 //printf("%s: u8Idx=0x%x\n", __FUNCTION__, u8Idx);
1190 MVD_MEMCfg* pInfo = NULL;
1191 pInfo = &(pMVDHalContext->stMemCfg[u8Idx]);
1192 return pInfo;
1193 }
1194
HAL_MVD_SetFWCfg(MS_U8 u8Idx,MVD_FWCfg * pFWCfg)1195 MS_BOOL HAL_MVD_SetFWCfg(MS_U8 u8Idx, MVD_FWCfg* pFWCfg)
1196 {
1197 //printf("%s: u8Idx=0x%x\n", __FUNCTION__, u8Idx);
1198 memcpy(&(pMVDHalContext->stFwCfg[u8Idx]), pFWCfg, sizeof(MVD_FWCfg));
1199 memcpy(&(pMVDHalContext->stFwCfg[u8Idx].stFBReduction), &pFWCfg->stFBReduction,sizeof(MVD_FB_Reduction));
1200 return TRUE;
1201 }
1202
HAL_MVD_GetFWCfg(MS_U8 u8Idx)1203 MVD_FWCfg* HAL_MVD_GetFWCfg(MS_U8 u8Idx)
1204 {
1205 MVD_FWCfg* pInfo = NULL;
1206 //printf("%s: u8Idx=0x%x\n", __FUNCTION__, u8Idx);
1207 pInfo = &(pMVDHalContext->stFwCfg[u8Idx]);
1208 return pInfo;
1209 }
1210
HAL_MVD_GetFBMode(MS_U8 u8Idx)1211 MS_U8 HAL_MVD_GetFBMode(MS_U8 u8Idx)
1212 {
1213 MS_U8 u8Mode = MVD3_SD_MODE;
1214 u8Mode = pMVDHalContext->stFwCfg[u8Idx].u8FBMode;
1215 MVD_DEBUGINFO(printf("FBMode=0x%x\n", u8Mode));
1216 return u8Mode;
1217 }
1218
HAL_MVD_GetCodecType(MS_U8 u8Idx)1219 MVD_CodecType HAL_MVD_GetCodecType(MS_U8 u8Idx)
1220 {
1221 MVD_CodecType eCodecType = E_MVD_CODEC_UNKNOWN;
1222 eCodecType = pMVDHalContext->stFwCfg[u8Idx].eCodecType;
1223 return eCodecType;
1224 }
1225
HAL_MVD_GetSrcMode(MS_U8 u8Idx)1226 MVD_SrcMode HAL_MVD_GetSrcMode(MS_U8 u8Idx)
1227 {
1228 MVD_SrcMode eSrcMode = E_MVD_SRC_UNKNOWN;
1229 eSrcMode = pMVDHalContext->stFwCfg[u8Idx].eSrcMode;
1230 return eSrcMode;
1231 }
1232
HAL_MVD_SetSrcMode(MS_U8 u8Idx,MVD_SrcMode mode)1233 MS_BOOL HAL_MVD_SetSrcMode(MS_U8 u8Idx,MVD_SrcMode mode)
1234 {
1235 if(pMVDHalContext != NULL)
1236 {
1237 pMVDHalContext->stFwCfg[u8Idx].eSrcMode = mode;
1238 return TRUE;
1239 }
1240 else
1241 {
1242 return FALSE;
1243 }
1244 }
1245
1246
HAL_MVD_GetCtrlCfg(MS_U8 u8Idx)1247 MVD_CtrlCfg* HAL_MVD_GetCtrlCfg(MS_U8 u8Idx)
1248 {
1249 MVD_CtrlCfg* pInfo = NULL;
1250 pInfo = &(pMVDHalContext->stCtrlCfg[u8Idx]);
1251 return pInfo;
1252 }
1253
HAL_MVD_GetSlqTblInfo(MS_U8 u8Idx)1254 MVD_SLQTBLInfo* HAL_MVD_GetSlqTblInfo(MS_U8 u8Idx)
1255 {
1256 MVD_SLQTBLInfo* pInfo = NULL;
1257 pInfo = &(pMVDHalContext->stSlqTblInfo[u8Idx]);
1258 return pInfo;
1259 }
1260
HAL_MVD_PowerCtrl(MS_BOOL bOn)1261 void HAL_MVD_PowerCtrl(MS_BOOL bOn)
1262 {
1263 #ifdef CONFIG_MSTAR_CLKM
1264 HAL_VPU_EX_SetClkManagement(E_VPU_EX_CLKPORT_MVD, bOn);
1265 #else
1266 HAL_MVD_RegWriteByteMask(REG_CKG_MVD, CKG_MVD_160MHZ, CKG_MVD_MASK);
1267 HAL_MVD_RegWriteBit(REG_CKG_MVD, !bOn, CKG_MVD_GATED);
1268 HAL_MVD_RegWriteBit(REG_CKG_MVD, !bOn, CKG_MVD_INVERT);
1269 #endif
1270 HAL_MVD_RegWriteBit(REG_CKG_MVD_CHROMA_A, !bOn, CKG_MVD_CHROMA_A_GATED);
1271 HAL_MVD_RegWriteBit(REG_CKG_MVD_CHROMA_A, !bOn, CKG_MVD_CHROMA_A_INVERT);
1272
1273 HAL_MVD_RegWriteBit(REG_CKG_MVD_CHROMA_B, !bOn, CKG_MVD_CHROMA_B_GATED);
1274 HAL_MVD_RegWriteBit(REG_CKG_MVD_CHROMA_B, !bOn, CKG_MVD_CHROMA_B_INVERT);
1275
1276 HAL_MVD_RegWriteBit(REG_CKG_MVD_CHROMA_C, !bOn, CKG_MVD_CHROMA_C_GATED);
1277 HAL_MVD_RegWriteBit(REG_CKG_MVD_CHROMA_C, !bOn, CKG_MVD_CHROMA_C_INVERT);
1278
1279 HAL_MVD_RegWriteBit(REG_CKG_MVD_LUMA_A, !bOn, CKG_MVD_LUMA_A_GATED);
1280 HAL_MVD_RegWriteBit(REG_CKG_MVD_LUMA_A, !bOn, CKG_MVD_LUMA_A_INVERT);
1281
1282 HAL_MVD_RegWriteBit(REG_CKG_MVD_LUMA_B, !bOn, CKG_MVD_LUMA_B_GATED);
1283 HAL_MVD_RegWriteBit(REG_CKG_MVD_LUMA_B, !bOn, CKG_MVD_LUMA_B_INVERT);
1284
1285 HAL_MVD_RegWriteBit(REG_CKG_MVD_LUMA_C, !bOn, CKG_MVD_LUMA_C_GATED);
1286 HAL_MVD_RegWriteBit(REG_CKG_MVD_LUMA_C, !bOn, CKG_MVD_LUMA_C_INVERT);
1287
1288 HAL_MVD_RegWriteBit(REG_CKG_MVD_RMEM, !bOn, CKG_MVD_RMEM_GATED);
1289 HAL_MVD_RegWriteBit(REG_CKG_MVD_RMEM, !bOn, CKG_MVD_RMEM_INVERT);
1290
1291 HAL_MVD_RegWriteBit(REG_CKG_MVD_RMEM1, !bOn, CKG_MVD_RMEM1_GATED);
1292 HAL_MVD_RegWriteBit(REG_CKG_MVD_RMEM1, !bOn, CKG_MVD_RMEM1_INVERT);
1293
1294 HAL_MVD_RegWriteBit(REG_CKG_MVD_RREFDAT, !bOn, CKG_MVD_RREFDAT_GATED);
1295 HAL_MVD_RegWriteBit(REG_CKG_MVD_RREFDAT, !bOn, CKG_MVD_RREFDAT_INVERT);
1296
1297 //Set MVD all clock sources equal to clk_miu_p 0: enable 1: disable
1298 //Per Lawrence, mark this line:
1299 // Sync mode is debug mode, so driver shouldn't write 1 to this register in normal case.
1300 //HAL_MVD_RegWriteBit(REG_CKG_MVD_SYNC, !bOn, CKG_MVD_SYNC_GATED);
1301
1302 return;
1303 }
1304
1305 #if 0
1306 void HAL_MVD_Sleep(MS_U32 u32us)
1307 {
1308 MsOS_DelayTaskUs(u32us);
1309 }
1310 #endif
HAL_MVD_ResetHandShake(MS_U8 u8Idx,MVD_HANDSHAKE_CMD cmd)1311 void HAL_MVD_ResetHandShake(MS_U8 u8Idx, MVD_HANDSHAKE_CMD cmd)
1312 {
1313 MS_U32 u32BufAddr = GET_FRMINFO_BUFFADD(u8Idx);
1314 HAL_MVD_CPU_Sync();
1315 HAL_MVD_ReadMemory();
1316 MVD_CMD_HANDSHADE_INDEX u32CmdState;
1317 u32CmdState.value= HAL_MVD_MemRead4Byte(u32BufAddr + OFFSET_CMD_HANDSHAKE_INDEX);
1318 switch (cmd)
1319 {
1320 case MVD_HANDSHAKE_PAUSE:
1321 (u32CmdState.mvdcmd_handshake_pause) = 0;
1322 break;
1323 case MVD_HANDSHAKE_SLQ_RST:
1324 (u32CmdState.mvdcmd_handshake_slq_reset) = 0;
1325 break;
1326 case MVD_HANDSHAKE_STOP:
1327 (u32CmdState.mvdcmd_handshake_stop) = 0;
1328 break;
1329 case MVD_HANDSHAKE_SKIP_DATA:
1330 (u32CmdState.mvdcmd_handshake_skip_data) = 0;
1331 break;
1332 case MVD_HANDSHAKE_SINGLE_STEP:
1333 (u32CmdState.mvdcmd_handshake_single_step) = 0;
1334 break;
1335 case MVD_HANDSHAKE_SCALER_INFO:
1336 (u32CmdState.mvdcmd_handshake_scaler_data_ready) = 0;
1337 break;
1338 case MVD_HANDSHAKE_GET_NXTDISPFRM:
1339 (u32CmdState.mvdcmd_handshake_get_nextdispfrm_ready) = 0;
1340 break;
1341 case MVD_HANDSHAKE_PARSER_RST:
1342 (u32CmdState.mvdcmd_handshake_parser_rst) = 0;
1343 break;
1344 case MVD_HANDSHAKE_RST_CC608:
1345 (u32CmdState.mvdcmd_handshake_cc608_rst) = 0;
1346 break;
1347 case MVD_HANDSHAKE_RST_CC708:
1348 (u32CmdState.mvdcmd_handshake_cc708_rst) = 0;
1349 break;
1350 case MVD_HANDSHAKE_VIRTUAL_COMMAND:
1351 (u32CmdState.mvdcmd_handshake_virtualCommand) = 0;
1352 break;
1353 case MVD_HANDSHAKE_FLUSHQUEUE_COMMAND:
1354 (u32CmdState.mvdcmd_handshake_flush) = 0;
1355 break;
1356 default:
1357 break;
1358 }
1359 HAL_MVD_MemWrite4Byte(u32BufAddr + OFFSET_CMD_HANDSHAKE_INDEX,u32CmdState.value);
1360 MsOS_FlushMemory();
1361 }
1362
1363 //------------------------------------------------------------------------------
1364 /// Wait MVD command ready or timeout
1365 /// @return -MVD command ready or timeout
1366 //------------------------------------------------------------------------------
HAL_MVD_TimeOut(MS_U8 u8Idx)1367 MS_BOOL HAL_MVD_TimeOut(MS_U8 u8Idx)
1368 {
1369 MS_U32 i;
1370 MS_U32 u32StartTime = MsOS_GetSystemTime();
1371
1372 for ( i = 0; i < MVD_PollingTimes; i++ )
1373 {
1374 ///- wait until MVD command ready or timeout
1375 if ( ( HAL_MVD_RegReadByte(MVD_STATUS) & MVD_STATUS_READY ) == MVD_STATUS_READY )
1376 {
1377 return FALSE;
1378 }
1379
1380 if (/*(TRUE == pMVDHalContext->bStopped[u8Idx]) ||*/ ((MsOS_GetSystemTime()-u32StartTime)>1300))
1381 {
1382 MVD_DEBUGINFO(printf("%s: bStopped(%x) or timeout(%d)\n", __FUNCTION__, pMVDHalContext->bStopped[u8Idx], MsOS_GetSystemTime()-u32StartTime));
1383 return TRUE;
1384 }
1385
1386 //HAL_MVD_Sleep(5);
1387 }
1388 MVD_DEBUGERROR( printf("MVD_TimeOut=%x\n", i) );
1389 return TRUE;
1390 }
1391
1392 //------------------------------------------------------------------------------
1393 /// Set MVD firmware command
1394 /// @param -u8cmd \b IN : MVD command
1395 /// @param -pstCmdArg \b IN : pointer to command argument
1396 //------------------------------------------------------------------------------
HAL_MVD_MVDCommand(MS_U8 u8cmd,MVD_CmdArg * pstCmdArg)1397 MS_BOOL HAL_MVD_MVDCommand ( MS_U8 u8cmd, MVD_CmdArg *pstCmdArg )
1398 {
1399 MS_BOOL bRet = TRUE;
1400 #ifdef VDEC3
1401 MS_U32 u32CmdArg;
1402 MS_U32 u32Ret = FALSE;
1403 MS_U32 u32Timeout;
1404 MS_U8 u8HalIdx = pstCmdArg->Arg5;
1405 MS_U32 u32Id = MVD_GetStreamId(u8HalIdx);
1406 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
1407 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8HalIdx);
1408 CMD_QUEUE *pShm = (CMD_QUEUE *)MsOS_PA2KSEG1(pstMemCfg->u32FWCodeAddr + VCOMMANDQ_INFO_START + u8VPUIdx*0x100000);
1409 MS_VIRT u32BufStart2 = NULL;
1410 MS_BOOL bResponse = FALSE;
1411 #endif
1412 OSAL_MVD_LockHwMutex();
1413
1414 #ifdef VDEC3
1415 if(HAL_MVD_IsDisplayCommand(u8cmd) == TRUE)
1416 {
1417 if(HAL_MVD_IsNeedResponseCommand(u8cmd) == TRUE)
1418 {
1419 // clear handshake dram
1420 u32BufStart2 = GET_VOL_BUFFADD(u8HalIdx);
1421
1422 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32BufStart2,u32BufStart2);
1423
1424 MS_U8* temp2 = (MS_U8*)MsOS_PA2KSEG1(u32BufStart2+OFFSET_VCHANDSHAKE);
1425
1426 *temp2 = 0;
1427
1428 MsOS_FlushMemory();
1429 }
1430
1431
1432 u32CmdArg = pstCmdArg->Arg0 | (pstCmdArg->Arg1<<8) | (pstCmdArg->Arg2 << 16) | (pstCmdArg->Arg3 << 24);
1433
1434 u32Timeout = MsOS_GetSystemTime()+VIRTUAL_CMD_TIMEOUT;
1435
1436 do
1437 {
1438 u32Ret = HAL_VPU_EX_DRAMStreamDispCMDQueueSend(u32Id,(void*)pShm,E_HVD_CMDQ_ARG,u32CmdArg);
1439
1440
1441 if(u32Ret == E_HVD_COMMAND_QUEUE_NOT_INITIALED)
1442 {
1443 bRet = FALSE;
1444 break;
1445 }
1446 else if (MsOS_GetSystemTime() > u32Timeout && u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL )
1447 {
1448 bRet = FALSE;
1449 break;
1450 }
1451 }while(u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL);
1452
1453 if(bRet == FALSE || u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL)
1454 {
1455 bRet = FALSE;
1456 goto _CMD_DONE;
1457 }
1458
1459
1460 u32Timeout = MsOS_GetSystemTime()+VIRTUAL_CMD_TIMEOUT;
1461
1462 do
1463 {
1464 u32Ret = HAL_VPU_EX_DRAMStreamDispCMDQueueSend(u32Id,(void*)pShm,E_HVD_CMDQ_CMD,u8cmd|(u8VPUIdx<<24)|(pstCmdArg->Arg4<<16));
1465
1466 if(u32Ret == E_HVD_COMMAND_QUEUE_NOT_INITIALED)
1467 {
1468 bRet = FALSE;
1469 break;
1470 }
1471 else if (MsOS_GetSystemTime() > u32Timeout && u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL)
1472 {
1473 bRet = FALSE;
1474 break;
1475 }
1476 }while(u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL);
1477
1478 if(bRet == FALSE || u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL)
1479 {
1480 bRet = FALSE;
1481 goto _CMD_DONE;
1482 }
1483
1484 if(HAL_MVD_IsNeedResponseCommand(u8cmd) == TRUE)
1485 {
1486 u32Timeout = MsOS_GetSystemTime()+VIRTUAL_CMD_TIMEOUT;
1487
1488 while(MsOS_GetSystemTime() < u32Timeout)
1489 {
1490 #if 0
1491 if (HAL_MVD_IsCmdFinished(u8HalIdx, MVD_HANDSHAKE_VIRTUAL_COMMAND))
1492 {
1493 bResponse = TRUE;
1494 break;
1495 }
1496 #else
1497 if(MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VCHANDSHAKE, sizeof(MS_U8)) == 1)
1498 {
1499 bResponse = TRUE;
1500 break;
1501 }
1502 #endif
1503 }
1504
1505 if(bResponse == FALSE) // fail case
1506 {
1507 bRet = FALSE;
1508 goto _CMD_DONE;
1509 }
1510
1511 pstCmdArg->Arg0 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG0, sizeof(MS_U8));
1512 pstCmdArg->Arg1 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG1, sizeof(MS_U8));
1513 pstCmdArg->Arg2 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG2, sizeof(MS_U8));
1514 pstCmdArg->Arg3 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG3, sizeof(MS_U8));
1515 pstCmdArg->Arg4 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG4, sizeof(MS_U8));
1516 }
1517
1518 }
1519 else if(HAL_MVD_IsNormalCommand(u8cmd) == TRUE)
1520 {
1521 if(HAL_MVD_IsNeedResponseCommand(u8cmd) == TRUE)
1522 {
1523 // clear handshake dram
1524 u32BufStart2 = GET_VOL_BUFFADD(u8HalIdx);
1525
1526 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32BufStart2,u32BufStart2);
1527
1528 MS_U8* temp2 = (MS_U8*)MsOS_PA2KSEG1(u32BufStart2+OFFSET_VCHANDSHAKE);
1529
1530 *temp2 = 0;
1531
1532 MsOS_ReadMemory();
1533 MsOS_FlushMemory();
1534 }
1535
1536 u32CmdArg = pstCmdArg->Arg0 | (pstCmdArg->Arg1<<8) | (pstCmdArg->Arg2 << 16) | (pstCmdArg->Arg3 << 24);
1537
1538 u32Timeout = MsOS_GetSystemTime()+VIRTUAL_CMD_TIMEOUT;
1539
1540 do
1541 {
1542 //u32Ret = HAL_VPU_EX_DRAMStreamCMDQueueSend_MVD(pstCmdArg->Arg5,E_HVD_CMDQ_ARG,u32CmdArg);
1543 u32Ret = HAL_VPU_EX_DRAMStreamCMDQueueSend(u32Id,(void*)pShm,E_HVD_CMDQ_ARG,u32CmdArg);
1544
1545 if(u32Ret == E_HVD_COMMAND_QUEUE_NOT_INITIALED)
1546 {
1547 bRet = FALSE;
1548 break;
1549 }
1550 else if (MsOS_GetSystemTime() > u32Timeout && u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL )
1551 {
1552 bRet = FALSE;
1553 break;
1554 }
1555 }while(u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL);
1556
1557
1558 if(bRet == FALSE || u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL)
1559 {
1560 bRet = FALSE;
1561 goto _CMD_DONE;
1562 }
1563
1564
1565 u32Timeout = MsOS_GetSystemTime()+VIRTUAL_CMD_TIMEOUT;
1566 do
1567 {
1568 //u32Ret = HAL_VPU_EX_DRAMStreamCMDQueueSend_MVD(pstCmdArg->Arg5,E_HVD_CMDQ_CMD,u8cmd|(pstCmdArg->Arg5<<24)|(pstCmdArg->Arg4<<16));
1569 u32Ret = HAL_VPU_EX_DRAMStreamCMDQueueSend(u32Id,(void*)pShm,E_HVD_CMDQ_CMD,u8cmd|(u8VPUIdx<<24)|(pstCmdArg->Arg4<<16));
1570
1571 if(u32Ret == E_HVD_COMMAND_QUEUE_NOT_INITIALED)
1572 {
1573 bRet = FALSE;
1574 break;
1575 }
1576 else if (MsOS_GetSystemTime() > u32Timeout && u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL)
1577 {
1578 bRet = FALSE;
1579 break;
1580 }
1581 }while(u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL);
1582
1583 if(bRet == FALSE || u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL)
1584 {
1585 bRet = FALSE;
1586 goto _CMD_DONE;
1587 }
1588
1589 if(HAL_MVD_IsNeedResponseCommand(u8cmd) == TRUE)
1590 {
1591 u32Timeout = MsOS_GetSystemTime()+VIRTUAL_CMD_TIMEOUT;
1592
1593 while(MsOS_GetSystemTime() < u32Timeout)
1594 {
1595 #if 0
1596 if (HAL_MVD_IsCmdFinished(u8HalIdx, MVD_HANDSHAKE_VIRTUAL_COMMAND))
1597 {
1598 bResponse = TRUE;
1599 break;
1600 }
1601 #else
1602 if(MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VCHANDSHAKE, sizeof(MS_U8)) == 1)
1603 {
1604 bResponse = TRUE;
1605 break;
1606 }
1607 #endif
1608 }
1609
1610 if(bResponse == FALSE) // fail case
1611 {
1612 bRet = FALSE;
1613 goto _CMD_DONE;
1614 }
1615
1616 pstCmdArg->Arg0 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG0, sizeof(MS_U8));
1617 pstCmdArg->Arg1 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG1, sizeof(MS_U8));
1618 pstCmdArg->Arg2 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG2, sizeof(MS_U8));
1619 pstCmdArg->Arg3 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG3, sizeof(MS_U8));
1620 pstCmdArg->Arg4 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG4, sizeof(MS_U8));
1621 }
1622 }
1623 else
1624 #endif
1625 {
1626 if ( HAL_MVD_TimeOut(pstCmdArg->Arg5) == TRUE )
1627 {
1628 bRet = FALSE;
1629 goto _CMD_DONE;
1630 }
1631
1632 HAL_MVD_RegWriteByte(MVD_ARG0, pstCmdArg->Arg0);
1633 HAL_MVD_RegWriteByte(MVD_ARG1, pstCmdArg->Arg1);
1634 HAL_MVD_RegWriteByte(MVD_ARG2, pstCmdArg->Arg2);
1635 HAL_MVD_RegWriteByte(MVD_ARG3, pstCmdArg->Arg3);
1636 HAL_MVD_RegWriteByte(MVD_ARG4, pstCmdArg->Arg4);
1637 HAL_MVD_RegWriteByte(MVD_ARG5, pstCmdArg->Arg5);
1638 HAL_MVD_RegWriteByte(MVD_COMMAND, u8cmd);
1639 if ((CMD_GET_AFD != u8cmd) && (CMD_SLQ_GET_TBL_RPTR != u8cmd) &&
1640 (CMD_SLQ_UPDATE_TBL_WPTR != u8cmd) && (CMD_GET_NEXTDISPFRM != u8cmd) &&
1641 (CMD_DECODE_STATUS != u8cmd) && (CMD_RD_PTS != u8cmd) &&
1642 (CMD_GET_INT_STAT != u8cmd) && (CMD_RD_IO != u8cmd))
1643 {
1644 MVD_DEBUG_FWCMD(printf("MVD_CMD: %x; %x, %x, %x, %x, %x, %x\n", u8cmd, pstCmdArg->Arg0,
1645 pstCmdArg->Arg1, pstCmdArg->Arg2, pstCmdArg->Arg3, pstCmdArg->Arg4, pstCmdArg->Arg5));
1646 }
1647
1648 if ( HAL_MVD_TimeOut(pstCmdArg->Arg5) == TRUE )
1649 {
1650 bRet = FALSE;
1651 goto _CMD_DONE;
1652 }
1653
1654 pstCmdArg->Arg0 = HAL_MVD_RegReadByte(MVD_ARG0);
1655 pstCmdArg->Arg1 = HAL_MVD_RegReadByte(MVD_ARG1);
1656 pstCmdArg->Arg2 = HAL_MVD_RegReadByte(MVD_ARG2);
1657 pstCmdArg->Arg3 = HAL_MVD_RegReadByte(MVD_ARG3);
1658 pstCmdArg->Arg4 = HAL_MVD_RegReadByte(MVD_ARG4);
1659 pstCmdArg->Arg5 = HAL_MVD_RegReadByte(MVD_ARG5);
1660 }
1661
1662 _CMD_DONE:
1663 OSAL_MVD_UnlockHwMutex();
1664
1665 if (!bRet)
1666 {
1667 MVD_DEBUG_FWCMD(printf("%s timeout dump pc\n", __FUNCTION__));
1668 MS_U32 x=0;
1669 for (x=0; x<30; x++)
1670 MVD_DEBUG_FWCMD(printf("0x%x\n", HAL_VPU_EX_GetProgCnt()));
1671 MVD_DEBUG_FWCMD(printf("###\n"));
1672 }
1673
1674 return bRet;
1675 }
1676
HAL_MVD_SetSyncClk(MS_BOOL bEnable)1677 void HAL_MVD_SetSyncClk(MS_BOOL bEnable)
1678 {
1679 MS_ASSERT(0==bEnable);//Notice: Euclid & T3 have no sync_mode; Bit4 must be 0.
1680
1681 OSAL_MVD_LockHwMutex();
1682 HAL_MVD_RegWriteBit(MVD_CTRL, bEnable, MVD_CTRL_CLK_SYNCMODE);
1683 OSAL_MVD_UnlockHwMutex();
1684
1685 return;
1686 }
1687
HAL_MVD_InitHW(VPU_EX_SourceType SourceType,VPU_EX_DecoderType eDecType)1688 MS_BOOL HAL_MVD_InitHW(VPU_EX_SourceType SourceType,VPU_EX_DecoderType eDecType)
1689 {
1690 //Set MVD Clock @ reg_CHIPTOP
1691 HAL_MVD_PowerCtrl(ENABLE);
1692 #ifdef CONFIG_MSTAR_CLKM
1693 if(eDecType == E_VPU_EX_DECODER_MVD)
1694 {
1695 HAL_VPU_EX_SetClkManagement(E_VPU_EX_CLKPORT_MVD_CORE, ENABLE);
1696 }
1697 if(SourceType == E_VPU_EX_INPUT_TSP)
1698 {
1699 HAL_VPU_EX_SetClkManagement(E_VPU_EX_CLKPORT_MVD_PAS, ENABLE);
1700 }
1701 #endif
1702
1703 #ifdef CONFIG_MSTAR_SRAMPD
1704 HAL_MVD_RegWriteBit(REG_CODEC_SRAM_SD_EN, ENABLE, SRAM_SD_EN_MVD);
1705 HAL_MVD_Delayms(1);
1706 #endif
1707
1708 //Set MVD Clock aync
1709 HAL_MVD_SetSyncClk(DISABLE);
1710
1711 //MVD reset
1712 if(!HAL_MVD_RstHW())
1713 {
1714 MVD_DEBUGERROR(printf("MDrv_MVD_MVDInit:MVD4ResetHW failed\n"));
1715 return FALSE;
1716 }
1717 else
1718 {
1719 MVD_DEBUGINFO(printf("MDrv_MVD_MVDInit:MVD4ResetHW success\n"));
1720 }
1721
1722 return TRUE;
1723 }
1724
1725
1726 //------------------------------------------------------------------------------
1727 /// Get MVD firmware version
1728 /// @return -firmware version
1729 //------------------------------------------------------------------------------
HAL_MVD_GetFWVer(MS_U32 u32VpuSid)1730 MS_U32 HAL_MVD_GetFWVer(MS_U32 u32VpuSid)
1731 {
1732 #if 0
1733 return HAL_VPU_EX_GetFWVer(u32VpuSid, E_VPU_EX_FW_VER_MVD_FW);
1734 #else
1735 UNUSED(u32VpuSid);
1736 MVD_CmdArg mvdcmd;
1737
1738 SETUP_CMDARG(mvdcmd);
1739 mvdcmd.Arg5 = HAL_VPU_EX_GetTaskId(u32VpuSid);
1740 if (HAL_MVD_MVDCommand( CMD_GET_FW_VERSION, &mvdcmd ) == FALSE)
1741 {
1742 MVD_ERROR( printf( "Command: 0x%x fail!!\r\n", CMD_GET_FW_VERSION ) );
1743 return 0;
1744 }
1745 return COMBU32(mvdcmd.Arg3,mvdcmd.Arg2,mvdcmd.Arg1,mvdcmd.Arg0);
1746 #endif
1747 }
1748
1749 //------------------------------------------------------------------------------
1750 /// Get MVD firmware interface version
1751 /// @return -firmware interface version
1752 //------------------------------------------------------------------------------
HAL_MVD_GetFWIfVer(MS_U32 u32VpuSid)1753 MS_U32 HAL_MVD_GetFWIfVer(MS_U32 u32VpuSid)
1754 {
1755 #if 0
1756 return HAL_VPU_EX_GetFWVer(u32VpuSid, E_VPU_EX_FW_VER_MVD_IF);
1757 #else
1758 UNUSED(u32VpuSid);
1759 MVD_CmdArg mvdcmd;
1760
1761 SETUP_CMDARG(mvdcmd);
1762 if (HAL_MVD_MVDCommand( CMD_INTERFACE_VERSION, &mvdcmd ) == FALSE)
1763 {
1764 MVD_ERROR( printf( "Command: 0x%x fail!!\r\n", CMD_INTERFACE_VERSION ) );
1765 return 0;
1766 }
1767 return COMBU32(mvdcmd.Arg3,mvdcmd.Arg2,mvdcmd.Arg1,mvdcmd.Arg0);
1768 #endif
1769 }
1770
1771 //------------------------------------------------------------------------------
1772 /// Check MVD firmware status
1773 /// @return -firmware is ready or not
1774 //------------------------------------------------------------------------------
1775
1776 #ifdef VDEC3
_MVD_Check_FW_Rdy(MS_U32 u32VpuSid)1777 static MS_BOOL _MVD_Check_FW_Rdy(MS_U32 u32VpuSid)
1778 {
1779 MS_U32 u32Id = MVD_GetStreamId(u32VpuSid);
1780 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
1781 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u32VpuSid);
1782 MS_U32 u32TimeOut = MsOS_GetSystemTime() + 500;
1783 unsigned int* pVersion = (unsigned int*)MsOS_PA2KSEG1(pstMemCfg->u32FWCodeAddr + OFFSET_BASE + u8VPUIdx*0x100000);
1784 MS_BOOL ret = FALSE;
1785
1786 while(MsOS_GetSystemTime() < u32TimeOut)
1787 {
1788 if(((*pVersion) == FW_VERSION) && ((*(pVersion+4)) == INTERFACE_VERSION))
1789 {
1790 ret = TRUE;
1791 break;
1792 }
1793 }
1794
1795 if (ret == FALSE)
1796 {
1797 MVD_ERROR(printf("MVD f/w header version is wrong,%x,%x,%x,%x\n",(*(pVersion+4)), INTERFACE_VERSION,(*pVersion), FW_VERSION));
1798 }
1799
1800 return ret;
1801 }
1802
1803 #else
_MVD_Check_FW_Rdy(MS_U32 u32VpuSid)1804 static MS_BOOL _MVD_Check_FW_Rdy(MS_U32 u32VpuSid)
1805 {
1806 MS_U32 u32TimeOut = 2000;
1807
1808 //check firmware version consistent with header file
1809 while ((INTERFACE_VERSION != HAL_MVD_GetFWIfVer(u32VpuSid)) && (--u32TimeOut));
1810 if (u32TimeOut == 0)
1811 {
1812 MVD_ERROR(printf("MVD_FW_IF_Version=%lx inconsistent with header file(%x)!\n",
1813 HAL_MVD_GetFWIfVer(u32VpuSid), INTERFACE_VERSION));
1814 return FALSE;
1815 }
1816
1817 if (FW_VERSION != HAL_MVD_GetFWVer(u32VpuSid))
1818 {
1819 MVD_DEBUGINFO(printf("Warning! FWBinVer(%lx) != FWHdrVer(%x)\n", HAL_MVD_GetFWVer(u32VpuSid), FW_VERSION));
1820 }
1821 MVD_DEBUGINFO(printf("MVD version Interface = %x, FW = %x\n", INTERFACE_VERSION, FW_VERSION));
1822
1823 return TRUE;
1824 }
1825 #endif
_DumpCtrl(MS_U8 u8Idx)1826 MS_BOOL _DumpCtrl(MS_U8 u8Idx)
1827 {
1828 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
1829
1830 //printf("u32VA=0x%lx, PA=0x%x\n", u32VA, pstMemCfg->u32FWCodeAddr);
1831 struct _ctl_info *ctl_ptr = (struct _ctl_info *)
1832 HAL_MVD_PA2NonCacheSeg(pstMemCfg->u32FWCodeAddr + CTL_INFO_ADDR);
1833 MS_U32 u32timeout = HAL_MVD_GetTime() + 1000;//u32HVDCmdTimeout;
1834
1835 HAL_MVD_ReadMemory();
1836
1837 MVD_DEBUGINFO(printf("version=0x%x, statue=0x%x, last_ctl_cmd=0x%x, last_ctl_arg=0x%x\n",
1838 ctl_ptr->verion, ctl_ptr->statue, ctl_ptr->last_ctl_cmd, ctl_ptr->last_ctl_arg));
1839
1840 while (CTL_TASK_CMDRDY != ctl_ptr->statue)
1841 {
1842 if (HAL_MVD_GetTime() > u32timeout)
1843 {
1844 MVD_DEBUGERROR(printf("CTRL timeout!!! %d\n", __LINE__));
1845 return FALSE;
1846 }
1847 }
1848
1849 MVD_DEBUGINFO(printf("Version=0x%x, statue=0x%x, last_ctl_cmd=0x%x, last_ctl_arg=0x%x\n",
1850 ctl_ptr->verion, ctl_ptr->statue, ctl_ptr->last_ctl_cmd, ctl_ptr->last_ctl_arg));
1851
1852 MS_U8 i;
1853
1854 for (i = 0; i < 4; i++)
1855 {
1856 MVD_DEBUGINFO(printf("%s: Task %d, status=%d\n", __FUNCTION__, i, ctl_ptr->task_statue[i]));
1857 }
1858 return TRUE;
1859 }
1860
1861
MVD_MapVpuSrcType(MVD_SrcMode eSrcMode)1862 static VPU_EX_SourceType MVD_MapVpuSrcType(MVD_SrcMode eSrcMode)
1863 {
1864 VPU_EX_SourceType eVpuSrcType = E_VPU_EX_INPUT_NONE;
1865 switch (eSrcMode)
1866 {
1867 case E_MVD_TS_MODE:
1868 case E_MVD_TS_FILE_MODE:
1869 eVpuSrcType = E_VPU_EX_INPUT_TSP;
1870 break;
1871
1872 case E_MVD_SLQ_TBL_MODE:
1873 case E_MVD_SLQ_MODE:
1874 case E_MVD_FILE_MODE:
1875 eVpuSrcType = E_VPU_EX_INPUT_FILE;
1876 break;
1877
1878 case E_MVD_SRC_UNKNOWN:
1879 default:
1880 break;
1881 }
1882 return eVpuSrcType;
1883 }
1884
MVD_GetTaskInfo(VPU_EX_TaskInfo * pstTaskInfo,MS_U8 u8Idx,HAL_VPU_StreamId eVpuId)1885 static void MVD_GetTaskInfo(VPU_EX_TaskInfo* pstTaskInfo, MS_U8 u8Idx, HAL_VPU_StreamId eVpuId)
1886 {
1887 pstTaskInfo->u32Id = (u8Idx << 8 | eVpuId);
1888 pstTaskInfo->eDecType = E_VPU_EX_DECODER_MVD;
1889 pstTaskInfo->eVpuId = eVpuId;
1890 pstTaskInfo->eSrcType = MVD_MapVpuSrcType(HAL_MVD_GetSrcMode(u8Idx));
1891 pstTaskInfo->u32HeapSize = MVD_DRAM_SIZE;
1892 }
1893
1894
HAL_MVD_CreateTask(MS_U8 u8Idx,HAL_VPU_StreamId eVpuId)1895 MS_BOOL HAL_MVD_CreateTask(MS_U8 u8Idx, HAL_VPU_StreamId eVpuId)
1896 {
1897 MS_BOOL bRet = FALSE;
1898 MS_BOOL bFWdecideFB = FALSE;
1899 MVD_FWCfg* pstCfg = HAL_MVD_GetFWCfg(u8Idx);
1900 HAL_VPU_EX_SetFWReload(!(pstCfg->bNotReload));
1901
1902 MVD_DEBUGINFO(printf("\n\n Create Task(%x)!!!\n", u8Idx));
1903 VPU_EX_TaskInfo stTaskInfo;
1904 MVD_GetTaskInfo(&stTaskInfo, u8Idx, eVpuId);
1905
1906 VPU_EX_FWCodeCfg stVpuFWCfg;
1907 VPU_EX_NDecInitPara stVpuInitPara;
1908 stVpuInitPara.pFWCodeCfg = &stVpuFWCfg;
1909 stVpuInitPara.pTaskInfo = &stTaskInfo;
1910 stVpuInitPara.pVLCCfg = NULL;
1911
1912 MVD_MEMCfg* pMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
1913 stVpuFWCfg.u32BinAddr = HAL_MVD_PA2NonCacheSeg(pMemCfg->u32FWBinAddr);
1914 stVpuFWCfg.u32BinSize = pMemCfg->u32FWBinSize;
1915 stVpuFWCfg.u32DstAddr = HAL_MVD_PA2NonCacheSeg(pMemCfg->u32FWCodeAddr);
1916 stVpuFWCfg.u32DstSize = pMemCfg->u32FWCodeSize;
1917 stVpuFWCfg.u8SrcType = pMemCfg->eFWSrcType;
1918
1919 #ifdef VDEC3
1920 VPU_EX_FBCfg pFBCfg;
1921 stVpuInitPara.pFBCfg = &pFBCfg;
1922
1923 if(pMVDHalContext->bCMAUsed == TRUE)
1924 {
1925 stVpuInitPara.pFBCfg->u32FrameBufAddr = (MS_VIRT)pMVDHalContext->cmaInitParam.heap_miu_start_offset;
1926 stVpuInitPara.pFBCfg->u32FrameBufSize = (MS_VIRT)pMVDHalContext->cmaInitParam.heap_length;
1927 bFWdecideFB = TRUE;
1928
1929 }
1930 stTaskInfo.u8HalId = u8Idx;
1931 pMVDHalContext->_stMVDStream[u8Idx].u32SLQId = HAL_VPU_EX_GetBBUId(stTaskInfo.u32Id, &stTaskInfo, FALSE);
1932 if(pMVDHalContext->_stMVDStream[u8Idx].u32SLQId == HAL_VPU_INVALID_BBU_ID)
1933 {
1934 MVD_DEBUGINFO(printf("ERROR!!!MVD GetBBU Id Fail \n"));
1935 }
1936 else
1937 {
1938 bRet = HAL_VPU_EX_TaskCreate((MS_U32)eVpuId, (void*)&stVpuInitPara, bFWdecideFB, pMVDHalContext->_stMVDStream[u8Idx].u32SLQId);
1939 }
1940
1941 if(bRet == FALSE)
1942 {
1943 if(!HAL_VPU_EX_FreeBBUId(stTaskInfo.u32Id, pMVDHalContext->_stMVDStream[u8Idx].u32SLQId, &stTaskInfo))
1944 {
1945 MVD_DEBUGERROR(printf("[%s][%d]ERROR!!! Free BBU Id Fail !!!\n",__FUNCTION__,__LINE__));
1946 }
1947 }
1948 #else
1949 bRet = HAL_VPU_EX_TaskCreate((MS_U32)eVpuId, (void*)&stVpuInitPara);
1950 #endif
1951 MVD_DEBUGINFO(printf(" Create Task!!! bRet=%x ###\n\n", bRet));
1952 _DumpCtrl(u8Idx);
1953
1954 return bRet;
1955 }
1956
HAL_MVD_DeleteTask(MS_U8 u8Idx,HAL_VPU_StreamId eVpuId)1957 MS_BOOL HAL_MVD_DeleteTask(MS_U8 u8Idx, HAL_VPU_StreamId eVpuId)
1958 {
1959 MS_BOOL bRet = FALSE;
1960 MVD_DEBUGINFO(printf("\n\n Delete Task(%x)!!!\n", u8Idx));
1961
1962 VPU_EX_TaskInfo stTaskInfo;
1963 MVD_GetTaskInfo(&stTaskInfo, u8Idx, eVpuId);
1964
1965 VPU_EX_FWCodeCfg stVpuFWCfg;
1966 VPU_EX_NDecInitPara stVpuInitPara;
1967 stVpuInitPara.pFWCodeCfg = &stVpuFWCfg;
1968 stVpuInitPara.pTaskInfo = &stTaskInfo;
1969
1970 MVD_MEMCfg* pMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
1971 stVpuFWCfg.u32BinAddr = HAL_MVD_PA2NonCacheSeg(pMemCfg->u32FWBinAddr);
1972 stVpuFWCfg.u32BinSize = pMemCfg->u32FWBinSize;
1973 stVpuFWCfg.u32DstAddr = HAL_MVD_PA2NonCacheSeg(pMemCfg->u32FWCodeAddr);
1974 stVpuFWCfg.u8SrcType = pMemCfg->eFWSrcType;
1975
1976 #ifdef VDEC3
1977 if(!HAL_VPU_EX_FreeBBUId(stTaskInfo.u32Id, pMVDHalContext->_stMVDStream[u8Idx].u32SLQId, &stTaskInfo))
1978 {
1979 MVD_DEBUGINFO(printf("ERROR!!! Free BBU Id Fail !!!\n"));
1980 }
1981 #endif
1982 bRet = HAL_VPU_EX_TaskDelete((MS_U32) eVpuId, &stVpuInitPara);
1983 MVD_DEBUGINFO(printf(" Delete Task!!! ###\n\n"));
1984 _DumpCtrl(u8Idx);
1985 return bRet;
1986 }
1987
HAL_MVD_InitFW(MS_U32 u32VpuSid)1988 MS_BOOL HAL_MVD_InitFW(MS_U32 u32VpuSid)
1989 {
1990 //to fix the timing issue of getting FWIfVer on Chakra2
1991 HAL_MVD_Delayms(1);
1992
1993 //check FW ready
1994 if ( !_MVD_Check_FW_Rdy(u32VpuSid))
1995 {
1996 MS_ASSERT(0);
1997 return FALSE;
1998 }
1999
2000 #if 0
2001 if(pMVDHalContext->_stMVDStream[0].bUsed == FALSE && pMVDHalContext->_stMVDStream[1].bUsed == FALSE) // no mvd is used
2002 {
2003 MVD_CmdArg mvdcmd;
2004 SETUP_CMDARG(mvdcmd);
2005 mvdcmd.Arg0 = 1; //reset mvd engine,if have only one mvd
2006 SET_DECNUM(mvdcmd, ((MS_U8)u32VpuSid));
2007 if (HAL_MVD_MVDCommand( CMD_SW_RESET, &mvdcmd ) == FALSE)
2008 {
2009 MVD_ERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SW_RESET ) );
2010 return FALSE;
2011 }
2012 }
2013 #endif
2014 return TRUE;
2015 }
2016
2017 #define _MVD_INIT_FAIL_RET() \
2018 do { \
2019 HAL_MVD_SetIsUsed(u8HalIdx, FALSE); \
2020 return FALSE; \
2021 } while (0)
2022
2023
HAL_MVD_Init(MS_U8 u8HalIdx,MVD_CodecType eCodecType,MS_U32 u32VpuSid)2024 MS_BOOL HAL_MVD_Init(MS_U8 u8HalIdx,MVD_CodecType eCodecType, MS_U32 u32VpuSid)
2025 {
2026 //OSAL_MVD_MutexInit();
2027 MS_BOOL no_use = FALSE;
2028 MS_BOOL ret;
2029
2030 ret = MDrv_MVD_AUTH_IPCheck(eCodecType,&no_use);
2031 if(ret == FALSE)
2032 {
2033 return FALSE;
2034 }
2035
2036 if (!HAL_MVD_CreateTask(u8HalIdx, (HAL_VPU_StreamId)u32VpuSid))
2037 {
2038 _MVD_INIT_FAIL_RET();
2039 }
2040
2041 pMVDHalContext->bStopped[u8HalIdx] = FALSE;
2042
2043 if (!HAL_MVD_InitFW(u8HalIdx))
2044 {
2045 MVD_DEBUGERROR(printf("%s:HAL_MVD_InitFW(%x) failed\n", __FUNCTION__, u8HalIdx));
2046 if (!HAL_MVD_DeleteTask(u8HalIdx, (HAL_VPU_StreamId)u32VpuSid))
2047 {
2048 MVD_DEBUGERROR(printf("%s:HAL_MVD_DeleteTask failed\n", __FUNCTION__));
2049 }
2050
2051 _MVD_INIT_FAIL_RET();
2052 }
2053 else
2054 {
2055 MVD_DEBUGINFO(printf("%s:HAL_MVD_InitFW(%x) success\n", __FUNCTION__, u8HalIdx));
2056 }
2057
2058 HAL_MVD_SetIsUsed(u8HalIdx, TRUE);
2059
2060 return TRUE;
2061 }
2062
2063 #define _MVD_CMDRDY ((HAL_MVD_RegReadByte(MVD_STATUS) & MVD_STATUS_READY) == MVD_STATUS_READY)
2064 //------------------------------------------------------------------------------
2065 /// Check if MVD command is ready
2066 /// @return TRUE or FALSE
2067 /// - TRUE, Success to process the command
2068 /// - FALSE, Failed due to timeout
2069 //------------------------------------------------------------------------------
HAL_MVD_GetCmdRdy(void)2070 MS_BOOL HAL_MVD_GetCmdRdy(void)
2071 {
2072 MS_U32 timeoutTick = 2000;
2073
2074 while ((!_MVD_CMDRDY) && ((timeoutTick--)!=0));
2075
2076 if (0 == timeoutTick)
2077 return FALSE;
2078 else
2079 return TRUE;
2080 }
2081
HAL_MVD_CheckIdle(void)2082 MS_BOOL HAL_MVD_CheckIdle(void)
2083 {
2084 MS_BOOL bIsIdle = FALSE;
2085 MVD_CmdArg mvdcmd;
2086
2087 //issue CheckIdle command
2088 SETUP_CMDARG(mvdcmd);
2089 SET_CMD_RET_FALSE(CMD_MVD_IDLE, &mvdcmd);
2090
2091 bIsIdle = (mvdcmd.Arg0 == 1);
2092 if (HAL_MVD_GetCmdRdy())
2093 {
2094 return bIsIdle;
2095 }
2096 else
2097 {
2098 return FALSE;
2099 }
2100 }
2101
2102
_MVD_SoftRstHW(void)2103 static MS_BOOL _MVD_SoftRstHW(void)
2104 {
2105 return FALSE;
2106 }
2107
2108 //------------------------------------------------------------------------------
2109 /// Soft-reset MVD
2110 /// Ref AP note p.12 HK2MVD Reset Flow
2111 /// @return TRUE or FALSE
2112 /// - TRUE, Success to soft-reset MVD
2113 /// - FALSE, Failed. Need init MVD again.
2114 //------------------------------------------------------------------------------
HAL_MVD_SoftRstHW(void)2115 MS_BOOL HAL_MVD_SoftRstHW(void)
2116 {
2117 MS_U32 timetick = 2000;
2118
2119 if (HAL_MVD_GetCmdRdy())
2120 {
2121 //idle check
2122 while ((!HAL_MVD_CheckIdle()) && ((timetick--)!=0));
2123
2124 //either MVD is idle or timeout, do ENG/SLQ reset
2125 return _MVD_SoftRstHW(); //Reset HW engine
2126 }
2127 else
2128 {
2129 return FALSE; //here means "CPU hanging"
2130 }
2131 }
2132
2133 //------------------------------------------------------------------------------
2134 /// Clean the IRQ bit (in interrupt handler should call this function while the
2135 /// interrupt has been triggered.
2136 /// @param none
2137 /// @return none
2138 /// @internal
2139 //------------------------------------------------------------------------------
HAL_MVD_ClearIRQ(void)2140 void HAL_MVD_ClearIRQ(void)
2141 {
2142 OSAL_MVD_LockHwMutex();
2143 HAL_MVD_RegWriteBit(MVD_CTRL, 1, MVD_CTRL_CLR_INT);
2144 OSAL_MVD_UnlockHwMutex();
2145 return;
2146 }
2147
2148 //------------------------------------------------------------------------------
2149 /// Set display speed.
2150 ///FW use (# of B frames) / (# of decode frames) < Ratio this formula to adjustment.
2151 ///Once if the ratio is 1, that means, whenever (#Bframes / #decoded) < 1, then
2152 ///FW would drop the B frame.
2153 ///In other words, once AP need to back to normal mode, AP have to set the arg0 to 0.
2154 //------------------------------------------------------------------------------
HAL_MVD_SetSpeed(MS_U8 u8Idx,MVD_SpeedType eSpeedType,MS_U8 u8Multiple)2155 MS_BOOL HAL_MVD_SetSpeed(MS_U8 u8Idx, MVD_SpeedType eSpeedType, MS_U8 u8Multiple)
2156 {
2157 MVD_CmdArg mvdcmd;
2158
2159 SETUP_CMDARG(mvdcmd);
2160
2161 if (E_MVD_SPEED_FAST == eSpeedType)
2162 mvdcmd.Arg0 = 1; //fast forward
2163 else if (E_MVD_SPEED_SLOW == eSpeedType)
2164 mvdcmd.Arg0 = 2; //slow motion
2165 else
2166 mvdcmd.Arg0 = 0; //normal speed
2167
2168 if (u8Multiple == 1)
2169 {
2170 mvdcmd.Arg0 = 0;
2171 //The only way to be NORMAL speed.
2172 }
2173
2174 mvdcmd.Arg1 = u8Multiple;
2175 SET_DECNUM(mvdcmd, u8Idx);
2176 SET_CMD_RET_FALSE(CMD_DISP_SPEED_CTRL, &mvdcmd);
2177 return TRUE;
2178 }
2179
2180 //------------------------------------------------------------------------------
2181 /// Set frame buffer address to MVD
2182 /// @param -u32addr \b IN : start address
2183 //------------------------------------------------------------------------------
HAL_MVD_SetFrameBuffAddr(MS_U8 u8Idx,MS_VIRT u32addr,MS_U8 u8fbMode)2184 void HAL_MVD_SetFrameBuffAddr(MS_U8 u8Idx, MS_VIRT u32addr, MS_U8 u8fbMode)
2185 {
2186 MVD_CmdArg mvdcmd;
2187 if(pMVDHalContext->bCMAUsed)
2188 {
2189 u8fbMode = MVD_CMA_MODE;
2190 }
2191
2192 if ((u32addr>>3) > MAX_ADD_28BIT)// TODO: fixme, in 64bits system, address may be more than 28 bits
2193 {
2194 MVD_DEBUGERROR(printf("MDrv_MVD_SetFrameBuffAddr: only support 28bit add!\n"));
2195 return;
2196 }
2197
2198 MS_ASSERT((u32addr%8)==0);
2199 u32addr >>= 3;
2200
2201 SETUP_CMDARG(mvdcmd);
2202 mvdcmd.Arg0 = L_WORD(u32addr);
2203 mvdcmd.Arg1 = H_WORD(u32addr);
2204 mvdcmd.Arg2 = L_DWORD(u32addr);
2205
2206 //Frame Buffer Mode Setting
2207 mvdcmd.Arg3 = u8fbMode | ((u32addr>>24)&0x0f);
2208 mvdcmd.Arg4 = u8fbMode & 0xff;
2209 MVD_DEBUGINFO(printf("FramebufferAdd 0x%lx, FB Mode 0x%x, arg3=0x%x\n", (unsigned long)u32addr, u8fbMode, mvdcmd.Arg3));
2210 SET_DECNUM(mvdcmd, u8Idx);
2211 if (HAL_MVD_MVDCommand( CMD_FB_BASE, &mvdcmd ) == FALSE)
2212 {
2213 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FB_BASE ) );
2214 return;
2215 }
2216
2217 return;
2218 }
2219
2220 //------------------------------------------------------------------------------
2221 /// Set header buffer address to MVD
2222 /// @param -u32addr \b IN : start address
2223 //------------------------------------------------------------------------------
HAL_MVD_SetHeaderBufferAddr(MS_U8 u8Idx,MS_VIRT u32addr)2224 void HAL_MVD_SetHeaderBufferAddr (MS_U8 u8Idx, MS_VIRT u32addr )
2225 {
2226 MVD_CmdArg mvdcmd;
2227
2228 MS_ASSERT((u32addr%8)==0);
2229 u32addr >>= 3;
2230
2231 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2232 if (HAL_MVD_MVDCommand( CMD_HEADER_INFO_BUF, &mvdcmd ) == FALSE)
2233 {
2234 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_HEADER_INFO_BUF ) );
2235 }
2236 return;
2237 }
2238
2239 //------------------------------------------------------------------------------
2240 /// Set vol info buffer address to MVD
2241 /// @param -u32addr \b IN : start address
2242 //------------------------------------------------------------------------------
HAL_MVD_SetVolInfoBufferAddr(MS_U8 u8Idx,MS_VIRT u32addr)2243 void HAL_MVD_SetVolInfoBufferAddr (MS_U8 u8Idx, MS_VIRT u32addr )
2244 {
2245 MVD_CmdArg mvdcmd;
2246
2247 MS_ASSERT((u32addr%8)==0);
2248 u32addr >>= 3;
2249
2250 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2251 if (HAL_MVD_MVDCommand( CMD_VOL_INFO_BUF, &mvdcmd ) == FALSE)
2252 {
2253 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_VOL_INFO_BUF ) );
2254 }
2255 return;
2256 }
2257
2258 //------------------------------------------------------------------------------
2259 /// Set frame info buffer address to MVD
2260 /// @param -u32addr \b IN : start address
2261 //------------------------------------------------------------------------------
HAL_MVD_SetFrameInfoBufferAddr(MS_U8 u8Idx,MS_VIRT u32addr)2262 void HAL_MVD_SetFrameInfoBufferAddr (MS_U8 u8Idx, MS_VIRT u32addr )
2263 {
2264 MVD_CmdArg mvdcmd;
2265
2266 MS_ASSERT((u32addr%8)==0);
2267 u32addr >>= 3;
2268
2269 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2270 if (HAL_MVD_MVDCommand( CMD_FRAME_INFO_BUF, &mvdcmd ) == FALSE)
2271 {
2272 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FRAME_INFO_BUF ) );
2273 }
2274 return;
2275 }
2276
2277 //------------------------------------------------------------------------------
2278 /// Set IAP buffer address to MVD
2279 /// @param -u32addr \b IN : start address
2280 //------------------------------------------------------------------------------
HAL_MVD_SetIAPBufferAddr(MS_U8 u8Idx,MS_VIRT u32addr)2281 void HAL_MVD_SetIAPBufferAddr (MS_U8 u8Idx, MS_VIRT u32addr )
2282 {
2283 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
2284 MVD_CmdArg mvdcmd;
2285 MS_ASSERT((u32addr%8192)==0);
2286 u32addr >>= 13;
2287
2288 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2289 mvdcmd.Arg4 = pstMemCfg->u8FBMiuSel;
2290 if (HAL_MVD_MVDCommand( CMD_IAP_BUF_START, &mvdcmd ) == FALSE)
2291 {
2292 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_IAP_BUF_START ) );
2293 }
2294 return;
2295 }
2296
2297 //------------------------------------------------------------------------------
2298 /// Set Data Partition buffer address to MVD
2299 /// @param -u32addr \b IN : start address
2300 //------------------------------------------------------------------------------
HAL_MVD_SetDPBufferAddr(MS_U8 u8Idx,MS_VIRT u32addr)2301 void HAL_MVD_SetDPBufferAddr (MS_U8 u8Idx, MS_VIRT u32addr )
2302 {
2303 MVD_CmdArg mvdcmd;
2304 MS_ASSERT((u32addr%8)==0);
2305 u32addr >>= 3;
2306
2307 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2308 if (HAL_MVD_MVDCommand( CMD_DP_BUF_START, &mvdcmd ) == FALSE)
2309 {
2310 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DP_BUF_START ) );
2311 }
2312 return;
2313 }
2314
2315 //------------------------------------------------------------------------------
2316 /// Set Motion Vector buffer address to MVD
2317 /// @param -u32addr \b IN : start address
2318 //------------------------------------------------------------------------------
HAL_MVD_SetMVBufferAddr(MS_U8 u8Idx,MS_VIRT u32addr)2319 void HAL_MVD_SetMVBufferAddr (MS_U8 u8Idx, MS_VIRT u32addr )
2320 {
2321 MVD_CmdArg mvdcmd;
2322 MS_ASSERT((u32addr%2048)==0);
2323 u32addr >>= 3;
2324
2325 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2326 if (HAL_MVD_MVDCommand( CMD_MV_BUF_START, &mvdcmd ) == FALSE)
2327 {
2328 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_MV_BUF_START ) );
2329 }
2330 return;
2331 }
2332
_MVD_SetUserDataBufStart(MS_U8 u8Idx,MS_VIRT u32addr,MS_U8 u8arg3)2333 static void _MVD_SetUserDataBufStart(MS_U8 u8Idx, MS_VIRT u32addr, MS_U8 u8arg3)
2334 {
2335 MVD_CmdArg mvdcmd;
2336
2337 MS_ASSERT((u32addr%8)==0);
2338 u32addr >>= 3;
2339 MVD_DEBUGINFO(printf("%s add=0x%lx arg3=0x%x\n", __FUNCTION__, (unsigned long)u32addr, u8arg3));
2340
2341 SETUP_CMDARG(mvdcmd);
2342 mvdcmd.Arg0 = L_WORD(u32addr);
2343 mvdcmd.Arg1 = H_WORD(u32addr);
2344 mvdcmd.Arg2 = L_DWORD(u32addr);
2345 mvdcmd.Arg4 = H_DWORD(u32addr);
2346 mvdcmd.Arg3 = u8arg3;
2347 SET_DECNUM(mvdcmd, u8Idx);
2348 if (HAL_MVD_MVDCommand( CMD_USER_BUF_START, &mvdcmd ) == FALSE)
2349 {
2350 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_USER_BUF_START ) );
2351 return;
2352 }
2353 return;
2354 }
2355
_MVD_SetUserDataBufSize(MS_U8 u8Idx,MS_U32 u32size,MS_U8 u8arg3)2356 static void _MVD_SetUserDataBufSize(MS_U8 u8Idx, MS_U32 u32size, MS_U8 u8arg3)
2357 {
2358 MVD_CmdArg mvdcmd;
2359
2360 MS_ASSERT((u32size%8)==0);
2361 u32size >>= 3;
2362 MVD_DEBUGINFO(printf("%s add=0x%x arg3=0x%x\n", __FUNCTION__, u32size, u8arg3));
2363
2364 SETUP_CMDARG(mvdcmd);
2365 mvdcmd.Arg0 = L_WORD(u32size);
2366 mvdcmd.Arg1 = H_WORD(u32size);
2367 mvdcmd.Arg2 = L_DWORD(u32size);
2368 mvdcmd.Arg4 = H_DWORD(u32size);
2369 mvdcmd.Arg3 = u8arg3;
2370 if(mvdcmd.Arg3 <= 1) //mean 608 and 708 in MM RVU
2371 {
2372 mvdcmd.Arg2 = 7;//ntsc1+ntsc2+atsc
2373 mvdcmd.Arg4 = 0;
2374 }
2375 SET_DECNUM(mvdcmd, u8Idx);
2376 if (HAL_MVD_MVDCommand( CMD_USER_BUF_SIZE, &mvdcmd ) == FALSE)
2377 {
2378 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_USER_BUF_SIZE ) );
2379 return;
2380 }
2381 return;
2382 }
2383
2384 //------------------------------------------------------------------------------
2385 /// Set user data buffer address to MVD
2386 /// @param -u32addr \b IN : start address
2387 //------------------------------------------------------------------------------
HAL_MVD_SetUserDataBuf(MS_U8 u8Idx,MS_VIRT u32addr,MS_U32 u32size)2388 void HAL_MVD_SetUserDataBuf(MS_U8 u8Idx, MS_VIRT u32addr, MS_U32 u32size)
2389 {
2390 MS_U8 u8ccType = 0;
2391
2392 MS_ASSERT((u32addr%8)==0);
2393 MS_ASSERT((u32size%8)==0);
2394 #ifdef REDLION_LINUX_KERNEL_ENVI
2395 u8ccType = 2;
2396 #elif defined(MVD_SUPPORT_X4_CC)
2397 u8ccType = 4; //display order
2398 #else
2399 u8ccType = 2;// 2 for testing 0;
2400 #endif
2401
2402 #if defined(MVD_SUPPORT_X4_CC)
2403 //set decoding buffer address
2404 _MVD_SetUserDataBufStart(u8Idx, u32addr+u32size, 3);
2405 #endif
2406
2407 //set CC output buffer address
2408 _MVD_SetUserDataBufStart(u8Idx, u32addr, u8ccType);
2409
2410 #if defined(MVD_SUPPORT_X4_CC)
2411 //set decoding buffer size
2412 _MVD_SetUserDataBufSize(u8Idx, u32size, 3);
2413 #endif
2414
2415 //set CC output buffer size
2416 _MVD_SetUserDataBufSize(u8Idx, u32size, u8ccType);
2417
2418 return;
2419 }
2420
HAL_MVD_SetSLQTblBufStartEnd(MS_U8 u8Idx,MS_VIRT u32start,MS_VIRT u32end)2421 void HAL_MVD_SetSLQTblBufStartEnd(MS_U8 u8Idx, MS_VIRT u32start, MS_VIRT u32end)
2422 {
2423 MVD_CmdArg mvdcmd;
2424 MS_U32 u32val = u32end>>3;
2425 MVD_DEBUGINFO(printf("%s st=0x%lx end=0x%lx\n", __FUNCTION__, (unsigned long)u32start, (unsigned long)u32end));
2426
2427 SET_CMDARG(mvdcmd, u32val, u8Idx);
2428 if (HAL_MVD_MVDCommand( CMD_SLQ_TBL_BUF_END, &mvdcmd ) == FALSE)
2429 {
2430 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SLQ_TBL_BUF_END ) );
2431 return;
2432 }
2433
2434 u32val = (u32start)>>3;
2435 SET_CMDARG(mvdcmd, u32val, u8Idx);
2436 if (HAL_MVD_MVDCommand( CMD_SLQ_TBL_BUF_START, &mvdcmd ) == FALSE)
2437 {
2438 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SLQ_TBL_BUF_START ) );
2439 return;
2440 }
2441
2442 MVD_DEBUGINFO(printf("%s st=0x%lx end=0x%lx OK!!!\n", __FUNCTION__, (unsigned long)u32start, (unsigned long)u32end));
2443 return;
2444 }
2445
2446 //------------------------------------------------------------------------------
2447 /// Issue StepDisplay command.
2448 /// @return -TRUE for success; FALSE for failure.
2449 //------------------------------------------------------------------------------
HAL_MVD_StepDisp(MS_U8 u8Idx)2450 MS_BOOL HAL_MVD_StepDisp(MS_U8 u8Idx)
2451 {
2452 MVD_CmdArg mvdcmd;
2453
2454 SETUP_CMDARG(mvdcmd);
2455 SET_DECNUM(mvdcmd, u8Idx);
2456 SET_CMD_RET_FALSE(CMD_STEP_DISP_DECODE_ONE, &mvdcmd);
2457 if (HAL_MVD_Resume(u8Idx) == FALSE)
2458 {
2459 MVD_DEBUGERROR( printf( "Command: HAL_MVD_Resume fail!!\r\n" ) );
2460 return FALSE;
2461 }
2462
2463 return TRUE;
2464 }
2465
2466 //------------------------------------------------------------------------------
2467 /// Get ES read address for TS file mode.
2468 /// @return ES read address
2469 //------------------------------------------------------------------------------
HAL_MVD_GetTsFileESReadPtr(MS_U8 u8Idx)2470 MS_VIRT HAL_MVD_GetTsFileESReadPtr(MS_U8 u8Idx)
2471 {
2472 MS_VIRT u32Add = 0;
2473 MVD_CmdArg mvdcmd;
2474
2475 SETUP_CMDARG(mvdcmd);
2476 mvdcmd.Arg0 = 2; //ES diff
2477 SET_DECNUM(mvdcmd, u8Idx);
2478 if (HAL_MVD_MVDCommand( CMD_PARSER_READ_POSITION, &mvdcmd ) == TRUE)
2479 {
2480 //in order to latch the newest parser status
2481 //u32Diff = (((MS_U32)mvdcmd.Arg3) <<24) | (((MS_U32)mvdcmd.Arg2) <<16) |
2482 // (((MS_U32)mvdcmd.Arg1) << 8) | (((MS_U32)mvdcmd.Arg0));
2483 }
2484 else
2485 {
2486 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail!!\n", CMD_PARSER_READ_POSITION) );
2487 }
2488
2489 SETUP_CMDARG(mvdcmd);
2490 mvdcmd.Arg0 = 1;
2491 SET_DECNUM(mvdcmd, u8Idx);
2492 if (HAL_MVD_MVDCommand( CMD_PARSER_READ_POSITION, &mvdcmd ) == TRUE)
2493 {
2494 u32Add = (((MS_U32)mvdcmd.Arg3) <<24) |
2495 (((MS_U32)mvdcmd.Arg2) <<16) |
2496 (((MS_U32)mvdcmd.Arg1) << 8) |
2497 (((MS_U32)mvdcmd.Arg0));
2498 }
2499 else
2500 {
2501 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail!!\n", CMD_PARSER_READ_POSITION) );
2502 }
2503
2504 return (u32Add*8);
2505 }
2506
2507 //------------------------------------------------------------------------------
2508 /// Get ES write address for TS file mode.
2509 /// @return ES write address
2510 //------------------------------------------------------------------------------
HAL_MVD_GetTsFileESWritePtr(MS_U8 u8Idx)2511 MS_VIRT HAL_MVD_GetTsFileESWritePtr(MS_U8 u8Idx)
2512 {
2513 MS_VIRT u32Diff = 0;
2514 MS_VIRT u32WrPtr = 0;
2515 MVD_CmdArg mvdcmd;
2516 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
2517 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
2518
2519 SETUP_CMDARG(mvdcmd);
2520 mvdcmd.Arg0 = 2; //ES diff
2521 SET_DECNUM(mvdcmd, u8Idx);
2522 if (HAL_MVD_MVDCommand( CMD_PARSER_READ_POSITION, &mvdcmd ) == TRUE)
2523 {
2524 u32Diff = (((MS_U32)mvdcmd.Arg3) <<24) | (((MS_U32)mvdcmd.Arg2) <<16) |
2525 (((MS_U32)mvdcmd.Arg1) << 8) | (((MS_U32)mvdcmd.Arg0));
2526 }
2527 else
2528 {
2529 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail!!\n", CMD_PARSER_READ_POSITION) );
2530 }
2531
2532 u32WrPtr = u32Diff*8 + HAL_MVD_GetTsFileESReadPtr(u8Idx);
2533 if (u32WrPtr > pstSlqTblInfo->u32ESBuffEnd)
2534 {
2535 MVD_DEBUGINFO(printf("ES wrapping Wr=0x%lx ==> ", (unsigned long)u32WrPtr));
2536 u32WrPtr -= pstMemCfg->u32BSSize;
2537 MVD_DEBUGINFO(printf("0x%lx\n", (unsigned long)u32WrPtr));
2538 }
2539 return u32WrPtr;
2540 }
2541
2542 //------------------------------------------------------------------------------
2543 /// Enable/Disable firmware to show the last frame.
2544 /// @return -TRUE for success; FALSE for failure.
2545 //------------------------------------------------------------------------------
HAL_MVD_EnableLastFrameShow(MS_U8 u8Idx,MS_BOOL bEnable)2546 MS_BOOL HAL_MVD_EnableLastFrameShow(MS_U8 u8Idx, MS_BOOL bEnable)
2547 {
2548 MVD_CmdArg mvdcmd;
2549 MVD_SrcMode curSrcMode = HAL_MVD_GetSrcMode(u8Idx);
2550 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
2551 MS_VIRT* pu32FileEndPtr = &pstSlqTblInfo->u32FileEndPtr;
2552
2553 if (E_MVD_SLQ_TBL_MODE == curSrcMode)
2554 {
2555 #if SLQ_NEW_PUSH
2556 if (pstSlqTblInfo->pSlqStatus->bSlqCtrlBit)
2557 {
2558 pstSlqTblInfo->pDrvSlqTbl->u32WrPtr = pstSlqTblInfo->pSlqStatus->u32VaildWptrAddr + SLQ_ENTRY_LEN;
2559 }
2560 #endif //
2561 //save current writePtr
2562 if (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr != pstSlqTblInfo->pDrvSlqTbl->u32EndAdd)
2563 {
2564 *pu32FileEndPtr = pstSlqTblInfo->pDrvSlqTbl->u32WrPtr;
2565 }
2566 else
2567 {
2568 *pu32FileEndPtr = pstSlqTblInfo->pDrvSlqTbl->u32StAdd;
2569 }
2570 MVD_DEBUGINFO(printf("fe=%lx, rd=%lx, wr=%lx\n", (unsigned long)*pu32FileEndPtr,
2571 (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32RdPtr, (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32WrPtr));
2572 }
2573
2574 SETUP_CMDARG(mvdcmd);
2575 mvdcmd.Arg0 = bEnable;
2576 SET_DECNUM(mvdcmd, u8Idx);
2577 SET_CMD_RET_FALSE(CMD_ENABLE_LAST_FRAME_SHOW, &mvdcmd);
2578 return TRUE;
2579 }
2580
2581
HAL_MVD_SlqTblRst(MS_U8 u8Idx)2582 MS_BOOL HAL_MVD_SlqTblRst(MS_U8 u8Idx)
2583 {
2584 MVD_CmdArg mvdcmd;
2585 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
2586
2587 SETUP_CMDARG(mvdcmd);
2588 SET_DECNUM(mvdcmd, u8Idx);
2589 SET_CMD_RET_FALSE(CMD_VC1_HW_SLQ_RESET, &mvdcmd);
2590 pstSlqTblInfo->bEnSlqTblHkCtrl = FALSE;
2591 return TRUE;
2592 }
2593
HAL_MVD_SeekToPTS(MS_U8 u8Idx,MS_U32 u32Pts)2594 MS_BOOL HAL_MVD_SeekToPTS(MS_U8 u8Idx, MS_U32 u32Pts)
2595 {
2596 MVD_CmdArg mvdcmd;
2597
2598 SET_CMDARG(mvdcmd, u32Pts, u8Idx);
2599 SET_CMD_RET_FALSE(CMD_STEP_TO_PTS, &mvdcmd);
2600
2601 if (HAL_MVD_Resume(u8Idx) == FALSE)
2602 {
2603 MVD_DEBUGERROR( printf( "Command: HAL_MVD_Resume fail!!\r\n" ) );
2604 return FALSE;
2605 }
2606 return TRUE;
2607 }
2608
HAL_MVD_SkipToPTS(MS_U8 u8Idx,MS_U32 u32Pts)2609 MS_BOOL HAL_MVD_SkipToPTS(MS_U8 u8Idx, MS_U32 u32Pts)
2610 {
2611 MVD_CmdArg mvdcmd;
2612
2613 SET_CMDARG(mvdcmd, u32Pts, u8Idx);
2614 SET_CMD_RET_FALSE(CMD_SKIP_TO_PTS, &mvdcmd);
2615
2616 if (HAL_MVD_Resume(u8Idx) == FALSE)
2617 {
2618 MVD_DEBUGERROR( printf( "Command: HAL_MVD_Resume fail!!\r\n" ) );
2619 return FALSE;
2620 }
2621 return TRUE;
2622 }
2623
HAL_MVD_TrickPlay(MS_U8 u8Idx,MVD_TrickDec trickDec,MS_U8 u8DispDuration)2624 MS_BOOL HAL_MVD_TrickPlay(MS_U8 u8Idx, MVD_TrickDec trickDec, MS_U8 u8DispDuration)
2625 {
2626 MVD_CmdArg mvdcmd;
2627 MS_U8 u8DecType;
2628
2629 switch (trickDec)
2630 {
2631 case E_MVD_TRICK_DEC_ALL:
2632 u8DecType = 0;
2633 break;
2634 case E_MVD_TRICK_DEC_I:
2635 u8DecType = 1;
2636 break;
2637 case E_MVD_TRICK_DEC_IP:
2638 u8DecType = 2;
2639 break;
2640 default:
2641 return FALSE;
2642 break;
2643 }
2644
2645 SETUP_CMDARG(mvdcmd);
2646 mvdcmd.Arg0 = u8DecType;
2647 mvdcmd.Arg1 = u8DispDuration;
2648 SET_DECNUM(mvdcmd, u8Idx);
2649 SET_CMD_RET_FALSE(CMD_FAST_SLOW, &mvdcmd);
2650
2651 pMVDHalContext->stCtrlCfg[u8Idx].eTrickMode = trickDec;
2652 return TRUE;
2653 }
2654
HAL_MVD_FlushDisplayBuf(MS_U8 u8Idx)2655 MS_BOOL HAL_MVD_FlushDisplayBuf(MS_U8 u8Idx)
2656 {
2657 #define STOP_TIMEOUT 500 //ms
2658 MS_U32 u32StartTime = 0;
2659
2660 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_FLUSHQUEUE_COMMAND);
2661 MVD_CmdArg mvdcmd;
2662 SETUP_CMDARG(mvdcmd);
2663 SET_DECNUM(mvdcmd, u8Idx);
2664 SET_CMD_RET_FALSE(CMD_FLUSH_DISP_QUEUE, &mvdcmd);
2665
2666 u32StartTime = HAL_MVD_GetTime();
2667
2668 while(!HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_FLUSHQUEUE_COMMAND))
2669 {
2670 if ((HAL_MVD_GetTime()-u32StartTime)>STOP_TIMEOUT)
2671 {
2672 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail timeout!!\r\n", CMD_FLUSH_DISP_QUEUE ) );
2673 break;
2674 }
2675 }
2676
2677 return TRUE;
2678 }
2679
2680
HAL_MVD_SetFileModeAVSync(MS_U8 u8Idx,MVD_TIMESTAMP_TYPE eSyncMode)2681 MS_BOOL HAL_MVD_SetFileModeAVSync(MS_U8 u8Idx, MVD_TIMESTAMP_TYPE eSyncMode)
2682 {
2683 MVD_CmdArg mvdcmd;
2684 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
2685
2686 pstCtrlCfg->eFileSyncMode = eSyncMode;
2687 MVD_DEBUGINFO(printf("%s eSyncMode=%d\n", __FUNCTION__, eSyncMode));
2688 SETUP_CMDARG(mvdcmd);
2689 switch (eSyncMode)
2690 {
2691 case E_MVD_TIMESTAMP_PTS:
2692 case E_MVD_TIMESTAMP_PTS_RVU:
2693 mvdcmd.Arg0 = FILE_PTS_MODE;
2694 break;
2695
2696 case E_MVD_TIMESTAMP_DTS:
2697 case E_MVD_TIMESTAMP_DTS_RVU:
2698 mvdcmd.Arg0 = FILE_DTS_MODE;
2699 break;
2700 case E_MVD_TIMESTAMP_NEW_STS:
2701 mvdcmd.Arg0 = FILE_STS_MODE;
2702 break;
2703 case E_MVD_TIMESTAMP_FREERUN:
2704 default:
2705 mvdcmd.Arg0 = NONE_FILE_MODE; //Freerun
2706 break;
2707 }
2708 SET_DECNUM(mvdcmd, u8Idx);
2709 SET_CMD_RET_FALSE(CMD_ENABLE_FILE_SYNC, &mvdcmd);
2710
2711 SETUP_CMDARG(mvdcmd);
2712 switch (eSyncMode) //for set RVU mode
2713 {
2714 case E_MVD_TIMESTAMP_PTS_RVU:
2715 mvdcmd.Arg0 = FILE_PTS_MODE;
2716 break;
2717 case E_MVD_TIMESTAMP_DTS_RVU:
2718 mvdcmd.Arg0 = FILE_DTS_MODE;
2719 break;
2720 case E_MVD_TIMESTAMP_FREERUN:
2721 default:
2722 mvdcmd.Arg0 = 0xFF;
2723 break;
2724 }
2725 SET_DECNUM(mvdcmd, u8Idx);
2726 SET_CMD_RET_FALSE(CMD_RVU_EN, &mvdcmd);
2727 return TRUE;
2728 }
2729
2730
2731
2732
2733 //------------------------------------------------------------------------------
2734 /// Set the start address of PTS table used for SLQ table link mode.
2735 /// @return -TRUE for success; FALSE for failure.
2736 //------------------------------------------------------------------------------
HAL_MVD_SetPtsTblAddr(MS_U8 u8Idx,MS_VIRT u32addr)2737 MS_BOOL HAL_MVD_SetPtsTblAddr(MS_U8 u8Idx, MS_VIRT u32addr)
2738 {
2739 MVD_CmdArg mvdcmd;
2740
2741 MS_ASSERT((u32addr%8)==0);
2742 u32addr >>= 3;
2743
2744 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2745 SET_CMD_RET_FALSE(CMD_PTS_TBL_START, &mvdcmd);
2746 return TRUE;
2747 }
2748
HAL_MVD_SkipToIFrame(MS_U8 u8Idx)2749 MS_BOOL HAL_MVD_SkipToIFrame(MS_U8 u8Idx)
2750 {
2751 MVD_CmdArg mvdcmd;
2752 SETUP_CMDARG(mvdcmd);
2753 SET_DECNUM(mvdcmd, u8Idx);
2754 SET_CMD_RET_FALSE(CMD_START_DEC_STRICT, &mvdcmd);
2755 return TRUE;
2756 }
2757
2758 //Map driver FRC (Frame rate conversion) mode to firmware's.
HAL_MVD_MapFrcMode(MVD_FrcMode eFrcMode)2759 MS_U8 HAL_MVD_MapFrcMode(MVD_FrcMode eFrcMode)
2760 {
2761 MS_U8 frcMode = 0xf;
2762 switch (eFrcMode)
2763 {
2764 case E_MVD_FRC_NORMAL:
2765 frcMode = FrcNormal;
2766 break;
2767 case E_MVD_FRC_DISP_TWICE:
2768 frcMode = FrcDisplayTwice;
2769 break;
2770 case E_MVD_FRC_3_2_PULLDOWN: //film 24 -> 50i
2771 frcMode = Frc32Pulldown;
2772 break;
2773 case E_MVD_FRC_PAL_TO_NTSC:
2774 frcMode = FrcPALtoNTSC;
2775 break;
2776 case E_MVD_FRC_NTSC_TO_PAL:
2777 frcMode = FrcNTSCtoPAL;
2778 break;
2779 case E_MVD_FRC_DISP_ONEFIELD:
2780 frcMode = FrcShowOneFiled;
2781 break;
2782 default:
2783 break;
2784 }
2785 return frcMode;
2786 }
2787
HAL_MVD_DispCtrl(MS_U8 u8Idx,MS_BOOL bDecOrder,MS_BOOL bDropErr,MS_BOOL bDropDisp,MVD_FrcMode eFrcMode)2788 MS_BOOL HAL_MVD_DispCtrl(MS_U8 u8Idx, MS_BOOL bDecOrder, MS_BOOL bDropErr, MS_BOOL bDropDisp, MVD_FrcMode eFrcMode)
2789 {
2790 MVD_CmdArg mvdcmd;
2791 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
2792 MS_BOOL* pbDropErrFrm = &pstCtrlCfg->bDropErrFrm;
2793
2794 SETUP_CMDARG(mvdcmd);
2795 mvdcmd.Arg0 = (MS_U8)bDecOrder;
2796 mvdcmd.Arg1 = (MS_U8)bDropErr;
2797 mvdcmd.Arg2 = (MS_U8)bDropDisp;
2798 mvdcmd.Arg3 = HAL_MVD_MapFrcMode(eFrcMode);
2799 SET_DECNUM(mvdcmd, u8Idx);
2800 SET_CMD_RET_FALSE(CMD_DISPLAY_CTL, &mvdcmd);
2801
2802 pstCtrlCfg->eFrcMode = eFrcMode;
2803
2804 if (*pbDropErrFrm != bDropErr)
2805 {
2806 MVD_DEBUGINFO( printf("bDropErrFrm(%d) != bDropErr(%d)\n", *pbDropErrFrm, bDropErr));
2807 *pbDropErrFrm = bDropErr;
2808 }
2809 pstCtrlCfg->bDropDispfrm = bDropDisp;
2810
2811 return TRUE;
2812 }
2813
2814
HAL_MVD_SkipData(MS_U8 u8Idx)2815 MS_BOOL HAL_MVD_SkipData(MS_U8 u8Idx)
2816 {
2817 MS_U32 u32TimeCnt = 0;
2818 MVD_CmdArg mvdcmd;
2819
2820 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_SKIP_DATA);
2821 SETUP_CMDARG(mvdcmd);
2822 SET_DECNUM(mvdcmd, u8Idx);
2823 SET_CMD_RET_FALSE(CMD_SKIP_DATA, &mvdcmd);
2824
2825 u32TimeCnt = HAL_MVD_GetTime();
2826 while ((HAL_MVD_GetTime() - u32TimeCnt) < SKIP_DATA_TIMEOUT_MS)
2827 {
2828 if (HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_SKIP_DATA))
2829 {
2830 MVD_DEBUGINFO(printf("\nSkip data finished!\n"));
2831 break;
2832 }
2833 }
2834 MVD_DEBUGINFO(printf("====> %s (t1=%u t2=%u diff=%u)\n", __FUNCTION__,
2835 u32TimeCnt, HAL_MVD_GetTime(), (HAL_MVD_GetTime() - u32TimeCnt)));
2836 if (TRUE != HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_SKIP_DATA))
2837 {
2838 MVD_DEBUGINFO(printf("\n***** TS flush timeout *****\n\n"));
2839 return FALSE;
2840 }
2841
2842 return TRUE;
2843 }
2844
HAL_MVD_DispRepeatField(MS_U8 u8Idx,MS_BOOL bEnable)2845 MS_BOOL HAL_MVD_DispRepeatField(MS_U8 u8Idx, MS_BOOL bEnable)
2846 {
2847 MVD_CmdArg mvdcmd;
2848 SETUP_CMDARG(mvdcmd);
2849 mvdcmd.Arg0 = bEnable;
2850 SET_DECNUM(mvdcmd, u8Idx);
2851 SET_CMD_RET_FALSE(CMD_REPEAT_MODE, &mvdcmd);
2852 return TRUE;
2853 }
2854
2855 //------------------------------------------------------------------------------
2856 /// Pause display.
2857 /// @return -TRUE for success; FALSE for failure
2858 //------------------------------------------------------------------------------
HAL_MVD_PauseDisp(MS_U8 u8Idx)2859 MS_BOOL HAL_MVD_PauseDisp(MS_U8 u8Idx)
2860 {
2861 MS_BOOL bRst = TRUE;
2862 MVD_CmdArg mvdcmd;
2863
2864 SETUP_CMDARG(mvdcmd);
2865 mvdcmd.Arg0 = DISPLAY_PAUSE_ON;
2866 SET_DECNUM(mvdcmd, u8Idx);
2867 if (HAL_MVD_MVDCommand(CMD_DISPLAY_PAUSE, &mvdcmd)== FALSE)
2868 {
2869 MVD_DEBUGERROR( printf( "Command: 0x%x(ON) fail!!\r\n", CMD_DISPLAY_PAUSE) );
2870 bRst = FALSE;
2871 }
2872 return bRst;
2873 }
2874
2875 //------------------------------------------------------------------------------
2876 /// Issue Pause command.
2877 /// @return -TRUE for success; FALSE for failure
2878 //------------------------------------------------------------------------------
HAL_MVD_Resume(MS_U8 u8Idx)2879 MS_BOOL HAL_MVD_Resume(MS_U8 u8Idx)
2880 {
2881 MS_BOOL bRst = TRUE;
2882 MVD_CmdArg mvdcmd;
2883
2884 SETUP_CMDARG(mvdcmd);
2885 mvdcmd.Arg0 = DISPLAY_PAUSE_OFF;
2886 SET_DECNUM(mvdcmd, u8Idx);
2887 if (HAL_MVD_MVDCommand(CMD_DISPLAY_PAUSE, &mvdcmd)== FALSE)
2888 {
2889 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DISPLAY_PAUSE) );
2890 bRst = FALSE;
2891 }
2892 return bRst;
2893 }
2894
HAL_MVD_Play(MS_U8 u8Idx)2895 MS_BOOL HAL_MVD_Play(MS_U8 u8Idx)
2896 {
2897 MVD_CmdArg mvdcmd;
2898 SETUP_CMDARG(mvdcmd);
2899 mvdcmd.Arg0 = 1;
2900 SET_DECNUM(mvdcmd, u8Idx);
2901 SET_CMD_RET_FALSE(CMD_DIU_WIDTH_ALIGN, &mvdcmd);
2902
2903 SETUP_CMDARG(mvdcmd);
2904 SET_DECNUM(mvdcmd, u8Idx);
2905 SET_CMD_RET_FALSE(CMD_PLAY, &mvdcmd);
2906
2907 if (HAL_MVD_Resume(u8Idx) == FALSE)
2908 {
2909 MVD_DEBUGERROR( printf( "Command: HAL_MVD_Resume fail!!\r\n" ) );
2910 return FALSE;
2911 }
2912
2913 MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
2914 pCtrlCfg->bDecodeIFrame = FALSE;
2915
2916 return TRUE;
2917 }
2918
2919 //------------------------------------------------------------------------------
2920 /// Set base address for ScalerInfo structure to f/w
2921 /// @param -u32addr \b IN : start address (units in byte)
2922 //------------------------------------------------------------------------------
HAL_MVD_SetScalerInfoAddr(MS_U8 u8Idx,MS_VIRT u32addr,MS_U8 u8Arg4)2923 MS_BOOL HAL_MVD_SetScalerInfoAddr(MS_U8 u8Idx, MS_VIRT u32addr,MS_U8 u8Arg4)
2924 {
2925 MVD_CmdArg mvdcmd;
2926
2927 MS_ASSERT((u32addr%8)==0);
2928 u32addr >>= 3;
2929
2930 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2931 mvdcmd.Arg4 = u8Arg4;
2932 SET_CMD_RET_FALSE(CMD_SCALER_INFO_BASE, &mvdcmd);
2933 return TRUE;
2934 }
2935
2936 //------------------------------------------------------------------------------
2937 /// Set the dynamic scale base address
2938 /// @return -TRUE for success; FALSE for failure.
2939 //------------------------------------------------------------------------------
HAL_MVD_SetDynamicScaleAddr(MS_U8 u8Idx,MS_VIRT u32addr)2940 MS_BOOL HAL_MVD_SetDynamicScaleAddr(MS_U8 u8Idx, MS_VIRT u32addr)
2941 {
2942 MVD_CmdArg mvdcmd;
2943
2944 MS_ASSERT((u32addr%8)==0);
2945 u32addr >>= 3;
2946
2947 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2948 SET_CMD_RET_FALSE(CMD_DYNAMIC_SCALE_BASE, &mvdcmd);
2949 return TRUE;
2950 }
2951
2952 //------------------------------------------------------------------------------
2953 /// Set virtual box width/height to F/W.
2954 /// F/W will use the same w/h as scaler to calculate scaling factor.
2955 /// @return -TRUE for success; FALSE for failure.
2956 //------------------------------------------------------------------------------
HAL_MVD_SetVirtualBox(MS_U8 u8Idx,MS_U16 u16Width,MS_U16 u16Height)2957 MS_BOOL HAL_MVD_SetVirtualBox(MS_U8 u8Idx, MS_U16 u16Width, MS_U16 u16Height)
2958 {
2959 MVD_CmdArg mvdcmd;
2960
2961 SETUP_CMDARG(mvdcmd);
2962 mvdcmd.Arg0 = L_WORD(u16Width);
2963 mvdcmd.Arg1 = H_WORD(u16Width);
2964 mvdcmd.Arg2 = L_WORD(u16Height);
2965 mvdcmd.Arg3 = H_WORD(u16Height);
2966 SET_DECNUM(mvdcmd, u8Idx);
2967 SET_CMD_RET_FALSE(CMD_DS_VIRTUAL_BOX, &mvdcmd);
2968 return TRUE;
2969 }
2970
2971 //------------------------------------------------------------------------------
2972 /// Enable VC1 dynamic scaling
2973 /// @return -TRUE for success; FALSE for failure.
2974 //------------------------------------------------------------------------------
HAL_MVD_EnableDynamicScale(MS_U8 u8Idx,MS_U8 u8NewDS)2975 MS_BOOL HAL_MVD_EnableDynamicScale(MS_U8 u8Idx,MS_U8 u8NewDS)
2976 {
2977 MVD_CmdArg mvdcmd;
2978
2979 SETUP_CMDARG(mvdcmd);
2980 mvdcmd.Arg0 = TRUE;
2981 mvdcmd.Arg1 = u8NewDS;
2982 SET_DECNUM(mvdcmd, u8Idx);
2983 SET_CMD_RET_FALSE(CMD_ENABLE_DYNAMIC_SCALE, &mvdcmd);
2984 return TRUE;
2985 }
2986
2987
2988 //------------------------------------------------------------------------------
2989 /// Set blue screen
2990 /// @return -TRUE for success; FALSE for failure.
2991 //------------------------------------------------------------------------------
HAL_MVD_SetBlueScreen(MS_U8 u8Idx,MS_BOOL bEn)2992 MS_BOOL HAL_MVD_SetBlueScreen(MS_U8 u8Idx, MS_BOOL bEn)
2993 {
2994 MVD_CmdArg mvdcmd;
2995
2996 SETUP_CMDARG(mvdcmd);
2997 mvdcmd.Arg0 = bEn; //1 -> show MVOP frame color. 0 -> normal case.
2998 SET_DECNUM(mvdcmd, u8Idx);
2999 SET_CMD_RET_FALSE(CMD_FORCE_BLUE_SCREEN, &mvdcmd);
3000 return TRUE;
3001 }
3002
3003
HAL_MVD_SetFreezeDisp(MS_U8 u8Idx,MS_BOOL bEn)3004 MS_BOOL HAL_MVD_SetFreezeDisp(MS_U8 u8Idx, MS_BOOL bEn)
3005 {
3006 MVD_CmdArg mvdcmd;
3007
3008 SETUP_CMDARG(mvdcmd);
3009 mvdcmd.Arg0 = bEn;
3010 SET_DECNUM(mvdcmd, u8Idx);
3011 SET_CMD_RET_FALSE(CMD_FREEZE_DISP, &mvdcmd);
3012 return TRUE;
3013 }
3014
3015
3016 //------------------------------------------------------------------------------
3017 /// Set base address for DecFrameInfo structure to f/w
3018 /// @param -u32addr \b IN : start address (units in byte)
3019 //------------------------------------------------------------------------------
HAL_MVD_SetDecFrmInfoAddr(MS_U8 u8Idx,MS_VIRT u32addr)3020 void HAL_MVD_SetDecFrmInfoAddr(MS_U8 u8Idx, MS_VIRT u32addr)
3021 {
3022 MVD_CmdArg mvdcmd;
3023
3024 MS_ASSERT((u32addr%8)==0);
3025 u32addr >>= 3;
3026
3027 SET_CMDARG(mvdcmd, u32addr, u8Idx);
3028 if (HAL_MVD_MVDCommand( CMD_DEC_FRAME_INFO_BUF, &mvdcmd ) == FALSE)
3029 {
3030 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DEC_FRAME_INFO_BUF ) );
3031 }
3032 return;
3033 }
3034
3035 //Check if the task has interrupt
HAL_MVD_GetHasInt(MS_U8 u8Idx)3036 MS_BOOL HAL_MVD_GetHasInt(MS_U8 u8Idx)
3037 {
3038 MS_BOOL bHasInt = FALSE;
3039 MS_U32 u32IntCnt = 0;
3040 MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
3041
3042 u32IntCnt = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_INT_CNT, sizeof(MS_U32));
3043 if (u32IntCnt != pCtrlCfg->u32IntCnt)
3044 {
3045 MVD_DEBUGINFO(printf("%s %d--> %d\n", __FUNCTION__, pCtrlCfg->u32IntCnt, u32IntCnt));
3046 bHasInt = TRUE;
3047 pCtrlCfg->u32IntCnt = u32IntCnt;
3048 }
3049 return bHasInt;
3050 }
3051
3052 #ifdef VDEC3
HAL_MVD_GetIntState(MS_U8 u8Idx)3053 MS_U32 HAL_MVD_GetIntState(MS_U8 u8Idx)
3054 {
3055 MS_U32 u32IntStat;
3056
3057 u32IntStat = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_INT_STAT, sizeof(MS_U32));
3058
3059 MVD_SetFWBuffData(u8Idx,FW_BUFF_FRMINFO,OFFSET_INT_STAT,sizeof(MS_U32),0);
3060
3061 return u32IntStat;
3062 }
3063 #else
HAL_MVD_GetIntState(MS_U8 u8Idx)3064 MS_U32 HAL_MVD_GetIntState(MS_U8 u8Idx)
3065 {
3066 MS_U32 u32IntStat = 0;
3067 MVD_CmdArg mvdcmd;
3068
3069 SETUP_CMDARG(mvdcmd);
3070 SET_DECNUM(mvdcmd, u8Idx);
3071 if (HAL_MVD_MVDCommand( CMD_GET_INT_STAT, &mvdcmd ) == TRUE)
3072 {
3073 u32IntStat = (((MS_U32)mvdcmd.Arg4) << 16) |
3074 (((MS_U32)mvdcmd.Arg3) << 8) |
3075 (((MS_U32)mvdcmd.Arg2));
3076 }
3077 else
3078 {
3079 if (FALSE == pMVDHalContext->bStopped[u8Idx])
3080 {
3081 MVD_DEBUGERROR(printf("Ctrl: 0x%x fail!!\n", CMD_GET_INT_STAT));
3082 }
3083 else
3084 {
3085 MVD_DEBUGINFO(printf("Cmd 0x%x normal timeout.\n", CMD_GET_INT_STAT));
3086 }
3087 }
3088
3089 return u32IntStat;
3090 }
3091
3092 #endif
3093
3094 ///// functions to check interrupt status /////
MVD_IntHasUsrDataDisp(MS_U32 u32IntStat)3095 MS_BOOL MVD_IntHasUsrDataDisp(MS_U32 u32IntStat)
3096 {
3097 return (((u32IntStat&INT_USER_DATA_DISP)==INT_USER_DATA_DISP) ? TRUE : FALSE);
3098 }
3099
MVD_IntHasUsrData(MS_U32 u32IntStat)3100 MS_BOOL MVD_IntHasUsrData(MS_U32 u32IntStat)
3101 {
3102 return (((u32IntStat&INT_USER_DATA)==INT_USER_DATA) ? TRUE : FALSE);
3103 }
3104
MVD_IntIsDispRdy(MS_U32 u32IntStat)3105 MS_BOOL MVD_IntIsDispRdy(MS_U32 u32IntStat)
3106 {
3107 return (((u32IntStat&INT_DISP_RDY)==INT_DISP_RDY) ? TRUE : FALSE);
3108 }
3109
MVD_IntHasSeqHdr(MS_U32 u32IntStat)3110 MS_BOOL MVD_IntHasSeqHdr(MS_U32 u32IntStat)
3111 {
3112 return (((u32IntStat&INT_SEQ_FOUND)==INT_SEQ_FOUND) ? TRUE : FALSE);
3113 }
3114
MVD_IntHasESDataInvalid(MS_U32 u32IntStat)3115 MS_BOOL MVD_IntHasESDataInvalid(MS_U32 u32IntStat)
3116 {
3117 return (((u32IntStat&INT_VES_VALID)==INT_VES_VALID) ? TRUE : FALSE);
3118 }
3119
MVD_IntHasDecodeErr(MS_U32 u32IntStat)3120 MS_BOOL MVD_IntHasDecodeErr(MS_U32 u32IntStat)
3121 {
3122 return (((u32IntStat&INT_DEC_ERR)==INT_DEC_ERR) ? TRUE : FALSE);
3123 }
3124 //INT_FIRST_FRAME means "1st frame be push to display queue & ready for display"
3125 //So, (1) in IPB or IP stream, that's I-frame
3126 // (2) in PB only stream, that's first P-frame
MVD_IntHas1stFrame(MS_U32 u32IntStat)3127 MS_BOOL MVD_IntHas1stFrame(MS_U32 u32IntStat)
3128 {
3129 return (((u32IntStat&INT_FIRST_FRAME)==INT_FIRST_FRAME) ? TRUE : FALSE);
3130 }
3131
3132 //INT_XC_LOW_DELAY
MVD_IntHasXcLowDelay(MS_U32 u32IntStat)3133 MS_BOOL MVD_IntHasXcLowDelay(MS_U32 u32IntStat)
3134 {
3135 //printf("MVD_IntHasXcLowDelay=%x \n ", u32IntStat);
3136 return (((u32IntStat&INT_XC_LOW_DELAY)==INT_XC_LOW_DELAY) ? TRUE : FALSE);
3137 }
3138
MVD_IntHasDecodeIframe(MS_U32 u32IntStat)3139 MS_BOOL MVD_IntHasDecodeIframe(MS_U32 u32IntStat)
3140 {
3141 return (((u32IntStat&INT_DEC_I)==INT_DEC_I) ? TRUE : FALSE);
3142 }
3143
3144
MVD_IntVSyncInt(MS_U32 u32IntStat)3145 MS_BOOL MVD_IntVSyncInt(MS_U32 u32IntStat)
3146 {
3147 return (((u32IntStat&INT_DISP_VSYNC)==INT_DISP_VSYNC) ? TRUE : FALSE);
3148 }
3149
MVD_IntDecOneFrmInt(MS_U32 u32IntStat)3150 MS_BOOL MVD_IntDecOneFrmInt(MS_U32 u32IntStat)
3151 {
3152 return (((u32IntStat&INT_DEC_DONE)==INT_DEC_DONE) ? TRUE : FALSE);
3153 }
3154
3155
MVD_GetSyncStat(MS_U8 u8Idx,MS_U8 u8ArgIdx)3156 static MS_U8 MVD_GetSyncStat(MS_U8 u8Idx, MS_U8 u8ArgIdx)
3157 {
3158 MS_U8 u8Val = 0xFF;
3159 MVD_CmdArg mvdcmd;
3160 SETUP_CMDARG(mvdcmd);
3161 SET_DECNUM(mvdcmd, u8Idx);
3162 if (HAL_MVD_MVDCommand( CMD_GET_SYNC_STAT, &mvdcmd ) == FALSE)
3163 {
3164 MVD_DEBUGERROR(printf("Ctrl: 0x%x fail!!\r\n", CMD_GET_SYNC_STAT));
3165 return 0xFF;
3166 }
3167 MVD_DEBUGINFO(printf("Sync On/Off %x, Done %x, Stat %x, diff=%d\n",
3168 mvdcmd.Arg0, mvdcmd.Arg1, mvdcmd.Arg2, (int)HAL_MVD_GetPtsStcDiff(u8Idx)));
3169
3170 if (0==u8ArgIdx)
3171 {
3172 u8Val = mvdcmd.Arg0; //On/Off
3173 }
3174 else if (1==u8ArgIdx)
3175 {
3176 u8Val = mvdcmd.Arg1; //Done
3177 }
3178 else if (2==u8ArgIdx)
3179 {
3180 u8Val = mvdcmd.Arg2; //Stat
3181 }
3182 return u8Val;
3183 }
3184
3185 //------------------------------------------------------------------------------
3186 /// Report avsync status
3187 /// avsync_status=avsync_done|(avsync_skip_picture<<1)|(avsync_repeat_picture<<2),
3188 /// 0 for free run
3189 //------------------------------------------------------------------------------
HAL_MVD_GetAVSyncStatus(MS_U8 u8Idx)3190 MS_U8 HAL_MVD_GetAVSyncStatus(MS_U8 u8Idx)
3191 {
3192 return MVD_GetSyncStat(u8Idx, 2);
3193 }
3194
HAL_MVD_SlqTblLoadWrPtr(MS_U8 u8Idx,MS_VIRT u32WrPtr)3195 void HAL_MVD_SlqTblLoadWrPtr(MS_U8 u8Idx, MS_VIRT u32WrPtr)
3196 {
3197 #if 1
3198 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
3199 MVD_CmdArg mvdcmd;
3200 MS_U16 u16Val = 0;
3201
3202 if (FALSE == pstSlqTblInfo->bEnSlqTblHkCtrl)
3203 {
3204 SETUP_CMDARG(mvdcmd);
3205 mvdcmd.Arg0 = 0x10;
3206 mvdcmd.Arg1 = 0x01;
3207 SET_DECNUM(mvdcmd, u8Idx);
3208 if (HAL_MVD_MVDCommand( CMD_RD_IO, &mvdcmd ) == FALSE)
3209 {
3210 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_RD_IO ) );
3211 return;
3212 }
3213 u16Val = (((MS_U32)mvdcmd.Arg2)) | ((MS_U32)mvdcmd.Arg3 << 8);
3214
3215 SETUP_CMDARG(mvdcmd);
3216 mvdcmd.Arg0 = 0x10;
3217 mvdcmd.Arg1 = 0x01;
3218 mvdcmd.Arg2 = u16Val & 0xff;
3219 mvdcmd.Arg3 = ((u16Val>>8 ) & 0xff) | 0x80;
3220 SET_DECNUM(mvdcmd, u8Idx);
3221 if (HAL_MVD_MVDCommand(CMD_WR_IO, &mvdcmd) == FALSE)
3222 {
3223 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_WR_IO ) );
3224 return;
3225 }
3226
3227 pstSlqTblInfo->bEnSlqTblHkCtrl = TRUE;
3228 //printf("@@@ OPEN HK.SLQ.CTRL!\n");
3229 }
3230 #endif
3231 OSAL_MVD_LockHwMutex();
3232
3233 HAL_MVD_RegWriteByte(MVD_SLQ_WADR0, (u32WrPtr & 0xff));
3234 HAL_MVD_RegWriteByte(MVD_SLQ_WADR1, ((u32WrPtr>>8 ) & 0xff));
3235 HAL_MVD_RegWriteByte(MVD_SLQ_WADR2, ((u32WrPtr>>16) & 0xff));
3236 HAL_MVD_RegWriteByte(MVD_SLQ_WADR3, ((u32WrPtr>>24) & 0x01));
3237 HAL_MVD_RegWriteBit(MVD_SLQCTRL, 1, MVD_SLQCTRL_WADR_RELOAD);
3238 HAL_MVD_RegWriteBit(MVD_SLQCTRL, 0, MVD_SLQCTRL_WADR_RELOAD);
3239
3240 OSAL_MVD_UnlockHwMutex();
3241 }
3242
HAL_MVD_SlqTblProbe(MVD_HKSLQ_CMD eCmd)3243 static MS_VIRT HAL_MVD_SlqTblProbe(MVD_HKSLQ_CMD eCmd)
3244 {
3245 MS_VIRT u32Cadr = 0;
3246 OSAL_MVD_LockHwMutex();
3247
3248 switch (eCmd)
3249 {
3250 case MVD_HKSLQ_GET_READPTR:
3251 HAL_MVD_RegWriteBit(MVD_SLQCTRL, 1, MVD_SLQCTRL_RADR_PROBE);
3252 HAL_MVD_RegWriteBit(MVD_SLQCTRL, 0, MVD_SLQCTRL_RADR_PROBE);
3253 break;
3254 case MVD_HKSLQ_GET_WRITEPTR:
3255 HAL_MVD_RegWriteBit(MVD_SLQCTRL, 1, MVD_SLQCTRL_WADR_PROBE);
3256 HAL_MVD_RegWriteBit(MVD_SLQCTRL, 0, MVD_SLQCTRL_WADR_PROBE);
3257 break;
3258 default:
3259 break;
3260 }
3261 u32Cadr = HAL_MVD_RegReadByte(MVD_SLQ_CADR0) |
3262 (HAL_MVD_RegReadByte(MVD_SLQ_CADR1) << 8) |
3263 (HAL_MVD_RegReadByte(MVD_SLQ_CADR2) <<16) |
3264 ((HAL_MVD_RegReadByte(MVD_SLQ_CADR3) & 0x01) <<24);
3265
3266 OSAL_MVD_UnlockHwMutex();
3267 return u32Cadr;
3268 }
3269
HAL_MVD_SlqTblProbeWrPtr(MS_U8 u8Idx)3270 MS_VIRT HAL_MVD_SlqTblProbeWrPtr(MS_U8 u8Idx)
3271 {
3272 return HAL_MVD_SlqTblProbe(MVD_HKSLQ_GET_WRITEPTR);
3273 }
3274
HAL_MVD_SlqTblProbeRdPtr(MS_U8 u8Idx)3275 MS_VIRT HAL_MVD_SlqTblProbeRdPtr(MS_U8 u8Idx)
3276 {
3277 return HAL_MVD_SlqTblProbe(MVD_HKSLQ_GET_READPTR);
3278 }
3279
3280 //------------------------------------------------------------------------------
3281 /// Set firmware as MStreamer mode
3282 /// @return -TRUE for success; FALSE for failure.
3283 //------------------------------------------------------------------------------
HAL_MVD_SetMStreamerMode(MS_U8 u8Idx,MS_U8 u8Mode)3284 MS_BOOL HAL_MVD_SetMStreamerMode(MS_U8 u8Idx, MS_U8 u8Mode)
3285 {
3286 MVD_CmdArg mvdcmd;
3287 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
3288
3289 SETUP_CMDARG(mvdcmd);
3290 mvdcmd.Arg0 = u8Mode; //1: enable, 0:disable MStreamer mode.
3291 SET_DECNUM(mvdcmd, u8Idx);
3292 SET_CMD_RET_FALSE(CMD_SET_MST_MODE, &mvdcmd);
3293
3294 pstCtrlCfg->u8MstMode = u8Mode;
3295 return TRUE;
3296 }
3297
3298 //------------------------------------------------------------------------------
3299 /// Set firmware as MStreamer mode (IP clip mode)
3300 /// @return -TRUE for success; FALSE for failure.
3301 //------------------------------------------------------------------------------
HAL_MVD_ShowDecodeOrder(MS_U8 u8Idx,MS_U8 u8Mode)3302 MS_BOOL HAL_MVD_ShowDecodeOrder(MS_U8 u8Idx, MS_U8 u8Mode)
3303 {
3304 MVD_CmdArg mvdcmd;
3305 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
3306
3307 SETUP_CMDARG(mvdcmd);
3308 mvdcmd.Arg0 = pstCtrlCfg->u8MstMode;
3309 mvdcmd.Arg1 = u8Mode;//a u8Mode; //1: clip mode, 0:normal mode.
3310 SET_DECNUM(mvdcmd, u8Idx);
3311 SET_CMD_RET_FALSE(CMD_SET_MST_MODE, &mvdcmd);
3312 return TRUE;
3313
3314 }
3315
HAL_MVD_IsMStreamerMode(MS_U8 u8Idx)3316 MS_BOOL HAL_MVD_IsMStreamerMode(MS_U8 u8Idx)
3317 {
3318 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
3319 return (MST_MODE_TRUE == pstCtrlCfg->u8MstMode);
3320 }
3321
HAL_MVD_FrameOpt(MS_U8 u8Idx,MS_U8 u8FrmIdx,MVD_FrmOpt eOpt)3322 MS_BOOL HAL_MVD_FrameOpt(MS_U8 u8Idx, MS_U8 u8FrmIdx, MVD_FrmOpt eOpt)
3323 {
3324 MVD_CmdArg mvdcmd;
3325
3326 SETUP_CMDARG(mvdcmd);
3327 mvdcmd.Arg0 = u8FrmIdx;
3328 mvdcmd.Arg1 = eOpt; // 0 = Flip, 1 = Release.
3329 MVD_DEBUGINFO(printf("FLIP_RELEASE_FRAME: idx=0x%x, opt=0x%x\n", u8FrmIdx, eOpt));
3330 SET_DECNUM(mvdcmd, u8Idx);
3331 SET_CMD_RET_FALSE(CMD_FLIP_RELEASE_FRAME, &mvdcmd);
3332
3333 return TRUE;
3334 }
3335
3336 //------------------------------------------------------------------------------
3337 /// Set firmware dynamic allocate FrameBuffer, now support MCU mode only
3338 /// @return -TRUE for success; FALSE for failure.
3339 //------------------------------------------------------------------------------
_MVD_SetDynamicAllocateFB(MS_U8 u8Idx,MS_BOOL bEnable)3340 MS_BOOL _MVD_SetDynamicAllocateFB(MS_U8 u8Idx,MS_BOOL bEnable)
3341 {
3342 MVD_CmdArg mvdcmd;
3343
3344 SETUP_CMDARG(mvdcmd);
3345 mvdcmd.Arg0 = 1-bEnable; //Arg0 : 0(enable) , 1(disable)
3346 SET_DECNUM(mvdcmd, u8Idx);
3347 if (HAL_MVD_MVDCommand( CMD_FIXED_FRAME_BUFFER, &mvdcmd ) == FALSE)
3348 {
3349 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FIXED_FRAME_BUFFER ) );
3350 return FALSE;
3351 }
3352
3353 return TRUE;
3354 }
3355
3356 //------------------------------------------------------------------------------
3357 /// Set firmware as MCU mode
3358 /// @return -TRUE for success; FALSE for failure.
3359 //------------------------------------------------------------------------------
HAL_MVD_SetMcuMode(MS_U8 u8Idx,MS_U8 u8Mode)3360 MS_BOOL HAL_MVD_SetMcuMode(MS_U8 u8Idx, MS_U8 u8Mode)
3361 {
3362 MVD_CmdArg mvdcmd;
3363 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
3364
3365 SETUP_CMDARG(mvdcmd);
3366 mvdcmd.Arg0 = u8Mode; //1: enable, 0:disable MCU
3367 SET_DECNUM(mvdcmd, u8Idx);
3368 SET_CMD_RET_FALSE(CMD_SET_MCU_MODE, &mvdcmd);
3369
3370 pstCtrlCfg->u8McuMode = u8Mode;
3371
3372 return TRUE;
3373 }
3374
HAL_MVD_IsMcuMode(MS_U8 u8Idx)3375 MS_BOOL HAL_MVD_IsMcuMode(MS_U8 u8Idx)
3376 {
3377 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
3378 return (TRUE == pstCtrlCfg->u8McuMode);
3379 }
3380
3381 //------------------------------------------------------------------------------
3382 /// Set firmware as ForceInterlace mode
3383 /// @return -TRUE for success; FALSE for failure.
3384 //------------------------------------------------------------------------------
HAL_MVD_ForceInterlaceMode(MS_U8 u8Idx,MS_U8 u8Mode)3385 MS_BOOL HAL_MVD_ForceInterlaceMode(MS_U8 u8Idx, MS_U8 u8Mode)
3386 {
3387 MVD_CmdArg mvdcmd;
3388
3389 SETUP_CMDARG(mvdcmd);
3390 mvdcmd.Arg0 = u8Mode; //1: enable, 0:disable
3391 mvdcmd.Arg1 = 0;
3392 SET_DECNUM(mvdcmd, u8Idx);
3393 SET_CMD_RET_FALSE(CMD_VC1_FORCE_INTLACE_DISP, &mvdcmd);
3394
3395 return TRUE;
3396 }
3397
3398 //------------------------------------------------------------------------------
3399 /// Set firmware as Progressive mode
3400 /// @return -TRUE for success; FALSE for failure.
3401 //------------------------------------------------------------------------------
HAL_MVD_ForceProgressiveMode(MS_U8 u8Idx,MS_U8 u8Mode)3402 MS_BOOL HAL_MVD_ForceProgressiveMode(MS_U8 u8Idx, MS_U8 u8Mode)
3403 {
3404 MVD_CmdArg mvdcmd;
3405
3406 SETUP_CMDARG(mvdcmd);
3407 mvdcmd.Arg0 = 0;
3408 mvdcmd.Arg1 = u8Mode; //1: enable, 0:disable
3409 SET_DECNUM(mvdcmd, u8Idx);
3410 SET_CMD_RET_FALSE(CMD_VC1_FORCE_INTLACE_DISP, &mvdcmd);
3411
3412 return TRUE;
3413 }
3414
3415 //------------------------------------------------------------------------------
3416 /// Inform firwmare that PTS is updated.
3417 /// @return -TRUE for success; FALSE for failure.
3418 //------------------------------------------------------------------------------
HAL_MVD_UpdatePts(MS_U8 u8Idx)3419 MS_BOOL HAL_MVD_UpdatePts(MS_U8 u8Idx)
3420 {
3421 MVD_CmdArg mvdcmd;
3422
3423 SETUP_CMDARG(mvdcmd);
3424 SET_DECNUM(mvdcmd, u8Idx);
3425 SET_CMD_RET_FALSE(CMD_SEND_UNI_PTS, &mvdcmd);
3426
3427 return TRUE;
3428 }
3429
3430
HAL_MVD_FrameCapture(MS_U8 u8Idx,MS_U8 u8FrmIdx,MS_BOOL bEnable)3431 MS_BOOL HAL_MVD_FrameCapture(MS_U8 u8Idx, MS_U8 u8FrmIdx, MS_BOOL bEnable)
3432 {
3433 MVD_CmdArg mvdcmd;
3434
3435 SETUP_CMDARG(mvdcmd);
3436 mvdcmd.Arg0 = bEnable; //0 or 1 to enable/disable the freeze function
3437 mvdcmd.Arg2 = u8FrmIdx; //specify the freezed frame index
3438 MVD_DEBUGINFO(printf("CAPTURE_FRAME: idx=0x%x, enable=0x%x\n", u8FrmIdx, bEnable));
3439 SET_DECNUM(mvdcmd, u8Idx);
3440 SET_CMD_RET_FALSE(CMD_ENABLE_FREEZE_PIC, &mvdcmd);
3441
3442 return TRUE;
3443 }
3444
3445 //------------------------------------------------------------------------------
3446 /// Set HW buffers' start address to MVD FW
3447 /// Return (the end address - 1)
3448 /// @param -u32Addr \b IN : start address (MIU offset)
3449 //------------------------------------------------------------------------------
HAL_MVD_SetHWBuffer(MS_U8 u8Idx,MS_VIRT u32Add)3450 MS_VIRT HAL_MVD_SetHWBuffer(MS_U8 u8Idx, MS_VIRT u32Add)
3451 {
3452 MS_VIRT tmpAdr;
3453
3454 MVD_DEBUGINFO(printf("====> %s u32Add = 0x%lx\n", __FUNCTION__, (unsigned long)u32Add));
3455 tmpAdr = (MemAlign(u32Add, MVD_FW_IAP_BUF_ALIGN));
3456 MVD_DEBUGINFO(printf("set MVD3_FW_IAP_BUF_ADR =%lx\n",(unsigned long)tmpAdr));
3457 HAL_MVD_SetIAPBufferAddr(u8Idx, tmpAdr);
3458 tmpAdr += MVD_FW_IAP_BUF_LEN;
3459
3460 tmpAdr = (MemAlign(tmpAdr, MVD_FW_DP_BUF_ALIGN));
3461 MVD_DEBUGINFO(printf("set MVD3_FW_DP_BUF_ADR=%lx\n",(unsigned long)tmpAdr));
3462 HAL_MVD_SetDPBufferAddr(u8Idx, tmpAdr);
3463 tmpAdr += MVD_FW_DP_BUF_LEN;
3464
3465 tmpAdr = (MemAlign(tmpAdr, MVD_FW_MV_BUF_ALIGN));
3466 MVD_DEBUGINFO(printf("set MVD3_FW_MV_BUF_ADR=%lx\n",(unsigned long)tmpAdr));
3467 HAL_MVD_SetMVBufferAddr(u8Idx, tmpAdr);
3468 tmpAdr += MVD_FW_MV_BUF_LEN;
3469 MVD_DEBUGINFO(printf("====> %s End of HW buffers = 0x%lx\n", __FUNCTION__, (unsigned long)tmpAdr));
3470
3471 return tmpAdr;
3472 }
3473
3474 //------------------------------------------------------------------------------
3475 /// Set the number of framebuffer
3476 /// @param -u8FrmNum \b IN : the number of framebuffer
3477 //------------------------------------------------------------------------------
HAL_MVD_SetFrameBuffNum(MS_U8 u8Idx,MS_U8 u8FrmNum,MS_U32 u32FBUsedSize)3478 void HAL_MVD_SetFrameBuffNum(MS_U8 u8Idx, MS_U8 u8FrmNum,MS_U32 u32FBUsedSize)
3479 {
3480 #define MVD_FBNUM_DEFAULT 4
3481 #define MVD_FBNUM_MIN MVD_FBNUM_DEFAULT
3482
3483 MVD_CmdArg mvdcmd;
3484
3485 MVD_DEBUGINFO(printf("%s u8FrmNum = %d\n", __FUNCTION__, u8FrmNum));
3486 if (u8FrmNum < MVD_FBNUM_MIN)
3487 {
3488 MVD_DEBUGINFO(printf("%s set u8FrmNum as %d instead of %d!\n",
3489 __FUNCTION__, MVD_FBNUM_MIN, u8FrmNum));
3490 u8FrmNum = MVD_FBNUM_MIN;
3491 }
3492 SETUP_CMDARG(mvdcmd);
3493 mvdcmd.Arg0 = u8FrmNum;
3494 mvdcmd.Arg1 = u32FBUsedSize&0xff;
3495 mvdcmd.Arg2 = (u32FBUsedSize>>8)&0xff;
3496 mvdcmd.Arg3 = (u32FBUsedSize>>16)&0xff;
3497 mvdcmd.Arg4 = (u32FBUsedSize>>24)&0xff;
3498 SET_DECNUM(mvdcmd, u8Idx);
3499 if (HAL_MVD_MVDCommand( CMD_FB_NUM, &mvdcmd ) == FALSE)
3500 {
3501 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FB_NUM ) );
3502 return;
3503 }
3504 return;
3505 }
3506
MVD_WriteFWBuffData(MS_U8 u8Idx,FW_BUFF_TYPE eBuffType,MS_U16 u16Offset,MS_U8 u8Size,MS_U32 u32Val)3507 static MS_BOOL MVD_WriteFWBuffData(MS_U8 u8Idx, FW_BUFF_TYPE eBuffType, MS_U16 u16Offset, MS_U8 u8Size, MS_U32 u32Val)
3508 {
3509 MS_BOOL bRet = FALSE;
3510 MS_VIRT u32BufStart = NULL;
3511 switch (eBuffType)
3512 {
3513 case FW_BUFF_VOLINFO: u32BufStart = GET_VOL_BUFFADD(u8Idx); break;
3514 case FW_BUFF_FRMINFO: u32BufStart = GET_FRMINFO_BUFFADD(u8Idx); break;
3515 case FW_BUFF_HDR: u32BufStart = GET_HDR_BUFFADD(u8Idx); break;
3516 case FW_BUFF_USRDATA: u32BufStart = GET_USRDATA_BUFFADD(u8Idx); break;
3517 case FW_BUFF_FWSLQTAB: u32BufStart = GET_SLQ_BUFFADD(u8Idx); break;
3518 case FW_BUFF_PTSTBL: u32BufStart = GET_PTSTBL_BUFFADD(u8Idx); break;
3519 case FW_BUFF_DS: u32BufStart = GET_DS_BUFFADD(u8Idx); break;
3520 case FW_BUFF_XCINFO: u32BufStart = GET_XCINFO_BUFFADD(u8Idx); break;
3521 case FW_BUFF_DECFRMINFO: u32BufStart = GET_DECFRMINFO_BUFFADD(u8Idx); break;
3522 default:
3523 break;
3524 }
3525 if (NULL == u32BufStart)
3526 {
3527 printf("%s err: u8Idx=0x%x, bufType=0x%x, offset=%d, size=%d\n",
3528 __FUNCTION__, u8Idx, eBuffType, u16Offset, u8Size);
3529 return bRet;
3530 }
3531
3532 if (u8Size == sizeof(MS_U8))
3533 {
3534 bRet = HAL_MVD_MemWriteByte(u32BufStart+u16Offset, (MS_U8)u32Val);
3535 }
3536 else if (u8Size == sizeof(MS_U32))
3537 {
3538 bRet = HAL_MVD_MemWrite4Byte(u32BufStart+u16Offset, u32Val);
3539 }
3540
3541 MVD_DEBUGINFO(printf("%s: u32Val=%d for u8Idx=0x%x, bufType=0x%x, offset=%d, size=%d\n",
3542 __FUNCTION__, u32Val, u8Idx, eBuffType, u16Offset, u8Size));
3543 return bRet;
3544 }
3545
3546 //================== Vol Info ==================//
HAL_MVD_GetBitsRate(MS_U8 u8Idx)3547 MS_U32 HAL_MVD_GetBitsRate(MS_U8 u8Idx)
3548 {
3549 //Ref 13818-2, this flag is unit of 400 bits/sec
3550 return MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_BIT_RATE, sizeof(MS_U32))*400;
3551 }
3552
HAL_MVD_GetVideoRange(MS_U8 u8Idx)3553 MS_U8 HAL_MVD_GetVideoRange(MS_U8 u8Idx)
3554 {
3555 return (MS_U8)MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_VIDEO_RANGE, sizeof(MS_U8));
3556 }
3557
HAL_MVD_GetLowDelayFlag(MS_U8 u8Idx)3558 MS_BOOL HAL_MVD_GetLowDelayFlag(MS_U8 u8Idx)
3559 {
3560 return (MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_LOW_DELAY, sizeof(MS_U8));
3561 }
3562
HAL_MVD_GetIs32PullDown(MS_U8 u8Idx)3563 MS_BOOL HAL_MVD_GetIs32PullDown(MS_U8 u8Idx)
3564 {
3565 return (MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_MPEG_FRC_MODE, sizeof(MS_U8));
3566 }
3567
HAL_MVD_GetIsDynScalingEnabled(MS_U8 u8Idx)3568 MS_BOOL HAL_MVD_GetIsDynScalingEnabled(MS_U8 u8Idx)
3569 {
3570 return (MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_DS_ENABLE, sizeof(MS_U8));
3571 }
3572
HAL_MVD_Is1stFrmRdy(MS_U8 u8Idx)3573 MS_BOOL HAL_MVD_Is1stFrmRdy(MS_U8 u8Idx)
3574 {
3575 return (MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_FIRST_DISPLAY, sizeof(MS_U8));
3576 }
3577
3578
3579 //================== FrameInfo ==================//
HAL_MVD_GetPicCounter(MS_U8 u8Idx)3580 MS_U32 HAL_MVD_GetPicCounter(MS_U8 u8Idx)
3581 {
3582 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_FRAME_COUNT, sizeof(MS_U32));
3583 }
3584
HAL_MVD_GetSkipPicCounter(MS_U8 u8Idx)3585 MS_U32 HAL_MVD_GetSkipPicCounter(MS_U8 u8Idx)
3586 {
3587 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SKIP_FRAME_COUNT, sizeof(MS_U32));
3588 }
3589
HAL_MVD_GetPicType(MS_U8 u8Idx)3590 MVD_PicType HAL_MVD_GetPicType(MS_U8 u8Idx)
3591 {
3592 MS_U32 picType = 0xff;
3593 MVD_PicType ret = E_MVD_PIC_UNKNOWN;
3594
3595 if (GET_FRMINFO_BUFFADD(u8Idx)==0)
3596 {
3597 MVD_DEBUGERROR(printf("%s error: pu8MVDGetFrameInfoBufStart=NULL\n", __FUNCTION__));
3598 return E_MVD_PIC_UNKNOWN;
3599 }
3600 picType = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PICTURE_TYPE, sizeof(MS_U32));
3601 switch (picType)
3602 {
3603 case 0:
3604 ret = E_MVD_PIC_I;
3605 break;
3606 case 1:
3607 ret = E_MVD_PIC_P;
3608 break;
3609 case 2:
3610 ret = E_MVD_PIC_B;
3611 break;
3612 default:
3613 break;
3614 }
3615 return ret;
3616 }
3617
HAL_MVD_GetPtsStcDiff(MS_U8 u8Idx)3618 MS_S32 HAL_MVD_GetPtsStcDiff(MS_U8 u8Idx)
3619 {
3620 return (MS_S32)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PTS_STC, sizeof(MS_S32));
3621 }
3622
HAL_MVD_GetDecodedFrameIdx(MS_U8 u8Idx)3623 MS_U8 HAL_MVD_GetDecodedFrameIdx(MS_U8 u8Idx)
3624 {
3625 return (MS_U8)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_FB_INDEX, sizeof(MS_U8));
3626 }
3627
HAL_MVD_GetVldErrCount(MS_U8 u8Idx)3628 MS_U32 HAL_MVD_GetVldErrCount(MS_U8 u8Idx)
3629 {
3630 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_VLD_ERR_COUNT, sizeof(MS_U32));
3631 }
3632
HAL_MVD_GetValidStreamFlag(MS_U8 u8Idx)3633 MS_BOOL HAL_MVD_GetValidStreamFlag(MS_U8 u8Idx)
3634 {
3635 return !(MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_INVALIDSTREAM, sizeof(MS_U8));
3636 }
3637
HAL_MVD_GetIsIPicFound(MS_U8 u8Idx)3638 MS_U8 HAL_MVD_GetIsIPicFound(MS_U8 u8Idx)
3639 {
3640 return (MS_U8)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_FIRST_I_FOUND, sizeof(MS_U8));
3641 }
3642
3643 //------------------------------------------------------------------------------
3644 /// Set PTS base to MVD F/W
3645 /// @param -u32pts \b IN : pts unit in 90k counter
3646 //------------------------------------------------------------------------------
HAL_MVD_SetPTSBase(MS_U8 u8Idx,MS_U32 u32pts)3647 void HAL_MVD_SetPTSBase(MS_U8 u8Idx, MS_U32 u32pts)
3648 {
3649 MVD_CmdArg mvdcmd;
3650
3651 SET_CMDARG(mvdcmd, u32pts, u8Idx);
3652 if (HAL_MVD_MVDCommand( CMD_PTS_BASE, &mvdcmd ) == FALSE)
3653 {
3654 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_PTS_BASE ) );
3655 }
3656 return;
3657 }
3658
HAL_MVD_GetPTS(MS_U8 u8Idx)3659 MS_U32 HAL_MVD_GetPTS(MS_U8 u8Idx)
3660 {
3661 MS_U32 u32PTS = 0;
3662
3663 u32PTS = (MS_U32)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DISP_PTS, sizeof(MS_U32));
3664 u32PTS = _90K_TO_MS(u32PTS);
3665 return u32PTS;
3666 }
3667
HAL_MVD_GetU64PTS(MS_U8 u8Idx,MVD_PtsType eType)3668 MS_U64 HAL_MVD_GetU64PTS(MS_U8 u8Idx,MVD_PtsType eType)
3669 {
3670 MS_U64 u64PTS = 0;
3671 MS_U64 u32_high32_PTS = 0;
3672 MS_U64 u32_low32_PTS = 0;
3673
3674 if(eType==E_MVD_PTS_DISP)
3675 {
3676 u32_low32_PTS = (MS_U64)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DISP_PTS, sizeof(MS_U32));
3677 u32_high32_PTS = (MS_U64)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DISP_PTS_MSB, sizeof(MS_U32));
3678 }
3679 else if(eType==E_MVD_PTS_PRE_PAS)
3680 {
3681 u32_low32_PTS = (MS_U64)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_WRPTR_PTS_LOW, sizeof(MS_U32));
3682 u32_high32_PTS = (MS_U64)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_WRPTR_PTS_HIGH, sizeof(MS_U32));
3683 }
3684
3685 u64PTS = (u32_high32_PTS<<32)|u32_low32_PTS;
3686 u64PTS = _90K_TO_MS_U64(u64PTS);
3687 return u64PTS;
3688 }
3689
HAL_MVD_GetNextPTS(MS_U8 u8Idx)3690 MS_U32 HAL_MVD_GetNextPTS(MS_U8 u8Idx)
3691 {
3692 return (MS_U32)_90K_TO_MS(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_NEXT_PTS, sizeof(MS_U32)));
3693 }
3694
HAL_MVD_GetChromaFormat(MS_U8 u8Idx)3695 MS_U32 HAL_MVD_GetChromaFormat(MS_U8 u8Idx)
3696 {
3697 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CHROMA_FORMAT, sizeof(MS_U8));
3698 }
3699
HAL_MVD_GetGOPCount(MS_U8 u8Idx)3700 MS_U32 HAL_MVD_GetGOPCount(MS_U8 u8Idx)
3701 {
3702 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_GOP_I_FCNT, sizeof(MS_U32))
3703 + MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_GOP_P_FCNT, sizeof(MS_U32))
3704 + MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_GOP_B_FCNT, sizeof(MS_U32));
3705 }
3706
HAL_MVD_GetColorFormat(MS_U8 u8Idx)3707 MS_U8 HAL_MVD_GetColorFormat(MS_U8 u8Idx)
3708 {
3709 if (GET_FRMINFO_BUFFADD(u8Idx)==0)
3710 {
3711 MVD_DEBUGERROR(printf("%s error: pu8MVDGetFrameInfoBufStart=NULL\n", __FUNCTION__));
3712 return 0xff;
3713 }
3714
3715 return (MS_U8)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_VIDEO_FORMAT, sizeof(MS_U8));
3716 }
3717
HAL_MVD_GetMatrixCoef(MS_U8 u8Idx)3718 MS_U8 HAL_MVD_GetMatrixCoef(MS_U8 u8Idx)
3719 {
3720 if (GET_FRMINFO_BUFFADD(u8Idx)==0)
3721 {
3722 MVD_DEBUGERROR(printf("%s error: pu8MVDGetFrameInfoBufStart=NULL\n", __FUNCTION__));
3723 return 0xff;
3724 }
3725
3726 return (MS_U8)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_MATRIX_COEF, sizeof(MS_U8));
3727 }
3728
HAL_MVD_StepDecode(MS_U8 u8Idx)3729 MS_BOOL HAL_MVD_StepDecode(MS_U8 u8Idx)
3730 {
3731 MVD_CmdArg mvdcmd;
3732 SETUP_CMDARG(mvdcmd);
3733 SET_DECNUM(mvdcmd, u8Idx);
3734 SET_CMD_RET_FALSE(CMD_SINGLE_STEP, &mvdcmd);
3735
3736 if (HAL_MVD_Resume(u8Idx) == FALSE)
3737 {
3738 MVD_DEBUGERROR(printf("Command: HAL_MVD_Resume fail!!\r\n"));
3739 return FALSE;
3740 }
3741
3742 MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
3743 if (pCtrlCfg)
3744 {
3745 pCtrlCfg->bStepDecode = TRUE;
3746 }
3747
3748 return TRUE;
3749 }
3750
HAL_MVD_IsStepDispDone(MS_U8 u8Idx)3751 MS_BOOL HAL_MVD_IsStepDispDone(MS_U8 u8Idx)
3752 {
3753 return (MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_STEP_DISP_DONE, sizeof(MS_U8));
3754 }
3755
HAL_MVD_IsStep2PtsDone(MS_U8 u8Idx)3756 MS_BOOL HAL_MVD_IsStep2PtsDone(MS_U8 u8Idx)
3757 {
3758 return (MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_STEP_TO_PTS_DONE, sizeof(MS_U8));
3759 }
3760
3761 //Only for RCV.
HAL_MVD_GetPayloadLen(MS_U8 u8Idx)3762 MS_U32 HAL_MVD_GetPayloadLen(MS_U8 u8Idx)
3763 {
3764 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_RCV_PAYLOAD_LENGTH, sizeof(MS_U32));
3765 }
3766
3767 //Only for RCV.
HAL_MVD_GotFileEndPattern(MS_U8 u8Idx)3768 MS_BOOL HAL_MVD_GotFileEndPattern(MS_U8 u8Idx)
3769 {
3770 return (MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_MEET_FILE_END_SC, sizeof(MS_U8));
3771 }
3772
HAL_MVD_IsCmdFinished(MS_U8 u8Idx,MVD_HANDSHAKE_CMD eCmd)3773 MS_BOOL HAL_MVD_IsCmdFinished(MS_U8 u8Idx, MVD_HANDSHAKE_CMD eCmd)
3774 {
3775 MVD_CMD_HANDSHADE_INDEX u32CmdState;
3776 MS_BOOL bCmdRdy = FALSE;
3777
3778 HAL_MVD_InvalidBuffRetFalse(GET_FRMINFO_BUFFADD(u8Idx));
3779
3780 u32CmdState.value = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CMD_HANDSHAKE_INDEX, sizeof(MS_U32));
3781 MVD_DEBUGINFO(printf("u32CmdState.value = 0x%x\n", u32CmdState.value));
3782 switch (eCmd)
3783 {
3784 case MVD_HANDSHAKE_PAUSE:
3785 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_pause);
3786 break;
3787 case MVD_HANDSHAKE_SLQ_RST:
3788 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_slq_reset);
3789 break;
3790 case MVD_HANDSHAKE_STOP:
3791 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_stop);
3792 break;
3793 case MVD_HANDSHAKE_SKIP_DATA:
3794 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_skip_data);
3795 break;
3796 case MVD_HANDSHAKE_SINGLE_STEP:
3797 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_single_step);
3798 break;
3799 case MVD_HANDSHAKE_SCALER_INFO:
3800 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_scaler_data_ready);
3801 break;
3802 case MVD_HANDSHAKE_GET_NXTDISPFRM:
3803 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_get_nextdispfrm_ready);
3804 break;
3805 case MVD_HANDSHAKE_PARSER_RST:
3806 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_parser_rst);
3807 break;
3808 case MVD_HANDSHAKE_RST_CC608:
3809 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_cc608_rst);
3810 break;
3811 case MVD_HANDSHAKE_RST_CC708:
3812 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_cc708_rst);
3813 break;
3814 case MVD_HANDSHAKE_VIRTUAL_COMMAND:
3815 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_virtualCommand);
3816 break;
3817 case MVD_HANDSHAKE_FLUSHQUEUE_COMMAND:
3818 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_flush);
3819 break;
3820 default:
3821 bCmdRdy = FALSE;
3822 break;
3823 }
3824 return bCmdRdy;
3825 }
3826
HAL_MVD_ClearCmdFinished(MS_U8 u8Idx,MVD_HANDSHAKE_CMD eCmd)3827 MS_BOOL HAL_MVD_ClearCmdFinished(MS_U8 u8Idx, MVD_HANDSHAKE_CMD eCmd)
3828 {
3829 MVD_CMD_HANDSHADE_INDEX u32CmdState;
3830
3831 HAL_MVD_InvalidBuffRetFalse(GET_FRMINFO_BUFFADD(u8Idx));
3832
3833 u32CmdState.value = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CMD_HANDSHAKE_INDEX, sizeof(MS_U32));
3834 MVD_DEBUGINFO(printf("before CLR u32CmdState.value = 0x%x\n", u32CmdState.value));
3835 switch (eCmd)
3836 {
3837 case MVD_HANDSHAKE_SCALER_INFO:
3838 u32CmdState.mvdcmd_handshake_scaler_data_ready = 0;
3839 break;
3840 default:
3841 break;
3842 }
3843
3844 //write the value back: may it overwrite the value that f/w is supposed to write?
3845 MVD_WriteFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CMD_HANDSHAKE_INDEX, sizeof(MS_U32), u32CmdState.value);
3846 MVD_DEBUGINFO(printf("after CLR u32CmdState.value = 0x%x\n",
3847 MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CMD_HANDSHAKE_INDEX, sizeof(MS_U32))));
3848 return TRUE;
3849 }
3850
3851
HAL_MVD_GetTimeCode(MS_U8 u8Idx,MVD_FrmInfoType eType,MVD_TimeCode * pInfo)3852 MS_BOOL HAL_MVD_GetTimeCode(MS_U8 u8Idx, MVD_FrmInfoType eType, MVD_TimeCode* pInfo)
3853 {
3854 MS_BOOL bRet = FALSE;
3855 MS_VIRT pu8MVDGetFrameInfoBufStart = GET_FRMINFO_BUFFADD(u8Idx);
3856 if (NULL == pInfo)
3857 {
3858 return FALSE;
3859 }
3860
3861 HAL_MVD_InvalidBuffRetFalse(pu8MVDGetFrameInfoBufStart);
3862
3863 if (E_MVD_FRMINFO_DECODE == eType)
3864 {
3865 pInfo->u8TimeCodeHr = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_HOURS);
3866 pInfo->u8TimeCodeMin = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_MINUTES);
3867 pInfo->u8TimeCodeSec = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_SECONDS);
3868 pInfo->u8TimeCodePic = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_PICTURES);
3869 pInfo->u8DropFrmFlag = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_DROP_FRAME_FLAG);
3870 }
3871 else if (E_MVD_FRMINFO_DISPLAY == eType)
3872 {
3873 pInfo->u8TimeCodeHr = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_HOURS_DISP);
3874 pInfo->u8TimeCodeMin = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_MINUTES_DISP);
3875 pInfo->u8TimeCodeSec = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_SECONDS_DISP);
3876 pInfo->u8TimeCodePic = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_PICTURES_DISP);
3877 pInfo->u8DropFrmFlag = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_DROP_FRAME_FLAG_DISP);
3878 }
3879 else
3880 {
3881 bRet = FALSE;
3882 }
3883
3884 return bRet;
3885 }
3886
HAL_MVD_GetDispCnt(MS_U8 u8Idx)3887 MS_U32 HAL_MVD_GetDispCnt(MS_U8 u8Idx)
3888 {
3889 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DISPLAYED_CNT, sizeof(MS_U32));
3890 }
3891
HAL_MVD_GetMinTspDataSize(MS_U8 u8HalIdx)3892 MS_U32 HAL_MVD_GetMinTspDataSize(MS_U8 u8HalIdx)
3893 {
3894 #ifdef OFFSET_CUR_MIN_TSP_DATA_SIZE
3895 return MVD_GetFWBuffData(u8HalIdx, FW_BUFF_FRMINFO, OFFSET_CUR_MIN_TSP_DATA_SIZE, sizeof(MS_U32));
3896 #else
3897 return 0x400;
3898 #endif
3899 }
3900
HAL_MVD_GetXcLowDelayIntState(MS_U8 u8Idx)3901 MS_U32 HAL_MVD_GetXcLowDelayIntState(MS_U8 u8Idx)
3902 {
3903 MS_VIRT pu8MVDGetFrameInfoBufStart = GET_FRMINFO_BUFFADD(u8Idx);
3904
3905 if(pu8MVDGetFrameInfoBufStart==0)
3906 {
3907 MVD_DEBUGERROR(printf("MDrv_MVD_GetXcLowDelayIntState error: pu8MVDGetFrameInfoBufStart=NULL\n"));
3908 return 0;
3909 }
3910
3911 MVD_DEBUGINFO(printf("MDrv_MVD_GetXcLowDelayIntState()=%x,%x,%x,%x,%x\n",
3912 (HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart+OFFSET_XC_LOW_DELAY_CNT)),
3913 (HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart+OFFSET_XC_LOW_DELAY_INT_STATE)),
3914 (HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart+OFFSET_XC_DIFF_FIELD_NO)),
3915 (HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart+OFFSET_XC_LOW_DELAY_CNT_LATCH)),
3916 (HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart+OFFSET_FRAME_COUNT))));
3917
3918 return HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart+OFFSET_XC_LOW_DELAY_INT_STATE);
3919 }
3920
3921 //Get ErrStatus when ErrCode==ErrShape
MVD_GetErrShapeStat(MS_U32 u32errStat)3922 static MVD_ErrStatus MVD_GetErrShapeStat(MS_U32 u32errStat)
3923 {
3924 MVD_ErrStatus st = E_MVD_ERR_STATUS_UNKOWN;
3925 switch (u32errStat)
3926 {
3927 case 0:
3928 st = E_MVD_ERR_SHAPE_RECTANGULAR;
3929 break;
3930 case 1:
3931 st = E_MVD_ERR_SHAPE_BINARY;
3932 break;
3933 case 2:
3934 st = E_MVD_ERR_SHAPE_BINARY_ONLY;
3935 break;
3936 case 3:
3937 st = E_MVD_ERR_SHAPE_GRAYSCALE;
3938 break;
3939 default:
3940 break;
3941 }
3942 return st;
3943 }
3944
3945 //Get ErrStatus when ErrCode==ErrSprite
MVD_GetErrSpriteStat(MS_U32 u32errStat)3946 static MVD_ErrStatus MVD_GetErrSpriteStat(MS_U32 u32errStat)
3947 {
3948 MVD_ErrStatus st = E_MVD_ERR_STATUS_UNKOWN;
3949 switch (u32errStat)
3950 {
3951 case 0:
3952 st = E_MVD_ERR_USED_SPRITE_UNUSED;
3953 break;
3954 case 1:
3955 st = E_MVD_ERR_USED_SPRITE_STATIC;
3956 break;
3957 case 2:
3958 st = E_MVD_ERR_USED_SPRITE_GMC;
3959 break;
3960 case 3:
3961 st = E_MVD_ERR_USED_SPRITE_RESERVED;
3962 break;
3963 default:
3964 break;
3965 }
3966 return st;
3967 }
3968
HAL_MVD_GetErrInfo(MS_U8 u8Idx,MVD_ErrCode * errCode,MVD_ErrStatus * errStatus)3969 void HAL_MVD_GetErrInfo(MS_U8 u8Idx, MVD_ErrCode *errCode, MVD_ErrStatus *errStatus)
3970 {
3971 MS_U32 errorCode = E_MVD_ERR_UNKNOWN;
3972 MS_U32 errorStatus = E_MVD_ERR_STATUS_UNKOWN;
3973 MS_VIRT pu8MVDGetFrameInfoBufStart = GET_FRMINFO_BUFFADD(u8Idx);
3974
3975 if(pu8MVDGetFrameInfoBufStart==0)
3976 {
3977 MVD_DEBUGERROR(printf("MDrv_MVD_GetErrInfo error!\n"));
3978 return;
3979 }
3980
3981 errorCode = HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart + OFFSET_ERROR_CODE);
3982 errorStatus = HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart + OFFSET_ERROR_STATUS);
3983
3984 switch (errorCode)
3985 {
3986 case VOL_SHAPE:
3987 *errCode = E_MVD_ERR_SHAPE;
3988 *errStatus = MVD_GetErrShapeStat(errorStatus);
3989 break;
3990 case VOL_USED_SPRITE:
3991 *errCode = E_MVD_ERR_USED_SPRITE;
3992 *errStatus = MVD_GetErrSpriteStat(errorStatus);
3993 break;
3994 case VOL_NOT_8_BIT:
3995 *errCode = E_MVD_ERR_NOT_8_BIT;
3996 *errStatus = E_MVD_ERR_STATUS_NONE;
3997 break;
3998 case VOL_NERPRED_ENABLE:
3999 *errCode = E_MVD_ERR_NERPRED_ENABLE;
4000 *errStatus = E_MVD_ERR_STATUS_NONE;
4001 break;
4002 case VOL_REDUCED_RES_ENABLE:
4003 *errCode = E_MVD_ERR_REDUCED_RES_ENABLE;
4004 *errStatus = E_MVD_ERR_STATUS_NONE;
4005 break;
4006 case VOL_SCALABILITY:
4007 *errCode = E_MVD_ERR_SCALABILITY;
4008 *errStatus = E_MVD_ERR_STATUS_NONE;
4009 break;
4010 case VOL_H263_ERROR:
4011 *errCode = E_MVD_ERR_H263_ERROR;
4012 *errStatus = E_MVD_ERR_STATUS_NONE;
4013 break;
4014 case VOL_RES_NOT_SUPPORT:
4015 *errCode = E_MVD_ERR_RES_NOT_SUPPORT;
4016 *errStatus = E_MVD_ERR_STATUS_NONE;
4017 break;
4018 case VOL_MPEG4_NOT_SUPPORT:
4019 *errCode = E_MVD_ERR_MPEG4_NOT_SUPPORT;
4020 *errStatus = E_MVD_ERR_STATUS_NONE;
4021 break;
4022 case VOL_PROFILE_NOT_SUPPORT:
4023 *errCode = E_MVD_ERR_PROFILE_NOT_SUPPORT;
4024 *errStatus = E_MVD_ERR_STATUS_NONE;
4025 break;
4026 case VOL_RCV_ERROR_OCCUR:
4027 *errCode = E_MVD_ERR_RCV_ERROR_OCCUR;
4028 *errStatus = E_MVD_ERR_STATUS_NONE;
4029 break;
4030 case VOL_OTHER:
4031 *errCode = E_MVD_ERR_OTHER;
4032 *errStatus = E_MVD_ERR_STATUS_NONE;
4033 break;
4034 default:
4035 *errCode = E_MVD_ERR_UNKNOWN;
4036 *errStatus = E_MVD_ERR_STATUS_UNKOWN;
4037 break;
4038 }
4039
4040 return;
4041 }
4042
4043 //take care MIU1 address
HAL_MVD_GetMemOffset(MS_PHY u32PhyAdd)4044 MS_PHY HAL_MVD_GetMemOffset(MS_PHY u32PhyAdd)
4045 {
4046 if (u32PhyAdd >= pMVDHalContext->stMiuCfg.u32Miu2BaseAddr)
4047 {
4048 return (u32PhyAdd - pMVDHalContext->stMiuCfg.u32Miu2BaseAddr);
4049 }
4050 else if(u32PhyAdd >= pMVDHalContext->stMiuCfg.u32Miu1BaseAddr)
4051 {
4052 return (u32PhyAdd - pMVDHalContext->stMiuCfg.u32Miu1BaseAddr);
4053 }
4054 else
4055 {
4056 return u32PhyAdd;
4057 }
4058 }
4059
4060
HAL_MVD_SLQTblSendPacket(MS_U8 u8Idx,MVD_PacketInfo * pstVideoPKT)4061 MS_BOOL HAL_MVD_SLQTblSendPacket(MS_U8 u8Idx, MVD_PacketInfo *pstVideoPKT)
4062 {
4063 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
4064 MS_VIRT u32EsLast;
4065 MS_VIRT* u32LastEntry = &pstSlqTblInfo->pDrvSlqTbl->u32WrPtr;
4066 MS_VIRT* pu32EsNew = &pstSlqTblInfo->pDrvEsTbl->u32WrPtr;
4067 MS_U32 u32EntryWord = 0;
4068 MS_U32 u32Index = 0;
4069 MS_U32 u32Pts;
4070 MS_VIRT u32MVDFWPtsTblAddr = NULL;
4071 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
4072
4073 MS_U32 u32ESStart=0;
4074 MS_U32 u32ESEnd=0;
4075 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
4076
4077
4078 #if _SLQTBL_DUMP_PKT
4079 // static MS_U32 u32SendTimes[MAX_DEC_NUM]= {0, 0};
4080
4081 printf("Pkt[%x] st=0x%x len=0x%x pts=0x%x id_l=0x%x id_h=0x%x\n", u32SendTimes[u8Idx]++,
4082 pstVideoPKT->u32StAddr, pstVideoPKT->u32Length, pstVideoPKT->u32TimeStamp,
4083 pstVideoPKT->u32ID_L, pstVideoPKT->u32ID_H);
4084 #endif
4085
4086 #ifdef VDEC3
4087 if(pstCtrlCfg->u8McuMode == FALSE)
4088 #endif
4089 {
4090 u32MVDFWPtsTblAddr = GET_PTSTBL_BUFFADD(u8Idx);
4091 MS_ASSERT(u32MVDFWPtsTblAddr != NULL);
4092 if (u32MVDFWPtsTblAddr)
4093 {
4094 MS_VIRT u32PtsTblEntryAddr = 0;
4095 //so far, this is the only place that driver will write f/w 1M area after init.
4096 u32Index = (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr - pstSlqTblInfo->pDrvSlqTbl->u32StAdd)/8;
4097 if(HAL_MVD_IsMcuMode(u8Idx) == FALSE)
4098 {
4099 if (pstVideoPKT->u32TimeStamp != MVD_NULLPKT_PTS)
4100 {
4101 u32Pts = _MS_TO_90K(pstVideoPKT->u32TimeStamp);
4102 }
4103 else
4104 {
4105 u32Pts = MVD_NULLPKT_PTS;
4106 }
4107 }
4108 else
4109 {
4110 u32Pts = pstVideoPKT->u32TimeStamp;
4111 }
4112 u32PtsTblEntryAddr = u32MVDFWPtsTblAddr+u32Index*MVD_FW_SLQTBL_PTS_LEN;
4113 HAL_MVD_MemWrite4Byte(u32PtsTblEntryAddr+4, pstSlqTblInfo->u32DummyPktCnt); //dummyPktCnt
4114 HAL_MVD_MemWrite4Byte(u32PtsTblEntryAddr+8, pstVideoPKT->u32ID_L); //idLow
4115 HAL_MVD_MemWrite4Byte(u32PtsTblEntryAddr+12, pstVideoPKT->u32ID_H); //idHigh
4116 HAL_MVD_MemWrite4Byte(u32PtsTblEntryAddr+16, u32Pts); //PTS
4117 HAL_MVD_MemWrite4Byte(u32PtsTblEntryAddr, (pstSlqTblInfo->u32SlqByteCnt)&0xffffff); //byteCnt
4118 //printf("PTS=0x%x(%x), idx=0x%x add=0x%x\n", pstVideoPKT->u32TimeStamp,
4119 // HAL_MVD_MemRead4Byte(u32PtsTblEntryAddr+16),
4120 // u32Index, u32PtsTblEntryAddr+16);
4121
4122 if ((HAL_MVD_IsMStreamerMode(u8Idx) || HAL_MVD_IsMcuMode(u8Idx))
4123 && (pstCtrlCfg->eFileSyncMode == E_MVD_TIMESTAMP_STS))
4124 {
4125 if(pMVDHalContext->bDropOnePTS[u8Idx] == FALSE)
4126 {
4127 HAL_MVD_MemWrite4Byte(u32MVDFWPtsTblAddr+MVD_FW_SLQTBL_PTS_LEN+12, pstVideoPKT->u32ID_H); //idHigh
4128 HAL_MVD_MemWrite4Byte(u32MVDFWPtsTblAddr+MVD_FW_SLQTBL_PTS_LEN+16, pstVideoPKT->u32TimeStamp); //PTS
4129
4130 MVD_DBG_STS(printf(">>> drvMVD pts,idH = %lu, %lu\n", HAL_MVD_MemRead4Byte(u32MVDFWPtsTblAddr+MVD_FW_SLQTBL_PTS_LEN+16),
4131 HAL_MVD_MemRead4Byte(u32MVDFWPtsTblAddr+MVD_FW_SLQTBL_PTS_LEN+12)));
4132 if (((MVD_NULLPKT_PTS == pstVideoPKT->u32ID_H) && (MVD_NULLPKT_PTS == pstVideoPKT->u32TimeStamp)) == FALSE)
4133 { //Only update PTS to firmware when pts field is valid.
4134 //Plz refer to MDrv_MVD_PushQueue if (u8MstMode == MST_MODE_TRUE) {}
4135 HAL_MVD_UpdatePts(u8Idx); //for uniplayer or MCU mode
4136 }
4137 }
4138
4139 pMVDHalContext->bDropOnePTS[u8Idx] = FALSE;
4140 }
4141 }
4142 #if _SLQTBL_DUMP_PTS
4143 if (u32Index == 0x177)
4144 {
4145 _SLQTbl_DumpPtsTbl(u8Idx, 0, 0x179);
4146 }
4147 #endif
4148 }
4149 pstSlqTblInfo->u32SlqByteCnt += pstVideoPKT->u32Length;
4150
4151 //update SLQ tbl entry
4152 //u32EsLast = (pstVideoPKT->u32StAddr)+pstSlqTblInfo->pDrvSlqTbl->u32StAdd;
4153 u32EsLast = (pstVideoPKT->u32StAddr)+HAL_MVD_GetMemOffset(pstMemCfg->u32BSAddr);
4154 HAL_MVD_MemWrite4Byte(*pu32EsNew, u32EsLast-HAL_MVD_GetMemOffset(pstMemCfg->u32BSAddr));
4155 u32ESStart = (u32EsLast) & SLQ_TBL_ENTRY_LEN;
4156
4157 u32EsLast += pstVideoPKT->u32Length; //update ES write pointer
4158 //Notice: This is for MVD HW, so no need to minus one.
4159 HAL_MVD_MemWrite4Byte((*pu32EsNew)+4, u32EsLast-HAL_MVD_GetMemOffset(pstMemCfg->u32BSAddr));
4160 u32ESEnd = (u32EsLast) & SLQ_TBL_ENTRY_LEN;
4161
4162 *pu32EsNew += 8;
4163 if (*pu32EsNew >= pstSlqTblInfo->pDrvEsTbl->u32EndAdd)
4164 { //wrap to the beginning of the table
4165 MVD_DEBUGINFO(printf("...ES wrapping to the beginning!\n"));
4166 *pu32EsNew = pstSlqTblInfo->pDrvEsTbl->u32StAdd;
4167 }
4168
4169 //printf("===>[%x] u32ESStart=0x%x u32ESEnd=0x%x u32EsLast=0x%x\n",
4170 // pMVDHalContext->u32SendTimes[u8Idx]++, u32ESStart, u32ESEnd, u32EsLast);
4171
4172 u32EntryWord = u32ESEnd;
4173 HAL_MVD_MemWrite4Byte(*u32LastEntry, u32EntryWord);
4174 //printf("===> u32EntryWord1 addr=0x%x\n", (*u32LastEntry));
4175 //printf("===> u32EntryWord0=0x%x\n", u32EntryWord);
4176
4177 u32EntryWord = u32ESStart;
4178 HAL_MVD_MemWrite4Byte((*u32LastEntry)+4, u32EntryWord);
4179 //printf("===> u32EntryWord1 addr=0x%x\n", (*u32LastEntry)+4);
4180 //printf("===> u32EntryWord1=0x%x\n", u32EntryWord);
4181
4182 *u32LastEntry += 8;
4183 if (*u32LastEntry >= pstSlqTblInfo->pDrvSlqTbl->u32EndAdd)
4184 { //wrap to the beginning of the table
4185 MVD_DEBUGINFO(printf("...wrapping to the beginning!\n"));
4186 *u32LastEntry = pstSlqTblInfo->pDrvSlqTbl->u32StAdd;
4187 //also wrap DivX311 pattern table
4188 pstSlqTblInfo->pDrvDivxTbl->u32WrPtr = pstSlqTblInfo->pDrvDivxTbl->u32StAdd;
4189 }
4190
4191 if (pstSlqTblInfo->pDrvSlqTbl->u32Empty)
4192 {
4193 pstSlqTblInfo->pDrvSlqTbl->u32Empty -= SLQ_ENTRY_LEN;
4194 }
4195
4196 return TRUE;
4197 }
4198
4199 //Table of frame rate code for MPEG-2
4200 #if 0
4201 #define FRM_RATE_CODE_NUM 9
4202 static const MS_U16 stFrameRateCode[FRM_RATE_CODE_NUM]=
4203 {
4204 NULL,23976,24000,25000,29976,30000,50000,59947,60000
4205 };
4206 #endif
MVD_GCD(MS_U32 u32A,MS_U32 u32B)4207 static MS_U32 MVD_GCD(MS_U32 u32A, MS_U32 u32B)
4208 {
4209 MS_S32 i;
4210 MS_U32 x[4]; /* need x[0], x[1], x[i-1] */
4211
4212 if (u32A > u32B)
4213 {
4214 x[0] = u32A; x[1] = u32B;
4215 }
4216 else
4217 {
4218 x[0] = u32B; x[1] = u32A;
4219 }
4220
4221 i = 1;
4222
4223 #define w(x) (((x)<4)?(x):(2+((x)&1)))
4224
4225 while( x[w(i)] != 0 )
4226 {
4227 x[w(i+1)] = x[w(i-1)] % x[w(i)];
4228 i++;
4229 }
4230
4231 return x[w(i-1)];
4232
4233 #undef w
4234 }
HAL_MVD_GetFrameInfo(MS_U8 u8Idx,MVD_FrameInfo * pinfo)4235 void HAL_MVD_GetFrameInfo(MS_U8 u8Idx, MVD_FrameInfo *pinfo)
4236 {
4237 FW_VOL_INFO gvolInfo;
4238 FW_DIVX_INFO* pDivxInfo = &(pMVDHalContext->gdivxInfo[u8Idx]);
4239 MS_VIRT temp = 0;
4240 MS_U32 u32DAR_Width=0,u32DAR_Height=0,u32PAR_Width=0,u32PAR_Height=0,u32GCD=0;
4241 MS_U32 u32Vertical_Size=0, u32Horizontal_Size=0;
4242 //13818-2 page 38 Table 6-3
4243 MS_U8 u8DARTable[5][2] = { {1,1}, {1,1}, {4,3}, {16,9}, {221,100} };
4244 MS_U32 pu8MVDGetVolBufStart = NULL;
4245 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
4246
4247 pu8MVDGetVolBufStart = GET_VOL_BUFFADD(u8Idx);
4248 if (pu8MVDGetVolBufStart == NULL)
4249 {
4250 MVD_DEBUGERROR(printf("MDrv_MVD_GetFrameInfo error: pu8MVDGetVolBufStart=NULL\n"));
4251 return;
4252 }
4253
4254 HAL_MVD_CPU_Sync();
4255 HAL_MVD_ReadMemory();
4256
4257 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,GET_VOL_BUFFADD(u8Idx),temp);
4258
4259 gvolInfo = (*(volatile FW_VOL_INFO*)(HAL_MVD_PA2NonCacheSeg(temp)));
4260
4261 pinfo->u16HorSize = (MS_U16) gvolInfo.width;
4262 pinfo->u16VerSize = (MS_U16) gvolInfo.height;
4263 pinfo->u16par_width = (MS_U16) gvolInfo.par_width;
4264 pinfo->u16par_height = (MS_U16) gvolInfo.par_height;
4265 pinfo->u8AspectRate = gvolInfo.aspect_ratio;
4266
4267 pinfo->u16CropBottom = gvolInfo.CropBottom;
4268 pinfo->u16CropTop = 0;
4269 pinfo->u16CropLeft = 0;
4270
4271 if (pinfo->u16HorSize & MVD_WIDTH_ALIGN_MASK)
4272 {
4273 //Notice: Firmware and driver have to be consistent for this part,
4274 // otherwise the pitch will not match and video is noisy.
4275 pinfo->u16CropRight = MVD_WIDTH_ALIGN_BYTE - (pinfo->u16HorSize & MVD_WIDTH_ALIGN_MASK);
4276 pinfo->u16HorSize = ((pinfo->u16HorSize >> MVD_WIDTH_ALIGN_BITS) + 1) << MVD_WIDTH_ALIGN_BITS;
4277 }
4278 else
4279 {
4280 pinfo->u16CropRight = 0;
4281 }
4282
4283 MVD_CodecType curCodecType = HAL_MVD_GetCodecType(u8Idx);
4284 if ((curCodecType == E_MVD_CODEC_MPEG4_SHORT_VIDEO_HEADER) ||
4285 (curCodecType == E_MVD_CODEC_DIVX311) || (curCodecType == E_MVD_CODEC_FLV))
4286 {
4287 pinfo->u8Interlace= FALSE; //divx311/flv/svh just has progressive mode
4288 MS_ASSERT(gvolInfo.progressive_sequence == 1); //FW will init it as 1
4289 }
4290 else
4291 {
4292 if (gvolInfo.progressive_sequence == 0)
4293 {
4294 pinfo->u8Interlace=1;
4295 }
4296 else
4297 {
4298 pinfo->u8Interlace=0;
4299 }
4300 }
4301
4302 ///Calculate PAR info
4303 if (pinfo->u16par_width == 0 || pinfo->u16par_height == 0)
4304 {
4305 if ((pinfo->u8AspectRate > 0) && (pinfo->u8AspectRate < 5 ))
4306 {
4307 if (pinfo->u8AspectRate == 1)
4308 { //SAR=1.0 square sample
4309 u32DAR_Width = (MS_U32)pinfo->u16HorSize;
4310 u32DAR_Height = (MS_U32)pinfo->u16VerSize;
4311 pinfo->u16par_width = 1;
4312 pinfo->u16par_height = 1;
4313 }
4314 else
4315 {
4316 u32DAR_Width = (MS_U32)u8DARTable[pinfo->u8AspectRate][0];
4317 u32DAR_Height = (MS_U32)u8DARTable[pinfo->u8AspectRate][1];
4318 u32Vertical_Size = (MS_U32)pinfo->u16VerSize;
4319 u32Horizontal_Size = (MS_U32)(pinfo->u16HorSize - pinfo->u16CropRight);
4320 u32PAR_Width = u32DAR_Width * u32Vertical_Size;
4321 u32PAR_Height = u32DAR_Height * u32Horizontal_Size;
4322 u32GCD = MVD_GCD(u32PAR_Width, u32PAR_Height);
4323 if (0 == u32GCD)
4324 {
4325 pinfo->u16HorSize = 0xFFFF;
4326 pinfo->u16VerSize = 0xFFFF;
4327
4328 return;
4329 }
4330 else
4331 {
4332 pinfo->u16par_width = (MS_U16) (u32PAR_Width / u32GCD);
4333 pinfo->u16par_height = (MS_U16) (u32PAR_Height / u32GCD);
4334 MVD_DEBUGVERBAL(printf("u32PAR_Width:%d,u32PAR_Height:%d,GCD:%d\n",u32PAR_Width,u32PAR_Height,u32GCD));
4335 }
4336 }
4337 }
4338 else
4339 {
4340 //set to 0 to indicate it's abnormal
4341 u32DAR_Width = 0;
4342 u32DAR_Height = 0;
4343 pinfo->u16par_width = 0;
4344 pinfo->u16par_height = 0;
4345 }
4346 MVD_DEBUGVERBAL(printf("u32DAR_Width:%d,u32DAR_Height%d\n",u32DAR_Width,u32DAR_Height));
4347 }
4348 MVD_DEBUGVERBAL(printf("pinfo->u16par_width:%d, pinfo->u16par_height:%d\n",pinfo->u16par_width, pinfo->u16par_height));
4349
4350 if (curCodecType == E_MVD_CODEC_MPEG2)
4351 {
4352 if (gvolInfo.frame_rate < FRM_RATE_CODE_NUM)
4353 {
4354 pinfo->u32FrameRate = stFrameRateCode[gvolInfo.frame_rate];
4355 }
4356 else
4357 {
4358 pinfo->u32FrameRate = 0;
4359 }
4360 }
4361 else if ((curCodecType == E_MVD_CODEC_VC1_ADV) || (curCodecType == E_MVD_CODEC_VC1_MAIN))
4362 {
4363 if ((gvolInfo.vc1_frame_rate != 0) && (gvolInfo.vc1_frame_rate != MVD_U32_MAX))
4364 {
4365 pinfo->u32FrameRate = gvolInfo.vc1_frame_rate;
4366 }
4367 else if(pMVDHalContext->u32DmxFrameRate[u8Idx] != 0 && pMVDHalContext->u32DmxFrameRateBase[u8Idx] != 0)
4368 {
4369 pinfo->u32FrameRate = (pMVDHalContext->u32DmxFrameRate[u8Idx] * 1000) / pMVDHalContext->u32DmxFrameRateBase[u8Idx];
4370 }
4371 else
4372 {
4373 pinfo->u32FrameRate = pDivxInfo->frame_rate; //report framerate specified in MDrv_MVD_SetFrameInfo()
4374 }
4375
4376 MVD_DEBUGVERBAL(printf("MVD: vc1_frameRate=%d\n", pinfo->u32FrameRate));
4377 }
4378 else if (curCodecType == E_MVD_CODEC_MPEG4)
4379 {
4380 if (pDivxInfo->frame_rate != 0)
4381 {
4382 pinfo->u32FrameRate = pDivxInfo->frame_rate;
4383 //report framerate specified in MDrv_MVD_SetFrameInfo(), which is usually obtained from container
4384 }
4385 else if (gvolInfo.frame_rate != 0)
4386 {
4387 pinfo->u32FrameRate = gvolInfo.frame_rate; //report framerate from f/w
4388 }
4389 else if ((gvolInfo.fixed_vop_time_incr != 0) && (gvolInfo.vol_time_incr_res != 0))
4390 {
4391 pinfo->u32FrameRate = (gvolInfo.vol_time_incr_res * 1000) / gvolInfo.fixed_vop_time_incr;
4392 //calculate framerate according to vol header
4393 }
4394 else if(pMVDHalContext->u32DmxFrameRate[u8Idx] != 0 && pMVDHalContext->u32DmxFrameRateBase[u8Idx] != 0)
4395 {
4396 pinfo->u32FrameRate = (pMVDHalContext->u32DmxFrameRate[u8Idx] * 1000) / pMVDHalContext->u32DmxFrameRateBase[u8Idx];
4397 }
4398 else
4399 {
4400 pinfo->u32FrameRate = 60000; //set default frame rate according to chip capability
4401 }
4402 MVD_DEBUGVERBAL(printf("MVD: vol_time_incr_res=%d, fixed_vop_time_incr=%d\n", gvolInfo.vol_time_incr_res, gvolInfo.fixed_vop_time_incr));
4403 }
4404 else
4405 {
4406 if (gvolInfo.frame_rate != 0)
4407 {
4408 pinfo->u32FrameRate = gvolInfo.frame_rate;
4409 }
4410 else
4411 {
4412 pinfo->u32FrameRate = pDivxInfo->frame_rate; //report framerate specified in MDrv_MVD_SetFrameInfo()
4413 }
4414 }
4415 MVD_DEBUGVERBAL(printf("===> MVD: frameRate=%d curCodecType=0x%x\n", pinfo->u32FrameRate, curCodecType));
4416
4417 //for MM
4418 pinfo->u8MPEG1=gvolInfo.mpeg1;
4419 pinfo->u16PTSInterval=gvolInfo.pts_incr;
4420 pinfo->u8PlayMode=gvolInfo.play_mode;
4421 pinfo->u8FrcMode=gvolInfo.mpeg_frc_mode;
4422
4423 //for dynamic scaling
4424 pinfo->bEnableMIUSel = (MS_BOOL)pMVDHalContext->stMiuCfg.u8FWMiuSel;
4425
4426 if(pMVDHalContext->stMiuCfg.u8FWMiuSel >= E_CHIP_MIU_2)
4427 {
4428 MVD_DEBUGERROR(printf("u8MiuSel is %d !!, but return type is only Boolean. Please use MDrv_HVD_EX_GetDSBufMiuSelect() to get right miu select of DS buffer!\n",pMVDHalContext->stMiuCfg.u8FWMiuSel));
4429 }
4430
4431 if (pstMemCfg->bEnableDynScale)
4432 {
4433 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,GET_DS_BUFFADD(u8Idx),pinfo->u32DynScalingAddr);
4434
4435 MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
4436 pinfo->u8DynScalingDepth= pCtrlCfg->u8DynScalingDepth;
4437 pinfo->u32DynScalingBufSize= gvolInfo.DSbufsize;
4438 }
4439 else
4440 {
4441 pinfo->u32DynScalingAddr= NULL;
4442 pinfo->u8DynScalingDepth= 0;
4443 pinfo->u32DynScalingBufSize= 0;
4444 }
4445
4446 return;
4447 }
4448
MVD_RstFrmInfo(MS_U8 u8Idx,MVD_FrmInfoType eType)4449 E_MVD_Result MVD_RstFrmInfo(MS_U8 u8Idx, MVD_FrmInfoType eType)
4450 {
4451 E_MVD_Result eRet = E_MVD_RET_OK;
4452 MS_VIRT u32DecFrmInfoAdd = GET_DECFRMINFO_BUFFADD(u8Idx);
4453 if (NULL == u32DecFrmInfoAdd)
4454 {
4455 return E_MVD_RET_FAIL;
4456 }
4457
4458 //printf("%s u32DecFrmInfoAdd = 0x%x\n", __FUNCTION__, u32DecFrmInfoAdd);
4459 if (E_MVD_FRMINFO_DECODE == eType)
4460 {
4461 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_LUMAADDR), _INIT_ADDR);
4462 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_CHROMAADDR), _INIT_ADDR);
4463 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_TIMESTAMP), _INIT_TIMESTAMP);
4464 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_ID_L), _INIT_ID);
4465 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_ID_H), _INIT_ID);
4466 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_PITCH), _INIT_LEN);
4467 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_WIDTH), _INIT_LEN);
4468 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_HEIGHT), _INIT_LEN);
4469 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_FRAMETYPE), 0xff);
4470 }
4471 else if (E_MVD_FRMINFO_DISPLAY == eType)
4472 {
4473 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_LUMAADDR), _INIT_ADDR);
4474 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_CHROMAADDR), _INIT_ADDR);
4475 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_TIMESTAMP), _INIT_TIMESTAMP);
4476 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_ID_L), _INIT_ID);
4477 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_ID_H), _INIT_ID);
4478 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_PITCH), _INIT_LEN);
4479 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_WIDTH), _INIT_LEN);
4480 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_HEIGHT), _INIT_LEN);
4481 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_FRAMETYPE), 0xff);
4482 }
4483 else
4484 {
4485 eRet = E_MVD_RET_INVALID_PARAM;
4486 }
4487
4488 return eRet;
4489 }
4490
4491 //Given the start address & the available size for the FW buffers,
4492 //Calculate the start address of each buffers.
MVD_GetFWBuffAdd(MS_VIRT u32Start,MS_U32 u32AvailLen,MVD_FWBuff * pBuff)4493 static MS_BOOL MVD_GetFWBuffAdd(MS_VIRT u32Start, MS_U32 u32AvailLen, MVD_FWBuff* pBuff)
4494 {
4495 MS_VIRT tmpAdr = u32Start;
4496
4497 if(pBuff == NULL)
4498 {
4499 MVD_DEBUGERROR(printf("%s err: NULL pBuff\n", __FUNCTION__));
4500 return FALSE;
4501 }
4502 tmpAdr += MVD_FW_CODE_LEN;
4503 GET_FW_BUFFADD_ALIGN(tmpAdr, FW_BUFF_ALIGN, MVD3_FW_VOL_INFO_BUF_LEN, pBuff->pu8MVDGetVolBufStart);
4504 GET_FW_BUFFADD_ALIGN(tmpAdr, FW_BUFF_ALIGN, MVD3_FW_FRAME_INFO_BUF_LEN, pBuff->pu8MVDGetFrameInfoBufStart);
4505 GET_FW_BUFFADD_ALIGN(tmpAdr, FW_BUFF_ALIGN, MVD3_FW_DIVX_INFO_BUF_LEN, pBuff->pu8MVDSetHeaderBufStart);
4506 GET_FW_BUFFADD_ALIGN(tmpAdr, FW_BUFF_ALIGN,
4507 (MVD3_FW_USER_DATA_BUF_LEN+MVD3_FW_USER_DATA_BUF_BACKUP_LEN), pBuff->u32UserDataBuf);
4508 //MVD3_FW_USER_DATA_BUF_BACKUP_LEN is used as CC decoding buffer for MVD_SUPPORT_X4_CC
4509
4510 GET_FW_BUFFADD_ALIGN(tmpAdr, FW_BUFF_ALIGN, MVD3_FW_SLQ_TAB_TMPBUF_LEN, pBuff->u32MVDFWSLQTABTmpbufAdr);
4511 GET_FW_BUFFADD(tmpAdr, MVD_FW_SLQTBL_PTS_BUF_LEN, pBuff->u32MVDFWPtsTblAddr);
4512 GET_FW_BUFFADD(tmpAdr, MVD_FW_DYN_SCALE_BUF_LEN, pBuff->u32DynScalingAdd);
4513 GET_FW_BUFFADD(tmpAdr, MVD_FW_SCALER_INFO_BUF_LEN, pBuff->u32ScalerInfoAdd);
4514 GET_FW_BUFFADD(tmpAdr, MVD_FW_DECFRM_INFO_BUF_LEN, pBuff->u32DecFrmInfoAdd);
4515 GET_FW_BUFFADD(tmpAdr, MVD_FW_VBBU_TABLE_LEN, pBuff->u32VBBUTableAdd);
4516
4517
4518 MVD_DEBUGINFO(printf("set pu8MVDGetVolBufStart=%lx\n", (unsigned long)pBuff->pu8MVDGetVolBufStart));
4519 MVD_DEBUGINFO(printf("set pu8MVDGetFrameInfoBufStart=%lx\n", (unsigned long)pBuff->pu8MVDGetFrameInfoBufStart));
4520 MVD_DEBUGINFO(printf("set pu8MVDSetHeaderBufStart=%lx\n", (unsigned long)pBuff->pu8MVDSetHeaderBufStart));
4521 MVD_DEBUGINFO(printf("u32UserDataBuf start=%lx\n", (unsigned long)pBuff->u32UserDataBuf));
4522 MVD_DEBUGINFO(printf("u32MVDFWSLQTABTmpbufAdr start=%lx\n", (unsigned long)pBuff->u32MVDFWSLQTABTmpbufAdr));
4523 MVD_DEBUGINFO(printf("PtsTblAddr start=%lx\n", (unsigned long)pBuff->u32MVDFWPtsTblAddr));
4524 MVD_DEBUGINFO(printf("u32DynScalingAdd start=%lx\n", (unsigned long)pBuff->u32DynScalingAdd));
4525 MVD_DEBUGINFO(printf("ScalerInfo start=%lx end=%lx\n",
4526 (unsigned long)pBuff->u32ScalerInfoAdd, (pBuff->u32ScalerInfoAdd+MVD_FW_SCALER_INFO_BUF_LEN)));
4527 MVD_DEBUGINFO(printf("DecFrmInfo start=%lx end=%lx\n",
4528 (unsigned long)pBuff->u32DecFrmInfoAdd, (pBuff->u32DecFrmInfoAdd+MVD_FW_DECFRM_INFO_BUF_LEN)));
4529
4530 MS_U32 u32ShMemBoundary = (MVD_FW_CODE_LEN==MVD_FW_CODE_LEN_V00) ? MVD_FW_MPOOL_START_OFFSET : MVD_FW_TASK_OFFSET;
4531 #if v3_temp
4532
4533 if ((pBuff->u32VBBUTableAdd+MVD_FW_VBBU_TABLE_LEN-u32Start) > u32ShMemBoundary)
4534 {
4535 //shared memory should not overlap with FW memory pool.
4536 MVD_DEBUGERROR(printf("%s err: 0x%lx out of memory boundary!\n", __FUNCTION__,
4537 (pBuff->u32VBBUTableAdd+MVD_FW_VBBU_TABLE_LEN-u32Start)));
4538 return FALSE;
4539 }
4540 #else
4541 if ((pBuff->u32DecFrmInfoAdd+MVD_FW_DECFRM_INFO_BUF_LEN-u32Start) > u32ShMemBoundary)
4542 {
4543 //shared memory should not overlap with FW memory pool.
4544 MVD_DEBUGERROR(printf("%s err: 0x%x out of memory boundary!\n", __FUNCTION__,
4545 (pBuff->u32DecFrmInfoAdd+MVD_FW_DECFRM_INFO_BUF_LEN-u32Start)));
4546 return FALSE;
4547 }
4548 #endif
4549
4550 return TRUE;
4551 }
4552
4553 //Set buffer address to f/w
4554 //Init the memory erea if necessary
MVD_SetFWBuffAdd(MS_U8 u8Idx,MVD_FWBuff * pBuff)4555 static MS_BOOL MVD_SetFWBuffAdd(MS_U8 u8Idx, MVD_FWBuff* pBuff)
4556 {
4557 MS_U32 i;
4558 MVD_SrcMode curSrcMode = E_MVD_SRC_UNKNOWN;
4559 MVD_MEMCfg* pstMemCfg = NULL;
4560 MVD_CtrlCfg* pCtrlCfg = NULL;
4561
4562 if(pBuff == NULL)
4563 {
4564 MVD_DEBUGERROR(printf("%s err: NULL pBuff\n", __FUNCTION__));
4565 return FALSE;
4566 }
4567
4568 pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
4569
4570 MVD_DEBUGINFO(printf("\nMIU is (shm,hw,fw)=(%x,%x,%x)\n",u8SHMMiuSel,pstMemCfg->u8HWMiuSel,pstMemCfg->u8FWMiuSel));
4571
4572 curSrcMode = HAL_MVD_GetSrcMode(u8Idx);
4573
4574 HAL_MVD_SetVolInfoBufferAddr(u8Idx, pBuff->pu8MVDGetVolBufStart);
4575 _MVD_Memset(pBuff->pu8MVDGetVolBufStart, 0, MVD3_FW_VOL_INFO_BUF_LEN);
4576
4577 pBuff->u32VolAdd = pBuff->pu8MVDGetVolBufStart;
4578
4579 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,pBuff->u32VolAdd,pBuff->u32VolAdd);
4580
4581 pBuff->u32VolAdd = HAL_MVD_PA2NonCacheSeg(pBuff->u32VolAdd);
4582 MVD_DEBUGINFO(printf("gvolInfo = 0x%lx, volBuf=0x%lx\n", (unsigned long)pBuff->u32VolAdd, (unsigned long)pBuff->pu8MVDGetVolBufStart));
4583
4584 HAL_MVD_SetFrameInfoBufferAddr(u8Idx, pBuff->pu8MVDGetFrameInfoBufStart);
4585 _MVD_Memset(pBuff->pu8MVDGetFrameInfoBufStart, 0, MVD3_FW_FRAME_INFO_BUF_LEN);
4586
4587 HAL_MVD_SetHeaderBufferAddr(u8Idx, pBuff->pu8MVDSetHeaderBufStart);
4588 HAL_MVD_SetUserDataBuf(u8Idx, pBuff->u32UserDataBuf, MVD3_FW_USER_DATA_BUF_LEN);
4589 pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
4590 pCtrlCfg->u32UsrDataRd = pBuff->u32UserDataBuf;
4591
4592
4593 if((curSrcMode != E_MVD_TS_FILE_MODE)
4594 && (curSrcMode != E_MVD_TS_MODE))
4595 {
4596 _MVD_Memset(pBuff->u32MVDFWSLQTABTmpbufAdr, 0, MVD3_FW_SLQ_TAB_TMPBUF_LEN);
4597 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWSLQTABTmpbufAdr, 0xBE010000UL);
4598 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWSLQTABTmpbufAdr+4, 0x000000FAUL);
4599
4600 HAL_MVD_SetPtsTblAddr(u8Idx, pBuff->u32MVDFWPtsTblAddr);
4601 for (i=0; i<MVD_FW_SLQTBL_PTS_BUF_LEN; i+=MVD_FW_SLQTBL_PTS_LEN)
4602 {
4603 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i, 0); //byteCnt
4604 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i+4, 0); //dummyPktCnt
4605 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i+8, 0); //idLow
4606 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i+12, 0); //idHigh
4607
4608 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i+16, MVD_NULLPKT_PTS); //PTS
4609 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i+20, 0); //reserved0
4610 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i+24, 0); //reserved1
4611 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i+28, 0); //reserved2
4612 }
4613 //MS_ASSERT((u32MVDFWPtsTblAddr+MVD_FW_SLQTBL_PTS_BUF_LEN)<=(u32start+u32len));
4614 MVD_DEBUGINFO(printf("PTS tbl start=%lx end=%lx\n",
4615 (unsigned long)pBuff->u32MVDFWPtsTblAddr, (unsigned long)(pBuff->u32MVDFWPtsTblAddr+MVD_FW_SLQTBL_PTS_BUF_LEN)));
4616
4617 pBuff->u32VBBUTableAdd = VBBU_TABLE_START+u8Idx*0x100000;
4618 }
4619
4620 if (pstMemCfg->bEnableDynScale)
4621 {
4622 HAL_MVD_SetDynamicScaleAddr(u8Idx, pBuff->u32DynScalingAdd);
4623 HAL_MVD_EnableDynamicScale(u8Idx,0); //default old DS style
4624 pCtrlCfg->u8DynScalingDepth = 32; //HAL_MVD_GetDynamicScaleDepth
4625 MVD_DEBUGINFO(printf("u8EnableMIUSel = 0x%x\n", pMVDHalContext->stMiuCfg.u8FWMiuSel));
4626 MVD_DEBUGINFO(printf("u32DynScalingAddr= 0x%lx\n", (unsigned long)pBuff->u32DynScalingAdd));
4627 MVD_DEBUGINFO(printf("u8DynScalingDepth= 0x%x\n", pCtrlCfg->u8DynScalingDepth));
4628 }
4629 MVD_DEBUGINFO(printf("DynScaling start=%lx end=%lx\n",
4630 (unsigned long)pBuff->u32DynScalingAdd, (unsigned long)(pBuff->u32DynScalingAdd+MVD_FW_DYN_SCALE_BUF_LEN)));
4631
4632 HAL_MVD_SetDecFrmInfoAddr(u8Idx, pBuff->u32DecFrmInfoAdd);
4633
4634 MVD_RstFrmInfo(u8Idx, E_MVD_FRMINFO_DECODE);
4635 MVD_RstFrmInfo(u8Idx, E_MVD_FRMINFO_DISPLAY);
4636 MVD_DEBUGINFO(printf("DecFrmInfo start=%lx\n", (unsigned long)pBuff->u32DecFrmInfoAdd));
4637
4638 if (curSrcMode == E_MVD_SLQ_TBL_MODE)
4639 {
4640 HAL_MVD_SLQTblInit(u8Idx);
4641 }
4642
4643 return TRUE;
4644 }
4645
4646 #ifdef VDEC3
4647 #else
MVD_IsNextDispFrmRdy(MS_U8 u8Idx)4648 static MS_BOOL MVD_IsNextDispFrmRdy(MS_U8 u8Idx)
4649 {
4650 #define NXT_DISP_TIMEOUT 20000//0x20
4651 MS_U32 u32TimeOut = 0;
4652 MVD_CmdArg mvdcmd;
4653
4654 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_GET_NXTDISPFRM);
4655 SETUP_CMDARG(mvdcmd);
4656 SET_DECNUM(mvdcmd, u8Idx);
4657 SET_CMD_RET_FALSE(CMD_GET_NEXTDISPFRM, &mvdcmd);
4658
4659 while(!HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_GET_NXTDISPFRM) && (u32TimeOut < NXT_DISP_TIMEOUT))
4660 {
4661 u32TimeOut++;
4662 }
4663 if(u32TimeOut >= NXT_DISP_TIMEOUT)
4664 {
4665 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail!!\r\n", CMD_GET_NEXTDISPFRM ) );
4666 return FALSE;
4667 }
4668 return TRUE;
4669 }
4670 #endif
4671
HAL_MVD_GetExtDispInfo(MS_U8 u8Idx,MVD_ExtDispInfo * pInfo)4672 void HAL_MVD_GetExtDispInfo(MS_U8 u8Idx, MVD_ExtDispInfo* pInfo)
4673 {
4674 pInfo->u16VSize = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DISP_V_SIZE, sizeof(MS_U16));
4675 pInfo->u16HSize = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DISP_H_SIZE, sizeof(MS_U16));
4676 pInfo->u16VOffset = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CENTRE_V_OFFSET, sizeof(MS_U16));
4677 pInfo->u16HOffset = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CENTRE_H_OFFSET, sizeof(MS_U16));
4678 }
4679
HAL_MVD_GetFrmInfo(MS_U8 u8Idx,MVD_FrmInfoType eType,MVD_FrmInfo * pInfo)4680 E_MVD_Result HAL_MVD_GetFrmInfo(MS_U8 u8Idx, MVD_FrmInfoType eType, MVD_FrmInfo* pInfo)
4681 {
4682 MS_U32 u32Id = MVD_GetStreamId(u8Idx);
4683 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
4684 E_MVD_Result eRet = E_MVD_RET_OK;
4685 MS_VIRT u32DecFrmInfoAdd = GET_DECFRMINFO_BUFFADD(u8Idx);
4686 #if v3_temp
4687 MVD_MEMCfg* pstMemCfg = NULL;
4688 pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
4689 #endif
4690 if (NULL == pInfo)
4691 {
4692 MVD_DEBUGERROR(printf("GetFrmInfo NULL pInfo!\n"));
4693 return E_MVD_RET_INVALID_PARAM;
4694 }
4695 if (NULL == u32DecFrmInfoAdd)
4696 {
4697 MVD_DEBUGERROR(printf("GetFrmInfo NULL u32DecFrmInfoAdd!\n"));
4698 return E_MVD_RET_FAIL;
4699 }
4700 //printf("%s u32DecFrmInfoAdd = 0x%x\n", __FUNCTION__, u32DecFrmInfoAdd);
4701
4702 if (E_MVD_FRMINFO_DECODE == eType)
4703 {
4704 pInfo->u32LumaAddr = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_LUMAADDR);
4705 pInfo->u32ChromaAddr= HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_CHROMAADDR);
4706 pInfo->u32TimeStamp = _90K_TO_MS(HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_TIMESTAMP));
4707 pInfo->u32ID_L = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_ID_L);
4708 pInfo->u32ID_H = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_ID_H);
4709 pInfo->u16Pitch = HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_PITCH);
4710 pInfo->u16Width = HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_WIDTH);
4711 pInfo->u16Height= HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_HEIGHT);
4712 pInfo->eFrmType = (MVD_PicType)HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_FRAMETYPE);
4713 }
4714 else if (E_MVD_FRMINFO_DISPLAY == eType)
4715 {
4716 pInfo->u32LumaAddr = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_LUMAADDR);
4717 pInfo->u32ChromaAddr= HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_CHROMAADDR);
4718 pInfo->u32TimeStamp = _90K_TO_MS(HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_TIMESTAMP));
4719 pInfo->u32ID_L = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_ID_L);
4720 pInfo->u32ID_H = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_ID_H);
4721 pInfo->u16Pitch = HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_PITCH);
4722 pInfo->u16Width = HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_WIDTH);
4723 pInfo->u16Height= HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_HEIGHT);
4724 pInfo->eFrmType = (MVD_PicType)HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_FRAMETYPE);
4725 }
4726
4727 else if (E_MVD_FRMINFO_NEXT_DISPLAY == eType)
4728 {
4729 #if v3_temp
4730 DISPQ_IN_DRAM* pTemp = (DISPQ_IN_DRAM*)(MS_PA2KSEG1(pstMemCfg->u32FWCodeAddr+DISP_QUEUE_START+ u8VPUIdx*0x100000));
4731 if (pTemp->dispQ_rd == pTemp->dispQ_wr)
4732 {
4733 MVD_DEBUGINFO(printf("NextDispFrm not ready!\n"));
4734 return E_MVD_RET_FAIL;
4735 }
4736 pInfo->u16FrmIdx = pTemp->disp_info[pTemp->dispQ_rd].u16NextDispFrameIdx;
4737
4738 pInfo->u32LumaAddr = pTemp->disp_info[pTemp->dispQ_rd].u32NextDispLumaAddr;
4739
4740 pInfo->u32ChromaAddr= pTemp->disp_info[pTemp->dispQ_rd].u32NextDispChromaAddr;
4741 // 64BIT_PTS = (TimeStamp | (ID_H<<32)) , unit: 90K
4742 pInfo->u32TimeStamp = pTemp->disp_info[pTemp->dispQ_rd].u32NextDispTimeStamp;
4743
4744 pInfo->u32ID_H = pTemp->disp_info[pTemp->dispQ_rd].u32NextDispID_H;
4745
4746 pInfo->u16Width = pTemp->disp_info[pTemp->dispQ_rd].u16NextDispWidth;
4747
4748 if(HAL_MVD_IsMcuMode(u8Idx))
4749 {
4750 //bit[19-20] Picture format,
4751 //bit[18-17] Disp times, 1~3
4752 //bit[16] Top field first , 0-> bottom first, 1-> top first
4753 //bit[15:8] Range reduction of luma data
4754 //bit[7:0] Range reduction of chroma data
4755 pInfo->u32ID_L = (MS_U32)pTemp->disp_info[pTemp->dispQ_rd].u8NextDispRangeRed_UV
4756 | (MS_U32)(pTemp->disp_info[pTemp->dispQ_rd].u8NextDispRangeRed_Y << 8)
4757 | (MS_U32)(pTemp->disp_info[pTemp->dispQ_rd].u16ExtData << 16)
4758 | (MS_U32)(pTemp->disp_info[pTemp->dispQ_rd].u8Progressive << 19);
4759
4760 if (pInfo->u16Width & MVD_WIDTH_ALIGN_MASK)
4761 {
4762 pInfo->u16Width = ((pInfo->u16Width >> MVD_WIDTH_ALIGN_BITS) + 1) << MVD_WIDTH_ALIGN_BITS;
4763 }
4764 }
4765 else
4766 {
4767 pInfo->u32ID_L = pTemp->disp_info[pTemp->dispQ_rd].u32DispID_L;
4768 }
4769 pInfo->u16Pitch = pTemp->disp_info[pTemp->dispQ_rd].u16NextDispPitch;
4770 pInfo->u16Height= pTemp->disp_info[pTemp->dispQ_rd].u16NextDispHeight;
4771 pInfo->eFrmType = pTemp->disp_info[pTemp->dispQ_rd].u16NextDispeFrameType;
4772
4773 pTemp->bUsedByOutside[pInfo->u16FrmIdx]++;
4774
4775 pTemp->dispQ_rd = (pTemp->dispQ_rd+1)%DISPQ_SIZE;
4776 MsOS_FlushMemory();
4777 #else
4778 if (!MVD_IsNextDispFrmRdy(u8Idx))
4779 {
4780 MVD_DEBUGINFO(printf("NextDispFrm not ready!\n"));
4781 return E_MVD_RET_FAIL;
4782 }
4783 pInfo->u16FrmIdx= HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_FRAMEIDX);
4784 if (pInfo->u16FrmIdx == 0xFFFF)
4785 {
4786 MVD_DEBUGINFO(printf("GetFrmInfo no available frame!\n"));
4787 return E_MVD_RET_FAIL;
4788 }
4789 pInfo->u32LumaAddr = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_LUMAADDR);
4790 pInfo->u32ChromaAddr= HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_CHROMAADDR);
4791 // 64BIT_PTS = (TimeStamp | (ID_H<<32)) , unit: 90K
4792 pInfo->u32TimeStamp = (HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_TIMESTAMP));
4793 pInfo->u32ID_H = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_ID_H);
4794 pInfo->u16Width = HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_WIDTH);
4795 if(HAL_MVD_IsMcuMode(u8Idx))
4796 {
4797 //bit[18-17] Disp times, 1~3
4798 //bit[16] Top field first , 0-> bottom first, 1-> top first
4799 //bit[15:8] Range reduction of luma data
4800 //bit[7:0] Range reduction of chroma data
4801 pInfo->u32ID_L = (MS_U32)HAL_MVD_MemReadByte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_RANGERED_UV)
4802 | (MS_U32)(HAL_MVD_MemReadByte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_RANGERED_Y) << 8)
4803 | (MS_U32)(HAL_MVD_MemReadByte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_EXT_DATA) << 16);
4804 if (pInfo->u16Width & MVD_WIDTH_ALIGN_MASK)
4805 {
4806 pInfo->u16Width = ((pInfo->u16Width >> MVD_WIDTH_ALIGN_BITS) + 1) << MVD_WIDTH_ALIGN_BITS;
4807 }
4808 }
4809 else
4810 {
4811 pInfo->u32ID_L = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_ID_L);
4812 }
4813 pInfo->u16Pitch = HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_PITCH);
4814 pInfo->u16Height= HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_HEIGHT);
4815 pInfo->eFrmType = (MVD_PicType)HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_FRAMETYPE);
4816 #endif
4817 #if 0
4818 printf("NxtFrm:: Idx=0x%x, ", pInfo->u16FrmIdx);
4819 printf("Type=0x%x, ", pInfo->eFrmType );
4820 printf("Luma=0x%x, ", pInfo->u32LumaAddr );
4821 printf("Chroma=0x%x, ", pInfo->u32ChromaAddr);
4822 printf("Pts=%lu, ", pInfo->u32TimeStamp );
4823 printf("ID_H=%lu, ", pInfo->u32ID_H );
4824 printf("ID_L=0x%x\n", pInfo->u32ID_L );
4825 #endif
4826 MVD_DBG_STS(printf("<<< drvMVD pts,idH = %lu, %lu\n", pInfo->u32TimeStamp, pInfo->u32ID_H));
4827 }
4828 else
4829 {
4830 eRet = E_MVD_RET_INVALID_PARAM;
4831 }
4832
4833 if ((pInfo->u32LumaAddr == _INIT_ADDR) || (pInfo->u32ChromaAddr== _INIT_ADDR) ||
4834 (pInfo->u16Pitch == _INIT_LEN) || (pInfo->u16Width == _INIT_LEN) ||
4835 (pInfo->u16Height== _INIT_LEN))
4836 {
4837 MVD_DEBUGINFO(printf("GetFrmInfo not ready!\n"));
4838 return E_MVD_RET_FAIL;
4839 }
4840
4841 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,(pInfo->u32LumaAddr * 8),pInfo->u32LumaAddr);
4842 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,(pInfo->u32ChromaAddr * 8),pInfo->u32ChromaAddr);
4843
4844 //printf("===> Luma=0x%x, Chroma=0x%x\n", pInfo->u32LumaAddr, pInfo->u32ChromaAddr);
4845 return eRet;
4846 }
4847
4848
4849
HAL_MVD_SetDynScalingParam(MS_U8 u8Idx,MS_PHY u32StAddr,MS_SIZE u32Size)4850 E_MVD_Result HAL_MVD_SetDynScalingParam(MS_U8 u8Idx, MS_PHY u32StAddr, MS_SIZE u32Size)
4851 {
4852 #define SCALER_INFO_TIMEOUT 0x1000
4853 MS_U32 u32TimeOut = 0;
4854 MS_VIRT u32SrcAdd = NULL;
4855 MS_U32 i;
4856 MS_VIRT u32ScalerInfoAdd = GET_XCINFO_BUFFADD(u8Idx);
4857 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
4858
4859 if ((u32StAddr==NULL) || (u32Size==0) || (u32Size>MVD_FW_SCALER_INFO_BUF_LEN))
4860 {
4861 MVD_DEBUGERROR(printf("%s invalid para u32StAddr=0x%lx, u32Size=0x%lx\n",
4862 __FUNCTION__, (unsigned long)u32StAddr, (unsigned long)u32Size));
4863 return E_MVD_RET_INVALID_PARAM;
4864 }
4865 if (TRUE != pstMemCfg->bEnableDynScale)
4866 {
4867 MVD_DEBUGERROR(printf("%s !bEnableDynScale\n", __FUNCTION__));
4868 return E_MVD_RET_FAIL;
4869 }
4870
4871 //copy data
4872 u32SrcAdd = HAL_MVD_PA2NonCacheSeg(u32StAddr);
4873 u32Size = ((u32Size+3)>>2)<<2;
4874 MVD_DEBUGINFO(printf("u32Size= 0x%lx, u32SrcAdd= 0x%lx\n", (unsigned long)u32Size, (unsigned long)u32SrcAdd));
4875 for (i=0; i<u32Size; i=i+4)
4876 {
4877 HAL_MVD_MemWrite4Byte(u32ScalerInfoAdd+i, *(volatile MS_U32*)(u32SrcAdd+i));
4878 MVD_DEBUGINFO(printf("0x%lx = 0x%x\n", (unsigned long)(u32ScalerInfoAdd+i), HAL_MVD_MemRead4Byte(u32ScalerInfoAdd+i)));
4879 }
4880
4881 //notify f/w
4882 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_SCALER_INFO);
4883 if (TRUE!=HAL_MVD_SetScalerInfoAddr(u8Idx, u32ScalerInfoAdd,((MS_U8*)u32SrcAdd)[0])) //Set the buffer address (MIU offset) to f/w
4884 {
4885 MVD_DEBUGERROR(printf("%s fail to set ScalerInfoAdd\n", __FUNCTION__));
4886 return E_MVD_RET_FAIL;
4887 }
4888
4889 //check f/w already handle the data
4890 while((TRUE!=HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_SCALER_INFO)) && (u32TimeOut < SCALER_INFO_TIMEOUT))
4891 {
4892 u32TimeOut++;
4893 }
4894 if(u32TimeOut >= SCALER_INFO_TIMEOUT)
4895 {
4896 MVD_DEBUGERROR(printf("%s timeout!!!\n", __FUNCTION__));
4897 return E_MVD_RET_FAIL;
4898 }
4899
4900 //clear ack bit
4901 HAL_MVD_ClearCmdFinished(u8Idx, MVD_HANDSHAKE_SCALER_INFO);
4902
4903 MVD_DEBUGINFO(printf("=====> %s u32TimeOut = 0x%x\n", __FUNCTION__, u32TimeOut));
4904 return E_MVD_RET_OK;
4905 }
4906
4907 //Map driver CodecType to firmware CodecType
MVD_MapCodecType(MVD_CodecType type)4908 static MS_U8 MVD_MapCodecType(MVD_CodecType type)
4909 {
4910 MS_U8 u8type = 0xff;
4911 switch (type)
4912 {
4913 case E_MVD_CODEC_MPEG2:
4914 u8type = CODEC_MPEG2;
4915 break;
4916 case E_MVD_CODEC_MPEG4:
4917 u8type = CODEC_MPEG4;
4918 break;
4919 case E_MVD_CODEC_MPEG4_SHORT_VIDEO_HEADER:
4920 u8type = CODEC_MPEG4_SHORT_VIDEO_HEADER;
4921 break;
4922 case E_MVD_CODEC_DIVX311:
4923 u8type = CODEC_DIVX311;
4924 break;
4925
4926 case E_MVD_CODEC_FLV:
4927 u8type = 0x03;
4928 break;
4929
4930 case E_MVD_CODEC_VC1_MAIN: //RCV
4931 u8type = 0x05;
4932 break;
4933
4934 case E_MVD_CODEC_VC1_ADV: //VC1
4935 u8type = 0x04;
4936 break;
4937
4938 default:
4939 break;
4940 }
4941
4942 return u8type;
4943 }
4944
4945 //Map driver SrcType to firmware SrcType
MVD_MapSrcMode(MVD_SrcMode mode)4946 static MS_U8 MVD_MapSrcMode(MVD_SrcMode mode)
4947 {
4948 MS_U8 u8mode = 0xff;
4949 switch (mode)
4950 {
4951 case E_MVD_TS_MODE:
4952 u8mode = STREAM_MODE;
4953 break;
4954 case E_MVD_FILE_MODE:
4955 u8mode = FILE_MODE;
4956 break;
4957 case E_MVD_SLQ_MODE:
4958 u8mode = SLQ_MODE;
4959 break;
4960 case E_MVD_SLQ_TBL_MODE:
4961 u8mode = SLQ_TBL_MODE;
4962 break;
4963 case E_MVD_TS_FILE_MODE:
4964 u8mode = TS_FILE_MODE;
4965 break;
4966
4967 default:
4968 break;
4969 }
4970
4971 return u8mode;
4972 }
4973
4974
MVD_CheckFrmBuffSizeMin(MVD_FWCfg * fwCfg,MVD_MEMCfg * memCfg)4975 static MS_BOOL MVD_CheckFrmBuffSizeMin(MVD_FWCfg* fwCfg, MVD_MEMCfg* memCfg)
4976 {
4977 MS_BOOL ret = TRUE;
4978
4979 if (_IS_VC1(fwCfg->eCodecType))
4980 {
4981 MVD_DEBUGERROR(printf("Framebuffer size(0x%lx) < (0x%x+0x%lx)!\n",
4982 (unsigned long)memCfg->u32FBSize, (MVD_HD_FBSIZE*MVD_FBNUM_MIN), MVD_HW_BUF_TOTAL_LEN));
4983 ret = FALSE;
4984 }
4985 else if (memCfg->u32FBSize < (MVD4_MPEG_FBSIZE_SDMIN+MVD_HW_BUF_TOTAL_LEN))
4986 {
4987 MVD_DEBUGERROR(printf("Framebuffer size(0x%lx) < (0x%x+0x%lx)\n",
4988 (unsigned long)memCfg->u32FBSize, MVD4_MPEG_FBSIZE_SDMIN, MVD_HW_BUF_TOTAL_LEN));
4989 ret = FALSE;
4990 }
4991 return ret;
4992 }
4993
MVD_GetUsedFrmBuffSize(MS_U8 u8FBMode,MS_U8 u8FBNum)4994 MS_U32 MVD_GetUsedFrmBuffSize(MS_U8 u8FBMode, MS_U8 u8FBNum)
4995 {
4996 MS_U32 u32Size = 0;
4997 if (MVD3_DHD_MODE == u8FBMode)
4998 {
4999 u32Size = MVD_DHD_FBSIZE;
5000 if (MVD_FBNUM_MAX == u8FBNum)
5001 {
5002 u32Size *= MVD_FBNUM_MAX;
5003 }
5004 else if (MVD_FBNUM_MIN == u8FBNum)
5005 {
5006 u32Size *= MVD_FBNUM_MIN;
5007 }
5008 }
5009 else if (MVD3_HD_MODE == u8FBMode)
5010 {
5011 u32Size = MVD_HD_FBSIZE;
5012 if (MVD_FBNUM_MAX == u8FBNum)
5013 {
5014 u32Size *= MVD_FBNUM_MAX;
5015 }
5016 else if (MVD_FBNUM_MIN == u8FBNum)
5017 {
5018 u32Size *= MVD_FBNUM_MIN;
5019 }
5020 }
5021 else if (MVD3_SD_MODE == u8FBMode)
5022 {
5023 u32Size = MVD4_MPEG_FBSIZE_SDMIN;
5024 }
5025 return u32Size;
5026 }
5027
5028 //------------------------------------------------------------------------------
5029 /// Determine u8FBMode & u8FBNum according to the assigned FBSize
5030 //------------------------------------------------------------------------------
HAL_MVD_CheckFrmBuffSize(MS_U8 u8Idx,MVD_FWCfg * fwCfg,MVD_MEMCfg * memCfg)5031 MS_BOOL HAL_MVD_CheckFrmBuffSize(MS_U8 u8Idx, MVD_FWCfg* fwCfg, MVD_MEMCfg* memCfg)
5032 {
5033 MS_BOOL ret = TRUE;
5034 MS_U8* pu8FBMode = &(fwCfg->u8FBMode);
5035 MS_U8* pu8FBNum = &(fwCfg->u8FBNum);
5036 MS_U32 u32AvailFrmBuffSize = memCfg->u32FBSize - MVD_HW_BUF_TOTAL_LEN;
5037
5038 ret = MDrv_MVD_AUTH_IPCheck(fwCfg->eCodecType,&(memCfg->bSupportSDModeOnly));
5039 if(ret == FALSE)
5040 {
5041 return FALSE;
5042 }
5043
5044 *pu8FBMode = 0xff;
5045
5046 #if defined(MVD_SUPPORT_SD_ONLY)
5047 *pu8FBMode = MVD3_SD_MODE;
5048 #else
5049 if(memCfg->bSupportSDModeOnly)
5050 {
5051 *pu8FBMode = MVD3_SD_MODE;
5052 }
5053 #endif //MVD_SUPPORT_SD_ONLY
5054
5055 //For SD only cases: defined(MVD_SUPPORT_SD_ONLY) and bSupportSDModeOnly
5056 if (MVD3_SD_MODE == *pu8FBMode)
5057 {
5058 ret = MVD_CheckFrmBuffSizeMin(fwCfg, memCfg);
5059
5060 //set frmBuffNum as 4
5061 *pu8FBNum = MVD_FBNUM_MIN;
5062 MVD_DEBUGINFO(printf("[MVD_SD_MODE] u8FBNum=%d, FBSize=0x%lx\n", *pu8FBNum, (unsigned long)memCfg->u32FBSize));
5063 goto _GET_USED_SIZE;
5064 }
5065
5066 if (u32AvailFrmBuffSize >= (MVD_DHD_FBSIZE*MVD_FBNUM_MAX))
5067 {
5068 MVD_DEBUGINFO(printf("%s(%d) DHD*5\n", __FUNCTION__, __LINE__));
5069 //Dual HD: (1920*2)*1088 or 1920*(1088*2)
5070 if (!_IS_VC1(fwCfg->eCodecType)) //mpeg2/4
5071 {
5072 *pu8FBMode = MVD3_DHD_MODE;
5073 }
5074 else
5075 {
5076 *pu8FBMode = MVD3_DHD_MODE_MIN;
5077 }
5078 *pu8FBNum = MVD_FBNUM_MAX;
5079 }
5080 else if (u32AvailFrmBuffSize >= (MVD_DHD_FBSIZE*MVD_FBNUM_MIN))
5081 {
5082 MVD_DEBUGINFO(printf("%s(%d) DHD*4\n", __FUNCTION__, __LINE__));
5083 //Dual HD: (1920*2)*1088 or 1920*(1088*2)
5084 if (!_IS_VC1(fwCfg->eCodecType)) //mpeg2/4
5085 {
5086 *pu8FBMode = MVD3_DHD_MODE;
5087 }
5088 else
5089 {
5090 *pu8FBMode = MVD3_DHD_MODE_MIN;
5091 }
5092 *pu8FBNum = MVD_FBNUM_MIN;
5093 }
5094 else if (u32AvailFrmBuffSize >= (MVD_HD_FBSIZE*MVD_FBNUM_MAX))
5095 {
5096 MVD_DEBUGINFO(printf("%s(%d) HD*5\n", __FUNCTION__, __LINE__));
5097 *pu8FBMode = MVD3_HD_MODE;
5098 *pu8FBNum = MVD_FBNUM_MAX;
5099 }
5100 else if (u32AvailFrmBuffSize >= (MVD_HD_FBSIZE*MVD_FBNUM_MIN))
5101 {
5102 MVD_DEBUGINFO(printf("%s(%d) HD*4\n", __FUNCTION__, __LINE__));
5103 *pu8FBMode = MVD3_HD_MODE;
5104 *pu8FBNum = MVD_FBNUM_MIN;
5105 }
5106 else
5107 {
5108 MVD_DEBUGINFO(printf("%s(%d) SD\n", __FUNCTION__, __LINE__));
5109 ret = MVD_CheckFrmBuffSizeMin(fwCfg, memCfg);
5110 if (TRUE == ret)
5111 {
5112 *pu8FBMode = MVD3_SD_MODE;
5113 *pu8FBNum = MVD_FBNUM_MIN;
5114 MVD_DEBUGINFO(printf("Framebuffer [SD] mode\n"));
5115 }
5116 }
5117
5118
5119 //Keep FBNum=4 for mpeg2/4, not-mstreamer/uniplayer/mcu mode.
5120 if (!_IS_VC1(fwCfg->eCodecType)) //mpeg2/4
5121 {
5122 if (*pu8FBNum != MVD_FBNUM_DEFAULT)
5123 {
5124 *pu8FBNum = MVD_FBNUM_DEFAULT;
5125 }
5126 }
5127
5128 _GET_USED_SIZE:
5129 fwCfg->u32FBUsedSize = u32AvailFrmBuffSize;
5130
5131 MVD_DEBUGINFO(printf("%s u8FBMode=0x%x, u8FBNum=%d, FBSize=0x%lx, used=0x%lx\n",
5132 __FUNCTION__, fwCfg->u8FBMode, fwCfg->u8FBNum, (unsigned long)memCfg->u32FBSize, (unsigned long)fwCfg->u32FBUsedSize));
5133 return ret;
5134 }
5135
HAL_MVD_SetCodecInfo(MS_U8 u8Idx,MVD_CodecType eCodecType,MVD_SrcMode eSrcMode,MS_U8 bDisablePESParsing)5136 MS_BOOL HAL_MVD_SetCodecInfo(MS_U8 u8Idx, MVD_CodecType eCodecType, MVD_SrcMode eSrcMode, MS_U8 bDisablePESParsing)
5137 {
5138 MVD_CmdArg stCmdArg;
5139 //printf("u8CodecType=0x%x\n", u8CodecType);
5140 //printf("eSrcMode=0x%x\n", eSrcMode);
5141 SETUP_CMDARG(stCmdArg);
5142 stCmdArg.Arg0 = MVD_MapCodecType(eCodecType);
5143 stCmdArg.Arg1 = MVD_MapSrcMode(eSrcMode);
5144 stCmdArg.Arg2 = bDisablePESParsing;
5145 //arg2 is only valid for STREAM_MODE and TS_FILE_MODE
5146 //set as 0 to enable MVD parser and parser interrupt
5147 stCmdArg.Arg3 = 0;
5148 MVD_DEBUGINFO(printf("MDrv_MVD_SetCodecInfo: Cmd: %x, Arg0: %x, Arg1: %x. Arg2: %x\n",
5149 CMD_CODEC_INFO, stCmdArg.Arg0, stCmdArg.Arg1, stCmdArg.Arg2));
5150 SET_DECNUM(stCmdArg, u8Idx);
5151 SET_CMD_RET_FALSE(CMD_CODEC_INFO, &stCmdArg);
5152
5153 HAL_MVD_SetSrcMode(u8Idx,eSrcMode);
5154
5155 //set code offset to MVD
5156 MS_VIRT u32Addr, u32Len;
5157 HAL_MVD_MemGetMap(u8Idx, E_MVD_MMAP_FW, &u32Addr, &u32Len);
5158
5159 if (u32Len==0) printf("%s err: u32Len=0!\n", __FUNCTION__);
5160 MS_U32 i=0;
5161 i = u32Addr >> 3;
5162 SET_CMDARG(stCmdArg, i, u8Idx);
5163 SET_CMD_RET_FALSE(CMD_CODE_OFFSET, &stCmdArg);
5164
5165 #define _mvdAssert(x) if(!x) printf("%s(%d) inconsistent cfg!\n", __FUNCTION__, __LINE__);
5166 MVD_FWCfg* pCurFwCfg = HAL_MVD_GetFWCfg(u8Idx);
5167 _mvdAssert(pCurFwCfg->eCodecType == eCodecType);
5168 _mvdAssert(pCurFwCfg->eSrcMode == eSrcMode);
5169 _mvdAssert(pCurFwCfg->bDisablePESParsing == bDisablePESParsing);
5170
5171 //Refer to msAPI_VDPlayer_DecodeMPEG4.c (core\kernel\api\videoplayer)
5172 if (eSrcMode == E_MVD_SLQ_TBL_MODE)
5173 {
5174 if ((eCodecType == E_MVD_CODEC_MPEG4) ||
5175 (eCodecType == E_MVD_CODEC_DIVX311) ||
5176 (eCodecType == E_MVD_CODEC_MPEG4_SHORT_VIDEO_HEADER))
5177 {
5178 // Enable PackMode
5179 SETUP_CMDARG(stCmdArg);
5180 stCmdArg.Arg0 = 3;
5181 SET_DECNUM(stCmdArg, u8Idx);
5182 if (HAL_MVD_MVDCommand( CMD_PARSE_M4V_PACKMD, &stCmdArg ) == FALSE)
5183 {
5184 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_PARSE_M4V_PACKMD ) );
5185 return FALSE;
5186 }
5187
5188 // Set DIU width of rounding mode (align to 8byte)
5189 SETUP_CMDARG(stCmdArg);
5190 stCmdArg.Arg0 = 1;
5191 SET_DECNUM(stCmdArg, u8Idx);
5192 if (HAL_MVD_MVDCommand(CMD_DIU_WIDTH_ALIGN, &stCmdArg) == FALSE)
5193 {
5194 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DIU_WIDTH_ALIGN ) );
5195 return FALSE;
5196 }
5197 }
5198 }
5199
5200 //set internal buffers after setting codecinfo for V3
5201 if (!HAL_MVD_SetInternalBuffAddr(u8Idx, u32Addr, u32Len))
5202 {
5203 MVD_DEBUGERROR(printf("MDrv_MVD_Init:_MVD_MVDSetInternalBuffAddr failed\n"));
5204 return FALSE;
5205 }
5206 else
5207 {
5208 MVD_DEBUGINFO(printf("MDrv_MVD_Init:_MVD_MVDSetInternalBuffAddr success\n"));
5209 }
5210
5211 return TRUE;
5212 }
5213
MVD_GetBDMAType(void)5214 BDMA_CpyType MVD_GetBDMAType(void)
5215 {
5216 BDMA_CpyType bdmaCpyType = E_BDMA_CPYTYPE_MAX;
5217
5218 if (pMVDHalContext->stMiuCfg.u8HWMiuSel == MIU_SEL_0)
5219 {
5220 if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_0)
5221 {
5222 bdmaCpyType = E_BDMA_SDRAM2SDRAM;
5223 }
5224 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_1)
5225 {
5226 bdmaCpyType = E_BDMA_SDRAM2SDRAM1;
5227 }
5228 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_2)
5229 {
5230 bdmaCpyType = E_BDMA_SDRAM2SDRAM2;
5231 }
5232 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_3)
5233 {
5234 bdmaCpyType = E_BDMA_SDRAM2SDRAM3;
5235 }
5236 else
5237 {
5238 MS_ASSERT(0);
5239 }
5240 }
5241 else if (pMVDHalContext->stMiuCfg.u8HWMiuSel == MIU_SEL_1)
5242 {
5243 if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_0)
5244 {
5245 bdmaCpyType = E_BDMA_SDRAM12SDRAM;
5246 }
5247 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_1)
5248 {
5249 bdmaCpyType = E_BDMA_SDRAM12SDRAM1;
5250 }
5251 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_2)
5252 {
5253 bdmaCpyType = E_BDMA_SDRAM12SDRAM2;
5254 }
5255 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_3)
5256 {
5257 bdmaCpyType = E_BDMA_SDRAM12SDRAM3;
5258 }
5259 else
5260 {
5261 MS_ASSERT(0);
5262 }
5263 }
5264 else if (pMVDHalContext->stMiuCfg.u8HWMiuSel == MIU_SEL_2)
5265 {
5266 if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_0)
5267 {
5268 bdmaCpyType = E_BDMA_SDRAM22SDRAM;
5269 }
5270 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_1)
5271 {
5272 bdmaCpyType = E_BDMA_SDRAM22SDRAM1;
5273 }
5274 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_2)
5275 {
5276 bdmaCpyType = E_BDMA_SDRAM22SDRAM2;
5277 }
5278 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_3)
5279 {
5280 bdmaCpyType = E_BDMA_SDRAM22SDRAM3;
5281 }
5282 else
5283 {
5284 MS_ASSERT(0);
5285 }
5286 }
5287 else if (pMVDHalContext->stMiuCfg.u8HWMiuSel == MIU_SEL_3)
5288 {
5289 if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_0)
5290 {
5291 bdmaCpyType = E_BDMA_SDRAM32SDRAM;
5292 }
5293 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_1)
5294 {
5295 bdmaCpyType = E_BDMA_SDRAM32SDRAM1;
5296 }
5297 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_2)
5298 {
5299 bdmaCpyType = E_BDMA_SDRAM32SDRAM2;
5300 }
5301 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_3)
5302 {
5303 bdmaCpyType = E_BDMA_SDRAM32SDRAM3;
5304 }
5305 else
5306 {
5307 MS_ASSERT(0);
5308 }
5309 }
5310 else
5311 {
5312 MS_ASSERT(0);
5313 }
5314
5315 return bdmaCpyType;
5316 }
5317
5318 //Init static variables.
5319 //Exception: stMemCfg & stMiuCfg since they are set before calling this function.
HAL_MVD_InitVar(MS_U8 u8Idx)5320 void HAL_MVD_InitVar(MS_U8 u8Idx)
5321 {
5322 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
5323 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
5324
5325 memset(pstCtrlCfg, 0, sizeof(MVD_CtrlCfg));
5326 pstCtrlCfg->eTrickMode = E_MVD_TRICK_DEC_ALL;
5327 pstCtrlCfg->eFrcMode = E_MVD_FRC_NORMAL;
5328 pstCtrlCfg->ePreSpeedType = E_MVD_SPEED_DEFAULT;
5329 pstCtrlCfg->eFileSyncMode = E_MVD_TIMESTAMP_FREERUN;
5330
5331 //determine if we need to BDMA SLQ table from DrvProcBuff to BitstreamBuff
5332 #ifndef MSOS_TYPE_LINUX_KERNEL//BDMA
5333 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
5334 pstCtrlCfg->bSlqTblSync = ((pstMemCfg->u32DrvBufAddr < pstMemCfg->u32BSAddr) ||
5335 ((pstMemCfg->u32DrvBufAddr+pstMemCfg->u32DrvBufSize) > (pstMemCfg->u32BSAddr+pstMemCfg->u32BSSize)));
5336 MVD_DEBUGINFO(printf("bSlqTblSync = %x\n", pstCtrlCfg->bSlqTblSync));
5337 if (pstCtrlCfg->bSlqTblSync)
5338 {
5339 const BDMA_Info* pBDMA;
5340 pBDMA = MDrv_BDMA_GetInfo();
5341 if ((pBDMA == NULL) || (pBDMA->bInit != TRUE))
5342 {
5343 if (E_BDMA_OK != MDrv_BDMA_Init(pstMemCfg->u32Miu1BaseAddr))
5344 {
5345 printf("%s fail at MDrv_BDMA_Init!!!\n", __FUNCTION__);
5346 }
5347 }
5348 pstSlqTblInfo->bdmaCpyType = MVD_GetBDMAType();
5349 }
5350 #else
5351 pstCtrlCfg->bSlqTblSync = 0;
5352 #endif
5353 memset(pstSlqTblInfo, 0, sizeof(MVD_SLQTBLInfo));
5354 pstSlqTblInfo->u32LastPts = MVD_NULLPKT_PTS;
5355 pstSlqTblInfo->u32PreEsRd = MVD_U32_MAX;
5356 pstSlqTblInfo->u32PreEsWr = 0;
5357 pstSlqTblInfo->pSlqStatus = &(pMVDHalContext->_SlqStatus[u8Idx]);
5358 pstSlqTblInfo->pDrvSlqTbl = &(pMVDHalContext->_drvSlqTbl[u8Idx]);
5359 pstSlqTblInfo->pDrvEsTbl = &(pMVDHalContext->_drvEsTbl[u8Idx]);
5360 pstSlqTblInfo->pDrvDivxTbl = &(pMVDHalContext->_drvDivxTbl[u8Idx]);
5361 #if SLQ_NEW_PUSH
5362 pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr = 0;
5363 pstSlqTblInfo->pSlqStatus->u32SlqPushLength = 0;
5364 pstSlqTblInfo->pSlqStatus->bSlqPicStart = FALSE;
5365 pstSlqTblInfo->pSlqStatus->bSlqPicCollect = FALSE;
5366 pstSlqTblInfo->pSlqStatus->bSlqPicWaitNextStart = FALSE;
5367 pstSlqTblInfo->pSlqStatus->bSlqEnLastFrameShow =FALSE;
5368 pstSlqTblInfo->pSlqStatus->bSlqFireRdy = FALSE;
5369 pstSlqTblInfo->pSlqStatus->bSlqCtrlBit =FALSE;
5370 #endif
5371 }
5372
5373 //------------------------------------------------------------------------------
5374 /// Issue Stop command.
5375 //------------------------------------------------------------------------------
HAL_MVD_Stop(MS_U8 u8Idx)5376 MS_BOOL HAL_MVD_Stop(MS_U8 u8Idx)
5377 {
5378 MVD_CmdArg mvdcmd;
5379 MS_BOOL bRet = TRUE;
5380
5381 #define STOP_TIMEOUT 500 //ms
5382 MS_U32 u32StartTime = 0;
5383 u32StartTime = HAL_MVD_GetTime();
5384
5385 SETUP_CMDARG(mvdcmd);
5386 SET_DECNUM(mvdcmd, u8Idx);
5387 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_STOP);
5388
5389 if (HAL_MVD_MVDCommand(CMD_STOP, &mvdcmd) == FALSE)
5390 {
5391 MVD_DEBUGERROR(printf("Command: 0x%x fail!!\r\n", CMD_STOP));
5392 HAL_MVD_Delayms(1);
5393 if ( HAL_MVD_TimeOut(u8Idx) == TRUE )
5394 {
5395 MVD_DEBUGERROR(printf("*** MVD ERR: STOP TIMEOUT!!! ***\n"));
5396 }
5397 }
5398
5399 while(!HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_STOP))
5400 {
5401 if ((HAL_MVD_GetTime()-u32StartTime)>STOP_TIMEOUT)
5402 {
5403 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail timeout!!\r\n", CMD_STOP ) );
5404 break;
5405 }
5406 }
5407
5408 pMVDHalContext->bStopped[u8Idx] = TRUE;
5409 return bRet;
5410 }
5411
HAL_MVD_DeinitHW(VPU_EX_SourceType SourceType,VPU_EX_DecoderType eDecType)5412 MS_BOOL HAL_MVD_DeinitHW(VPU_EX_SourceType SourceType, VPU_EX_DecoderType eDecType)
5413 {
5414 //MVD HW reset
5415 if (!HAL_MVD_RstHW())
5416 {
5417 MVD_DEBUGERROR(printf("MDrv_MVD_Exit:MVD4ResetHW failed\n"));
5418 }
5419 else
5420 {
5421 MVD_DEBUGINFO(printf("MDrv_MVD_Exit:MVD4ResetHW success\n"));
5422 }
5423 HAL_MVD_PowerCtrl(DISABLE);
5424 #ifdef CONFIG_MSTAR_CLKM
5425 if(eDecType == E_VPU_EX_DECODER_MVD)
5426 {
5427 HAL_VPU_EX_SetClkManagement(E_VPU_EX_CLKPORT_MVD_CORE, DISABLE);
5428 }
5429 if(SourceType == E_VPU_EX_INPUT_TSP)
5430 {
5431 HAL_VPU_EX_SetClkManagement(E_VPU_EX_CLKPORT_MVD_PAS, DISABLE);
5432 }
5433 #endif
5434
5435 #ifdef CONFIG_MSTAR_SRAMPD
5436 HAL_MVD_RegWriteBit(REG_CODEC_SRAM_SD_EN, DISABLE, SRAM_SD_EN_MVD);
5437 HAL_MVD_Delayms(1);
5438 #endif
5439 return TRUE;
5440 }
5441
HAL_MVD_Exit(MS_U8 u8Idx)5442 MS_BOOL HAL_MVD_Exit(MS_U8 u8Idx)
5443 {
5444 MVD_DEBUGINFO(printf("MDrv_MVD_Exit:start\n"));
5445
5446 HAL_MVD_SetIsUsed(u8Idx, FALSE);
5447 pMVDHalContext->bAutoInsertDummyPattern[u8Idx] = FALSE;
5448 pMVDHalContext->bDropOnePTS[u8Idx] = FALSE;
5449 pMVDHalContext->u32DmxFrameRate[u8Idx] = 0;
5450 pMVDHalContext->u32DmxFrameRateBase[u8Idx] = 0;
5451
5452 return TRUE;
5453 }
5454
5455
5456 //------------------------------------------------------------------------------
5457 /// Set DivX311 stream info.
5458 /// @param divxInfo \b IN : DivX311 stream info.
5459 //------------------------------------------------------------------------------
MVD_WriteDivx311Data(MS_U8 u8Idx,FW_DIVX_INFO * divxInfo)5460 static void MVD_WriteDivx311Data(MS_U8 u8Idx, FW_DIVX_INFO *divxInfo)
5461 {
5462 MS_VIRT pu8MVDSetHeaderBufStart = GET_HDR_BUFFADD(u8Idx);
5463 HAL_MVD_MemWrite4Byte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_VOL_HANDLE_DONE,divxInfo->vol_handle_done);
5464 HAL_MVD_MemWrite4Byte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_WIDTH,divxInfo->width);
5465 HAL_MVD_MemWrite4Byte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_HEIGHT,divxInfo->height);
5466 HAL_MVD_MemWrite4Byte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_FRAME_COUNT,divxInfo->frame_count);
5467 HAL_MVD_MemWrite4Byte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_FRAME_TIME,divxInfo->frame_time);
5468 HAL_MVD_MemWrite2Byte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_PTS_INCR,divxInfo->pts_incr);
5469 HAL_MVD_MemWrite4Byte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_FRAME_RATE,divxInfo->frame_rate);
5470 HAL_MVD_MemWriteByte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_ASPECT_RATIO,divxInfo->aspect_ratio);
5471 HAL_MVD_MemWriteByte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_PROGRESSIVE_SEQUENCE,divxInfo->progressive_sequence);
5472 HAL_MVD_MemWriteByte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_MPEG1,divxInfo->mpeg1);
5473 HAL_MVD_MemWriteByte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_PLAY_MODE,divxInfo->play_mode);
5474 HAL_MVD_MemWriteByte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_MPEG_FRC_MODE,divxInfo->mpeg_frc_mode);
5475 return;
5476 }
5477
HAL_MVD_SetFrameInfo(MS_U8 u8Idx,MVD_FrameInfo * pinfo)5478 void HAL_MVD_SetFrameInfo(MS_U8 u8Idx, MVD_FrameInfo *pinfo )
5479 {
5480 if (GET_HDR_BUFFADD(u8Idx)==0)
5481 {
5482 MVD_DEBUGERROR(printf("MDrv_MVD_SetFrameInfo error: pu8MVDSetHeaderBufStart=NULL\n"));
5483 return;
5484 }
5485
5486 FW_DIVX_INFO* pDivxInfo = &(pMVDHalContext->gdivxInfo[u8Idx]);
5487 pDivxInfo->width=pinfo->u16HorSize;
5488 pDivxInfo->height=pinfo->u16VerSize;
5489 pDivxInfo->aspect_ratio=pinfo->u8AspectRate;
5490 pDivxInfo->frame_rate = pinfo->u32FrameRate;
5491
5492 //for MM
5493 pDivxInfo->mpeg1=pinfo->u8MPEG1;
5494 pDivxInfo->pts_incr=pinfo->u16PTSInterval;
5495 pDivxInfo->play_mode=pinfo->u8PlayMode;
5496 pDivxInfo->mpeg_frc_mode=pinfo->u8FrcMode;
5497
5498 if(pinfo->u8Interlace==0)
5499 pDivxInfo->progressive_sequence=1;
5500 else
5501 pDivxInfo->progressive_sequence=0;
5502
5503 pDivxInfo->frame_count=0;
5504 pDivxInfo->frame_time=0;
5505 pDivxInfo->vol_handle_done=0;
5506 // pDivxInfo->invalidstream=0;
5507 MVD_DEBUGINFO(printf("set vol info,pts_incr=%d,\n",pDivxInfo->pts_incr));
5508 MVD_DEBUGINFO(printf("set vol info,width=%x,height=%x,frame_rate=%d,aspect_ratio=%x,\n",
5509 (unsigned int)pDivxInfo->width,(unsigned int)pDivxInfo->height,pDivxInfo->frame_rate,pDivxInfo->aspect_ratio));
5510 MVD_DEBUGINFO(printf("set vol info,progressive_sequence=%x,mpeg1=%x,play_mode=%x,\n",
5511 pDivxInfo->progressive_sequence,pDivxInfo->mpeg1,pDivxInfo->play_mode));
5512
5513 MVD_WriteDivx311Data(u8Idx, pDivxInfo);
5514 return;
5515 }
5516
5517
5518
5519 ///////////////////////////////////////////////////////////////////////////////
5520 /// Get Hardware Pointer of MVD CC Ring Buffer
5521 /// Return value:: The HW Pointer Address of MVD CC Ring Buffer
5522 /// @param u8CC608 \b IN
5523 /// - # TRUE for CC608 parser
5524 /// - # FALSE for CC708 parser
5525 ///////////////////////////////////////////////////////////////////////////////
HAL_CC_CM_GetMVDRB_HWAddr(MS_U8 u8CC608)5526 MS_VIRT HAL_CC_CM_GetMVDRB_HWAddr(MS_U8 u8CC608)
5527 {
5528 #if 1
5529 MVD_CmdArg mvdcmd;
5530 MS_VIRT u32CCWrPtr = 0;
5531
5532 SETUP_CMDARG(mvdcmd);
5533 mvdcmd.Arg3 = u8CC608;
5534 if (HAL_MVD_MVDCommand( CMD_RD_USER_WP, &mvdcmd ) == FALSE)
5535 {
5536 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_RD_USER_WP ) );
5537 return MVD_U32_MAX;
5538 }
5539 u32CCWrPtr = COMBU32(mvdcmd.Arg3, mvdcmd.Arg2, mvdcmd.Arg1, mvdcmd.Arg0) << 3;
5540 return u32CCWrPtr;
5541 #else
5542 MS_U32 u32MVDCC_Temp1 = 0;
5543 if (HAL_MVD_TimeOut(pstCmdArg->Arg5) == FALSE)
5544 {
5545 //HAL_MVD_ARGINIT();
5546 HAL_MVD_RegWriteByte(MVD_ARG5, 0);
5547 HAL_MVD_RegWriteByte(MVD_ARG4, 0);
5548 HAL_MVD_RegWriteByte(MVD_ARG3, (MS_U8)u8CC608);
5549 HAL_MVD_RegWriteByte(MVD_COMMAND, (MS_U8)(CMD_RD_USER_WP));//CMD_GET_CCBUF_HWADDR
5550
5551 if (HAL_MVD_TimeOut(pstCmdArg->Arg5) == FALSE)
5552 {
5553 u32MVDCC_Temp1 = 0;
5554 u32MVDCC_Temp1 = (((MS_U32)HAL_MVD_RegReadByte(MVD_ARG0)) & 0x000000FF);
5555 u32MVDCC_Temp1 += ((((MS_U32)HAL_MVD_RegReadByte(MVD_ARG1)) & 0x000000FF) << 8);
5556 u32MVDCC_Temp1 += ((((MS_U32)HAL_MVD_RegReadByte(MVD_ARG2)) & 0x000000FF) << 16);
5557 u32MVDCC_Temp1 = (u32MVDCC_Temp1 << 3);
5558 return (u32MVDCC_Temp1);
5559 }
5560 else
5561 {
5562 MVD_DEBUGINFO(printf("\nF:GHAV"));
5563 }
5564 }
5565 else
5566 {
5567 MVD_DEBUGINFO(printf("\nF:GHA"));
5568 }
5569
5570 return 0xffffffff;
5571 #endif
5572 }
5573
HAL_MVD_GetUsrDataIsAvailable(MS_U8 u8Idx)5574 MS_BOOL HAL_MVD_GetUsrDataIsAvailable(MS_U8 u8Idx)
5575 {
5576 volatile MVD_CtrlCfg* pCtrlCfg = (volatile MVD_CtrlCfg*)HAL_MVD_GetCtrlCfg(u8Idx);
5577 MS_VIRT u32UsrDataWr = 0;
5578 MS_BOOL bIsAvail = FALSE;
5579
5580 #if defined(MVD_SUPPORT_X4_CC)
5581 u32UsrDataWr = HAL_CC_CM_GetMVDRB_HWAddr(4)>>3;
5582 #else
5583 u32UsrDataWr = HAL_CC_CM_GetMVDRB_HWAddr(2)>>3;
5584 #endif
5585 bIsAvail = !(pCtrlCfg->u32UsrDataRd == u32UsrDataWr);
5586 MVD_DEBUGINFO(printf("IsAvail:%x rd=%lx wr=%lx\n", bIsAvail,
5587 (unsigned long)pCtrlCfg->u32UsrDataRd, (unsigned long)u32UsrDataWr));
5588 return bIsAvail;
5589 }
5590
5591 //------------------------------------------------------------------------------
5592 /// Get info of user data
5593 //------------------------------------------------------------------------------
HAL_MVD_GetUsrDataInfo(MS_U8 u8Idx,MVD_UsrDataInfo * pUsrInfo)5594 MS_BOOL HAL_MVD_GetUsrDataInfo(MS_U8 u8Idx, MVD_UsrDataInfo* pUsrInfo)
5595 {
5596 MS_VIRT u32UsrData = NULL;
5597 MS_VIRT u32UsrDataWr = 0;
5598 #if defined(MVD_SUPPORT_X4_CC)
5599 FW_USER_DATA_BUF_EXT stUsrDataExt;
5600 #else
5601 FW_USER_DATA_BUF stUsrDataInfo;
5602 #endif
5603 volatile MVD_CtrlCfg* pCtrlCfg = (volatile MVD_CtrlCfg*)HAL_MVD_GetCtrlCfg(u8Idx);
5604
5605 if ((!pUsrInfo) || (GET_FRMINFO_BUFFADD(u8Idx)==0))
5606 {
5607 MVD_DEBUGERROR(printf("%s: NULL ptr.\n", __FUNCTION__));
5608 return FALSE;
5609 }
5610
5611 //get write pointer
5612 #if defined(MVD_SUPPORT_X4_CC)
5613 u32UsrDataWr = HAL_CC_CM_GetMVDRB_HWAddr(4)>>3;
5614 #else
5615 u32UsrDataWr = HAL_CC_CM_GetMVDRB_HWAddr(2)>>3;
5616 #endif
5617 if (pCtrlCfg->u32UsrDataRd == (GET_USRDATA_BUFFADD(u8Idx)+MVD3_FW_USER_DATA_BUF_LEN))
5618 {
5619 pCtrlCfg->u32UsrDataRd = GET_USRDATA_BUFFADD(u8Idx); //wrap to BufStart
5620 }
5621 MVD_DEBUGINFO(printf("CC Rd=0x%lx Wr=0x%lx\n", (unsigned long)pCtrlCfg->u32UsrDataRd, (unsigned long)u32UsrDataWr));
5622
5623 if (pCtrlCfg->u32UsrDataRd == u32UsrDataWr)
5624 {
5625 MVD_DEBUGERROR(printf("%s: no data? Rd=0x%lx Wr=0x%lx\n", __FUNCTION__, (unsigned long)pCtrlCfg->u32UsrDataRd, (unsigned long)u32UsrDataWr));
5626 return FALSE;
5627 }
5628
5629 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,pCtrlCfg->u32UsrDataRd,u32UsrData);
5630
5631 u32UsrData = HAL_MVD_PA2NonCacheSeg(u32UsrData);
5632
5633 HAL_MVD_CPU_Sync();
5634 HAL_MVD_ReadMemory();
5635
5636 #if defined(MVD_SUPPORT_X4_CC)
5637 stUsrDataExt = *(volatile FW_USER_DATA_BUF_EXT*)u32UsrData;
5638
5639 pUsrInfo->u32Pts = stUsrDataExt.pts;
5640 pUsrInfo->u8PicStruct = stUsrDataExt.PicStruct;
5641 pUsrInfo->u8PicType = stUsrDataExt.picType;
5642 pUsrInfo->u8TopFieldFirst = stUsrDataExt.top_ff;
5643 pUsrInfo->u8RptFirstField = stUsrDataExt.rpt_ff;
5644 pUsrInfo->u16TmpRef = stUsrDataExt.tmpRef;
5645 pUsrInfo->u8ByteCnt = stUsrDataExt.userdatabytecnt;
5646 pUsrInfo->u32DataBuf = u32UsrData + MVD_FW_USER_DATA_EXT_HDR_LEN;
5647 #else
5648 stUsrDataInfo = *(volatile FW_USER_DATA_BUF*)u32UsrData;
5649
5650 pUsrInfo->u8PicType = stUsrDataInfo.picType;
5651 pUsrInfo->u8TopFieldFirst = stUsrDataInfo.top_ff;
5652 pUsrInfo->u8RptFirstField = stUsrDataInfo.rpt_ff;
5653 pUsrInfo->u16TmpRef = stUsrDataInfo.tmpRef;
5654 pUsrInfo->u8ByteCnt = stUsrDataInfo.userdatabytecnt;
5655 pUsrInfo->u32DataBuf = u32UsrData + MVD_FW_USER_DATA_HDR_LEN;
5656 #endif
5657 //update read pointer
5658 pCtrlCfg->u32UsrDataRd += MVD_FW_USER_DATA_PKT_LEN;
5659 #if 0
5660 printf("xxInfo: ");
5661 printf("%02d, ", pUsrInfo->u16TmpRef);
5662 printf("%d, ", pUsrInfo->u8PicStruct);
5663 printf("%d, ", pUsrInfo->u8TopFieldFirst);
5664 printf("0x%x, ", pUsrInfo->u32DataBuf);
5665 printf("%d, ", pUsrInfo->u8ByteCnt);
5666 printf("%ld, ", pUsrInfo->u32Pts);
5667 printf("%d\n", pUsrInfo->u8PicType);
5668 #endif
5669 return TRUE;
5670 }
5671
5672
HAL_MVD_Map2DrvSlqTbl(MS_U8 u8Idx,MS_VIRT u32HWPtr)5673 MS_VIRT HAL_MVD_Map2DrvSlqTbl(MS_U8 u8Idx, MS_VIRT u32HWPtr)
5674 {
5675 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
5676 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
5677 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
5678 MS_VIRT u32HWSt = HAL_MVD_GetMemOffset(pstMemCfg->u32BSAddr);
5679 MS_VIRT u32DrvPtr;
5680
5681 if ((u32HWPtr<u32HWSt) && (u32HWPtr!=0))
5682 {
5683 MVD_DEBUGERROR(printf("Invalid u32HWPtr=0x%lx\n", (unsigned long)u32HWPtr));
5684 return 0;
5685 }
5686 if ((pstCtrlCfg->bSlqTblSync) && (u32HWPtr!=0))
5687 {
5688 u32DrvPtr = pstSlqTblInfo->pDrvSlqTbl->u32StAdd + (u32HWPtr - u32HWSt);
5689 return u32DrvPtr;
5690 }
5691 return u32HWPtr;
5692 }
5693
5694
MVD_SLQTblGetFileEndPkt(MS_U8 u8Idx,MVD_PacketInfo * pFileEnd)5695 static void MVD_SLQTblGetFileEndPkt(MS_U8 u8Idx, MVD_PacketInfo* pFileEnd)
5696 {
5697 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
5698 MS_VIRT u32EndPattern = HAL_MVD_GetMemOffset(pstMemCfg->u32DrvBufAddr+SLQ_TBL_SIZE*3);
5699
5700 pFileEnd->u32StAddr = SLQ_TBL_SIZE*3;//u32EndPattern - HAL_MVD_GetMemOffset(pstMemCfg->u32DrvBufAddr);
5701 pFileEnd->u32Length = END_PATTERN_SIZE;
5702 pFileEnd->u32TimeStamp = MVD_NULLPKT_PTS;
5703 pFileEnd->u32ID_L = MVD_U32_MAX;
5704 pFileEnd->u32ID_H = MVD_U32_MAX;
5705 MVD_DEBUGINFO(printf("u32EndPattern(0x%lx)=0x%x 0x%x 0x%x 0x%x\n", (unsigned long)pFileEnd->u32StAddr,
5706 HAL_MVD_MemRead4Byte(u32EndPattern), HAL_MVD_MemRead4Byte(u32EndPattern+4),
5707 HAL_MVD_MemRead4Byte(u32EndPattern+8), HAL_MVD_MemRead4Byte(u32EndPattern+12)));
5708 }
5709
5710
MVD_SLQTblGetDummyPkt(MVD_PacketInfo * pDummy)5711 static void MVD_SLQTblGetDummyPkt(MVD_PacketInfo* pDummy)
5712 {
5713 //MS_U32 u32DummyES = HAL_MVD_GetMemOffset(pstMemCfg->u32DrvBufAddr+SLQ_TBL_SIZE*2);
5714
5715 pDummy->u32StAddr = SLQ_TBL_SIZE*2;//u32DummyES - HAL_MVD_GetMemOffset(pstMemCfg->u32DrvBufAddr);
5716 pDummy->u32Length = DUMMY_SIZE;
5717 pDummy->u32TimeStamp = MVD_NULLPKT_PTS;
5718 pDummy->u32ID_L = MVD_U32_MAX;
5719 pDummy->u32ID_H = MVD_U32_MAX;
5720 #if 0
5721 printf("u32DummyES(0x%x-->0x%x, size=0x%x)=0x%08lx 0x%08lx 0x%08lx 0x%08lx\n", u32DummyES,
5722 pDummy->u32StAddr, pDummy->u32Length, HAL_MVD_MemRead4Byte(u32DummyES),
5723 HAL_MVD_MemRead4Byte(u32DummyES+4),HAL_MVD_MemRead4Byte(u32DummyES+8),HAL_MVD_MemRead4Byte(u32DummyES+12));
5724 #endif
5725
5726 }
5727
5728
HAL_MVD_SLQTblInsertPattern(MS_U8 u8Idx,MVD_PatternType ePattern)5729 MS_BOOL HAL_MVD_SLQTblInsertPattern(MS_U8 u8Idx, MVD_PatternType ePattern)
5730 {
5731 MS_U32 i;
5732 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
5733
5734 if (pstSlqTblInfo->pDrvSlqTbl->u32Empty < SLQ_TBL_SAFERANGE)
5735 {
5736 MVD_DEBUGINFO(printf("SLQTbl full!(0x%lx) Cannot insert pattern any more!\n", (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32Empty));
5737 return FALSE;
5738 }
5739
5740 #if SLQ_NEW_PUSH
5741 if(pstSlqTblInfo->pSlqStatus->bSlqCtrlBit)
5742 {
5743 if(pstSlqTblInfo->pSlqStatus->bSlqPicWaitNextStart)
5744 {
5745 pstSlqTblInfo->pDrvSlqTbl->u32WrPtr = pstSlqTblInfo->pSlqStatus->u32VaildWptrAddr;
5746 }
5747 pstSlqTblInfo->pSlqStatus->bSlqCtrlBit = FALSE;
5748 }
5749 #endif // #if SLQ_NEW_PUSH
5750 for (i =0; i<2; i++)
5751 { //insert dummy pattern
5752 MVD_PacketInfo stDummyPkt;
5753
5754 if (E_MVD_PATTERN_FLUSH == ePattern)
5755 {
5756 MVD_SLQTblGetDummyPkt(&stDummyPkt);
5757 }
5758 else if (E_MVD_PATTERN_FILEEND == ePattern)
5759 {
5760 MVD_SLQTblGetFileEndPkt(u8Idx, &stDummyPkt);
5761 }
5762 else
5763 {
5764 MVD_DEBUGERROR(printf("Invalid MVD_PatternType! Won't insert pattern!\n"));
5765 return FALSE;
5766 }
5767 #if SLQ_NEW_PUSH
5768 pstSlqTblInfo->pSlqStatus->bSlqFireRdy = TRUE;
5769 #endif
5770 //printf("WrPtr 0x%x ", pstSlqTblInfo->pDrvSlqTbl->u32WrPtr);
5771 HAL_MVD_SLQTblSendPacket(u8Idx, &stDummyPkt);
5772 //printf("==> 0x%x\n", pstSlqTblInfo->pDrvSlqTbl->u32WrPtr);
5773 HAL_MVD_SetSLQWritePtr(u8Idx, FALSE);
5774 }
5775 return TRUE;
5776 }
5777
5778
5779 #define FLAG_LAST_FRM_SHOW (MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CMD_LAST_FRAME_SHOW, sizeof(MS_U32)))
HAL_MVD_IsDispFinish(MS_U8 u8Idx)5780 E_MVD_Result HAL_MVD_IsDispFinish(MS_U8 u8Idx)
5781 {
5782 MS_U32 u32TimeCnt;
5783 MVD_SrcMode curSrcMode = HAL_MVD_GetSrcMode(u8Idx);
5784 MS_U32 u32FeByteCnt = 0;
5785 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
5786 MS_VIRT u32FileEndPtr = pstSlqTblInfo->u32FileEndPtr;
5787 MS_U32 u32Id = MVD_GetStreamId(u8Idx);
5788 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
5789 #ifdef VDEC3
5790 MS_VIRT u32VBBUAddr = HAL_MVD_GetVBBUTableAddr(u8VPUIdx);
5791 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
5792 #endif
5793
5794 //printf("MDrv_MVD_IsDispFinish::");
5795 if (GET_FRMINFO_BUFFADD(u8Idx)==0)
5796 {
5797 MVD_DEBUGERROR(printf("%s err: pu8MVDGetFrameInfoBufStart=NULL\n", __FUNCTION__));
5798 return E_MVD_RET_FAIL;
5799 }
5800
5801 //printf("0x%x\n", FLAG_LAST_FRM_SHOW);
5802 if ((E_MVD_SLQ_TBL_MODE == curSrcMode) && (TRUE != FLAG_LAST_FRM_SHOW))
5803 {
5804 //insert pattern when each time checking IsDispFinish
5805 #ifdef VDEC3
5806 if(pstCtrlCfg->u8McuMode == TRUE)
5807 {
5808 u32TimeCnt= HAL_MVD_GetTime();
5809 while ((HAL_MVD_GetTime() - u32TimeCnt) < 20) // timeout 20 ms
5810 {
5811 if(HAL_VPU_EX_GetVBBUVacancy(u32VBBUAddr) > 0)
5812 {
5813 HAL_VPU_EX_PacketInfo stVpuPkt;
5814 MVD_PacketInfo stDummyPkt;
5815 MVD_SLQTblGetFileEndPkt(u8Idx,&stDummyPkt);
5816
5817 stVpuPkt.u32Offset = stDummyPkt.u32StAddr;
5818 stVpuPkt.u32Length = stDummyPkt.u32Length;
5819 stVpuPkt.u64TimeStamp = (MS_U64)stDummyPkt.u32TimeStamp;
5820 //If in display queue mode
5821 stVpuPkt.u64TimeStamp |= ((MS_U64)stDummyPkt.u32ID_H << 32);
5822 stVpuPkt.u32ID_H = stDummyPkt.u32ID_H;
5823 stVpuPkt.u32ID_L = stDummyPkt.u32ID_L;
5824
5825 HAL_VPU_EX_Push2VBBU(u32Id, &stVpuPkt,u32VBBUAddr);
5826 }
5827
5828 if (TRUE == FLAG_LAST_FRM_SHOW)
5829 {
5830 break;
5831 }
5832 }
5833
5834 if (TRUE != FLAG_LAST_FRM_SHOW)
5835 {
5836 MVD_DEBUGERROR(printf("MDrv_MVD_IsDispFinish TIMEOUT\n"));
5837 return E_MVD_RET_TIME_OUT;
5838 }
5839 else
5840 {
5841 return E_MVD_RET_OK;
5842 }
5843 }
5844 else
5845 #endif
5846 {
5847 //insert pattern when each time checking IsDispFinish
5848 if (HAL_MVD_SLQTblInsertPattern(u8Idx, E_MVD_PATTERN_FILEEND))
5849 {
5850 u32FeByteCnt += END_PATTERN_SIZE;
5851 }
5852
5853 if ((u32FileEndPtr == HAL_MVD_Map2DrvSlqTbl(u8Idx, HAL_MVD_GetSLQReadPtr(u8Idx))) &&
5854 (HAL_MVD_IsMcuMode(u8Idx) == FALSE) &&
5855 (HAL_MVD_IsMStreamerMode(u8Idx) == FALSE))
5856 {
5857 //insert padding pattern until timeout
5858 u32TimeCnt= HAL_MVD_GetTime();
5859 while ((HAL_MVD_GetTime() - u32TimeCnt) < CMD_TIMEOUT_MS)
5860 {
5861 if (TRUE == FLAG_LAST_FRM_SHOW)
5862 {
5863 //printf("\nDisp finished!\n");
5864 break;
5865 }
5866 //insert file-end pattern again
5867 if (HAL_MVD_SLQTblInsertPattern(u8Idx, E_MVD_PATTERN_FILEEND))
5868 {
5869 u32FeByteCnt += END_PATTERN_SIZE;
5870 }
5871 }
5872 if ((HAL_MVD_GetTime() - u32TimeCnt) >= CMD_TIMEOUT_MS)
5873 {
5874 MVD_DEBUGERROR(printf("\n***** MDrv_MVD_IsDispFinish TIMEOUT!!! *****\n\n"));
5875 if (E_MVD_CODEC_VC1_MAIN == HAL_MVD_GetCodecType(u8Idx))
5876 {
5877 if ((HAL_MVD_GetPayloadLen(u8Idx) > 0x200000)
5878 && (TRUE != HAL_MVD_GotFileEndPattern(u8Idx)))
5879 {
5880 MVD_DEBUGERROR(printf("RCV payloadLen(0x%x) invalid!\n",
5881 HAL_MVD_GetPayloadLen(u8Idx)));
5882 }
5883 }
5884 MVD_DEBUGERROR(printf("***** fe=%lx, rd=%lx(%lx,%lx), wr=%lx, empty=%lx, u32FeByteCnt=%x\n",
5885 (unsigned long)u32FileEndPtr, (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32RdPtr, (unsigned long)HAL_MVD_Map2DrvSlqTbl(u8Idx, HAL_MVD_GetSLQReadPtr(u8Idx)),
5886 (unsigned long)HAL_MVD_GetSLQReadPtr(u8Idx), (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32WrPtr, (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32Empty, u32FeByteCnt));
5887 return E_MVD_RET_TIME_OUT;
5888 }
5889 else
5890 {
5891 return E_MVD_RET_OK;
5892 }
5893 }
5894 else
5895 {
5896 //just return fail if readPtr is not closed to file-end ptr
5897 MVD_DEBUGINFO(printf("fe=%lx, rd=%lx(%lx), wr=%lx, empty=%lx\n", (unsigned long)u32FileEndPtr, (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32RdPtr,
5898 (unsigned long)HAL_MVD_Map2DrvSlqTbl(u8Idx, (unsigned long)HAL_MVD_GetSLQReadPtr(u8Idx)), (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32WrPtr, (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32Empty));
5899 return E_MVD_RET_FAIL;
5900 }
5901 }
5902 }
5903
5904 if (FLAG_LAST_FRM_SHOW)
5905 {
5906 return E_MVD_RET_OK;
5907 }
5908 else
5909 {
5910 return E_MVD_RET_FAIL;
5911 }
5912 }
5913
5914 //------------------------------------------------------------------------------
5915 /// Set MVD SLQ start & end address
5916 /// @param -u32start \b IN : start address
5917 /// @param -u32end \b IN : end address
5918 //------------------------------------------------------------------------------
HAL_MVD_SetSLQStartEnd(MS_U8 u8Idx,MS_U32 u32start,MS_U32 u32end)5919 static void HAL_MVD_SetSLQStartEnd(MS_U8 u8Idx, MS_U32 u32start, MS_U32 u32end)
5920 {
5921 MVD_CmdArg mvdcmd;
5922
5923 if ((u32start > SLQ_ADDR_LEN) || ((u32end+1) > SLQ_ADDR_LEN))
5924 {
5925 MVD_DEBUGERROR(printf("MDrv_MVD_SetSLQStartEnd: only support 27bit add!\n"));
5926 }
5927
5928 SET_CMDARG(mvdcmd, (u32end+1), u8Idx);
5929 if (HAL_MVD_MVDCommand( CMD_SLQ_END, &mvdcmd ) == FALSE)
5930 {
5931 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SLQ_END ) );
5932 return;
5933 }
5934
5935 SET_CMDARG(mvdcmd, u32start, u8Idx);
5936 if (HAL_MVD_MVDCommand( CMD_SLQ_START, &mvdcmd ) == FALSE)
5937 {
5938 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SLQ_START ) );
5939 return;
5940 }
5941
5942 return;
5943 }
5944
HAL_MVD_DecodeIFrame(MS_U8 u8Idx,MS_PHY u32FrameBufAddr,MS_PHY u32StreamBufAddr,MS_PHY u32StreamBufEndAddr)5945 MS_BOOL HAL_MVD_DecodeIFrame(MS_U8 u8Idx, MS_PHY u32FrameBufAddr, MS_PHY u32StreamBufAddr, MS_PHY u32StreamBufEndAddr )
5946 {
5947 MS_U32 u32deley = 0;
5948 MS_U32 u32time = 0;
5949 MVD_CmdArg mvdcmd;
5950 MS_VIRT u32MVDFWSLQTABTmpbufAdr = GET_SLQ_BUFFADD(u8Idx);
5951
5952 MVD_DEBUGINFO(printf("%s offset FBAdd=0x%lx streamStart=0x%lx streamEnd=0x%lx\n",
5953 __FUNCTION__, (unsigned long)u32FrameBufAddr, (unsigned long)u32StreamBufAddr, (unsigned long)u32StreamBufEndAddr));
5954
5955 HAL_MVD_SetCodecInfo(u8Idx, E_MVD_CODEC_MPEG2, E_MVD_SLQ_MODE, DISABLE_PARSER);
5956 HAL_MVD_SetFrameBuffAddr(u8Idx, u32FrameBufAddr, HAL_MVD_GetFBMode(u8Idx));
5957
5958 SETUP_CMDARG(mvdcmd);
5959 mvdcmd.Arg0 = 1;
5960 SET_DECNUM(mvdcmd, u8Idx);
5961 SET_CMD_RET_FALSE(CMD_DISPLAY_CTL, &mvdcmd);
5962
5963 if (HAL_MVD_StepDecode(u8Idx) == FALSE)
5964 {
5965 MVD_DEBUGERROR( printf( "HAL_MVD_StepDecode fail!!\r\n") );
5966 return FALSE;
5967 }
5968
5969 SETUP_CMDARG(mvdcmd);
5970 mvdcmd.Arg0 = 1;
5971 mvdcmd.Arg1 = 1;
5972 SET_DECNUM(mvdcmd, u8Idx);
5973 SET_CMD_RET_FALSE(CMD_FAST_SLOW, &mvdcmd);
5974
5975 //set data
5976 HAL_MVD_Delayms(2);
5977
5978 HAL_MVD_CPU_Sync();
5979 HAL_MVD_FlushMemory();
5980
5981 //wait vld init success or data may lost!
5982 #define WAIT_INIT_SUCCESS_TIME 100 //100ms
5983 u32deley = HAL_MVD_GetTime();
5984 while ((HAL_MVD_GetDecodeStatus(u8Idx)==DEC_STAT_IDLE) && (u32time<WAIT_INIT_SUCCESS_TIME))
5985 {
5986 u32time = HAL_MVD_GetTime()-u32deley;
5987 }
5988 if (u32time>=WAIT_INIT_SUCCESS_TIME)
5989 {
5990 MVD_DEBUGERROR(printf("%s: wait init_success timeout!!!\n", __FUNCTION__));
5991 }
5992 HAL_MVD_SetSLQStartEnd(u8Idx, u32StreamBufAddr, u32StreamBufEndAddr);
5993 MVD_DEBUGINFO(printf("set MVD3_FW_SLQ_TAB_TMPBUF_ADR=%lx\n",(unsigned long)u32MVDFWSLQTABTmpbufAdr));
5994
5995 HAL_MVD_CPU_Sync();
5996 HAL_MVD_FlushMemory();
5997 HAL_MVD_SetSLQStartEnd(u8Idx, u32MVDFWSLQTABTmpbufAdr, u32MVDFWSLQTABTmpbufAdr+MVD3_FW_SLQ_TAB_TMPBUF_LEN);
5998
5999 HAL_MVD_CPU_Sync();
6000 HAL_MVD_ReadMemory();
6001
6002 // wait decode complete
6003 #define WAIT_DECODE_DONE_TIME 33 //To decode 1 frame should take less than 33ms
6004 u32deley = HAL_MVD_GetTime();
6005 u32time = 0;
6006 while (HAL_MVD_GetPicCounter(u8Idx)<1 && (u32time<WAIT_DECODE_DONE_TIME))
6007 {
6008 u32time = HAL_MVD_GetTime()-u32deley;
6009 }
6010 if (u32time >= WAIT_DECODE_DONE_TIME)
6011 {
6012 MVD_DEBUGERROR(printf ("MDrv_MVD_DecodeIFrame time out(du=%d, st=%d, now=%d)\n", u32time, u32deley, HAL_MVD_GetTime()));
6013 MVD_DEBUGERROR(printf("frmCnt=%d state=0x%x lastCmd=0x%x\n", HAL_MVD_GetPicCounter(u8Idx), HAL_MVD_GetDecodeStatus(u8Idx), HAL_MVD_GetLastCmd(u8Idx)));
6014 return FALSE;
6015 }
6016 MVD_DEBUGINFO(printf ("MDrv_MVD_DecodeIFrame time (%d, %d)\n", u32time, u32deley));
6017 //printf("frmCnt=%ld state=0x%x lastCmd=0x%x\n", HAL_MVD_GetPicCounter(u8Idx), HAL_MVD_GetDecodeStatus(u8Idx), HAL_MVD_GetLastCmd(u8Idx));
6018
6019 MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
6020 pCtrlCfg->bDecodeIFrame = TRUE;
6021
6022 return TRUE;
6023 }
6024
6025
6026 //------------------------------------------------------------------------------
6027 /// Set bit stream buffer address to MVD
6028 /// @param -u32start \b IN : start address
6029 /// @param -u32end \b IN : end address
6030 //------------------------------------------------------------------------------
MVD_SetBitStreamAddr(MS_U8 u8Idx,MS_VIRT u32start,MS_VIRT u32end)6031 static void MVD_SetBitStreamAddr(MS_U8 u8Idx, MS_VIRT u32start, MS_VIRT u32end)
6032 {
6033 MVD_CmdArg mvdcmd;
6034 MS_ASSERT((u32start%8)==0);
6035 u32start >>= 3;
6036 SET_CMDARG(mvdcmd, u32start, u8Idx);
6037 if (HAL_MVD_MVDCommand( CMD_STREAM_BUF_START, &mvdcmd ) == FALSE)
6038 {
6039 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_STREAM_BUF_START ) );
6040 return;
6041 }
6042
6043 MS_ASSERT((u32end%8)==0);
6044 u32end >>= 3;
6045 SET_CMDARG(mvdcmd, u32end, u8Idx);
6046 if (HAL_MVD_MVDCommand( CMD_STREAM_BUF_END, &mvdcmd ) == FALSE)
6047 {
6048 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_STREAM_BUF_END ) );
6049 return;
6050 }
6051 return;
6052 }
6053
HAL_MVD_SetInternalBuffAddr(MS_U8 u8Idx,MS_VIRT u32start,MS_U32 u32len)6054 MS_BOOL HAL_MVD_SetInternalBuffAddr(MS_U8 u8Idx, MS_VIRT u32start, MS_U32 u32len)
6055 {
6056 MS_VIRT tmpAdr, tmpLen;
6057 MVD_FWCfg* pFwCfg = NULL;
6058 MVD_FWBuff* pBuff = &(pMVDHalContext->stFWBuff[u8Idx]);
6059 MVD_MEMCfg* pstMemCfg = NULL;
6060 MVD_SLQTBLInfo* pstSlqTblInfo = NULL;
6061 MS_U32 u32Id = MVD_GetStreamId(u8Idx);
6062 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
6063 MS_VIRT u32BuffStart = u32start+(MVD_FW_TASK_OFFSET*u8VPUIdx);
6064 MS_VIRT VPUSHMAddr = HAL_VPU_EX_GetSHMAddr();
6065 MS_VIRT u32StartOffset;
6066 MS_U8 u8MiuSel;
6067
6068 if(VPUSHMAddr != 0)
6069 {
6070 _phy_to_miu_offset(u8MiuSel, u32StartOffset, VPUSHMAddr);
6071
6072 u32StartOffset -= MVD_FW_CODE_LEN;
6073
6074 if(u8Idx == 0)
6075 {
6076 u32BuffStart = u32StartOffset; // for main decoder
6077 }
6078 else if(u8Idx == 1)
6079 {
6080 u32BuffStart = u32StartOffset + 0x20000; // VPUSHMAddr+128K bytes
6081 }
6082 }
6083
6084 MVD_DEBUGINFO(printf("MVD FW shared mem start = 0x%lx\n", (unsigned long)u32BuffStart));
6085 MVD_GetFWBuffAdd(u32BuffStart, u32len, pBuff);
6086 MVD_SetFWBuffAdd(u8Idx, pBuff);
6087
6088 tmpAdr = pBuff->u32DecFrmInfoAdd + MVD_FW_DECFRM_INFO_BUF_LEN;
6089
6090 HAL_MVD_MemGetMap(u8Idx, E_MVD_MMAP_FB, &tmpAdr, &tmpLen);
6091 MVD_DEBUGINFO(printf("set MVD_FRAMEBUFFER_ADR=%lx\n",(unsigned long)tmpAdr));
6092 HAL_MVD_SetFrameBuffAddr(u8Idx, tmpAdr, HAL_MVD_GetFBMode(u8Idx));
6093 pFwCfg = HAL_MVD_GetFWCfg(u8Idx);
6094 HAL_MVD_SetFrameBuffNum(u8Idx, pFwCfg->u8FBNum,pFwCfg->u32FBUsedSize);
6095
6096 // If VD_MHEG5(CPU) and MVD HW engine are run on different MIU,
6097 // IAP, DP, and MV buffers are allocated after FB.
6098 // The reason is that these 3 buffers are used by MVD HW engine.
6099 if(pMVDHalContext->bCMAUsed == FALSE)
6100 {
6101 tmpAdr += pFwCfg->u32FBUsedSize;
6102 pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
6103 if (pstMemCfg->u32FBSize < (pFwCfg->u32FBUsedSize + MVD_HW_BUF_TOTAL_LEN))
6104 {
6105 MVD_DEBUGERROR(printf("MVD HW buffers larger than FB size!!!\n"));
6106 }
6107 MVD_DEBUGINFO(printf("MVD FB boundary =0x%lx\n",(unsigned long)tmpAdr));
6108 tmpAdr = HAL_MVD_SetHWBuffer(u8Idx, tmpAdr);
6109 }
6110
6111 HAL_MVD_MemGetMap(u8Idx, E_MVD_MMAP_BS, &tmpAdr, &tmpLen);
6112 MVD_DEBUGINFO(printf("set MVD_BITSTREAM_ADR=%lx\n",(unsigned long)tmpAdr));
6113 MVD_SetBitStreamAddr(u8Idx, tmpAdr,tmpAdr+tmpLen);
6114 pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
6115 pstSlqTblInfo->u32ESBuffEnd = tmpAdr+tmpLen;
6116
6117 if((pFwCfg->stFBReduction.LumaFBReductionMode != E_MVD_FB_REDUCTION_NONE)
6118 || (pFwCfg->stFBReduction.ChromaFBReductionMode != E_MVD_FB_REDUCTION_NONE))
6119 {
6120 //for chips not support reduction mode, just ignore related config.
6121 MVD_DEBUGERROR(printf("MVD Err: Not support FB reduction mode!!\n"));
6122 }
6123
6124 return TRUE;
6125 }
6126
6127 //------------------------------------------------------------------------------
6128 /// Issue "Decode Pause" command.
6129 //------------------------------------------------------------------------------
HAL_MVD_DecodePause(MS_U8 u8Idx)6130 void HAL_MVD_DecodePause(MS_U8 u8Idx)
6131 {
6132 MVD_CmdArg mvdcmd;
6133 SETUP_CMDARG(mvdcmd);
6134 SET_DECNUM(mvdcmd, u8Idx);
6135 if (HAL_MVD_MVDCommand(CMD_PAUSE, &mvdcmd)== FALSE)
6136 {
6137 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_PAUSE) );
6138 return;
6139 }
6140
6141 return;
6142 }
6143
6144
6145 //------------- Below functions are for MediaCodec SLQ Table --------------------
6146 #if _SLQTBL_DUMP_PTS
_SLQTbl_DumpPtsTbl(MS_U8 u8Idx,MS_U32 u32EntryStart,MS_U32 u32EntryEnd)6147 static void _SLQTbl_DumpPtsTbl(MS_U8 u8Idx, MS_U32 u32EntryStart, MS_U32 u32EntryEnd)
6148 {
6149 MS_U32 i;
6150 MS_VIRT u32EsRp, u32EsStart, u32EsEnd;
6151 MS_VIRT u32MVDFWPtsTblAddr = GET_PTSTBL_BUFFADD(u8Idx);
6152
6153 for (i=u32EntryStart; i<u32EntryEnd; i++)
6154 {
6155 u32EsRp = pstSlqTblInfo->pDrvEsTbl->u32StAdd + i*8;
6156
6157 u32EsEnd = HAL_MVD_MemRead4Byte(u32EsRp+4);
6158 u32EsStart = HAL_MVD_MemRead4Byte(u32EsRp); //report StartAdd as read_pointer
6159 printf("ES[%x] Start=0x%x End=0x%x u32EsRp=%x\n",
6160 i, u32EsStart, u32EsEnd, u32EsRp);
6161 }
6162
6163 printf("\n=======Dump PTS table========\n");
6164 printf("addr\t byte_cnt\t dummy_cnt\t id_low\t id_high\t time_stamp\n");
6165 for (i=u32EntryStart; i<u32EntryEnd; i++)
6166 {
6167 printf("0x%x\t 0x%08lx\t 0x%08lx\t 0x%08lx\t 0x%08lx\t 0x%08lx\n", u32MVDFWPtsTblAddr+i*MVD_FW_SLQTBL_PTS_LEN,
6168 HAL_MVD_MemRead4Byte(u32MVDFWPtsTblAddr+i*MVD_FW_SLQTBL_PTS_LEN), //byteCnt
6169 HAL_MVD_MemRead4Byte(u32MVDFWPtsTblAddr+i*MVD_FW_SLQTBL_PTS_LEN+4), //dummyPktCnt
6170 HAL_MVD_MemRead4Byte(u32MVDFWPtsTblAddr+i*MVD_FW_SLQTBL_PTS_LEN+8), //idLow
6171 HAL_MVD_MemRead4Byte(u32MVDFWPtsTblAddr+i*MVD_FW_SLQTBL_PTS_LEN+12),//idHigh
6172 HAL_MVD_MemRead4Byte(u32MVDFWPtsTblAddr+i*MVD_FW_SLQTBL_PTS_LEN+16) //pts
6173 );
6174 }
6175 printf("=====================================\n");
6176 }
6177 #endif
6178
6179
6180 #if SLQ_NEW_PUSH
MVD_SLQTblGetHdrPkt(MS_U8 u8Idx,MVD_PacketInfo * pDivxHdr,MVD_PacketInfo * pDivxData)6181 void MVD_SLQTblGetHdrPkt(MS_U8 u8Idx, MVD_PacketInfo* pDivxHdr, MVD_PacketInfo* pDivxData)
6182 #else
6183 static void MVD_SLQTblGetDivxHdrPkt(MS_U8 u8Idx, MVD_PacketInfo* pDivxHdr, MVD_PacketInfo* pDivxData)
6184 #endif
6185 {
6186 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
6187 MS_VIRT u32DivXPattern = pstSlqTblInfo->pDrvDivxTbl->u32WrPtr;
6188 MS_U32 u32FrmSize = pDivxData->u32Length;
6189 MVD_CodecType curCodecType = HAL_MVD_GetCodecType(u8Idx);
6190 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
6191 #ifdef VDEC3
6192 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
6193 #endif
6194 #if SLQ_NEW_PUSH
6195 if(pstSlqTblInfo->pSlqStatus->bSlqCtrlBit && pstCtrlCfg->u8McuMode == FALSE)
6196 {
6197 if(pstSlqTblInfo->pSlqStatus->bSlqPicWaitNextStart && pstSlqTblInfo->pSlqStatus->bSlqPicStart)
6198 {
6199 //printf("Show KC the SlqPushLength = 0x%x\n",pstSlqTblInfo->pSlqStatus->u32SlqPushLength);
6200 if (E_MVD_CODEC_DIVX311 == curCodecType)
6201 {
6202 HAL_MVD_MemWrite4Byte(pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr +4, pstSlqTblInfo->pSlqStatus->u32SlqPushLength);
6203 HAL_MVD_MemWrite4Byte(pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr , DIVX_PATTERN);
6204 }
6205 else if(E_MVD_CODEC_VC1_MAIN == curCodecType)
6206 {//rcv
6207 HAL_MVD_MemWrite4Byte(pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr +4, RCV_PATTERN);
6208 HAL_MVD_MemWrite4Byte(pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr , pstSlqTblInfo->pSlqStatus->u32SlqPushLength);
6209 }
6210 else if (E_MVD_CODEC_VC1_ADV == curCodecType)
6211 {
6212 HAL_MVD_MemWrite4Byte(pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr , VC1_PATTERN);
6213 }
6214 pstSlqTblInfo->pSlqStatus->u32SlqPushLength = 0;
6215 pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr = 0;
6216 pstSlqTblInfo->pSlqStatus->bSlqFireRdy =TRUE;
6217 pstSlqTblInfo->pSlqStatus->u32VaildWptrAddr = pstSlqTblInfo->pDrvSlqTbl->u32WrPtr;// - 16;
6218 pstSlqTblInfo->pSlqStatus->bSlqPicWaitNextStart = FALSE;
6219 pstSlqTblInfo->pSlqStatus->bSlqPicCollect = FALSE;
6220 }
6221
6222 if(pstSlqTblInfo->pSlqStatus->bSlqPicStart)
6223 {
6224 pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr = u32DivXPattern;
6225 pstSlqTblInfo->pSlqStatus->u32SlqPushLength += u32FrmSize;
6226 pstSlqTblInfo->pSlqStatus->bSlqPicCollect = TRUE;
6227 pstSlqTblInfo->pSlqStatus->bSlqPicWaitNextStart =TRUE;
6228 }
6229 else if(pstSlqTblInfo->pSlqStatus->bSlqPicCollect)
6230 {
6231 pstSlqTblInfo->pSlqStatus->u32SlqPushLength += u32FrmSize;
6232 pstSlqTblInfo->pSlqStatus->bSlqPicWaitNextStart =TRUE;
6233 }
6234 }
6235 else
6236 {
6237 HAL_MVD_MemWrite4Byte(u32DivXPattern, DIVX_PATTERN);
6238 HAL_MVD_MemWrite4Byte(u32DivXPattern +4,u32FrmSize);
6239 }
6240 #else
6241 HAL_MVD_MemWrite4Byte(u32DivXPattern, DIVX_PATTERN);
6242 HAL_MVD_MemWrite4Byte(u32DivXPattern+4, u32FrmSize);
6243 #endif
6244 pDivxHdr->u32StAddr = u32DivXPattern - HAL_MVD_GetMemOffset(pstMemCfg->u32DrvBufAddr);
6245 pDivxHdr->u32TimeStamp = pDivxData->u32TimeStamp; //unit: ms
6246 pDivxHdr->u32ID_L = pDivxData->u32ID_L;
6247 pDivxHdr->u32ID_H = pDivxData->u32ID_H;
6248 //printf("u32DivXPattern(0x%x==>0x%x)=0x%x 0x%x\n", u32DivXPattern, pDivxHdr->u32StAddr,
6249 // HAL_MVD_MemRead4Byte(u32DivXPattern), HAL_MVD_MemRead4Byte(u32DivXPattern+4));
6250 if (E_MVD_CODEC_VC1_ADV == curCodecType)
6251 {
6252 pstSlqTblInfo->pDrvDivxTbl->u32WrPtr += 4;
6253 pDivxHdr->u32Length = 4;
6254 }
6255 else
6256 {
6257 pstSlqTblInfo->pDrvDivxTbl->u32WrPtr += 8;
6258 if(pstCtrlCfg->u8McuMode == TRUE)
6259 {
6260 pDivxHdr->u32Length = 64;
6261 if (pstSlqTblInfo->pDrvDivxTbl->u32WrPtr >= pstSlqTblInfo->pDrvDivxTbl->u32EndAdd)
6262 {
6263 pstSlqTblInfo->pDrvDivxTbl->u32WrPtr = pstSlqTblInfo->pDrvDivxTbl->u32StAdd;
6264 }
6265 }
6266 else
6267 {
6268 pDivxHdr->u32Length = 8;
6269 }
6270 }
6271
6272 #if SLQ_NEW_PUSH
6273 if(pstSlqTblInfo->pSlqStatus->bSlqPicStart && pstCtrlCfg->u8McuMode == FALSE)
6274 {
6275 if (E_MVD_CODEC_VC1_ADV == curCodecType)
6276 {
6277 pstSlqTblInfo->pDrvDivxTbl->u32WrPtr += 4;
6278 pDivxHdr->u32Length = 4;
6279 }
6280 else
6281 {
6282 pstSlqTblInfo->pDrvDivxTbl->u32WrPtr += 8;
6283 pDivxHdr->u32Length = 8;
6284 }
6285 }
6286 #endif
6287 }
6288
MVD_SLQTblInitFileEndPkt(MS_U8 u8Idx,MVD_CodecType eType)6289 static void MVD_SLQTblInitFileEndPkt(MS_U8 u8Idx, MVD_CodecType eType)
6290 {
6291 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
6292 MS_PHY u32EndPattern = HAL_MVD_GetMemOffset(pstMemCfg->u32DrvBufAddr+SLQ_TBL_SIZE*3);
6293 MS_PHY temp = 0;
6294
6295 #if 0
6296 _MVD_Memset(u32EndPattern, 0xff, END_PATTERN_SIZE);
6297 #else
6298 //_miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32EndPattern,temp);
6299 temp = u32EndPattern+pMVDHalContext->stMiuCfg.u8FWMiuSel*HAL_MIU1_BASE;
6300 memset((void*)(MS_PA2KSEG1(temp)),0xff,END_PATTERN_SIZE);
6301 MsOS_FlushMemory();
6302 MsOS_ReadMemory();
6303 #endif
6304
6305 if ((E_MVD_CODEC_FLV == eType)||(E_MVD_CODEC_MPEG4_SHORT_VIDEO_HEADER == eType))
6306 {
6307 HAL_MVD_MemWrite4Byte(u32EndPattern, FLV_PATTERN);
6308 HAL_MVD_MemWrite4Byte(u32EndPattern+4, 0xffffffff);
6309 HAL_MVD_MemWrite4Byte(u32EndPattern+8, END_PATTERN_1); //scw
6310 HAL_MVD_MemWrite4Byte(u32EndPattern+12,END_PATTERN_2); //scw
6311 HAL_MVD_MemWrite4Byte(u32EndPattern+16,END_PATTERN_3); //scw
6312 //printf("##########FileEnd for FLV/SVH!, u32EndPattern=%x\n",u32EndPattern);
6313 }
6314 else if (E_MVD_CODEC_DIVX311 == eType)
6315 {
6316 HAL_MVD_MemWrite4Byte(u32EndPattern, DIVX_PATTERN);
6317 HAL_MVD_MemWrite4Byte(u32EndPattern+4, 0xffffffff);
6318 HAL_MVD_MemWrite4Byte(u32EndPattern+8, END_PATTERN_1); //scw
6319 HAL_MVD_MemWrite4Byte(u32EndPattern+12,END_PATTERN_2); //scw
6320 HAL_MVD_MemWrite4Byte(u32EndPattern+16,END_PATTERN_3); //scw
6321 //printf("##########FileEnd for DIVX311!, u32EndPattern=%x\n",u32EndPattern);
6322 }
6323 else if ((E_MVD_CODEC_MPEG2 == eType)||(E_MVD_CODEC_MPEG4 == eType))
6324 {
6325 HAL_MVD_MemWrite4Byte(u32EndPattern, MPEG_PATTERN_0);
6326 HAL_MVD_MemWrite4Byte(u32EndPattern+4, END_PATTERN_1);
6327 HAL_MVD_MemWrite4Byte(u32EndPattern+8, END_PATTERN_2);
6328 HAL_MVD_MemWrite4Byte(u32EndPattern+12,END_PATTERN_3);
6329 //printf("##########FileEnd for MPEG2/4!, u32EndPattern=%x\n",u32EndPattern);
6330 }
6331 else
6332 {
6333 HAL_MVD_MemWrite4Byte(u32EndPattern, END_PATTERN_0);
6334 HAL_MVD_MemWrite4Byte(u32EndPattern+4, END_PATTERN_1);
6335 HAL_MVD_MemWrite4Byte(u32EndPattern+8, END_PATTERN_2); //scw
6336 HAL_MVD_MemWrite4Byte(u32EndPattern+12,END_PATTERN_3); //scw
6337 //printf("##########FileEnd for VC1!, u32EndPattern=%x\n",u32EndPattern);
6338 }
6339
6340 MVD_DEBUGINFO(printf("u32EndPattern(0x%lx)=0x%x 0x%x\n", (unsigned long)u32EndPattern,
6341 HAL_MVD_MemRead4Byte(u32EndPattern), HAL_MVD_MemRead4Byte(u32EndPattern+4)));
6342 }
6343
6344
MVD_SLQTblInitDummyPkt(MS_U8 u8Idx,MVD_CodecType eType)6345 static void MVD_SLQTblInitDummyPkt(MS_U8 u8Idx, MVD_CodecType eType)
6346 {
6347 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
6348 MS_PHY u32DummyES = HAL_MVD_GetMemOffset(pstMemCfg->u32DrvBufAddr+SLQ_TBL_SIZE*2);
6349 MS_U32 u32DummyPattern[3];
6350 MS_U32 u32PatternSize;
6351 MS_U32 i;
6352 MS_PHY temp = 0;
6353
6354 //printf("eType = 0x%x\n", eType);
6355 //initial content for dummy packet
6356 #if 0
6357 _MVD_Memset(u32DummyES, 0xff, DUMMY_SIZE);
6358 #else
6359 temp = u32DummyES+pMVDHalContext->stMiuCfg.u8FWMiuSel*HAL_MIU1_BASE;
6360 memset((void*)(MS_PA2KSEG1(temp)),0xff,DUMMY_SIZE);
6361 MsOS_FlushMemory();
6362 MsOS_ReadMemory();
6363 #endif
6364
6365 switch (eType)
6366 {
6367 case E_MVD_CODEC_FLV:
6368 case E_MVD_CODEC_MPEG4_SHORT_VIDEO_HEADER:
6369 u32DummyPattern[0] = FLV_PATTERN;
6370 u32PatternSize = 1;
6371 break;
6372
6373 case E_MVD_CODEC_DIVX311:
6374 u32DummyPattern[0] = DIVX_PATTERN;
6375 u32PatternSize = 1;
6376 break;
6377
6378 case E_MVD_CODEC_VC1_ADV: //vc1
6379 u32DummyPattern[0] = VC1_PATTERN_0;
6380 u32DummyPattern[1] = VC1_PATTERN_1;
6381 u32DummyPattern[2] = VC1_PATTERN_2;
6382 u32PatternSize = 3;
6383 break;
6384
6385 case E_MVD_CODEC_VC1_MAIN: //rcv
6386 u32DummyPattern[0] = RCV_PATTERN_0;
6387 u32DummyPattern[1] = RCV_PATTERN_1;
6388 u32DummyPattern[2] = RCV_PATTERN_2;
6389 u32PatternSize = 3;
6390 break;
6391
6392 default:
6393 u32DummyPattern[0] = DUMMY_PATTERN;
6394 u32PatternSize = 1;
6395 break;
6396 }
6397 for (i=0; i<u32PatternSize; i++)
6398 {
6399 HAL_MVD_MemWrite4Byte(u32DummyES+i*4, u32DummyPattern[i]);
6400 }
6401 #if 0
6402 printf("u32DummyES(0x%x)=0x%08lx 0x%08lx 0x%08lx 0x%08lx\n", u32DummyES, HAL_MVD_MemRead4Byte(u32DummyES),
6403 HAL_MVD_MemRead4Byte(u32DummyES+4),HAL_MVD_MemRead4Byte(u32DummyES+8),HAL_MVD_MemRead4Byte(u32DummyES+12));
6404 #endif
6405
6406 }
6407
MVD_SLQTblInitDrvSlqTbl(MVD_SLQ_TBL_ST * pDrvSlqTbl,MS_U32 u32Addr)6408 static void MVD_SLQTblInitDrvSlqTbl(MVD_SLQ_TBL_ST* pDrvSlqTbl, MS_U32 u32Addr)
6409 {
6410 MS_PHY temp = 0;
6411 pDrvSlqTbl->u32StAdd = u32Addr;
6412 pDrvSlqTbl->u32EndAdd = u32Addr + SLQ_TBL_SIZE;
6413 pDrvSlqTbl->u32EntryCntMax = SLQ_ENTRY_MAX;
6414
6415 //reset SLQ table read/write pointers
6416 pDrvSlqTbl->u32RdPtr = pDrvSlqTbl->u32StAdd;
6417 pDrvSlqTbl->u32WrPtr = pDrvSlqTbl->u32StAdd;
6418 pDrvSlqTbl->pu32LastEntry = &pDrvSlqTbl->u32WrPtr;
6419
6420 #if (!MVD_TURBO_INIT)
6421 //reset SLQ table
6422 #if 0
6423 _MVD_Memset(pDrvSlqTbl->u32StAdd, 0, SLQ_TBL_SIZE);
6424 #else
6425 temp = pDrvSlqTbl->u32StAdd+pMVDHalContext->stMiuCfg.u8FWMiuSel*HAL_MIU1_BASE;
6426 memset((void*)(MS_PA2KSEG1(temp)),0,SLQ_TBL_SIZE);
6427 MsOS_FlushMemory();
6428 MsOS_ReadMemory();
6429 #endif
6430 #endif
6431 pDrvSlqTbl->u32Empty = SLQ_TBL_SIZE;
6432 //_SLQTbl_DumpInfo(pDrvSlqTbl);
6433 }
6434
MVD_SLQTblInitSlqStatus(MVD_SLQ_STATUS * pSlqStatus,MS_VIRT u32WrPtr)6435 static void MVD_SLQTblInitSlqStatus(MVD_SLQ_STATUS* pSlqStatus, MS_VIRT u32WrPtr)
6436 {
6437 #if SLQ_NEW_PUSH
6438 pSlqStatus->u32VaildWptrAddr = u32WrPtr ;
6439 pSlqStatus->bSlqPicWaitNextStart = FALSE;
6440 pSlqStatus->bSlqCtrlBit = FALSE;
6441 pSlqStatus->u32SlqPushLength = 0;
6442 pSlqStatus->bSlqPicStart = FALSE;
6443 pSlqStatus->bSlqPicCollect = FALSE;
6444 pSlqStatus->bSlqEnLastFrameShow =FALSE;
6445 pSlqStatus->bSlqFireRdy = FALSE;
6446 #endif
6447 }
6448
MVD_SLQTblInitDrvDivxTbl(MVD_SLQ_ES_ST * pDrvDivxTbl,MS_U32 u32StAdd,MS_U32 u32Val)6449 static void MVD_SLQTblInitDrvDivxTbl(MVD_SLQ_ES_ST* pDrvDivxTbl, MS_U32 u32StAdd, MS_U32 u32Val)
6450 {
6451 MS_PHY temp = 0;
6452 ///// init SLQ entries for DivX311
6453 pDrvDivxTbl->u32StAdd = u32StAdd;
6454 pDrvDivxTbl->u32EndAdd= pDrvDivxTbl->u32StAdd + SLQ_TBL_SIZE;
6455 pDrvDivxTbl->u32WrPtr = pDrvDivxTbl->u32StAdd;
6456 //pDrvDivxTbl->u32RdPtr = pDrvDivxTbl->u32StAdd;
6457 #if (!MVD_TURBO_INIT)
6458 //reset DivX311 pattern table
6459 #if 0
6460 _MVD_Memset(pDrvDivxTbl->u32StAdd, 0, u32Val);
6461 #else
6462 temp = pDrvDivxTbl->u32StAdd+pMVDHalContext->stMiuCfg.u8FWMiuSel*HAL_MIU1_BASE;
6463 memset((void*)(MS_PA2KSEG1(temp)),0,u32Val);
6464 MsOS_FlushMemory();
6465 MsOS_ReadMemory();
6466 #endif
6467 #endif
6468 }
6469
MVD_SLQTblInitDrvEsTbl(MVD_SLQ_ES_ST * pDrvEsTbl,MS_U32 u32StAdd,MS_U32 u32Val)6470 static void MVD_SLQTblInitDrvEsTbl(MVD_SLQ_ES_ST* pDrvEsTbl, MS_U32 u32StAdd, MS_U32 u32Val)
6471 {
6472 UNUSED(u32Val);
6473 MS_PHY temp = 0;
6474 ///// init ES table
6475 pDrvEsTbl->u32StAdd = u32StAdd;
6476 pDrvEsTbl->u32EndAdd= pDrvEsTbl->u32StAdd + ES_TBL_SIZE;
6477 pDrvEsTbl->u32WrPtr = pDrvEsTbl->u32StAdd;
6478 //reset ES table
6479 #if 0
6480 _MVD_Memset(pDrvEsTbl->u32StAdd, 0, ES_TBL_SIZE);
6481 #else
6482 temp = pDrvEsTbl->u32StAdd+pMVDHalContext->stMiuCfg.u8FWMiuSel*HAL_MIU1_BASE;
6483 memset((void*)(MS_PA2KSEG1(temp)),0,ES_TBL_SIZE);
6484 MsOS_FlushMemory();
6485 MsOS_ReadMemory();
6486 #endif
6487 }
6488
6489 //------------------------------------------------------------------------------------------------------------
6490 // Layout of drvProcBuffer
6491 // -----------------
6492 // drvProcBuff | SlqTbl entries | <- pstSlqTblInfo->pDrvSlqTbl->u32StAdd
6493 // | 8K bytes |
6494 // | (1024 entries) |
6495 // | |
6496 // |-----------------|
6497 // | DivX311 | <- pstSlqTblInfo->pDrvSlqTbl->u32EndAdd <- pstSlqTblInfo->pDrvDivxTbl->u32StAdd
6498 // | 8K bytes |
6499 // | (1024 entries) |
6500 // | |
6501 // |-----------------|
6502 // | Flush Patterns |... <- pstSlqTblInfo->pDrvDivxTbl->u32EndAdd <- _drvDummy.u32StAdd
6503 // | 8K bytes |
6504 // | (1024 entries) |
6505 // | |
6506 // |-----------------|
6507 // | FileEnd Pattern |... <- _drvDummy.u32EndAdd <- _drvFileEnd.u32StAdd
6508 // | 8K bytes |
6509 // | (1024 entries) |
6510 // | |
6511 // |-----------------|
6512 // | ES table |... <- _drvFileEnd.u32EndAdd <- pstSlqTblInfo->pDrvEsTbl->u32StAdd
6513 // | 8K bytes |
6514 // | (1024 entries) |
6515 // | |
6516 // |-----------------|
6517 // | |........ End of drvProcBuff
6518 //
6519 //------------------------------------------------------------------------------------------------------------
HAL_MVD_SLQTblInit(MS_U8 u8Idx)6520 MS_BOOL HAL_MVD_SLQTblInit(MS_U8 u8Idx)
6521 {
6522 MS_VIRT u32Addr, u32Len;
6523 MVD_CodecType curCodecType = HAL_MVD_GetCodecType(u8Idx);
6524 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
6525 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
6526
6527 if(curCodecType == E_MVD_CODEC_UNKNOWN)
6528 {
6529 MVD_DEBUGERROR(printf("%s: unknow codec type!\n", __FUNCTION__));
6530 return FALSE;
6531 }
6532 pstSlqTblInfo->u32DummyPktCnt = 0;//reset dummy packet counter
6533 pstSlqTblInfo->u32SlqByteCnt = 0; //reset SLQ table byte counter
6534 pstSlqTblInfo->bSlqTblHasValidData = FALSE;
6535
6536 HAL_MVD_MemGetMap(u8Idx, E_MVD_MMAP_DRV, &u32Addr, &u32Len);
6537
6538 //init SLQ table attributes & reset SLQ table read/write pointers
6539 MVD_SLQTblInitDrvSlqTbl(pstSlqTblInfo->pDrvSlqTbl, u32Addr);
6540 pstSlqTblInfo->u32FileEndPtr = pstSlqTblInfo->pDrvSlqTbl->u32StAdd;
6541
6542 MVD_SLQTblInitSlqStatus(pstSlqTblInfo->pSlqStatus, pstSlqTblInfo->pDrvSlqTbl->u32WrPtr);
6543
6544 //set SLQ table start/end to F/W
6545 HAL_MVD_SetSLQTblBufStartEnd(u8Idx, HAL_MVD_GetMemOffset(pstMemCfg->u32BSAddr), HAL_MVD_GetMemOffset(pstMemCfg->u32BSAddr+SLQ_TBL_SIZE));
6546
6547 ///// init SLQ entries for DivX311
6548 MVD_SLQTblInitDrvDivxTbl(pstSlqTblInfo->pDrvDivxTbl, pstSlqTblInfo->pDrvSlqTbl->u32EndAdd, SLQ_TBL_SIZE);
6549
6550 ///// init flush pattern
6551 MVD_SLQTblInitDummyPkt(u8Idx, curCodecType);
6552
6553 ///// init file-end pattern
6554 MVD_SLQTblInitFileEndPkt(u8Idx, curCodecType);
6555
6556 MVD_SLQTblInitDrvEsTbl(pstSlqTblInfo->pDrvEsTbl, (pstSlqTblInfo->pDrvDivxTbl->u32EndAdd + DUMMY_SIZE*2), pstMemCfg->u32DrvBufSize);
6557
6558 pstSlqTblInfo->u32PreEsRd = MVD_U32_MAX; //reset ES read pointer
6559 pstSlqTblInfo->u32PreEsWr = 0; //reset ES write pointer
6560
6561 return TRUE;
6562 }
6563
6564
6565 #if 0
6566 static void _SLQTbl_DumpInfo(MVD_SLQ_TBL_ST* pInfo)
6567 {
6568 printf("str=0x%x\n", pInfo->u32StAdd);
6569 printf("end=0x%x\n", pInfo->u32EndAdd);
6570 printf("cnt=0x%x\n", pInfo->u32EntryCntMax);
6571 printf("rd =0x%x\n", pInfo->u32RdPtr);
6572 printf("wr =0x%x\n", pInfo->u32WrPtr);
6573 return;
6574 }
6575 #endif
6576
6577
HAL_MVD_GetQueueVacancy(MS_U8 u8Idx,MS_BOOL bCached)6578 MS_U32 HAL_MVD_GetQueueVacancy(MS_U8 u8Idx, MS_BOOL bCached)
6579 {
6580 MS_U32 u32Empty;
6581 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
6582
6583 #if 0
6584 if (MDrv_MVD_GetVldErrCount()!=0)
6585 {
6586 printf("QQQ wPtr= 0x%x(0x%x) rPtr=0x%x(0x%x) vldErr=0x%x\n", writePtrLast[u8Idx], pstSlqTblInfo->pDrvSlqTbl->u32WrPtr,
6587 HAL_MVD_GetSLQReadPtr(u8Idx), pstSlqTblInfo->pDrvSlqTbl->u32RdPtr, MDrv_MVD_GetVldErrCount(u8Idx));
6588 printf("Previous EsRead=0x%x EsWrite=0x%x\n", pstSlqTblInfo->u32PreEsRd, pstSlqTblInfo->u32PreEsWr);
6589 _SLQTbl_DumpPtsTbl(u8Idx, 0x0, 0x620);
6590 while(1);
6591 }
6592 #endif
6593
6594 u32Empty = pstSlqTblInfo->pDrvSlqTbl->u32Empty;
6595 if ((TRUE == bCached) && (u32Empty > SLQTBL_CHECKVACANCY_WATERLEVEL))
6596 {
6597 //To have better performance, we only query F/W read pointer
6598 //when queue_vacancy is lower than water_level
6599 if (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr > pstSlqTblInfo->pDrvSlqTbl->u32RdPtr)
6600 {
6601 u32Empty = SLQ_TBL_SIZE - (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr - pstSlqTblInfo->pDrvSlqTbl->u32RdPtr);
6602 }
6603 else
6604 {
6605 u32Empty = pstSlqTblInfo->pDrvSlqTbl->u32RdPtr - pstSlqTblInfo->pDrvSlqTbl->u32WrPtr;
6606 }
6607
6608 if (u32Empty == 0)// && (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr == pstSlqTblInfo->pDrvSlqTbl->u32StAdd))
6609 {
6610 u32Empty = SLQ_TBL_SIZE;
6611 }
6612 u32Empty -= SLQ_TBL_SAFERANGE;
6613 return (u32Empty / SLQ_ENTRY_LEN);
6614 }
6615
6616 pstSlqTblInfo->pDrvSlqTbl->u32RdPtr = HAL_MVD_Map2DrvSlqTbl(u8Idx, HAL_MVD_GetSLQReadPtr(u8Idx));
6617 //printf("QV=0x%x rd=0x%x==>", u32Empty, pstSlqTblInfo->pDrvSlqTbl->u32RdPtr);
6618 if (pstSlqTblInfo->pDrvSlqTbl->u32RdPtr >= (pstSlqTblInfo->pDrvSlqTbl->u32StAdd+SLQ_ENTRY_LEN))
6619 {
6620 if (pstSlqTblInfo->pDrvSlqTbl->u32RdPtr >= pstSlqTblInfo->pDrvSlqTbl->u32EndAdd)
6621 {
6622 MVD_DEBUGERROR(printf("%s: readPtr 0x%lx out of range: too large!\n",
6623 __FUNCTION__, (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32RdPtr));
6624 }
6625 pstSlqTblInfo->pDrvSlqTbl->u32RdPtr -= SLQ_ENTRY_LEN;
6626 }
6627 else if (pstSlqTblInfo->pDrvSlqTbl->u32RdPtr == pstSlqTblInfo->pDrvSlqTbl->u32StAdd)
6628 {
6629 pstSlqTblInfo->pDrvSlqTbl->u32RdPtr = pstSlqTblInfo->pDrvSlqTbl->u32EndAdd - SLQ_ENTRY_LEN;
6630 }
6631 else
6632 {
6633 MVD_DEBUGERROR(printf("%s: readPtr 0x%lx out of range: too small!\n",
6634 __FUNCTION__, (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32RdPtr));
6635 pstSlqTblInfo->pDrvSlqTbl->u32RdPtr = pstSlqTblInfo->pDrvSlqTbl->u32StAdd;
6636 }
6637 //printf("0x%x\n", pstSlqTblInfo->pDrvSlqTbl->u32RdPtr);
6638
6639 if (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr > pstSlqTblInfo->pDrvSlqTbl->u32RdPtr)
6640 {
6641 u32Empty = SLQ_TBL_SIZE - (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr - pstSlqTblInfo->pDrvSlqTbl->u32RdPtr);
6642 }
6643 else
6644 {
6645 u32Empty = pstSlqTblInfo->pDrvSlqTbl->u32RdPtr - pstSlqTblInfo->pDrvSlqTbl->u32WrPtr;
6646 }
6647
6648 if (u32Empty == 0)// && (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr == pstSlqTblInfo->pDrvSlqTbl->u32StAdd))
6649 {
6650 u32Empty = SLQ_TBL_SIZE;
6651 }
6652
6653 pstSlqTblInfo->pDrvSlqTbl->u32Empty = u32Empty;
6654
6655 if (u32Empty < SLQ_TBL_SAFERANGE)
6656 {//to avoid write_pointer catch up to read_pointer
6657 u32Empty= 0;
6658 }
6659 else
6660 {
6661 u32Empty -= SLQ_TBL_SAFERANGE;
6662 }
6663
6664 //printf("%s r=0x%x w=0x%x u32Empty=0x%x\n", __FUNCTION__,
6665 // pstSlqTblInfo->pDrvSlqTbl->u32RdPtr, pstSlqTblInfo->pDrvSlqTbl->u32WrPtr, u32Empty);
6666 return (u32Empty / SLQ_ENTRY_LEN);
6667 }
6668
HAL_MVD_PushQueue(MS_U8 u8Idx,MVD_PacketInfo * pInfo)6669 E_MVD_Result HAL_MVD_PushQueue(MS_U8 u8Idx, MVD_PacketInfo* pInfo)
6670 {
6671 E_MVD_Result eRet=E_MVD_RET_INVALID_PARAM;
6672 MVD_CodecType curCodecType = HAL_MVD_GetCodecType(u8Idx);
6673 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
6674 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
6675 MS_U32 u32Id = MVD_GetStreamId(u8Idx);
6676 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
6677 #ifdef VDEC3
6678 MS_VIRT u32VBBUAddr = HAL_MVD_GetVBBUTableAddr(u8VPUIdx);
6679 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
6680 #endif
6681 if (pInfo == NULL)
6682 {
6683 MVD_DEBUGERROR(printf("PushQueue NULL pInfo\n"));
6684 return E_MVD_RET_INVALID_PARAM;
6685 }
6686
6687 #ifndef VDEC3
6688 if(pMVDHalContext->bAutoInsertDummyPattern[u8Idx] == TRUE)
6689 #else
6690 if(pstCtrlCfg->u8McuMode == TRUE)
6691 #endif
6692 {
6693 MS_U8* temp = (MS_U8*)(MS_PA2KSEG1( (MS_PHY)(pInfo->u32StAddr)+pstMemCfg->u32BSAddr));
6694 MS_U32 i;
6695 MS_U32 u32DummyPattern[3];
6696 MS_U32 u32PatternSize;
6697
6698 switch (curCodecType)
6699 {
6700 case E_MVD_CODEC_FLV:
6701 case E_MVD_CODEC_MPEG4_SHORT_VIDEO_HEADER:
6702 u32DummyPattern[0] = FLV_PATTERN;
6703 u32PatternSize = 1;
6704 break;
6705
6706 case E_MVD_CODEC_DIVX311:
6707 u32DummyPattern[0] = DIVX_PATTERN;
6708 u32PatternSize = 1;
6709 break;
6710
6711 case E_MVD_CODEC_VC1_ADV: //vc1
6712 u32DummyPattern[0] = VC1_PATTERN_0;
6713 u32DummyPattern[1] = VC1_PATTERN_3;
6714 u32PatternSize = 2;
6715 break;
6716 case E_MVD_CODEC_VC1_MAIN: //rcv
6717 u32DummyPattern[0] = RCV_PATTERN_3;
6718 u32DummyPattern[1] = RCV_PATTERN_1;
6719 u32DummyPattern[2] = RCV_PATTERN_3;
6720 u32PatternSize = 3;
6721 break;
6722
6723 default:
6724 u32DummyPattern[0] = DUMMY_PATTERN;
6725 u32DummyPattern[1] = DUMMY_PATTERN;
6726 u32PatternSize = 2;
6727 break;
6728 }
6729
6730
6731 for (i=0; i<u32PatternSize; i++)
6732 {
6733 temp[4*i+pInfo->u32Length] = ((u32DummyPattern[i])&0xff);
6734 temp[4*i+pInfo->u32Length+1] = ((u32DummyPattern[i]>>8)&0xff);
6735 temp[4*i+pInfo->u32Length+2] = ((u32DummyPattern[i]>>16)&0xff);
6736 temp[4*i+pInfo->u32Length+3] = ((u32DummyPattern[i]>>24)&0xff);
6737 }
6738
6739 for(i=u32PatternSize*4;i<256;i++)
6740 {
6741 temp[pInfo->u32Length+i] = 0xFF;
6742 }
6743
6744 pInfo->u32Length += 256;
6745 }
6746
6747
6748 #if _SLQTBL_DUMP_PUSHQ
6749 {
6750 //static MS_U32 u32pqTimes[MAX_DEC_NUM]= {0, 0};
6751
6752 printf("Push[%x] st=0x%x len=0x%x pts=0x%x\n", pMVDHalContext->u32pqTimes[u8Idx]++,
6753 pInfo->u32StAddr, pInfo->u32Length, pInfo->u32TimeStamp);
6754 }
6755 #endif
6756
6757 #if SLQ_NEW_PUSH
6758 if((pInfo->u32StAddr & SLQ_PIC_START_FLAG) == SLQ_PIC_START_FLAG)
6759 {
6760 pInfo->u32StAddr = pInfo->u32StAddr&~SLQ_PIC_START_FLAG;
6761 pstSlqTblInfo->pSlqStatus->bSlqPicStart =TRUE;
6762 pstSlqTblInfo->pSlqStatus->bSlqCtrlBit = TRUE;
6763 }
6764 else
6765 {
6766 pstSlqTblInfo->pSlqStatus->bSlqPicStart = FALSE;
6767 }
6768 #endif
6769 //check input parameters
6770 if (pInfo->u32StAddr >= pstMemCfg->u32BSSize)
6771 {
6772 //since u32StAddr is offset, it shouldn't be larger than size.
6773 MVD_DEBUGERROR(printf("PushQueue invalid u32StAddr=0x%lx, bsSize=0x%lx\n", (unsigned long)pInfo->u32StAddr, (unsigned long)pstMemCfg->u32BSSize));
6774 return E_MVD_RET_INVALID_PARAM;
6775 }
6776 else if ((pInfo->u32TimeStamp == MVD_NULLPKT_PTS) && (pInfo->u32Length==0))
6777 {
6778 // AVI NULL packet.
6779 pstSlqTblInfo->u32DummyPktCnt++;
6780 //printf("Pos:0x%x%08x; PTS:%08d; NullPKT:%d\n", pInfo->u32ID_H, pInfo->u32ID_L, pInfo->u32TimeStamp, pstSlqTblInfo->u32DummyPktCnt);
6781 return E_MVD_RET_OK;
6782 }
6783
6784 if (FALSE == (HAL_MVD_IsMStreamerMode(u8Idx) ||HAL_MVD_IsMcuMode(u8Idx)))
6785 { //Check repeat PTS for non-MStreamer/Mcu mode.
6786 //printf(".Pos:0x%x%08x; PTS:%08d; NullPKT:%d\n", pInfo->u32ID_H, pInfo->u32ID_L, pInfo->u32TimeStamp, pstSlqTblInfo->u32DummyPktCnt);
6787 if (pInfo->u32TimeStamp == pstSlqTblInfo->u32LastPts)
6788 {
6789 //printf("Repeat PTS!\n");
6790 if (pInfo->u32TimeStamp != MVD_NULLPKT_PTS)
6791 pInfo->u32TimeStamp = MVD_NULLPKT_PTS; //repeat PTS
6792 }
6793 else
6794 {
6795 pstSlqTblInfo->u32LastPts = pInfo->u32TimeStamp;
6796 }
6797 }
6798
6799 //check queue vacancy
6800 if (pstSlqTblInfo->pDrvSlqTbl->u32Empty >= SLQ_TBL_SAFERANGE)
6801 { //put packets
6802 #if SLQ_NEW_PUSH
6803 if (E_MVD_CODEC_DIVX311 == curCodecType
6804 ||E_MVD_CODEC_VC1_MAIN == curCodecType //rcv
6805 ||E_MVD_CODEC_VC1_ADV == curCodecType)
6806 {
6807 MVD_PacketInfo stHdr;
6808 if((pstSlqTblInfo->pSlqStatus->bSlqCtrlBit) || (E_MVD_CODEC_DIVX311 == curCodecType))
6809 {
6810 MVD_SLQTblGetHdrPkt(u8Idx, &stHdr, pInfo);
6811
6812 if(pstSlqTblInfo->pSlqStatus->bSlqPicStart||(!pstSlqTblInfo->pSlqStatus->bSlqCtrlBit))
6813 {
6814 if (HAL_MVD_IsMStreamerMode(u8Idx) || HAL_MVD_IsMcuMode(u8Idx))
6815 { //to mark this packet's pts as unused.
6816 stHdr.u32TimeStamp = MVD_NULLPKT_PTS;
6817 stHdr.u32ID_H = MVD_NULLPKT_PTS;
6818 }
6819 #ifdef VDEC3
6820 if(pstCtrlCfg->u8McuMode == TRUE)
6821 {
6822 if(HAL_VPU_EX_GetVBBUVacancy(u32VBBUAddr) > 1)
6823 {
6824 HAL_VPU_EX_PacketInfo stVpuPkt;
6825
6826 stVpuPkt.u32Offset = stHdr.u32StAddr;
6827 stVpuPkt.u32Length = stHdr.u32Length;
6828 stVpuPkt.u64TimeStamp = (MS_U64)stHdr.u32TimeStamp;
6829 //If in display queue mode
6830 stVpuPkt.u64TimeStamp |= ((MS_U64)stHdr.u32ID_H << 32);
6831 stVpuPkt.u32ID_H = stHdr.u32ID_H;
6832 stVpuPkt.u32ID_L = stHdr.u32ID_L;
6833
6834 pstSlqTblInfo->bSlqTblHasValidData = TRUE;
6835 eRet = (E_MVD_Result)HAL_VPU_EX_Push2VBBU(u32Id, &stVpuPkt, u32VBBUAddr);
6836 }
6837 else
6838 {
6839 return E_MVD_RET_FAIL;
6840 }
6841 }
6842 else
6843 #endif
6844 {
6845 HAL_MVD_SLQTblSendPacket(u8Idx, &stHdr);
6846 }
6847 }
6848 }
6849 }
6850 #else
6851 if (E_MVD_CODEC_DIVX311 == curCodecType)
6852 {
6853 MVD_PacketInfo stDivxHdr;
6854 MVD_SLQTblGetDivxHdrPkt(u8Idx, &stDivxHdr, pInfo);
6855 if (HAL_MVD_IsMStreamerMode(u8Idx) || HAL_MVD_IsMcuMode(u8Idx))
6856 { //to mark this packet's pts as unused.
6857 stDivxHdr.u32TimeStamp = MVD_NULLPKT_PTS;
6858 stDivxHdr.u32ID_H = MVD_NULLPKT_PTS;
6859 }
6860 HAL_MVD_SLQTblSendPacket(u8Idx, &stDivxHdr);
6861 }
6862 #endif
6863
6864 #ifdef VDEC3
6865 if(pstCtrlCfg->u8McuMode == TRUE)
6866 {
6867 if(HAL_VPU_EX_GetVBBUVacancy(u32VBBUAddr) > 0)
6868 {
6869 HAL_VPU_EX_PacketInfo stVpuPkt;
6870
6871 stVpuPkt.u32Offset = pInfo->u32StAddr;
6872 stVpuPkt.u32Length = pInfo->u32Length;
6873 stVpuPkt.u64TimeStamp = (MS_U64)pInfo->u32TimeStamp;
6874 //If in display queue mode
6875 stVpuPkt.u64TimeStamp |= ((MS_U64)pInfo->u32ID_H << 32);
6876 stVpuPkt.u32ID_H = pInfo->u32ID_H;
6877 stVpuPkt.u32ID_L = pInfo->u32ID_L;
6878
6879 pstSlqTblInfo->bSlqTblHasValidData = TRUE;
6880 eRet = (E_MVD_Result)HAL_VPU_EX_Push2VBBU(u32Id, &stVpuPkt, u32VBBUAddr);
6881 //VPRINTF("[%d]%s[%d],ret=%d,u32StAddr %x,u32Length %d,u32TimeStamp %d\n",u8Idx,__FUNCTION__,__LINE__,eRet,(unsigned int)pInfo->u32StAddr,(unsigned int)pInfo->u32Length,(unsigned int)pInfo->u32TimeStamp);
6882 return eRet;
6883 }
6884 else
6885 {
6886 return E_MVD_RET_FAIL;
6887 }
6888 }
6889 else
6890 #endif
6891 {
6892 HAL_MVD_SLQTblSendPacket(u8Idx, pInfo);
6893 eRet=E_MVD_RET_OK;
6894 pstSlqTblInfo->bSlqTblHasValidData = TRUE;
6895 }
6896 }
6897 else
6898 {
6899 MS_ASSERT(0); //shouldn't be here!
6900 MVD_DEBUGERROR(printf("PushQueue FULL!!! empty=0x%lx\n", (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32Empty));
6901 //Player will only push queue when queue vacancy != 0
6902 eRet=E_MVD_RET_QUEUE_FULL;
6903 }
6904
6905 if (E_MVD_RET_OK != eRet)
6906 {
6907 MVD_DEBUGERROR(printf("%s ret = %d\n", __FUNCTION__, eRet));
6908 }
6909 return eRet;
6910 }
6911
6912
MVD_FlushTSQueue(MS_U8 u8Idx)6913 static E_MVD_Result MVD_FlushTSQueue(MS_U8 u8Idx)
6914 {
6915 if (HAL_MVD_GetLastCmd(u8Idx)!=CMD_PAUSE)
6916 {
6917 HAL_MVD_PauseDisp(u8Idx);
6918 HAL_MVD_DecodePause(u8Idx);
6919 HAL_MVD_FlushDisplayBuf(u8Idx);
6920 }
6921
6922 if(HAL_MVD_SkipData(u8Idx) == FALSE)
6923 {
6924 return E_MVD_RET_FAIL;
6925 }
6926 else
6927 {
6928 return E_MVD_RET_OK;
6929 }
6930 }
6931
6932
MVD_PatternLenIsValid(MS_U8 u8Idx,MS_U32 u32Len)6933 static MS_BOOL MVD_PatternLenIsValid(MS_U8 u8Idx, MS_U32 u32Len)
6934 {
6935 MS_U32 u32ValidLen = 0;
6936 MVD_CodecType curCodecType = HAL_MVD_GetCodecType(u8Idx);
6937 #define MAX_VALIDLEN 0x200000 //2M
6938
6939 if (E_MVD_CODEC_VC1_MAIN != curCodecType)
6940 {
6941 return TRUE;
6942 }
6943 else
6944 {
6945 //only RCV has to check this
6946 u32ValidLen = HAL_MVD_GetPayloadLen(u8Idx);
6947 if (u32ValidLen > MAX_VALIDLEN)
6948 { //avoid the extreme large value due to error bitstream
6949 u32ValidLen = MAX_VALIDLEN;
6950 }
6951 MVD_DEBUGINFO(printf("(%x) ValidLen=0x%x CurLen=0x%x\n",
6952 (u32Len > u32ValidLen), u32ValidLen, u32Len));
6953 return (u32Len > u32ValidLen);
6954 }
6955 }
6956
MVD_FlushSlqTblQueue(MS_U8 u8Idx)6957 static E_MVD_Result MVD_FlushSlqTblQueue(MS_U8 u8Idx)
6958 {
6959 MS_U32 u32TimeCnt;
6960 MS_U32 u32PatternByteCnt = 0;
6961 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
6962 MS_U32 u32Id = MVD_GetStreamId(u8Idx);
6963 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
6964 #ifdef VDEC3
6965 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
6966 MS_VIRT u32VBBUAddr = HAL_MVD_GetVBBUTableAddr(u8VPUIdx);
6967 #endif
6968 HAL_MVD_ResetHandShake(u8Idx,MVD_HANDSHAKE_PAUSE);
6969 HAL_MVD_PauseDisp(u8Idx);
6970 HAL_MVD_DecodePause(u8Idx);
6971 HAL_MVD_FlushDisplayBuf(u8Idx);
6972
6973 u32TimeCnt = HAL_MVD_GetTime();
6974 while (((HAL_MVD_GetTime() - u32TimeCnt) < CMD_TIMEOUT_MS) ||
6975 (TRUE != MVD_PatternLenIsValid(u8Idx, u32PatternByteCnt)))
6976 {
6977 if (HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_PAUSE))
6978 {
6979 MVD_DEBUGINFO(printf("\nPause finished!\n"));
6980 break;
6981 }
6982
6983 #ifdef VDEC3
6984 if(pstCtrlCfg->u8McuMode == TRUE)
6985 {
6986 if(HAL_VPU_EX_GetVBBUVacancy(u32VBBUAddr) > 0)
6987 {
6988 HAL_VPU_EX_PacketInfo stVpuPkt;
6989 MVD_PacketInfo stDummyPkt;
6990 MVD_SLQTblGetDummyPkt(&stDummyPkt);
6991
6992 stVpuPkt.u32Offset = stDummyPkt.u32StAddr;
6993 stVpuPkt.u32Length = stDummyPkt.u32Length;
6994 stVpuPkt.u64TimeStamp = (MS_U64)stDummyPkt.u32TimeStamp;
6995 //If in display queue mode
6996 stVpuPkt.u64TimeStamp |= ((MS_U64)stDummyPkt.u32ID_H << 32);
6997 stVpuPkt.u32ID_H = stDummyPkt.u32ID_H;
6998 stVpuPkt.u32ID_L = stDummyPkt.u32ID_L;
6999
7000 HAL_VPU_EX_Push2VBBU(u32Id, &stVpuPkt,u32VBBUAddr);
7001 }
7002 }
7003 else
7004 #endif
7005 {
7006 if (pstSlqTblInfo->pDrvSlqTbl->u32Empty < SLQ_TBL_SAFERANGE)
7007 {
7008 HAL_MVD_GetQueueVacancy(u8Idx, FALSE); //update pstSlqTblInfo->pDrvSlqTbl->u32Empty
7009 HAL_MVD_Delayms(1); //avoid busy query
7010 }
7011 //insert dummy pattern
7012 if (TRUE == HAL_MVD_SLQTblInsertPattern(u8Idx, E_MVD_PATTERN_FLUSH))
7013 {
7014 u32PatternByteCnt += DUMMY_SIZE*2; //2 dummy were inserted
7015 }
7016 }
7017
7018
7019 //Timeout for RCV
7020 if ((HAL_MVD_GetTime() - u32TimeCnt) > (CMD_TIMEOUT_MS*10))
7021 {
7022 MVD_DEBUGERROR(printf("RCV timeout!!! pl=%d, pbc=%d, emp=%ld\n",
7023 HAL_MVD_GetPayloadLen(u8Idx), u32PatternByteCnt,
7024 (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32Empty));
7025 break;
7026 }
7027 }
7028 MVD_DEBUGINFO(printf("====> %s (t1=%u t2=%u diff=%u)\n", __FUNCTION__,
7029 u32TimeCnt, HAL_MVD_GetTime(), (HAL_MVD_GetTime() - u32TimeCnt)));
7030 //if ((HAL_MVD_GetTime() - u32TimeCnt) >= CMD_TIMEOUT_MS)
7031 if (TRUE != HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_PAUSE))
7032 {
7033 MVD_DEBUGERROR(printf("\n***** MDrv_MVD_FlushQueue PAUSE TIMEOUT!!! *****\n\n"));
7034 MVD_DEBUGERROR(printf("ValidLen=0x%x CurPatternLen=0x%x\n",
7035 HAL_MVD_GetPayloadLen(u8Idx), u32PatternByteCnt));
7036
7037 return E_MVD_RET_FAIL;
7038 }
7039
7040 //flush ES buffer & reset SLQ tbl
7041 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_SLQ_RST);
7042 if (HAL_MVD_SlqTblRst(u8Idx) == TRUE)
7043 {
7044 //return E_MVD_RET_OK;
7045 }
7046
7047 u32TimeCnt = HAL_MVD_GetTime();
7048 while (((HAL_MVD_GetTime() - u32TimeCnt) < CMD_TIMEOUT_MS))
7049 {
7050 if (HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_SLQ_RST))
7051 {
7052 MVD_DEBUGINFO(printf("\nSlqRst finished!\n"));
7053 break;
7054 }
7055 }
7056 MVD_DEBUGINFO(printf("====> %s (t1=%u t2=%u diff=%u)\n", __FUNCTION__,
7057 u32TimeCnt, HAL_MVD_GetTime(), (HAL_MVD_GetTime() - u32TimeCnt)));
7058 if (TRUE != HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_SLQ_RST))
7059 {
7060 MVD_DEBUGERROR(printf("\n***** MDrv_MVD_FlushQueue SlqRst TIMEOUT!!! *****\n\n"));
7061 return E_MVD_RET_FAIL;
7062 }
7063
7064 HAL_MVD_SLQTblInit(u8Idx); //reset related buffers
7065
7066 return E_MVD_RET_OK;
7067 }
7068
HAL_MVD_FlushQueue(MS_U8 u8Idx)7069 E_MVD_Result HAL_MVD_FlushQueue(MS_U8 u8Idx)
7070 {
7071 E_MVD_Result eRet = E_MVD_RET_OK;
7072 MVD_SrcMode curSrcMode = HAL_MVD_GetSrcMode(u8Idx);
7073
7074 if (HAL_MVD_GetDecodeStatus(u8Idx) == E_MVD_STAT_IDLE)
7075 {
7076 return eRet;
7077 }
7078
7079 //flush ES buffer (and cmd queue if used)
7080 if (E_MVD_SLQ_TBL_MODE == curSrcMode)
7081 {
7082 eRet = MVD_FlushSlqTblQueue(u8Idx);
7083 }
7084 else if (E_MVD_TS_FILE_MODE == curSrcMode)
7085 {
7086 eRet = MVD_FlushTSQueue(u8Idx);
7087 }
7088 if (E_MVD_RET_OK != eRet)
7089 {
7090 return eRet;
7091 }
7092
7093 MVD_RstFrmInfo(u8Idx, E_MVD_FRMINFO_DECODE);
7094 //flush display buffer
7095
7096 if (HAL_MVD_FlushDisplayBuf(u8Idx) != TRUE)
7097 {
7098 return E_MVD_RET_FAIL;
7099 }
7100
7101 if (TRUE == HAL_MVD_SkipToIFrame(u8Idx))
7102 {
7103 return E_MVD_RET_OK;
7104 }
7105 else
7106 {
7107 return E_MVD_RET_FAIL;
7108 }
7109 }
7110
HAL_MVD_IsAllBufferEmpty(MS_U8 u8Idx)7111 MS_BOOL HAL_MVD_IsAllBufferEmpty(MS_U8 u8Idx)
7112 {
7113 return HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_SKIP_DATA);
7114 }
7115
HAL_MVD_EnableInt(MS_U8 u8Idx,MS_U32 bEn)7116 MS_BOOL HAL_MVD_EnableInt(MS_U8 u8Idx, MS_U32 bEn)
7117 {
7118 MVD_CmdArg mvdcmd;
7119 MS_U32 u32IntFlag = 0;
7120
7121 u32IntFlag = (((bEn & E_MVD_EVENT_USER_DATA) == E_MVD_EVENT_USER_DATA) ? INT_USER_DATA : 0) |
7122 (((bEn & E_MVD_EVENT_USER_DATA_DISP) == E_MVD_EVENT_USER_DATA_DISP) ? INT_USER_DATA_DISP : 0) |
7123 (((bEn & E_MVD_EVENT_PIC_FOUND) == E_MVD_EVENT_PIC_FOUND) ? INT_PIC_FOUND : 0) |
7124 (((bEn & E_MVD_EVENT_FIRST_FRAME) == E_MVD_EVENT_FIRST_FRAME) ? INT_FIRST_FRAME : 0) |
7125 (((bEn & E_MVD_EVENT_DISP_RDY) == E_MVD_EVENT_DISP_RDY) ? INT_DISP_RDY : 0) |
7126 (((bEn & E_MVD_EVENT_SEQ_FOUND) == E_MVD_EVENT_SEQ_FOUND) ? INT_SEQ_FOUND : 0)|
7127 (((bEn & E_MVD_EVENT_DEC_ONE_FRAME) == E_MVD_EVENT_DEC_ONE_FRAME) ? INT_DEC_DONE : 0)|
7128 (((bEn & E_MVD_EVENT_DEC_ERR) == E_MVD_EVENT_DEC_ERR) ? INT_DEC_ERR : 0)|
7129 (((bEn & E_MVD_EVENT_DEC_DATA_ERR) == E_MVD_EVENT_DEC_DATA_ERR) ? INT_VES_INVALID : 0)|
7130 (((bEn & E_MVD_EVENT_XC_LOW_DEALY) == E_MVD_EVENT_XC_LOW_DEALY) ? INT_XC_LOW_DELAY : 0)|
7131 (((bEn & E_MVD_EVENT_DEC_I) == E_MVD_EVENT_DEC_I) ? INT_DEC_I : 0);
7132 if (((bEn & E_MVD_EVENT_DISP_VSYNC) == E_MVD_EVENT_DISP_VSYNC) ||
7133 ((bEn & E_MVD_EVENT_UNMUTE) == E_MVD_EVENT_UNMUTE))
7134 {
7135 u32IntFlag |= INT_DISP_VSYNC;
7136 }
7137
7138 MVD_DEBUGINFO(printf("u32IntFlag = 0x%x\n", u32IntFlag));
7139 SETUP_CMDARG(mvdcmd);
7140 mvdcmd.Arg0 = u32IntFlag & 0xff;
7141 mvdcmd.Arg1 = (u32IntFlag>>8) & 0xff;
7142 mvdcmd.Arg2 = (u32IntFlag>>16) & 0xff;
7143 SET_DECNUM(mvdcmd, u8Idx);
7144 SET_CMD_RET_FALSE(CMD_ENABLE_INT_STAT, &mvdcmd);
7145
7146 return TRUE;
7147 }
7148
HAL_MVD_EnablePTSDetector(MS_U8 u8Idx,MS_BOOL bEn)7149 E_MVD_Result HAL_MVD_EnablePTSDetector(MS_U8 u8Idx, MS_BOOL bEn)
7150 {
7151 MVD_CmdArg stCmdArg;
7152
7153 SETUP_CMDARG(stCmdArg);
7154 if(TRUE == bEn)
7155 {
7156 stCmdArg.Arg0 = 1;
7157 }
7158 SET_DECNUM(stCmdArg, u8Idx);
7159 if (HAL_MVD_MVDCommand(CMD_PTS_DETECTOR_EN, &stCmdArg) == FALSE)
7160 {
7161 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_PTS_DETECTOR_EN ) );
7162 return E_MVD_RET_FAIL;
7163 }
7164 return E_MVD_RET_OK;
7165 }
7166
HAL_MVD_DisablePBFrameMode(MS_U8 u8Idx,MS_BOOL bEn)7167 E_MVD_Result HAL_MVD_DisablePBFrameMode(MS_U8 u8Idx, MS_BOOL bEn)
7168 {
7169 MVD_CmdArg stCmdArg;
7170
7171 SETUP_CMDARG(stCmdArg);
7172 if(TRUE == bEn)
7173 {
7174 stCmdArg.Arg0 = 1;
7175 }
7176 SET_DECNUM(stCmdArg, u8Idx);
7177 if (HAL_MVD_MVDCommand(CMD_DISABLE_PATCH_PBFRAME, &stCmdArg) == FALSE)
7178 {
7179 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_PTS_DETECTOR_EN ) );
7180 return E_MVD_RET_FAIL;
7181 }
7182 return E_MVD_RET_OK;
7183 }
7184
HAL_MVD_EnableDispOneField(MS_U8 u8Idx,MS_BOOL bEn)7185 E_MVD_Result HAL_MVD_EnableDispOneField(MS_U8 u8Idx, MS_BOOL bEn)
7186 {
7187 MVD_CmdArg stCmdArg;
7188
7189 SETUP_CMDARG(stCmdArg);
7190 if(TRUE == bEn)
7191 {
7192 stCmdArg.Arg0 = 1;
7193 }
7194 SET_DECNUM(stCmdArg, u8Idx);
7195 if (HAL_MVD_MVDCommand(CMD_SHOW_ONE_FIELD, &stCmdArg) == FALSE)
7196 {
7197 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SHOW_ONE_FIELD ) );
7198 return E_MVD_RET_FAIL;
7199 }
7200 return E_MVD_RET_OK;
7201 }
7202
HAL_MVD_SetFdMaskDelayCount(MS_U8 u8Idx,MS_U16 u16Cnt)7203 E_MVD_Result HAL_MVD_SetFdMaskDelayCount(MS_U8 u8Idx, MS_U16 u16Cnt)
7204 {
7205 MVD_CmdArg stCmdArg;
7206
7207 SETUP_CMDARG(stCmdArg);
7208 //16bits and unit in vsync for mute the fd_mask
7209 stCmdArg.Arg0 = u16Cnt & 0xff;
7210 stCmdArg.Arg1 = (u16Cnt>>8) & 0xff;
7211 SET_DECNUM(stCmdArg, u8Idx);
7212 if (HAL_MVD_MVDCommand(CMD_FD_MASK_DELAY_CNT, &stCmdArg) == FALSE)
7213 {
7214 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FD_MASK_DELAY_CNT ) );
7215 return E_MVD_RET_FAIL;
7216 }
7217 return E_MVD_RET_OK;
7218 }
7219
HAL_MVD_SetOutputFRCMode(MS_U8 u8Idx,MS_U8 u8FrameRate,MS_U8 u8Interlace)7220 E_MVD_Result HAL_MVD_SetOutputFRCMode(MS_U8 u8Idx, MS_U8 u8FrameRate, MS_U8 u8Interlace)
7221 {
7222 MVD_CmdArg stCmdArg;
7223 if((u8Interlace != 0) && (u8Interlace != 1))
7224 {
7225 return E_MVD_RET_FAIL;
7226 }
7227 SETUP_CMDARG(stCmdArg);
7228 stCmdArg.Arg0 = u8FrameRate;
7229 stCmdArg.Arg1 = u8Interlace;
7230 SET_DECNUM(stCmdArg, u8Idx);
7231 if (HAL_MVD_MVDCommand(CMD_FRC_OUPUT, &stCmdArg) == FALSE)
7232 {
7233 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FRC_OUPUT ) );
7234 return E_MVD_RET_FAIL;
7235 }
7236 return E_MVD_RET_OK;
7237 }
7238
7239
HAL_MVD_SetFRCDropType(MS_U8 u8Idx,MS_U8 u8DropType)7240 E_MVD_Result HAL_MVD_SetFRCDropType(MS_U8 u8Idx, MS_U8 u8DropType)
7241 {
7242 MVD_CmdArg stCmdArg;
7243
7244 if((u8DropType != FRC_DROP_FRAME)
7245 && (u8DropType != FRC_DROP_FIELD))
7246 {
7247 return E_MVD_RET_FAIL;
7248 }
7249
7250 SETUP_CMDARG(stCmdArg);
7251 stCmdArg.Arg0 = u8DropType;
7252 SET_DECNUM(stCmdArg, u8Idx);
7253 if (HAL_MVD_MVDCommand(CMD_FRC_DROP_BEHAVIOR, &stCmdArg) == FALSE)
7254 {
7255 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FRC_DROP_BEHAVIOR ) );
7256 return E_MVD_RET_FAIL;
7257 }
7258 return E_MVD_RET_OK;
7259 }
7260
HAL_MVD_SetDisableSeqChange(MS_U8 u8Idx,MS_BOOL bEnable)7261 E_MVD_Result HAL_MVD_SetDisableSeqChange(MS_U8 u8Idx, MS_BOOL bEnable)
7262 {
7263 MVD_CmdArg stCmdArg;
7264
7265 SETUP_CMDARG(stCmdArg);
7266 stCmdArg.Arg0 = bEnable;
7267 SET_DECNUM(stCmdArg, u8Idx);
7268 if (HAL_MVD_MVDCommand(CMD_FORBID_RESOLUTION_CHANGE, &stCmdArg) == FALSE)
7269 {
7270 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FORBID_RESOLUTION_CHANGE ) );
7271 return E_MVD_RET_FAIL;
7272 }
7273 MVD_DEBUGINFO(printf("MVD CMD_FORBID_RESOLUTION_CHANGE(0x%x) OK\n", bEnable));
7274
7275 return E_MVD_RET_OK;
7276 }
7277
HAL_MVD_DbgGetData(MS_VIRT u32Addr,MS_U32 * u32Data)7278 E_MVD_Result HAL_MVD_DbgGetData(MS_VIRT u32Addr, MS_U32* u32Data)
7279 {
7280 MVD_CmdArg mvdcmd;
7281 MS_U32 u32Val;
7282
7283 if (!u32Data)
7284 {
7285 return E_MVD_RET_INVALID_PARAM;
7286 }
7287
7288 SET_CMDARG(mvdcmd, u32Addr, 0); //FIXME
7289 if (HAL_MVD_MVDCommand( CMD_RD_IO, &mvdcmd ) == FALSE)
7290 {
7291 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_RD_IO ) );
7292 return E_MVD_RET_FAIL;
7293 }
7294
7295 u32Val = (((MS_U32)mvdcmd.Arg2)) | ((MS_U32)mvdcmd.Arg3 << 8) |
7296 (((MS_U32)mvdcmd.Arg4) << 16) | (((MS_U32)mvdcmd.Arg5) << 24);
7297 *u32Data = u32Val;
7298
7299 return E_MVD_RET_OK;
7300 }
7301
7302
HAL_MVD_DbgDumpBits(MS_U8 u8Idx,MS_PHY u32base,MS_U32 u32size)7303 void HAL_MVD_DbgDumpBits(MS_U8 u8Idx, MS_PHY u32base, MS_U32 u32size)
7304 {
7305 MVD_CmdArg mvdcmd;
7306
7307 u32base = HAL_MVD_GetMemOffset(u32base);
7308 printf("%s base=0x%lx size=0x%x\n", __FUNCTION__, (unsigned long)u32base, u32size);
7309 MS_ASSERT((u32base%8)==0);
7310 u32base >>= 3;
7311 SET_CMDARG(mvdcmd, u32base, u8Idx);
7312 if (HAL_MVD_MVDCommand( CMD_DUMP_BITSTREAM_BASE, &mvdcmd ) == FALSE)
7313 {
7314 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\n", CMD_DUMP_BITSTREAM_BASE ) );
7315 return;
7316 }
7317
7318 MS_ASSERT((u32size%8)==0);
7319 u32size >>= 3;
7320 SET_CMDARG(mvdcmd, u32size, u8Idx);
7321 if (HAL_MVD_MVDCommand( CMD_DUMP_BITSTREAM_LENGTH, &mvdcmd ) == FALSE)
7322 {
7323 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\n", CMD_DUMP_BITSTREAM_LENGTH ) );
7324 return;
7325 }
7326 return;
7327 }
7328
7329
HAL_MVD_GetActiveFormat(MS_U8 u8Idx)7330 MS_U8 HAL_MVD_GetActiveFormat(MS_U8 u8Idx)
7331 {
7332 MVD_CmdArg mvdcmd;
7333 MS_U8 u8Afd = 0;
7334
7335 SETUP_CMDARG(mvdcmd);
7336 SET_DECNUM(mvdcmd, u8Idx);
7337 if (HAL_MVD_MVDCommand( CMD_GET_AFD, &mvdcmd ) == FALSE)
7338 {
7339 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail!!\r\n", CMD_GET_AFD ) );
7340 return 0xff;
7341 }
7342 u8Afd = mvdcmd.Arg0;
7343 return u8Afd;
7344 }
7345
HAL_MVD_EnableAVSync(MS_U8 u8Idx,MS_BOOL bEnable)7346 MS_BOOL HAL_MVD_EnableAVSync(MS_U8 u8Idx, MS_BOOL bEnable)
7347 {
7348 MVD_CmdArg mvdcmd;
7349 SETUP_CMDARG(mvdcmd);
7350 mvdcmd.Arg0 = bEnable;
7351 SET_DECNUM(mvdcmd, u8Idx);
7352 SET_CMD_RET_FALSE(CMD_SYNC_ON, &mvdcmd);
7353
7354 MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
7355 pCtrlCfg->bAVSyncOn = bEnable;
7356
7357 return TRUE;
7358 }
7359
HAL_MVD_SetAVSyncDelay(MS_U8 u8Idx,MS_U32 u32Delay)7360 MS_BOOL HAL_MVD_SetAVSyncDelay(MS_U8 u8Idx, MS_U32 u32Delay)
7361 {
7362 MVD_CmdArg mvdcmd;
7363 SET_CMDARG(mvdcmd, _MS_TO_90K(u32Delay), u8Idx); //u32Delay ms ==> 90k counter
7364 SET_CMD_RET_FALSE(CMD_SYNC_OFFSET, &mvdcmd);
7365 return TRUE;
7366 }
7367
HAL_MVD_SetAVSyncThreshold(MS_U8 u8Idx,MS_U32 u32Th)7368 MS_BOOL HAL_MVD_SetAVSyncThreshold(MS_U8 u8Idx, MS_U32 u32Th)
7369 {
7370 MVD_CmdArg mvdcmd;
7371
7372 if (u32Th == 0x00)
7373 {
7374 return FALSE; //invalid parameter, do nothing
7375 }
7376 if (u32Th > 0xff)
7377 {
7378 u32Th = 0xff; //set to maximum
7379 }
7380
7381 SETUP_CMDARG(mvdcmd);
7382 mvdcmd.Arg3 = u32Th;
7383 SET_DECNUM(mvdcmd, u8Idx);
7384 SET_CMD_RET_FALSE(CMD_SYN_THRESHOLD, &mvdcmd);
7385 return TRUE;
7386 }
7387
HAL_MVD_SetAVSyncFreerunThreshold(MS_U8 u8Idx,MS_U32 u32Th)7388 MS_BOOL HAL_MVD_SetAVSyncFreerunThreshold(MS_U8 u8Idx, MS_U32 u32Th)
7389 {
7390 MVD_CmdArg mvdcmd;
7391 SET_CMDARG(mvdcmd, u32Th, u8Idx);
7392 SET_CMD_RET_FALSE(CMD_AVSYNC_FREERUN_THRESHOLD, &mvdcmd);
7393 return TRUE;
7394 }
7395
HAL_MVD_ChangeAVsync(MS_U8 u8Idx,MS_BOOL bEnable,MS_U16 u16PTS)7396 MS_BOOL HAL_MVD_ChangeAVsync(MS_U8 u8Idx, MS_BOOL bEnable, MS_U16 u16PTS)
7397 {
7398 MVD_CmdArg mvdcmd;
7399
7400 u16PTS = _MS_TO_90K(u16PTS); //u16PTS ms ==> 90k counter
7401 SETUP_CMDARG(mvdcmd);
7402 mvdcmd.Arg0 = (MS_U8)bEnable;
7403 mvdcmd.Arg1 = 0;
7404 mvdcmd.Arg2 = (MS_U8)(u16PTS&0xff);
7405 mvdcmd.Arg3 = (MS_U8)((u16PTS&0xff00)>>8);
7406 SET_DECNUM(mvdcmd, u8Idx);
7407 SET_CMD_RET_FALSE(CMD_MVD_FAST_INT, &mvdcmd);
7408 return TRUE;
7409 }
7410
HAL_MVD_GetIsSyncRep(MS_U8 u8Idx)7411 MS_BOOL HAL_MVD_GetIsSyncRep(MS_U8 u8Idx)
7412 {
7413 MS_U32 u32IntStat = 0;
7414 MS_BOOL bRet = FALSE;
7415
7416 u32IntStat = HAL_MVD_GetIntState(u8Idx);
7417 if (u32IntStat != 0)
7418 {
7419 bRet = ((u32IntStat&INT_SYN_REP)==INT_SYN_REP) ? TRUE : FALSE;
7420 }
7421 return bRet;
7422 }
7423
HAL_MVD_GetIsSyncSkip(MS_U8 u8Idx)7424 MS_BOOL HAL_MVD_GetIsSyncSkip(MS_U8 u8Idx)
7425 {
7426 MS_U32 u32IntStat = 0;
7427 MS_BOOL bRet = FALSE;
7428
7429 u32IntStat = HAL_MVD_GetIntState(u8Idx);
7430 if (u32IntStat != 0)
7431 {
7432 bRet = ((u32IntStat&INT_SYN_SKIP)==INT_SYN_SKIP) ? TRUE : FALSE;
7433 }
7434
7435 return bRet;
7436 }
7437
HAL_MVD_GetIsSyncReach(MS_U8 u8Idx)7438 MS_U8 HAL_MVD_GetIsSyncReach(MS_U8 u8Idx)
7439 {
7440 #define MVD_SYNC_DONE 1
7441 if(MVD_GetSyncStat(u8Idx, 1) == MVD_SYNC_DONE)
7442 return 1;
7443 else
7444 return 0xFF;
7445 }
7446
HAL_MVD_GetDispRdy(MS_U8 u8Idx)7447 MS_U8 HAL_MVD_GetDispRdy(MS_U8 u8Idx)
7448 {
7449 if (HAL_MVD_GetPicCounter(u8Idx) > 0)
7450 {
7451 return 1;
7452 }
7453 else
7454 {
7455 return 0;
7456 }
7457 }
7458
HAL_MVD_GetDecodeStatus(MS_U8 u8Idx)7459 MVD_DecStat HAL_MVD_GetDecodeStatus(MS_U8 u8Idx)
7460 {
7461 MVD_CmdArg mvdcmd;
7462 MVD_DecStat stat = E_MVD_STAT_UNKNOWN;
7463
7464 SETUP_CMDARG(mvdcmd);
7465 SET_DECNUM(mvdcmd, u8Idx);
7466 if (HAL_MVD_MVDCommand(CMD_DECODE_STATUS, &mvdcmd) == FALSE)
7467 {
7468 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DECODE_STATUS ) );
7469 return E_MVD_STAT_UNKNOWN;
7470 }
7471
7472 switch(mvdcmd.Arg1)
7473 {
7474 case DEC_STAT_IDLE:
7475 stat = E_MVD_STAT_IDLE;
7476 break;
7477 case DEC_STAT_FIND_SC:
7478 stat = E_MVD_STAT_FIND_STARTCODE;
7479 break;
7480 case DEC_STAT_FIND_SPE_SC:
7481 stat = E_MVD_STAT_FIND_SPECIALCODE;
7482 break;
7483 case DEC_STAT_FIND_FRAMEBUFFER:
7484 stat = E_MVD_STAT_FIND_FRAMEBUFFER;
7485 break;
7486 case DEC_STAT_WAIT_DECODE_DONE:
7487 stat = E_MVD_STAT_WAIT_DECODEDONE;
7488 break;
7489 case DEC_STAT_DECODE_DONE:
7490 stat = E_MVD_STAT_DECODE_DONE;
7491 break;
7492 case DEC_STAT_WAIT_VDFIFO:
7493 stat = E_MVD_STAT_WAIT_VDFIFO;
7494 break;
7495 case DEC_STAT_INIT_SUCCESS:
7496 stat = E_MVD_STAT_INIT_SUCCESS;
7497 break;
7498 default:
7499 break;
7500 }
7501
7502 return stat;
7503 }
7504
HAL_MVD_GetLastCmd(MS_U8 u8Idx)7505 MS_U8 HAL_MVD_GetLastCmd(MS_U8 u8Idx)
7506 {
7507 MVD_CmdArg mvdcmd;
7508 SETUP_CMDARG(mvdcmd);
7509 SET_DECNUM(mvdcmd, u8Idx);
7510 if (HAL_MVD_MVDCommand( CMD_DECODE_STATUS, &mvdcmd ) == FALSE)
7511 {
7512 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DECODE_STATUS ) );
7513 return 0xff;
7514 }
7515
7516 return (mvdcmd.Arg0);
7517 }
7518
HAL_MVD_GetParserByteCnt(MS_U8 u8Idx)7519 MS_U32 HAL_MVD_GetParserByteCnt(MS_U8 u8Idx)
7520 {
7521 MVD_CmdArg mvdcmd;
7522 MS_U32 u32Cnt = 0;
7523
7524 SETUP_CMDARG(mvdcmd);
7525
7526 //To be accurate, it's "VLD byte count", instead of "parser byte count".
7527 mvdcmd.Arg0 = 0x34;
7528 mvdcmd.Arg1 = 0x2;
7529 SET_DECNUM(mvdcmd, u8Idx);
7530 if (HAL_MVD_MVDCommand( CMD_RD_IO, &mvdcmd ) == FALSE)
7531 {
7532 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail!!\r\n", CMD_RD_IO ) );
7533 return 0;
7534 }
7535 u32Cnt = (((MS_U32)mvdcmd.Arg2)) | ((MS_U32)mvdcmd.Arg3 << 8) |
7536 (((MS_U32)mvdcmd.Arg4) << 16) | (((MS_U32)mvdcmd.Arg5) << 24);
7537
7538 //printf(" parser byte count = %lu byte \n", u32Cnt);
7539 return u32Cnt;
7540 }
7541
HAL_MVD_DropErrorFrame(MS_U8 u8Idx,MS_BOOL bDrop)7542 MS_BOOL HAL_MVD_DropErrorFrame(MS_U8 u8Idx, MS_BOOL bDrop)
7543 {
7544 MVD_CmdArg mvdcmd;
7545 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
7546
7547 SETUP_CMDARG(mvdcmd);
7548 mvdcmd.Arg1 = (MS_U8)bDrop;
7549 mvdcmd.Arg2 = (MS_U8)pstCtrlCfg->bDropDispfrm;
7550 mvdcmd.Arg3 = (MS_U8)pstCtrlCfg->eFrcMode;
7551 SET_DECNUM(mvdcmd, u8Idx);
7552 SET_CMD_RET_FALSE(CMD_DISPLAY_CTL, &mvdcmd);
7553 return TRUE;
7554 }
7555
HAL_MVD_SetDivXCfg(MS_U8 u8Idx,MS_U8 u8MvAdjust,MS_U8 u8IdctSel)7556 void HAL_MVD_SetDivXCfg(MS_U8 u8Idx, MS_U8 u8MvAdjust, MS_U8 u8IdctSel)
7557 {
7558 MVD_CmdArg stCmdArg;
7559
7560 SETUP_CMDARG(stCmdArg);
7561 stCmdArg.Arg0 = u8MvAdjust;
7562 SET_DECNUM(stCmdArg, u8Idx);
7563 if (HAL_MVD_MVDCommand(CMD_DIVX_PATCH, &stCmdArg) == FALSE)
7564 {
7565 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DIVX_PATCH ) );
7566 return;
7567 }
7568
7569 SETUP_CMDARG(stCmdArg);
7570 stCmdArg.Arg0 = u8IdctSel;
7571 SET_DECNUM(stCmdArg, u8Idx);
7572 if (HAL_MVD_MVDCommand(CMD_IDCT_SEL, &stCmdArg) == FALSE)
7573 {
7574 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_IDCT_SEL ) );
7575 return;
7576 }
7577
7578 return;
7579 }
7580
7581 #define _IsNotInStreamBuff(x) \
7582 (((x) < pstMemCfg->u32DrvBufSize) || \
7583 ((x) > pstMemCfg->u32BSSize) )
7584
7585 //------------------------------------------------------------------------------
7586 /// Get read pointer in ElementaryStream buffer for SLQ table mode
7587 /// @return -the read pointer
7588 //------------------------------------------------------------------------------
MVD_GetSlqTblESReadPtr(MS_U8 u8Idx)7589 MS_VIRT MVD_GetSlqTblESReadPtr(MS_U8 u8Idx)
7590 {
7591 MS_U32 u32Idx;
7592 MS_U32 u32SlqRp = 0, u32SlqRp1 = 0;
7593 MS_VIRT u32EsRp;
7594 MS_VIRT u32EsStart;
7595 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
7596 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
7597 MVD_CodecType curCodecType = HAL_MVD_GetCodecType(u8Idx);
7598
7599 u32SlqRp1 = HAL_MVD_GetSLQReadPtr(u8Idx);
7600
7601 if (u32SlqRp1 == 0)
7602 {
7603 return MVD_U32_MAX;
7604 }
7605 else
7606 {
7607 u32SlqRp = HAL_MVD_Map2DrvSlqTbl(u8Idx, u32SlqRp1);
7608 }
7609
7610 pstSlqTblInfo->pDrvSlqTbl->u32RdPtr = u32SlqRp; //update pstSlqTblInfo->pDrvSlqTbl->u32RdPtr
7611
7612 //report (readPtr-1) for HW may still use (readPtr)
7613 if (u32SlqRp > (pstSlqTblInfo->pDrvSlqTbl->u32StAdd))
7614 {
7615 u32Idx = ((u32SlqRp - pstSlqTblInfo->pDrvSlqTbl->u32StAdd)/SLQ_ENTRY_LEN) - 1;
7616 }
7617 else
7618 {
7619 u32Idx = SLQ_ENTRY_MAX - 1;
7620 }
7621 u32EsRp = pstSlqTblInfo->pDrvEsTbl->u32StAdd + u32Idx*8;
7622
7623 u32EsStart = HAL_MVD_MemRead4Byte(u32EsRp); //report StartAdd as read_pointer
7624 #if 0
7625 MS_U32 u32EsEnd;
7626 u32EsEnd = HAL_MVD_MemRead4Byte(u32EsRp+4);
7627 printf("GetESReadPtr ES[%x] Start=0x%x End=0x%x u32EsRp=%x u32SlqRp=%x\n",
7628 u32Idx, HAL_MVD_MemRead4Byte(u32EsRp), u32EsEnd, u32EsRp, u32SlqRp);
7629 #endif
7630
7631 if ((_IsNotInStreamBuff(u32EsStart)) && (u32EsStart != 0))
7632 { //ESRead is not in BS buffer, so this entry is a divx or dummy pattern.
7633 //Report the last ESRead, instead of this one.
7634 if(curCodecType == E_MVD_CODEC_DIVX311)
7635 {
7636 //update last slq index es end address
7637 if(u32Idx == 0)
7638 {
7639 u32Idx = SLQ_ENTRY_MAX-1;
7640 }
7641 else
7642 {
7643 u32Idx = u32Idx-1;
7644 }
7645 u32EsRp = pstSlqTblInfo->pDrvEsTbl->u32StAdd + u32Idx*8;
7646 u32EsStart = HAL_MVD_MemRead4Byte(u32EsRp); //report StartAdd as read_pointer
7647 if(_IsNotInStreamBuff(u32EsStart))
7648 {
7649 return (pstSlqTblInfo->u32PreEsRd);
7650 }
7651 }
7652 else
7653 {
7654 MVD_DEBUGINFO(printf("0x%lx Not in BS, report u32PreEsRd=0x%lx\n", (unsigned long)u32EsStart, (unsigned long)pstSlqTblInfo->u32PreEsRd));
7655 return (pstSlqTblInfo->u32PreEsRd);
7656 }
7657 }
7658 pstSlqTblInfo->u32PreEsRd = u32EsStart;
7659
7660 return u32EsStart;
7661 }
7662
7663 //------------------------------------------------------------------------------
7664 /// Get write pointer in ElementaryStream buffer for SLQ table mode
7665 /// @return -the read pointer
7666 //------------------------------------------------------------------------------
MVD_GetSlqTblESWritePtr(MS_U8 u8Idx)7667 MS_VIRT MVD_GetSlqTblESWritePtr(MS_U8 u8Idx)
7668 {
7669 MS_VIRT u32EsWp;
7670 MS_VIRT u32EsEnd;
7671 MS_U32 u32Idx;
7672 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
7673 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
7674
7675 if (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr > (pstSlqTblInfo->pDrvSlqTbl->u32StAdd))
7676 {
7677 u32Idx = ((pstSlqTblInfo->pDrvSlqTbl->u32WrPtr - pstSlqTblInfo->pDrvSlqTbl->u32StAdd)/SLQ_ENTRY_LEN) - 1;
7678 }
7679 else
7680 {
7681 u32Idx = SLQ_ENTRY_MAX - 1;
7682 }
7683 u32EsWp = pstSlqTblInfo->pDrvEsTbl->u32StAdd + u32Idx*8;
7684
7685 u32EsEnd = HAL_MVD_MemRead4Byte(u32EsWp+4);
7686 #if 0
7687 printf("GetESWritePtr[%x] ES Start=0x%x End=0x%x u32EsWp=%x\n",
7688 (u32EsWp - pstSlqTblInfo->pDrvEsTbl->u32StAdd)/8,
7689 HAL_MVD_MemRead4Byte(u32EsWp), u32EsEnd, u32EsWp);
7690 #endif
7691
7692 if ((_IsNotInStreamBuff(u32EsEnd)) && (u32EsEnd != 0))
7693 { //ESRead is not in BS buffer, so this entry is a divx pattern.
7694 //Report the last ESRead, instead of this one.
7695 MVD_DEBUGINFO(printf("0x%lx Not in BS, report u32PreEsWr=0x%lx\n", (unsigned long)u32EsEnd, (unsigned long)pstSlqTblInfo->u32PreEsWr));
7696 return (pstSlqTblInfo->u32PreEsWr);
7697 }
7698 pstSlqTblInfo->u32PreEsWr = u32EsEnd;
7699
7700 return u32EsEnd;
7701 }
7702
7703
HAL_MVD_GetSLQReadPtr(MS_U8 u8Idx)7704 MS_VIRT HAL_MVD_GetSLQReadPtr(MS_U8 u8Idx)
7705 {
7706 MS_VIRT u32RdPtr = 0;
7707
7708 if (!(pMVDHalContext->bSlqTblHKCtrl[u8Idx]))
7709 {
7710 #ifndef VDEC3
7711 MVD_CmdArg mvdcmd;
7712 SETUP_CMDARG(mvdcmd);
7713 SET_DECNUM(mvdcmd, u8Idx);
7714 if (HAL_MVD_MVDCommand( CMD_SLQ_GET_TBL_RPTR, &mvdcmd ) == FALSE)
7715 {
7716 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SLQ_GET_TBL_RPTR ) );
7717 return 0;
7718 }
7719 u32RdPtr = mvdcmd.Arg0 | (mvdcmd.Arg1<<8) | (mvdcmd.Arg2<<16) | (mvdcmd.Arg3<<24);
7720 #else
7721 u32RdPtr = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SLQ_TBL_RPTR, sizeof(MS_U32));
7722 #endif
7723 }
7724 else
7725 {
7726 u32RdPtr = HAL_MVD_SlqTblProbeRdPtr(u8Idx);
7727 }
7728
7729 //printf("##### HAL_MVD_GetSLQReadPtr 0x%x\n", readPtr);
7730
7731 if(u32RdPtr == 0)//not start decode yet,MVD return 0
7732 {
7733 u32RdPtr = 0;
7734 }
7735 else
7736 {
7737 u32RdPtr = u32RdPtr << 3;
7738 }
7739
7740 return u32RdPtr;
7741 }
7742
7743
HAL_MVD_SetSLQWritePtr(MS_U8 u8Idx,MS_BOOL bCheckData)7744 MS_BOOL HAL_MVD_SetSLQWritePtr(MS_U8 u8Idx, MS_BOOL bCheckData)
7745 {
7746 MVD_CmdArg mvdcmd;
7747 MS_VIRT u32WrPtr;
7748 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
7749 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
7750 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
7751
7752 if (FALSE == pstSlqTblInfo->bRdyToFireCmd)
7753 {
7754 //check FW is init success and thus ready to update write pointer
7755 MS_U32 u32TimeCnt;
7756
7757 u32TimeCnt = HAL_MVD_GetTime();
7758 while ((HAL_MVD_GetTime() - u32TimeCnt) < CMD_TIMEOUT_MS)
7759 {
7760 if (HAL_MVD_GetDecodeStatus(u8Idx) != E_MVD_STAT_IDLE)
7761 {
7762 pstSlqTblInfo->bRdyToFireCmd = TRUE;
7763 MVD_DEBUGVERBAL(printf("time=0x%x ms, ", (HAL_MVD_GetTime() - u32TimeCnt)));
7764 break;
7765 }
7766 }
7767 if (FALSE == pstSlqTblInfo->bRdyToFireCmd)
7768 {
7769 MVD_DEBUGERROR(printf("%s: err timeout(%d)! stat=0x%x\n", __FUNCTION__,
7770 HAL_MVD_GetTime() - u32TimeCnt, HAL_MVD_GetDecodeStatus(u8Idx)));
7771 return FALSE;
7772 }
7773 else
7774 {
7775 MVD_DEBUGVERBAL(printf("%s: ready to update WrPtr.\n", __FUNCTION__));
7776 }
7777 }
7778
7779
7780 MS_ASSERT(pstSlqTblInfo->pDrvSlqTbl->u32WrPtr < pstSlqTblInfo->pDrvSlqTbl->u32EndAdd);
7781 MS_ASSERT(pstSlqTblInfo->pDrvSlqTbl->u32WrPtr >= pstSlqTblInfo->pDrvSlqTbl->u32StAdd);
7782 #if SLQ_NEW_PUSH
7783 if((!pstSlqTblInfo->pSlqStatus->bSlqFireRdy)&&pstSlqTblInfo->pSlqStatus->bSlqCtrlBit)
7784 {
7785 MVD_DEBUGINFO(printf("**** pstSlqTblInfo->pSlqStatus->bSlqFireRdy is not Ready ** \n"));
7786 return FALSE;
7787 }
7788 pstSlqTblInfo->pSlqStatus->bSlqFireRdy = FALSE;
7789 #endif
7790 if ((bCheckData==TRUE) && (FALSE==pstSlqTblInfo->bSlqTblHasValidData))
7791 {
7792 MVD_DEBUGINFO(printf("**** SlqWrPtr(0x%lx) is not update!(%x, %x) ****\n",
7793 (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32WrPtr, bCheckData, pstSlqTblInfo->bSlqTblHasValidData));
7794 return FALSE;
7795 }
7796 pstSlqTblInfo->bSlqTblHasValidData = FALSE;
7797
7798 if (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr != pstSlqTblInfo->pDrvSlqTbl->u32EndAdd)
7799 {
7800 u32WrPtr = pstSlqTblInfo->pDrvSlqTbl->u32WrPtr;
7801 }
7802 else
7803 {
7804 u32WrPtr = pstSlqTblInfo->pDrvSlqTbl->u32StAdd;
7805 }
7806
7807 if (pstCtrlCfg->bSlqTblSync)
7808 {
7809 //Update SLQ table, DivX311 patterns, and dummy patterns to bitstream buffer
7810 MS_VIRT u32SrcOffset = pstSlqTblInfo->pDrvSlqTbl->u32StAdd;
7811 MS_VIRT u32SrcAdd = u32SrcOffset;
7812 MS_VIRT u32DstAdd = pstMemCfg->u32BSAddr;
7813 MS_VIRT u32DstOffset = HAL_MVD_GetMemOffset(pstMemCfg->u32BSAddr);
7814 MS_VIRT u32TblWr;
7815
7816 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32SrcOffset,u32SrcAdd);
7817
7818
7819 HAL_MVD_CPU_Sync();
7820
7821 #ifndef MSOS_TYPE_LINUX_KERNEL//BDMA
7822 BDMA_Result bdmaRlt;
7823
7824 bdmaRlt = MDrv_BDMA_CopyHnd(u32SrcAdd, u32DstAdd, pstMemCfg->u32DrvBufSize, pstSlqTblInfo->bdmaCpyType, BDMA_OPCFG_DEF);
7825
7826 if (E_BDMA_OK != bdmaRlt)
7827 {
7828 MVD_DEBUGERROR(printf("%s MDrv_BDMA_MemCopy fail ret=%x!\n", __FUNCTION__, bdmaRlt));
7829 }
7830 #endif
7831 MVD_DEBUGINFO(printf("SlqWrPtr_BDMA src=0x%lx dst=0x%lx size=0x%lx cpyType=0x%x\n",
7832 (unsigned long)u32SrcAdd, (unsigned long)u32DstAdd, (unsigned long)pstMemCfg->u32DrvBufSize, pstSlqTblInfo->bdmaCpyType));
7833
7834 u32TblWr = u32DstOffset + (u32WrPtr - pstSlqTblInfo->pDrvSlqTbl->u32StAdd);
7835
7836 u32WrPtr = u32TblWr;
7837 }
7838 //printf("wPtr= 0x%x(0x%x) rPtr=0x%x(0x%x)\n", writePtr, pstSlqTblInfo->pDrvSlqTbl->u32WrPtr,
7839 // HAL_MVD_GetSLQReadPtr(u8Idx), pstSlqTblInfo->pDrvSlqTbl->u32RdPtr);
7840
7841
7842 //writePtrLast[u8Idx] = u32WrPtr;
7843 #if SLQ_NEW_PUSH
7844 if(!pstSlqTblInfo->pSlqStatus->bSlqEnLastFrameShow && pstSlqTblInfo->pSlqStatus->bSlqCtrlBit)
7845 {
7846 u32WrPtr = pstSlqTblInfo->pSlqStatus->u32VaildWptrAddr;
7847 }
7848 #endif
7849 MS_ASSERT((u32WrPtr%8)==0);
7850 u32WrPtr >>= 3;
7851
7852 if (!(pMVDHalContext->bSlqTblHKCtrl[u8Idx]))
7853 {
7854 SET_CMDARG(mvdcmd, u32WrPtr, u8Idx);
7855 HAL_MVD_CPU_Sync();
7856 SET_CMD_RET_FALSE(CMD_SLQ_UPDATE_TBL_WPTR, &mvdcmd);
7857 }
7858 else
7859 {
7860 HAL_MVD_SlqTblLoadWrPtr(u8Idx, u32WrPtr);
7861 if (HAL_MVD_SlqTblProbeWrPtr(u8Idx) != u32WrPtr)
7862 {
7863 MVD_DEBUGERROR(printf("Ooops! SlqWrPtr update fail!!! 0x%lx != 0x%lx\n", (unsigned long)HAL_MVD_SlqTblProbeWrPtr(u8Idx), (unsigned long)u32WrPtr));
7864 return FALSE;
7865 }
7866 }
7867
7868 return TRUE;
7869 }
7870
HAL_MVD_SetOverflowTH(MS_U8 u8Idx,MS_U32 u32Threshold)7871 void HAL_MVD_SetOverflowTH(MS_U8 u8Idx, MS_U32 u32Threshold)
7872 {
7873 MVD_CmdArg mvdcmd;
7874
7875 MS_ASSERT((u32Threshold%8)==0);
7876 u32Threshold >>= 3;
7877 SET_CMDARG(mvdcmd, u32Threshold, u8Idx);
7878 if (HAL_MVD_MVDCommand( CMD_DMA_OVFTH, &mvdcmd ) == FALSE)
7879 {
7880 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DMA_OVFTH ) );
7881 return;
7882 }
7883 return;
7884 }
7885
7886 //------------------------------------------------------------------------------
7887 /// Set bitstream buffer underflow threshold
7888 /// @return -none
7889 //------------------------------------------------------------------------------
HAL_MVD_SetUnderflowTH(MS_U8 u8Idx,MS_U32 u32Threshold)7890 void HAL_MVD_SetUnderflowTH(MS_U8 u8Idx, MS_U32 u32Threshold)
7891 {
7892 MVD_CmdArg mvdcmd;
7893
7894 MS_ASSERT((u32Threshold%8)==0);
7895 u32Threshold >>= 3;
7896 SET_CMDARG(mvdcmd, u32Threshold, u8Idx);
7897 if (HAL_MVD_MVDCommand( CMD_DMA_UNFTH, &mvdcmd ) == FALSE)
7898 {
7899 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DMA_UNFTH ) );
7900 return;
7901 }
7902 return;
7903 }
7904
HAL_MVD_GenPattern(MS_U8 u8Idx,MVD_PatternType ePattern,MS_PHY u32PAddr,MS_U32 * pu32Size)7905 MS_BOOL HAL_MVD_GenPattern(MS_U8 u8Idx, MVD_PatternType ePattern, MS_PHY u32PAddr, MS_U32* pu32Size)
7906 {
7907 MS_U8* pu8DummyData = NULL;
7908 MVD_CodecType curCodecType = HAL_MVD_GetCodecType(u8Idx);
7909
7910 if ((!pu32Size) || (*pu32Size < SKIP_PATTERN_SIZE))
7911 {
7912 return FALSE;
7913 }
7914
7915 pu8DummyData = (MS_U8*) HAL_MVD_PA2NonCacheSeg(u32PAddr);
7916
7917 if(pu8DummyData == NULL)
7918 {
7919 printf("%s %d NULL Address\n",__FILE__,__LINE__);
7920 return FALSE;
7921 }
7922
7923 switch (ePattern)
7924 {
7925 case E_MVD_PATTERN_FLUSH:
7926 #if 0
7927 *pu8DummyData = SKIP_PATTERN_0;
7928 pu8DummyData++;
7929 *pu8DummyData = SKIP_PATTERN_1;
7930 *pu32Size = SKIP_PATTERN_SIZE;
7931 #else
7932 pu8DummyData[0] = SKIP_PATTERN_0&0xff;
7933 pu8DummyData[1] = (SKIP_PATTERN_0>>8)&0xff;
7934 pu8DummyData[2] = (SKIP_PATTERN_0>>16)&0xff;
7935 pu8DummyData[3] = (SKIP_PATTERN_0>>24)&0xff;
7936
7937 pu8DummyData[4] = SKIP_PATTERN_1&0xff;
7938 pu8DummyData[5] = (SKIP_PATTERN_1>>8)&0xff;
7939 pu8DummyData[6] = (SKIP_PATTERN_1>>16)&0xff;
7940 pu8DummyData[7] = (SKIP_PATTERN_1>>24)&0xff;
7941
7942 *pu32Size = SKIP_PATTERN_SIZE;
7943 #endif
7944 break;
7945 case E_MVD_PATTERN_FILEEND:
7946 if ((E_MVD_CODEC_FLV == curCodecType)||(E_MVD_CODEC_MPEG4_SHORT_VIDEO_HEADER == curCodecType))
7947 {
7948 #if 0
7949 *pu8DummyData = FLV_PATTERN;
7950 pu8DummyData++;
7951 *pu8DummyData = 0xffffffff;
7952 pu8DummyData++;
7953 *pu8DummyData = END_PATTERN_1;
7954 pu8DummyData++;
7955 *pu8DummyData = END_PATTERN_2;
7956 pu8DummyData++;
7957 *pu8DummyData = END_PATTERN_3;
7958 #else
7959 pu8DummyData[0] = FLV_PATTERN&0xff;
7960 pu8DummyData[1] = (FLV_PATTERN>>8)&0xff;
7961 pu8DummyData[2] = (FLV_PATTERN>>16)&0xff;
7962 pu8DummyData[3] = (FLV_PATTERN>>24)&0xff;
7963
7964 pu8DummyData[4] = 0xffffffff&0xff;
7965 pu8DummyData[5] = (0xffffffff>>8)&0xff;
7966 pu8DummyData[6] = (0xffffffff>>16)&0xff;
7967 pu8DummyData[7] = (0xffffffff>>24)&0xff;
7968
7969 pu8DummyData[8] = END_PATTERN_1&0xff;
7970 pu8DummyData[9] = (END_PATTERN_1>>8)&0xff;
7971 pu8DummyData[10] = (END_PATTERN_1>>16)&0xff;
7972 pu8DummyData[11] = (END_PATTERN_1>>24)&0xff;
7973
7974 pu8DummyData[12] = END_PATTERN_2&0xff;
7975 pu8DummyData[13] = (END_PATTERN_2>>8)&0xff;
7976 pu8DummyData[14] = (END_PATTERN_2>>16)&0xff;
7977 pu8DummyData[15] = (END_PATTERN_2>>24)&0xff;
7978
7979 pu8DummyData[16] = END_PATTERN_3&0xff;
7980 pu8DummyData[17] = (END_PATTERN_3>>8)&0xff;
7981 pu8DummyData[18] = (END_PATTERN_3>>16)&0xff;
7982 pu8DummyData[19] = (END_PATTERN_3>>24)&0xff;
7983
7984 #endif
7985
7986 }
7987 else if (E_MVD_CODEC_DIVX311 == curCodecType)
7988 {
7989 #if 0
7990 *pu8DummyData = DIVX_PATTERN;
7991 pu8DummyData++;
7992 *pu8DummyData = 0xffffffff;
7993 pu8DummyData++;
7994 *pu8DummyData = END_PATTERN_1;
7995 pu8DummyData++;
7996 *pu8DummyData = END_PATTERN_2;
7997 pu8DummyData++;
7998 *pu8DummyData = END_PATTERN_3;
7999 #else
8000 pu8DummyData[0] = DIVX_PATTERN&0xff;
8001 pu8DummyData[1] = (DIVX_PATTERN>>8)&0xff;
8002 pu8DummyData[2] = (DIVX_PATTERN>>16)&0xff;
8003 pu8DummyData[3] = (DIVX_PATTERN>>24)&0xff;
8004
8005 pu8DummyData[4] = 0xffffffff&0xff;
8006 pu8DummyData[5] = (0xffffffff>>8)&0xff;
8007 pu8DummyData[6] = (0xffffffff>>16)&0xff;
8008 pu8DummyData[7] = (0xffffffff>>24)&0xff;
8009
8010 pu8DummyData[8] = END_PATTERN_1&0xff;
8011 pu8DummyData[9] = (END_PATTERN_1>>8)&0xff;
8012 pu8DummyData[10] = (END_PATTERN_1>>16)&0xff;
8013 pu8DummyData[11] = (END_PATTERN_1>>24)&0xff;
8014
8015 pu8DummyData[12] = END_PATTERN_2&0xff;
8016 pu8DummyData[13] = (END_PATTERN_2>>8)&0xff;
8017 pu8DummyData[14] = (END_PATTERN_2>>16)&0xff;
8018 pu8DummyData[15] = (END_PATTERN_2>>24)&0xff;
8019
8020 pu8DummyData[16] = END_PATTERN_3&0xff;
8021 pu8DummyData[17] = (END_PATTERN_3>>8)&0xff;
8022 pu8DummyData[18] = (END_PATTERN_3>>16)&0xff;
8023 pu8DummyData[19] = (END_PATTERN_3>>24)&0xff;
8024 #endif
8025 }
8026 else if ((E_MVD_CODEC_MPEG2 == curCodecType)||(E_MVD_CODEC_MPEG4 == curCodecType))
8027 {
8028 #if 0
8029 *pu8DummyData = MPEG_PATTERN_0;
8030 pu8DummyData++;
8031 *pu8DummyData = END_PATTERN_1;
8032 pu8DummyData++;
8033 *pu8DummyData = END_PATTERN_2;
8034 pu8DummyData++;
8035 *pu8DummyData = END_PATTERN_3;
8036 #else
8037 pu8DummyData[0] = MPEG_PATTERN_0&0xff;
8038 pu8DummyData[1] = (MPEG_PATTERN_0>>8)&0xff;
8039 pu8DummyData[2] = (MPEG_PATTERN_0>>16)&0xff;
8040 pu8DummyData[3] = (MPEG_PATTERN_0>>24)&0xff;
8041
8042 pu8DummyData[4] = END_PATTERN_1&0xff;
8043 pu8DummyData[5] = (END_PATTERN_1>>8)&0xff;
8044 pu8DummyData[6] = (END_PATTERN_1>>16)&0xff;
8045 pu8DummyData[7] = (END_PATTERN_1>>24)&0xff;
8046
8047 pu8DummyData[8] = END_PATTERN_2&0xff;
8048 pu8DummyData[9] = (END_PATTERN_2>>8)&0xff;
8049 pu8DummyData[10] = (END_PATTERN_2>>16)&0xff;
8050 pu8DummyData[11] = (END_PATTERN_2>>24)&0xff;
8051
8052 pu8DummyData[12] = END_PATTERN_3&0xff;
8053 pu8DummyData[13] = (END_PATTERN_3>>8)&0xff;
8054 pu8DummyData[14] = (END_PATTERN_3>>16)&0xff;
8055 pu8DummyData[15] = (END_PATTERN_3>>24)&0xff;
8056 #endif
8057 }
8058 else
8059 {
8060 #if 0
8061 *pu8DummyData = END_PATTERN_0;
8062 pu8DummyData++;
8063 *pu8DummyData = END_PATTERN_1;
8064 pu8DummyData++;
8065 *pu8DummyData = END_PATTERN_2;
8066 pu8DummyData++;
8067 *pu8DummyData = END_PATTERN_3;
8068 #else
8069 pu8DummyData[0] = END_PATTERN_0&0xff;
8070 pu8DummyData[1] = (END_PATTERN_0>>8)&0xff;
8071 pu8DummyData[2] = (END_PATTERN_0>>16)&0xff;
8072 pu8DummyData[3] = (END_PATTERN_0>>24)&0xff;
8073
8074 pu8DummyData[4] = END_PATTERN_1&0xff;
8075 pu8DummyData[5] = (END_PATTERN_1>>8)&0xff;
8076 pu8DummyData[6] = (END_PATTERN_1>>16)&0xff;
8077 pu8DummyData[7] = (END_PATTERN_1>>24)&0xff;
8078
8079 pu8DummyData[8] = END_PATTERN_2&0xff;
8080 pu8DummyData[9] = (END_PATTERN_2>>8)&0xff;
8081 pu8DummyData[10] = (END_PATTERN_2>>16)&0xff;
8082 pu8DummyData[11] = (END_PATTERN_2>>24)&0xff;
8083
8084 pu8DummyData[12] = END_PATTERN_3&0xff;
8085 pu8DummyData[13] = (END_PATTERN_3>>8)&0xff;
8086 pu8DummyData[14] = (END_PATTERN_3>>16)&0xff;
8087 pu8DummyData[15] = (END_PATTERN_3>>24)&0xff;
8088 #endif
8089 }
8090 *pu32Size = 16;
8091 break;
8092 default:
8093 break;
8094 }
8095
8096 return TRUE;
8097 }
8098
8099
8100
HAL_MVD_DbgDump(MS_U8 u8Idx)8101 void HAL_MVD_DbgDump(MS_U8 u8Idx)
8102 {
8103 MS_U32 u32VdCnt=0;
8104 //static MS_U32 u32PreVdCnt[MAX_DEC_NUM]= {0, 0};
8105 MS_U32 u32ErrCnt=0;
8106 //static MS_U32 u32PreErrCnt[MAX_DEC_NUM]= {0, 0};
8107 //static MS_BOOL b1stDump[MAX_DEC_NUM]= {TRUE, TRUE};
8108 MVD_FrmInfo stFrm = {_INIT_ADDR, _INIT_ADDR, _INIT_TIMESTAMP, _INIT_ID,
8109 _INIT_ID, _INIT_LEN, _INIT_LEN, _INIT_LEN, 0xff, E_MVD_PIC_UNKNOWN};
8110 MVD_SrcMode curSrcMode = HAL_MVD_GetSrcMode(u8Idx);
8111 #ifndef VDEC3
8112 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
8113 #endif
8114 if (pMVDHalContext->b1stDump[u8Idx])
8115 {
8116 MVD_FWCfg* pFwCfg = NULL;
8117 pFwCfg = HAL_MVD_GetFWCfg(u8Idx);
8118 printf("curDisablePESParsing = %d\n", pFwCfg->bDisablePESParsing);
8119 pMVDHalContext->b1stDump[u8Idx] = FALSE;
8120 }
8121
8122 u32VdCnt = HAL_MVD_GetParserByteCnt(u8Idx);
8123 u32ErrCnt= HAL_MVD_GetVldErrCount(u8Idx);
8124 printf("input: vfifo=%d(full=%d,empty=%d), vdCnt=%d(%d), vldErr=%d(%d); ",
8125 HAL_MVD_RegReadByte(0x1564)>>6, HAL_MVD_RegReadByte(0x1564)&0x20,
8126 HAL_MVD_RegReadByte(0x1564)&0x10, u32VdCnt, (u32VdCnt-pMVDHalContext->u32PreVdCnt[u8Idx]),
8127 u32ErrCnt, (u32ErrCnt-pMVDHalContext->u32PreErrCnt[u8Idx]));
8128 pMVDHalContext->u32PreVdCnt[u8Idx] = u32VdCnt;
8129 pMVDHalContext->u32PreErrCnt[u8Idx] = u32ErrCnt;
8130
8131 printf("state: fw=0x%x, lastCmd=0x%x, pc=0x%x\n",
8132 HAL_MVD_GetDecodeStatus(u8Idx), HAL_MVD_GetLastCmd(u8Idx), HAL_VPU_EX_GetProgCnt());
8133 printf("cnt: dec=%d, skip=%d, drop=%ld\n", HAL_MVD_GetPicCounter(u8Idx), HAL_MVD_GetSkipPicCounter(u8Idx), 0x0UL);
8134 HAL_MVD_GetFrmInfo(u8Idx, E_MVD_FRMINFO_DECODE, &stFrm);
8135 printf("frm Dec Y=%lx UV=%lx Pitch=%x; ", (unsigned long)stFrm.u32LumaAddr, (unsigned long)stFrm.u32ChromaAddr, stFrm.u16Pitch);
8136 HAL_MVD_GetFrmInfo(u8Idx, E_MVD_FRMINFO_DISPLAY, &stFrm);
8137 printf("Disp Y=%lx UV=%lx Pitch=%x\n", (unsigned long)stFrm.u32LumaAddr, (unsigned long)stFrm.u32ChromaAddr, stFrm.u16Pitch);
8138 if (curSrcMode == E_MVD_SLQ_TBL_MODE)
8139 {
8140 #ifndef VDEC3
8141 printf("fe=%x, rd=%x(%x), wr=%x, empty=%x; ", pstSlqTblInfo->u32FileEndPtr, pstSlqTblInfo->pDrvSlqTbl->u32RdPtr,
8142 HAL_MVD_Map2DrvSlqTbl(u8Idx, HAL_MVD_GetSLQReadPtr(u8Idx)), pstSlqTblInfo->pDrvSlqTbl->u32WrPtr, pstSlqTblInfo->pDrvSlqTbl->u32Empty);
8143
8144 printf("es rd=0x%lx, wr=0x%lx\n", (unsigned long)MVD_GetSlqTblESReadPtr(u8Idx), (unsigned long)MVD_GetSlqTblESWritePtr(u8Idx));
8145 #endif
8146 }
8147 else if (curSrcMode == E_MVD_TS_FILE_MODE)
8148 {
8149 printf("es rd=0x%lx, wr=0x%lx\n", (unsigned long)HAL_MVD_GetTsFileESReadPtr(u8Idx), (unsigned long)HAL_MVD_GetTsFileESWritePtr(u8Idx));
8150 }
8151 }
8152
8153 #ifdef MS_DEBUG
8154 #define _STRINGIFY_HAL_SID(x) \
8155 (x==E_HAL_MVD_MAIN_STREAM0)?"E_HAL_MVD_MAIN_STREAM0": \
8156 ((x==E_HAL_MVD_SUB_STREAM0)?"E_HAL_MVD_SUB_STREAM0":"E_HAL_MVD_STREAM_NONE")
MVD_DumpMVDStream(void)8157 void MVD_DumpMVDStream(void)
8158 {
8159 //if (_u8HalDbgLevel == 0) return;
8160 MS_U8 i = 0;
8161 for (i=0; i< MAX_DEC_NUM; i++)
8162 {
8163 MVD_DEBUGINFO(printf("[%d] eStreamId=0x%x(%s) bUsed=0x%x\n", i, pMVDHalContext->_stMVDStream[i].eStreamId,
8164 _STRINGIFY_HAL_SID(pMVDHalContext->_stMVDStream[i].eStreamId), pMVDHalContext->_stMVDStream[i].bUsed));
8165 }
8166 }
8167 #endif
HAL_MVD_Init_Share_Mem(void)8168 MS_BOOL HAL_MVD_Init_Share_Mem(void)
8169 {
8170 #if (defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_ECOS) || defined(MSOS_TYPE_LINUX_KERNEL))
8171 #if !defined(SUPPORT_X_MODEL_FEATURE)
8172 MS_U32 u32ShmId;
8173 MS_VIRT u32Addr;
8174 MS_U32 u32BufSize;
8175
8176
8177 if (FALSE == MsOS_SHM_GetId( (MS_U8*)"Linux MVD HAL",
8178 sizeof(MVD_Hal_CTX),
8179 &u32ShmId,
8180 &u32Addr,
8181 &u32BufSize,
8182 MSOS_SHM_QUERY))
8183 {
8184 if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux MVD HAL",
8185 sizeof(MVD_Hal_CTX),
8186 &u32ShmId,
8187 &u32Addr,
8188 &u32BufSize,
8189 MSOS_SHM_CREATE))
8190 {
8191 printf("[%s]SHM allocation failed!!! use global structure instead!!!\n",__FUNCTION__);
8192 if(pMVDHalContext == NULL)
8193 {
8194 pMVDHalContext = &gMVDHalContext;
8195 memset(pMVDHalContext,0,sizeof(MVD_Hal_CTX));
8196 HAL_MVD_Context_Init();
8197 printf("[%s]Global structure init Success!!!\n",__FUNCTION__);
8198 }
8199 else
8200 {
8201 printf("[%s]Global structure exists!!!\n",__FUNCTION__);
8202 }
8203 //return FALSE;
8204 }
8205 else
8206 {
8207 memset((MS_U8*)u32Addr,0,sizeof(MVD_Hal_CTX));
8208 pMVDHalContext = (MVD_Hal_CTX*)u32Addr; // for one process
8209 HAL_MVD_Context_Init();
8210 }
8211 }
8212 else
8213 {
8214 pMVDHalContext = (MVD_Hal_CTX*)u32Addr; // for another process
8215 }
8216 #else
8217 if(pMVDHalContext == NULL)
8218 {
8219 pMVDHalContext = &gMVDHalContext;
8220 memset(pMVDHalContext,0,sizeof(MVD_Hal_CTX));
8221 HAL_MVD_Context_Init();
8222 }
8223 #endif
8224 OSAL_MVD_MutexInit();
8225 #else
8226 if(pMVDHalContext == NULL)
8227 {
8228 pMVDHalContext = &gMVDHalContext;
8229 memset(pMVDHalContext,0,sizeof(MVD_Hal_CTX));
8230 HAL_MVD_Context_Init();
8231 }
8232 #endif
8233
8234
8235 return TRUE;
8236
8237 }
8238
8239 //------------------------------------------------------------------------------
HAL_MVD_GetFreeStream(HAL_MVD_StreamType eStreamType)8240 HAL_MVD_StreamId HAL_MVD_GetFreeStream(HAL_MVD_StreamType eStreamType)
8241 {
8242 MS_U32 i = 0;
8243
8244 #ifdef MS_DEBUG
8245 MVD_DumpMVDStream();
8246 #endif
8247 if (eStreamType == E_HAL_MVD_MAIN_STREAM)
8248 {
8249 for (i = 0;
8250 i <
8251 ((E_HAL_MVD_MAIN_STREAM_MAX - E_HAL_MVD_MAIN_STREAM_BASE) +
8252 (E_HAL_MVD_SUB_STREAM_MAX - E_HAL_MVD_SUB_STREAM_BASE)); i++)
8253 {
8254 if ((E_HAL_MVD_MAIN_STREAM_BASE & pMVDHalContext->_stMVDStream[i].eStreamId) && (FALSE == pMVDHalContext->_stMVDStream[i].bUsed))
8255 {
8256 return pMVDHalContext->_stMVDStream[i].eStreamId;
8257 }
8258 }
8259 }
8260 else if (eStreamType == E_HAL_MVD_SUB_STREAM)
8261 {
8262 for (i = 0;
8263 i <
8264 ((E_HAL_MVD_MAIN_STREAM_MAX - E_HAL_MVD_MAIN_STREAM_BASE) +
8265 (E_HAL_MVD_SUB_STREAM_MAX - E_HAL_MVD_SUB_STREAM_BASE)); i++)
8266 {
8267 if ((E_HAL_MVD_SUB_STREAM_BASE & pMVDHalContext->_stMVDStream[i].eStreamId) && (FALSE == pMVDHalContext->_stMVDStream[i].bUsed))
8268 {
8269 return pMVDHalContext->_stMVDStream[i].eStreamId;
8270 }
8271 }
8272 }
8273 #ifdef VDEC3
8274 else if ((eStreamType >= E_HAL_MVD_N_STREAM) && (eStreamType < E_HAL_MVD_N_STREAM + MAX_DEC_NUM))
8275 {
8276 i = eStreamType - E_HAL_MVD_N_STREAM;
8277 if (!pMVDHalContext->_stMVDStream[i].bUsed)
8278 {
8279 return pMVDHalContext->_stMVDStream[i].eStreamId;
8280 }
8281 }
8282 #endif
8283
8284 return E_HAL_MVD_STREAM_NONE;
8285 }
8286
HAL_MVD_SidToIdx(HAL_MVD_StreamId eSID)8287 MS_U8 HAL_MVD_SidToIdx(HAL_MVD_StreamId eSID)
8288 {
8289 #ifdef VDEC3
8290 return eSID - E_HAL_MVD_N_STREAM_BASE;
8291 #else
8292 MS_U8 u8Idx = 0;
8293 switch (eSID)
8294 {
8295 case E_HAL_MVD_MAIN_STREAM0:
8296 u8Idx = 0;
8297 break;
8298 case E_HAL_MVD_SUB_STREAM0:
8299 u8Idx = 1;
8300 break;
8301 #if 0
8302 case E_HAL_MVD_SUB_STREAM1:
8303 u8Idx = 2;
8304 break;
8305 #endif
8306 default:
8307 u8Idx = 0;
8308 break;
8309 }
8310 return u8Idx;
8311 #endif
8312 }
8313
HAL_MVD_ReleaseFdMask(MS_U8 u8Idx,MS_BOOL bRls)8314 MS_BOOL HAL_MVD_ReleaseFdMask(MS_U8 u8Idx, MS_BOOL bRls)
8315 {
8316 MVD_CmdArg mvdcmd;
8317
8318 SETUP_CMDARG(mvdcmd);
8319 mvdcmd.Arg0 = bRls; //1 to release the fd mask
8320 MVD_DEBUGINFO(printf("%s: release=0x%x\n", __FUNCTION__, bRls));
8321 SET_DECNUM(mvdcmd, u8Idx);
8322 SET_CMD_RET_FALSE(CMD_UPDATE_FRAME, &mvdcmd);
8323
8324 return TRUE;
8325 }
8326
HAL_MVD_ParserRstDone(MS_U8 u8Idx,MS_BOOL bEnable)8327 MS_BOOL HAL_MVD_ParserRstDone(MS_U8 u8Idx, MS_BOOL bEnable)
8328 {
8329 #define PARSER_RST_TIMEOUT 0x40000
8330 MS_U32 u32TimeOut = 0;
8331 MVD_CmdArg mvdcmd;
8332
8333 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_PARSER_RST);
8334 SETUP_CMDARG(mvdcmd);
8335 mvdcmd.Arg1 = bEnable;
8336 SET_DECNUM(mvdcmd, u8Idx);
8337 SET_CMD_RET_FALSE(CMD_PTS_TBL_RESET, &mvdcmd);
8338
8339 while ((TRUE != HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_PARSER_RST)) && (u32TimeOut < PARSER_RST_TIMEOUT))
8340 {
8341 u32TimeOut++;
8342 }
8343 if (u32TimeOut >= PARSER_RST_TIMEOUT)
8344 {
8345 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail timeout!!\r\n", CMD_PTS_TBL_RESET ) );
8346 return FALSE;
8347 }
8348 return TRUE;
8349 }
8350
HAL_MVD_FlushPTSBuf(MS_U8 u8Idx,MS_BOOL bEnable)8351 MS_BOOL HAL_MVD_FlushPTSBuf(MS_U8 u8Idx, MS_BOOL bEnable)
8352 {
8353 #ifdef VDEC3
8354 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
8355
8356 if(pstCtrlCfg->u8McuMode == FALSE)
8357 #endif
8358 {
8359 MVD_CmdArg mvdcmd;
8360 SETUP_CMDARG(mvdcmd);
8361 mvdcmd.Arg0 = bEnable;
8362 if (HAL_MVD_MVDCommand( CMD_SEND_UNI_PTS, &mvdcmd ) == FALSE)
8363 {
8364 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SEND_UNI_PTS ) );
8365 return FALSE;
8366 }
8367 }
8368 return TRUE;
8369 }
8370
8371
HAL_MVD_GetSLQNum(MS_U8 u8Idx)8372 MS_U32 HAL_MVD_GetSLQNum(MS_U8 u8Idx)
8373 {
8374 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
8375 MS_VIRT u32RdPtr = HAL_MVD_GetSLQReadPtr(u8Idx);
8376 MS_VIRT u32Diff = 0;
8377
8378 if (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr >= u32RdPtr)
8379 {
8380 u32Diff = pstSlqTblInfo->pDrvSlqTbl->u32WrPtr - u32RdPtr;
8381 }
8382 else
8383 {
8384 u32Diff = SLQ_TBL_SIZE - (u32RdPtr - pstSlqTblInfo->pDrvSlqTbl->u32WrPtr);
8385 }
8386
8387 // printf("slq wptr = 0x%x, rptr = 0x%x\n", pstSlqTblInfo->pDrvSlqTbl->u32WrPtr, u32RdPtr);
8388
8389 return (u32Diff/SLQ_ENTRY_LEN);
8390 }
8391
8392
HAL_MVD_GetDispQNum(MS_U8 u8Idx)8393 MS_U32 HAL_MVD_GetDispQNum(MS_U8 u8Idx)
8394 {
8395 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DISPQ_NUM, sizeof(MS_U8));
8396 }
HAL_MVD_SetAutoMute(MS_U8 u8Idx,MS_BOOL bEn)8397 MS_BOOL HAL_MVD_SetAutoMute(MS_U8 u8Idx, MS_BOOL bEn)
8398 {
8399 MVD_CmdArg mvdcmd;
8400
8401 SETUP_CMDARG(mvdcmd);
8402 mvdcmd.Arg0 = bEn; //1 to enable
8403 MVD_DEBUGINFO(printf("%s: bEn=%x\n", __FUNCTION__, bEn));
8404 SET_DECNUM(mvdcmd, u8Idx);
8405 SET_CMD_RET_FALSE(CMD_ENABLE_AUTO_MUTE, &mvdcmd);
8406
8407 return TRUE;
8408 }
8409
HAL_MVD_SetVSizeAlign(MS_U8 u8Idx,MS_BOOL bEn)8410 MS_BOOL HAL_MVD_SetVSizeAlign(MS_U8 u8Idx, MS_BOOL bEn)
8411 {
8412 MVD_CmdArg mvdcmd;
8413
8414 SETUP_CMDARG(mvdcmd);
8415 mvdcmd.Arg0 = bEn; //1 to enable VSize alignment to 4x
8416 MVD_DEBUGINFO(printf("%s: bEn=%x\n", __FUNCTION__, bEn));
8417 SET_DECNUM(mvdcmd, u8Idx);
8418 SET_CMD_RET_FALSE(CMD_FORCE_ALIGN_VSIZE, &mvdcmd);
8419
8420 return TRUE;
8421 }
8422
HAL_MVD_GetFrmRateIsSupported(MS_U16 u16HSize,MS_U16 u16VSize,MS_U32 u32FrmRate)8423 MS_BOOL HAL_MVD_GetFrmRateIsSupported(MS_U16 u16HSize, MS_U16 u16VSize, MS_U32 u32FrmRate)
8424 {
8425 MVD_DEBUGINFO(printf("%s w:%d, h:%d, fr:%d, MAX:%lld\n", __FUNCTION__, u16HSize, u16VSize, u32FrmRate, MVD_HW_MAX_PIXEL));
8426 return (((MS_U64)u16HSize*(MS_U64)u16VSize*(MS_U64)u32FrmRate) <= MVD_HW_MAX_PIXEL);
8427 }
8428
HAL_MVD_GetColorInfo(MS_U8 u8Idx,MVD_Color_Info * pstColorInfo)8429 MS_BOOL HAL_MVD_GetColorInfo(MS_U8 u8Idx, MVD_Color_Info* pstColorInfo)
8430 {
8431 MS_VIRT pu8MVDGetFrameInfoBufStart = GET_FRMINFO_BUFFADD(u8Idx);
8432
8433 if((pu8MVDGetFrameInfoBufStart==0) || (pstColorInfo==0))
8434 {
8435 MVD_DEBUGERROR(printf("HAL_MVD_GetColorInfo error: pu8MVDGetFrameInfoBufStart=NULL\n"));
8436 return FALSE;
8437 }
8438
8439 pstColorInfo->bColor_Descript = (MS_BOOL)(HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_COLOR_DESCRIPT));
8440
8441 if(pstColorInfo->bColor_Descript)
8442 {
8443 pstColorInfo->u8Color_Primaries = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_COLOR_PRIMARIES);
8444 pstColorInfo->u8Transfer_Char = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TRANSFER_CHAR);
8445 pstColorInfo->u8Matrix_Coef = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_MATRIX_COEF);
8446 }
8447 return TRUE;
8448
8449 }
8450
8451
8452 //------------------------------------------------------------------------------
8453 /// Wait MVD generate CRC done or timeout
8454 /// @return -MVD generate CRC done or timeout
8455 //------------------------------------------------------------------------------
_HAL_MVD_CrcTimeOut(MS_U8 u8Idx)8456 MS_BOOL _HAL_MVD_CrcTimeOut(MS_U8 u8Idx)
8457 {
8458 MS_U32 i;
8459 MS_U32 u32StartTime = MsOS_GetSystemTime();
8460
8461 for ( i = 0; i < MVD_PollingTimes; i++ )
8462 {
8463 ///- wait until MVD generate CRC done or timeout
8464 if ( ( HAL_MVD_RegReadByte(MVD_CRC_CTL) & MVD_CRC_CTL_DONE ) == MVD_CRC_CTL_DONE )
8465 {
8466 return FALSE;
8467 }
8468
8469 if ((TRUE == pMVDHalContext->bStopped[u8Idx]) || ((MsOS_GetSystemTime()-u32StartTime)>1300))
8470 {
8471 MVD_DEBUGINFO(printf("%s: bStopped(%x) or timeout(%d)\n", __FUNCTION__, pMVDHalContext->bStopped[u8Idx], MsOS_GetSystemTime()-u32StartTime));
8472 return TRUE;
8473 }
8474
8475 }
8476 MVD_DEBUGERROR( printf("_HAL_MVD_CrcTimeOut=%x\n", i) );
8477 return TRUE;
8478 }
8479
HAL_MVD_GetCrcValue(MS_U8 u8Idx,MVD_CrcIn * pCrcIn,MVD_CrcOut * pCrcOut)8480 E_MVD_Result HAL_MVD_GetCrcValue(MS_U8 u8Idx, MVD_CrcIn *pCrcIn, MVD_CrcOut *pCrcOut)
8481 {
8482 E_MVD_Result eRet = E_MVD_RET_OK;
8483 MS_U32 u32tmp = 0;
8484
8485 OSAL_MVD_LockHwMutex();
8486
8487 MVD_DEBUGINFO(printf("%s width=0x%x, height=0x%x, pitch=0x%x, luma=0x%lx, chroma=0x%lx\n",
8488 __FUNCTION__, pCrcIn->u32HSize, pCrcIn->u32VSize, pCrcIn->u32Strip, (unsigned long)pCrcIn->u32YStartAddr, (unsigned long)pCrcIn->u32UVStartAddr));
8489
8490 //Set generate CRC value
8491 u32tmp = ((pCrcIn->u32HSize + MVD_WIDTH_ALIGN_MASK) >> MVD_WIDTH_ALIGN_BITS) << MVD_WIDTH_ALIGN_BITS;
8492 HAL_MVD_RegWriteByte(MVD_CRC_HSIZE, u32tmp & 0xf0);
8493 HAL_MVD_RegWriteByte(MVD_CRC_HSIZE+1, (u32tmp >> 8) & 0x3f);
8494
8495 u32tmp = ((pCrcIn->u32VSize + MVD_WIDTH_ALIGN_MASK) >> MVD_WIDTH_ALIGN_BITS) << MVD_WIDTH_ALIGN_BITS;
8496 HAL_MVD_RegWriteByte(MVD_CRC_VSIZE, u32tmp & 0xff);
8497 HAL_MVD_RegWriteByte(MVD_CRC_VSIZE+1, (u32tmp >> 8) & 0xff);
8498
8499 u32tmp = (pCrcIn->u32Strip) >> 3;
8500 HAL_MVD_RegWriteByte(MVD_CRC_STRIP, u32tmp & 0xff);
8501 HAL_MVD_RegWriteByte((MVD_CRC_STRIP+1), (u32tmp >> 8) & 0xff);
8502
8503 u32tmp = (pCrcIn->u32YStartAddr) >> 3;
8504 HAL_MVD_RegWrite4Byte(MVD_CRC_Y_START, u32tmp & MVD_CRC_Y_START_LEN);
8505
8506 u32tmp = (pCrcIn->u32UVStartAddr) >> 3;
8507 HAL_MVD_RegWrite4Byte(MVD_CRC_UV_START, u32tmp & MVD_CRC_UV_START_LEN);
8508
8509 //Fire
8510 HAL_MVD_RegWriteBit(MVD_CRC_CTL, 1, MVD_CRC_CTL_FIRE);
8511
8512 //Check CRC done
8513 if ( _HAL_MVD_CrcTimeOut(u8Idx) == TRUE )
8514 {
8515 eRet = E_MVD_RET_TIME_OUT;
8516 goto _CRC_DONE;
8517 }
8518
8519 //Get CRC value
8520 pCrcOut->u32YCrc = HAL_MVD_RegReadByte(MVD_CRC_Y_L) |
8521 (HAL_MVD_RegReadByte(MVD_CRC_Y_L+1) << 8) |
8522 (HAL_MVD_RegReadByte(MVD_CRC_Y_H) <<16) |
8523 (HAL_MVD_RegReadByte(MVD_CRC_Y_H+1) <<24);
8524
8525 pCrcOut->u32UVCrc = HAL_MVD_RegReadByte(MVD_CRC_UV_L) |
8526 (HAL_MVD_RegReadByte(MVD_CRC_UV_L+1) << 8) |
8527 (HAL_MVD_RegReadByte(MVD_CRC_UV_H) <<16) |
8528 (HAL_MVD_RegReadByte(MVD_CRC_UV_H+1) <<24);
8529
8530 MVD_DEBUGINFO(printf("%s Y=0x%x, UV=0x%x\n", __FUNCTION__, pCrcOut->u32YCrc, pCrcOut->u32UVCrc));
8531
8532 _CRC_DONE:
8533 OSAL_MVD_UnlockHwMutex();
8534 return eRet;
8535 }
8536
8537
HAL_MVD_SuspendDynamicScale(MS_U8 u8Idx,MS_BOOL bEn)8538 MS_BOOL HAL_MVD_SuspendDynamicScale(MS_U8 u8Idx, MS_BOOL bEn)
8539 {
8540 MVD_CmdArg mvdcmd;
8541
8542 SETUP_CMDARG(mvdcmd);
8543 mvdcmd.Arg0 = bEn;
8544 MVD_DEBUGINFO(printf("%s: bEn=%x\n", __FUNCTION__, bEn));
8545 SET_DECNUM(mvdcmd, u8Idx);
8546 SET_CMD_RET_FALSE(CMD_SUSPEND_DS, &mvdcmd);
8547
8548 return TRUE;
8549 }
8550
HAL_MVD_GetSuspendDynamicScale(MS_U8 u8Idx)8551 MS_U8 HAL_MVD_GetSuspendDynamicScale(MS_U8 u8Idx)
8552 {
8553 return (MS_U8)MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_SUSPEND_DS, sizeof(MS_U8));
8554 }
8555
HAL_MVD_GetStereoType(MS_U8 u8Idx)8556 MS_U8 HAL_MVD_GetStereoType(MS_U8 u8Idx)
8557 {
8558 return (MS_U8)MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_STEREO_TYPE, sizeof(MS_U8));
8559 }
8560
HAL_MVD_GetDivxVer(MS_U8 u8Idx)8561 MS_U32 HAL_MVD_GetDivxVer(MS_U8 u8Idx)
8562 {
8563 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DIVX_VER_5X, sizeof(MS_U32));
8564 }
8565
HAL_MVD_SetIdctMode(MS_U8 u8Idx,MS_U8 u8Mode)8566 MS_BOOL HAL_MVD_SetIdctMode(MS_U8 u8Idx, MS_U8 u8Mode)
8567 {
8568 MVD_CmdArg mvdcmd;
8569
8570 SETUP_CMDARG(mvdcmd);
8571 mvdcmd.Arg0 = u8Mode;
8572 SET_DECNUM(mvdcmd, u8Idx);
8573
8574 MVD_DEBUGINFO(printf("%s CMD_IDCT_SEL arg0=%x)\n", __FUNCTION__, u8Mode));
8575 SET_CMD_RET_FALSE(CMD_IDCT_SEL, &mvdcmd);
8576
8577 return TRUE;
8578 }
8579
HAL_MVD_EX_SetClockSpeed(HAL_MVD_EX_ClockSpeed eClockSpeed)8580 E_MVD_Result HAL_MVD_EX_SetClockSpeed(HAL_MVD_EX_ClockSpeed eClockSpeed)
8581 {
8582 UNUSED(eClockSpeed);
8583 printf("This chip does not support mvd clock presetting~\n");
8584 return E_MVD_RET_FAIL;
8585 }
8586
HAL_MVD_GetIsAVSyncOn(MS_U8 u8Idx)8587 MS_BOOL HAL_MVD_GetIsAVSyncOn(MS_U8 u8Idx)
8588 {
8589 MS_BOOL bAVSyncOn = FALSE;
8590 MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
8591 if (pCtrlCfg)
8592 {
8593 bAVSyncOn = pCtrlCfg->bAVSyncOn;
8594 }
8595
8596 return bAVSyncOn;
8597 }
8598
HAL_MVD_SetExternalDSBuff(MS_U8 u8Idx,MS_VIRT u32VPUAddr,MS_VIRT u32DrvAddr)8599 MS_BOOL HAL_MVD_SetExternalDSBuff(MS_U8 u8Idx, MS_VIRT u32VPUAddr, MS_VIRT u32DrvAddr)
8600 {
8601 MS_BOOL bRet = TRUE;
8602 MVD_FWBuff* pBuff = &(pMVDHalContext->stFWBuff[u8Idx]);
8603
8604 pBuff->u32DynScalingAdd = u32DrvAddr;
8605 bRet = HAL_MVD_SetDynamicScaleAddr(u8Idx, u32VPUAddr);
8606 return bRet;
8607 }
8608
HAL_MVD_ShowFirstFrameDirect(MS_U8 u8Idx,MS_U8 bEnable)8609 MS_BOOL HAL_MVD_ShowFirstFrameDirect(MS_U8 u8Idx, MS_U8 bEnable)
8610 {
8611 MVD_CmdArg mvdcmd;
8612
8613 SETUP_CMDARG(mvdcmd);
8614 mvdcmd.Arg0 = bEnable;
8615 SET_DECNUM(mvdcmd, u8Idx);
8616
8617 MVD_DEBUGINFO(printf("%s CMD_PUSH_FIRST_FRAME_DISP arg0=%x)\n", __FUNCTION__, bEnable));
8618 SET_CMD_RET_FALSE(CMD_PUSH_FIRST_FRAME_DISP, &mvdcmd);
8619
8620 return TRUE;
8621 }
8622
HAL_MVD_SetXCLowDelayPara(MS_U8 u8Idx,MS_U32 u32Para)8623 E_MVD_Result HAL_MVD_SetXCLowDelayPara(MS_U8 u8Idx,MS_U32 u32Para)
8624 {
8625 MVD_CmdArg mvdcmd;
8626
8627 SETUP_CMDARG(mvdcmd);
8628 mvdcmd.Arg0 = L_WORD(u32Para); // for set the XC diff_field_number
8629 mvdcmd.Arg1 = H_WORD(u32Para); // for set XC UCNR diff field no
8630 SET_DECNUM(mvdcmd, u8Idx);
8631
8632 SET_CMD_RET_FALSE(CMD_XC_LOW_DELAY_PARA, &mvdcmd);
8633
8634 return TRUE;
8635 }
8636
HAL_MVD_GetESBufferStatus(MS_U8 u8Idx)8637 MS_U8 HAL_MVD_GetESBufferStatus(MS_U8 u8Idx)
8638 {
8639 return (MS_U8)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CURRENT_ES_BUFFER_STATUS, sizeof(MS_U8)));
8640 }
8641
HAL_MVD_Field_Polarity_Display_One_field(MS_U8 u8Idx,MS_BOOL bEn,MS_U8 top_bottom)8642 MS_BOOL HAL_MVD_Field_Polarity_Display_One_field(MS_U8 u8Idx, MS_BOOL bEn,MS_U8 top_bottom)
8643 {
8644 MVD_CmdArg mvdcmd;
8645
8646 SETUP_CMDARG(mvdcmd);
8647 mvdcmd.Arg2 = bEn;
8648 mvdcmd.Arg3 = top_bottom;
8649 MVD_DEBUGINFO(printf("%s: bEn=%x,top_bottom=%x\n", __FUNCTION__, bEn,top_bottom));
8650 SET_DECNUM(mvdcmd, u8Idx);
8651 SET_CMD_RET_FALSE(CMD_FP_FILTER, &mvdcmd);
8652
8653 return TRUE;
8654 }
8655
8656
HAL_MVD_SetShareMemoryBase(MS_U8 u8Idx,MS_VIRT u32base,MS_U8 u8sel)8657 MS_BOOL HAL_MVD_SetShareMemoryBase(MS_U8 u8Idx, MS_VIRT u32base, MS_U8 u8sel)
8658 {
8659 u8SHMMiuSel = u8sel;
8660 u32SharememoryBase[u8Idx] = u32base - MVD_FW_CODE_LEN;
8661 return TRUE;
8662 }
8663
HAL_MVD_GetShareMemoryOffset(MS_U8 u8Idx,MS_VIRT * u32base)8664 MS_BOOL HAL_MVD_GetShareMemoryOffset(MS_U8 u8Idx, MS_VIRT *u32base)
8665 {
8666 *u32base=u32SharememoryBase[u8Idx];
8667 return TRUE;
8668 }
8669
HAL_MVD_Support2ndMVOPInterface(void)8670 MS_BOOL HAL_MVD_Support2ndMVOPInterface(void)
8671 {
8672 return TRUE;
8673 }
8674
HAL_MVD_SetExternal_CC_Buffer(MS_U8 u8Idx,MS_VIRT u32base,MS_U8 u8size,MS_U8 cc_type)8675 MS_BOOL HAL_MVD_SetExternal_CC_Buffer(MS_U8 u8Idx, MS_VIRT u32base, MS_U8 u8size, MS_U8 cc_type)
8676 {
8677 MVD_CmdArg mvdcmd;
8678 MS_U32 u32cc_size=0;
8679 MS_VIRT u32StartOffset;
8680 MS_U8 u8MiuSel;
8681
8682 SETUP_CMDARG(mvdcmd);
8683 if (u8size !=0)
8684 {
8685 mvdcmd.Arg0 = TRUE; //enable
8686 }
8687 else
8688 {
8689 mvdcmd.Arg0 = FALSE; //disable
8690 }
8691 mvdcmd.Arg1 = cc_type; //608->1,708->0
8692
8693 SET_DECNUM(mvdcmd, u8Idx);
8694 SET_CMD_RET_FALSE(CMD_CC_ENABLE_EXTERNAL_BUFFER, &mvdcmd);
8695
8696 if (u8size ==0)
8697 {
8698 SET_CMD_RET_FALSE(CMD_CLOSE_CC, &mvdcmd);
8699 return E_MVD_RET_OK;
8700 }
8701
8702 u32base *= (1<<10); //unit is bytes
8703 u32cc_size = u8size * (1<<10); //unit is bytes
8704
8705
8706 MS_VIRT *u32ReadPtr = (MS_VIRT *)(HAL_MVD_PA2NonCacheSeg(u32base));
8707 MS_VIRT *u32WritePtr = (MS_VIRT *)(HAL_MVD_PA2NonCacheSeg(u32base+sizeof(MS_VIRT)));
8708 MS_VIRT *u32LatchOverflow = (MS_VIRT *)(HAL_MVD_PA2NonCacheSeg(u32base+sizeof(MS_VIRT)*2));
8709 MS_VIRT *u32CpuBaseAddr = (MS_VIRT *)(HAL_MVD_PA2NonCacheSeg(u32base+sizeof(MS_VIRT)*3));
8710
8711 //rptr,wptr,overflow,latch 16 bytes
8712 if(cc_type==1)
8713 {
8714 u32base+=(4*sizeof(MS_VIRT));
8715 u32cc_size -= (4*sizeof(MS_VIRT));
8716 }
8717
8718 if(cc_type==0) // 708: start from 128 bytes
8719 {
8720 u32base+=128;
8721 u32cc_size -=128;
8722 }
8723
8724 *u32ReadPtr = *u32WritePtr = u32base;
8725 *u32LatchOverflow = 0;
8726 *u32CpuBaseAddr = HAL_MVD_GetMEMCfg(u8Idx)->u32FWBinAddr;
8727
8728 _phy_to_miu_offset(u8MiuSel, u32StartOffset, u32base);
8729 _MVD_SetUserDataBufStart(u8Idx,u32StartOffset,cc_type);
8730 _MVD_SetUserDataBufSize(u8Idx,u32cc_size,cc_type);
8731 //MVD_DEBUGINFO(printf("%s: u32base=%x,u32size=%x,cc_type=%x\n", __FUNCTION__,u32base,u32cc_size,cc_type));
8732
8733 return E_MVD_RET_OK;
8734 }
8735
HAL_MVD_GetPVRSeamlessInfo(MS_U8 u8Idx,void * param)8736 MS_BOOL HAL_MVD_GetPVRSeamlessInfo(MS_U8 u8Idx,void* param)
8737 {
8738
8739 MVD_PVR_Seamless_Info* temp = (MVD_PVR_Seamless_Info*)param;
8740
8741 temp->u64PTS = ((MS_U64)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PVRSEAMLESSTARGETPTS, sizeof(MS_U32))) |
8742 (((MS_U64)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PVRSEAMLESSTARGETPTSHIGH, sizeof(MS_U8)))<<32);
8743
8744 temp->u32POC = 0xFF; // not support in mvd
8745 temp->u8FrameType = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PVRSEAMLESSTARGETFRAMETYPE, sizeof(MS_U8));
8746
8747 return TRUE;
8748 }
8749
HAL_MVD_HWBuffer_ReMappingMode(MS_U8 u8Idx,MS_BOOL bEnable)8750 E_MVD_Result HAL_MVD_HWBuffer_ReMappingMode(MS_U8 u8Idx,MS_BOOL bEnable)
8751 {
8752 pMVDHalContext->gMVDPreCtrl[u8Idx].bHWBufferReMapping = bEnable;
8753 return E_MVD_RET_OK;
8754 }
8755
HAL_MVD_SetPrebufferSize(MS_U8 u8Idx,MS_U32 size)8756 MS_BOOL HAL_MVD_SetPrebufferSize(MS_U8 u8Idx, MS_U32 size)
8757 {
8758 MVD_CmdArg mvdcmd;
8759
8760 SETUP_CMDARG(mvdcmd);
8761 mvdcmd.Arg0 = size&0xff;
8762 mvdcmd.Arg1 = (size>>8)&0xff;
8763 mvdcmd.Arg2 = (size>>16)&0xff;
8764 mvdcmd.Arg3 = (size>>24)&0xff;
8765 SET_DECNUM(mvdcmd, u8Idx);
8766 if (HAL_MVD_MVDCommand( CMD_PREBUFFER_SIZE, &mvdcmd ) == FALSE)
8767 {
8768 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_PREBUFFER_SIZE ) );
8769 return FALSE;
8770 }
8771 return TRUE;
8772 }
8773
HAL_MVD_GetVsyncAddrOffset(void)8774 MS_VIRT HAL_MVD_GetVsyncAddrOffset(void)
8775 {
8776 MS_VIRT VPUSHMAddr = HAL_VPU_EX_GetSHMAddr();
8777 MS_VIRT VsyncBridgeOffset = 0;
8778
8779 if(VPUSHMAddr != 0) // TEE project
8780 {
8781 VsyncBridgeOffset = VSYNC_BRIDGE_OFFSET;
8782 }
8783 else // normal project
8784 {
8785 VsyncBridgeOffset = COMMON_AREA_START + VSYNC_BRIDGE_OFFSET;
8786 }
8787
8788 return VsyncBridgeOffset;
8789 }
8790
HAL_MVD_GetVsyncExtAddrOffset(void)8791 MS_VIRT HAL_MVD_GetVsyncExtAddrOffset(void)
8792 {
8793 MS_VIRT VsyncBridgeExtOffset = 0;
8794
8795 MS_VIRT VPUSHMAddr = HAL_VPU_EX_GetSHMAddr();
8796 if(VPUSHMAddr != 0) // TEE project
8797 {
8798 VsyncBridgeExtOffset = VSYNC_BRIDGE_EXT_OFFSET;
8799 }
8800 else // normal project
8801 {
8802 VsyncBridgeExtOffset = COMMON_AREA_START + VSYNC_BRIDGE_EXT_OFFSET;
8803 }
8804 return VsyncBridgeExtOffset;
8805 }
8806
HAL_MVD_SetTimeIncPredictParam(MS_U8 u8Idx,MS_U32 u32time)8807 E_MVD_Result HAL_MVD_SetTimeIncPredictParam(MS_U8 u8Idx, MS_U32 u32time)
8808 {
8809 MVD_CmdArg mvdcmd;
8810 SETUP_CMDARG(mvdcmd);
8811
8812 mvdcmd.Arg0 = L_WORD(u32time); // Arg0(enable), 1 for enable, default is 0...
8813 mvdcmd.Arg1 = H_WORD(u32time); // Arg1(vop_time_incr_predict_count), 1 for predict once, 2 for twice...0xff for always guess the vop_time_incr even with the vol_header, default is 0...
8814 mvdcmd.Arg2 = L_DWORD(u32time);// Arg2(vop_time_incr_follow_vol_header), // 0 for follow vol_header...1 for bypass vol_header, default is 0...
8815 mvdcmd.Arg3 = H_DWORD(u32time);// Arg3, reserve...
8816 MVD_DEBUGINFO(printf("CMD_TIME_INCR_PREDICT=%x\n",u32time));
8817 if (HAL_MVD_MVDCommand(CMD_TIME_INCR_PREDICT, &mvdcmd) == FALSE)
8818 {
8819 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_TIME_INCR_PREDICT ) );
8820 return E_MVD_RET_FAIL;
8821 }
8822 return E_MVD_RET_OK;
8823
8824 }
8825
HAL_MVD_SetDecodeTimeoutParam(MS_U8 u8Idx,MS_BOOL enable,MS_U32 u32timeout)8826 MS_BOOL HAL_MVD_SetDecodeTimeoutParam(MS_U8 u8Idx, MS_BOOL enable,MS_U32 u32timeout)
8827 {
8828 MVD_CmdArg mvdcmd;
8829
8830 SETUP_CMDARG(mvdcmd);
8831
8832 if(enable == TRUE)
8833 {
8834 mvdcmd.Arg0 = 2; //0:disable, 2: enable decode timeout
8835 mvdcmd.Arg1 = u32timeout&0xff;
8836 mvdcmd.Arg2 = (u32timeout>>8)&0xff;
8837 mvdcmd.Arg3 = (u32timeout>>16)&0xff;
8838 }
8839 else
8840 {
8841 mvdcmd.Arg0 = 0; //0:disable, 2: enable decode timeout
8842 }
8843
8844 SET_DECNUM(mvdcmd, u8Idx);
8845
8846 if (HAL_MVD_MVDCommand( CMD_ENABLE_VLD_TIMEOUT, &mvdcmd ) == FALSE)
8847 {
8848 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_ENABLE_VLD_TIMEOUT ) );
8849 return FALSE;
8850 }
8851
8852 return TRUE;
8853 }
8854
HAL_MVD_Set_Smooth_Rewind(MS_U8 u8Idx,MS_U8 btype)8855 E_MVD_Result HAL_MVD_Set_Smooth_Rewind(MS_U8 u8Idx, MS_U8 btype)
8856 {
8857 MVD_CmdArg mvdcmd;
8858 SETUP_CMDARG(mvdcmd);
8859 mvdcmd.Arg0 = btype;
8860 MVD_DEBUGINFO(printf("%s: btype=%x\n", __FUNCTION__, btype));
8861 SET_DECNUM(mvdcmd, u8Idx);
8862 if (HAL_MVD_MVDCommand(CMD_SMOOTH_REWIND, &mvdcmd) == FALSE)
8863 {
8864 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SMOOTH_REWIND ) );
8865 return E_MVD_RET_FAIL;
8866 }
8867 return E_MVD_RET_OK;
8868 }
8869
HAL_MVD_IsAlive(MS_U8 u8Idx)8870 E_MVD_Result HAL_MVD_IsAlive(MS_U8 u8Idx)
8871 {
8872 MVD_ALIVEInfo* pAliveInfo = &(pMVDHalContext->aliveInfo[u8Idx]);
8873 MVD_SrcMode curSrcMode = HAL_MVD_GetSrcMode(u8Idx);
8874
8875 if (E_MVD_SLQ_TBL_MODE == curSrcMode || E_MVD_TS_FILE_MODE == curSrcMode)
8876 {
8877 if(pMVDHalContext->u32LastAliveTime[u8Idx] == 0 || ((MsOS_GetSystemTime()-pMVDHalContext->u32LastAliveTime[u8Idx]) < 500))
8878 {
8879
8880 if(pMVDHalContext->u32LastAliveTime[u8Idx] == 0 )
8881 {
8882 pMVDHalContext->u32LastAliveTime[u8Idx] = MsOS_GetSystemTime();
8883 }
8884 return E_MVD_RET_OK;
8885 }
8886 }
8887
8888 #if 0
8889 printf("[%d]%d,%d,%d,%d,%d,%d,%d,%d\n",__FUNCTION__,
8890 (MS_U32)MsOS_GetSystemTime(),
8891 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DECODEDONE_COUNT, sizeof(MS_U32))),
8892 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHBUF_COUNT, sizeof(MS_U32))),
8893 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHCODE_COUNT, sizeof(MS_U32))),
8894 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PREBUF_COUNT, sizeof(MS_U32))),
8895 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_VFIFOBUF_COUNT, sizeof(MS_U32))),
8896 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHHEADER_COUNT, sizeof(MS_U32))),
8897 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_FLASHPATTERN_COUNT, sizeof(MS_U32))));
8898 #endif
8899
8900 //check count to vertify alive
8901 if((pAliveInfo->u32decode_count!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DECODEDONE_COUNT, sizeof(MS_U32))))||
8902 (pAliveInfo->u32searchbuf_count!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHBUF_COUNT, sizeof(MS_U32))))||
8903 (pAliveInfo->u32searchcode_count!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHCODE_COUNT, sizeof(MS_U32))))||
8904 (pAliveInfo->u32prebuf_count!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PREBUF_COUNT, sizeof(MS_U32))))||
8905 (pAliveInfo->u32vfifobuf_count!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_VFIFOBUF_COUNT, sizeof(MS_U32))))||
8906 (pAliveInfo->u32searchheader_count!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHHEADER_COUNT, sizeof(MS_U32))))||
8907 (pAliveInfo->u32flashpattern_count!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_FLASHPATTERN_COUNT, sizeof(MS_U32)))))
8908 {
8909 pAliveInfo->u32decode_count=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DECODEDONE_COUNT, sizeof(MS_U32)));
8910 pAliveInfo->u32searchbuf_count=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHBUF_COUNT, sizeof(MS_U32)));
8911 pAliveInfo->u32searchcode_count=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHCODE_COUNT, sizeof(MS_U32)));
8912 pAliveInfo->u32prebuf_count=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PREBUF_COUNT, sizeof(MS_U32)));
8913 pAliveInfo->u32vfifobuf_count=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_VFIFOBUF_COUNT, sizeof(MS_U32)));
8914 pAliveInfo->u32searchheader_count=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHHEADER_COUNT, sizeof(MS_U32)));
8915 pAliveInfo->u32flashpattern_count=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_FLASHPATTERN_COUNT, sizeof(MS_U32)));
8916 pMVDHalContext->u32LastAliveTime[u8Idx] = MsOS_GetSystemTime();
8917 return E_MVD_RET_OK;
8918 }
8919 else
8920 {
8921 pMVDHalContext->u32LastAliveTime[u8Idx] = MsOS_GetSystemTime();
8922 return E_MVD_RET_FAIL;
8923 }
8924
8925 }
8926
HAL_MVD_Set_Err_Tolerance(MS_U8 u8Idx,MS_U16 u16Para)8927 E_MVD_Result HAL_MVD_Set_Err_Tolerance(MS_U8 u8Idx, MS_U16 u16Para)
8928 {
8929 MVD_CmdArg mvdcmd;
8930 SETUP_CMDARG(mvdcmd);
8931 mvdcmd.Arg0 = u16Para & 0xFF; //enable or disable
8932 mvdcmd.Arg1 = u16Para >> 8; // err rate 0~100%
8933 if(mvdcmd.Arg1 >= 100)
8934 mvdcmd.Arg1 = 100;
8935
8936 SET_DECNUM(mvdcmd, u8Idx);
8937 if (HAL_MVD_MVDCommand(CMD_DECODE_ERROR_TOLERANCE, &mvdcmd) == FALSE)
8938 {
8939 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DECODE_ERROR_TOLERANCE ) );
8940 return E_MVD_RET_FAIL;
8941 }
8942 return E_MVD_RET_OK;
8943
8944 }
8945
HAL_MVD_EnableAutoInsertDummyPattern(MS_U8 u8Idx,MS_BOOL bEnable)8946 void HAL_MVD_EnableAutoInsertDummyPattern(MS_U8 u8Idx, MS_BOOL bEnable)
8947 {
8948 pMVDHalContext->bAutoInsertDummyPattern[u8Idx] = bEnable;
8949 }
8950
HAL_MVD_Drop_One_PTS(MS_U8 u8Idx)8951 void HAL_MVD_Drop_One_PTS(MS_U8 u8Idx)
8952 {
8953 pMVDHalContext->bDropOnePTS[u8Idx] = TRUE;
8954 }
8955
HAL_MVD_PVR_Seamless_mode(MS_U8 u8Idx,MS_U8 u8Arg)8956 E_MVD_Result HAL_MVD_PVR_Seamless_mode(MS_U8 u8Idx, MS_U8 u8Arg)
8957 {
8958 #define STOP_TIMEOUT 500 //ms
8959 MVD_CmdArg mvdcmd;
8960 E_MVD_Result ret = E_MVD_RET_OK;
8961 MS_U32 u32StartTime;
8962 MS_U32 u32SeamlessStatus = 0;
8963 MS_U32 u32BufStart = 0;
8964 MS_U32* temp = 0;
8965
8966 if(u8Arg != 2)
8967 {
8968 // clear handshake dram
8969 u32BufStart = GET_FRMINFO_BUFFADD(u8Idx);
8970 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32BufStart,u32BufStart);
8971 temp = (MS_U32*)MsOS_PA2KSEG1(u32BufStart+OFFSET_PVR_SEAMLESS_STATUS);
8972 *temp = 0;
8973 MsOS_FlushMemory();
8974 }
8975
8976 SETUP_CMDARG(mvdcmd);
8977 mvdcmd.Arg0 = u8Arg;
8978 MVD_DEBUGINFO(printf("%s: arg=%d\n", __FUNCTION__, (unsigned int)u8Arg));
8979 SET_DECNUM(mvdcmd, u8Idx);
8980
8981 if (HAL_MVD_MVDCommand(CMD_PVR_SEAMLESS_MODE, &mvdcmd) == FALSE)
8982 {
8983 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_PVR_SEAMLESS_MODE ) );
8984 return E_MVD_RET_FAIL;
8985 }
8986
8987
8988 u32StartTime = HAL_MVD_GetTime();
8989
8990 if(u8Arg == 1)
8991 {
8992 pMVDHalContext->stFwCfg[u8Idx].eSrcMode = E_MVD_TS_FILE_MODE;
8993 while(1)
8994 {
8995 u32SeamlessStatus = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PVR_SEAMLESS_STATUS, sizeof(MS_U32));
8996 if(u32SeamlessStatus&1) // bit0 , pause done
8997 {
8998 break;
8999 }
9000
9001 if((HAL_MVD_GetTime()-u32StartTime)>STOP_TIMEOUT)
9002 {
9003 MVD_DEBUGERROR(printf("PVR seamless pause timeout\n" ) );
9004 ret = E_MVD_RET_FAIL;
9005 break;
9006 }
9007 }
9008 }
9009 else if(u8Arg == 2)
9010 {
9011 while(1)
9012 {
9013 u32SeamlessStatus = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PVR_SEAMLESS_STATUS, sizeof(MS_U32));
9014 if(u32SeamlessStatus&4) // bit2, hw reset done
9015 {
9016 break;
9017 }
9018
9019 if((HAL_MVD_GetTime()-u32StartTime)>STOP_TIMEOUT)
9020 {
9021 MVD_DEBUGERROR(printf("PVR seamless hw reset timeout\n" ) );
9022 ret = E_MVD_RET_FAIL;
9023 break;
9024 }
9025 }
9026 }
9027
9028 return ret;
9029 }
9030
HAL_MVD_SetDVXCShmAddr(MS_U8 u8Idx,MS_PHY u32FWBaseAddr,MS_PHY u32DVXCShmAddr)9031 E_MVD_Result HAL_MVD_SetDVXCShmAddr(MS_U8 u8Idx, MS_PHY u32FWBaseAddr, MS_PHY u32DVXCShmAddr)
9032 {
9033 E_MVD_Result ret = E_MVD_RET_OK;
9034
9035 MS_U8 u8XCShmMiuSel;
9036 MS_U32 u32XCShmStartOffset;
9037 MS_U8 u8FWBaseMiuSel;
9038 MS_U32 u32FWBaseOffset;
9039 MVD_CmdArg mvdcmd;
9040 MS_U32 u32temp = 0;
9041
9042 _phy_to_miu_offset(u8FWBaseMiuSel, u32FWBaseOffset, u32FWBaseAddr);
9043 _phy_to_miu_offset(u8XCShmMiuSel, u32XCShmStartOffset, u32DVXCShmAddr);
9044
9045 if (u8FWBaseMiuSel != u8XCShmMiuSel)
9046 {
9047 MVD_DEBUGERROR(printf("[ERROR] XC share memory and VDEC Code base MIU selections are different\n"));
9048 return E_MVD_RET_FAIL;
9049 }
9050
9051 u32temp = u32XCShmStartOffset - u32FWBaseOffset;
9052
9053 SETUP_CMDARG(mvdcmd);
9054
9055 mvdcmd.Arg0 = L_WORD(u32temp);
9056 mvdcmd.Arg1 = H_WORD(u32temp);
9057 mvdcmd.Arg2 = L_DWORD(u32temp);
9058 mvdcmd.Arg3 = H_DWORD(u32temp);
9059
9060 MVD_DEBUGINFO(printf("%s: arg=%x\n", __FUNCTION__, (unsigned int)u32temp));
9061
9062 SET_DECNUM(mvdcmd, u8Idx);
9063
9064 if (HAL_MVD_MVDCommand(CMD_SET_DV_XC_SHM_ADDR, &mvdcmd) == FALSE)
9065 {
9066 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SET_DV_XC_SHM_ADDR ) );
9067 return E_MVD_RET_FAIL;
9068 }
9069
9070 return ret;
9071 }
9072
9073
HAL_MVD_SetDisplayFinishMode(MS_U8 u8Idx,MS_U8 u8Mode)9074 E_MVD_Result HAL_MVD_SetDisplayFinishMode(MS_U8 u8Idx, MS_U8 u8Mode)
9075 {
9076 MVD_CmdArg mvdcmd;
9077
9078 SETUP_CMDARG(mvdcmd);
9079 mvdcmd.Arg0 = u8Mode;
9080
9081 SET_DECNUM(mvdcmd, u8Idx);
9082
9083 MVD_DEBUGINFO(printf("%s CMD_ENABLE_LAST_FRAME_QUALIFIER arg0=%x\n", __FUNCTION__, u8Mode));
9084 if (HAL_MVD_MVDCommand(CMD_ENABLE_LAST_FRAME_QUALIFIER, &mvdcmd)== FALSE)
9085 {
9086 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_ENABLE_LAST_FRAME_QUALIFIER) );
9087 return E_MVD_RET_FAIL;
9088 }
9089
9090 return E_MVD_RET_OK;
9091 }
HAL_MVD_Set_SlowSyncParam(MS_U8 u8Idx,MS_U8 u8RepeatPeriod,MS_U8 u8DropPeriod)9092 E_MVD_Result HAL_MVD_Set_SlowSyncParam(MS_U8 u8Idx, MS_U8 u8RepeatPeriod,MS_U8 u8DropPeriod)
9093 {
9094 MVD_CmdArg mvdcmd;
9095 SETUP_CMDARG(mvdcmd);
9096
9097 mvdcmd.Arg0 = u8RepeatPeriod;
9098
9099 SET_DECNUM(mvdcmd, u8Idx);
9100 if (HAL_MVD_MVDCommand(CMD_SLOW_SYNC_REPEAT, &mvdcmd) == FALSE)
9101 {
9102 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SLOW_SYNC_REPEAT ) );
9103 return E_MVD_RET_FAIL;
9104 }
9105
9106
9107 mvdcmd.Arg0 = u8DropPeriod;
9108
9109 SET_DECNUM(mvdcmd, u8Idx);
9110 if (HAL_MVD_MVDCommand(CMD_SLOW_SYNC_SKIP, &mvdcmd) == FALSE)
9111 {
9112 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SLOW_SYNC_SKIP ) );
9113 return E_MVD_RET_FAIL;
9114 }
9115
9116
9117 return E_MVD_RET_OK;
9118
9119 }
9120
HAL_MVD_VariableFrameRate(MS_U8 u8Idx)9121 MS_BOOL HAL_MVD_VariableFrameRate(MS_U8 u8Idx)
9122 {
9123 MVD_CmdArg mvdcmd;
9124 SETUP_CMDARG(mvdcmd);
9125 mvdcmd.Arg0 = 1;
9126 SET_DECNUM(mvdcmd, u8Idx);
9127 if (HAL_MVD_MVDCommand(CMD_VARIABLE_FRAMERATE, &mvdcmd)== FALSE)
9128 {
9129 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_VARIABLE_FRAMERATE) );
9130 return FALSE;
9131 }
9132 return TRUE;
9133 }
9134
9135 //------------------------------------------------------------------------------
9136 /// Set FRC Only Show TopField
9137 /// @return -TRUE for success; FALSE for failure.
9138 //------------------------------------------------------------------------------
HAL_MVD_FRC_OnlyShowTopField(MS_U8 u8Idx,MS_BOOL bEnable)9139 MS_BOOL HAL_MVD_FRC_OnlyShowTopField(MS_U8 u8Idx, MS_BOOL bEnable)
9140 {
9141 MVD_CmdArg mvdcmd;
9142
9143 SETUP_CMDARG(mvdcmd);
9144 mvdcmd.Arg0 = bEnable; //1 -> show Only Show TopField. 0 -> normal case.
9145 SET_DECNUM(mvdcmd, u8Idx);
9146 SET_CMD_RET_FALSE(CMD_FRC_ONLY_SHOW_TOP_FIELD, &mvdcmd);
9147 return TRUE;
9148 }
9149
HAL_MVD_GetVBBUTableAddr(MS_U8 u8Idx)9150 MS_VIRT HAL_MVD_GetVBBUTableAddr(MS_U8 u8Idx)
9151 {
9152 return pMVDHalContext->stFWBuff[(u8Idx)].u32VBBUTableAdd;
9153 }
9154
HAL_MVD_SetDmxFrameRate(MS_U8 u8HalIdx,MS_U32 u32Value)9155 void HAL_MVD_SetDmxFrameRate(MS_U8 u8HalIdx,MS_U32 u32Value)
9156 {
9157 pMVDHalContext->u32DmxFrameRate[u8HalIdx] = u32Value;
9158 }
9159
HAL_MVD_SetDmxFrameRateBase(MS_U8 u8HalIdx,MS_U32 u32Value)9160 void HAL_MVD_SetDmxFrameRateBase(MS_U8 u8HalIdx,MS_U32 u32Value)
9161 {
9162 pMVDHalContext->u32DmxFrameRateBase[u8HalIdx] = u32Value;
9163 }
9164
HAL_MVD_SetCMAInformation(void * cmaInitParam)9165 void HAL_MVD_SetCMAInformation(void* cmaInitParam)
9166 {
9167 pMVDHalContext->bCMAUsed = TRUE;
9168 memcpy((void*)(&pMVDHalContext->cmaInitParam),cmaInitParam,sizeof(struct CMA_Pool_Init_Param));
9169 }
9170
HAL_MVD_GetCMAInformation(MS_U8 u8HalIdx,MS_U64 * u64Addr,MS_SIZE * u64Size,MS_BOOL * bAllocDone)9171 void HAL_MVD_GetCMAInformation(MS_U8 u8HalIdx,MS_U64* u64Addr,MS_SIZE* u64Size,MS_BOOL* bAllocDone)
9172 {
9173 FW_VOL_INFO gvolInfo;
9174 MS_U32 u32VolAddr;
9175
9176 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,GET_VOL_BUFFADD(u8HalIdx),u32VolAddr);
9177
9178 gvolInfo = (*(volatile FW_VOL_INFO*)(MsOS_PA2KSEG1(u32VolAddr)));
9179
9180 *u64Addr = (MS_U64)gvolInfo.CMA_FB_Address;
9181 *u64Size = (MS_SIZE)gvolInfo.CMA_FB_Size;
9182 *bAllocDone = gvolInfo.CMA_AllocDone;
9183
9184 MsOS_ReadMemory();
9185 MsOS_FlushMemory();
9186 }
9187
HAL_MVD_SetCMAAllocateDone(MS_U8 u8HalIdx)9188 void HAL_MVD_SetCMAAllocateDone(MS_U8 u8HalIdx)
9189 {
9190 MS_U8* temp;
9191 MS_VIRT u32VolAddr;
9192
9193 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,GET_VOL_BUFFADD(u8HalIdx),u32VolAddr);
9194
9195 temp = (MS_U8*)(MsOS_PA2KSEG1(u32VolAddr+OFFSET_CMA_ALLOCDONE));
9196
9197 *temp = 1;
9198
9199 MsOS_ReadMemory();
9200 MsOS_FlushMemory();
9201 }
9202
HAL_MVD_SetFrameBufferMiu(MS_U8 u8HalIdx,MS_U8 u8MiuIdx)9203 void HAL_MVD_SetFrameBufferMiu(MS_U8 u8HalIdx,MS_U8 u8MiuIdx)
9204 {
9205 //to do....
9206 }
9207
9208
9209 #ifdef VDEC3
HAL_MVD_IsDisplayCommand(MS_U8 u8Cmd)9210 MS_BOOL HAL_MVD_IsDisplayCommand(MS_U8 u8Cmd)
9211 {
9212
9213 #if 1 // to do.
9214 UNUSED(u8Cmd);
9215 return TRUE;
9216 #else
9217 MS_BOOL ret;
9218 switch(u8Cmd)
9219 {
9220 case CMD_PLAY:
9221 case CMD_STOP:
9222 case CMD_DISPLAY_PAUSE:
9223 case CMD_PAUSE:
9224 case CMD_FLUSH_DISP_QUEUE:
9225 case CMD_VC1_HW_SLQ_RESET:
9226 case CMD_FAST_SLOW:
9227 case CMD_FLIP_RELEASE_FRAME:
9228 case CMD_FD_MASK_DELAY_CNT:
9229 case CMD_PVR_SEAMLESS_MODE:
9230 case CMD_SW_RESET:
9231 case CMD_CODEC_INFO:
9232 case CMD_CODE_OFFSET:
9233 case CMD_VOL_INFO_BUF:
9234 case CMD_FRAME_INFO_BUF:
9235 case CMD_HEADER_INFO_BUF:
9236 case CMD_USER_BUF_START:
9237 case CMD_USER_BUF_SIZE:
9238 case CMD_PTS_TBL_START:
9239 case CMD_DEC_FRAME_INFO_BUF:
9240 case CMD_SLQ_TBL_BUF_END:
9241 case CMD_SLQ_TBL_BUF_START:
9242 case CMD_STREAM_BUF_START:
9243 case CMD_STREAM_BUF_END:
9244 case CMD_FB_BASE:
9245 case CMD_IAP_BUF_START:
9246 case CMD_DP_BUF_START:
9247 case CMD_MV_BUF_START:
9248 case CMD_FB_NUM:
9249 case CMD_DISPLAY_CTL:
9250 case CMD_REPEAT_MODE:
9251 case CMD_DS_VIRTUAL_BOX:
9252 case CMD_ENABLE_FILE_SYNC:
9253 case CMD_RVU_EN:
9254 case CMD_START_DEC_STRICT:
9255 case CMD_SYNC_ON:
9256 case CMD_SET_MST_MODE:
9257 case CMD_SET_MCU_MODE:
9258 ret = TRUE;
9259 break;
9260 default:
9261 ret = FALSE;
9262 break;
9263 }
9264
9265 return ret;
9266 #endif
9267 }
9268
HAL_MVD_IsNormalCommand(MS_U8 u8Cmd)9269 MS_BOOL HAL_MVD_IsNormalCommand(MS_U8 u8Cmd)
9270 {
9271 MS_BOOL ret;
9272
9273 switch(u8Cmd)
9274 {
9275
9276 case CMD_DISP_SPEED_CTRL:
9277 case CMD_STEP_DISP_DECODE_ONE:
9278 case CMD_ENABLE_LAST_FRAME_SHOW:
9279 case CMD_STEP_TO_PTS:
9280 case CMD_SKIP_DATA:
9281 case CMD_DIU_WIDTH_ALIGN:
9282 case CMD_SCALER_INFO_BASE:
9283 case CMD_DYNAMIC_SCALE_BASE:
9284 case CMD_ENABLE_DYNAMIC_SCALE:
9285 case CMD_FORCE_BLUE_SCREEN:
9286 case CMD_FREEZE_DISP:
9287 case CMD_FIXED_FRAME_BUFFER:
9288 case CMD_SEND_UNI_PTS:
9289 case CMD_ENABLE_FREEZE_PIC:
9290 case CMD_PTS_BASE:
9291 case CMD_SINGLE_STEP:
9292 case CMD_PARSE_M4V_PACKMD:
9293 case CMD_SLQ_END:
9294 case CMD_SLQ_START:
9295 case CMD_ENABLE_INT_STAT:
9296 case CMD_SHOW_ONE_FIELD:
9297 case CMD_FRC_OUPUT:
9298 case CMD_FRC_DROP_BEHAVIOR:
9299 case CMD_FORBID_RESOLUTION_CHANGE:
9300 case CMD_DUMP_BITSTREAM_BASE:
9301 case CMD_DUMP_BITSTREAM_LENGTH:
9302 case CMD_SYNC_OFFSET:
9303 case CMD_SYN_THRESHOLD:
9304 case CMD_AVSYNC_FREERUN_THRESHOLD:
9305 case CMD_MVD_FAST_INT:
9306 case CMD_DIVX_PATCH:
9307 case CMD_IDCT_SEL:
9308 case CMD_SLQ_UPDATE_TBL_WPTR:
9309 case CMD_DMA_OVFTH:
9310 case CMD_DMA_UNFTH:
9311 case CMD_UPDATE_FRAME:
9312 case CMD_PTS_TBL_RESET:
9313 case CMD_ENABLE_AUTO_MUTE:
9314 case CMD_FORCE_ALIGN_VSIZE:
9315 case CMD_SUSPEND_DS:
9316 case CMD_PUSH_FIRST_FRAME_DISP:
9317 case CMD_XC_LOW_DELAY_PARA:
9318 case CMD_FP_FILTER:
9319 case CMD_CC_ENABLE_EXTERNAL_BUFFER:
9320 case CMD_CLOSE_CC:
9321 case CMD_PREBUFFER_SIZE:
9322 case CMD_TIME_INCR_PREDICT:
9323 case CMD_ENABLE_VLD_TIMEOUT:
9324 case CMD_SMOOTH_REWIND:
9325 case CMD_DECODE_ERROR_TOLERANCE:
9326 case CMD_MVD_IDLE:
9327 case CMD_PARSER_READ_POSITION:
9328 case CMD_SLQ_GET_TBL_RPTR:
9329 case CMD_DECODE_STATUS:
9330 case CMD_GET_AFD:
9331 case CMD_GET_SYNC_STAT:
9332 case CMD_RD_USER_WP:
9333 case CMD_ENABLE_LAST_FRAME_QUALIFIER:
9334 //case CMD_RD_IO: // no need in V3
9335 //case CMD_WR_IO: // no need in V3
9336 ret = TRUE;
9337 break;
9338 default:
9339 ret = FALSE;
9340 break;
9341 }
9342
9343 return ret;
9344 }
9345
HAL_MVD_IsNeedResponseCommand(MS_U8 u8Cmd)9346 MS_BOOL HAL_MVD_IsNeedResponseCommand(MS_U8 u8Cmd)
9347 {
9348 MS_BOOL ret;
9349
9350 switch(u8Cmd)
9351 {
9352 case CMD_GET_AFD:
9353 case CMD_GET_SYNC_STAT:
9354 case CMD_RD_USER_WP:
9355 case CMD_DECODE_STATUS:
9356 case CMD_PARSER_READ_POSITION:
9357 case CMD_MVD_IDLE:
9358 ret = TRUE;
9359 break;
9360 default:
9361 ret = FALSE;
9362 break;
9363 }
9364
9365 return ret;
9366 }
9367 #endif
9368 #endif
9369