xref: /utopia/UTPA2-700.0.x/modules/dmx/drv/mmfi2/drvMMFilein.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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