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) 2010-2012 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 /// file drvMMFilein.c
98 /// @brief Multimedia File In (MMFILEIN 2) Driver Interface
99 /// @author MStar Semiconductor,Inc.
100 /// @attention
101 /// All MMFILEIN DDI are not allowed to use in any interrupt context other than MMFILEIN ISR and Callback
102 ///////////////////////////////////////////////////////////////////////////////////////////////////
103
104 //-------------------------------------------------------------------------------------------------
105 // Include Files
106 //-------------------------------------------------------------------------------------------------
107
108 // Common Definition
109 #include "MsVersion.h"
110 #include "MsCommon.h"
111 #include "drvMMIO.h"
112
113 // Internal Definition
114 #include "asmCPU.h"
115 #include "halMMFilein.h"
116 #include "drvMMFilein.h"
117
118 #ifdef MMFI_HW_BOX_SERIES
119 #include "regTSP.h"
120 #include "halTSP.h"
121 #endif
122
123 #ifdef MSOS_TYPE_LINUX
124 #include <sys/ioctl.h>
125 #include <unistd.h>
126 #include <fcntl.h> // O_RDWR
127 #endif
128
129 #ifdef MSOS_TYPE_LINUX_KERNEL
130 #include <linux/string.h>
131 #endif
132
133 //-------------------------------------------------------------------------------------------------
134 // Driver Compiler Options
135 //-------------------------------------------------------------------------------------------------
136
137
138 //-------------------------------------------------------------------------------------------------
139 // Local Defines
140 //-------------------------------------------------------------------------------------------------
141 #define MMFI_MUTEX_WAIT_TIME 0xFFFFFFFFUL
142
143 #define MMFI_DBGERR(x) {if(_dbglevel >= E_DRVMMFI_DBG_ERR) x; }
144 #define MMFI_DBGINFO(x) {if(_dbglevel >= E_DRVMMFI_DBG_INFO) x; }
145
146 #define MMFI_ASSERT(_bool) if(!(_bool)) \
147 { \
148 if(_dbglevel >= E_DRVMMFI_DBG_INFO) \
149 { printf("ASSERT ERR\n"); } \
150 return DRVMMFI_FAIL; \
151 }
152
153 #define TSP_RES_ALLOC_MMFIPATH_CHECK(PhyMmfiPath) { \
154 if((_pmmfi_res->_bIsMmfiPathEverAlloc == TRUE) && (_pmmfi_res->_stMmfiPathState[PhyMmfiPath].bUsed == FALSE)) \
155 { \
156 printf("[%s][%d]: Mix old & new TSP Path resource allocation scheme !!\n", __FUNCTION__, __LINE__); \
157 } \
158 }
159
160 #define _MMFI_ENTRY() if (!MsOS_ObtainMutex(_pmmfi_res->_s32MMFIMutexId, MMFI_MUTEX_WAIT_TIME)) \
161 { \
162 return DRVMMFI_FAIL; \
163 }
164
165 #define _MMFI_RETURN(_ret) do{ \
166 MsOS_ReleaseMutex(_pmmfi_res->_s32MMFIMutexId); \
167 return _ret; \
168 }while(0);
169
170 #define _MMFI_GET_ENGID(x) (x < (MS_U8)MMFI_PIDFLT0_NUM ? 0 : 1);
171 #define _MMFI_GET_FLTID(x) (x % (MS_U8)MMFI_PIDFLT0_NUM);
172 #define _MMFI_GET_FLTLISTID(e,f) (e == 0 ? f : ((MS_U8)MMFI_PIDFLT0_NUM+f))
173 //-------------------------------------------------------------------------------------------------
174 // Local Structures
175 //-------------------------------------------------------------------------------------------------
176 typedef struct _DrvMMFI_State
177 {
178 DrvMMFI_FltType FltType[MMFI_PIDFLT0_NUM];
179 }DRVMMFI_State;
180
181 typedef struct
182 {
183 MS_BOOL bUsed;
184 } DrvMMFI_Path_State;
185
186 typedef struct _MMFI_RESOURCE_PRIVATE
187 {
188 MS_S32 _s32MMFIMutexId;
189 DRVMMFI_State _MMFIState[MMFI_ENGINE_NUM];
190
191 DrvMMFI_Path_State _stMmfiPathState[MMFI_ENGINE_NUM];
192 MS_BOOL _bIsMmfiPathEverAlloc;
193
194 MS_BOOL _bSWInit;
195 }MMFI_RESOURCE_PRIVATE;
196
197 //-------------------------------------------------------------------------------------------------
198 // Global Variables
199 //-------------------------------------------------------------------------------------------------
200 #ifndef MMFI_UTOPIA_20
201 static MMFI_RESOURCE_PRIVATE _mmfi_res = {
202 ._s32MMFIMutexId = -1,
203 ._MMFIState = {
204 {.FltType = {E_DRVMMFI_FLTTYPE_NONE},}
205 },
206
207 ._stMmfiPathState = {[0 ... (MMFI_ENGINE_NUM-1)] = {FALSE}},
208 ._bIsMmfiPathEverAlloc = FALSE,
209
210 ._bSWInit = FALSE,
211 };
212
213 static MMFI_RESOURCE_PRIVATE* _pmmfi_res = &_mmfi_res;
214 #else
215 static MMFI_RESOURCE_PRIVATE* _pmmfi_res = NULL;
216 #endif
217
218 //-------------------------------------------------------------------------------------------------
219 // Local Variables
220 //-------------------------------------------------------------------------------------------------
221 DrvMMFI_DbgLevel _dbglevel = E_DRVMMFI_DBG_Release;
222 static MS_BOOL _bBankInit = FALSE;
223 static MS_U16 _u16MMFIMobfKey[MMFI_ENGINE_NUM] = {[0 ... (MMFI_ENGINE_NUM-1)] = 0};
224
225
226 //-------------------------------------------------------------------------------------------------
227 // Local Functions
228 //-------------------------------------------------------------------------------------------------
229
_MMFI_InitResource(MMFI_RESOURCE_PRIVATE * presource)230 static MS_BOOL _MMFI_InitResource(MMFI_RESOURCE_PRIVATE* presource)
231 {
232 MS_U32 u32ii, u32jj;
233
234 if(presource == NULL)
235 return FALSE;
236
237 presource->_s32MMFIMutexId = -1;
238
239 for(u32jj = 0; u32jj < MMFI_ENGINE_NUM; u32jj++)
240 {
241 for(u32ii = 0; u32ii < MMFI_PIDFLT0_NUM; u32ii++)
242 {
243
244 presource->_MMFIState[u32jj].FltType[u32ii] = E_DRVMMFI_FLTTYPE_NONE;
245 }
246 }
247
248 for(u32ii = 0; u32ii < MMFI_ENGINE_NUM; u32ii++)
249 {
250 presource->_stMmfiPathState[u32ii].bUsed = FALSE;
251 }
252
253 presource->_bIsMmfiPathEverAlloc = FALSE;
254
255 presource->_bSWInit = FALSE;
256
257 return TRUE;
258 }
259
_MMFI_Path_Alloc(MS_U32 * pu32PathId)260 static MMFI_Result _MMFI_Path_Alloc(MS_U32 *pu32PathId)
261 {
262 DrvMMFI_Path eMmfiPath = E_DRVMMFI_PATH0;
263
264 *pu32PathId = (MS_U32)-1;
265 for(eMmfiPath = 0; eMmfiPath < MMFI_ENGINE_NUM; eMmfiPath++)
266 {
267 if(_pmmfi_res->_stMmfiPathState[eMmfiPath].bUsed == FALSE)
268 {
269 _pmmfi_res->_stMmfiPathState[eMmfiPath].bUsed = TRUE;
270 *pu32PathId = (MS_U32)eMmfiPath;
271 return DRVMMFI_OK;
272 }
273 }
274
275 return DRVMMFI_FAIL;
276 }
277
_MMFI_Path_Free(DrvMMFI_Path epath)278 static MMFI_Result _MMFI_Path_Free(DrvMMFI_Path epath)
279 {
280 if(_pmmfi_res->_stMmfiPathState[epath].bUsed == FALSE)
281 return DRVMMFI_FAIL;
282
283 _pmmfi_res->_stMmfiPathState[epath].bUsed = FALSE;
284 return DRVMMFI_OK;
285 }
286
287 //-------------------------------------------------------------------------------------------------
288 /// Initialize lib resource API
289 /// @param pResMemAddr \b IN: Pointer to store resource memory address
290 /// @return MMFI_Result
291 /// @note
292 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_InitLibResource(void * pResMemAddr)293 MMFI_Result MDrv_MMFI_InitLibResource(void* pResMemAddr)
294 {
295 MS_VIRT virtBank;
296 MS_PHY u32BankSize;
297 MMFI_ASSERT(pResMemAddr != 0);
298
299 _pmmfi_res = (MMFI_RESOURCE_PRIVATE*)pResMemAddr;
300
301 if(_pmmfi_res->_bSWInit != TRUE)
302 {
303 if(_MMFI_InitResource(_pmmfi_res) == FALSE)
304 return DRVMMFI_FAIL;
305 }
306
307 // For multi-process use case. (different process should set the value of bank again)
308 if(_bBankInit == FALSE)
309 {
310 if (FALSE == MDrv_MMIO_GetBASE(&virtBank, &u32BankSize, MS_MODULE_MMFILEIN))
311 {
312 MMFI_DBGERR(printf("MDrv_MMIO_GetBASE failed\n"));
313 return DRVMMFI_FAIL;
314 }
315 MMFI_DBGINFO((printf("MMFI Base Bank 0x%x\n", (unsigned int)virtBank)));
316 HAL_MMFI_SetBank(virtBank);
317 _bBankInit = TRUE;
318 }
319
320 return DRVMMFI_OK;
321 }
322
323 //-------------------------------------------------------------------------------------------------
324 /// Initialize MMFilein driver
325 /// @return MMFI_Result
326 /// @note
327 /// It should be called before calling any other MMFilein DDI functions.
328 /// Driver task is in @ref E_TASK_PRI_SYS level.
329 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_Init(void)330 MMFI_Result MDrv_MMFI_Init(void)
331 {
332 MS_VIRT virtBank;
333 MS_PHY u32BankSize;
334 MS_U8 u8ii, u8jj;
335
336 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
337
338 if (FALSE == MDrv_MMIO_GetBASE(&virtBank, &u32BankSize, MS_MODULE_MMFILEIN))
339 {
340 MMFI_DBGERR(printf("MDrv_MMIO_GetBASE failed\n"));
341 return DRVMMFI_FAIL;
342 }
343 MMFI_DBGINFO((printf("MMFI Base Bank 0x%x\n", (unsigned int)virtBank)));
344 HAL_MMFI_SetBank(virtBank);
345
346 if(_pmmfi_res->_bSWInit)
347 return DRVMMFI_OK;
348
349 _pmmfi_res->_s32MMFIMutexId = MsOS_CreateMutex(E_MSOS_FIFO, "Mutex_MMFI", MSOS_PROCESS_SHARED);
350 if(_pmmfi_res->_s32MMFIMutexId == -1)
351 {
352 MMFI_DBGERR(printf("MsOS_CreateMutex failed\n"));
353 return DRVMMFI_FAIL;
354 }
355
356 _MMFI_ENTRY();
357
358 HAL_MMFI_Reset_All();
359
360 for(u8jj = 0; u8jj < (MS_U8)MMFI_ENGINE_NUM; u8jj++)
361 {
362 for(u8ii = 0; u8ii < (MS_U8)MMFI_PIDFLT0_NUM; u8ii++)
363 {
364 _pmmfi_res->_MMFIState[u8jj].FltType[u8ii] = E_DRVMMFI_FLTTYPE_NONE;
365 HAL_MMFI_PidFlt_Reset(u8jj, u8ii);
366 }
367 HAL_MMFI_Set_FileinTimer(u8jj, 0x0A);
368 HAL_MMFI_Cfg_Enable(u8ii, MMFI_CFG_ALT_TS_SIZE, TRUE);
369 }
370
371 HAL_MMFI_Cfg_Enable(0, MMFI_CFG_RADDR_READ, TRUE);
372 HAL_MMFI_Cfg_Enable(1, MMFI_CFG_RADDR_READ, TRUE);
373
374 _pmmfi_res->_bSWInit = TRUE;
375
376 _MMFI_RETURN(DRVMMFI_OK);
377 }
378
379 //-------------------------------------------------------------------------------------------------
380 /// Close MMFilein
381 /// @return MMFI_Result
382 /// @note
383 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_Exit(void)384 MMFI_Result MDrv_MMFI_Exit(void)
385 {
386 MS_U8 u8ii, u8jj;
387
388 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
389
390 if(_pmmfi_res->_bSWInit == FALSE)
391 return DRVMMFI_OK;
392
393 _MMFI_ENTRY();
394
395 for(u8jj = 0; u8jj < (MS_U8)MMFI_ENGINE_NUM; u8jj++)
396 {
397 for(u8ii = 0; u8ii < (MS_U8)MMFI_PIDFLT0_NUM; u8ii++)
398 {
399 _pmmfi_res->_MMFIState[u8jj].FltType[u8ii] = E_DRVMMFI_FLTTYPE_NONE;
400 HAL_MMFI_PidFlt_Reset(u8jj, u8ii);
401 }
402 }
403
404 MsOS_ReleaseMutex(_pmmfi_res->_s32MMFIMutexId);
405 MsOS_DeleteMutex(_pmmfi_res->_s32MMFIMutexId);
406 _pmmfi_res->_s32MMFIMutexId = -1;
407
408 _pmmfi_res->_bSWInit = FALSE;
409
410 return DRVMMFI_OK;
411 }
412
413 //-------------------------------------------------------------------------------------------------
414 /// Get MM File-in HW interrupt status
415 /// @param pu32status \b OUT: pointer of storing HW interrupt status value
416 /// @return MMFI_Result
417 /// @note
418 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_Get_HWIntStatus(MS_U32 * pu32status)419 MMFI_Result MDrv_MMFI_Get_HWIntStatus(MS_U32* pu32status)
420 {
421 *pu32status = HAL_MMFI_HWInt_Status();
422 return DRVMMFI_OK;
423 }
424
425 //-------------------------------------------------------------------------------------------------
426 /// Set debug level of MMFilein
427 /// @param DbgLevel \b IN: Debug Level Value
428 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_SetDbgLevel(DrvMMFI_DbgLevel DbgLevel)429 MMFI_Result MDrv_MMFI_SetDbgLevel(DrvMMFI_DbgLevel DbgLevel)
430 {
431 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
432
433 _dbglevel = DbgLevel;
434 return DRVMMFI_OK;
435 }
436
437 //-------------------------------------------------------------------------------------------------
438 /// Set Audio path to be MMFI
439 /// @param bEnable \b IN: Enable Flag
440 /// @return MMFI_Result
441 /// @note
442 /// Not support in MMFI2
443 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_AudPath_Enable(MS_BOOL bEnable)444 MMFI_Result MDrv_MMFI_AudPath_Enable(MS_BOOL bEnable)
445 {
446 return DRVMMFI_NOTSUPPORT;
447 }
448
449 //-------------------------------------------------------------------------------------------------
450 /// Set MM File-in Timer
451 /// @param epath \b IN: MM Filein Path
452 /// @param u8timer \b IN: Filein Timer
453 /// @return MMFI_Result
454 /// @note
455 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_SetTimer(DrvMMFI_Path epath,MS_U8 u8timer)456 MMFI_Result MDrv_MMFI_File_SetTimer(DrvMMFI_Path epath, MS_U8 u8timer)
457 {
458 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
459
460 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
461
462 _MMFI_ENTRY();
463 HAL_MMFI_Set_FileinTimer((MS_U8)epath, u8timer);
464 _MMFI_RETURN(DRVMMFI_OK);
465 }
466
467 //-------------------------------------------------------------------------------------------------
468 /// Enable File-in Byte Timer
469 /// @param epath \b IN: MM Filein Path
470 /// @param bEnable \b IN: Enable flag
471 /// @return MMFI_Result
472 /// @note
473 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_ByteTimer_En(DrvMMFI_Path epath,MS_BOOL bEnable)474 MMFI_Result MDrv_MMFI_File_ByteTimer_En(DrvMMFI_Path epath, MS_BOOL bEnable)
475 {
476 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
477
478 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
479
480 _MMFI_ENTRY();
481 HAL_MMFI_Cfg_Enable((MS_U8)epath, MMFI_CFG_BYTETIMER_EN, TRUE);
482 _MMFI_RETURN(DRVMMFI_OK);
483 }
484
485 //-------------------------------------------------------------------------------------------------
486 /// Allocate MMFI Path Id
487 /// @param pu32PathId \b OUT: pointer of Path ID for return
488 /// @return MMFI_Result
489 /// @note
490 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_Path_Alloc(MS_U32 * pu32PathId)491 MMFI_Result MDrv_MMFI_Path_Alloc(MS_U32 *pu32PathId)
492 {
493 MMFI_Result eRet = DRVMMFI_FAIL;
494
495 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
496
497 _MMFI_ENTRY();
498
499 eRet = _MMFI_Path_Alloc(pu32PathId);
500
501 if(eRet == DRVMMFI_OK)
502 {
503 _pmmfi_res->_bIsMmfiPathEverAlloc = TRUE;
504 }
505
506 _MMFI_RETURN(eRet);
507 }
508
509 //-------------------------------------------------------------------------------------------------
510 /// Free MMFI Path Id
511 /// @param ePathId \b IN: Path ID
512 /// @return MMFI_Result
513 /// @note
514 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_Path_Free(DrvMMFI_Path epath)515 MMFI_Result MDrv_MMFI_Path_Free(DrvMMFI_Path epath)
516 {
517 MMFI_Result eRet = DRVMMFI_FAIL;
518
519 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
520
521 _MMFI_ENTRY();
522
523 eRet = _MMFI_Path_Free(epath);
524
525 _MMFI_RETURN(eRet);
526 }
527
528 //-------------------------------------------------------------------------------------------------
529 /// Allocate MMFI PID filter
530 /// @param epath \b IN: MM Filein Path
531 /// @param DrvMMFI_FltType \b IN: PID filter type
532 /// @param pu8PidFltId \b OUT: pointer of PID filter ID for return
533 /// @return MMFI_Result
534 /// @note
535 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_PidFlt_Alloc(DrvMMFI_Path epath,DrvMMFI_FltType eFilterType,MS_U8 * pu8PidFltId)536 MMFI_Result MDrv_MMFI_PidFlt_Alloc(DrvMMFI_Path epath, DrvMMFI_FltType eFilterType, MS_U8 *pu8PidFltId)
537 {
538 MS_U8 u8ii, u8jj;
539 *pu8PidFltId = 0xFF;
540
541 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
542 MMFI_ASSERT((eFilterType > E_DRVMMFI_FLTTYPE_NONE) && (eFilterType < E_DRVMMFI_FLTTYPE_MAX));
543 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
544
545 _MMFI_ENTRY();
546 u8jj = (MS_U8)epath;
547 for(u8ii = 0; u8ii < (MS_U8)MMFI_PIDFLT0_NUM; u8ii++)
548 {
549 if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_NONE)
550 {
551 MMFI_DBGINFO(printf("Allocate PID Filter %d\n", (int)u8ii));
552 _pmmfi_res->_MMFIState[u8jj].FltType[u8ii] = eFilterType;
553 *pu8PidFltId = _MMFI_GET_FLTLISTID(u8jj, u8ii);
554 _MMFI_RETURN(DRVMMFI_OK);
555 }
556 }
557
558 _MMFI_RETURN(DRVMMFI_FAIL);
559
560 }
561
562 //-------------------------------------------------------------------------------------------------
563 /// Free MMFI PID filter
564 /// @param u8PidFltId \b IN: PID filter ID
565 /// @return MMFI_Result
566 /// @note
567 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_PidFlt_Free(MS_U8 u8PidFltId)568 MMFI_Result MDrv_MMFI_PidFlt_Free(MS_U8 u8PidFltId)
569 {
570 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
571 MMFI_ASSERT(u8PidFltId < MMFI_PIDFLT_NUM_ALL);
572
573 MS_U8 u8jj = _MMFI_GET_ENGID(u8PidFltId);
574 MS_U8 u8ii = _MMFI_GET_FLTID(u8PidFltId);
575
576 TSP_RES_ALLOC_MMFIPATH_CHECK(u8jj);
577
578 if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_NONE)
579 return DRVMMFI_OK;
580
581 _MMFI_ENTRY();
582
583 if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] < E_DRVMMFI_FLTTYPE_MAX)
584 {
585 _pmmfi_res->_MMFIState[u8jj].FltType[u8ii] = E_DRVMMFI_FLTTYPE_NONE;
586 HAL_MMFI_PidFlt_Reset(u8ii, u8jj);
587 _MMFI_RETURN(DRVMMFI_OK);
588 }
589
590 _MMFI_RETURN(DRVMMFI_INVALID_PARAM);
591 }
592
593 //-------------------------------------------------------------------------------------------------
594 /// Enable PID filter
595 /// @param u8PidFltId \b IN: PID filter ID
596 /// @param bEnable \b IN: Enable Flag
597 /// @return MMFI_Result
598 /// @note
599 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_PidFlt_Enable(MS_U8 u8PidFltId,MS_BOOL bEnable)600 MMFI_Result MDrv_MMFI_PidFlt_Enable(MS_U8 u8PidFltId, MS_BOOL bEnable)
601 {
602 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
603 MMFI_ASSERT(u8PidFltId < MMFI_PIDFLT_NUM_ALL);
604
605 MS_U32 u32type = 0;
606 MS_U8 u8jj = _MMFI_GET_ENGID(u8PidFltId);
607 MS_U8 u8ii = _MMFI_GET_FLTID(u8PidFltId);
608
609 MMFI_ASSERT(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] > E_DRVMMFI_FLTTYPE_NONE);
610
611 TSP_RES_ALLOC_MMFIPATH_CHECK(u8jj);
612
613 if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_AUD)
614 u32type = MMFI_PIDFLT_AFIFO_EN;
615 else if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_AUDB)
616 u32type = MMFI_PIDFLT_AFIFOB_EN;
617 #ifdef MMFI2_EXTRA_AUFIFO
618 else if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_AUDC)
619 u32type = MMFI_PIDFLT_AFIFOC_EN;
620 else if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_AUDD)
621 u32type = MMFI_PIDFLT_AFIFOD_EN;
622 #endif
623 else if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_VD3D)
624 u32type = MMFI_PIDFLT_V3DFIFO_EN;
625 else if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_VD)
626 u32type = MMFI_PIDFLT_VFIFO_EN;
627 #ifdef MMFI_HW_BOX_SERIES
628 else if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_AUDE)
629 u32type = MMFI_PIDFLT_AFIFOE_EN;
630 else if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_AUDF)
631 u32type = MMFI_PIDFLT_AFIFOF_EN;
632 else if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_VD3)
633 u32type = MMFI_PIDFLT_VFIFO3_EN;
634 else if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_VD4)
635 u32type = MMFI_PIDFLT_VFIFO4_EN;
636 else if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_VD5)
637 u32type = MMFI_PIDFLT_VFIFO5_EN;
638 else if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_VD6)
639 u32type = MMFI_PIDFLT_VFIFO6_EN;
640 else if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_VD7)
641 u32type = MMFI_PIDFLT_VFIFO7_EN;
642 else if(_pmmfi_res->_MMFIState[u8jj].FltType[u8ii] == E_DRVMMFI_FLTTYPE_VD8)
643 u32type = MMFI_PIDFLT_VFIFO8_EN;
644 #endif
645
646 _MMFI_ENTRY();
647 HAL_MMFI_PidFlt_Enable(u8jj, u8ii, u32type, bEnable);
648 _MMFI_RETURN(DRVMMFI_INVALID_PARAM);
649 }
650
651 //-------------------------------------------------------------------------------------------------
652 /// Set PID to PID filter
653 /// @param u8PidFltId \b IN: PID filter ID
654 /// @param u16Pid \b IN: Enable Flag
655 /// @return MMFI_Result
656 /// @note
657 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_PidFlt_SetPid(MS_U8 u8PidFltId,MS_U16 u16Pid)658 MMFI_Result MDrv_MMFI_PidFlt_SetPid(MS_U8 u8PidFltId, MS_U16 u16Pid)
659 {
660 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
661 MMFI_ASSERT(u8PidFltId < MMFI_PIDFLT_NUM_ALL);
662
663 MS_U8 u8jj = _MMFI_GET_ENGID(u8PidFltId);
664 MS_U8 u8ii = _MMFI_GET_FLTID(u8PidFltId);
665
666 TSP_RES_ALLOC_MMFIPATH_CHECK(u8jj);
667
668 _MMFI_ENTRY();
669 HAL_MMFI_PidFlt_SetPid(u8jj, u8ii, u16Pid);
670 _MMFI_RETURN(DRVMMFI_OK);
671 }
672
673 //-------------------------------------------------------------------------------------------------
674 /// Command Queue Reset
675 /// @param epath \b IN: MM Filein Path
676 /// @return MMFI_Result
677 /// @note
678 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_CmdQ_Reset(DrvMMFI_Path epath)679 MMFI_Result MDrv_MMFI_File_CmdQ_Reset(DrvMMFI_Path epath)
680 {
681 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
682
683 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
684
685 _MMFI_ENTRY();
686 if(epath == E_DRVMMFI_PATH0)
687 HAL_MMFI_Reset_SubItem(MMFI_RST_CMDQ0);
688 else if(epath == E_DRVMMFI_PATH1)
689 HAL_MMFI_Reset_SubItem(MMFI_RST_CMDQ1);
690 else
691 _MMFI_RETURN(DRVMMFI_INVALID_PARAM);
692 _MMFI_RETURN(DRVMMFI_OK);
693 }
694
695 //-------------------------------------------------------------------------------------------------
696 /// Get Command Queue Write Level value
697 /// @param epath \b IN: MM Filein Path
698 /// @param pu8FifoLevel \b OUT: pointer of Command Queue Write Level value for return
699 /// @return MMFI_Result
700 /// @note
701 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_CmdQFifo_Status(DrvMMFI_Path epath,MS_U8 * pu8FifoLevel)702 MMFI_Result MDrv_MMFI_File_CmdQFifo_Status(DrvMMFI_Path epath, MS_U8 *pu8FifoLevel)
703 {
704 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
705
706 *pu8FifoLevel = (MS_U8)HAL_MMFI_CmdQ_FIFO_Get_WRLevel((MS_U8)epath);
707 return DRVMMFI_OK;
708 }
709
710 //-------------------------------------------------------------------------------------------------
711 /// Get Command Queue Empty Slot value
712 /// @param epath \b IN: MM Filein Path
713 /// @param pu32EmptySlot \b OUT: pointer of Command Queue Empty Slot value for return
714 /// @return MMFI_Result
715 /// @note
716 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_CmdQ_GetSlot(DrvMMFI_Path epath,MS_U32 * pu32EmptySlot)717 MMFI_Result MDrv_MMFI_File_CmdQ_GetSlot(DrvMMFI_Path epath, MS_U32 *pu32EmptySlot)
718 {
719 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
720
721 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
722
723 *pu32EmptySlot = 0;
724 *pu32EmptySlot = MMFI_CMDQ_SIZE - ((MS_U32)HAL_MMFI_CmdQ_FIFO_Get_WRCnt((MS_U8)epath) & 0xFFFFUL);
725 return DRVMMFI_OK;
726 }
727
728 //-------------------------------------------------------------------------------------------------
729 /// Set Playback timestamp
730 /// @param epath \b IN: MM Filein Path
731 /// @param u8PidFltId \b IN: LPCR32 value
732 /// @return MMFI_Result
733 /// @note
734 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_SetPlaybackTimeStamp(DrvMMFI_Path epath,MS_U32 u32lpcr2)735 MMFI_Result MDrv_MMFI_SetPlaybackTimeStamp(DrvMMFI_Path epath, MS_U32 u32lpcr2)
736 {
737 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
738
739 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
740
741 _MMFI_ENTRY();
742 HAL_MMFI_LPcr2_Set((MS_U8)epath, u32lpcr2);
743 _MMFI_RETURN(DRVMMFI_OK);
744 }
745
746 //-------------------------------------------------------------------------------------------------
747 /// Get playback timestamp
748 /// @param epath \b IN: MM Filein Path
749 /// @param pu32lpcr2 \b OUT: pointer of LPCR32 value for return
750 /// @return MMFI_Result
751 /// @note
752 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_GetPlaybackTimeStamp(DrvMMFI_Path epath,MS_U32 * pu32lpcr2)753 MMFI_Result MDrv_MMFI_GetPlaybackTimeStamp(DrvMMFI_Path epath, MS_U32 *pu32lpcr2)
754 {
755 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
756 MMFI_ASSERT((pu32lpcr2 != 0));
757
758 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
759
760 _MMFI_ENTRY();
761 *pu32lpcr2 = HAL_MMFI_LPcr2_Get((MS_U8)epath);
762 _MMFI_RETURN(DRVMMFI_OK);
763 }
764
765 //-------------------------------------------------------------------------------------------------
766 /// Get File-in timestamp value
767 /// @param epath \b IN: MM Filein Path
768 /// @param pu32TSLen \b OUT: pointer of Timestamp value for return
769 /// @return MMFI_Result
770 /// @note
771 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_GetFileInTimeStamp(DrvMMFI_Path epath,MS_U32 * pu32TSLen)772 MMFI_Result MDrv_MMFI_GetFileInTimeStamp(DrvMMFI_Path epath, MS_U32* pu32TSLen)
773 {
774 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
775
776 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
777
778 *pu32TSLen = 0;
779 *pu32TSLen = HAL_MMFI_TimeStamp_Get((MS_U8)epath);
780 return DRVMMFI_OK;
781 }
782
783 //-------------------------------------------------------------------------------------------------
784 /// Set File-in Read Start Address
785 /// @param epath \b IN: MM Filein Path
786 /// @param phyStreamAddr \b IN: MIU Physical Address of File-in Read Start Address.
787 /// @return MMFI_Result
788 /// @note
789 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_SetAddr(DrvMMFI_Path epath,MS_PHY phyStreamAddr)790 MMFI_Result MDrv_MMFI_File_SetAddr(DrvMMFI_Path epath, MS_PHY phyStreamAddr)
791 {
792 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
793
794 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
795
796 _MMFI_ENTRY();
797 #ifdef MMFI_HW_BOX_SERIES
798 HAL_TSP_FQ_MMFI_MIU_Sel(E_TSP_HAL_MIU_SEL_MMFI, (MS_U8)epath, phyStreamAddr);
799 #endif
800 HAL_MMFI_Set_Filein_ReadAddr((MS_U8)epath, phyStreamAddr);
801 _MMFI_RETURN(DRVMMFI_OK);
802 }
803
804 //-------------------------------------------------------------------------------------------------
805 /// Set File-in Read Size
806 /// @param epath \b IN: MM Filein Path
807 /// @param u32StreamSize \b IN: File-in Read Size.
808 /// @return MMFI_Result
809 // @note u32StreamSize must be larger than 16
810 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_SetSize(DrvMMFI_Path epath,MS_U32 u32StreamSize)811 MMFI_Result MDrv_MMFI_File_SetSize(DrvMMFI_Path epath, MS_U32 u32StreamSize)
812 {
813 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
814
815 if(u32StreamSize <= 16UL) //HW limitation
816 {
817 printf("[%s] MMFI size must large 16 bytes\n", __FUNCTION__);
818 return DRVMMFI_FAIL;
819 }
820
821 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
822
823 _MMFI_ENTRY();
824 HAL_MMFI_Set_Filein_ReadLen((MS_U8)epath, u32StreamSize);
825 _MMFI_RETURN(DRVMMFI_OK);
826 }
827
828 //-------------------------------------------------------------------------------------------------
829 /// Set packet size to MMFilein file
830 /// @param epath \b IN: MM Filein Path
831 /// @param PacketMode \b IN: Mode of MMFilein packet mode (192, 204, 188)
832 /// @return TSP_Result
833 /// @note
834 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_SetPacketMode(DrvMMFI_Path epath,DrvMMFI_PacketMode PacketMode)835 MMFI_Result MDrv_MMFI_File_SetPacketMode(DrvMMFI_Path epath, DrvMMFI_PacketMode PacketMode)
836 {
837 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
838
839 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
840
841 _MMFI_ENTRY();
842 switch (PacketMode)
843 {
844 case E_DRVMMFI_PKTMODE_188:
845 HAL_MMFI_PktChkSize_Set((MS_U8)epath, 0xBB);
846 HAL_MMFI_Cfg_Enable((MS_U8)epath, MMFI_CFG_ALT_TS_SIZE, TRUE);
847 break;
848 case E_DRVMMFI_PKTMODE_192:
849 HAL_MMFI_PktChkSize_Set((MS_U8)epath, 0xBF);
850 HAL_MMFI_Cfg_Enable((MS_U8)epath, MMFI_CFG_ALT_TS_SIZE, TRUE);
851 break;
852 case E_DRVMMFI_PKTMODE_204:
853 HAL_MMFI_PktChkSize_Set((MS_U8)epath, 0xCB);
854 HAL_MMFI_Cfg_Enable((MS_U8)epath, MMFI_CFG_ALT_TS_SIZE, TRUE);
855 break;
856 default:
857 break;
858 }
859 _MMFI_RETURN(DRVMMFI_OK);
860 }
861
862 //-------------------------------------------------------------------------------------------------
863 /// Set File-in time stamp clock source
864 /// @param epath \b IN: MM Filein Path
865 /// @param u32Clksrc \b IN: clock source
866 /// @return MMFI_Result
867 /// @note
868 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_SetTimeStampClk(DrvMMFI_Path ePath,MS_U32 u32ClkSrc)869 MMFI_Result MDrv_MMFI_File_SetTimeStampClk(DrvMMFI_Path ePath, MS_U32 u32ClkSrc)
870 {
871 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
872
873 TSP_RES_ALLOC_MMFIPATH_CHECK(ePath);
874
875 HAL_MMFI_TimeStampClk_Set((MS_U8)ePath, u32ClkSrc);
876 return DRVMMFI_OK;
877 }
878
879 //-------------------------------------------------------------------------------------------------
880 /// Get File-in HW read address
881 /// @param epath \b IN: MM Filein Path
882 /// @param pphyReadAddr \b OUT: pointer to store read address of file
883 /// @return MMFI_Result
884 /// @note
885 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_GetReadAddr(DrvMMFI_Path epath,MS_PHY * pphyReadAddr)886 MMFI_Result MDrv_MMFI_File_GetReadAddr(DrvMMFI_Path epath, MS_PHY* pphyReadAddr)
887 {
888 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
889
890 *pphyReadAddr = HAL_MMFI_Get_Filein_WriteAddr((MS_U8)epath);
891
892 return DRVMMFI_OK;
893 }
894 //-------------------------------------------------------------------------------------------------
895 /// Enable/Disable File-in 192 Mode
896 /// @param epath \b IN: MM Filein Path
897 /// @param bEnable \b IN: Enable Flag
898 /// @return MMFI_Result
899 /// @note
900 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_192Mode_En(DrvMMFI_Path epath,MS_BOOL bEnable)901 MMFI_Result MDrv_MMFI_File_192Mode_En(DrvMMFI_Path epath, MS_BOOL bEnable)
902 {
903 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
904
905 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
906
907 _MMFI_ENTRY();
908 HAL_MMFI_Cfg_Enable((MS_U8)epath, MMFI_CFG_PKT192_EN, bEnable);
909 _MMFI_RETURN(DRVMMFI_OK);
910
911 }
912
913 //-------------------------------------------------------------------------------------------------
914 /// Enable/Disable File-in 192 Block Scheme
915 /// @param epath \b IN: MM Filein Path
916 /// @param bEnable \b IN: Enable Flag
917 /// @return MMFI_Result
918 /// @note
919 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_192BlockScheme_En(DrvMMFI_Path epath,MS_BOOL bEnable)920 MMFI_Result MDrv_MMFI_File_192BlockScheme_En(DrvMMFI_Path epath, MS_BOOL bEnable)
921 {
922 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
923
924 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
925
926 _MMFI_ENTRY();
927 HAL_MMFI_Cfg_Enable((MS_U8)epath, MMFI_CFG_PKT192_BLK_DISABLE, !bEnable);
928 _MMFI_RETURN(DRVMMFI_OK);
929 }
930
931 //-------------------------------------------------------------------------------------------------
932 /// Enable/Disable Drop duplicate packets
933 /// @param epath \b IN: MM Filein Path
934 /// @param bEnable \b IN: Enable Flag
935 /// @return MMFI_Result
936 /// @note
937 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_DupPktSkip(DrvMMFI_Path epath,MS_BOOL bEnable)938 MMFI_Result MDrv_MMFI_DupPktSkip(DrvMMFI_Path epath, MS_BOOL bEnable)
939 {
940 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
941
942 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
943
944 _MMFI_ENTRY();
945 HAL_MMFI_Cfg_Enable((MS_U8)epath, MMFI_CFG_DUP_PKT_SKIP, bEnable);
946 _MMFI_RETURN(DRVMMFI_OK);
947 }
948
949 //-------------------------------------------------------------------------------------------------
950 /// Enable/Disable Skip TEL packet
951 /// @param epath \b IN: MM Filein Path
952 /// @param bEnable \b IN: Enable Flag
953 /// @return MMFI_Result
954 /// @note
955 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_TEI_SkipPktf(DrvMMFI_Path epath,MS_BOOL bEnable)956 MMFI_Result MDrv_MMFI_TEI_SkipPktf(DrvMMFI_Path epath, MS_BOOL bEnable)
957 {
958 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
959
960 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
961
962 _MMFI_ENTRY();
963 HAL_MMFI_Cfg_Enable((MS_U8)epath, MMFI_CFG_TEI_SKIP, bEnable);
964 _MMFI_RETURN(DRVMMFI_OK);
965 }
966
967 //-------------------------------------------------------------------------------------------------
968 /// Clear PID filter byte counter
969 /// @param epath \b IN: MM Filein Path
970 /// @return MMFI_Result
971 /// @note
972 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_Clr_Pidflt_ByteCnt(DrvMMFI_Path epath)973 MMFI_Result MDrv_MMFI_Clr_Pidflt_ByteCnt(DrvMMFI_Path epath)
974 {
975 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
976
977 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
978
979 _MMFI_ENTRY();
980 HAL_MMFI_Cfg_Enable((MS_U8)epath, MMFI_CFG_CLR_PIDFLT_BYTE_CNT, TRUE);
981 HAL_MMFI_Cfg_Enable((MS_U8)epath, MMFI_CFG_CLR_PIDFLT_BYTE_CNT, FALSE);
982 _MMFI_RETURN(DRVMMFI_OK);
983 }
984
985 //-------------------------------------------------------------------------------------------------
986 /// Enable/Disable TS Data Endian Swap
987 /// @param epath \b IN: MM Filein Path
988 /// @param bEnable \b IN: Enable Flag
989 /// @return MMFI_Result
990 /// @note
991 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_TSDataEndian_Swap(DrvMMFI_Path epath,MS_BOOL bEnable)992 MMFI_Result MDrv_MMFI_TSDataEndian_Swap(DrvMMFI_Path epath, MS_BOOL bEnable)
993 {
994 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
995
996 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
997
998 _MMFI_ENTRY();
999 HAL_MMFI_Cfg_Enable((MS_U8)epath, MMFI_CFG_MEM_TS_DATA_ENDIAN, bEnable);
1000 _MMFI_RETURN(DRVMMFI_OK);
1001 }
1002
1003 //-------------------------------------------------------------------------------------------------
1004 /// Enable/Disable TS Order Swap
1005 /// @param epath \b IN: MM Filein Path
1006 /// @param bEnable \b IN: Enable Flag
1007 /// @return MMFI_Result
1008 /// @note
1009 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_TSOrder_Swap(DrvMMFI_Path epath,MS_BOOL bEnable)1010 MMFI_Result MDrv_MMFI_TSOrder_Swap(DrvMMFI_Path epath, MS_BOOL bEnable)
1011 {
1012 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
1013
1014 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
1015
1016 _MMFI_ENTRY();
1017 HAL_MMFI_Cfg_Enable((MS_U8)epath, MMFI_CFG_MEM_TS_ORDER, bEnable);
1018 _MMFI_RETURN(DRVMMFI_OK);
1019 }
1020
MDrv_MMFI_GetCap(DrvMMFI_Cap eCap,void * pOutput)1021 MMFI_Result MDrv_MMFI_GetCap(DrvMMFI_Cap eCap, void* pOutput)
1022 {
1023 *((MS_U32*)pOutput) = 0;
1024
1025 switch (eCap)
1026 {
1027 case E_DRVMMFI_CAP_RESOURCE_SIZE:
1028 *((MS_U32*)pOutput) = (MS_U32)sizeof(MMFI_RESOURCE_PRIVATE);
1029 return DRVMMFI_OK;
1030 case E_DRVMMFI_CAP_FILTER0_NUM:
1031 *((MS_U32*)pOutput) = MMFI_PIDFLT0_NUM;
1032 return DRVMMFI_OK;
1033 case E_DRVMMFI_CAP_FILTER1_NUM:
1034 *((MS_U32*)pOutput) = MMFI_PIDFLT1_NUM;
1035 return DRVMMFI_OK;
1036 case E_DRVMMFI_CAP_FILTER_ALL_NUM:
1037 *((MS_U32*)pOutput) = MMFI_PIDFLT_NUM_ALL;
1038 return DRVMMFI_OK;
1039 default:
1040 return DRVMMFI_INVALID_PARAM;
1041 }
1042 }
1043
1044 //-------------------------------------------------------------------------------------------------
1045 /// Get Command queue state
1046 /// @param epath \b IN: MM Filein Path
1047 /// @param peFileinState \b OUT: Pointer of Filein state to return
1048 /// @return MMFI_Result
1049 /// @note
1050 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_GetState(DrvMMFI_Path epath,DrvMMFI_FileinState * peFileinState)1051 MMFI_Result MDrv_MMFI_File_GetState(DrvMMFI_Path epath, DrvMMFI_FileinState *peFileinState)
1052 {
1053 MS_U16 u16state = 0xFF, u16cmdcnt = 0;
1054
1055 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
1056
1057 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
1058
1059 _MMFI_ENTRY();
1060
1061 u16state = HAL_MMFI_Get_Filein_Ctrl((MS_U8)epath);
1062 u16cmdcnt = HAL_MMFI_CmdQ_FIFO_Get_WRCnt((MS_U8)epath);
1063
1064 if((u16state & MMFI_FILEIN_CTRL_START) || u16cmdcnt)
1065 *peFileinState = E_DRVMMFI_STATE_BUSY;
1066 else
1067 *peFileinState = E_DRVMMFI_STATE_IDLE;
1068
1069 _MMFI_RETURN(DRVMMFI_OK);
1070 }
1071
1072 //-------------------------------------------------------------------------------------------------
1073 /// Get Command queue interrupt state
1074 /// @param peFileinState \b OUT: Pointer of Filein state to return
1075 /// @return MMFI_Result
1076 /// @note
1077 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_ChkStatus(DrvMMFI_Status * pStatus)1078 MMFI_Result MDrv_MMFI_File_ChkStatus(DrvMMFI_Status* pStatus)
1079 {
1080 MS_U16 u32temp = 0;
1081
1082 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
1083
1084 u32temp = HAL_MMFI_HWInt_Status();
1085
1086 *pStatus = E_DRVMMFI_STATUS_UNKNOWN;
1087 if(u32temp & MMFI_HWINT_STS_FILEIN_DONE0)
1088 *pStatus |= E_DRVMMFI_STATUS_FILEINDONE0;
1089 if(u32temp & MMFI_HWINT_STS_AUAUB_ERR0)
1090 *pStatus |= E_DRVMMFI_STATUS_AU_PKTERR0;
1091 if(u32temp & MMFI_HWINT_STS_VD3D_ERR0)
1092 *pStatus |= E_DRVMMFI_STATUS_VD_PKTERR0;
1093 if(u32temp & MMFI_HWINT_STS_FILEIN_DONE1)
1094 *pStatus |= E_DRVMMFI_STATUS_FILEINDONE1;
1095 if(u32temp & MMFI_HWINT_STS_AUAUB_ERR1)
1096 *pStatus |= E_DRVMMFI_STATUS_AU_PKTERR1;
1097 if(u32temp & MMFI_HWINT_STS_VD3D_ERR1)
1098 *pStatus |= E_DRVMMFI_STATUS_VD_PKTERR1;
1099 return DRVMMFI_OK;
1100 }
1101
1102 //-------------------------------------------------------------------------------------------------
1103 /// Clear Command queue interrupt state
1104 /// @param u32int \b OUT: Interrupt bit to clear
1105 /// @return MMFI_Result
1106 /// @note
1107 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_ClearHWInt(MS_U32 u32int)1108 MMFI_Result MDrv_MMFI_File_ClearHWInt(MS_U32 u32int)
1109 {
1110 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
1111
1112 _MMFI_ENTRY();
1113 HAL_MMFI_HWInt_Clear((MS_U16)u32int);
1114 _MMFI_RETURN(DRVMMFI_OK);
1115 }
1116
1117 //-------------------------------------------------------------------------------------------------
1118 /// Get TS Header information
1119 /// @param epath \b IN: MM Filein Path
1120 /// @param pheader \b OUT: Poniter to store TS Header information
1121 /// @return MMFI_Result
1122 /// @note
1123 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_Get_TsHeader(DrvMMFI_Path epath,DrvPIDFLT_HEADER * pheader)1124 MMFI_Result MDrv_MMFI_Get_TsHeader(DrvMMFI_Path epath, DrvPIDFLT_HEADER *pheader)
1125 {
1126 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
1127
1128 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
1129
1130 HAL_MMFI_Get_TsHeaderInfo((MS_U8)epath, (MS_U32*)pheader);
1131 return DRVMMFI_OK;
1132 }
1133
1134 //-------------------------------------------------------------------------------------------------
1135 /// Control Filein to Start
1136 /// @param epath \b IN: MM Filein Path
1137 /// @return MMFI_Result
1138 /// @note
1139 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_Start(DrvMMFI_Path epath)1140 MMFI_Result MDrv_MMFI_File_Start(DrvMMFI_Path epath)
1141 {
1142 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
1143
1144 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
1145
1146 _MMFI_ENTRY();
1147
1148 HAL_MMFI_Cfg_Enable((MS_U8)epath, MMFI_CFG_BYTETIMER_EN, TRUE);
1149 HAL_MMFI_MOBF_Set_FileinKey((MS_U8)epath, _u16MMFIMobfKey[epath]);
1150 HAL_MMFI_Set_Filein_Ctrl((MS_U8)epath, MMFI_FILEIN_CTRL_START, TRUE);
1151 _MMFI_RETURN(DRVMMFI_OK);
1152 }
1153
1154 //-------------------------------------------------------------------------------------------------
1155 /// Control Filein to Abort
1156 /// @param epath \b IN: MM Filein Path
1157 /// @return MMFI_Result
1158 /// @note
1159 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_Abort(DrvMMFI_Path epath)1160 MMFI_Result MDrv_MMFI_File_Abort(DrvMMFI_Path epath)
1161 {
1162 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
1163
1164 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
1165
1166 _MMFI_ENTRY();
1167 HAL_MMFI_Set_Filein_Ctrl((MS_U8)epath, MMFI_FILEIN_CTRL_ABORT, TRUE);
1168 _MMFI_RETURN(DRVMMFI_OK);
1169 }
1170
1171 //-------------------------------------------------------------------------------------------------
1172 /// Enable/Disable MM Filein Path
1173 /// @param eFileinMode \b IN: File-in Mode
1174 /// @param bEnable \b IN: Enable Flag
1175 /// @return MMFI_Result
1176 /// @note
1177 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_File_ModeEnable(DrvMMFI_FileinMode fileinmode,MS_BOOL bEnable)1178 MMFI_Result MDrv_MMFI_File_ModeEnable(DrvMMFI_FileinMode fileinmode, MS_BOOL bEnable)
1179 {
1180 #ifdef MMFI_HW_BOX_SERIES
1181 MS_U16 u16cfg3 = 0;
1182 #endif
1183 #ifdef MMFI2_EXTRA_AUFIFO
1184 MS_U16 u16cfg2 = 0;
1185 #endif
1186 MS_U32 u32cfg = 0UL;
1187 MS_U8 u8EngID = ((fileinmode & E_DRVMMFI_MODE_MMFI1_MASK) ? 1: 0);
1188
1189 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
1190
1191 TSP_RES_ALLOC_MMFIPATH_CHECK(u8EngID);
1192
1193 _MMFI_ENTRY();
1194
1195 fileinmode &= (~E_DRVMMFI_MODE_MMFI1_MASK);
1196
1197 if(bEnable == FALSE)
1198 {
1199 HAL_MMFI_Cfg_Set(u8EngID, (HAL_MMFI_Cfg_Get(u8EngID) & ~MMFI_CFG_FILEIN_MODE_MASK));
1200
1201 #ifdef MMFI2_EXTRA_AUFIFO
1202 HAL_MMFI_Cfg2_Set(u8EngID, (HAL_MMFI_Cfg2_Get(u8EngID) & ~MMFI_CFG2_FILEIN_MODE_MASK));
1203 #endif
1204 }
1205 else
1206 {
1207 switch (fileinmode)
1208 {
1209 case E_DRVMMFI_MODE_APID_BYPASS:
1210 u32cfg = MMFI_CFG_APID_BYPASS;
1211 break;
1212 case E_DRVMMFI_MODE_APIDB_BYPASS:
1213 u32cfg = MMFI_CFG_APIDB_BYPASS;
1214 break;
1215 case E_DRVMMFI_MODE_VDPID_BYPASS:
1216 u32cfg = MMFI_CFG_VPID_BYPASS;
1217 break;
1218 case E_DRVMMFI_MODE_V3DPID_BYPASS:
1219 u32cfg = MMFI_CFG_VPID3D_BYPASS;
1220 break;
1221 case E_DRVMMFI_MODE_PS_AU:
1222 u32cfg = MMFI_CFG_PS_AUD_EN;
1223 break;
1224 case E_DRVMMFI_MODE_PS_AUB:
1225 u32cfg = MMFI_CFG_PS_AUDB_EN;
1226 break;
1227 case E_DRVMMFI_MODE_PS_VD:
1228 u32cfg = MMFI_CFG_PS_VD_EN;
1229 break;
1230 case E_DRVMMFI_MODE_PS_V3D:
1231 u32cfg = MMFI_CFG_PS_V3D_EN;
1232 break;
1233 #ifdef MMFI2_EXTRA_AUFIFO
1234 case E_DRVMMFI_MODE_PS_AUC:
1235 u16cfg2 = MMFI_CFG2_MMFI_PS_AUDC_EN;
1236 break;
1237 case E_DRVMMFI_MODE_PS_AUD:
1238 u16cfg2 = MMFI_CFG2_MMFI_PS_AUDD_EN;
1239 break;
1240 #endif
1241 #ifdef MMFI_HW_BOX_SERIES
1242 case E_DRVMMFI_MODE_PS_AUE:
1243 u16cfg2 = MMFI_CFG2_MMFI_PS_AUDE_EN;
1244 break;
1245 case E_DRVMMFI_MODE_PS_AUF:
1246 u16cfg2 = MMFI_CFG2_MMFI_PS_AUDF_EN;
1247 break;
1248 case E_DRVMMFI_MODE_PS_VD3:
1249 u16cfg2 = MMFI_CFG2_MMFI_PS_VD3_EN;
1250 u16cfg3 = MMFI_CFG3_MMFI_PS_VD3_EN;
1251 break;
1252 case E_DRVMMFI_MODE_PS_VD4:
1253 u16cfg2 = MMFI_CFG2_MMFI_PS_VD4_EN;
1254 u16cfg3 = MMFI_CFG3_MMFI_PS_VD4_EN;
1255 break;
1256 case E_DRVMMFI_MODE_PS_VD5:
1257 u16cfg2 = MMFI_CFG2_MMFI_PS_VD5_EN;
1258 break;
1259 case E_DRVMMFI_MODE_PS_VD6:
1260 u16cfg2 = MMFI_CFG2_MMFI_PS_VD6_EN;
1261 break;
1262 case E_DRVMMFI_MODE_PS_VD7:
1263 u16cfg2 = MMFI_CFG2_MMFI_PS_VD7_EN;
1264 break;
1265 case E_DRVMMFI_MODE_PS_VD8:
1266 u16cfg2 = MMFI_CFG2_MMFI_PS_VD8_EN;
1267 break;
1268 #endif
1269 case E_DRVMMFI_MODE_NO_BYPASS_TS:
1270 case E_DRVMMFI_MODE_NO_BYPASS_AU:
1271 case E_DRVMMFI_MODE_NO_BYPASS_V3D:
1272 case E_DRVMMFI_MODE_NO_BYPASS_VD:
1273 break;
1274 default:
1275 MMFI_DBGERR(printf("MDrv_MMFI_File_ModeEnable, Bad fileinmode!\n"));
1276 _MMFI_RETURN(DRVMMFI_FAIL);
1277 }
1278
1279 HAL_MMFI_Cfg_Set(u8EngID, (HAL_MMFI_Cfg_Get(u8EngID) & ~MMFI_CFG_FILEIN_MODE_MASK) | u32cfg);
1280
1281 #ifdef MMFI2_EXTRA_AUFIFO
1282 HAL_MMFI_Cfg2_Set(u8EngID, (HAL_MMFI_Cfg2_Get(u8EngID) & ~MMFI_CFG2_FILEIN_MODE_MASK) | u16cfg2);
1283 #endif
1284
1285 #ifdef MMFI_HW_BOX_SERIES
1286 HAL_MMFI_Cfg3_Set(u8EngID, (HAL_MMFI_Cfg3_Get(u8EngID) & ~MMFI_CFG3_FILEIN_MODE_MASK) | u16cfg3);
1287 #endif
1288 }
1289 _MMFI_RETURN(DRVMMFI_OK);
1290 }
1291
MDrv_MMFI_ResetAll(void)1292 MMFI_Result MDrv_MMFI_ResetAll(void)
1293 {
1294 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
1295
1296 _MMFI_ENTRY();
1297 HAL_MMFI_Reset_All();
1298 _MMFI_RETURN(DRVMMFI_OK);
1299 }
1300
1301 //-------------------------------------------------------------------------------------------------
1302 /// Enable remove duplicate A/V packets
1303 /// @param bEnable \b IN: Enable or Disable
1304 /// @return TSP_Result
1305 /// @note
1306 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_RemoveDupAVPkt(MS_BOOL bEnable)1307 MMFI_Result MDrv_MMFI_RemoveDupAVPkt(MS_BOOL bEnable)
1308 {
1309 _MMFI_ENTRY();
1310 HAL_MMFI_Cfg_Enable(0, MMFI_CFG_DUP_PKT_SKIP, bEnable);
1311 HAL_MMFI_Cfg_Enable(1, MMFI_CFG_DUP_PKT_SKIP, bEnable);
1312 _MMFI_RETURN(DRVMMFI_OK);
1313 }
1314
1315 //-------------------------------------------------------------------------------------------------
1316 /// Set Video 3D path to be MMFI
1317 /// @param bEnable \b IN: Enable Flag
1318 /// @return MMFI_Result
1319 /// @note
1320 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_VD3DPath_Enable(MS_BOOL bEnable)1321 MMFI_Result MDrv_MMFI_VD3DPath_Enable(MS_BOOL bEnable)
1322 {
1323 return DRVMMFI_NOTSUPPORT;
1324 }
1325
1326 //-------------------------------------------------------------------------------------------------
1327 /// Set MOBF filein key
1328 /// @param eFileinMode \b IN: File-in Mode
1329 /// @param u32Key \b IN: MOBF key value
1330 /// @return MMFI_Result
1331 /// @note
1332 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_Set_MOBF_FileinKey(DrvMMFI_Path epath,MS_U32 u32Key)1333 MMFI_Result MDrv_MMFI_Set_MOBF_FileinKey(DrvMMFI_Path epath, MS_U32 u32Key)
1334 {
1335 MMFI_DBGINFO(printf("[%d]%s\n", __LINE__, __FUNCTION__));
1336
1337 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
1338
1339 _MMFI_ENTRY();
1340 HAL_MMFI_MOBF_Set_FileinKey((MS_U8)epath, (MS_U16)u32Key);
1341 _u16MMFIMobfKey[epath] = (MS_U16)u32Key;
1342 _MMFI_RETURN(DRVMMFI_OK);
1343 }
1344
1345 //-------------------------------------------------------------------------------------------------
1346 /// Enable/Disable MOBF decrypt mode
1347 /// @param benable \b IN: Enable flag
1348 /// @return TSP_Result
1349 /// @note
1350 //-------------------------------------------------------------------------------------------------
MDrv_MMFI_MOBF_FileIn_Enable(DrvMMFI_Path epath,MS_BOOL benable)1351 MMFI_Result MDrv_MMFI_MOBF_FileIn_Enable(DrvMMFI_Path epath, MS_BOOL benable)
1352 {
1353 TSP_RES_ALLOC_MMFIPATH_CHECK(epath);
1354
1355 _MMFI_ENTRY();
1356 HAL_MMFI_Set_Filein_Ctrl((MS_U8)epath, MMFI_FILEIN_CTRL_MOBF_EN, benable);
1357 _MMFI_RETURN(DRVMMFI_OK);
1358 }
1359
MDrv_MMFI_MOBF_FileIn_SetLevel(DrvMMFI_Path epath,MS_U8 u8level)1360 MMFI_Result MDrv_MMFI_MOBF_FileIn_SetLevel(DrvMMFI_Path epath, MS_U8 u8level)
1361 {
1362 return DRVMMFI_NOTSUPPORT;
1363 }
1364
1365 #ifdef MSOS_TYPE_LINUX_KERNEL
1366
MDrv_MMFI_Suspend(void)1367 MMFI_Result MDrv_MMFI_Suspend(void)
1368 {
1369 HAL_MMFI_SaveRegs();
1370
1371 return DRVMMFI_OK;
1372 }
1373
MDrv_MMFI_Resume(void)1374 MMFI_Result MDrv_MMFI_Resume(void)
1375 {
1376 HAL_MMFI_Reset_All();
1377
1378 HAL_MMFI_RestoreRegs();
1379
1380 return DRVMMFI_OK;
1381 }
1382
1383 #endif //MSOS_TYPE_LINUX_KERNEL
1384
1385
1386